aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/acpi/fan.c10
-rw-r--r--drivers/acpi/glue.c6
-rw-r--r--drivers/acpi/pci_slot.c5
-rw-r--r--drivers/acpi/processor_core.c5
-rw-r--r--drivers/acpi/processor_throttling.c17
-rw-r--r--drivers/acpi/scan.c2
-rw-r--r--drivers/acpi/sleep/main.c42
-rw-r--r--drivers/acpi/system.c1
-rw-r--r--drivers/acpi/thermal.c4
-rw-r--r--drivers/acpi/video.c5
-rw-r--r--drivers/atm/fore200e.c15
-rw-r--r--drivers/auxdisplay/cfag12864b.c13
-rw-r--r--drivers/base/Kconfig3
-rw-r--r--drivers/base/base.h27
-rw-r--r--drivers/base/class.c153
-rw-r--r--drivers/base/core.c196
-rw-r--r--drivers/base/cpu.c14
-rw-r--r--drivers/base/memory.c31
-rw-r--r--drivers/base/node.c15
-rw-r--r--drivers/base/power/trace.c2
-rw-r--r--drivers/base/sys.c64
-rw-r--r--drivers/base/topology.c17
-rw-r--r--drivers/block/aoe/aoechr.c5
-rw-r--r--drivers/block/paride/pg.c5
-rw-r--r--drivers/block/paride/pt.c10
-rw-r--r--drivers/block/pktcdvd.c4
-rw-r--r--drivers/char/Kconfig17
-rw-r--r--drivers/char/Makefile3
-rw-r--r--drivers/char/amiserial.c3
-rw-r--r--drivers/char/cyclades.c8
-rw-r--r--drivers/char/dsp56k.c3
-rw-r--r--drivers/char/epca.c58
-rw-r--r--drivers/char/esp.c5
-rw-r--r--drivers/char/hw_random/Kconfig13
-rw-r--r--drivers/char/hw_random/Makefile2
-rw-r--r--drivers/char/hw_random/n2-asm.S79
-rw-r--r--drivers/char/hw_random/n2-drv.c771
-rw-r--r--drivers/char/hw_random/n2rng.h118
-rw-r--r--drivers/char/ip2/ip2main.c12
-rw-r--r--drivers/char/ipmi/ipmi_devintf.c2
-rw-r--r--drivers/char/isicom.c30
-rw-r--r--drivers/char/istallion.c41
-rw-r--r--drivers/char/keyboard.c2
-rw-r--r--drivers/char/lcd.c516
-rw-r--r--drivers/char/lcd.h154
-rw-r--r--drivers/char/lp.c3
-rw-r--r--drivers/char/mem.c13
-rw-r--r--drivers/char/misc.c4
-rw-r--r--drivers/char/mmtimer.c29
-rw-r--r--drivers/char/moxa.c3
-rw-r--r--drivers/char/mspec.c23
-rw-r--r--drivers/char/mxser.c49
-rw-r--r--drivers/char/n_hdlc.c4
-rw-r--r--drivers/char/nvram.c1
-rw-r--r--drivers/char/pcmcia/cm4000_cs.c2
-rw-r--r--drivers/char/pcmcia/cm4040_cs.c3
-rw-r--r--drivers/char/pcmcia/synclink_cs.c5
-rw-r--r--drivers/char/ppdev.c5
-rw-r--r--drivers/char/random.c1
-rw-r--r--drivers/char/raw.c7
-rw-r--r--drivers/char/riscom8.c27
-rw-r--r--drivers/char/rocket.c5
-rw-r--r--drivers/char/rtc.c19
-rw-r--r--drivers/char/snsc.c3
-rw-r--r--drivers/char/specialix.c803
-rw-r--r--drivers/char/stallion.c21
-rw-r--r--drivers/char/sx.c3
-rw-r--r--drivers/char/synclink.c7
-rw-r--r--drivers/char/synclink_gt.c154
-rw-r--r--drivers/char/synclinkmp.c9
-rw-r--r--drivers/char/tty_io.c734
-rw-r--r--drivers/char/tty_ldisc.c714
-rw-r--r--drivers/char/vc_screen.c12
-rw-r--r--drivers/char/viotape.c8
-rw-r--r--drivers/char/vme_scc.c5
-rw-r--r--drivers/char/vt.c20
-rw-r--r--drivers/char/xilinx_hwicap/xilinx_hwicap.c5
-rw-r--r--drivers/cpufreq/cpufreq.c59
-rw-r--r--drivers/cpufreq/cpufreq_conservative.c2
-rw-r--r--drivers/cpufreq/cpufreq_ondemand.c4
-rw-r--r--drivers/cpufreq/cpufreq_stats.c24
-rw-r--r--drivers/cpufreq/cpufreq_userspace.c79
-rw-r--r--drivers/cpufreq/freq_table.c12
-rw-r--r--drivers/cpuidle/sysfs.c10
-rw-r--r--drivers/dca/dca-core.c131
-rw-r--r--drivers/dca/dca-sysfs.c9
-rw-r--r--drivers/dma/Kconfig37
-rw-r--r--drivers/dma/Makefile3
-rw-r--r--drivers/dma/dmaengine.c35
-rw-r--r--drivers/dma/dmatest.c444
-rw-r--r--drivers/dma/dw_dmac.c1122
-rw-r--r--drivers/dma/dw_dmac_regs.h225
-rw-r--r--drivers/dma/fsldma.c38
-rw-r--r--drivers/dma/ioat.c15
-rw-r--r--drivers/dma/ioat_dca.c244
-rw-r--r--drivers/dma/ioat_dma.c402
-rw-r--r--drivers/dma/ioatdma.h28
-rw-r--r--drivers/dma/ioatdma_hw.h1
-rw-r--r--drivers/dma/ioatdma_registers.h20
-rw-r--r--drivers/dma/iop-adma.c53
-rw-r--r--drivers/dma/mv_xor.c1375
-rw-r--r--drivers/dma/mv_xor.h183
-rw-r--r--drivers/edac/cell_edac.c5
-rw-r--r--drivers/eisa/Makefile2
-rw-r--r--drivers/eisa/eisa-bus.c4
-rw-r--r--drivers/firmware/dcdbas.c3
-rw-r--r--drivers/gpio/Kconfig11
-rw-r--r--drivers/gpio/Makefile1
-rw-r--r--drivers/gpio/max7301.c339
-rw-r--r--drivers/gpio/pcf857x.c33
-rw-r--r--drivers/hid/hid-core.c10
-rw-r--r--drivers/hid/hid-input-quirks.c40
-rw-r--r--drivers/hid/hid-input.c3
-rw-r--r--drivers/hid/hidraw.c53
-rw-r--r--drivers/hid/usbhid/hid-core.c2
-rw-r--r--drivers/hid/usbhid/hid-quirks.c22
-rw-r--r--drivers/hid/usbhid/hiddev.c14
-rw-r--r--drivers/hid/usbhid/usbkbd.c10
-rw-r--r--drivers/hid/usbhid/usbmouse.c8
-rw-r--r--drivers/hwmon/hdaps.c2
-rw-r--r--drivers/hwmon/hwmon.c3
-rw-r--r--drivers/i2c/i2c-core.c6
-rw-r--r--drivers/i2c/i2c-dev.c6
-rw-r--r--drivers/ide/Kconfig2
-rw-r--r--drivers/ide/arm/icside.c71
-rw-r--r--drivers/ide/arm/ide_arm.c14
-rw-r--r--drivers/ide/arm/palm_bk3710.c30
-rw-r--r--drivers/ide/arm/rapide.c24
-rw-r--r--drivers/ide/h8300/ide-h8300.c48
-rw-r--r--drivers/ide/ide-atapi.c58
-rw-r--r--drivers/ide/ide-cd.c157
-rw-r--r--drivers/ide/ide-cd.h38
-rw-r--r--drivers/ide/ide-cd_ioctl.c35
-rw-r--r--drivers/ide/ide-disk.c2
-rw-r--r--drivers/ide/ide-dma.c103
-rw-r--r--drivers/ide/ide-floppy.c90
-rw-r--r--drivers/ide/ide-generic.c73
-rw-r--r--drivers/ide/ide-io.c42
-rw-r--r--drivers/ide/ide-iops.c230
-rw-r--r--drivers/ide/ide-lib.c17
-rw-r--r--drivers/ide/ide-pnp.c29
-rw-r--r--drivers/ide/ide-probe.c366
-rw-r--r--drivers/ide/ide-proc.c4
-rw-r--r--drivers/ide/ide-tape.c137
-rw-r--r--drivers/ide/ide-taskfile.c38
-rw-r--r--drivers/ide/ide.c49
-rw-r--r--drivers/ide/legacy/buddha.c24
-rw-r--r--drivers/ide/legacy/falconide.c56
-rw-r--r--drivers/ide/legacy/gayle.c39
-rw-r--r--drivers/ide/legacy/ide-4drives.c20
-rw-r--r--drivers/ide/legacy/ide-cs.c54
-rw-r--r--drivers/ide/legacy/ide_platform.c32
-rw-r--r--drivers/ide/legacy/macide.c15
-rw-r--r--drivers/ide/legacy/q40ide.c47
-rw-r--r--drivers/ide/mips/au1xxx-ide.c56
-rw-r--r--drivers/ide/mips/swarm.c24
-rw-r--r--drivers/ide/pci/aec62xx.c5
-rw-r--r--drivers/ide/pci/alim15x3.c12
-rw-r--r--drivers/ide/pci/amd74xx.c1
-rw-r--r--drivers/ide/pci/cmd640.c29
-rw-r--r--drivers/ide/pci/cmd64x.c12
-rw-r--r--drivers/ide/pci/cs5520.c41
-rw-r--r--drivers/ide/pci/cs5535.c3
-rw-r--r--drivers/ide/pci/delkin_cb.c25
-rw-r--r--drivers/ide/pci/hpt34x.c1
-rw-r--r--drivers/ide/pci/hpt366.c23
-rw-r--r--drivers/ide/pci/ns87415.c115
-rw-r--r--drivers/ide/pci/pdc202xx_old.c3
-rw-r--r--drivers/ide/pci/piix.c4
-rw-r--r--drivers/ide/pci/scc_pata.c139
-rw-r--r--drivers/ide/pci/serverworks.c4
-rw-r--r--drivers/ide/pci/sgiioc4.c65
-rw-r--r--drivers/ide/pci/siimage.c6
-rw-r--r--drivers/ide/pci/sl82c105.c4
-rw-r--r--drivers/ide/pci/tc86c001.c16
-rw-r--r--drivers/ide/pci/via82cxxx.c1
-rw-r--r--drivers/ide/ppc/pmac.c222
-rw-r--r--drivers/ide/setup-pci.c109
-rw-r--r--drivers/ieee1394/dv1394.c7
-rw-r--r--drivers/ieee1394/iso.c1
-rw-r--r--drivers/ieee1394/nodemgr.c23
-rw-r--r--drivers/ieee1394/raw1394.c4
-rw-r--r--drivers/ieee1394/video1394.c6
-rw-r--r--drivers/infiniband/core/cm.c72
-rw-r--r--drivers/infiniband/core/cma.c99
-rw-r--r--drivers/infiniband/core/iwcm.c3
-rw-r--r--drivers/infiniband/core/sa_query.c3
-rw-r--r--drivers/infiniband/hw/ehca/ehca_classes.h1
-rw-r--r--drivers/infiniband/hw/ehca/ehca_hca.c4
-rw-r--r--drivers/infiniband/hw/ehca/ehca_irq.c8
-rw-r--r--drivers/infiniband/hw/ehca/ehca_qp.c2
-rw-r--r--drivers/infiniband/hw/ehca/ipz_pt_fn.c1
-rw-r--r--drivers/infiniband/hw/ipath/ipath_file_ops.c2
-rw-r--r--drivers/infiniband/hw/mlx4/cq.c12
-rw-r--r--drivers/infiniband/hw/mlx4/main.c11
-rw-r--r--drivers/infiniband/hw/mlx4/mlx4_ib.h15
-rw-r--r--drivers/infiniband/hw/mlx4/mr.c70
-rw-r--r--drivers/infiniband/hw/mlx4/qp.c74
-rw-r--r--drivers/infiniband/hw/mthca/mthca_dev.h1
-rw-r--r--drivers/infiniband/hw/mthca/mthca_mr.c26
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c2
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c1
-rw-r--r--drivers/input/evbug.c12
-rw-r--r--drivers/input/evdev.c101
-rw-r--r--drivers/input/ff-memless.c4
-rw-r--r--drivers/input/gameport/emu10k1-gp.c2
-rw-r--r--drivers/input/gameport/gameport.c22
-rw-r--r--drivers/input/gameport/lightning.c2
-rw-r--r--drivers/input/gameport/ns558.c2
-rw-r--r--drivers/input/input.c2
-rw-r--r--drivers/input/joystick/a3d.c2
-rw-r--r--drivers/input/joystick/amijoy.c2
-rw-r--r--drivers/input/joystick/cobra.c2
-rw-r--r--drivers/input/joystick/db9.c2
-rw-r--r--drivers/input/joystick/gf2k.c2
-rw-r--r--drivers/input/joystick/grip.c2
-rw-r--r--drivers/input/joystick/grip_mp.c2
-rw-r--r--drivers/input/joystick/guillemot.c2
-rw-r--r--drivers/input/joystick/iforce/iforce-ff.c2
-rw-r--r--drivers/input/joystick/iforce/iforce-main.c2
-rw-r--r--drivers/input/joystick/iforce/iforce-packets.c2
-rw-r--r--drivers/input/joystick/iforce/iforce-serio.c2
-rw-r--r--drivers/input/joystick/iforce/iforce-usb.c8
-rw-r--r--drivers/input/joystick/iforce/iforce.h2
-rw-r--r--drivers/input/joystick/interact.c2
-rw-r--r--drivers/input/joystick/joydump.c2
-rw-r--r--drivers/input/joystick/magellan.c2
-rw-r--r--drivers/input/joystick/spaceball.c2
-rw-r--r--drivers/input/joystick/spaceorb.c2
-rw-r--r--drivers/input/joystick/stinger.c2
-rw-r--r--drivers/input/joystick/tmdc.c2
-rw-r--r--drivers/input/joystick/turbografx.c2
-rw-r--r--drivers/input/joystick/twidjoy.c4
-rw-r--r--drivers/input/joystick/warrior.c2
-rw-r--r--drivers/input/joystick/xpad.c12
-rw-r--r--drivers/input/keyboard/amikbd.c2
-rw-r--r--drivers/input/keyboard/atkbd.c46
-rw-r--r--drivers/input/keyboard/gpio_keys.c89
-rw-r--r--drivers/input/keyboard/hil_kbd.c1
-rw-r--r--drivers/input/keyboard/lkkbd.c6
-rw-r--r--drivers/input/keyboard/pxa27x_keypad.c15
-rw-r--r--drivers/input/keyboard/sunkbd.c2
-rw-r--r--drivers/input/keyboard/tosakbd.c2
-rw-r--r--drivers/input/keyboard/xtkbd.c2
-rw-r--r--drivers/input/misc/Kconfig10
-rw-r--r--drivers/input/misc/Makefile1
-rw-r--r--drivers/input/misc/ati_remote.c18
-rw-r--r--drivers/input/misc/ati_remote2.c18
-rw-r--r--drivers/input/misc/hp_sdc_rtc.c1
-rw-r--r--drivers/input/misc/keyspan_remote.c20
-rw-r--r--drivers/input/misc/powermate.c6
-rw-r--r--drivers/input/misc/sgi_btns.c178
-rw-r--r--drivers/input/misc/wistron_btns.c19
-rw-r--r--drivers/input/misc/yealink.c50
-rw-r--r--drivers/input/mouse/appletouch.c299
-rw-r--r--drivers/input/mouse/atarimouse.c27
-rw-r--r--drivers/input/mouse/hil_ptr.c37
-rw-r--r--drivers/input/mouse/inport.c2
-rw-r--r--drivers/input/mouse/logibm.c2
-rw-r--r--drivers/input/mouse/pc110pad.c2
-rw-r--r--drivers/input/mouse/sermouse.c2
-rw-r--r--drivers/input/serio/Kconfig10
-rw-r--r--drivers/input/serio/Makefile1
-rw-r--r--drivers/input/serio/ct82c710.c2
-rw-r--r--drivers/input/serio/hil_mlc.c6
-rw-r--r--drivers/input/serio/hp_sdc.c10
-rw-r--r--drivers/input/serio/hp_sdc_mlc.c2
-rw-r--r--drivers/input/serio/i8042-x86ia64io.h67
-rw-r--r--drivers/input/serio/libps2.c52
-rw-r--r--drivers/input/serio/q40kbd.c4
-rw-r--r--drivers/input/serio/rpckbd.c2
-rw-r--r--drivers/input/serio/serio.c9
-rw-r--r--drivers/input/serio/xilinx_ps2.c380
-rw-r--r--drivers/input/tablet/acecad.c4
-rw-r--r--drivers/input/tablet/aiptek.c6
-rw-r--r--drivers/input/tablet/gtco.c2
-rw-r--r--drivers/input/tablet/kbtab.c6
-rw-r--r--drivers/input/tablet/wacom.h2
-rw-r--r--drivers/input/tablet/wacom_sys.c6
-rw-r--r--drivers/input/tablet/wacom_wac.c39
-rw-r--r--drivers/input/touchscreen/Kconfig46
-rw-r--r--drivers/input/touchscreen/Makefile4
-rw-r--r--drivers/input/touchscreen/gunze.c2
-rw-r--r--drivers/input/touchscreen/h3600_ts_input.c2
-rw-r--r--drivers/input/touchscreen/htcpen.c255
-rw-r--r--drivers/input/touchscreen/inexio.c207
-rw-r--r--drivers/input/touchscreen/migor_ts.c250
-rw-r--r--drivers/input/touchscreen/touchit213.c234
-rw-r--r--drivers/input/touchscreen/usbtouchscreen.c42
-rw-r--r--drivers/input/touchscreen/wm9712.c18
-rw-r--r--drivers/isdn/capi/capi.c6
-rw-r--r--drivers/isdn/gigaset/asyncdata.c3
-rw-r--r--drivers/isdn/gigaset/bas-gigaset.c12
-rw-r--r--drivers/isdn/gigaset/common.c2
-rw-r--r--drivers/isdn/gigaset/gigaset.h3
-rw-r--r--drivers/isdn/gigaset/i4l.c56
-rw-r--r--drivers/isdn/gigaset/interface.c25
-rw-r--r--drivers/isdn/gigaset/usb-gigaset.c7
-rw-r--r--drivers/leds/Kconfig16
-rw-r--r--drivers/leds/Makefile2
-rw-r--r--drivers/leds/led-triggers.c3
-rw-r--r--drivers/leds/leds-atmel-pwm.c2
-rw-r--r--drivers/leds/leds-h1940.c9
-rw-r--r--drivers/leds/leds-pca9532.c337
-rw-r--r--drivers/leds/leds-pca955x.c384
-rw-r--r--drivers/macintosh/adb.c3
-rw-r--r--drivers/macintosh/adbhid.c61
-rw-r--r--drivers/mca/mca-bus.c2
-rw-r--r--drivers/md/bitmap.c54
-rw-r--r--drivers/md/dm-crypt.c18
-rw-r--r--drivers/md/dm-linear.c38
-rw-r--r--drivers/md/dm-log.c4
-rw-r--r--drivers/md/dm-mpath.c10
-rw-r--r--drivers/md/dm-snap.c163
-rw-r--r--drivers/md/dm-snap.h11
-rw-r--r--drivers/md/dm-table.c13
-rw-r--r--drivers/md/dm.c46
-rw-r--r--drivers/md/dm.h6
-rw-r--r--drivers/md/faulty.c2
-rw-r--r--drivers/md/linear.c20
-rw-r--r--drivers/md/md.c615
-rw-r--r--drivers/md/multipath.c17
-rw-r--r--drivers/md/raid0.c8
-rw-r--r--drivers/md/raid1.c30
-rw-r--r--drivers/md/raid10.c22
-rw-r--r--drivers/md/raid5.c745
-rw-r--r--drivers/media/dvb/dvb-core/dvbdev.c4
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-dvb.c1
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-ioread.c1
-rw-r--r--drivers/media/video/uvc/uvc_queue.c1
-rw-r--r--drivers/media/video/videobuf-core.c1
-rw-r--r--drivers/memstick/host/jmb38x_ms.c4
-rw-r--r--drivers/message/fusion/mptbase.c3
-rw-r--r--drivers/message/fusion/mptbase.h4
-rw-r--r--drivers/message/fusion/mptfc.c4
-rw-r--r--drivers/message/i2o/device.c54
-rw-r--r--drivers/mfd/Kconfig11
-rw-r--r--drivers/mfd/Makefile4
-rw-r--r--drivers/mfd/mfd-core.c114
-rw-r--r--drivers/mfd/tc6393xb.c600
-rw-r--r--drivers/misc/Kconfig13
-rw-r--r--drivers/misc/Makefile1
-rw-r--r--drivers/misc/atmel_pwm.c3
-rw-r--r--drivers/misc/hpilo.c768
-rw-r--r--drivers/misc/hpilo.h189
-rw-r--r--drivers/misc/phantom.c5
-rw-r--r--drivers/misc/sgi-xp/xpc_main.c3
-rw-r--r--drivers/mmc/card/mmc_test.c225
-rw-r--r--drivers/mmc/card/queue.c97
-rw-r--r--drivers/mmc/host/au1xmmc.c54
-rw-r--r--drivers/mmc/host/pxamci.c2
-rw-r--r--drivers/mmc/host/s3cmci.c50
-rw-r--r--drivers/mmc/host/sdhci.c167
-rw-r--r--drivers/mmc/host/sdhci.h7
-rw-r--r--drivers/mtd/devices/block2mtd.c8
-rw-r--r--drivers/mtd/maps/uclinux.c1
-rw-r--r--drivers/mtd/mtdchar.c9
-rw-r--r--drivers/mtd/nand/cmx270_nand.c79
-rw-r--r--drivers/net/3c59x.c2
-rw-r--r--drivers/net/8139too.c138
-rw-r--r--drivers/net/Kconfig25
-rw-r--r--drivers/net/Makefile1
-rw-r--r--drivers/net/arm/at91_ether.c41
-rw-r--r--drivers/net/arm/at91_ether.h1
-rw-r--r--drivers/net/arm/ep93xx_eth.c2
-rw-r--r--drivers/net/arm/etherh.c6
-rw-r--r--drivers/net/atl1e/Makefile2
-rw-r--r--drivers/net/atl1e/atl1e.h503
-rw-r--r--drivers/net/atl1e/atl1e_ethtool.c405
-rw-r--r--drivers/net/atl1e/atl1e_hw.c664
-rw-r--r--drivers/net/atl1e/atl1e_hw.h793
-rw-r--r--drivers/net/atl1e/atl1e_main.c2599
-rw-r--r--drivers/net/atl1e/atl1e_param.c263
-rw-r--r--drivers/net/atlx/atl1.c3
-rw-r--r--drivers/net/au1000_eth.c5
-rw-r--r--drivers/net/bfin_mac.c1
-rw-r--r--drivers/net/bonding/bond_main.c3
-rw-r--r--drivers/net/cpmac.c2
-rw-r--r--drivers/net/dm9000.c15
-rw-r--r--drivers/net/e1000/e1000.h71
-rw-r--r--drivers/net/e1000/e1000_ethtool.c558
-rw-r--r--drivers/net/e1000/e1000_hw.c1373
-rw-r--r--drivers/net/e1000/e1000_main.c1490
-rw-r--r--drivers/net/e1000/e1000_osdep.h14
-rw-r--r--drivers/net/e1000/e1000_param.c16
-rw-r--r--drivers/net/e1000e/netdev.c2
-rw-r--r--drivers/net/fec.c54
-rw-r--r--drivers/net/fec_mpc52xx.c5
-rw-r--r--drivers/net/fs_enet/Makefile5
-rw-r--r--drivers/net/fs_enet/fs_enet-main.c319
-rw-r--r--drivers/net/fs_enet/fs_enet.h4
-rw-r--r--drivers/net/fs_enet/mac-fcc.c67
-rw-r--r--drivers/net/fs_enet/mac-fec.c23
-rw-r--r--drivers/net/fs_enet/mac-scc.c37
-rw-r--r--drivers/net/fs_enet/mii-bitbang.c107
-rw-r--r--drivers/net/fs_enet/mii-fec.c144
-rw-r--r--drivers/net/gianfar.c123
-rw-r--r--drivers/net/gianfar.h12
-rw-r--r--drivers/net/gianfar_ethtool.c41
-rw-r--r--drivers/net/hamradio/bpqether.c2
-rw-r--r--drivers/net/hamradio/hdlcdrv.c1
-rw-r--r--drivers/net/hp-plus.c2
-rw-r--r--drivers/net/hp.c2
-rw-r--r--drivers/net/igb/igb_main.c2
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c2
-rw-r--r--drivers/net/macb.c4
-rw-r--r--drivers/net/macvlan.c3
-rw-r--r--drivers/net/meth.c2
-rw-r--r--drivers/net/mlx4/cmd.c3
-rw-r--r--drivers/net/mlx4/eq.c1
-rw-r--r--drivers/net/mlx4/fw.c18
-rw-r--r--drivers/net/mlx4/fw.h2
-rw-r--r--drivers/net/mlx4/main.c2
-rw-r--r--drivers/net/mlx4/mlx4.h1
-rw-r--r--drivers/net/mlx4/mr.c49
-rw-r--r--drivers/net/mlx4/pd.c7
-rw-r--r--drivers/net/mv643xx_eth.c2
-rw-r--r--drivers/net/myri10ge/myri10ge.c62
-rw-r--r--drivers/net/ne.c2
-rw-r--r--drivers/net/ne2.c2
-rw-r--r--drivers/net/netxen/Makefile2
-rw-r--r--drivers/net/netxen/netxen_nic.h575
-rw-r--r--drivers/net/netxen/netxen_nic_ctx.c710
-rw-r--r--drivers/net/netxen/netxen_nic_ethtool.c168
-rw-r--r--drivers/net/netxen/netxen_nic_hdr.h251
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c2196
-rw-r--r--drivers/net/netxen/netxen_nic_hw.h60
-rw-r--r--drivers/net/netxen/netxen_nic_init.c806
-rw-r--r--drivers/net/netxen/netxen_nic_isr.c220
-rw-r--r--drivers/net/netxen/netxen_nic_main.c1169
-rw-r--r--drivers/net/netxen/netxen_nic_niu.c114
-rw-r--r--drivers/net/netxen/netxen_nic_phan_reg.h31
-rw-r--r--drivers/net/phy/marvell.c7
-rw-r--r--drivers/net/ppp_generic.c3
-rw-r--r--drivers/net/r6040.c445
-rw-r--r--drivers/net/r8169.c14
-rw-r--r--drivers/net/sfc/efx.c39
-rw-r--r--drivers/net/sfc/falcon.c12
-rw-r--r--drivers/net/sfc/net_driver.h5
-rw-r--r--drivers/net/sh_eth.c5
-rw-r--r--drivers/net/sky2.c5
-rw-r--r--drivers/net/smc91x.c94
-rw-r--r--drivers/net/smc91x.h76
-rw-r--r--drivers/net/sunhme.c4
-rw-r--r--drivers/net/tc35815.c1
-rw-r--r--drivers/net/tulip/de4x5.c16
-rw-r--r--drivers/net/tulip/de4x5.h3
-rw-r--r--drivers/net/tun.c2
-rw-r--r--drivers/net/ucc_geth.c1
-rw-r--r--drivers/net/usb/cdc_ether.c11
-rw-r--r--drivers/net/usb/rndis_host.c4
-rw-r--r--drivers/net/wan/cosa.c6
-rw-r--r--drivers/net/wireless/hostap/hostap_hw.c3
-rw-r--r--drivers/net/wireless/ipw2200.c33
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c18
-rw-r--r--drivers/net/xen-netfront.c19
-rw-r--r--drivers/pci/dmar.c4
-rw-r--r--drivers/pci/hotplug/acpiphp.h4
-rw-r--r--drivers/pci/intel-iommu.c2
-rw-r--r--drivers/pci/pci.c38
-rw-r--r--drivers/pci/proc.c18
-rw-r--r--drivers/pcmcia/Kconfig3
-rw-r--r--drivers/pcmcia/Makefile1
-rw-r--r--drivers/pcmcia/electra_cf.c1
-rw-r--r--drivers/pcmcia/pxa2xx_cm_x270.c93
-rw-r--r--drivers/pcmcia/pxa2xx_palmtx.c118
-rw-r--r--drivers/power/Kconfig6
-rw-r--r--drivers/power/Makefile1
-rw-r--r--drivers/power/apm_power.c2
-rw-r--r--drivers/power/palmtx_battery.c198
-rw-r--r--drivers/power/power_supply_core.c4
-rw-r--r--drivers/rtc/Kconfig19
-rw-r--r--drivers/rtc/Makefile2
-rw-r--r--drivers/rtc/interface.c2
-rw-r--r--drivers/rtc/rtc-at91rm9200.c16
-rw-r--r--drivers/rtc/rtc-cmos.c294
-rw-r--r--drivers/rtc/rtc-dev.c58
-rw-r--r--drivers/rtc/rtc-ds1305.c847
-rw-r--r--drivers/rtc/rtc-m41t80.c20
-rw-r--r--drivers/rtc/rtc-m41t94.c173
-rw-r--r--drivers/rtc/rtc-omap.c21
-rw-r--r--drivers/rtc/rtc-pcf8583.c129
-rw-r--r--drivers/rtc/rtc-s3c.c89
-rw-r--r--drivers/rtc/rtc-vr41xx.c65
-rw-r--r--drivers/s390/char/raw3270.c14
-rw-r--r--drivers/s390/char/tape_class.c7
-rw-r--r--drivers/s390/char/vmur.c5
-rw-r--r--drivers/s390/net/claw.c2141
-rw-r--r--drivers/s390/net/ctcm_dbug.c29
-rw-r--r--drivers/s390/net/ctcm_dbug.h39
-rw-r--r--drivers/s390/net/ctcm_fsms.c402
-rw-r--r--drivers/s390/net/ctcm_main.c514
-rw-r--r--drivers/s390/net/ctcm_main.h31
-rw-r--r--drivers/s390/net/ctcm_mpc.c1110
-rw-r--r--drivers/s390/net/ctcm_mpc.h2
-rw-r--r--drivers/s390/net/qeth_l3_main.c2
-rw-r--r--drivers/sbus/char/uctrl.c16
-rw-r--r--drivers/sbus/char/vfc.h4
-rw-r--r--drivers/sbus/char/vfc_dev.c39
-rw-r--r--drivers/sbus/char/vfc_i2c.c12
-rw-r--r--drivers/sbus/dvma.c2
-rw-r--r--drivers/sbus/sbus.c6
-rw-r--r--drivers/scsi/dpt_i2o.c4
-rw-r--r--drivers/scsi/hosts.c7
-rw-r--r--drivers/scsi/ide-scsi.c32
-rw-r--r--drivers/scsi/scsi_transport_fc.c9
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c8
-rw-r--r--drivers/scsi/sun_esp.c1
-rw-r--r--drivers/serial/8250.c25
-rw-r--r--drivers/serial/8250_gsc.c2
-rw-r--r--drivers/serial/8250_pci.c17
-rw-r--r--drivers/serial/Kconfig16
-rw-r--r--drivers/serial/cpm_uart/cpm_uart_core.c118
-rw-r--r--drivers/serial/dz.c24
-rw-r--r--drivers/serial/icom.c2
-rw-r--r--drivers/serial/mpsc.c148
-rw-r--r--drivers/serial/samsung.c2
-rw-r--r--drivers/serial/serial_core.c3
-rw-r--r--drivers/serial/serial_txx9.c2
-rw-r--r--drivers/serial/zs.c21
-rw-r--r--drivers/spi/Kconfig45
-rw-r--r--drivers/spi/au1550_spi.c207
-rw-r--r--drivers/spi/spi.c6
-rw-r--r--drivers/spi/spi_mpc83xx.c29
-rw-r--r--drivers/spi/spidev.c23
-rw-r--r--drivers/spi/xilinx_spi.c5
-rw-r--r--drivers/uio/Kconfig10
-rw-r--r--drivers/uio/Makefile1
-rw-r--r--drivers/uio/uio.c26
-rw-r--r--drivers/uio/uio_pdrv.c118
-rw-r--r--drivers/usb/atm/cxacru.c1
-rw-r--r--drivers/usb/atm/speedtch.c1
-rw-r--r--drivers/usb/class/cdc-acm.c186
-rw-r--r--drivers/usb/class/cdc-acm.h5
-rw-r--r--drivers/usb/class/cdc-wdm.c127
-rw-r--r--drivers/usb/core/devices.c4
-rw-r--r--drivers/usb/core/devio.c99
-rw-r--r--drivers/usb/core/driver.c168
-rw-r--r--drivers/usb/core/endpoint.c4
-rw-r--r--drivers/usb/core/file.c15
-rw-r--r--drivers/usb/core/hcd.c6
-rw-r--r--drivers/usb/core/hcd.h4
-rw-r--r--drivers/usb/core/hub.c536
-rw-r--r--drivers/usb/core/inode.c16
-rw-r--r--drivers/usb/core/message.c22
-rw-r--r--drivers/usb/core/usb.c7
-rw-r--r--drivers/usb/core/usb.h19
-rw-r--r--drivers/usb/gadget/Kconfig14
-rw-r--r--drivers/usb/gadget/Makefile13
-rw-r--r--drivers/usb/gadget/amd5536udc.c2
-rw-r--r--drivers/usb/gadget/at91_udc.c13
-rw-r--r--drivers/usb/gadget/cdc2.c246
-rw-r--r--drivers/usb/gadget/composite.c1041
-rw-r--r--drivers/usb/gadget/config.c76
-rw-r--r--drivers/usb/gadget/dummy_hcd.c4
-rw-r--r--drivers/usb/gadget/epautoconf.c1
-rw-r--r--drivers/usb/gadget/ether.c2631
-rw-r--r--drivers/usb/gadget/f_acm.c589
-rw-r--r--drivers/usb/gadget/f_ecm.c833
-rw-r--r--drivers/usb/gadget/f_loopback.c381
-rw-r--r--drivers/usb/gadget/f_rndis.c827
-rw-r--r--drivers/usb/gadget/f_serial.c296
-rw-r--r--drivers/usb/gadget/f_sourcesink.c587
-rw-r--r--drivers/usb/gadget/f_subset.c423
-rw-r--r--drivers/usb/gadget/file_storage.c4
-rw-r--r--drivers/usb/gadget/fsl_usb2_udc.c2
-rw-r--r--drivers/usb/gadget/g_zero.h25
-rw-r--r--drivers/usb/gadget/gadget_chips.h23
-rw-r--r--drivers/usb/gadget/goku_udc.c2
-rw-r--r--drivers/usb/gadget/inode.c23
-rw-r--r--drivers/usb/gadget/lh7a40x_udc.c2
-rw-r--r--drivers/usb/gadget/m66592-udc.c2
-rw-r--r--drivers/usb/gadget/ndis.h10
-rw-r--r--drivers/usb/gadget/net2280.c2
-rw-r--r--drivers/usb/gadget/omap_udc.c2
-rw-r--r--drivers/usb/gadget/printer.c11
-rw-r--r--drivers/usb/gadget/pxa25x_udc.c8
-rw-r--r--drivers/usb/gadget/pxa27x_udc.c1
-rw-r--r--drivers/usb/gadget/rndis.c421
-rw-r--r--drivers/usb/gadget/rndis.h9
-rw-r--r--drivers/usb/gadget/serial.c2315
-rw-r--r--drivers/usb/gadget/u_ether.c967
-rw-r--r--drivers/usb/gadget/u_ether.h127
-rw-r--r--drivers/usb/gadget/u_serial.c1246
-rw-r--r--drivers/usb/gadget/u_serial.h58
-rw-r--r--drivers/usb/gadget/zero.c1162
-rw-r--r--drivers/usb/host/ehci-au1xxx.c369
-rw-r--r--drivers/usb/host/ehci-dbg.c4
-rw-r--r--drivers/usb/host/ehci-fsl.c17
-rw-r--r--drivers/usb/host/ehci-hcd.c2
-rw-r--r--drivers/usb/host/ehci-ixp4xx.c8
-rw-r--r--drivers/usb/host/ehci-orion.c8
-rw-r--r--drivers/usb/host/ehci-ps3.c2
-rw-r--r--drivers/usb/host/ehci-q.c17
-rw-r--r--drivers/usb/host/ehci.h5
-rw-r--r--drivers/usb/host/isp116x-hcd.c25
-rw-r--r--drivers/usb/host/isp1760-hcd.c81
-rw-r--r--drivers/usb/host/isp1760-hcd.h20
-rw-r--r--drivers/usb/host/isp1760-if.c37
-rw-r--r--drivers/usb/host/ohci-at91.c9
-rw-r--r--drivers/usb/host/ohci-au1xxx.c327
-rw-r--r--drivers/usb/host/ohci-dbg.c2
-rw-r--r--drivers/usb/host/ohci-hcd.c2
-rw-r--r--drivers/usb/host/ohci-omap.c2
-rw-r--r--drivers/usb/host/ohci-pnx4008.c28
-rw-r--r--drivers/usb/host/ohci-ppc-of.c2
-rw-r--r--drivers/usb/host/ohci-ps3.c2
-rw-r--r--drivers/usb/host/ohci-q.c3
-rw-r--r--drivers/usb/host/ohci-sm501.c2
-rw-r--r--drivers/usb/host/ohci-ssb.c2
-rw-r--r--drivers/usb/host/r8a66597-hcd.c44
-rw-r--r--drivers/usb/host/sl811-hcd.c2
-rw-r--r--drivers/usb/host/u132-hcd.c2
-rw-r--r--drivers/usb/host/uhci-hub.c2
-rw-r--r--drivers/usb/misc/auerswald.c10
-rw-r--r--drivers/usb/misc/emi62.c2
-rw-r--r--drivers/usb/misc/ftdi-elan.c24
-rw-r--r--drivers/usb/misc/iowarrior.c8
-rw-r--r--drivers/usb/misc/rio500.c8
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb.c13
-rw-r--r--drivers/usb/misc/usblcd.c6
-rw-r--r--drivers/usb/mon/mon_bin.c5
-rw-r--r--drivers/usb/mon/mon_stat.c14
-rw-r--r--drivers/usb/serial/Kconfig8
-rw-r--r--drivers/usb/serial/Makefile1
-rw-r--r--drivers/usb/serial/aircable.c19
-rw-r--r--drivers/usb/serial/airprime.c353
-rw-r--r--drivers/usb/serial/ark3116.c32
-rw-r--r--drivers/usb/serial/belkin_sa.c201
-rw-r--r--drivers/usb/serial/belkin_sa.h15
-rw-r--r--drivers/usb/serial/bus.c20
-rw-r--r--drivers/usb/serial/ch341.c10
-rw-r--r--drivers/usb/serial/console.c136
-rw-r--r--drivers/usb/serial/cp2101.c392
-rw-r--r--drivers/usb/serial/cyberjack.c176
-rw-r--r--drivers/usb/serial/cypress_m8.c703
-rw-r--r--drivers/usb/serial/cypress_m8.h2
-rw-r--r--drivers/usb/serial/digi_acceleport.c460
-rw-r--r--drivers/usb/serial/empeg.c257
-rw-r--r--drivers/usb/serial/ezusb.c22
-rw-r--r--drivers/usb/serial/ftdi_sio.c1247
-rw-r--r--drivers/usb/serial/ftdi_sio.h126
-rw-r--r--drivers/usb/serial/funsoft.c2
-rw-r--r--drivers/usb/serial/garmin_gps.c400
-rw-r--r--drivers/usb/serial/generic.c122
-rw-r--r--drivers/usb/serial/hp4x.c3
-rw-r--r--drivers/usb/serial/io_edgeport.c1964
-rw-r--r--drivers/usb/serial/io_tables.h6
-rw-r--r--drivers/usb/serial/io_ti.c1875
-rw-r--r--drivers/usb/serial/ipaq.c146
-rw-r--r--drivers/usb/serial/ipw.c294
-rw-r--r--drivers/usb/serial/ir-usb.c481
-rw-r--r--drivers/usb/serial/iuu_phoenix.c58
-rw-r--r--drivers/usb/serial/keyspan.c955
-rw-r--r--drivers/usb/serial/keyspan.h44
-rw-r--r--drivers/usb/serial/keyspan_pda.c233
-rw-r--r--drivers/usb/serial/kl5kusb105.c417
-rw-r--r--drivers/usb/serial/kobil_sct.c617
-rw-r--r--drivers/usb/serial/mct_u232.c364
-rw-r--r--drivers/usb/serial/mos7720.c308
-rw-r--r--drivers/usb/serial/mos7840.c557
-rw-r--r--drivers/usb/serial/navman.c10
-rw-r--r--drivers/usb/serial/omninet.c171
-rw-r--r--drivers/usb/serial/option.c168
-rw-r--r--drivers/usb/serial/oti6858.c255
-rw-r--r--drivers/usb/serial/pl2303.c140
-rw-r--r--drivers/usb/serial/safe_serial.c298
-rw-r--r--drivers/usb/serial/sierra.c95
-rw-r--r--drivers/usb/serial/spcp8x5.c73
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.c449
-rw-r--r--drivers/usb/serial/usb-serial.c400
-rw-r--r--drivers/usb/serial/usb_debug.c10
-rw-r--r--drivers/usb/serial/visor.c384
-rw-r--r--drivers/usb/serial/whiteheat.c441
-rw-r--r--drivers/usb/serial/whiteheat.h78
-rw-r--r--drivers/usb/storage/datafab.c2
-rw-r--r--drivers/usb/storage/debug.c2
-rw-r--r--drivers/usb/storage/debug.h2
-rw-r--r--drivers/usb/storage/dpcm.c2
-rw-r--r--drivers/usb/storage/dpcm.h2
-rw-r--r--drivers/usb/storage/freecom.c2
-rw-r--r--drivers/usb/storage/freecom.h2
-rw-r--r--drivers/usb/storage/initializers.c2
-rw-r--r--drivers/usb/storage/initializers.h2
-rw-r--r--drivers/usb/storage/isd200.c8
-rw-r--r--drivers/usb/storage/jumpshot.c2
-rw-r--r--drivers/usb/storage/protocol.c2
-rw-r--r--drivers/usb/storage/protocol.h2
-rw-r--r--drivers/usb/storage/scsiglue.c53
-rw-r--r--drivers/usb/storage/scsiglue.h2
-rw-r--r--drivers/usb/storage/sddr09.c1
-rw-r--r--drivers/usb/storage/sddr09.h2
-rw-r--r--drivers/usb/storage/sddr55.c2
-rw-r--r--drivers/usb/storage/sddr55.h2
-rw-r--r--drivers/usb/storage/shuttle_usbat.c2
-rw-r--r--drivers/usb/storage/shuttle_usbat.h2
-rw-r--r--drivers/usb/storage/transport.c83
-rw-r--r--drivers/usb/storage/transport.h2
-rw-r--r--drivers/usb/storage/unusual_devs.h13
-rw-r--r--drivers/usb/storage/usb.c111
-rw-r--r--drivers/usb/storage/usb.h25
-rw-r--r--drivers/video/Kconfig53
-rw-r--r--drivers/video/Makefile5
-rw-r--r--drivers/video/acornfb.c1
-rw-r--r--drivers/video/amifb.c24
-rw-r--r--drivers/video/atafb.c7
-rw-r--r--drivers/video/atmel_lcdfb.c92
-rw-r--r--drivers/video/aty/aty128fb.c8
-rw-r--r--drivers/video/aty/atyfb_base.c100
-rw-r--r--drivers/video/aty/radeon_base.c20
-rw-r--r--drivers/video/aty/radeonfb.h2
-rw-r--r--drivers/video/backlight/Kconfig45
-rw-r--r--drivers/video/backlight/Makefile8
-rw-r--r--drivers/video/backlight/atmel-pwm-bl.c244
-rw-r--r--drivers/video/backlight/backlight.c1
-rw-r--r--drivers/video/backlight/ili9320.c330
-rw-r--r--drivers/video/backlight/ili9320.h80
-rw-r--r--drivers/video/backlight/lcd.c2
-rw-r--r--drivers/video/backlight/mbp_nvidia_bl.c116
-rw-r--r--drivers/video/backlight/platform_lcd.c172
-rw-r--r--drivers/video/backlight/vgg2432a4.c284
-rw-r--r--drivers/video/bf54x-lq043fb.c2
-rw-r--r--drivers/video/bfin-t350mcqb-fb.c2
-rw-r--r--drivers/video/carminefb.c790
-rw-r--r--drivers/video/carminefb.h64
-rw-r--r--drivers/video/carminefb_regs.h159
-rw-r--r--drivers/video/cobalt_lcdfb.c371
-rw-r--r--drivers/video/console/fbcon.c8
-rw-r--r--drivers/video/console/fbcon.h8
-rw-r--r--drivers/video/console/mdacon.c4
-rw-r--r--drivers/video/fbmem.c15
-rw-r--r--drivers/video/fbmon.c2
-rw-r--r--drivers/video/fsl-diu-fb.c60
-rw-r--r--drivers/video/geode/lxfb.h2
-rw-r--r--drivers/video/geode/lxfb_ops.c28
-rw-r--r--drivers/video/hgafb.c36
-rw-r--r--drivers/video/imxfb.c1
-rw-r--r--drivers/video/neofb.c215
-rw-r--r--drivers/video/offb.c192
-rw-r--r--drivers/video/omap/dispc.c1
-rw-r--r--drivers/video/omap/omapfb_main.c1
-rw-r--r--drivers/video/ps3fb.c1
-rw-r--r--drivers/video/pxafb.c72
-rw-r--r--drivers/video/pxafb.h2
-rw-r--r--drivers/video/sa1100fb.c8
-rw-r--r--drivers/video/sa1100fb.h2
-rw-r--r--drivers/video/sh7760fb.c658
-rw-r--r--drivers/video/sh_mobile_lcdcfb.c725
-rw-r--r--drivers/video/sis/init.h1
-rw-r--r--drivers/video/sis/init301.h1
-rw-r--r--drivers/video/sis/initextlfb.c1
-rw-r--r--drivers/video/sis/osdef.h1
-rw-r--r--drivers/video/sis/sis.h22
-rw-r--r--drivers/video/sis/sis_accel.c1
-rw-r--r--drivers/video/sis/sis_main.c44
-rw-r--r--drivers/video/sis/sis_main.h4
-rw-r--r--drivers/video/sis/vgatypes.h4
-rw-r--r--drivers/video/skeletonfb.c37
-rw-r--r--drivers/video/sm501fb.c329
-rw-r--r--drivers/video/tdfxfb.c8
-rw-r--r--drivers/video/tridentfb.c1350
-rw-r--r--drivers/video/uvesafb.c4
-rw-r--r--drivers/video/vfb.c14
-rw-r--r--drivers/video/vga16fb.c122
-rw-r--r--drivers/watchdog/Kconfig2
-rw-r--r--drivers/watchdog/Makefile2
-rw-r--r--drivers/xen/balloon.c1
-rw-r--r--drivers/xen/events.c27
-rw-r--r--drivers/xen/manage.c10
-rw-r--r--drivers/zorro/zorro-sysfs.c1
770 files changed, 55701 insertions, 30762 deletions
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index 55c17afbe669..2655bc1b4eeb 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -263,22 +263,22 @@ static int acpi_fan_add(struct acpi_device *device)
263 goto end; 263 goto end;
264 } 264 }
265 265
266 printk(KERN_INFO PREFIX 266 dev_info(&device->dev, "registered as cooling_device%d\n", cdev->id);
267 "%s is registered as cooling_device%d\n",
268 device->dev.bus_id, cdev->id);
269 267
270 acpi_driver_data(device) = cdev; 268 acpi_driver_data(device) = cdev;
271 result = sysfs_create_link(&device->dev.kobj, 269 result = sysfs_create_link(&device->dev.kobj,
272 &cdev->device.kobj, 270 &cdev->device.kobj,
273 "thermal_cooling"); 271 "thermal_cooling");
274 if (result) 272 if (result)
275 printk(KERN_ERR PREFIX "Create sysfs link\n"); 273 dev_err(&device->dev, "Failed to create sysfs link "
274 "'thermal_cooling'\n");
276 275
277 result = sysfs_create_link(&cdev->device.kobj, 276 result = sysfs_create_link(&cdev->device.kobj,
278 &device->dev.kobj, 277 &device->dev.kobj,
279 "device"); 278 "device");
280 if (result) 279 if (result)
281 printk(KERN_ERR PREFIX "Create sysfs link\n"); 280 dev_err(&device->dev, "Failed to create sysfs link "
281 "'device'\n");
282 282
283 result = acpi_fan_add_fs(device); 283 result = acpi_fan_add_fs(device);
284 if (result) 284 if (result)
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index 2f173e83f8a7..084109507c9f 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -146,8 +146,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
146 acpi_status status; 146 acpi_status status;
147 147
148 if (dev->archdata.acpi_handle) { 148 if (dev->archdata.acpi_handle) {
149 printk(KERN_WARNING PREFIX 149 dev_warn(dev, "Drivers changed 'acpi_handle'\n");
150 "Drivers changed 'acpi_handle' for %s\n", dev->bus_id);
151 return -EINVAL; 150 return -EINVAL;
152 } 151 }
153 get_device(dev); 152 get_device(dev);
@@ -195,8 +194,7 @@ static int acpi_unbind_one(struct device *dev)
195 /* acpi_bind_one increase refcnt by one */ 194 /* acpi_bind_one increase refcnt by one */
196 put_device(dev); 195 put_device(dev);
197 } else { 196 } else {
198 printk(KERN_ERR PREFIX 197 dev_err(dev, "Oops, 'acpi_handle' corrupt\n");
199 "Oops, 'acpi_handle' corrupt for %s\n", dev->bus_id);
200 } 198 }
201 return 0; 199 return 0;
202} 200}
diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
index b9ab030a52d5..dd376f7ad090 100644
--- a/drivers/acpi/pci_slot.c
+++ b/drivers/acpi/pci_slot.c
@@ -6,8 +6,8 @@
6 * Thanks to Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> for code 6 * Thanks to Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> for code
7 * review and fixes. 7 * review and fixes.
8 * 8 *
9 * Copyright (C) 2007 Alex Chiang <achiang@hp.com> 9 * Copyright (C) 2007-2008 Hewlett-Packard Development Company, L.P.
10 * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. 10 * Alex Chiang <achiang@hp.com>
11 * 11 *
12 * This program is free software; you can redistribute it and/or modify it 12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms and conditions of the GNU General Public License, 13 * under the terms and conditions of the GNU General Public License,
@@ -158,6 +158,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
158 if (IS_ERR(pci_slot)) { 158 if (IS_ERR(pci_slot)) {
159 err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot)); 159 err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
160 kfree(slot); 160 kfree(slot);
161 return AE_OK;
161 } 162 }
162 163
163 slot->root_handle = parent_context->root_handle; 164 slot->root_handle = parent_context->root_handle;
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
index ec0f2d581ece..e36422a7122c 100644
--- a/drivers/acpi/processor_core.c
+++ b/drivers/acpi/processor_core.c
@@ -714,9 +714,8 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
714 goto end; 714 goto end;
715 } 715 }
716 716
717 printk(KERN_INFO PREFIX 717 dev_info(&device->dev, "registered as cooling_device%d\n",
718 "%s is registered as cooling_device%d\n", 718 pr->cdev->id);
719 device->dev.bus_id, pr->cdev->id);
720 719
721 result = sysfs_create_link(&device->dev.kobj, 720 result = sysfs_create_link(&device->dev.kobj,
722 &pr->cdev->device.kobj, 721 &pr->cdev->device.kobj,
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c
index 0622ace05220..a2c3f9cfa549 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -827,6 +827,7 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr)
827static int acpi_processor_get_throttling(struct acpi_processor *pr) 827static int acpi_processor_get_throttling(struct acpi_processor *pr)
828{ 828{
829 cpumask_t saved_mask; 829 cpumask_t saved_mask;
830 cpumask_of_cpu_ptr_declare(new_mask);
830 int ret; 831 int ret;
831 832
832 if (!pr) 833 if (!pr)
@@ -838,7 +839,8 @@ static int acpi_processor_get_throttling(struct acpi_processor *pr)
838 * Migrate task to the cpu pointed by pr. 839 * Migrate task to the cpu pointed by pr.
839 */ 840 */
840 saved_mask = current->cpus_allowed; 841 saved_mask = current->cpus_allowed;
841 set_cpus_allowed_ptr(current, &cpumask_of_cpu(pr->id)); 842 cpumask_of_cpu_ptr_next(new_mask, pr->id);
843 set_cpus_allowed_ptr(current, new_mask);
842 ret = pr->throttling.acpi_processor_get_throttling(pr); 844 ret = pr->throttling.acpi_processor_get_throttling(pr);
843 /* restore the previous state */ 845 /* restore the previous state */
844 set_cpus_allowed_ptr(current, &saved_mask); 846 set_cpus_allowed_ptr(current, &saved_mask);
@@ -987,6 +989,7 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
987int acpi_processor_set_throttling(struct acpi_processor *pr, int state) 989int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
988{ 990{
989 cpumask_t saved_mask; 991 cpumask_t saved_mask;
992 cpumask_of_cpu_ptr_declare(new_mask);
990 int ret = 0; 993 int ret = 0;
991 unsigned int i; 994 unsigned int i;
992 struct acpi_processor *match_pr; 995 struct acpi_processor *match_pr;
@@ -1013,7 +1016,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1013 * affected cpu in order to get one proper T-state. 1016 * affected cpu in order to get one proper T-state.
1014 * The notifier event is THROTTLING_PRECHANGE. 1017 * The notifier event is THROTTLING_PRECHANGE.
1015 */ 1018 */
1016 for_each_cpu_mask(i, online_throttling_cpus) { 1019 for_each_cpu_mask_nr(i, online_throttling_cpus) {
1017 t_state.cpu = i; 1020 t_state.cpu = i;
1018 acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, 1021 acpi_processor_throttling_notifier(THROTTLING_PRECHANGE,
1019 &t_state); 1022 &t_state);
@@ -1025,7 +1028,8 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1025 * it can be called only for the cpu pointed by pr. 1028 * it can be called only for the cpu pointed by pr.
1026 */ 1029 */
1027 if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) { 1030 if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) {
1028 set_cpus_allowed_ptr(current, &cpumask_of_cpu(pr->id)); 1031 cpumask_of_cpu_ptr_next(new_mask, pr->id);
1032 set_cpus_allowed_ptr(current, new_mask);
1029 ret = p_throttling->acpi_processor_set_throttling(pr, 1033 ret = p_throttling->acpi_processor_set_throttling(pr,
1030 t_state.target_state); 1034 t_state.target_state);
1031 } else { 1035 } else {
@@ -1034,7 +1038,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1034 * it is necessary to set T-state for every affected 1038 * it is necessary to set T-state for every affected
1035 * cpus. 1039 * cpus.
1036 */ 1040 */
1037 for_each_cpu_mask(i, online_throttling_cpus) { 1041 for_each_cpu_mask_nr(i, online_throttling_cpus) {
1038 match_pr = per_cpu(processors, i); 1042 match_pr = per_cpu(processors, i);
1039 /* 1043 /*
1040 * If the pointer is invalid, we will report the 1044 * If the pointer is invalid, we will report the
@@ -1056,7 +1060,8 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1056 continue; 1060 continue;
1057 } 1061 }
1058 t_state.cpu = i; 1062 t_state.cpu = i;
1059 set_cpus_allowed_ptr(current, &cpumask_of_cpu(i)); 1063 cpumask_of_cpu_ptr_next(new_mask, i);
1064 set_cpus_allowed_ptr(current, new_mask);
1060 ret = match_pr->throttling. 1065 ret = match_pr->throttling.
1061 acpi_processor_set_throttling( 1066 acpi_processor_set_throttling(
1062 match_pr, t_state.target_state); 1067 match_pr, t_state.target_state);
@@ -1068,7 +1073,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1068 * affected cpu to update the T-states. 1073 * affected cpu to update the T-states.
1069 * The notifier event is THROTTLING_POSTCHANGE 1074 * The notifier event is THROTTLING_POSTCHANGE
1070 */ 1075 */
1071 for_each_cpu_mask(i, online_throttling_cpus) { 1076 for_each_cpu_mask_nr(i, online_throttling_cpus) {
1072 t_state.cpu = i; 1077 t_state.cpu = i;
1073 acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, 1078 acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE,
1074 &t_state); 1079 &t_state);
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index f3132aa47a69..f6f52c1a2aba 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -471,7 +471,7 @@ static int acpi_device_register(struct acpi_device *device,
471 device->dev.release = &acpi_device_release; 471 device->dev.release = &acpi_device_release;
472 result = device_add(&device->dev); 472 result = device_add(&device->dev);
473 if(result) { 473 if(result) {
474 printk(KERN_ERR PREFIX "Error adding device %s", device->dev.bus_id); 474 dev_err(&device->dev, "Error adding device\n");
475 goto end; 475 goto end;
476 } 476 }
477 477
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
index 0489a7d1d42c..d13194a031bf 100644
--- a/drivers/acpi/sleep/main.c
+++ b/drivers/acpi/sleep/main.c
@@ -280,9 +280,36 @@ static struct platform_suspend_ops acpi_suspend_ops_old = {
280 .end = acpi_pm_end, 280 .end = acpi_pm_end,
281 .recover = acpi_pm_finish, 281 .recover = acpi_pm_finish,
282}; 282};
283
284static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
285{
286 old_suspend_ordering = true;
287 return 0;
288}
289
290static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
291 {
292 .callback = init_old_suspend_ordering,
293 .ident = "Abit KN9 (nForce4 variant)",
294 .matches = {
295 DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"),
296 DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"),
297 },
298 },
299 {},
300};
283#endif /* CONFIG_SUSPEND */ 301#endif /* CONFIG_SUSPEND */
284 302
285#ifdef CONFIG_HIBERNATION 303#ifdef CONFIG_HIBERNATION
304static unsigned long s4_hardware_signature;
305static struct acpi_table_facs *facs;
306static bool nosigcheck;
307
308void __init acpi_no_s4_hw_signature(void)
309{
310 nosigcheck = true;
311}
312
286static int acpi_hibernation_begin(void) 313static int acpi_hibernation_begin(void)
287{ 314{
288 acpi_target_sleep_state = ACPI_STATE_S4; 315 acpi_target_sleep_state = ACPI_STATE_S4;
@@ -316,6 +343,12 @@ static void acpi_hibernation_leave(void)
316 acpi_enable(); 343 acpi_enable();
317 /* Reprogram control registers and execute _BFS */ 344 /* Reprogram control registers and execute _BFS */
318 acpi_leave_sleep_state_prep(ACPI_STATE_S4); 345 acpi_leave_sleep_state_prep(ACPI_STATE_S4);
346 /* Check the hardware signature */
347 if (facs && s4_hardware_signature != facs->hardware_signature) {
348 printk(KERN_EMERG "ACPI: Hardware changed while hibernated, "
349 "cannot resume!\n");
350 panic("ACPI S4 hardware signature mismatch");
351 }
319} 352}
320 353
321static void acpi_pm_enable_gpes(void) 354static void acpi_pm_enable_gpes(void)
@@ -516,6 +549,8 @@ int __init acpi_sleep_init(void)
516 u8 type_a, type_b; 549 u8 type_a, type_b;
517#ifdef CONFIG_SUSPEND 550#ifdef CONFIG_SUSPEND
518 int i = 0; 551 int i = 0;
552
553 dmi_check_system(acpisleep_dmi_table);
519#endif 554#endif
520 555
521 if (acpi_disabled) 556 if (acpi_disabled)
@@ -544,6 +579,13 @@ int __init acpi_sleep_init(void)
544 &acpi_hibernation_ops_old : &acpi_hibernation_ops); 579 &acpi_hibernation_ops_old : &acpi_hibernation_ops);
545 sleep_states[ACPI_STATE_S4] = 1; 580 sleep_states[ACPI_STATE_S4] = 1;
546 printk(" S4"); 581 printk(" S4");
582 if (!nosigcheck) {
583 acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
584 (struct acpi_table_header **)&facs);
585 if (facs)
586 s4_hardware_signature =
587 facs->hardware_signature;
588 }
547 } 589 }
548#endif 590#endif
549 status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); 591 status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b);
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
index d8e3f153b295..91dec448b3ed 100644
--- a/drivers/acpi/system.c
+++ b/drivers/acpi/system.c
@@ -26,6 +26,7 @@
26#include <linux/proc_fs.h> 26#include <linux/proc_fs.h>
27#include <linux/seq_file.h> 27#include <linux/seq_file.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/string.h>
29#include <asm/uaccess.h> 30#include <asm/uaccess.h>
30 31
31#include <acpi/acpi_drivers.h> 32#include <acpi/acpi_drivers.h>
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index 9adfd180df6a..912703691d36 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -1220,8 +1220,8 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
1220 1220
1221 tz->tz_enabled = 1; 1221 tz->tz_enabled = 1;
1222 1222
1223 printk(KERN_INFO PREFIX "%s is registered as thermal_zone%d\n", 1223 dev_info(&tz->device->dev, "registered as thermal_zone%d\n",
1224 tz->device->dev.bus_id, tz->thermal_zone->id); 1224 tz->thermal_zone->id);
1225 return 0; 1225 return 0;
1226} 1226}
1227 1227
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index e32b6c14d928..e8a51a1700f7 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -772,9 +772,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
772 if (IS_ERR(device->cdev)) 772 if (IS_ERR(device->cdev))
773 return; 773 return;
774 774
775 printk(KERN_INFO PREFIX 775 dev_info(&device->dev->dev, "registered as cooling_device%d\n",
776 "%s is registered as cooling_device%d\n", 776 device->cdev->id);
777 device->dev->dev.bus_id, device->cdev->id);
778 result = sysfs_create_link(&device->dev->dev.kobj, 777 result = sysfs_create_link(&device->dev->dev.kobj,
779 &device->cdev->device.kobj, 778 &device->cdev->device.kobj,
780 "thermal_cooling"); 779 "thermal_cooling");
diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c
index d5c1bbfbe79d..73338d231db9 100644
--- a/drivers/atm/fore200e.c
+++ b/drivers/atm/fore200e.c
@@ -2562,7 +2562,8 @@ fore200e_load_and_start_fw(struct fore200e* fore200e)
2562 const struct firmware *firmware; 2562 const struct firmware *firmware;
2563 struct device *device; 2563 struct device *device;
2564 struct fw_header *fw_header; 2564 struct fw_header *fw_header;
2565 u32 *fw_data, fw_size; 2565 const __le32 *fw_data;
2566 u32 fw_size;
2566 u32 __iomem *load_addr; 2567 u32 __iomem *load_addr;
2567 char buf[48]; 2568 char buf[48];
2568 int err = -ENODEV; 2569 int err = -ENODEV;
@@ -2582,7 +2583,7 @@ fore200e_load_and_start_fw(struct fore200e* fore200e)
2582 return err; 2583 return err;
2583 } 2584 }
2584 2585
2585 fw_data = (u32 *) firmware->data; 2586 fw_data = (__le32 *) firmware->data;
2586 fw_size = firmware->size / sizeof(u32); 2587 fw_size = firmware->size / sizeof(u32);
2587 fw_header = (struct fw_header *) firmware->data; 2588 fw_header = (struct fw_header *) firmware->data;
2588 load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset); 2589 load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset);
@@ -3199,6 +3200,14 @@ static const struct fore200e_bus fore200e_bus[] = {
3199 {} 3200 {}
3200}; 3201};
3201 3202
3202#ifdef MODULE_LICENSE
3203MODULE_LICENSE("GPL"); 3203MODULE_LICENSE("GPL");
3204#ifdef CONFIG_PCI
3205#ifdef __LITTLE_ENDIAN__
3206MODULE_FIRMWARE("pca200e.bin");
3207#else
3208MODULE_FIRMWARE("pca200e_ecd.bin2");
3209#endif
3210#endif /* CONFIG_PCI */
3211#ifdef CONFIG_SBUS
3212MODULE_FIRMWARE("sba200e_ecd.bin2");
3204#endif 3213#endif
diff --git a/drivers/auxdisplay/cfag12864b.c b/drivers/auxdisplay/cfag12864b.c
index 683509f013ab..eacb175f6bd3 100644
--- a/drivers/auxdisplay/cfag12864b.c
+++ b/drivers/auxdisplay/cfag12864b.c
@@ -336,16 +336,9 @@ static int __init cfag12864b_init(void)
336 "ks0108 is not initialized\n"); 336 "ks0108 is not initialized\n");
337 goto none; 337 goto none;
338 } 338 }
339 BUILD_BUG_ON(PAGE_SIZE < CFAG12864B_SIZE);
339 340
340 if (PAGE_SIZE < CFAG12864B_SIZE) { 341 cfag12864b_buffer = (unsigned char *) get_zeroed_page(GFP_KERNEL);
341 printk(KERN_ERR CFAG12864B_NAME ": ERROR: "
342 "page size (%i) < cfag12864b size (%i)\n",
343 (unsigned int)PAGE_SIZE, CFAG12864B_SIZE);
344 ret = -ENOMEM;
345 goto none;
346 }
347
348 cfag12864b_buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
349 if (cfag12864b_buffer == NULL) { 342 if (cfag12864b_buffer == NULL) {
350 printk(KERN_ERR CFAG12864B_NAME ": ERROR: " 343 printk(KERN_ERR CFAG12864B_NAME ": ERROR: "
351 "can't get a free page\n"); 344 "can't get a free page\n");
@@ -367,8 +360,6 @@ static int __init cfag12864b_init(void)
367 if (cfag12864b_workqueue == NULL) 360 if (cfag12864b_workqueue == NULL)
368 goto cachealloced; 361 goto cachealloced;
369 362
370 memset(cfag12864b_buffer, 0, CFAG12864B_SIZE);
371
372 cfag12864b_clear(); 363 cfag12864b_clear();
373 cfag12864b_on(); 364 cfag12864b_on();
374 365
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index d47482fa1d21..6318f6b57360 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -27,8 +27,9 @@ config PREVENT_FIRMWARE_BUILD
27 If unsure say Y here. 27 If unsure say Y here.
28 28
29config FW_LOADER 29config FW_LOADER
30 tristate "Userspace firmware loading support" 30 tristate "Userspace firmware loading support" if EMBEDDED
31 depends on HOTPLUG 31 depends on HOTPLUG
32 default y
32 ---help--- 33 ---help---
33 This option is provided for the case where no in-kernel-tree modules 34 This option is provided for the case where no in-kernel-tree modules
34 require userspace firmware loading support, but a module built outside 35 require userspace firmware loading support, but a module built outside
diff --git a/drivers/base/base.h b/drivers/base/base.h
index 2c9ae43e2219..31dc0cd84afa 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -36,6 +36,33 @@ struct driver_private {
36}; 36};
37#define to_driver(obj) container_of(obj, struct driver_private, kobj) 37#define to_driver(obj) container_of(obj, struct driver_private, kobj)
38 38
39
40/**
41 * struct class_private - structure to hold the private to the driver core portions of the class structure.
42 *
43 * @class_subsys - the struct kset that defines this class. This is the main kobject
44 * @class_devices - list of devices associated with this class
45 * @class_interfaces - list of class_interfaces associated with this class
46 * @class_dirs - "glue" directory for virtual devices associated with this class
47 * @class_mutex - mutex to protect the children, devices, and interfaces lists.
48 * @class - pointer back to the struct class that this structure is associated
49 * with.
50 *
51 * This structure is the one that is the actual kobject allowing struct
52 * class to be statically allocated safely. Nothing outside of the driver
53 * core should ever touch these fields.
54 */
55struct class_private {
56 struct kset class_subsys;
57 struct list_head class_devices;
58 struct list_head class_interfaces;
59 struct kset class_dirs;
60 struct mutex class_mutex;
61 struct class *class;
62};
63#define to_class(obj) \
64 container_of(obj, struct class_private, class_subsys.kobj)
65
39/* initialisation functions */ 66/* initialisation functions */
40extern int devices_init(void); 67extern int devices_init(void);
41extern int buses_init(void); 68extern int buses_init(void);
diff --git a/drivers/base/class.c b/drivers/base/class.c
index e085af0ff94f..839d27cecb36 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -18,20 +18,20 @@
18#include <linux/err.h> 18#include <linux/err.h>
19#include <linux/slab.h> 19#include <linux/slab.h>
20#include <linux/genhd.h> 20#include <linux/genhd.h>
21#include <linux/mutex.h>
21#include "base.h" 22#include "base.h"
22 23
23#define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr) 24#define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr)
24#define to_class(obj) container_of(obj, struct class, subsys.kobj)
25 25
26static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr, 26static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr,
27 char *buf) 27 char *buf)
28{ 28{
29 struct class_attribute *class_attr = to_class_attr(attr); 29 struct class_attribute *class_attr = to_class_attr(attr);
30 struct class *dc = to_class(kobj); 30 struct class_private *cp = to_class(kobj);
31 ssize_t ret = -EIO; 31 ssize_t ret = -EIO;
32 32
33 if (class_attr->show) 33 if (class_attr->show)
34 ret = class_attr->show(dc, buf); 34 ret = class_attr->show(cp->class, buf);
35 return ret; 35 return ret;
36} 36}
37 37
@@ -39,17 +39,18 @@ static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr,
39 const char *buf, size_t count) 39 const char *buf, size_t count)
40{ 40{
41 struct class_attribute *class_attr = to_class_attr(attr); 41 struct class_attribute *class_attr = to_class_attr(attr);
42 struct class *dc = to_class(kobj); 42 struct class_private *cp = to_class(kobj);
43 ssize_t ret = -EIO; 43 ssize_t ret = -EIO;
44 44
45 if (class_attr->store) 45 if (class_attr->store)
46 ret = class_attr->store(dc, buf, count); 46 ret = class_attr->store(cp->class, buf, count);
47 return ret; 47 return ret;
48} 48}
49 49
50static void class_release(struct kobject *kobj) 50static void class_release(struct kobject *kobj)
51{ 51{
52 struct class *class = to_class(kobj); 52 struct class_private *cp = to_class(kobj);
53 struct class *class = cp->class;
53 54
54 pr_debug("class '%s': release.\n", class->name); 55 pr_debug("class '%s': release.\n", class->name);
55 56
@@ -70,7 +71,7 @@ static struct kobj_type class_ktype = {
70 .release = class_release, 71 .release = class_release,
71}; 72};
72 73
73/* Hotplug events for classes go to the class_obj subsys */ 74/* Hotplug events for classes go to the class class_subsys */
74static struct kset *class_kset; 75static struct kset *class_kset;
75 76
76 77
@@ -78,7 +79,8 @@ int class_create_file(struct class *cls, const struct class_attribute *attr)
78{ 79{
79 int error; 80 int error;
80 if (cls) 81 if (cls)
81 error = sysfs_create_file(&cls->subsys.kobj, &attr->attr); 82 error = sysfs_create_file(&cls->p->class_subsys.kobj,
83 &attr->attr);
82 else 84 else
83 error = -EINVAL; 85 error = -EINVAL;
84 return error; 86 return error;
@@ -87,21 +89,20 @@ int class_create_file(struct class *cls, const struct class_attribute *attr)
87void class_remove_file(struct class *cls, const struct class_attribute *attr) 89void class_remove_file(struct class *cls, const struct class_attribute *attr)
88{ 90{
89 if (cls) 91 if (cls)
90 sysfs_remove_file(&cls->subsys.kobj, &attr->attr); 92 sysfs_remove_file(&cls->p->class_subsys.kobj, &attr->attr);
91} 93}
92 94
93static struct class *class_get(struct class *cls) 95static struct class *class_get(struct class *cls)
94{ 96{
95 if (cls) 97 if (cls)
96 return container_of(kset_get(&cls->subsys), 98 kset_get(&cls->p->class_subsys);
97 struct class, subsys); 99 return cls;
98 return NULL;
99} 100}
100 101
101static void class_put(struct class *cls) 102static void class_put(struct class *cls)
102{ 103{
103 if (cls) 104 if (cls)
104 kset_put(&cls->subsys); 105 kset_put(&cls->p->class_subsys);
105} 106}
106 107
107static int add_class_attrs(struct class *cls) 108static int add_class_attrs(struct class *cls)
@@ -134,42 +135,57 @@ static void remove_class_attrs(struct class *cls)
134 } 135 }
135} 136}
136 137
137int class_register(struct class *cls) 138int __class_register(struct class *cls, struct lock_class_key *key)
138{ 139{
140 struct class_private *cp;
139 int error; 141 int error;
140 142
141 pr_debug("device class '%s': registering\n", cls->name); 143 pr_debug("device class '%s': registering\n", cls->name);
142 144
143 INIT_LIST_HEAD(&cls->devices); 145 cp = kzalloc(sizeof(*cp), GFP_KERNEL);
144 INIT_LIST_HEAD(&cls->interfaces); 146 if (!cp)
145 kset_init(&cls->class_dirs); 147 return -ENOMEM;
146 init_MUTEX(&cls->sem); 148 INIT_LIST_HEAD(&cp->class_devices);
147 error = kobject_set_name(&cls->subsys.kobj, "%s", cls->name); 149 INIT_LIST_HEAD(&cp->class_interfaces);
148 if (error) 150 kset_init(&cp->class_dirs);
151 __mutex_init(&cp->class_mutex, "struct class mutex", key);
152 error = kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name);
153 if (error) {
154 kfree(cp);
149 return error; 155 return error;
156 }
157
158 /* set the default /sys/dev directory for devices of this class */
159 if (!cls->dev_kobj)
160 cls->dev_kobj = sysfs_dev_char_kobj;
150 161
151#if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK) 162#if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK)
152 /* let the block class directory show up in the root of sysfs */ 163 /* let the block class directory show up in the root of sysfs */
153 if (cls != &block_class) 164 if (cls != &block_class)
154 cls->subsys.kobj.kset = class_kset; 165 cp->class_subsys.kobj.kset = class_kset;
155#else 166#else
156 cls->subsys.kobj.kset = class_kset; 167 cp->class_subsys.kobj.kset = class_kset;
157#endif 168#endif
158 cls->subsys.kobj.ktype = &class_ktype; 169 cp->class_subsys.kobj.ktype = &class_ktype;
170 cp->class = cls;
171 cls->p = cp;
159 172
160 error = kset_register(&cls->subsys); 173 error = kset_register(&cp->class_subsys);
161 if (!error) { 174 if (error) {
162 error = add_class_attrs(class_get(cls)); 175 kfree(cp);
163 class_put(cls); 176 return error;
164 } 177 }
178 error = add_class_attrs(class_get(cls));
179 class_put(cls);
165 return error; 180 return error;
166} 181}
182EXPORT_SYMBOL_GPL(__class_register);
167 183
168void class_unregister(struct class *cls) 184void class_unregister(struct class *cls)
169{ 185{
170 pr_debug("device class '%s': unregistering\n", cls->name); 186 pr_debug("device class '%s': unregistering\n", cls->name);
171 remove_class_attrs(cls); 187 remove_class_attrs(cls);
172 kset_unregister(&cls->subsys); 188 kset_unregister(&cls->p->class_subsys);
173} 189}
174 190
175static void class_create_release(struct class *cls) 191static void class_create_release(struct class *cls)
@@ -189,7 +205,8 @@ static void class_create_release(struct class *cls)
189 * Note, the pointer created here is to be destroyed when finished by 205 * Note, the pointer created here is to be destroyed when finished by
190 * making a call to class_destroy(). 206 * making a call to class_destroy().
191 */ 207 */
192struct class *class_create(struct module *owner, const char *name) 208struct class *__class_create(struct module *owner, const char *name,
209 struct lock_class_key *key)
193{ 210{
194 struct class *cls; 211 struct class *cls;
195 int retval; 212 int retval;
@@ -204,7 +221,7 @@ struct class *class_create(struct module *owner, const char *name)
204 cls->owner = owner; 221 cls->owner = owner;
205 cls->class_release = class_create_release; 222 cls->class_release = class_create_release;
206 223
207 retval = class_register(cls); 224 retval = __class_register(cls, key);
208 if (retval) 225 if (retval)
209 goto error; 226 goto error;
210 227
@@ -214,6 +231,7 @@ error:
214 kfree(cls); 231 kfree(cls);
215 return ERR_PTR(retval); 232 return ERR_PTR(retval);
216} 233}
234EXPORT_SYMBOL_GPL(__class_create);
217 235
218/** 236/**
219 * class_destroy - destroys a struct class structure 237 * class_destroy - destroys a struct class structure
@@ -252,39 +270,44 @@ char *make_class_name(const char *name, struct kobject *kobj)
252/** 270/**
253 * class_for_each_device - device iterator 271 * class_for_each_device - device iterator
254 * @class: the class we're iterating 272 * @class: the class we're iterating
273 * @start: the device to start with in the list, if any.
255 * @data: data for the callback 274 * @data: data for the callback
256 * @fn: function to be called for each device 275 * @fn: function to be called for each device
257 * 276 *
258 * Iterate over @class's list of devices, and call @fn for each, 277 * Iterate over @class's list of devices, and call @fn for each,
259 * passing it @data. 278 * passing it @data. If @start is set, the list iteration will start
279 * there, otherwise if it is NULL, the iteration starts at the
280 * beginning of the list.
260 * 281 *
261 * We check the return of @fn each time. If it returns anything 282 * We check the return of @fn each time. If it returns anything
262 * other than 0, we break out and return that value. 283 * other than 0, we break out and return that value.
263 * 284 *
264 * Note, we hold class->sem in this function, so it can not be 285 * Note, we hold class->class_mutex in this function, so it can not be
265 * re-acquired in @fn, otherwise it will self-deadlocking. For 286 * re-acquired in @fn, otherwise it will self-deadlocking. For
266 * example, calls to add or remove class members would be verboten. 287 * example, calls to add or remove class members would be verboten.
267 */ 288 */
268int class_for_each_device(struct class *class, void *data, 289int class_for_each_device(struct class *class, struct device *start,
269 int (*fn)(struct device *, void *)) 290 void *data, int (*fn)(struct device *, void *))
270{ 291{
271 struct device *dev; 292 struct device *dev;
272 int error = 0; 293 int error = 0;
273 294
274 if (!class) 295 if (!class)
275 return -EINVAL; 296 return -EINVAL;
276 down(&class->sem); 297 mutex_lock(&class->p->class_mutex);
277 list_for_each_entry(dev, &class->devices, node) { 298 list_for_each_entry(dev, &class->p->class_devices, node) {
299 if (start) {
300 if (start == dev)
301 start = NULL;
302 continue;
303 }
278 dev = get_device(dev); 304 dev = get_device(dev);
279 if (dev) { 305 error = fn(dev, data);
280 error = fn(dev, data); 306 put_device(dev);
281 put_device(dev);
282 } else
283 error = -ENODEV;
284 if (error) 307 if (error)
285 break; 308 break;
286 } 309 }
287 up(&class->sem); 310 mutex_unlock(&class->p->class_mutex);
288 311
289 return error; 312 return error;
290} 313}
@@ -293,6 +316,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device);
293/** 316/**
294 * class_find_device - device iterator for locating a particular device 317 * class_find_device - device iterator for locating a particular device
295 * @class: the class we're iterating 318 * @class: the class we're iterating
319 * @start: Device to begin with
296 * @data: data for the match function 320 * @data: data for the match function
297 * @match: function to check device 321 * @match: function to check device
298 * 322 *
@@ -306,12 +330,13 @@ EXPORT_SYMBOL_GPL(class_for_each_device);
306 * 330 *
307 * Note, you will need to drop the reference with put_device() after use. 331 * Note, you will need to drop the reference with put_device() after use.
308 * 332 *
309 * We hold class->sem in this function, so it can not be 333 * We hold class->class_mutex in this function, so it can not be
310 * re-acquired in @match, otherwise it will self-deadlocking. For 334 * re-acquired in @match, otherwise it will self-deadlocking. For
311 * example, calls to add or remove class members would be verboten. 335 * example, calls to add or remove class members would be verboten.
312 */ 336 */
313struct device *class_find_device(struct class *class, void *data, 337struct device *class_find_device(struct class *class, struct device *start,
314 int (*match)(struct device *, void *)) 338 void *data,
339 int (*match)(struct device *, void *))
315{ 340{
316 struct device *dev; 341 struct device *dev;
317 int found = 0; 342 int found = 0;
@@ -319,19 +344,21 @@ struct device *class_find_device(struct class *class, void *data,
319 if (!class) 344 if (!class)
320 return NULL; 345 return NULL;
321 346
322 down(&class->sem); 347 mutex_lock(&class->p->class_mutex);
323 list_for_each_entry(dev, &class->devices, node) { 348 list_for_each_entry(dev, &class->p->class_devices, node) {
349 if (start) {
350 if (start == dev)
351 start = NULL;
352 continue;
353 }
324 dev = get_device(dev); 354 dev = get_device(dev);
325 if (dev) { 355 if (match(dev, data)) {
326 if (match(dev, data)) { 356 found = 1;
327 found = 1;
328 break;
329 } else
330 put_device(dev);
331 } else
332 break; 357 break;
358 } else
359 put_device(dev);
333 } 360 }
334 up(&class->sem); 361 mutex_unlock(&class->p->class_mutex);
335 362
336 return found ? dev : NULL; 363 return found ? dev : NULL;
337} 364}
@@ -349,13 +376,13 @@ int class_interface_register(struct class_interface *class_intf)
349 if (!parent) 376 if (!parent)
350 return -EINVAL; 377 return -EINVAL;
351 378
352 down(&parent->sem); 379 mutex_lock(&parent->p->class_mutex);
353 list_add_tail(&class_intf->node, &parent->interfaces); 380 list_add_tail(&class_intf->node, &parent->p->class_interfaces);
354 if (class_intf->add_dev) { 381 if (class_intf->add_dev) {
355 list_for_each_entry(dev, &parent->devices, node) 382 list_for_each_entry(dev, &parent->p->class_devices, node)
356 class_intf->add_dev(dev, class_intf); 383 class_intf->add_dev(dev, class_intf);
357 } 384 }
358 up(&parent->sem); 385 mutex_unlock(&parent->p->class_mutex);
359 386
360 return 0; 387 return 0;
361} 388}
@@ -368,13 +395,13 @@ void class_interface_unregister(struct class_interface *class_intf)
368 if (!parent) 395 if (!parent)
369 return; 396 return;
370 397
371 down(&parent->sem); 398 mutex_lock(&parent->p->class_mutex);
372 list_del_init(&class_intf->node); 399 list_del_init(&class_intf->node);
373 if (class_intf->remove_dev) { 400 if (class_intf->remove_dev) {
374 list_for_each_entry(dev, &parent->devices, node) 401 list_for_each_entry(dev, &parent->p->class_devices, node)
375 class_intf->remove_dev(dev, class_intf); 402 class_intf->remove_dev(dev, class_intf);
376 } 403 }
377 up(&parent->sem); 404 mutex_unlock(&parent->p->class_mutex);
378 405
379 class_put(parent); 406 class_put(parent);
380} 407}
@@ -389,9 +416,7 @@ int __init classes_init(void)
389 416
390EXPORT_SYMBOL_GPL(class_create_file); 417EXPORT_SYMBOL_GPL(class_create_file);
391EXPORT_SYMBOL_GPL(class_remove_file); 418EXPORT_SYMBOL_GPL(class_remove_file);
392EXPORT_SYMBOL_GPL(class_register);
393EXPORT_SYMBOL_GPL(class_unregister); 419EXPORT_SYMBOL_GPL(class_unregister);
394EXPORT_SYMBOL_GPL(class_create);
395EXPORT_SYMBOL_GPL(class_destroy); 420EXPORT_SYMBOL_GPL(class_destroy);
396 421
397EXPORT_SYMBOL_GPL(class_interface_register); 422EXPORT_SYMBOL_GPL(class_interface_register);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index ee0a51a3a41d..7d5c63c81a59 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -21,12 +21,16 @@
21#include <linux/genhd.h> 21#include <linux/genhd.h>
22#include <linux/kallsyms.h> 22#include <linux/kallsyms.h>
23#include <linux/semaphore.h> 23#include <linux/semaphore.h>
24#include <linux/mutex.h>
24 25
25#include "base.h" 26#include "base.h"
26#include "power/power.h" 27#include "power/power.h"
27 28
28int (*platform_notify)(struct device *dev) = NULL; 29int (*platform_notify)(struct device *dev) = NULL;
29int (*platform_notify_remove)(struct device *dev) = NULL; 30int (*platform_notify_remove)(struct device *dev) = NULL;
31static struct kobject *dev_kobj;
32struct kobject *sysfs_dev_char_kobj;
33struct kobject *sysfs_dev_block_kobj;
30 34
31#ifdef CONFIG_BLOCK 35#ifdef CONFIG_BLOCK
32static inline int device_is_not_partition(struct device *dev) 36static inline int device_is_not_partition(struct device *dev)
@@ -548,7 +552,7 @@ static struct kobject *get_device_parent(struct device *dev,
548{ 552{
549 /* class devices without a parent live in /sys/class/<classname>/ */ 553 /* class devices without a parent live in /sys/class/<classname>/ */
550 if (dev->class && (!parent || parent->class != dev->class)) 554 if (dev->class && (!parent || parent->class != dev->class))
551 return &dev->class->subsys.kobj; 555 return &dev->class->p->class_subsys.kobj;
552 /* all other devices keep their parent */ 556 /* all other devices keep their parent */
553 else if (parent) 557 else if (parent)
554 return &parent->kobj; 558 return &parent->kobj;
@@ -594,13 +598,13 @@ static struct kobject *get_device_parent(struct device *dev,
594 parent_kobj = &parent->kobj; 598 parent_kobj = &parent->kobj;
595 599
596 /* find our class-directory at the parent and reference it */ 600 /* find our class-directory at the parent and reference it */
597 spin_lock(&dev->class->class_dirs.list_lock); 601 spin_lock(&dev->class->p->class_dirs.list_lock);
598 list_for_each_entry(k, &dev->class->class_dirs.list, entry) 602 list_for_each_entry(k, &dev->class->p->class_dirs.list, entry)
599 if (k->parent == parent_kobj) { 603 if (k->parent == parent_kobj) {
600 kobj = kobject_get(k); 604 kobj = kobject_get(k);
601 break; 605 break;
602 } 606 }
603 spin_unlock(&dev->class->class_dirs.list_lock); 607 spin_unlock(&dev->class->p->class_dirs.list_lock);
604 if (kobj) 608 if (kobj)
605 return kobj; 609 return kobj;
606 610
@@ -608,7 +612,7 @@ static struct kobject *get_device_parent(struct device *dev,
608 k = kobject_create(); 612 k = kobject_create();
609 if (!k) 613 if (!k)
610 return NULL; 614 return NULL;
611 k->kset = &dev->class->class_dirs; 615 k->kset = &dev->class->p->class_dirs;
612 retval = kobject_add(k, parent_kobj, "%s", dev->class->name); 616 retval = kobject_add(k, parent_kobj, "%s", dev->class->name);
613 if (retval < 0) { 617 if (retval < 0) {
614 kobject_put(k); 618 kobject_put(k);
@@ -627,7 +631,7 @@ static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
627{ 631{
628 /* see if we live in a "glue" directory */ 632 /* see if we live in a "glue" directory */
629 if (!glue_dir || !dev->class || 633 if (!glue_dir || !dev->class ||
630 glue_dir->kset != &dev->class->class_dirs) 634 glue_dir->kset != &dev->class->p->class_dirs)
631 return; 635 return;
632 636
633 kobject_put(glue_dir); 637 kobject_put(glue_dir);
@@ -654,17 +658,18 @@ static int device_add_class_symlinks(struct device *dev)
654 if (!dev->class) 658 if (!dev->class)
655 return 0; 659 return 0;
656 660
657 error = sysfs_create_link(&dev->kobj, &dev->class->subsys.kobj, 661 error = sysfs_create_link(&dev->kobj,
662 &dev->class->p->class_subsys.kobj,
658 "subsystem"); 663 "subsystem");
659 if (error) 664 if (error)
660 goto out; 665 goto out;
661 666
662#ifdef CONFIG_SYSFS_DEPRECATED 667#ifdef CONFIG_SYSFS_DEPRECATED
663 /* stacked class devices need a symlink in the class directory */ 668 /* stacked class devices need a symlink in the class directory */
664 if (dev->kobj.parent != &dev->class->subsys.kobj && 669 if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
665 device_is_not_partition(dev)) { 670 device_is_not_partition(dev)) {
666 error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, 671 error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
667 dev->bus_id); 672 &dev->kobj, dev->bus_id);
668 if (error) 673 if (error)
669 goto out_subsys; 674 goto out_subsys;
670 } 675 }
@@ -701,13 +706,14 @@ out_device:
701 if (dev->parent && device_is_not_partition(dev)) 706 if (dev->parent && device_is_not_partition(dev))
702 sysfs_remove_link(&dev->kobj, "device"); 707 sysfs_remove_link(&dev->kobj, "device");
703out_busid: 708out_busid:
704 if (dev->kobj.parent != &dev->class->subsys.kobj && 709 if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
705 device_is_not_partition(dev)) 710 device_is_not_partition(dev))
706 sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); 711 sysfs_remove_link(&dev->class->p->class_subsys.kobj,
712 dev->bus_id);
707#else 713#else
708 /* link in the class directory pointing to the device */ 714 /* link in the class directory pointing to the device */
709 error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, 715 error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
710 dev->bus_id); 716 &dev->kobj, dev->bus_id);
711 if (error) 717 if (error)
712 goto out_subsys; 718 goto out_subsys;
713 719
@@ -720,7 +726,7 @@ out_busid:
720 return 0; 726 return 0;
721 727
722out_busid: 728out_busid:
723 sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); 729 sysfs_remove_link(&dev->class->p->class_subsys.kobj, dev->bus_id);
724#endif 730#endif
725 731
726out_subsys: 732out_subsys:
@@ -746,14 +752,15 @@ static void device_remove_class_symlinks(struct device *dev)
746 sysfs_remove_link(&dev->kobj, "device"); 752 sysfs_remove_link(&dev->kobj, "device");
747 } 753 }
748 754
749 if (dev->kobj.parent != &dev->class->subsys.kobj && 755 if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
750 device_is_not_partition(dev)) 756 device_is_not_partition(dev))
751 sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); 757 sysfs_remove_link(&dev->class->p->class_subsys.kobj,
758 dev->bus_id);
752#else 759#else
753 if (dev->parent && device_is_not_partition(dev)) 760 if (dev->parent && device_is_not_partition(dev))
754 sysfs_remove_link(&dev->kobj, "device"); 761 sysfs_remove_link(&dev->kobj, "device");
755 762
756 sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); 763 sysfs_remove_link(&dev->class->p->class_subsys.kobj, dev->bus_id);
757#endif 764#endif
758 765
759 sysfs_remove_link(&dev->kobj, "subsystem"); 766 sysfs_remove_link(&dev->kobj, "subsystem");
@@ -776,6 +783,54 @@ int dev_set_name(struct device *dev, const char *fmt, ...)
776EXPORT_SYMBOL_GPL(dev_set_name); 783EXPORT_SYMBOL_GPL(dev_set_name);
777 784
778/** 785/**
786 * device_to_dev_kobj - select a /sys/dev/ directory for the device
787 * @dev: device
788 *
789 * By default we select char/ for new entries. Setting class->dev_obj
790 * to NULL prevents an entry from being created. class->dev_kobj must
791 * be set (or cleared) before any devices are registered to the class
792 * otherwise device_create_sys_dev_entry() and
793 * device_remove_sys_dev_entry() will disagree about the the presence
794 * of the link.
795 */
796static struct kobject *device_to_dev_kobj(struct device *dev)
797{
798 struct kobject *kobj;
799
800 if (dev->class)
801 kobj = dev->class->dev_kobj;
802 else
803 kobj = sysfs_dev_char_kobj;
804
805 return kobj;
806}
807
808static int device_create_sys_dev_entry(struct device *dev)
809{
810 struct kobject *kobj = device_to_dev_kobj(dev);
811 int error = 0;
812 char devt_str[15];
813
814 if (kobj) {
815 format_dev_t(devt_str, dev->devt);
816 error = sysfs_create_link(kobj, &dev->kobj, devt_str);
817 }
818
819 return error;
820}
821
822static void device_remove_sys_dev_entry(struct device *dev)
823{
824 struct kobject *kobj = device_to_dev_kobj(dev);
825 char devt_str[15];
826
827 if (kobj) {
828 format_dev_t(devt_str, dev->devt);
829 sysfs_remove_link(kobj, devt_str);
830 }
831}
832
833/**
779 * device_add - add device to device hierarchy. 834 * device_add - add device to device hierarchy.
780 * @dev: device. 835 * @dev: device.
781 * 836 *
@@ -829,6 +884,10 @@ int device_add(struct device *dev)
829 error = device_create_file(dev, &devt_attr); 884 error = device_create_file(dev, &devt_attr);
830 if (error) 885 if (error)
831 goto ueventattrError; 886 goto ueventattrError;
887
888 error = device_create_sys_dev_entry(dev);
889 if (error)
890 goto devtattrError;
832 } 891 }
833 892
834 error = device_add_class_symlinks(dev); 893 error = device_add_class_symlinks(dev);
@@ -849,15 +908,16 @@ int device_add(struct device *dev)
849 klist_add_tail(&dev->knode_parent, &parent->klist_children); 908 klist_add_tail(&dev->knode_parent, &parent->klist_children);
850 909
851 if (dev->class) { 910 if (dev->class) {
852 down(&dev->class->sem); 911 mutex_lock(&dev->class->p->class_mutex);
853 /* tie the class to the device */ 912 /* tie the class to the device */
854 list_add_tail(&dev->node, &dev->class->devices); 913 list_add_tail(&dev->node, &dev->class->p->class_devices);
855 914
856 /* notify any interfaces that the device is here */ 915 /* notify any interfaces that the device is here */
857 list_for_each_entry(class_intf, &dev->class->interfaces, node) 916 list_for_each_entry(class_intf,
917 &dev->class->p->class_interfaces, node)
858 if (class_intf->add_dev) 918 if (class_intf->add_dev)
859 class_intf->add_dev(dev, class_intf); 919 class_intf->add_dev(dev, class_intf);
860 up(&dev->class->sem); 920 mutex_unlock(&dev->class->p->class_mutex);
861 } 921 }
862 Done: 922 Done:
863 put_device(dev); 923 put_device(dev);
@@ -873,6 +933,9 @@ int device_add(struct device *dev)
873 device_remove_class_symlinks(dev); 933 device_remove_class_symlinks(dev);
874 SymlinkError: 934 SymlinkError:
875 if (MAJOR(dev->devt)) 935 if (MAJOR(dev->devt))
936 device_remove_sys_dev_entry(dev);
937 devtattrError:
938 if (MAJOR(dev->devt))
876 device_remove_file(dev, &devt_attr); 939 device_remove_file(dev, &devt_attr);
877 ueventattrError: 940 ueventattrError:
878 device_remove_file(dev, &uevent_attr); 941 device_remove_file(dev, &uevent_attr);
@@ -948,19 +1011,22 @@ void device_del(struct device *dev)
948 device_pm_remove(dev); 1011 device_pm_remove(dev);
949 if (parent) 1012 if (parent)
950 klist_del(&dev->knode_parent); 1013 klist_del(&dev->knode_parent);
951 if (MAJOR(dev->devt)) 1014 if (MAJOR(dev->devt)) {
1015 device_remove_sys_dev_entry(dev);
952 device_remove_file(dev, &devt_attr); 1016 device_remove_file(dev, &devt_attr);
1017 }
953 if (dev->class) { 1018 if (dev->class) {
954 device_remove_class_symlinks(dev); 1019 device_remove_class_symlinks(dev);
955 1020
956 down(&dev->class->sem); 1021 mutex_lock(&dev->class->p->class_mutex);
957 /* notify any interfaces that the device is now gone */ 1022 /* notify any interfaces that the device is now gone */
958 list_for_each_entry(class_intf, &dev->class->interfaces, node) 1023 list_for_each_entry(class_intf,
1024 &dev->class->p->class_interfaces, node)
959 if (class_intf->remove_dev) 1025 if (class_intf->remove_dev)
960 class_intf->remove_dev(dev, class_intf); 1026 class_intf->remove_dev(dev, class_intf);
961 /* remove the device from the class list */ 1027 /* remove the device from the class list */
962 list_del_init(&dev->node); 1028 list_del_init(&dev->node);
963 up(&dev->class->sem); 1029 mutex_unlock(&dev->class->p->class_mutex);
964 } 1030 }
965 device_remove_file(dev, &uevent_attr); 1031 device_remove_file(dev, &uevent_attr);
966 device_remove_attrs(dev); 1032 device_remove_attrs(dev);
@@ -1074,7 +1140,25 @@ int __init devices_init(void)
1074 devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); 1140 devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
1075 if (!devices_kset) 1141 if (!devices_kset)
1076 return -ENOMEM; 1142 return -ENOMEM;
1143 dev_kobj = kobject_create_and_add("dev", NULL);
1144 if (!dev_kobj)
1145 goto dev_kobj_err;
1146 sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);
1147 if (!sysfs_dev_block_kobj)
1148 goto block_kobj_err;
1149 sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);
1150 if (!sysfs_dev_char_kobj)
1151 goto char_kobj_err;
1152
1077 return 0; 1153 return 0;
1154
1155 char_kobj_err:
1156 kobject_put(sysfs_dev_block_kobj);
1157 block_kobj_err:
1158 kobject_put(dev_kobj);
1159 dev_kobj_err:
1160 kset_unregister(devices_kset);
1161 return -ENOMEM;
1078} 1162}
1079 1163
1080EXPORT_SYMBOL_GPL(device_for_each_child); 1164EXPORT_SYMBOL_GPL(device_for_each_child);
@@ -1158,48 +1242,11 @@ error:
1158EXPORT_SYMBOL_GPL(device_create_vargs); 1242EXPORT_SYMBOL_GPL(device_create_vargs);
1159 1243
1160/** 1244/**
1161 * device_create_drvdata - creates a device and registers it with sysfs
1162 * @class: pointer to the struct class that this device should be registered to
1163 * @parent: pointer to the parent struct device of this new device, if any
1164 * @devt: the dev_t for the char device to be added
1165 * @drvdata: the data to be added to the device for callbacks
1166 * @fmt: string for the device's name
1167 *
1168 * This function can be used by char device classes. A struct device
1169 * will be created in sysfs, registered to the specified class.
1170 *
1171 * A "dev" file will be created, showing the dev_t for the device, if
1172 * the dev_t is not 0,0.
1173 * If a pointer to a parent struct device is passed in, the newly created
1174 * struct device will be a child of that device in sysfs.
1175 * The pointer to the struct device will be returned from the call.
1176 * Any further sysfs files that might be required can be created using this
1177 * pointer.
1178 *
1179 * Note: the struct class passed to this function must have previously
1180 * been created with a call to class_create().
1181 */
1182struct device *device_create_drvdata(struct class *class,
1183 struct device *parent,
1184 dev_t devt,
1185 void *drvdata,
1186 const char *fmt, ...)
1187{
1188 va_list vargs;
1189 struct device *dev;
1190
1191 va_start(vargs, fmt);
1192 dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
1193 va_end(vargs);
1194 return dev;
1195}
1196EXPORT_SYMBOL_GPL(device_create_drvdata);
1197
1198/**
1199 * device_create - creates a device and registers it with sysfs 1245 * device_create - creates a device and registers it with sysfs
1200 * @class: pointer to the struct class that this device should be registered to 1246 * @class: pointer to the struct class that this device should be registered to
1201 * @parent: pointer to the parent struct device of this new device, if any 1247 * @parent: pointer to the parent struct device of this new device, if any
1202 * @devt: the dev_t for the char device to be added 1248 * @devt: the dev_t for the char device to be added
1249 * @drvdata: the data to be added to the device for callbacks
1203 * @fmt: string for the device's name 1250 * @fmt: string for the device's name
1204 * 1251 *
1205 * This function can be used by char device classes. A struct device 1252 * This function can be used by char device classes. A struct device
@@ -1217,13 +1264,13 @@ EXPORT_SYMBOL_GPL(device_create_drvdata);
1217 * been created with a call to class_create(). 1264 * been created with a call to class_create().
1218 */ 1265 */
1219struct device *device_create(struct class *class, struct device *parent, 1266struct device *device_create(struct class *class, struct device *parent,
1220 dev_t devt, const char *fmt, ...) 1267 dev_t devt, void *drvdata, const char *fmt, ...)
1221{ 1268{
1222 va_list vargs; 1269 va_list vargs;
1223 struct device *dev; 1270 struct device *dev;
1224 1271
1225 va_start(vargs, fmt); 1272 va_start(vargs, fmt);
1226 dev = device_create_vargs(class, parent, devt, NULL, fmt, vargs); 1273 dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
1227 va_end(vargs); 1274 va_end(vargs);
1228 return dev; 1275 return dev;
1229} 1276}
@@ -1248,7 +1295,7 @@ void device_destroy(struct class *class, dev_t devt)
1248{ 1295{
1249 struct device *dev; 1296 struct device *dev;
1250 1297
1251 dev = class_find_device(class, &devt, __match_devt); 1298 dev = class_find_device(class, NULL, &devt, __match_devt);
1252 if (dev) { 1299 if (dev) {
1253 put_device(dev); 1300 put_device(dev);
1254 device_unregister(dev); 1301 device_unregister(dev);
@@ -1298,8 +1345,9 @@ int device_rename(struct device *dev, char *new_name)
1298 if (old_class_name) { 1345 if (old_class_name) {
1299 new_class_name = make_class_name(dev->class->name, &dev->kobj); 1346 new_class_name = make_class_name(dev->class->name, &dev->kobj);
1300 if (new_class_name) { 1347 if (new_class_name) {
1301 error = sysfs_create_link(&dev->parent->kobj, 1348 error = sysfs_create_link_nowarn(&dev->parent->kobj,
1302 &dev->kobj, new_class_name); 1349 &dev->kobj,
1350 new_class_name);
1303 if (error) 1351 if (error)
1304 goto out; 1352 goto out;
1305 sysfs_remove_link(&dev->parent->kobj, old_class_name); 1353 sysfs_remove_link(&dev->parent->kobj, old_class_name);
@@ -1307,11 +1355,12 @@ int device_rename(struct device *dev, char *new_name)
1307 } 1355 }
1308#else 1356#else
1309 if (dev->class) { 1357 if (dev->class) {
1310 error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, 1358 error = sysfs_create_link_nowarn(&dev->class->p->class_subsys.kobj,
1311 dev->bus_id); 1359 &dev->kobj, dev->bus_id);
1312 if (error) 1360 if (error)
1313 goto out; 1361 goto out;
1314 sysfs_remove_link(&dev->class->subsys.kobj, old_device_name); 1362 sysfs_remove_link(&dev->class->p->class_subsys.kobj,
1363 old_device_name);
1315 } 1364 }
1316#endif 1365#endif
1317 1366
@@ -1447,4 +1496,7 @@ void device_shutdown(void)
1447 dev->driver->shutdown(dev); 1496 dev->driver->shutdown(dev);
1448 } 1497 }
1449 } 1498 }
1499 kobject_put(sysfs_dev_char_kobj);
1500 kobject_put(sysfs_dev_block_kobj);
1501 kobject_put(dev_kobj);
1450} 1502}
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
index e38dfed41d80..64f5d54f7edc 100644
--- a/drivers/base/cpu.c
+++ b/drivers/base/cpu.c
@@ -21,15 +21,16 @@ EXPORT_SYMBOL(cpu_sysdev_class);
21static DEFINE_PER_CPU(struct sys_device *, cpu_sys_devices); 21static DEFINE_PER_CPU(struct sys_device *, cpu_sys_devices);
22 22
23#ifdef CONFIG_HOTPLUG_CPU 23#ifdef CONFIG_HOTPLUG_CPU
24static ssize_t show_online(struct sys_device *dev, char *buf) 24static ssize_t show_online(struct sys_device *dev, struct sysdev_attribute *attr,
25 char *buf)
25{ 26{
26 struct cpu *cpu = container_of(dev, struct cpu, sysdev); 27 struct cpu *cpu = container_of(dev, struct cpu, sysdev);
27 28
28 return sprintf(buf, "%u\n", !!cpu_online(cpu->sysdev.id)); 29 return sprintf(buf, "%u\n", !!cpu_online(cpu->sysdev.id));
29} 30}
30 31
31static ssize_t __ref store_online(struct sys_device *dev, const char *buf, 32static ssize_t __ref store_online(struct sys_device *dev, struct sysdev_attribute *attr,
32 size_t count) 33 const char *buf, size_t count)
33{ 34{
34 struct cpu *cpu = container_of(dev, struct cpu, sysdev); 35 struct cpu *cpu = container_of(dev, struct cpu, sysdev);
35 ssize_t ret; 36 ssize_t ret;
@@ -80,7 +81,8 @@ static inline void register_cpu_control(struct cpu *cpu)
80#ifdef CONFIG_KEXEC 81#ifdef CONFIG_KEXEC
81#include <linux/kexec.h> 82#include <linux/kexec.h>
82 83
83static ssize_t show_crash_notes(struct sys_device *dev, char *buf) 84static ssize_t show_crash_notes(struct sys_device *dev, struct sysdev_attribute *attr,
85 char *buf)
84{ 86{
85 struct cpu *cpu = container_of(dev, struct cpu, sysdev); 87 struct cpu *cpu = container_of(dev, struct cpu, sysdev);
86 ssize_t rc; 88 ssize_t rc;
@@ -119,14 +121,14 @@ static ssize_t print_cpus_##type(struct sysdev_class *class, char *buf) \
119{ \ 121{ \
120 return print_cpus_map(buf, &cpu_##type##_map); \ 122 return print_cpus_map(buf, &cpu_##type##_map); \
121} \ 123} \
122struct sysdev_class_attribute attr_##type##_map = \ 124static struct sysdev_class_attribute attr_##type##_map = \
123 _SYSDEV_CLASS_ATTR(type, 0444, print_cpus_##type, NULL) 125 _SYSDEV_CLASS_ATTR(type, 0444, print_cpus_##type, NULL)
124 126
125print_cpus_func(online); 127print_cpus_func(online);
126print_cpus_func(possible); 128print_cpus_func(possible);
127print_cpus_func(present); 129print_cpus_func(present);
128 130
129struct sysdev_class_attribute *cpu_state_attr[] = { 131static struct sysdev_class_attribute *cpu_state_attr[] = {
130 &attr_online_map, 132 &attr_online_map,
131 &attr_possible_map, 133 &attr_possible_map,
132 &attr_present_map, 134 &attr_present_map,
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
index 937e8258981d..855ed1a9f97b 100644
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -92,7 +92,8 @@ unregister_memory(struct memory_block *memory, struct mem_section *section)
92 * uses. 92 * uses.
93 */ 93 */
94 94
95static ssize_t show_mem_phys_index(struct sys_device *dev, char *buf) 95static ssize_t show_mem_phys_index(struct sys_device *dev,
96 struct sysdev_attribute *attr, char *buf)
96{ 97{
97 struct memory_block *mem = 98 struct memory_block *mem =
98 container_of(dev, struct memory_block, sysdev); 99 container_of(dev, struct memory_block, sysdev);
@@ -100,9 +101,25 @@ static ssize_t show_mem_phys_index(struct sys_device *dev, char *buf)
100} 101}
101 102
102/* 103/*
104 * Show whether the section of memory is likely to be hot-removable
105 */
106static ssize_t show_mem_removable(struct sys_device *dev, char *buf)
107{
108 unsigned long start_pfn;
109 int ret;
110 struct memory_block *mem =
111 container_of(dev, struct memory_block, sysdev);
112
113 start_pfn = section_nr_to_pfn(mem->phys_index);
114 ret = is_mem_section_removable(start_pfn, PAGES_PER_SECTION);
115 return sprintf(buf, "%d\n", ret);
116}
117
118/*
103 * online, offline, going offline, etc. 119 * online, offline, going offline, etc.
104 */ 120 */
105static ssize_t show_mem_state(struct sys_device *dev, char *buf) 121static ssize_t show_mem_state(struct sys_device *dev,
122 struct sysdev_attribute *attr, char *buf)
106{ 123{
107 struct memory_block *mem = 124 struct memory_block *mem =
108 container_of(dev, struct memory_block, sysdev); 125 container_of(dev, struct memory_block, sysdev);
@@ -217,7 +234,8 @@ out:
217} 234}
218 235
219static ssize_t 236static ssize_t
220store_mem_state(struct sys_device *dev, const char *buf, size_t count) 237store_mem_state(struct sys_device *dev,
238 struct sysdev_attribute *attr, const char *buf, size_t count)
221{ 239{
222 struct memory_block *mem; 240 struct memory_block *mem;
223 unsigned int phys_section_nr; 241 unsigned int phys_section_nr;
@@ -248,7 +266,8 @@ out:
248 * s.t. if I offline all of these sections I can then 266 * s.t. if I offline all of these sections I can then
249 * remove the physical device? 267 * remove the physical device?
250 */ 268 */
251static ssize_t show_phys_device(struct sys_device *dev, char *buf) 269static ssize_t show_phys_device(struct sys_device *dev,
270 struct sysdev_attribute *attr, char *buf)
252{ 271{
253 struct memory_block *mem = 272 struct memory_block *mem =
254 container_of(dev, struct memory_block, sysdev); 273 container_of(dev, struct memory_block, sysdev);
@@ -258,6 +277,7 @@ static ssize_t show_phys_device(struct sys_device *dev, char *buf)
258static SYSDEV_ATTR(phys_index, 0444, show_mem_phys_index, NULL); 277static SYSDEV_ATTR(phys_index, 0444, show_mem_phys_index, NULL);
259static SYSDEV_ATTR(state, 0644, show_mem_state, store_mem_state); 278static SYSDEV_ATTR(state, 0644, show_mem_state, store_mem_state);
260static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL); 279static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL);
280static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL);
261 281
262#define mem_create_simple_file(mem, attr_name) \ 282#define mem_create_simple_file(mem, attr_name) \
263 sysdev_create_file(&mem->sysdev, &attr_##attr_name) 283 sysdev_create_file(&mem->sysdev, &attr_##attr_name)
@@ -346,6 +366,8 @@ static int add_memory_block(unsigned long node_id, struct mem_section *section,
346 ret = mem_create_simple_file(mem, state); 366 ret = mem_create_simple_file(mem, state);
347 if (!ret) 367 if (!ret)
348 ret = mem_create_simple_file(mem, phys_device); 368 ret = mem_create_simple_file(mem, phys_device);
369 if (!ret)
370 ret = mem_create_simple_file(mem, removable);
349 371
350 return ret; 372 return ret;
351} 373}
@@ -390,6 +412,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
390 mem_remove_simple_file(mem, phys_index); 412 mem_remove_simple_file(mem, phys_index);
391 mem_remove_simple_file(mem, state); 413 mem_remove_simple_file(mem, state);
392 mem_remove_simple_file(mem, phys_device); 414 mem_remove_simple_file(mem, phys_device);
415 mem_remove_simple_file(mem, removable);
393 unregister_memory(mem, section); 416 unregister_memory(mem, section);
394 417
395 return 0; 418 return 0;
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 0f867a083338..5116b78c6325 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -36,11 +36,13 @@ static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
36 return len; 36 return len;
37} 37}
38 38
39static inline ssize_t node_read_cpumask(struct sys_device *dev, char *buf) 39static inline ssize_t node_read_cpumask(struct sys_device *dev,
40 struct sysdev_attribute *attr, char *buf)
40{ 41{
41 return node_read_cpumap(dev, 0, buf); 42 return node_read_cpumap(dev, 0, buf);
42} 43}
43static inline ssize_t node_read_cpulist(struct sys_device *dev, char *buf) 44static inline ssize_t node_read_cpulist(struct sys_device *dev,
45 struct sysdev_attribute *attr, char *buf)
44{ 46{
45 return node_read_cpumap(dev, 1, buf); 47 return node_read_cpumap(dev, 1, buf);
46} 48}
@@ -49,7 +51,8 @@ static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL);
49static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL); 51static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL);
50 52
51#define K(x) ((x) << (PAGE_SHIFT - 10)) 53#define K(x) ((x) << (PAGE_SHIFT - 10))
52static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) 54static ssize_t node_read_meminfo(struct sys_device * dev,
55 struct sysdev_attribute *attr, char * buf)
53{ 56{
54 int n; 57 int n;
55 int nid = dev->id; 58 int nid = dev->id;
@@ -112,7 +115,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
112#undef K 115#undef K
113static SYSDEV_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); 116static SYSDEV_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL);
114 117
115static ssize_t node_read_numastat(struct sys_device * dev, char * buf) 118static ssize_t node_read_numastat(struct sys_device * dev,
119 struct sysdev_attribute *attr, char * buf)
116{ 120{
117 return sprintf(buf, 121 return sprintf(buf,
118 "numa_hit %lu\n" 122 "numa_hit %lu\n"
@@ -130,7 +134,8 @@ static ssize_t node_read_numastat(struct sys_device * dev, char * buf)
130} 134}
131static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); 135static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL);
132 136
133static ssize_t node_read_distance(struct sys_device * dev, char * buf) 137static ssize_t node_read_distance(struct sys_device * dev,
138 struct sysdev_attribute *attr, char * buf)
134{ 139{
135 int nid = dev->id; 140 int nid = dev->id;
136 int len = 0; 141 int len = 0;
diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c
index 9b1b20b59e0a..2aa6e8fc4def 100644
--- a/drivers/base/power/trace.c
+++ b/drivers/base/power/trace.c
@@ -194,7 +194,7 @@ static int show_dev_hash(unsigned int value)
194 struct device * dev = to_device(entry); 194 struct device * dev = to_device(entry);
195 unsigned int hash = hash_string(DEVSEED, dev->bus_id, DEVHASH); 195 unsigned int hash = hash_string(DEVSEED, dev->bus_id, DEVHASH);
196 if (hash == value) { 196 if (hash == value) {
197 printk(" hash matches device %s\n", dev->bus_id); 197 dev_info(dev, "hash matches\n");
198 match++; 198 match++;
199 } 199 }
200 entry = entry->prev; 200 entry = entry->prev;
diff --git a/drivers/base/sys.c b/drivers/base/sys.c
index 358bb0be3c08..40fc14f03540 100644
--- a/drivers/base/sys.c
+++ b/drivers/base/sys.c
@@ -36,7 +36,7 @@ sysdev_show(struct kobject * kobj, struct attribute * attr, char * buffer)
36 struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr); 36 struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr);
37 37
38 if (sysdev_attr->show) 38 if (sysdev_attr->show)
39 return sysdev_attr->show(sysdev, buffer); 39 return sysdev_attr->show(sysdev, sysdev_attr, buffer);
40 return -EIO; 40 return -EIO;
41} 41}
42 42
@@ -49,7 +49,7 @@ sysdev_store(struct kobject * kobj, struct attribute * attr,
49 struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr); 49 struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr);
50 50
51 if (sysdev_attr->store) 51 if (sysdev_attr->store)
52 return sysdev_attr->store(sysdev, buffer, count); 52 return sysdev_attr->store(sysdev, sysdev_attr, buffer, count);
53 return -EIO; 53 return -EIO;
54} 54}
55 55
@@ -130,8 +130,8 @@ static struct kset *system_kset;
130 130
131int sysdev_class_register(struct sysdev_class * cls) 131int sysdev_class_register(struct sysdev_class * cls)
132{ 132{
133 pr_debug("Registering sysdev class '%s'\n", 133 pr_debug("Registering sysdev class '%s'\n", cls->name);
134 kobject_name(&cls->kset.kobj)); 134
135 INIT_LIST_HEAD(&cls->drivers); 135 INIT_LIST_HEAD(&cls->drivers);
136 memset(&cls->kset.kobj, 0x00, sizeof(struct kobject)); 136 memset(&cls->kset.kobj, 0x00, sizeof(struct kobject));
137 cls->kset.kobj.parent = &system_kset->kobj; 137 cls->kset.kobj.parent = &system_kset->kobj;
@@ -241,7 +241,8 @@ int sysdev_register(struct sys_device * sysdev)
241 if (!cls) 241 if (!cls)
242 return -EINVAL; 242 return -EINVAL;
243 243
244 pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj)); 244 pr_debug("Registering sys device of class '%s'\n",
245 kobject_name(&cls->kset.kobj));
245 246
246 /* initialize the kobject to 0, in case it had previously been used */ 247 /* initialize the kobject to 0, in case it had previously been used */
247 memset(&sysdev->kobj, 0x00, sizeof(struct kobject)); 248 memset(&sysdev->kobj, 0x00, sizeof(struct kobject));
@@ -257,6 +258,9 @@ int sysdev_register(struct sys_device * sysdev)
257 if (!error) { 258 if (!error) {
258 struct sysdev_driver * drv; 259 struct sysdev_driver * drv;
259 260
261 pr_debug("Registering sys device '%s'\n",
262 kobject_name(&sysdev->kobj));
263
260 mutex_lock(&sysdev_drivers_lock); 264 mutex_lock(&sysdev_drivers_lock);
261 /* Generic notification is implicit, because it's that 265 /* Generic notification is implicit, because it's that
262 * code that should have called us. 266 * code that should have called us.
@@ -269,6 +273,7 @@ int sysdev_register(struct sys_device * sysdev)
269 } 273 }
270 mutex_unlock(&sysdev_drivers_lock); 274 mutex_unlock(&sysdev_drivers_lock);
271 } 275 }
276
272 kobject_uevent(&sysdev->kobj, KOBJ_ADD); 277 kobject_uevent(&sysdev->kobj, KOBJ_ADD);
273 return error; 278 return error;
274} 279}
@@ -474,3 +479,52 @@ int __init system_bus_init(void)
474 479
475EXPORT_SYMBOL_GPL(sysdev_register); 480EXPORT_SYMBOL_GPL(sysdev_register);
476EXPORT_SYMBOL_GPL(sysdev_unregister); 481EXPORT_SYMBOL_GPL(sysdev_unregister);
482
483#define to_ext_attr(x) container_of(x, struct sysdev_ext_attribute, attr)
484
485ssize_t sysdev_store_ulong(struct sys_device *sysdev,
486 struct sysdev_attribute *attr,
487 const char *buf, size_t size)
488{
489 struct sysdev_ext_attribute *ea = to_ext_attr(attr);
490 char *end;
491 unsigned long new = simple_strtoul(buf, &end, 0);
492 if (end == buf)
493 return -EINVAL;
494 *(unsigned long *)(ea->var) = new;
495 return end - buf;
496}
497EXPORT_SYMBOL_GPL(sysdev_store_ulong);
498
499ssize_t sysdev_show_ulong(struct sys_device *sysdev,
500 struct sysdev_attribute *attr,
501 char *buf)
502{
503 struct sysdev_ext_attribute *ea = to_ext_attr(attr);
504 return snprintf(buf, PAGE_SIZE, "%lx\n", *(unsigned long *)(ea->var));
505}
506EXPORT_SYMBOL_GPL(sysdev_show_ulong);
507
508ssize_t sysdev_store_int(struct sys_device *sysdev,
509 struct sysdev_attribute *attr,
510 const char *buf, size_t size)
511{
512 struct sysdev_ext_attribute *ea = to_ext_attr(attr);
513 char *end;
514 long new = simple_strtol(buf, &end, 0);
515 if (end == buf || new > INT_MAX || new < INT_MIN)
516 return -EINVAL;
517 *(int *)(ea->var) = new;
518 return end - buf;
519}
520EXPORT_SYMBOL_GPL(sysdev_store_int);
521
522ssize_t sysdev_show_int(struct sys_device *sysdev,
523 struct sysdev_attribute *attr,
524 char *buf)
525{
526 struct sysdev_ext_attribute *ea = to_ext_attr(attr);
527 return snprintf(buf, PAGE_SIZE, "%d\n", *(int *)(ea->var));
528}
529EXPORT_SYMBOL_GPL(sysdev_show_int);
530
diff --git a/drivers/base/topology.c b/drivers/base/topology.c
index 3f6d9b0a6abe..199cd97e32e6 100644
--- a/drivers/base/topology.c
+++ b/drivers/base/topology.c
@@ -34,7 +34,8 @@
34static SYSDEV_ATTR(_name, 0444, show_##_name, NULL) 34static SYSDEV_ATTR(_name, 0444, show_##_name, NULL)
35 35
36#define define_id_show_func(name) \ 36#define define_id_show_func(name) \
37static ssize_t show_##name(struct sys_device *dev, char *buf) \ 37static ssize_t show_##name(struct sys_device *dev, \
38 struct sysdev_attribute *attr, char *buf) \
38{ \ 39{ \
39 unsigned int cpu = dev->id; \ 40 unsigned int cpu = dev->id; \
40 return sprintf(buf, "%d\n", topology_##name(cpu)); \ 41 return sprintf(buf, "%d\n", topology_##name(cpu)); \
@@ -59,14 +60,17 @@ static ssize_t show_cpumap(int type, cpumask_t *mask, char *buf)
59 60
60#ifdef arch_provides_topology_pointers 61#ifdef arch_provides_topology_pointers
61#define define_siblings_show_map(name) \ 62#define define_siblings_show_map(name) \
62static ssize_t show_##name(struct sys_device *dev, char *buf) \ 63static ssize_t show_##name(struct sys_device *dev, \
64 struct sysdev_attribute *attr, char *buf) \
63{ \ 65{ \
64 unsigned int cpu = dev->id; \ 66 unsigned int cpu = dev->id; \
65 return show_cpumap(0, &(topology_##name(cpu)), buf); \ 67 return show_cpumap(0, &(topology_##name(cpu)), buf); \
66} 68}
67 69
68#define define_siblings_show_list(name) \ 70#define define_siblings_show_list(name) \
69static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ 71static ssize_t show_##name##_list(struct sys_device *dev, \
72 struct sysdev_attribute *attr, \
73 char *buf) \
70{ \ 74{ \
71 unsigned int cpu = dev->id; \ 75 unsigned int cpu = dev->id; \
72 return show_cpumap(1, &(topology_##name(cpu)), buf); \ 76 return show_cpumap(1, &(topology_##name(cpu)), buf); \
@@ -74,7 +78,8 @@ static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \
74 78
75#else 79#else
76#define define_siblings_show_map(name) \ 80#define define_siblings_show_map(name) \
77static ssize_t show_##name(struct sys_device *dev, char *buf) \ 81static ssize_t show_##name(struct sys_device *dev, \
82 struct sysdev_attribute *attr, char *buf) \
78{ \ 83{ \
79 unsigned int cpu = dev->id; \ 84 unsigned int cpu = dev->id; \
80 cpumask_t mask = topology_##name(cpu); \ 85 cpumask_t mask = topology_##name(cpu); \
@@ -82,7 +87,9 @@ static ssize_t show_##name(struct sys_device *dev, char *buf) \
82} 87}
83 88
84#define define_siblings_show_list(name) \ 89#define define_siblings_show_list(name) \
85static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ 90static ssize_t show_##name##_list(struct sys_device *dev, \
91 struct sysdev_attribute *attr, \
92 char *buf) \
86{ \ 93{ \
87 unsigned int cpu = dev->id; \ 94 unsigned int cpu = dev->id; \
88 cpumask_t mask = topology_##name(cpu); \ 95 cpumask_t mask = topology_##name(cpu); \
diff --git a/drivers/block/aoe/aoechr.c b/drivers/block/aoe/aoechr.c
index d1de68a31920..c04440cd6a32 100644
--- a/drivers/block/aoe/aoechr.c
+++ b/drivers/block/aoe/aoechr.c
@@ -277,8 +277,9 @@ aoechr_init(void)
277 return PTR_ERR(aoe_class); 277 return PTR_ERR(aoe_class);
278 } 278 }
279 for (i = 0; i < ARRAY_SIZE(chardevs); ++i) 279 for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
280 device_create(aoe_class, NULL, 280 device_create_drvdata(aoe_class, NULL,
281 MKDEV(AOE_MAJOR, chardevs[i].minor), chardevs[i].name); 281 MKDEV(AOE_MAJOR, chardevs[i].minor),
282 NULL, chardevs[i].name);
282 283
283 return 0; 284 return 0;
284} 285}
diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c
index 9d92636350e5..d731ca42f802 100644
--- a/drivers/block/paride/pg.c
+++ b/drivers/block/paride/pg.c
@@ -686,8 +686,9 @@ static int __init pg_init(void)
686 for (unit = 0; unit < PG_UNITS; unit++) { 686 for (unit = 0; unit < PG_UNITS; unit++) {
687 struct pg *dev = &devices[unit]; 687 struct pg *dev = &devices[unit];
688 if (dev->present) 688 if (dev->present)
689 device_create(pg_class, NULL, MKDEV(major, unit), 689 device_create_drvdata(pg_class, NULL,
690 "pg%u", unit); 690 MKDEV(major, unit), NULL,
691 "pg%u", unit);
691 } 692 }
692 err = 0; 693 err = 0;
693 goto out; 694 goto out;
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c
index 5c74c3574a5a..673b8b2fd337 100644
--- a/drivers/block/paride/pt.c
+++ b/drivers/block/paride/pt.c
@@ -979,10 +979,12 @@ static int __init pt_init(void)
979 979
980 for (unit = 0; unit < PT_UNITS; unit++) 980 for (unit = 0; unit < PT_UNITS; unit++)
981 if (pt[unit].present) { 981 if (pt[unit].present) {
982 device_create(pt_class, NULL, MKDEV(major, unit), 982 device_create_drvdata(pt_class, NULL,
983 "pt%d", unit); 983 MKDEV(major, unit), NULL,
984 device_create(pt_class, NULL, MKDEV(major, unit + 128), 984 "pt%d", unit);
985 "pt%dn", unit); 985 device_create_drvdata(pt_class, NULL,
986 MKDEV(major, unit + 128), NULL,
987 "pt%dn", unit);
986 } 988 }
987 goto out; 989 goto out;
988 990
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 45bee918c46a..158eed4d5161 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -303,7 +303,9 @@ static struct kobj_type kobj_pkt_type_wqueue = {
303static void pkt_sysfs_dev_new(struct pktcdvd_device *pd) 303static void pkt_sysfs_dev_new(struct pktcdvd_device *pd)
304{ 304{
305 if (class_pktcdvd) { 305 if (class_pktcdvd) {
306 pd->dev = device_create(class_pktcdvd, NULL, pd->pkt_dev, "%s", pd->name); 306 pd->dev = device_create_drvdata(class_pktcdvd, NULL,
307 pd->pkt_dev, NULL,
308 "%s", pd->name);
307 if (IS_ERR(pd->dev)) 309 if (IS_ERR(pd->dev))
308 pd->dev = NULL; 310 pd->dev = NULL;
309 } 311 }
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
index 650e6b44ce65..67b07576f8bf 100644
--- a/drivers/char/Kconfig
+++ b/drivers/char/Kconfig
@@ -300,16 +300,6 @@ config SPECIALIX
300 and compile this driver as kernel loadable module which will be 300 and compile this driver as kernel loadable module which will be
301 called specialix. 301 called specialix.
302 302
303config SPECIALIX_RTSCTS
304 bool "Specialix DTR/RTS pin is RTS"
305 depends on SPECIALIX
306 help
307 The Specialix IO8+ card can only support either RTS or DTR. If you
308 say N here, the driver will use the pin as "DTR" when the tty is in
309 software handshake mode. If you say Y here or hardware handshake is
310 on, it will always be RTS. Read the file
311 <file:Documentation/specialix.txt> for more information.
312
313config SX 303config SX
314 tristate "Specialix SX (and SI) card support" 304 tristate "Specialix SX (and SI) card support"
315 depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) 305 depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
@@ -867,13 +857,6 @@ config DS1302
867 857
868endif # RTC_LIB 858endif # RTC_LIB
869 859
870config COBALT_LCD
871 bool "Support for Cobalt LCD"
872 depends on MIPS_COBALT
873 help
874 This option enables support for the LCD display and buttons found
875 on Cobalt systems through a misc device.
876
877config DTLK 860config DTLK
878 tristate "Double Talk PC internal speech card support" 861 tristate "Double Talk PC internal speech card support"
879 depends on ISA 862 depends on ISA
diff --git a/drivers/char/Makefile b/drivers/char/Makefile
index 0e0d12a06462..4b6e736cfa02 100644
--- a/drivers/char/Makefile
+++ b/drivers/char/Makefile
@@ -7,7 +7,7 @@
7# 7#
8FONTMAPFILE = cp437.uni 8FONTMAPFILE = cp437.uni
9 9
10obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o 10obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o
11 11
12obj-$(CONFIG_LEGACY_PTYS) += pty.o 12obj-$(CONFIG_LEGACY_PTYS) += pty.o
13obj-$(CONFIG_UNIX98_PTYS) += pty.o 13obj-$(CONFIG_UNIX98_PTYS) += pty.o
@@ -88,7 +88,6 @@ obj-$(CONFIG_TOSHIBA) += toshiba.o
88obj-$(CONFIG_I8K) += i8k.o 88obj-$(CONFIG_I8K) += i8k.o
89obj-$(CONFIG_DS1620) += ds1620.o 89obj-$(CONFIG_DS1620) += ds1620.o
90obj-$(CONFIG_HW_RANDOM) += hw_random/ 90obj-$(CONFIG_HW_RANDOM) += hw_random/
91obj-$(CONFIG_COBALT_LCD) += lcd.o
92obj-$(CONFIG_PPDEV) += ppdev.o 91obj-$(CONFIG_PPDEV) += ppdev.o
93obj-$(CONFIG_NWBUTTON) += nwbutton.o 92obj-$(CONFIG_NWBUTTON) += nwbutton.o
94obj-$(CONFIG_NWFLASH) += nwflash.o 93obj-$(CONFIG_NWFLASH) += nwflash.o
diff --git a/drivers/char/amiserial.c b/drivers/char/amiserial.c
index 37457e5a4f2b..3530ff417a51 100644
--- a/drivers/char/amiserial.c
+++ b/drivers/char/amiserial.c
@@ -1248,7 +1248,7 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
1248/* 1248/*
1249 * rs_break() --- routine which turns the break handling on or off 1249 * rs_break() --- routine which turns the break handling on or off
1250 */ 1250 */
1251static void rs_break(struct tty_struct *tty, int break_state) 1251static int rs_break(struct tty_struct *tty, int break_state)
1252{ 1252{
1253 struct async_struct * info = (struct async_struct *)tty->driver_data; 1253 struct async_struct * info = (struct async_struct *)tty->driver_data;
1254 unsigned long flags; 1254 unsigned long flags;
@@ -1263,6 +1263,7 @@ static void rs_break(struct tty_struct *tty, int break_state)
1263 custom.adkcon = AC_UARTBRK; 1263 custom.adkcon = AC_UARTBRK;
1264 mb(); 1264 mb();
1265 local_irq_restore(flags); 1265 local_irq_restore(flags);
1266 return 0;
1266} 1267}
1267 1268
1268 1269
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c
index e991dc85f2fb..fe6d774fe2e4 100644
--- a/drivers/char/cyclades.c
+++ b/drivers/char/cyclades.c
@@ -3700,14 +3700,15 @@ cy_tiocmset(struct tty_struct *tty, struct file *file,
3700/* 3700/*
3701 * cy_break() --- routine which turns the break handling on or off 3701 * cy_break() --- routine which turns the break handling on or off
3702 */ 3702 */
3703static void cy_break(struct tty_struct *tty, int break_state) 3703static int cy_break(struct tty_struct *tty, int break_state)
3704{ 3704{
3705 struct cyclades_port *info = tty->driver_data; 3705 struct cyclades_port *info = tty->driver_data;
3706 struct cyclades_card *card; 3706 struct cyclades_card *card;
3707 unsigned long flags; 3707 unsigned long flags;
3708 int retval = 0;
3708 3709
3709 if (serial_paranoia_check(info, tty->name, "cy_break")) 3710 if (serial_paranoia_check(info, tty->name, "cy_break"))
3710 return; 3711 return -EINVAL;
3711 3712
3712 card = info->card; 3713 card = info->card;
3713 3714
@@ -3736,8 +3737,6 @@ static void cy_break(struct tty_struct *tty, int break_state)
3736 } 3737 }
3737 } 3738 }
3738 } else { 3739 } else {
3739 int retval;
3740
3741 if (break_state == -1) { 3740 if (break_state == -1) {
3742 retval = cyz_issue_cmd(card, 3741 retval = cyz_issue_cmd(card,
3743 info->line - card->first_line, 3742 info->line - card->first_line,
@@ -3758,6 +3757,7 @@ static void cy_break(struct tty_struct *tty, int break_state)
3758 } 3757 }
3759 } 3758 }
3760 spin_unlock_irqrestore(&card->card_lock, flags); 3759 spin_unlock_irqrestore(&card->card_lock, flags);
3760 return retval;
3761} /* cy_break */ 3761} /* cy_break */
3762 3762
3763static int get_mon_info(struct cyclades_port *info, 3763static int get_mon_info(struct cyclades_port *info,
diff --git a/drivers/char/dsp56k.c b/drivers/char/dsp56k.c
index b9a30c30e2b8..33c466a4888f 100644
--- a/drivers/char/dsp56k.c
+++ b/drivers/char/dsp56k.c
@@ -500,7 +500,8 @@ static int __init dsp56k_init_driver(void)
500 err = PTR_ERR(dsp56k_class); 500 err = PTR_ERR(dsp56k_class);
501 goto out_chrdev; 501 goto out_chrdev;
502 } 502 }
503 device_create(dsp56k_class, NULL, MKDEV(DSP56K_MAJOR, 0), "dsp56k"); 503 device_create_drvdata(dsp56k_class, NULL, MKDEV(DSP56K_MAJOR, 0),
504 NULL, "dsp56k");
504 505
505 printk(banner); 506 printk(banner);
506 goto out; 507 goto out;
diff --git a/drivers/char/epca.c b/drivers/char/epca.c
index ac9995f6578b..456e4ede049f 100644
--- a/drivers/char/epca.c
+++ b/drivers/char/epca.c
@@ -184,9 +184,8 @@ static void pc_stop(struct tty_struct *);
184static void pc_start(struct tty_struct *); 184static void pc_start(struct tty_struct *);
185static void pc_throttle(struct tty_struct *tty); 185static void pc_throttle(struct tty_struct *tty);
186static void pc_unthrottle(struct tty_struct *tty); 186static void pc_unthrottle(struct tty_struct *tty);
187static void digi_send_break(struct channel *ch, int msec); 187static int pc_send_break(struct tty_struct *tty, int msec);
188static void setup_empty_event(struct tty_struct *tty, struct channel *ch); 188static void setup_empty_event(struct tty_struct *tty, struct channel *ch);
189static void epca_setup(char *, int *);
190 189
191static int pc_write(struct tty_struct *, const unsigned char *, int); 190static int pc_write(struct tty_struct *, const unsigned char *, int);
192static int pc_init(void); 191static int pc_init(void);
@@ -1040,6 +1039,7 @@ static const struct tty_operations pc_ops = {
1040 .throttle = pc_throttle, 1039 .throttle = pc_throttle,
1041 .unthrottle = pc_unthrottle, 1040 .unthrottle = pc_unthrottle,
1042 .hangup = pc_hangup, 1041 .hangup = pc_hangup,
1042 .break_ctl = pc_send_break
1043}; 1043};
1044 1044
1045static int info_open(struct tty_struct *tty, struct file *filp) 1045static int info_open(struct tty_struct *tty, struct file *filp)
@@ -1132,7 +1132,7 @@ static int __init pc_init(void)
1132 pc_driver->init_termios.c_lflag = 0; 1132 pc_driver->init_termios.c_lflag = 0;
1133 pc_driver->init_termios.c_ispeed = 9600; 1133 pc_driver->init_termios.c_ispeed = 9600;
1134 pc_driver->init_termios.c_ospeed = 9600; 1134 pc_driver->init_termios.c_ospeed = 9600;
1135 pc_driver->flags = TTY_DRIVER_REAL_RAW; 1135 pc_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_HARDWARE_BREAK;
1136 tty_set_operations(pc_driver, &pc_ops); 1136 tty_set_operations(pc_driver, &pc_ops);
1137 1137
1138 pc_info->owner = THIS_MODULE; 1138 pc_info->owner = THIS_MODULE;
@@ -2177,7 +2177,6 @@ static int pc_ioctl(struct tty_struct *tty, struct file *file,
2177 unsigned int cmd, unsigned long arg) 2177 unsigned int cmd, unsigned long arg)
2178{ 2178{
2179 digiflow_t dflow; 2179 digiflow_t dflow;
2180 int retval;
2181 unsigned long flags; 2180 unsigned long flags;
2182 unsigned int mflag, mstat; 2181 unsigned int mflag, mstat;
2183 unsigned char startc, stopc; 2182 unsigned char startc, stopc;
@@ -2189,37 +2188,7 @@ static int pc_ioctl(struct tty_struct *tty, struct file *file,
2189 bc = ch->brdchan; 2188 bc = ch->brdchan;
2190 else 2189 else
2191 return -EINVAL; 2190 return -EINVAL;
2192 /*
2193 * For POSIX compliance we need to add more ioctls. See tty_ioctl.c in
2194 * /usr/src/linux/drivers/char for a good example. In particular think
2195 * about adding TCSETAF, TCSETAW, TCSETA, TCSETSF, TCSETSW, TCSETS.
2196 */
2197 switch (cmd) { 2191 switch (cmd) {
2198 case TCSBRK: /* SVID version: non-zero arg --> no break */
2199 retval = tty_check_change(tty);
2200 if (retval)
2201 return retval;
2202 /* Setup an event to indicate when the transmit
2203 buffer empties */
2204 spin_lock_irqsave(&epca_lock, flags);
2205 setup_empty_event(tty, ch);
2206 spin_unlock_irqrestore(&epca_lock, flags);
2207 tty_wait_until_sent(tty, 0);
2208 if (!arg)
2209 digi_send_break(ch, HZ / 4); /* 1/4 second */
2210 return 0;
2211 case TCSBRKP: /* support for POSIX tcsendbreak() */
2212 retval = tty_check_change(tty);
2213 if (retval)
2214 return retval;
2215 /* Setup an event to indicate when the transmit buffer
2216 empties */
2217 spin_lock_irqsave(&epca_lock, flags);
2218 setup_empty_event(tty, ch);
2219 spin_unlock_irqrestore(&epca_lock, flags);
2220 tty_wait_until_sent(tty, 0);
2221 digi_send_break(ch, arg ? arg*(HZ/10) : HZ/4);
2222 return 0;
2223 case TIOCMODG: 2192 case TIOCMODG:
2224 mflag = pc_tiocmget(tty, file); 2193 mflag = pc_tiocmget(tty, file);
2225 if (put_user(mflag, (unsigned long __user *)argp)) 2194 if (put_user(mflag, (unsigned long __user *)argp))
@@ -2505,10 +2474,14 @@ static void pc_unthrottle(struct tty_struct *tty)
2505 } 2474 }
2506} 2475}
2507 2476
2508static void digi_send_break(struct channel *ch, int msec) 2477static int pc_send_break(struct tty_struct *tty, int msec)
2509{ 2478{
2479 struct channel *ch = (struct channel *) tty->driver_data;
2510 unsigned long flags; 2480 unsigned long flags;
2511 2481
2482 if (msec == -1)
2483 return -EOPNOTSUPP;
2484
2512 spin_lock_irqsave(&epca_lock, flags); 2485 spin_lock_irqsave(&epca_lock, flags);
2513 globalwinon(ch); 2486 globalwinon(ch);
2514 /* 2487 /*
@@ -2521,6 +2494,7 @@ static void digi_send_break(struct channel *ch, int msec)
2521 fepcmd(ch, SENDBREAK, msec, 0, 10, 0); 2494 fepcmd(ch, SENDBREAK, msec, 0, 10, 0);
2522 memoff(ch); 2495 memoff(ch);
2523 spin_unlock_irqrestore(&epca_lock, flags); 2496 spin_unlock_irqrestore(&epca_lock, flags);
2497 return 0;
2524} 2498}
2525 2499
2526/* Caller MUST hold the lock */ 2500/* Caller MUST hold the lock */
@@ -2538,7 +2512,8 @@ static void setup_empty_event(struct tty_struct *tty, struct channel *ch)
2538 memoff(ch); 2512 memoff(ch);
2539} 2513}
2540 2514
2541static void epca_setup(char *str, int *ints) 2515#ifndef MODULE
2516static void __init epca_setup(char *str, int *ints)
2542{ 2517{
2543 struct board_info board; 2518 struct board_info board;
2544 int index, loop, last; 2519 int index, loop, last;
@@ -2792,6 +2767,17 @@ static void epca_setup(char *str, int *ints)
2792 num_cards++; 2767 num_cards++;
2793} 2768}
2794 2769
2770static int __init epca_real_setup(char *str)
2771{
2772 int ints[11];
2773
2774 epca_setup(get_options(str, 11, ints), ints);
2775 return 1;
2776}
2777
2778__setup("digiepca", epca_real_setup);
2779#endif
2780
2795enum epic_board_types { 2781enum epic_board_types {
2796 brd_xr = 0, 2782 brd_xr = 0,
2797 brd_xem, 2783 brd_xem,
diff --git a/drivers/char/esp.c b/drivers/char/esp.c
index 2eaf09f93e3d..7f077c0097f6 100644
--- a/drivers/char/esp.c
+++ b/drivers/char/esp.c
@@ -1725,13 +1725,13 @@ static int esp_tiocmset(struct tty_struct *tty, struct file *file,
1725/* 1725/*
1726 * rs_break() --- routine which turns the break handling on or off 1726 * rs_break() --- routine which turns the break handling on or off
1727 */ 1727 */
1728static void esp_break(struct tty_struct *tty, int break_state) 1728static int esp_break(struct tty_struct *tty, int break_state)
1729{ 1729{
1730 struct esp_struct *info = tty->driver_data; 1730 struct esp_struct *info = tty->driver_data;
1731 unsigned long flags; 1731 unsigned long flags;
1732 1732
1733 if (serial_paranoia_check(info, tty->name, "esp_break")) 1733 if (serial_paranoia_check(info, tty->name, "esp_break"))
1734 return; 1734 return -EINVAL;
1735 1735
1736 if (break_state == -1) { 1736 if (break_state == -1) {
1737 spin_lock_irqsave(&info->lock, flags); 1737 spin_lock_irqsave(&info->lock, flags);
@@ -1747,6 +1747,7 @@ static void esp_break(struct tty_struct *tty, int break_state)
1747 serial_out(info, UART_ESI_CMD2, 0x00); 1747 serial_out(info, UART_ESI_CMD2, 0x00);
1748 spin_unlock_irqrestore(&info->lock, flags); 1748 spin_unlock_irqrestore(&info->lock, flags);
1749 } 1749 }
1750 return 0;
1750} 1751}
1751 1752
1752static int rs_ioctl(struct tty_struct *tty, struct file *file, 1753static int rs_ioctl(struct tty_struct *tty, struct file *file,
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index efd0b4db7c8e..8822eca58ffa 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -59,6 +59,19 @@ config HW_RANDOM_GEODE
59 59
60 If unsure, say Y. 60 If unsure, say Y.
61 61
62config HW_RANDOM_N2RNG
63 tristate "Niagara2 Random Number Generator support"
64 depends on HW_RANDOM && SPARC64
65 default HW_RANDOM
66 ---help---
67 This driver provides kernel-side support for the Random Number
68 Generator hardware found on Niagara2 cpus.
69
70 To compile this driver as a module, choose M here: the
71 module will be called n2-rng.
72
73 If unsure, say Y.
74
62config HW_RANDOM_VIA 75config HW_RANDOM_VIA
63 tristate "VIA HW Random Number Generator support" 76 tristate "VIA HW Random Number Generator support"
64 depends on HW_RANDOM && X86_32 77 depends on HW_RANDOM && X86_32
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index b4940ddbb35f..b6effb7522c2 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -7,6 +7,8 @@ rng-core-y := core.o
7obj-$(CONFIG_HW_RANDOM_INTEL) += intel-rng.o 7obj-$(CONFIG_HW_RANDOM_INTEL) += intel-rng.o
8obj-$(CONFIG_HW_RANDOM_AMD) += amd-rng.o 8obj-$(CONFIG_HW_RANDOM_AMD) += amd-rng.o
9obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o 9obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o
10obj-$(CONFIG_HW_RANDOM_N2RNG) += n2-rng.o
11n2-rng-y := n2-drv.o n2-asm.o
10obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o 12obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
11obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o 13obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
12obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o 14obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
diff --git a/drivers/char/hw_random/n2-asm.S b/drivers/char/hw_random/n2-asm.S
new file mode 100644
index 000000000000..9b6eb5cd59f6
--- /dev/null
+++ b/drivers/char/hw_random/n2-asm.S
@@ -0,0 +1,79 @@
1/* n2-asm.S: Niagara2 RNG hypervisor call assembler.
2 *
3 * Copyright (C) 2008 David S. Miller <davem@davemloft.net>
4 */
5#include <linux/linkage.h>
6#include <asm/hypervisor.h>
7#include "n2rng.h"
8
9 .text
10
11ENTRY(sun4v_rng_get_diag_ctl)
12 mov HV_FAST_RNG_GET_DIAG_CTL, %o5
13 ta HV_FAST_TRAP
14 retl
15 nop
16ENDPROC(sun4v_rng_get_diag_ctl)
17
18ENTRY(sun4v_rng_ctl_read_v1)
19 mov %o1, %o3
20 mov %o2, %o4
21 mov HV_FAST_RNG_CTL_READ, %o5
22 ta HV_FAST_TRAP
23 stx %o1, [%o3]
24 retl
25 stx %o2, [%o4]
26ENDPROC(sun4v_rng_ctl_read_v1)
27
28ENTRY(sun4v_rng_ctl_read_v2)
29 save %sp, -192, %sp
30 mov %i0, %o0
31 mov %i1, %o1
32 mov HV_FAST_RNG_CTL_READ, %o5
33 ta HV_FAST_TRAP
34 stx %o1, [%i2]
35 stx %o2, [%i3]
36 stx %o3, [%i4]
37 stx %o4, [%i5]
38 ret
39 restore %g0, %o0, %o0
40ENDPROC(sun4v_rng_ctl_read_v2)
41
42ENTRY(sun4v_rng_ctl_write_v1)
43 mov %o3, %o4
44 mov HV_FAST_RNG_CTL_WRITE, %o5
45 ta HV_FAST_TRAP
46 retl
47 stx %o1, [%o4]
48ENDPROC(sun4v_rng_ctl_write_v1)
49
50ENTRY(sun4v_rng_ctl_write_v2)
51 mov HV_FAST_RNG_CTL_WRITE, %o5
52 ta HV_FAST_TRAP
53 retl
54 nop
55ENDPROC(sun4v_rng_ctl_write_v2)
56
57ENTRY(sun4v_rng_data_read_diag_v1)
58 mov %o2, %o4
59 mov HV_FAST_RNG_DATA_READ_DIAG, %o5
60 ta HV_FAST_TRAP
61 retl
62 stx %o1, [%o4]
63ENDPROC(sun4v_rng_data_read_diag_v1)
64
65ENTRY(sun4v_rng_data_read_diag_v2)
66 mov %o3, %o4
67 mov HV_FAST_RNG_DATA_READ_DIAG, %o5
68 ta HV_FAST_TRAP
69 retl
70 stx %o1, [%o4]
71ENDPROC(sun4v_rng_data_read_diag_v2)
72
73ENTRY(sun4v_rng_data_read)
74 mov %o1, %o4
75 mov HV_FAST_RNG_DATA_READ, %o5
76 ta HV_FAST_TRAP
77 retl
78 stx %o1, [%o4]
79ENDPROC(sun4v_rng_data_read)
diff --git a/drivers/char/hw_random/n2-drv.c b/drivers/char/hw_random/n2-drv.c
new file mode 100644
index 000000000000..5220f541df25
--- /dev/null
+++ b/drivers/char/hw_random/n2-drv.c
@@ -0,0 +1,771 @@
1/* n2-drv.c: Niagara-2 RNG driver.
2 *
3 * Copyright (C) 2008 David S. Miller <davem@davemloft.net>
4 */
5
6#include <linux/kernel.h>
7#include <linux/module.h>
8#include <linux/types.h>
9#include <linux/delay.h>
10#include <linux/init.h>
11#include <linux/slab.h>
12#include <linux/workqueue.h>
13#include <linux/preempt.h>
14#include <linux/hw_random.h>
15
16#include <linux/of.h>
17#include <linux/of_device.h>
18
19#include <asm/hypervisor.h>
20
21#include "n2rng.h"
22
23#define DRV_MODULE_NAME "n2rng"
24#define PFX DRV_MODULE_NAME ": "
25#define DRV_MODULE_VERSION "0.1"
26#define DRV_MODULE_RELDATE "May 15, 2008"
27
28static char version[] __devinitdata =
29 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
30
31MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
32MODULE_DESCRIPTION("Niagara2 RNG driver");
33MODULE_LICENSE("GPL");
34MODULE_VERSION(DRV_MODULE_VERSION);
35
36/* The Niagara2 RNG provides a 64-bit read-only random number
37 * register, plus a control register. Access to the RNG is
38 * virtualized through the hypervisor so that both guests and control
39 * nodes can access the device.
40 *
41 * The entropy source consists of raw entropy sources, each
42 * constructed from a voltage controlled oscillator whose phase is
43 * jittered by thermal noise sources.
44 *
45 * The oscillator in each of the three raw entropy sources run at
46 * different frequencies. Normally, all three generator outputs are
47 * gathered, xored together, and fed into a CRC circuit, the output of
48 * which is the 64-bit read-only register.
49 *
50 * Some time is necessary for all the necessary entropy to build up
51 * such that a full 64-bits of entropy are available in the register.
52 * In normal operating mode (RNG_CTL_LFSR is set), the chip implements
53 * an interlock which blocks register reads until sufficient entropy
54 * is available.
55 *
56 * A control register is provided for adjusting various aspects of RNG
57 * operation, and to enable diagnostic modes. Each of the three raw
58 * entropy sources has an enable bit (RNG_CTL_ES{1,2,3}). Also
59 * provided are fields for controlling the minimum time in cycles
60 * between read accesses to the register (RNG_CTL_WAIT, this controls
61 * the interlock described in the previous paragraph).
62 *
63 * The standard setting is to have the mode bit (RNG_CTL_LFSR) set,
64 * all three entropy sources enabled, and the interlock time set
65 * appropriately.
66 *
67 * The CRC polynomial used by the chip is:
68 *
69 * P(X) = x64 + x61 + x57 + x56 + x52 + x51 + x50 + x48 + x47 + x46 +
70 * x43 + x42 + x41 + x39 + x38 + x37 + x35 + x32 + x28 + x25 +
71 * x22 + x21 + x17 + x15 + x13 + x12 + x11 + x7 + x5 + x + 1
72 *
73 * The RNG_CTL_VCO value of each noise cell must be programmed
74 * seperately. This is why 4 control register values must be provided
75 * to the hypervisor. During a write, the hypervisor writes them all,
76 * one at a time, to the actual RNG_CTL register. The first three
77 * values are used to setup the desired RNG_CTL_VCO for each entropy
78 * source, for example:
79 *
80 * control 0: (1 << RNG_CTL_VCO_SHIFT) | RNG_CTL_ES1
81 * control 1: (2 << RNG_CTL_VCO_SHIFT) | RNG_CTL_ES2
82 * control 2: (3 << RNG_CTL_VCO_SHIFT) | RNG_CTL_ES3
83 *
84 * And then the fourth value sets the final chip state and enables
85 * desired.
86 */
87
88static int n2rng_hv_err_trans(unsigned long hv_err)
89{
90 switch (hv_err) {
91 case HV_EOK:
92 return 0;
93 case HV_EWOULDBLOCK:
94 return -EAGAIN;
95 case HV_ENOACCESS:
96 return -EPERM;
97 case HV_EIO:
98 return -EIO;
99 case HV_EBUSY:
100 return -EBUSY;
101 case HV_EBADALIGN:
102 case HV_ENORADDR:
103 return -EFAULT;
104 default:
105 return -EINVAL;
106 }
107}
108
109static unsigned long n2rng_generic_read_control_v2(unsigned long ra,
110 unsigned long unit)
111{
112 unsigned long hv_err, state, ticks, watchdog_delta, watchdog_status;
113 int block = 0, busy = 0;
114
115 while (1) {
116 hv_err = sun4v_rng_ctl_read_v2(ra, unit, &state,
117 &ticks,
118 &watchdog_delta,
119 &watchdog_status);
120 if (hv_err == HV_EOK)
121 break;
122
123 if (hv_err == HV_EBUSY) {
124 if (++busy >= N2RNG_BUSY_LIMIT)
125 break;
126
127 udelay(1);
128 } else if (hv_err == HV_EWOULDBLOCK) {
129 if (++block >= N2RNG_BLOCK_LIMIT)
130 break;
131
132 __delay(ticks);
133 } else
134 break;
135 }
136
137 return hv_err;
138}
139
140/* In multi-socket situations, the hypervisor might need to
141 * queue up the RNG control register write if it's for a unit
142 * that is on a cpu socket other than the one we are executing on.
143 *
144 * We poll here waiting for a successful read of that control
145 * register to make sure the write has been actually performed.
146 */
147static unsigned long n2rng_control_settle_v2(struct n2rng *np, int unit)
148{
149 unsigned long ra = __pa(&np->scratch_control[0]);
150
151 return n2rng_generic_read_control_v2(ra, unit);
152}
153
154static unsigned long n2rng_write_ctl_one(struct n2rng *np, int unit,
155 unsigned long state,
156 unsigned long control_ra,
157 unsigned long watchdog_timeout,
158 unsigned long *ticks)
159{
160 unsigned long hv_err;
161
162 if (np->hvapi_major == 1) {
163 hv_err = sun4v_rng_ctl_write_v1(control_ra, state,
164 watchdog_timeout, ticks);
165 } else {
166 hv_err = sun4v_rng_ctl_write_v2(control_ra, state,
167 watchdog_timeout, unit);
168 if (hv_err == HV_EOK)
169 hv_err = n2rng_control_settle_v2(np, unit);
170 *ticks = N2RNG_ACCUM_CYCLES_DEFAULT;
171 }
172
173 return hv_err;
174}
175
176static int n2rng_generic_read_data(unsigned long data_ra)
177{
178 unsigned long ticks, hv_err;
179 int block = 0, hcheck = 0;
180
181 while (1) {
182 hv_err = sun4v_rng_data_read(data_ra, &ticks);
183 if (hv_err == HV_EOK)
184 return 0;
185
186 if (hv_err == HV_EWOULDBLOCK) {
187 if (++block >= N2RNG_BLOCK_LIMIT)
188 return -EWOULDBLOCK;
189 __delay(ticks);
190 } else if (hv_err == HV_ENOACCESS) {
191 return -EPERM;
192 } else if (hv_err == HV_EIO) {
193 if (++hcheck >= N2RNG_HCHECK_LIMIT)
194 return -EIO;
195 udelay(10000);
196 } else
197 return -ENODEV;
198 }
199}
200
201static unsigned long n2rng_read_diag_data_one(struct n2rng *np,
202 unsigned long unit,
203 unsigned long data_ra,
204 unsigned long data_len,
205 unsigned long *ticks)
206{
207 unsigned long hv_err;
208
209 if (np->hvapi_major == 1) {
210 hv_err = sun4v_rng_data_read_diag_v1(data_ra, data_len, ticks);
211 } else {
212 hv_err = sun4v_rng_data_read_diag_v2(data_ra, data_len,
213 unit, ticks);
214 if (!*ticks)
215 *ticks = N2RNG_ACCUM_CYCLES_DEFAULT;
216 }
217 return hv_err;
218}
219
220static int n2rng_generic_read_diag_data(struct n2rng *np,
221 unsigned long unit,
222 unsigned long data_ra,
223 unsigned long data_len)
224{
225 unsigned long ticks, hv_err;
226 int block = 0;
227
228 while (1) {
229 hv_err = n2rng_read_diag_data_one(np, unit,
230 data_ra, data_len,
231 &ticks);
232 if (hv_err == HV_EOK)
233 return 0;
234
235 if (hv_err == HV_EWOULDBLOCK) {
236 if (++block >= N2RNG_BLOCK_LIMIT)
237 return -EWOULDBLOCK;
238 __delay(ticks);
239 } else if (hv_err == HV_ENOACCESS) {
240 return -EPERM;
241 } else if (hv_err == HV_EIO) {
242 return -EIO;
243 } else
244 return -ENODEV;
245 }
246}
247
248
249static int n2rng_generic_write_control(struct n2rng *np,
250 unsigned long control_ra,
251 unsigned long unit,
252 unsigned long state)
253{
254 unsigned long hv_err, ticks;
255 int block = 0, busy = 0;
256
257 while (1) {
258 hv_err = n2rng_write_ctl_one(np, unit, state, control_ra,
259 np->wd_timeo, &ticks);
260 if (hv_err == HV_EOK)
261 return 0;
262
263 if (hv_err == HV_EWOULDBLOCK) {
264 if (++block >= N2RNG_BLOCK_LIMIT)
265 return -EWOULDBLOCK;
266 __delay(ticks);
267 } else if (hv_err == HV_EBUSY) {
268 if (++busy >= N2RNG_BUSY_LIMIT)
269 return -EBUSY;
270 udelay(1);
271 } else
272 return -ENODEV;
273 }
274}
275
276/* Just try to see if we can successfully access the control register
277 * of the RNG on the domain on which we are currently executing.
278 */
279static int n2rng_try_read_ctl(struct n2rng *np)
280{
281 unsigned long hv_err;
282 unsigned long x;
283
284 if (np->hvapi_major == 1) {
285 hv_err = sun4v_rng_get_diag_ctl();
286 } else {
287 /* We purposefully give invalid arguments, HV_NOACCESS
288 * is higher priority than the errors we'd get from
289 * these other cases, and that's the error we are
290 * truly interested in.
291 */
292 hv_err = sun4v_rng_ctl_read_v2(0UL, ~0UL, &x, &x, &x, &x);
293 switch (hv_err) {
294 case HV_EWOULDBLOCK:
295 case HV_ENOACCESS:
296 break;
297 default:
298 hv_err = HV_EOK;
299 break;
300 }
301 }
302
303 return n2rng_hv_err_trans(hv_err);
304}
305
306#define CONTROL_DEFAULT_BASE \
307 ((2 << RNG_CTL_ASEL_SHIFT) | \
308 (N2RNG_ACCUM_CYCLES_DEFAULT << RNG_CTL_WAIT_SHIFT) | \
309 RNG_CTL_LFSR)
310
311#define CONTROL_DEFAULT_0 \
312 (CONTROL_DEFAULT_BASE | \
313 (1 << RNG_CTL_VCO_SHIFT) | \
314 RNG_CTL_ES1)
315#define CONTROL_DEFAULT_1 \
316 (CONTROL_DEFAULT_BASE | \
317 (2 << RNG_CTL_VCO_SHIFT) | \
318 RNG_CTL_ES2)
319#define CONTROL_DEFAULT_2 \
320 (CONTROL_DEFAULT_BASE | \
321 (3 << RNG_CTL_VCO_SHIFT) | \
322 RNG_CTL_ES3)
323#define CONTROL_DEFAULT_3 \
324 (CONTROL_DEFAULT_BASE | \
325 RNG_CTL_ES1 | RNG_CTL_ES2 | RNG_CTL_ES3)
326
327static void n2rng_control_swstate_init(struct n2rng *np)
328{
329 int i;
330
331 np->flags |= N2RNG_FLAG_CONTROL;
332
333 np->health_check_sec = N2RNG_HEALTH_CHECK_SEC_DEFAULT;
334 np->accum_cycles = N2RNG_ACCUM_CYCLES_DEFAULT;
335 np->wd_timeo = N2RNG_WD_TIMEO_DEFAULT;
336
337 for (i = 0; i < np->num_units; i++) {
338 struct n2rng_unit *up = &np->units[i];
339
340 up->control[0] = CONTROL_DEFAULT_0;
341 up->control[1] = CONTROL_DEFAULT_1;
342 up->control[2] = CONTROL_DEFAULT_2;
343 up->control[3] = CONTROL_DEFAULT_3;
344 }
345
346 np->hv_state = HV_RNG_STATE_UNCONFIGURED;
347}
348
349static int n2rng_grab_diag_control(struct n2rng *np)
350{
351 int i, busy_count, err = -ENODEV;
352
353 busy_count = 0;
354 for (i = 0; i < 100; i++) {
355 err = n2rng_try_read_ctl(np);
356 if (err != -EAGAIN)
357 break;
358
359 if (++busy_count > 100) {
360 dev_err(&np->op->dev,
361 "Grab diag control timeout.\n");
362 return -ENODEV;
363 }
364
365 udelay(1);
366 }
367
368 return err;
369}
370
371static int n2rng_init_control(struct n2rng *np)
372{
373 int err = n2rng_grab_diag_control(np);
374
375 /* Not in the control domain, that's OK we are only a consumer
376 * of the RNG data, we don't setup and program it.
377 */
378 if (err == -EPERM)
379 return 0;
380 if (err)
381 return err;
382
383 n2rng_control_swstate_init(np);
384
385 return 0;
386}
387
388static int n2rng_data_read(struct hwrng *rng, u32 *data)
389{
390 struct n2rng *np = (struct n2rng *) rng->priv;
391 unsigned long ra = __pa(&np->test_data);
392 int len;
393
394 if (!(np->flags & N2RNG_FLAG_READY)) {
395 len = 0;
396 } else if (np->flags & N2RNG_FLAG_BUFFER_VALID) {
397 np->flags &= ~N2RNG_FLAG_BUFFER_VALID;
398 *data = np->buffer;
399 len = 4;
400 } else {
401 int err = n2rng_generic_read_data(ra);
402 if (!err) {
403 np->buffer = np->test_data >> 32;
404 *data = np->test_data & 0xffffffff;
405 len = 4;
406 } else {
407 dev_err(&np->op->dev, "RNG error, restesting\n");
408 np->flags &= ~N2RNG_FLAG_READY;
409 if (!(np->flags & N2RNG_FLAG_SHUTDOWN))
410 schedule_delayed_work(&np->work, 0);
411 len = 0;
412 }
413 }
414
415 return len;
416}
417
418/* On a guest node, just make sure we can read random data properly.
419 * If a control node reboots or reloads it's n2rng driver, this won't
420 * work during that time. So we have to keep probing until the device
421 * becomes usable.
422 */
423static int n2rng_guest_check(struct n2rng *np)
424{
425 unsigned long ra = __pa(&np->test_data);
426
427 return n2rng_generic_read_data(ra);
428}
429
430static int n2rng_entropy_diag_read(struct n2rng *np, unsigned long unit,
431 u64 *pre_control, u64 pre_state,
432 u64 *buffer, unsigned long buf_len,
433 u64 *post_control, u64 post_state)
434{
435 unsigned long post_ctl_ra = __pa(post_control);
436 unsigned long pre_ctl_ra = __pa(pre_control);
437 unsigned long buffer_ra = __pa(buffer);
438 int err;
439
440 err = n2rng_generic_write_control(np, pre_ctl_ra, unit, pre_state);
441 if (err)
442 return err;
443
444 err = n2rng_generic_read_diag_data(np, unit,
445 buffer_ra, buf_len);
446
447 (void) n2rng_generic_write_control(np, post_ctl_ra, unit,
448 post_state);
449
450 return err;
451}
452
453static u64 advance_polynomial(u64 poly, u64 val, int count)
454{
455 int i;
456
457 for (i = 0; i < count; i++) {
458 int highbit_set = ((s64)val < 0);
459
460 val <<= 1;
461 if (highbit_set)
462 val ^= poly;
463 }
464
465 return val;
466}
467
468static int n2rng_test_buffer_find(struct n2rng *np, u64 val)
469{
470 int i, count = 0;
471
472 /* Purposefully skip over the first word. */
473 for (i = 1; i < SELFTEST_BUFFER_WORDS; i++) {
474 if (np->test_buffer[i] == val)
475 count++;
476 }
477 return count;
478}
479
480static void n2rng_dump_test_buffer(struct n2rng *np)
481{
482 int i;
483
484 for (i = 0; i < SELFTEST_BUFFER_WORDS; i++)
485 dev_err(&np->op->dev, "Test buffer slot %d [0x%016lx]\n",
486 i, np->test_buffer[i]);
487}
488
489static int n2rng_check_selftest_buffer(struct n2rng *np, unsigned long unit)
490{
491 u64 val = SELFTEST_VAL;
492 int err, matches, limit;
493
494 matches = 0;
495 for (limit = 0; limit < SELFTEST_LOOPS_MAX; limit++) {
496 matches += n2rng_test_buffer_find(np, val);
497 if (matches >= SELFTEST_MATCH_GOAL)
498 break;
499 val = advance_polynomial(SELFTEST_POLY, val, 1);
500 }
501
502 err = 0;
503 if (limit >= SELFTEST_LOOPS_MAX) {
504 err = -ENODEV;
505 dev_err(&np->op->dev, "Selftest failed on unit %lu\n", unit);
506 n2rng_dump_test_buffer(np);
507 } else
508 dev_info(&np->op->dev, "Selftest passed on unit %lu\n", unit);
509
510 return err;
511}
512
513static int n2rng_control_selftest(struct n2rng *np, unsigned long unit)
514{
515 int err;
516
517 np->test_control[0] = (0x2 << RNG_CTL_ASEL_SHIFT);
518 np->test_control[1] = (0x2 << RNG_CTL_ASEL_SHIFT);
519 np->test_control[2] = (0x2 << RNG_CTL_ASEL_SHIFT);
520 np->test_control[3] = ((0x2 << RNG_CTL_ASEL_SHIFT) |
521 RNG_CTL_LFSR |
522 ((SELFTEST_TICKS - 2) << RNG_CTL_WAIT_SHIFT));
523
524
525 err = n2rng_entropy_diag_read(np, unit, np->test_control,
526 HV_RNG_STATE_HEALTHCHECK,
527 np->test_buffer,
528 sizeof(np->test_buffer),
529 &np->units[unit].control[0],
530 np->hv_state);
531 if (err)
532 return err;
533
534 return n2rng_check_selftest_buffer(np, unit);
535}
536
537static int n2rng_control_check(struct n2rng *np)
538{
539 int i;
540
541 for (i = 0; i < np->num_units; i++) {
542 int err = n2rng_control_selftest(np, i);
543 if (err)
544 return err;
545 }
546 return 0;
547}
548
549/* The sanity checks passed, install the final configuration into the
550 * chip, it's ready to use.
551 */
552static int n2rng_control_configure_units(struct n2rng *np)
553{
554 int unit, err;
555
556 err = 0;
557 for (unit = 0; unit < np->num_units; unit++) {
558 struct n2rng_unit *up = &np->units[unit];
559 unsigned long ctl_ra = __pa(&up->control[0]);
560 int esrc;
561 u64 base;
562
563 base = ((np->accum_cycles << RNG_CTL_WAIT_SHIFT) |
564 (2 << RNG_CTL_ASEL_SHIFT) |
565 RNG_CTL_LFSR);
566
567 /* XXX This isn't the best. We should fetch a bunch
568 * XXX of words using each entropy source combined XXX
569 * with each VCO setting, and see which combinations
570 * XXX give the best random data.
571 */
572 for (esrc = 0; esrc < 3; esrc++)
573 up->control[esrc] = base |
574 (esrc << RNG_CTL_VCO_SHIFT) |
575 (RNG_CTL_ES1 << esrc);
576
577 up->control[3] = base |
578 (RNG_CTL_ES1 | RNG_CTL_ES2 | RNG_CTL_ES3);
579
580 err = n2rng_generic_write_control(np, ctl_ra, unit,
581 HV_RNG_STATE_CONFIGURED);
582 if (err)
583 break;
584 }
585
586 return err;
587}
588
589static void n2rng_work(struct work_struct *work)
590{
591 struct n2rng *np = container_of(work, struct n2rng, work.work);
592 int err = 0;
593
594 if (!(np->flags & N2RNG_FLAG_CONTROL)) {
595 err = n2rng_guest_check(np);
596 } else {
597 preempt_disable();
598 err = n2rng_control_check(np);
599 preempt_enable();
600
601 if (!err)
602 err = n2rng_control_configure_units(np);
603 }
604
605 if (!err) {
606 np->flags |= N2RNG_FLAG_READY;
607 dev_info(&np->op->dev, "RNG ready\n");
608 }
609
610 if (err && !(np->flags & N2RNG_FLAG_SHUTDOWN))
611 schedule_delayed_work(&np->work, HZ * 2);
612}
613
614static void __devinit n2rng_driver_version(void)
615{
616 static int n2rng_version_printed;
617
618 if (n2rng_version_printed++ == 0)
619 pr_info("%s", version);
620}
621
622static int __devinit n2rng_probe(struct of_device *op,
623 const struct of_device_id *match)
624{
625 int victoria_falls = (match->data != NULL);
626 int err = -ENOMEM;
627 struct n2rng *np;
628
629 n2rng_driver_version();
630
631 np = kzalloc(sizeof(*np), GFP_KERNEL);
632 if (!np)
633 goto out;
634 np->op = op;
635
636 INIT_DELAYED_WORK(&np->work, n2rng_work);
637
638 if (victoria_falls)
639 np->flags |= N2RNG_FLAG_VF;
640
641 err = -ENODEV;
642 np->hvapi_major = 2;
643 if (sun4v_hvapi_register(HV_GRP_RNG,
644 np->hvapi_major,
645 &np->hvapi_minor)) {
646 np->hvapi_major = 1;
647 if (sun4v_hvapi_register(HV_GRP_RNG,
648 np->hvapi_major,
649 &np->hvapi_minor)) {
650 dev_err(&op->dev, "Cannot register suitable "
651 "HVAPI version.\n");
652 goto out_free;
653 }
654 }
655
656 if (np->flags & N2RNG_FLAG_VF) {
657 if (np->hvapi_major < 2) {
658 dev_err(&op->dev, "VF RNG requires HVAPI major "
659 "version 2 or later, got %lu\n",
660 np->hvapi_major);
661 goto out_hvapi_unregister;
662 }
663 np->num_units = of_getintprop_default(op->node,
664 "rng-#units", 0);
665 if (!np->num_units) {
666 dev_err(&op->dev, "VF RNG lacks rng-#units property\n");
667 goto out_hvapi_unregister;
668 }
669 } else
670 np->num_units = 1;
671
672 dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n",
673 np->hvapi_major, np->hvapi_minor);
674
675 np->units = kzalloc(sizeof(struct n2rng_unit) * np->num_units,
676 GFP_KERNEL);
677 err = -ENOMEM;
678 if (!np->units)
679 goto out_hvapi_unregister;
680
681 err = n2rng_init_control(np);
682 if (err)
683 goto out_free_units;
684
685 dev_info(&op->dev, "Found %s RNG, units: %d\n",
686 ((np->flags & N2RNG_FLAG_VF) ?
687 "Victoria Falls" : "Niagara2"),
688 np->num_units);
689
690 np->hwrng.name = "n2rng";
691 np->hwrng.data_read = n2rng_data_read;
692 np->hwrng.priv = (unsigned long) np;
693
694 err = hwrng_register(&np->hwrng);
695 if (err)
696 goto out_free_units;
697
698 dev_set_drvdata(&op->dev, np);
699
700 schedule_delayed_work(&np->work, 0);
701
702 return 0;
703
704out_free_units:
705 kfree(np->units);
706 np->units = NULL;
707
708out_hvapi_unregister:
709 sun4v_hvapi_unregister(HV_GRP_RNG);
710
711out_free:
712 kfree(np);
713out:
714 return err;
715}
716
717static int __devexit n2rng_remove(struct of_device *op)
718{
719 struct n2rng *np = dev_get_drvdata(&op->dev);
720
721 np->flags |= N2RNG_FLAG_SHUTDOWN;
722
723 cancel_delayed_work_sync(&np->work);
724
725 hwrng_unregister(&np->hwrng);
726
727 sun4v_hvapi_unregister(HV_GRP_RNG);
728
729 kfree(np->units);
730 np->units = NULL;
731
732 kfree(np);
733
734 dev_set_drvdata(&op->dev, NULL);
735
736 return 0;
737}
738
739static struct of_device_id n2rng_match[] = {
740 {
741 .name = "random-number-generator",
742 .compatible = "SUNW,n2-rng",
743 },
744 {
745 .name = "random-number-generator",
746 .compatible = "SUNW,vf-rng",
747 .data = (void *) 1,
748 },
749 {},
750};
751MODULE_DEVICE_TABLE(of, n2rng_match);
752
753static struct of_platform_driver n2rng_driver = {
754 .name = "n2rng",
755 .match_table = n2rng_match,
756 .probe = n2rng_probe,
757 .remove = __devexit_p(n2rng_remove),
758};
759
760static int __init n2rng_init(void)
761{
762 return of_register_driver(&n2rng_driver, &of_bus_type);
763}
764
765static void __exit n2rng_exit(void)
766{
767 of_unregister_driver(&n2rng_driver);
768}
769
770module_init(n2rng_init);
771module_exit(n2rng_exit);
diff --git a/drivers/char/hw_random/n2rng.h b/drivers/char/hw_random/n2rng.h
new file mode 100644
index 000000000000..a2b81e7bfc18
--- /dev/null
+++ b/drivers/char/hw_random/n2rng.h
@@ -0,0 +1,118 @@
1/* n2rng.h: Niagara2 RNG defines.
2 *
3 * Copyright (C) 2008 David S. Miller <davem@davemloft.net>
4 */
5
6#ifndef _N2RNG_H
7#define _N2RNG_H
8
9#define RNG_CTL_WAIT 0x0000000001fffe00ULL /* Minimum wait time */
10#define RNG_CTL_WAIT_SHIFT 9
11#define RNG_CTL_BYPASS 0x0000000000000100ULL /* VCO voltage source */
12#define RNG_CTL_VCO 0x00000000000000c0ULL /* VCO rate control */
13#define RNG_CTL_VCO_SHIFT 6
14#define RNG_CTL_ASEL 0x0000000000000030ULL /* Analog MUX select */
15#define RNG_CTL_ASEL_SHIFT 4
16#define RNG_CTL_LFSR 0x0000000000000008ULL /* Use LFSR or plain shift */
17#define RNG_CTL_ES3 0x0000000000000004ULL /* Enable entropy source 3 */
18#define RNG_CTL_ES2 0x0000000000000002ULL /* Enable entropy source 2 */
19#define RNG_CTL_ES1 0x0000000000000001ULL /* Enable entropy source 1 */
20
21#define HV_FAST_RNG_GET_DIAG_CTL 0x130
22#define HV_FAST_RNG_CTL_READ 0x131
23#define HV_FAST_RNG_CTL_WRITE 0x132
24#define HV_FAST_RNG_DATA_READ_DIAG 0x133
25#define HV_FAST_RNG_DATA_READ 0x134
26
27#define HV_RNG_STATE_UNCONFIGURED 0
28#define HV_RNG_STATE_CONFIGURED 1
29#define HV_RNG_STATE_HEALTHCHECK 2
30#define HV_RNG_STATE_ERROR 3
31
32#define HV_RNG_NUM_CONTROL 4
33
34#ifndef __ASSEMBLY__
35extern unsigned long sun4v_rng_get_diag_ctl(void);
36extern unsigned long sun4v_rng_ctl_read_v1(unsigned long ctl_regs_ra,
37 unsigned long *state,
38 unsigned long *tick_delta);
39extern unsigned long sun4v_rng_ctl_read_v2(unsigned long ctl_regs_ra,
40 unsigned long unit,
41 unsigned long *state,
42 unsigned long *tick_delta,
43 unsigned long *watchdog,
44 unsigned long *write_status);
45extern unsigned long sun4v_rng_ctl_write_v1(unsigned long ctl_regs_ra,
46 unsigned long state,
47 unsigned long write_timeout,
48 unsigned long *tick_delta);
49extern unsigned long sun4v_rng_ctl_write_v2(unsigned long ctl_regs_ra,
50 unsigned long state,
51 unsigned long write_timeout,
52 unsigned long unit);
53extern unsigned long sun4v_rng_data_read_diag_v1(unsigned long data_ra,
54 unsigned long len,
55 unsigned long *tick_delta);
56extern unsigned long sun4v_rng_data_read_diag_v2(unsigned long data_ra,
57 unsigned long len,
58 unsigned long unit,
59 unsigned long *tick_delta);
60extern unsigned long sun4v_rng_data_read(unsigned long data_ra,
61 unsigned long *tick_delta);
62
63struct n2rng_unit {
64 u64 control[HV_RNG_NUM_CONTROL];
65};
66
67struct n2rng {
68 struct of_device *op;
69
70 unsigned long flags;
71#define N2RNG_FLAG_VF 0x00000001 /* Victoria Falls RNG, else N2 */
72#define N2RNG_FLAG_CONTROL 0x00000002 /* Operating in control domain */
73#define N2RNG_FLAG_READY 0x00000008 /* Ready for hw-rng layer */
74#define N2RNG_FLAG_SHUTDOWN 0x00000010 /* Driver unregistering */
75#define N2RNG_FLAG_BUFFER_VALID 0x00000020 /* u32 buffer holds valid data */
76
77 int num_units;
78 struct n2rng_unit *units;
79
80 struct hwrng hwrng;
81 u32 buffer;
82
83 /* Registered hypervisor group API major and minor version. */
84 unsigned long hvapi_major;
85 unsigned long hvapi_minor;
86
87 struct delayed_work work;
88
89 unsigned long hv_state; /* HV_RNG_STATE_foo */
90
91 unsigned long health_check_sec;
92 unsigned long accum_cycles;
93 unsigned long wd_timeo;
94#define N2RNG_HEALTH_CHECK_SEC_DEFAULT 0
95#define N2RNG_ACCUM_CYCLES_DEFAULT 2048
96#define N2RNG_WD_TIMEO_DEFAULT 0
97
98 u64 scratch_control[HV_RNG_NUM_CONTROL];
99
100#define SELFTEST_TICKS 38859
101#define SELFTEST_VAL ((u64)0xB8820C7BD387E32C)
102#define SELFTEST_POLY ((u64)0x231DCEE91262B8A3)
103#define SELFTEST_MATCH_GOAL 6
104#define SELFTEST_LOOPS_MAX 40000
105#define SELFTEST_BUFFER_WORDS 8
106
107 u64 test_data;
108 u64 test_control[HV_RNG_NUM_CONTROL];
109 u64 test_buffer[SELFTEST_BUFFER_WORDS];
110};
111
112#define N2RNG_BLOCK_LIMIT 60000
113#define N2RNG_BUSY_LIMIT 100
114#define N2RNG_HCHECK_LIMIT 100
115
116#endif /* !(__ASSEMBLY__) */
117
118#endif /* _N2RNG_H */
diff --git a/drivers/char/ip2/ip2main.c b/drivers/char/ip2/ip2main.c
index 5dc74404058f..9cb48fcd316c 100644
--- a/drivers/char/ip2/ip2main.c
+++ b/drivers/char/ip2/ip2main.c
@@ -718,12 +718,12 @@ ip2_loadmain(int *iop, int *irqp)
718 } 718 }
719 719
720 if ( NULL != ( pB = i2BoardPtrTable[i] ) ) { 720 if ( NULL != ( pB = i2BoardPtrTable[i] ) ) {
721 device_create(ip2_class, NULL, 721 device_create_drvdata(ip2_class, NULL,
722 MKDEV(IP2_IPL_MAJOR, 4 * i), 722 MKDEV(IP2_IPL_MAJOR, 4 * i),
723 "ipl%d", i); 723 NULL, "ipl%d", i);
724 device_create(ip2_class, NULL, 724 device_create_drvdata(ip2_class, NULL,
725 MKDEV(IP2_IPL_MAJOR, 4 * i + 1), 725 MKDEV(IP2_IPL_MAJOR, 4 * i + 1),
726 "stat%d", i); 726 NULL, "stat%d", i);
727 727
728 for ( box = 0; box < ABS_MAX_BOXES; ++box ) 728 for ( box = 0; box < ABS_MAX_BOXES; ++box )
729 { 729 {
diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c
index c11a40483459..64e1c169e826 100644
--- a/drivers/char/ipmi/ipmi_devintf.c
+++ b/drivers/char/ipmi/ipmi_devintf.c
@@ -871,7 +871,7 @@ static void ipmi_new_smi(int if_num, struct device *device)
871 entry->dev = dev; 871 entry->dev = dev;
872 872
873 mutex_lock(&reg_list_mutex); 873 mutex_lock(&reg_list_mutex);
874 device_create(ipmi_class, device, dev, "ipmi%d", if_num); 874 device_create_drvdata(ipmi_class, device, dev, NULL, "ipmi%d", if_num);
875 list_add(&entry->link, &reg_list); 875 list_add(&entry->link, &reg_list);
876 mutex_unlock(&reg_list_mutex); 876 mutex_unlock(&reg_list_mutex);
877} 877}
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c
index d4281df10c22..8f7cc190b62d 100644
--- a/drivers/char/isicom.c
+++ b/drivers/char/isicom.c
@@ -1181,14 +1181,17 @@ static int isicom_chars_in_buffer(struct tty_struct *tty)
1181} 1181}
1182 1182
1183/* ioctl et all */ 1183/* ioctl et all */
1184static inline void isicom_send_break(struct isi_port *port, 1184static int isicom_send_break(struct tty_struct *tty, int length)
1185 unsigned long length)
1186{ 1185{
1186 struct isi_port *port = tty->driver_data;
1187 struct isi_board *card = port->card; 1187 struct isi_board *card = port->card;
1188 unsigned long base = card->base; 1188 unsigned long base = card->base;
1189 1189
1190 if (length == -1)
1191 return -EOPNOTSUPP;
1192
1190 if (!lock_card(card)) 1193 if (!lock_card(card))
1191 return; 1194 return -EINVAL;
1192 1195
1193 outw(0x8000 | ((port->channel) << (card->shift_count)) | 0x3, base); 1196 outw(0x8000 | ((port->channel) << (card->shift_count)) | 0x3, base);
1194 outw((length & 0xff) << 8 | 0x00, base); 1197 outw((length & 0xff) << 8 | 0x00, base);
@@ -1196,6 +1199,7 @@ static inline void isicom_send_break(struct isi_port *port,
1196 InterruptTheCard(base); 1199 InterruptTheCard(base);
1197 1200
1198 unlock_card(card); 1201 unlock_card(card);
1202 return 0;
1199} 1203}
1200 1204
1201static int isicom_tiocmget(struct tty_struct *tty, struct file *file) 1205static int isicom_tiocmget(struct tty_struct *tty, struct file *file)
@@ -1305,28 +1309,11 @@ static int isicom_ioctl(struct tty_struct *tty, struct file *filp,
1305{ 1309{
1306 struct isi_port *port = tty->driver_data; 1310 struct isi_port *port = tty->driver_data;
1307 void __user *argp = (void __user *)arg; 1311 void __user *argp = (void __user *)arg;
1308 int retval;
1309 1312
1310 if (isicom_paranoia_check(port, tty->name, "isicom_ioctl")) 1313 if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
1311 return -ENODEV; 1314 return -ENODEV;
1312 1315
1313 switch (cmd) { 1316 switch (cmd) {
1314 case TCSBRK:
1315 retval = tty_check_change(tty);
1316 if (retval)
1317 return retval;
1318 tty_wait_until_sent(tty, 0);
1319 if (!arg)
1320 isicom_send_break(port, HZ/4);
1321 return 0;
1322
1323 case TCSBRKP:
1324 retval = tty_check_change(tty);
1325 if (retval)
1326 return retval;
1327 tty_wait_until_sent(tty, 0);
1328 isicom_send_break(port, arg ? arg * (HZ/10) : HZ/4);
1329 return 0;
1330 case TIOCGSERIAL: 1317 case TIOCGSERIAL:
1331 return isicom_get_serial_info(port, argp); 1318 return isicom_get_serial_info(port, argp);
1332 1319
@@ -1459,6 +1446,7 @@ static const struct tty_operations isicom_ops = {
1459 .flush_buffer = isicom_flush_buffer, 1446 .flush_buffer = isicom_flush_buffer,
1460 .tiocmget = isicom_tiocmget, 1447 .tiocmget = isicom_tiocmget,
1461 .tiocmset = isicom_tiocmset, 1448 .tiocmset = isicom_tiocmset,
1449 .break_ctl = isicom_send_break,
1462}; 1450};
1463 1451
1464static int __devinit reset_card(struct pci_dev *pdev, 1452static int __devinit reset_card(struct pci_dev *pdev,
@@ -1832,7 +1820,7 @@ static int __init isicom_init(void)
1832 isicom_normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | 1820 isicom_normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
1833 CLOCAL; 1821 CLOCAL;
1834 isicom_normal->flags = TTY_DRIVER_REAL_RAW | 1822 isicom_normal->flags = TTY_DRIVER_REAL_RAW |
1835 TTY_DRIVER_DYNAMIC_DEV; 1823 TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_HARDWARE_BREAK;
1836 tty_set_operations(isicom_normal, &isicom_ops); 1824 tty_set_operations(isicom_normal, &isicom_ops);
1837 1825
1838 retval = tty_register_driver(isicom_normal); 1826 retval = tty_register_driver(isicom_normal);
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c
index 6ef1c565705c..843a2afaf204 100644
--- a/drivers/char/istallion.c
+++ b/drivers/char/istallion.c
@@ -598,7 +598,7 @@ static int stli_parsebrd(struct stlconf *confp, char **argp);
598static int stli_open(struct tty_struct *tty, struct file *filp); 598static int stli_open(struct tty_struct *tty, struct file *filp);
599static void stli_close(struct tty_struct *tty, struct file *filp); 599static void stli_close(struct tty_struct *tty, struct file *filp);
600static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count); 600static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count);
601static void stli_putchar(struct tty_struct *tty, unsigned char ch); 601static int stli_putchar(struct tty_struct *tty, unsigned char ch);
602static void stli_flushchars(struct tty_struct *tty); 602static void stli_flushchars(struct tty_struct *tty);
603static int stli_writeroom(struct tty_struct *tty); 603static int stli_writeroom(struct tty_struct *tty);
604static int stli_charsinbuffer(struct tty_struct *tty); 604static int stli_charsinbuffer(struct tty_struct *tty);
@@ -609,7 +609,7 @@ static void stli_unthrottle(struct tty_struct *tty);
609static void stli_stop(struct tty_struct *tty); 609static void stli_stop(struct tty_struct *tty);
610static void stli_start(struct tty_struct *tty); 610static void stli_start(struct tty_struct *tty);
611static void stli_flushbuffer(struct tty_struct *tty); 611static void stli_flushbuffer(struct tty_struct *tty);
612static void stli_breakctl(struct tty_struct *tty, int state); 612static int stli_breakctl(struct tty_struct *tty, int state);
613static void stli_waituntilsent(struct tty_struct *tty, int timeout); 613static void stli_waituntilsent(struct tty_struct *tty, int timeout);
614static void stli_sendxchar(struct tty_struct *tty, char ch); 614static void stli_sendxchar(struct tty_struct *tty, char ch);
615static void stli_hangup(struct tty_struct *tty); 615static void stli_hangup(struct tty_struct *tty);
@@ -826,7 +826,7 @@ static int stli_open(struct tty_struct *tty, struct file *filp)
826 */ 826 */
827 portp->port.tty = tty; 827 portp->port.tty = tty;
828 tty->driver_data = portp; 828 tty->driver_data = portp;
829 portp->refcount++; 829 portp->port.count++;
830 830
831 wait_event_interruptible(portp->raw_wait, 831 wait_event_interruptible(portp->raw_wait,
832 !test_bit(ST_INITIALIZING, &portp->state)); 832 !test_bit(ST_INITIALIZING, &portp->state));
@@ -888,9 +888,9 @@ static void stli_close(struct tty_struct *tty, struct file *filp)
888 spin_unlock_irqrestore(&stli_lock, flags); 888 spin_unlock_irqrestore(&stli_lock, flags);
889 return; 889 return;
890 } 890 }
891 if ((tty->count == 1) && (portp->refcount != 1)) 891 if ((tty->count == 1) && (portp->port.count != 1))
892 portp->refcount = 1; 892 portp->port.count = 1;
893 if (portp->refcount-- > 1) { 893 if (portp->port.count-- > 1) {
894 spin_unlock_irqrestore(&stli_lock, flags); 894 spin_unlock_irqrestore(&stli_lock, flags);
895 return; 895 return;
896 } 896 }
@@ -925,8 +925,7 @@ static void stli_close(struct tty_struct *tty, struct file *filp)
925 clear_bit(ST_TXBUSY, &portp->state); 925 clear_bit(ST_TXBUSY, &portp->state);
926 clear_bit(ST_RXSTOP, &portp->state); 926 clear_bit(ST_RXSTOP, &portp->state);
927 set_bit(TTY_IO_ERROR, &tty->flags); 927 set_bit(TTY_IO_ERROR, &tty->flags);
928 if (tty->ldisc.flush_buffer) 928 tty_ldisc_flush(tty);
929 (tty->ldisc.flush_buffer)(tty);
930 set_bit(ST_DOFLUSHRX, &portp->state); 929 set_bit(ST_DOFLUSHRX, &portp->state);
931 stli_flushbuffer(tty); 930 stli_flushbuffer(tty);
932 931
@@ -1202,7 +1201,7 @@ static int stli_waitcarrier(struct stlibrd *brdp, struct stliport *portp, struct
1202 spin_lock_irqsave(&stli_lock, flags); 1201 spin_lock_irqsave(&stli_lock, flags);
1203 portp->openwaitcnt++; 1202 portp->openwaitcnt++;
1204 if (! tty_hung_up_p(filp)) 1203 if (! tty_hung_up_p(filp))
1205 portp->refcount--; 1204 portp->port.count--;
1206 spin_unlock_irqrestore(&stli_lock, flags); 1205 spin_unlock_irqrestore(&stli_lock, flags);
1207 1206
1208 for (;;) { 1207 for (;;) {
@@ -1231,7 +1230,7 @@ static int stli_waitcarrier(struct stlibrd *brdp, struct stliport *portp, struct
1231 1230
1232 spin_lock_irqsave(&stli_lock, flags); 1231 spin_lock_irqsave(&stli_lock, flags);
1233 if (! tty_hung_up_p(filp)) 1232 if (! tty_hung_up_p(filp))
1234 portp->refcount++; 1233 portp->port.count++;
1235 portp->openwaitcnt--; 1234 portp->openwaitcnt--;
1236 spin_unlock_irqrestore(&stli_lock, flags); 1235 spin_unlock_irqrestore(&stli_lock, flags);
1237 1236
@@ -1333,7 +1332,7 @@ static int stli_write(struct tty_struct *tty, const unsigned char *buf, int coun
1333 * first them do the new ports. 1332 * first them do the new ports.
1334 */ 1333 */
1335 1334
1336static void stli_putchar(struct tty_struct *tty, unsigned char ch) 1335static int stli_putchar(struct tty_struct *tty, unsigned char ch)
1337{ 1336{
1338 if (tty != stli_txcooktty) { 1337 if (tty != stli_txcooktty) {
1339 if (stli_txcooktty != NULL) 1338 if (stli_txcooktty != NULL)
@@ -1342,6 +1341,7 @@ static void stli_putchar(struct tty_struct *tty, unsigned char ch)
1342 } 1341 }
1343 1342
1344 stli_txcookbuf[stli_txcooksize++] = ch; 1343 stli_txcookbuf[stli_txcooksize++] = ch;
1344 return 0;
1345} 1345}
1346 1346
1347/*****************************************************************************/ 1347/*****************************************************************************/
@@ -1660,7 +1660,6 @@ static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cm
1660{ 1660{
1661 struct stliport *portp; 1661 struct stliport *portp;
1662 struct stlibrd *brdp; 1662 struct stlibrd *brdp;
1663 unsigned int ival;
1664 int rc; 1663 int rc;
1665 void __user *argp = (void __user *)arg; 1664 void __user *argp = (void __user *)arg;
1666 1665
@@ -1857,7 +1856,7 @@ static void stli_hangup(struct tty_struct *tty)
1857 set_bit(TTY_IO_ERROR, &tty->flags); 1856 set_bit(TTY_IO_ERROR, &tty->flags);
1858 portp->port.tty = NULL; 1857 portp->port.tty = NULL;
1859 portp->port.flags &= ~ASYNC_NORMAL_ACTIVE; 1858 portp->port.flags &= ~ASYNC_NORMAL_ACTIVE;
1860 portp->refcount = 0; 1859 portp->port.count = 0;
1861 spin_unlock_irqrestore(&stli_lock, flags); 1860 spin_unlock_irqrestore(&stli_lock, flags);
1862 1861
1863 wake_up_interruptible(&portp->port.open_wait); 1862 wake_up_interruptible(&portp->port.open_wait);
@@ -1909,7 +1908,7 @@ static void stli_flushbuffer(struct tty_struct *tty)
1909 1908
1910/*****************************************************************************/ 1909/*****************************************************************************/
1911 1910
1912static void stli_breakctl(struct tty_struct *tty, int state) 1911static int stli_breakctl(struct tty_struct *tty, int state)
1913{ 1912{
1914 struct stlibrd *brdp; 1913 struct stlibrd *brdp;
1915 struct stliport *portp; 1914 struct stliport *portp;
@@ -1917,15 +1916,16 @@ static void stli_breakctl(struct tty_struct *tty, int state)
1917 1916
1918 portp = tty->driver_data; 1917 portp = tty->driver_data;
1919 if (portp == NULL) 1918 if (portp == NULL)
1920 return; 1919 return -EINVAL;
1921 if (portp->brdnr >= stli_nrbrds) 1920 if (portp->brdnr >= stli_nrbrds)
1922 return; 1921 return -EINVAL;
1923 brdp = stli_brds[portp->brdnr]; 1922 brdp = stli_brds[portp->brdnr];
1924 if (brdp == NULL) 1923 if (brdp == NULL)
1925 return; 1924 return -EINVAL;
1926 1925
1927 arg = (state == -1) ? BREAKON : BREAKOFF; 1926 arg = (state == -1) ? BREAKON : BREAKOFF;
1928 stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0); 1927 stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0);
1928 return 0;
1929} 1929}
1930 1930
1931/*****************************************************************************/ 1931/*****************************************************************************/
@@ -4246,7 +4246,7 @@ static int stli_portcmdstats(struct stliport *portp)
4246 stli_comstats.panel = portp->panelnr; 4246 stli_comstats.panel = portp->panelnr;
4247 stli_comstats.port = portp->portnr; 4247 stli_comstats.port = portp->portnr;
4248 stli_comstats.state = portp->state; 4248 stli_comstats.state = portp->state;
4249 stli_comstats.flags = portp->port.flag; 4249 stli_comstats.flags = portp->port.flags;
4250 4250
4251 spin_lock_irqsave(&brd_lock, flags); 4251 spin_lock_irqsave(&brd_lock, flags);
4252 if (portp->port.tty != NULL) { 4252 if (portp->port.tty != NULL) {
@@ -4599,8 +4599,9 @@ static int __init istallion_module_init(void)
4599 4599
4600 istallion_class = class_create(THIS_MODULE, "staliomem"); 4600 istallion_class = class_create(THIS_MODULE, "staliomem");
4601 for (i = 0; i < 4; i++) 4601 for (i = 0; i < 4; i++)
4602 device_create(istallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i), 4602 device_create_drvdata(istallion_class, NULL,
4603 "staliomem%d", i); 4603 MKDEV(STL_SIOMEMMAJOR, i),
4604 NULL, "staliomem%d", i);
4604 4605
4605 return 0; 4606 return 0;
4606err_deinit: 4607err_deinit:
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index d9a0a53c842d..7b3a212c86b1 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -46,6 +46,8 @@
46 46
47extern void ctrl_alt_del(void); 47extern void ctrl_alt_del(void);
48 48
49#define to_handle_h(n) container_of(n, struct input_handle, h_node)
50
49/* 51/*
50 * Exported functions/variables 52 * Exported functions/variables
51 */ 53 */
diff --git a/drivers/char/lcd.c b/drivers/char/lcd.c
deleted file mode 100644
index 1c29b20e4f4c..000000000000
--- a/drivers/char/lcd.c
+++ /dev/null
@@ -1,516 +0,0 @@
1/*
2 * LCD, LED and Button interface for Cobalt
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 *
8 * Copyright (C) 1996, 1997 by Andrew Bose
9 *
10 * Linux kernel version history:
11 * March 2001: Ported from 2.0.34 by Liam Davies
12 *
13 */
14#include <linux/types.h>
15#include <linux/errno.h>
16#include <linux/miscdevice.h>
17#include <linux/slab.h>
18#include <linux/ioport.h>
19#include <linux/fcntl.h>
20#include <linux/mc146818rtc.h>
21#include <linux/netdevice.h>
22#include <linux/sched.h>
23#include <linux/smp_lock.h>
24#include <linux/delay.h>
25
26#include <asm/io.h>
27#include <asm/uaccess.h>
28#include <asm/system.h>
29
30#include "lcd.h"
31
32static int lcd_ioctl(struct inode *inode, struct file *file,
33 unsigned int cmd, unsigned long arg);
34
35static unsigned int lcd_present = 1;
36
37/* used in arch/mips/cobalt/reset.c */
38int led_state = 0;
39
40#if defined(CONFIG_TULIP) && 0
41
42#define MAX_INTERFACES 8
43static linkcheck_func_t linkcheck_callbacks[MAX_INTERFACES];
44static void *linkcheck_cookies[MAX_INTERFACES];
45
46int lcd_register_linkcheck_func(int iface_num, void *func, void *cookie)
47{
48 if (iface_num < 0 ||
49 iface_num >= MAX_INTERFACES ||
50 linkcheck_callbacks[iface_num] != NULL)
51 return -1;
52 linkcheck_callbacks[iface_num] = (linkcheck_func_t) func;
53 linkcheck_cookies[iface_num] = cookie;
54 return 0;
55}
56#endif
57
58static int lcd_ioctl(struct inode *inode, struct file *file,
59 unsigned int cmd, unsigned long arg)
60{
61 struct lcd_display button_display;
62 unsigned long address, a;
63
64 switch (cmd) {
65 case LCD_On:
66 udelay(150);
67 BusyCheck();
68 LCDWriteInst(0x0F);
69 break;
70
71 case LCD_Off:
72 udelay(150);
73 BusyCheck();
74 LCDWriteInst(0x08);
75 break;
76
77 case LCD_Reset:
78 udelay(150);
79 LCDWriteInst(0x3F);
80 udelay(150);
81 LCDWriteInst(0x3F);
82 udelay(150);
83 LCDWriteInst(0x3F);
84 udelay(150);
85 LCDWriteInst(0x3F);
86 udelay(150);
87 LCDWriteInst(0x01);
88 udelay(150);
89 LCDWriteInst(0x06);
90 break;
91
92 case LCD_Clear:
93 udelay(150);
94 BusyCheck();
95 LCDWriteInst(0x01);
96 break;
97
98 case LCD_Cursor_Left:
99 udelay(150);
100 BusyCheck();
101 LCDWriteInst(0x10);
102 break;
103
104 case LCD_Cursor_Right:
105 udelay(150);
106 BusyCheck();
107 LCDWriteInst(0x14);
108 break;
109
110 case LCD_Cursor_Off:
111 udelay(150);
112 BusyCheck();
113 LCDWriteInst(0x0C);
114 break;
115
116 case LCD_Cursor_On:
117 udelay(150);
118 BusyCheck();
119 LCDWriteInst(0x0F);
120 break;
121
122 case LCD_Blink_Off:
123 udelay(150);
124 BusyCheck();
125 LCDWriteInst(0x0E);
126 break;
127
128 case LCD_Get_Cursor_Pos:{
129 struct lcd_display display;
130
131 udelay(150);
132 BusyCheck();
133 display.cursor_address = (LCDReadInst);
134 display.cursor_address =
135 (display.cursor_address & 0x07F);
136 if (copy_to_user
137 ((struct lcd_display *) arg, &display,
138 sizeof(struct lcd_display)))
139 return -EFAULT;
140
141 break;
142 }
143
144
145 case LCD_Set_Cursor_Pos:{
146 struct lcd_display display;
147
148 if (copy_from_user
149 (&display, (struct lcd_display *) arg,
150 sizeof(struct lcd_display)))
151 return -EFAULT;
152
153 a = (display.cursor_address | kLCD_Addr);
154
155 udelay(150);
156 BusyCheck();
157 LCDWriteInst(a);
158
159 break;
160 }
161
162 case LCD_Get_Cursor:{
163 struct lcd_display display;
164
165 udelay(150);
166 BusyCheck();
167 display.character = LCDReadData;
168
169 if (copy_to_user
170 ((struct lcd_display *) arg, &display,
171 sizeof(struct lcd_display)))
172 return -EFAULT;
173 udelay(150);
174 BusyCheck();
175 LCDWriteInst(0x10);
176
177 break;
178 }
179
180 case LCD_Set_Cursor:{
181 struct lcd_display display;
182
183 if (copy_from_user
184 (&display, (struct lcd_display *) arg,
185 sizeof(struct lcd_display)))
186 return -EFAULT;
187
188 udelay(150);
189 BusyCheck();
190 LCDWriteData(display.character);
191 udelay(150);
192 BusyCheck();
193 LCDWriteInst(0x10);
194
195 break;
196 }
197
198
199 case LCD_Disp_Left:
200 udelay(150);
201 BusyCheck();
202 LCDWriteInst(0x18);
203 break;
204
205 case LCD_Disp_Right:
206 udelay(150);
207 BusyCheck();
208 LCDWriteInst(0x1C);
209 break;
210
211 case LCD_Home:
212 udelay(150);
213 BusyCheck();
214 LCDWriteInst(0x02);
215 break;
216
217 case LCD_Write:{
218 struct lcd_display display;
219 unsigned int index;
220
221
222 if (copy_from_user
223 (&display, (struct lcd_display *) arg,
224 sizeof(struct lcd_display)))
225 return -EFAULT;
226
227 udelay(150);
228 BusyCheck();
229 LCDWriteInst(0x80);
230 udelay(150);
231 BusyCheck();
232
233 for (index = 0; index < (display.size1); index++) {
234 udelay(150);
235 BusyCheck();
236 LCDWriteData(display.line1[index]);
237 BusyCheck();
238 }
239
240 udelay(150);
241 BusyCheck();
242 LCDWriteInst(0xC0);
243 udelay(150);
244 BusyCheck();
245 for (index = 0; index < (display.size2); index++) {
246 udelay(150);
247 BusyCheck();
248 LCDWriteData(display.line2[index]);
249 }
250
251 break;
252 }
253
254 case LCD_Read:{
255 struct lcd_display display;
256
257 BusyCheck();
258 for (address = kDD_R00; address <= kDD_R01;
259 address++) {
260 a = (address | kLCD_Addr);
261
262 udelay(150);
263 BusyCheck();
264 LCDWriteInst(a);
265 udelay(150);
266 BusyCheck();
267 display.line1[address] = LCDReadData;
268 }
269
270 display.line1[0x27] = '\0';
271
272 for (address = kDD_R10; address <= kDD_R11;
273 address++) {
274 a = (address | kLCD_Addr);
275
276 udelay(150);
277 BusyCheck();
278 LCDWriteInst(a);
279
280 udelay(150);
281 BusyCheck();
282 display.line2[address - 0x40] =
283 LCDReadData;
284 }
285
286 display.line2[0x27] = '\0';
287
288 if (copy_to_user
289 ((struct lcd_display *) arg, &display,
290 sizeof(struct lcd_display)))
291 return -EFAULT;
292 break;
293 }
294
295// set all GPIO leds to led_display.leds
296
297 case LED_Set:{
298 struct lcd_display led_display;
299
300
301 if (copy_from_user
302 (&led_display, (struct lcd_display *) arg,
303 sizeof(struct lcd_display)))
304 return -EFAULT;
305
306 led_state = led_display.leds;
307 LEDSet(led_state);
308
309 break;
310 }
311
312
313// set only bit led_display.leds
314
315 case LED_Bit_Set:{
316 unsigned int i;
317 int bit = 1;
318 struct lcd_display led_display;
319
320
321 if (copy_from_user
322 (&led_display, (struct lcd_display *) arg,
323 sizeof(struct lcd_display)))
324 return -EFAULT;
325
326 for (i = 0; i < (int) led_display.leds; i++) {
327 bit = 2 * bit;
328 }
329
330 led_state = led_state | bit;
331 LEDSet(led_state);
332 break;
333 }
334
335// clear only bit led_display.leds
336
337 case LED_Bit_Clear:{
338 unsigned int i;
339 int bit = 1;
340 struct lcd_display led_display;
341
342
343 if (copy_from_user
344 (&led_display, (struct lcd_display *) arg,
345 sizeof(struct lcd_display)))
346 return -EFAULT;
347
348 for (i = 0; i < (int) led_display.leds; i++) {
349 bit = 2 * bit;
350 }
351
352 led_state = led_state & ~bit;
353 LEDSet(led_state);
354 break;
355 }
356
357
358 case BUTTON_Read:{
359 button_display.buttons = GPIRead;
360 if (copy_to_user
361 ((struct lcd_display *) arg, &button_display,
362 sizeof(struct lcd_display)))
363 return -EFAULT;
364 break;
365 }
366
367 case LINK_Check:{
368 button_display.buttons =
369 *((volatile unsigned long *) (0xB0100060));
370 if (copy_to_user
371 ((struct lcd_display *) arg, &button_display,
372 sizeof(struct lcd_display)))
373 return -EFAULT;
374 break;
375 }
376
377 case LINK_Check_2:{
378 int iface_num;
379
380 /* panel-utils should pass in the desired interface status is wanted for
381 * in "buttons" of the structure. We will set this to non-zero if the
382 * link is in fact up for the requested interface. --DaveM
383 */
384 if (copy_from_user
385 (&button_display, (struct lcd_display *) arg,
386 sizeof(button_display)))
387 return -EFAULT;
388 iface_num = button_display.buttons;
389#if defined(CONFIG_TULIP) && 0
390 if (iface_num >= 0 &&
391 iface_num < MAX_INTERFACES &&
392 linkcheck_callbacks[iface_num] != NULL) {
393 button_display.buttons =
394 linkcheck_callbacks[iface_num]
395 (linkcheck_cookies[iface_num]);
396 } else
397#endif
398 button_display.buttons = 0;
399
400 if (__copy_to_user
401 ((struct lcd_display *) arg, &button_display,
402 sizeof(struct lcd_display)))
403 return -EFAULT;
404 break;
405 }
406
407 default:
408 return -EINVAL;
409
410 }
411
412 return 0;
413
414}
415
416static int lcd_open(struct inode *inode, struct file *file)
417{
418 cycle_kernel_lock();
419
420 if (!lcd_present)
421 return -ENXIO;
422 else
423 return 0;
424}
425
426/* Only RESET or NEXT counts as button pressed */
427
428static inline int button_pressed(void)
429{
430 unsigned long buttons = GPIRead;
431
432 if ((buttons == BUTTON_Next) || (buttons == BUTTON_Next_B)
433 || (buttons == BUTTON_Reset_B))
434 return buttons;
435 return 0;
436}
437
438/* LED daemon sits on this and we wake him up once a key is pressed. */
439
440static int lcd_waiters = 0;
441
442static ssize_t lcd_read(struct file *file, char *buf,
443 size_t count, loff_t *ofs)
444{
445 long buttons_now;
446
447 if (lcd_waiters > 0)
448 return -EINVAL;
449
450 lcd_waiters++;
451 while (((buttons_now = (long) button_pressed()) == 0) &&
452 !(signal_pending(current))) {
453 msleep_interruptible(2000);
454 }
455 lcd_waiters--;
456
457 if (signal_pending(current))
458 return -ERESTARTSYS;
459 return buttons_now;
460}
461
462/*
463 * The various file operations we support.
464 */
465
466static const struct file_operations lcd_fops = {
467 .read = lcd_read,
468 .ioctl = lcd_ioctl,
469 .open = lcd_open,
470};
471
472static struct miscdevice lcd_dev = {
473 MISC_DYNAMIC_MINOR,
474 "lcd",
475 &lcd_fops
476};
477
478static int lcd_init(void)
479{
480 int ret;
481 unsigned long data;
482
483 pr_info("%s\n", LCD_DRIVER);
484 ret = misc_register(&lcd_dev);
485 if (ret) {
486 printk(KERN_WARNING LCD "Unable to register misc device.\n");
487 return ret;
488 }
489
490 /* Check region? Naaah! Just snarf it up. */
491/* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/
492
493 udelay(150);
494 data = LCDReadData;
495 if ((data & 0x000000FF) == (0x00)) {
496 lcd_present = 0;
497 pr_info(LCD "LCD Not Present\n");
498 } else {
499 lcd_present = 1;
500 WRITE_GAL(kGal_DevBank2PReg, kGal_DevBank2Cfg);
501 WRITE_GAL(kGal_DevBank3PReg, kGal_DevBank3Cfg);
502 }
503
504 return 0;
505}
506
507static void __exit lcd_exit(void)
508{
509 misc_deregister(&lcd_dev);
510}
511
512module_init(lcd_init);
513module_exit(lcd_exit);
514
515MODULE_AUTHOR("Andrew Bose");
516MODULE_LICENSE("GPL");
diff --git a/drivers/char/lcd.h b/drivers/char/lcd.h
deleted file mode 100644
index 290b3ff23b03..000000000000
--- a/drivers/char/lcd.h
+++ /dev/null
@@ -1,154 +0,0 @@
1/*
2 * LED, LCD and Button panel driver for Cobalt
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 *
8 * Copyright (C) 1996, 1997 by Andrew Bose
9 *
10 * Linux kernel version history:
11 * March 2001: Ported from 2.0.34 by Liam Davies
12 *
13 */
14
15// function headers
16
17#define LCD_CHARS_PER_LINE 40
18#define MAX_IDLE_TIME 120
19
20struct lcd_display {
21 unsigned buttons;
22 int size1;
23 int size2;
24 unsigned char line1[LCD_CHARS_PER_LINE];
25 unsigned char line2[LCD_CHARS_PER_LINE];
26 unsigned char cursor_address;
27 unsigned char character;
28 unsigned char leds;
29 unsigned char *RomImage;
30};
31
32
33
34#define LCD_DRIVER "Cobalt LCD Driver v2.10"
35
36#define LCD "lcd: "
37
38#define kLCD_IR 0x0F000000
39#define kLCD_DR 0x0F000010
40#define kGPI 0x0D000000
41#define kLED 0x0C000000
42
43#define kDD_R00 0x00
44#define kDD_R01 0x27
45#define kDD_R10 0x40
46#define kDD_R11 0x67
47
48#define kLCD_Addr 0x00000080
49
50#define LCDTimeoutValue 0xfff
51
52
53// Macros
54
55#define LCDWriteData(x) outl((x << 24), kLCD_DR)
56#define LCDWriteInst(x) outl((x << 24), kLCD_IR)
57
58#define LCDReadData (inl(kLCD_DR) >> 24)
59#define LCDReadInst (inl(kLCD_IR) >> 24)
60
61#define GPIRead (inl(kGPI) >> 24)
62
63#define LEDSet(x) outb((char)x, kLED)
64
65#define WRITE_GAL(x,y) outl(y, 0x04000000 | (x))
66#define BusyCheck() while ((LCDReadInst & 0x80) == 0x80)
67
68
69
70/*
71 * Function command codes for io_ctl.
72 */
73#define LCD_On 1
74#define LCD_Off 2
75#define LCD_Clear 3
76#define LCD_Reset 4
77#define LCD_Cursor_Left 5
78#define LCD_Cursor_Right 6
79#define LCD_Disp_Left 7
80#define LCD_Disp_Right 8
81#define LCD_Get_Cursor 9
82#define LCD_Set_Cursor 10
83#define LCD_Home 11
84#define LCD_Read 12
85#define LCD_Write 13
86#define LCD_Cursor_Off 14
87#define LCD_Cursor_On 15
88#define LCD_Get_Cursor_Pos 16
89#define LCD_Set_Cursor_Pos 17
90#define LCD_Blink_Off 18
91
92#define LED_Set 40
93#define LED_Bit_Set 41
94#define LED_Bit_Clear 42
95
96
97// Button defs
98#define BUTTON_Read 50
99
100
101// Ethernet LINK check hackaroo
102#define LINK_Check 90
103#define LINK_Check_2 91
104
105// Button patterns _B - single layer lcd boards
106
107#define BUTTON_NONE 0x3F
108#define BUTTON_NONE_B 0xFE
109
110#define BUTTON_Left 0x3B
111#define BUTTON_Left_B 0xFA
112
113#define BUTTON_Right 0x37
114#define BUTTON_Right_B 0xDE
115
116#define BUTTON_Up 0x2F
117#define BUTTON_Up_B 0xF6
118
119#define BUTTON_Down 0x1F
120#define BUTTON_Down_B 0xEE
121
122#define BUTTON_Next 0x3D
123#define BUTTON_Next_B 0x7E
124
125#define BUTTON_Enter 0x3E
126#define BUTTON_Enter_B 0xBE
127
128#define BUTTON_Reset_B 0xFC
129
130
131// debounce constants
132
133#define BUTTON_SENSE 160000
134#define BUTTON_DEBOUNCE 5000
135
136
137// Galileo register stuff
138
139#define kGal_DevBank2Cfg 0x1466DB33
140#define kGal_DevBank2PReg 0x464
141#define kGal_DevBank3Cfg 0x146FDFFB
142#define kGal_DevBank3PReg 0x468
143
144// Network
145
146#define kIPADDR 1
147#define kNETMASK 2
148#define kGATEWAY 3
149#define kDNS 4
150
151#define kClassA 5
152#define kClassB 6
153#define kClassC 7
154
diff --git a/drivers/char/lp.c b/drivers/char/lp.c
index 71abb4c33aa2..3f2719b9f77b 100644
--- a/drivers/char/lp.c
+++ b/drivers/char/lp.c
@@ -813,7 +813,8 @@ static int lp_register(int nr, struct parport *port)
813 if (reset) 813 if (reset)
814 lp_reset(nr); 814 lp_reset(nr);
815 815
816 device_create(lp_class, port->dev, MKDEV(LP_MAJOR, nr), "lp%d", nr); 816 device_create_drvdata(lp_class, port->dev, MKDEV(LP_MAJOR, nr), NULL,
817 "lp%d", nr);
817 818
818 printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, 819 printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name,
819 (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven"); 820 (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 070e22e8ea9e..672b08e694d0 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -80,7 +80,7 @@ static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
80} 80}
81#endif 81#endif
82 82
83#ifdef CONFIG_NONPROMISC_DEVMEM 83#ifdef CONFIG_STRICT_DEVMEM
84static inline int range_is_allowed(unsigned long pfn, unsigned long size) 84static inline int range_is_allowed(unsigned long pfn, unsigned long size)
85{ 85{
86 u64 from = ((u64)pfn) << PAGE_SHIFT; 86 u64 from = ((u64)pfn) << PAGE_SHIFT;
@@ -327,7 +327,10 @@ static void mmap_mem_close(struct vm_area_struct *vma)
327 327
328static struct vm_operations_struct mmap_mem_ops = { 328static struct vm_operations_struct mmap_mem_ops = {
329 .open = mmap_mem_open, 329 .open = mmap_mem_open,
330 .close = mmap_mem_close 330 .close = mmap_mem_close,
331#ifdef CONFIG_HAVE_IOREMAP_PROT
332 .access = generic_access_phys
333#endif
331}; 334};
332 335
333static int mmap_mem(struct file * file, struct vm_area_struct * vma) 336static int mmap_mem(struct file * file, struct vm_area_struct * vma)
@@ -989,9 +992,9 @@ static int __init chr_dev_init(void)
989 992
990 mem_class = class_create(THIS_MODULE, "mem"); 993 mem_class = class_create(THIS_MODULE, "mem");
991 for (i = 0; i < ARRAY_SIZE(devlist); i++) 994 for (i = 0; i < ARRAY_SIZE(devlist); i++)
992 device_create(mem_class, NULL, 995 device_create_drvdata(mem_class, NULL,
993 MKDEV(MEM_MAJOR, devlist[i].minor), 996 MKDEV(MEM_MAJOR, devlist[i].minor),
994 devlist[i].name); 997 NULL, devlist[i].name);
995 998
996 return 0; 999 return 0;
997} 1000}
diff --git a/drivers/char/misc.c b/drivers/char/misc.c
index 6e1563c3d30a..999aa779c08a 100644
--- a/drivers/char/misc.c
+++ b/drivers/char/misc.c
@@ -217,8 +217,8 @@ int misc_register(struct miscdevice * misc)
217 misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7); 217 misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
218 dev = MKDEV(MISC_MAJOR, misc->minor); 218 dev = MKDEV(MISC_MAJOR, misc->minor);
219 219
220 misc->this_device = device_create(misc_class, misc->parent, dev, 220 misc->this_device = device_create_drvdata(misc_class, misc->parent,
221 "%s", misc->name); 221 dev, NULL, "%s", misc->name);
222 if (IS_ERR(misc->this_device)) { 222 if (IS_ERR(misc->this_device)) {
223 err = PTR_ERR(misc->this_device); 223 err = PTR_ERR(misc->this_device);
224 goto out; 224 goto out;
diff --git a/drivers/char/mmtimer.c b/drivers/char/mmtimer.c
index 192961fd7173..918711aa56f3 100644
--- a/drivers/char/mmtimer.c
+++ b/drivers/char/mmtimer.c
@@ -32,6 +32,7 @@
32#include <linux/interrupt.h> 32#include <linux/interrupt.h>
33#include <linux/time.h> 33#include <linux/time.h>
34#include <linux/math64.h> 34#include <linux/math64.h>
35#include <linux/smp_lock.h>
35 36
36#include <asm/uaccess.h> 37#include <asm/uaccess.h>
37#include <asm/sn/addrs.h> 38#include <asm/sn/addrs.h>
@@ -57,8 +58,8 @@ extern unsigned long sn_rtc_cycles_per_second;
57 58
58#define rtc_time() (*RTC_COUNTER_ADDR) 59#define rtc_time() (*RTC_COUNTER_ADDR)
59 60
60static int mmtimer_ioctl(struct inode *inode, struct file *file, 61static long mmtimer_ioctl(struct file *file, unsigned int cmd,
61 unsigned int cmd, unsigned long arg); 62 unsigned long arg);
62static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma); 63static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma);
63 64
64/* 65/*
@@ -67,9 +68,9 @@ static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma);
67static unsigned long mmtimer_femtoperiod = 0; 68static unsigned long mmtimer_femtoperiod = 0;
68 69
69static const struct file_operations mmtimer_fops = { 70static const struct file_operations mmtimer_fops = {
70 .owner = THIS_MODULE, 71 .owner = THIS_MODULE,
71 .mmap = mmtimer_mmap, 72 .mmap = mmtimer_mmap,
72 .ioctl = mmtimer_ioctl, 73 .unlocked_ioctl = mmtimer_ioctl,
73}; 74};
74 75
75/* 76/*
@@ -339,7 +340,6 @@ restart:
339 340
340/** 341/**
341 * mmtimer_ioctl - ioctl interface for /dev/mmtimer 342 * mmtimer_ioctl - ioctl interface for /dev/mmtimer
342 * @inode: inode of the device
343 * @file: file structure for the device 343 * @file: file structure for the device
344 * @cmd: command to execute 344 * @cmd: command to execute
345 * @arg: optional argument to command 345 * @arg: optional argument to command
@@ -365,11 +365,13 @@ restart:
365 * %MMTIMER_GETCOUNTER - Gets the current value in the counter and places it 365 * %MMTIMER_GETCOUNTER - Gets the current value in the counter and places it
366 * in the address specified by @arg. 366 * in the address specified by @arg.
367 */ 367 */
368static int mmtimer_ioctl(struct inode *inode, struct file *file, 368static long mmtimer_ioctl(struct file *file, unsigned int cmd,
369 unsigned int cmd, unsigned long arg) 369 unsigned long arg)
370{ 370{
371 int ret = 0; 371 int ret = 0;
372 372
373 lock_kernel();
374
373 switch (cmd) { 375 switch (cmd) {
374 case MMTIMER_GETOFFSET: /* offset of the counter */ 376 case MMTIMER_GETOFFSET: /* offset of the counter */
375 /* 377 /*
@@ -384,15 +386,14 @@ static int mmtimer_ioctl(struct inode *inode, struct file *file,
384 case MMTIMER_GETRES: /* resolution of the clock in 10^-15 s */ 386 case MMTIMER_GETRES: /* resolution of the clock in 10^-15 s */
385 if(copy_to_user((unsigned long __user *)arg, 387 if(copy_to_user((unsigned long __user *)arg,
386 &mmtimer_femtoperiod, sizeof(unsigned long))) 388 &mmtimer_femtoperiod, sizeof(unsigned long)))
387 return -EFAULT; 389 ret = -EFAULT;
388 break; 390 break;
389 391
390 case MMTIMER_GETFREQ: /* frequency in Hz */ 392 case MMTIMER_GETFREQ: /* frequency in Hz */
391 if(copy_to_user((unsigned long __user *)arg, 393 if(copy_to_user((unsigned long __user *)arg,
392 &sn_rtc_cycles_per_second, 394 &sn_rtc_cycles_per_second,
393 sizeof(unsigned long))) 395 sizeof(unsigned long)))
394 return -EFAULT; 396 ret = -EFAULT;
395 ret = 0;
396 break; 397 break;
397 398
398 case MMTIMER_GETBITS: /* number of bits in the clock */ 399 case MMTIMER_GETBITS: /* number of bits in the clock */
@@ -406,13 +407,13 @@ static int mmtimer_ioctl(struct inode *inode, struct file *file,
406 case MMTIMER_GETCOUNTER: 407 case MMTIMER_GETCOUNTER:
407 if(copy_to_user((unsigned long __user *)arg, 408 if(copy_to_user((unsigned long __user *)arg,
408 RTC_COUNTER_ADDR, sizeof(unsigned long))) 409 RTC_COUNTER_ADDR, sizeof(unsigned long)))
409 return -EFAULT; 410 ret = -EFAULT;
410 break; 411 break;
411 default: 412 default:
412 ret = -ENOSYS; 413 ret = -ENOTTY;
413 break; 414 break;
414 } 415 }
415 416 unlock_kernel();
416 return ret; 417 return ret;
417} 418}
418 419
diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c
index 2bba250ffc8e..d3d7864e0c1e 100644
--- a/drivers/char/moxa.c
+++ b/drivers/char/moxa.c
@@ -374,12 +374,13 @@ copy:
374 return ret; 374 return ret;
375} 375}
376 376
377static void moxa_break_ctl(struct tty_struct *tty, int state) 377static int moxa_break_ctl(struct tty_struct *tty, int state)
378{ 378{
379 struct moxa_port *port = tty->driver_data; 379 struct moxa_port *port = tty->driver_data;
380 380
381 moxafunc(port->tableAddr, state ? FC_SendBreak : FC_StopBreak, 381 moxafunc(port->tableAddr, state ? FC_SendBreak : FC_StopBreak,
382 Magic_code); 382 Magic_code);
383 return 0;
383} 384}
384 385
385static const struct tty_operations moxa_ops = { 386static const struct tty_operations moxa_ops = {
diff --git a/drivers/char/mspec.c b/drivers/char/mspec.c
index fe2a95b5d3c0..30f095a8c2d4 100644
--- a/drivers/char/mspec.c
+++ b/drivers/char/mspec.c
@@ -193,25 +193,23 @@ mspec_close(struct vm_area_struct *vma)
193} 193}
194 194
195/* 195/*
196 * mspec_nopfn 196 * mspec_fault
197 * 197 *
198 * Creates a mspec page and maps it to user space. 198 * Creates a mspec page and maps it to user space.
199 */ 199 */
200static unsigned long 200static int
201mspec_nopfn(struct vm_area_struct *vma, unsigned long address) 201mspec_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
202{ 202{
203 unsigned long paddr, maddr; 203 unsigned long paddr, maddr;
204 unsigned long pfn; 204 unsigned long pfn;
205 int index; 205 pgoff_t index = vmf->pgoff;
206 struct vma_data *vdata = vma->vm_private_data; 206 struct vma_data *vdata = vma->vm_private_data;
207 207
208 BUG_ON(address < vdata->vm_start || address >= vdata->vm_end);
209 index = (address - vdata->vm_start) >> PAGE_SHIFT;
210 maddr = (volatile unsigned long) vdata->maddr[index]; 208 maddr = (volatile unsigned long) vdata->maddr[index];
211 if (maddr == 0) { 209 if (maddr == 0) {
212 maddr = uncached_alloc_page(numa_node_id(), 1); 210 maddr = uncached_alloc_page(numa_node_id(), 1);
213 if (maddr == 0) 211 if (maddr == 0)
214 return NOPFN_OOM; 212 return VM_FAULT_OOM;
215 213
216 spin_lock(&vdata->lock); 214 spin_lock(&vdata->lock);
217 if (vdata->maddr[index] == 0) { 215 if (vdata->maddr[index] == 0) {
@@ -231,13 +229,20 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address)
231 229
232 pfn = paddr >> PAGE_SHIFT; 230 pfn = paddr >> PAGE_SHIFT;
233 231
234 return pfn; 232 /*
233 * vm_insert_pfn can fail with -EBUSY, but in that case it will
234 * be because another thread has installed the pte first, so it
235 * is no problem.
236 */
237 vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
238
239 return VM_FAULT_NOPAGE;
235} 240}
236 241
237static struct vm_operations_struct mspec_vm_ops = { 242static struct vm_operations_struct mspec_vm_ops = {
238 .open = mspec_open, 243 .open = mspec_open,
239 .close = mspec_close, 244 .close = mspec_close,
240 .nopfn = mspec_nopfn 245 .fault = mspec_fault,
241}; 246};
242 247
243/* 248/*
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c
index 6307e301bd26..4c756bbba948 100644
--- a/drivers/char/mxser.c
+++ b/drivers/char/mxser.c
@@ -47,7 +47,7 @@
47 47
48#include "mxser.h" 48#include "mxser.h"
49 49
50#define MXSER_VERSION "2.0.3" /* 1.11 */ 50#define MXSER_VERSION "2.0.4" /* 1.12 */
51#define MXSERMAJOR 174 51#define MXSERMAJOR 174
52#define MXSERCUMAJOR 175 52#define MXSERCUMAJOR 175
53 53
@@ -71,12 +71,13 @@
71#define UART_MCR_AFE 0x20 71#define UART_MCR_AFE 0x20
72#define UART_LSR_SPECIAL 0x1E 72#define UART_LSR_SPECIAL 0x1E
73 73
74#define PCI_DEVICE_ID_POS104UL 0x1044
74#define PCI_DEVICE_ID_CB108 0x1080 75#define PCI_DEVICE_ID_CB108 0x1080
76#define PCI_DEVICE_ID_CP102UF 0x1023
75#define PCI_DEVICE_ID_CB114 0x1142 77#define PCI_DEVICE_ID_CB114 0x1142
76#define PCI_DEVICE_ID_CP114UL 0x1143 78#define PCI_DEVICE_ID_CP114UL 0x1143
77#define PCI_DEVICE_ID_CB134I 0x1341 79#define PCI_DEVICE_ID_CB134I 0x1341
78#define PCI_DEVICE_ID_CP138U 0x1380 80#define PCI_DEVICE_ID_CP138U 0x1380
79#define PCI_DEVICE_ID_POS104UL 0x1044
80 81
81 82
82#define C168_ASIC_ID 1 83#define C168_ASIC_ID 1
@@ -142,7 +143,8 @@ static const struct mxser_cardinfo mxser_cards[] = {
142 { "CB-134I series", 4, }, 143 { "CB-134I series", 4, },
143 { "CP-138U series", 8, }, 144 { "CP-138U series", 8, },
144 { "POS-104UL series", 4, }, 145 { "POS-104UL series", 4, },
145 { "CP-114UL series", 4, } 146 { "CP-114UL series", 4, },
147/*30*/ { "CP-102UF series", 2, }
146}; 148};
147 149
148/* driver_data correspond to the lines in the structure above 150/* driver_data correspond to the lines in the structure above
@@ -172,6 +174,7 @@ static struct pci_device_id mxser_pcibrds[] = {
172 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U), .driver_data = 27 }, 174 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U), .driver_data = 27 },
173 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_POS104UL), .driver_data = 28 }, 175 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_POS104UL), .driver_data = 28 },
174 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL), .driver_data = 29 }, 176 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL), .driver_data = 29 },
177 { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP102UF), .driver_data = 30 },
175 { } 178 { }
176}; 179};
177MODULE_DEVICE_TABLE(pci, mxser_pcibrds); 180MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
@@ -1414,7 +1417,6 @@ static int mxser_set_serial_info(struct mxser_port *info,
1414 info->port.closing_wait = new_serial.closing_wait * HZ / 100; 1417 info->port.closing_wait = new_serial.closing_wait * HZ / 100;
1415 info->port.tty->low_latency = 1418 info->port.tty->low_latency =
1416 (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1419 (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1417 info->port.tty->low_latency = 0;
1418 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && 1420 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST &&
1419 (new_serial.baud_base != info->baud_base || 1421 (new_serial.baud_base != info->baud_base ||
1420 new_serial.custom_divisor != 1422 new_serial.custom_divisor !=
@@ -1464,27 +1466,6 @@ static int mxser_get_lsr_info(struct mxser_port *info,
1464 return put_user(result, value); 1466 return put_user(result, value);
1465} 1467}
1466 1468
1467/*
1468 * This routine sends a break character out the serial port.
1469 */
1470static void mxser_send_break(struct mxser_port *info, int duration)
1471{
1472 unsigned long flags;
1473
1474 if (!info->ioaddr)
1475 return;
1476 set_current_state(TASK_INTERRUPTIBLE);
1477 spin_lock_irqsave(&info->slock, flags);
1478 outb(inb(info->ioaddr + UART_LCR) | UART_LCR_SBC,
1479 info->ioaddr + UART_LCR);
1480 spin_unlock_irqrestore(&info->slock, flags);
1481 schedule_timeout(duration);
1482 spin_lock_irqsave(&info->slock, flags);
1483 outb(inb(info->ioaddr + UART_LCR) & ~UART_LCR_SBC,
1484 info->ioaddr + UART_LCR);
1485 spin_unlock_irqrestore(&info->slock, flags);
1486}
1487
1488static int mxser_tiocmget(struct tty_struct *tty, struct file *file) 1469static int mxser_tiocmget(struct tty_struct *tty, struct file *file)
1489{ 1470{
1490 struct mxser_port *info = tty->driver_data; 1471 struct mxser_port *info = tty->driver_data;
@@ -1872,21 +1853,6 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
1872 return -EIO; 1853 return -EIO;
1873 1854
1874 switch (cmd) { 1855 switch (cmd) {
1875 case TCSBRK: /* SVID version: non-zero arg --> no break */
1876 retval = tty_check_change(tty);
1877 if (retval)
1878 return retval;
1879 tty_wait_until_sent(tty, 0);
1880 if (!arg)
1881 mxser_send_break(info, HZ / 4); /* 1/4 second */
1882 return 0;
1883 case TCSBRKP: /* support for POSIX tcsendbreak() */
1884 retval = tty_check_change(tty);
1885 if (retval)
1886 return retval;
1887 tty_wait_until_sent(tty, 0);
1888 mxser_send_break(info, arg ? arg * (HZ / 10) : HZ / 4);
1889 return 0;
1890 case TIOCGSERIAL: 1856 case TIOCGSERIAL:
1891 lock_kernel(); 1857 lock_kernel();
1892 retval = mxser_get_serial_info(info, argp); 1858 retval = mxser_get_serial_info(info, argp);
@@ -2219,7 +2185,7 @@ static void mxser_hangup(struct tty_struct *tty)
2219/* 2185/*
2220 * mxser_rs_break() --- routine which turns the break handling on or off 2186 * mxser_rs_break() --- routine which turns the break handling on or off
2221 */ 2187 */
2222static void mxser_rs_break(struct tty_struct *tty, int break_state) 2188static int mxser_rs_break(struct tty_struct *tty, int break_state)
2223{ 2189{
2224 struct mxser_port *info = tty->driver_data; 2190 struct mxser_port *info = tty->driver_data;
2225 unsigned long flags; 2191 unsigned long flags;
@@ -2232,6 +2198,7 @@ static void mxser_rs_break(struct tty_struct *tty, int break_state)
2232 outb(inb(info->ioaddr + UART_LCR) & ~UART_LCR_SBC, 2198 outb(inb(info->ioaddr + UART_LCR) & ~UART_LCR_SBC,
2233 info->ioaddr + UART_LCR); 2199 info->ioaddr + UART_LCR);
2234 spin_unlock_irqrestore(&info->slock, flags); 2200 spin_unlock_irqrestore(&info->slock, flags);
2201 return 0;
2235} 2202}
2236 2203
2237static void mxser_receive_chars(struct mxser_port *port, int *status) 2204static void mxser_receive_chars(struct mxser_port *port, int *status)
diff --git a/drivers/char/n_hdlc.c b/drivers/char/n_hdlc.c
index ed4e03333ab4..69ec6399c714 100644
--- a/drivers/char/n_hdlc.c
+++ b/drivers/char/n_hdlc.c
@@ -677,6 +677,10 @@ static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
677 /* Allocate transmit buffer */ 677 /* Allocate transmit buffer */
678 /* sleep until transmit buffer available */ 678 /* sleep until transmit buffer available */
679 while (!(tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list))) { 679 while (!(tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list))) {
680 if (file->f_flags & O_NONBLOCK) {
681 error = -EAGAIN;
682 break;
683 }
680 schedule(); 684 schedule();
681 685
682 n_hdlc = tty2n_hdlc (tty); 686 n_hdlc = tty2n_hdlc (tty);
diff --git a/drivers/char/nvram.c b/drivers/char/nvram.c
index a22662b6a1a5..39f6357e3b5d 100644
--- a/drivers/char/nvram.c
+++ b/drivers/char/nvram.c
@@ -107,7 +107,6 @@
107#include <linux/init.h> 107#include <linux/init.h>
108#include <linux/proc_fs.h> 108#include <linux/proc_fs.h>
109#include <linux/spinlock.h> 109#include <linux/spinlock.h>
110#include <linux/smp_lock.h>
111 110
112#include <asm/io.h> 111#include <asm/io.h>
113#include <asm/uaccess.h> 112#include <asm/uaccess.h>
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
index e4a4fbd37d7a..f070ae7bd91a 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -1896,7 +1896,7 @@ static int cm4000_probe(struct pcmcia_device *link)
1896 return ret; 1896 return ret;
1897 } 1897 }
1898 1898
1899 device_create(cmm_class, NULL, MKDEV(major, i), "cmm%d", i); 1899 device_create_drvdata(cmm_class, NULL, MKDEV(major, i), NULL, "cmm%d", i);
1900 1900
1901 return 0; 1901 return 0;
1902} 1902}
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
index 6181f8a9b0bd..0b5934bef7a4 100644
--- a/drivers/char/pcmcia/cm4040_cs.c
+++ b/drivers/char/pcmcia/cm4040_cs.c
@@ -653,7 +653,8 @@ static int reader_probe(struct pcmcia_device *link)
653 return ret; 653 return ret;
654 } 654 }
655 655
656 device_create(cmx_class, NULL, MKDEV(major, i), "cmx%d", i); 656 device_create_drvdata(cmx_class, NULL, MKDEV(major, i), NULL,
657 "cmx%d", i);
657 658
658 return 0; 659 return 0;
659} 660}
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index b694d430f10e..d1fceabe3aef 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -2230,7 +2230,7 @@ static int tiocmset(struct tty_struct *tty, struct file *file,
2230 * Arguments: tty pointer to tty instance data 2230 * Arguments: tty pointer to tty instance data
2231 * break_state -1=set break condition, 0=clear 2231 * break_state -1=set break condition, 0=clear
2232 */ 2232 */
2233static void mgslpc_break(struct tty_struct *tty, int break_state) 2233static int mgslpc_break(struct tty_struct *tty, int break_state)
2234{ 2234{
2235 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; 2235 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
2236 unsigned long flags; 2236 unsigned long flags;
@@ -2240,7 +2240,7 @@ static void mgslpc_break(struct tty_struct *tty, int break_state)
2240 __FILE__,__LINE__, info->device_name, break_state); 2240 __FILE__,__LINE__, info->device_name, break_state);
2241 2241
2242 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_break")) 2242 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_break"))
2243 return; 2243 return -EINVAL;
2244 2244
2245 spin_lock_irqsave(&info->lock,flags); 2245 spin_lock_irqsave(&info->lock,flags);
2246 if (break_state == -1) 2246 if (break_state == -1)
@@ -2248,6 +2248,7 @@ static void mgslpc_break(struct tty_struct *tty, int break_state)
2248 else 2248 else
2249 clear_reg_bits(info, CHA+DAFO, BIT6); 2249 clear_reg_bits(info, CHA+DAFO, BIT6);
2250 spin_unlock_irqrestore(&info->lock,flags); 2250 spin_unlock_irqrestore(&info->lock,flags);
2251 return 0;
2251} 2252}
2252 2253
2253/* Service an IOCTL request 2254/* Service an IOCTL request
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index f6e6acadd9a0..7af7a7e6b9c2 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -752,8 +752,9 @@ static const struct file_operations pp_fops = {
752 752
753static void pp_attach(struct parport *port) 753static void pp_attach(struct parport *port)
754{ 754{
755 device_create(ppdev_class, port->dev, MKDEV(PP_MAJOR, port->number), 755 device_create_drvdata(ppdev_class, port->dev,
756 "parport%d", port->number); 756 MKDEV(PP_MAJOR, port->number),
757 NULL, "parport%d", port->number);
757} 758}
758 759
759static void pp_detach(struct parport *port) 760static void pp_detach(struct parport *port)
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 0cf98bd4f2d2..e0d0e371909c 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -236,6 +236,7 @@
236#include <linux/fs.h> 236#include <linux/fs.h>
237#include <linux/genhd.h> 237#include <linux/genhd.h>
238#include <linux/interrupt.h> 238#include <linux/interrupt.h>
239#include <linux/mm.h>
239#include <linux/spinlock.h> 240#include <linux/spinlock.h>
240#include <linux/percpu.h> 241#include <linux/percpu.h>
241#include <linux/cryptohash.h> 242#include <linux/cryptohash.h>
diff --git a/drivers/char/raw.c b/drivers/char/raw.c
index 505fcbe884a4..47b8cf281d4a 100644
--- a/drivers/char/raw.c
+++ b/drivers/char/raw.c
@@ -131,8 +131,8 @@ raw_ioctl(struct inode *inode, struct file *filp,
131static void bind_device(struct raw_config_request *rq) 131static void bind_device(struct raw_config_request *rq)
132{ 132{
133 device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor)); 133 device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor));
134 device_create(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor), 134 device_create_drvdata(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor),
135 "raw%d", rq->raw_minor); 135 NULL, "raw%d", rq->raw_minor);
136} 136}
137 137
138/* 138/*
@@ -283,7 +283,8 @@ static int __init raw_init(void)
283 ret = PTR_ERR(raw_class); 283 ret = PTR_ERR(raw_class);
284 goto error_region; 284 goto error_region;
285 } 285 }
286 device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), "rawctl"); 286 device_create_drvdata(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL,
287 "rawctl");
287 288
288 return 0; 289 return 0;
289 290
diff --git a/drivers/char/riscom8.c b/drivers/char/riscom8.c
index 724b2b20f4b2..2c6c8f33d6b4 100644
--- a/drivers/char/riscom8.c
+++ b/drivers/char/riscom8.c
@@ -1250,11 +1250,15 @@ static int rc_tiocmset(struct tty_struct *tty, struct file *file,
1250 return 0; 1250 return 0;
1251} 1251}
1252 1252
1253static void rc_send_break(struct riscom_port *port, unsigned long length) 1253static int rc_send_break(struct tty_struct *tty, int length)
1254{ 1254{
1255 struct riscom_port *port = (struct riscom_port *)tty->driver_data;
1255 struct riscom_board *bp = port_Board(port); 1256 struct riscom_board *bp = port_Board(port);
1256 unsigned long flags; 1257 unsigned long flags;
1257 1258
1259 if (length == 0 || length == -1)
1260 return -EOPNOTSUPP;
1261
1258 spin_lock_irqsave(&riscom_lock, flags); 1262 spin_lock_irqsave(&riscom_lock, flags);
1259 1263
1260 port->break_length = RISCOM_TPS / HZ * length; 1264 port->break_length = RISCOM_TPS / HZ * length;
@@ -1268,6 +1272,7 @@ static void rc_send_break(struct riscom_port *port, unsigned long length)
1268 rc_wait_CCR(bp); 1272 rc_wait_CCR(bp);
1269 1273
1270 spin_unlock_irqrestore(&riscom_lock, flags); 1274 spin_unlock_irqrestore(&riscom_lock, flags);
1275 return 0;
1271} 1276}
1272 1277
1273static int rc_set_serial_info(struct riscom_port *port, 1278static int rc_set_serial_info(struct riscom_port *port,
@@ -1342,27 +1347,12 @@ static int rc_ioctl(struct tty_struct *tty, struct file *filp,
1342{ 1347{
1343 struct riscom_port *port = (struct riscom_port *)tty->driver_data; 1348 struct riscom_port *port = (struct riscom_port *)tty->driver_data;
1344 void __user *argp = (void __user *)arg; 1349 void __user *argp = (void __user *)arg;
1345 int retval = 0; 1350 int retval;
1346 1351
1347 if (rc_paranoia_check(port, tty->name, "rc_ioctl")) 1352 if (rc_paranoia_check(port, tty->name, "rc_ioctl"))
1348 return -ENODEV; 1353 return -ENODEV;
1349 1354
1350 switch (cmd) { 1355 switch (cmd) {
1351 case TCSBRK: /* SVID version: non-zero arg --> no break */
1352 retval = tty_check_change(tty);
1353 if (retval)
1354 return retval;
1355 tty_wait_until_sent(tty, 0);
1356 if (!arg)
1357 rc_send_break(port, HZ/4); /* 1/4 second */
1358 break;
1359 case TCSBRKP: /* support for POSIX tcsendbreak() */
1360 retval = tty_check_change(tty);
1361 if (retval)
1362 return retval;
1363 tty_wait_until_sent(tty, 0);
1364 rc_send_break(port, arg ? arg*(HZ/10) : HZ/4);
1365 break;
1366 case TIOCGSERIAL: 1356 case TIOCGSERIAL:
1367 lock_kernel(); 1357 lock_kernel();
1368 retval = rc_get_serial_info(port, argp); 1358 retval = rc_get_serial_info(port, argp);
@@ -1517,6 +1507,7 @@ static const struct tty_operations riscom_ops = {
1517 .hangup = rc_hangup, 1507 .hangup = rc_hangup,
1518 .tiocmget = rc_tiocmget, 1508 .tiocmget = rc_tiocmget,
1519 .tiocmset = rc_tiocmset, 1509 .tiocmset = rc_tiocmset,
1510 .break_ctl = rc_send_break,
1520}; 1511};
1521 1512
1522static int __init rc_init_drivers(void) 1513static int __init rc_init_drivers(void)
@@ -1538,7 +1529,7 @@ static int __init rc_init_drivers(void)
1538 B9600 | CS8 | CREAD | HUPCL | CLOCAL; 1529 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1539 riscom_driver->init_termios.c_ispeed = 9600; 1530 riscom_driver->init_termios.c_ispeed = 9600;
1540 riscom_driver->init_termios.c_ospeed = 9600; 1531 riscom_driver->init_termios.c_ospeed = 9600;
1541 riscom_driver->flags = TTY_DRIVER_REAL_RAW; 1532 riscom_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_HARDWARE_BREAK;
1542 tty_set_operations(riscom_driver, &riscom_ops); 1533 tty_set_operations(riscom_driver, &riscom_ops);
1543 error = tty_register_driver(riscom_driver); 1534 error = tty_register_driver(riscom_driver);
1544 if (error != 0) { 1535 if (error != 0) {
diff --git a/drivers/char/rocket.c b/drivers/char/rocket.c
index e670eae2f510..584d791e84a6 100644
--- a/drivers/char/rocket.c
+++ b/drivers/char/rocket.c
@@ -1236,13 +1236,13 @@ static void rp_set_termios(struct tty_struct *tty,
1236 } 1236 }
1237} 1237}
1238 1238
1239static void rp_break(struct tty_struct *tty, int break_state) 1239static int rp_break(struct tty_struct *tty, int break_state)
1240{ 1240{
1241 struct r_port *info = (struct r_port *) tty->driver_data; 1241 struct r_port *info = (struct r_port *) tty->driver_data;
1242 unsigned long flags; 1242 unsigned long flags;
1243 1243
1244 if (rocket_paranoia_check(info, "rp_break")) 1244 if (rocket_paranoia_check(info, "rp_break"))
1245 return; 1245 return -EINVAL;
1246 1246
1247 spin_lock_irqsave(&info->slock, flags); 1247 spin_lock_irqsave(&info->slock, flags);
1248 if (break_state == -1) 1248 if (break_state == -1)
@@ -1250,6 +1250,7 @@ static void rp_break(struct tty_struct *tty, int break_state)
1250 else 1250 else
1251 sClrBreak(&info->channel); 1251 sClrBreak(&info->channel);
1252 spin_unlock_irqrestore(&info->slock, flags); 1252 spin_unlock_irqrestore(&info->slock, flags);
1253 return 0;
1253} 1254}
1254 1255
1255/* 1256/*
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c
index fa92a8af5a5a..dbefbb30ed44 100644
--- a/drivers/char/rtc.c
+++ b/drivers/char/rtc.c
@@ -78,9 +78,10 @@
78#include <linux/wait.h> 78#include <linux/wait.h>
79#include <linux/bcd.h> 79#include <linux/bcd.h>
80#include <linux/delay.h> 80#include <linux/delay.h>
81#include <linux/smp_lock.h>
82#include <linux/uaccess.h>
81 83
82#include <asm/current.h> 84#include <asm/current.h>
83#include <asm/uaccess.h>
84#include <asm/system.h> 85#include <asm/system.h>
85 86
86#ifdef CONFIG_X86 87#ifdef CONFIG_X86
@@ -120,8 +121,6 @@ static irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
120 return 0; 121 return 0;
121} 122}
122#endif 123#endif
123#else
124extern irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id);
125#endif 124#endif
126 125
127/* 126/*
@@ -144,8 +143,7 @@ static DEFINE_TIMER(rtc_irq_timer, rtc_dropped_irq, 0, 0);
144static ssize_t rtc_read(struct file *file, char __user *buf, 143static ssize_t rtc_read(struct file *file, char __user *buf,
145 size_t count, loff_t *ppos); 144 size_t count, loff_t *ppos);
146 145
147static int rtc_ioctl(struct inode *inode, struct file *file, 146static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
148 unsigned int cmd, unsigned long arg);
149 147
150#ifdef RTC_IRQ 148#ifdef RTC_IRQ
151static unsigned int rtc_poll(struct file *file, poll_table *wait); 149static unsigned int rtc_poll(struct file *file, poll_table *wait);
@@ -719,10 +717,13 @@ static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
719 &wtime, sizeof wtime) ? -EFAULT : 0; 717 &wtime, sizeof wtime) ? -EFAULT : 0;
720} 718}
721 719
722static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, 720static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
723 unsigned long arg)
724{ 721{
725 return rtc_do_ioctl(cmd, arg, 0); 722 long ret;
723 lock_kernel();
724 ret = rtc_do_ioctl(cmd, arg, 0);
725 unlock_kernel();
726 return ret;
726} 727}
727 728
728/* 729/*
@@ -915,7 +916,7 @@ static const struct file_operations rtc_fops = {
915#ifdef RTC_IRQ 916#ifdef RTC_IRQ
916 .poll = rtc_poll, 917 .poll = rtc_poll,
917#endif 918#endif
918 .ioctl = rtc_ioctl, 919 .unlocked_ioctl = rtc_ioctl,
919 .open = rtc_open, 920 .open = rtc_open,
920 .release = rtc_release, 921 .release = rtc_release,
921 .fasync = rtc_fasync, 922 .fasync = rtc_fasync,
diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c
index 0b799ac1b049..3ce60df14c0a 100644
--- a/drivers/char/snsc.c
+++ b/drivers/char/snsc.c
@@ -444,7 +444,8 @@ scdrv_init(void)
444 continue; 444 continue;
445 } 445 }
446 446
447 device_create(snsc_class, NULL, dev, "%s", devname); 447 device_create_drvdata(snsc_class, NULL, dev, NULL,
448 "%s", devname);
448 449
449 ia64_sn_irtr_intr_enable(scd->scd_nasid, 450 ia64_sn_irtr_intr_enable(scd->scd_nasid,
450 0 /*ignored */ , 451 0 /*ignored */ ,
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c
index 037dc47e4cb1..242fd46fda22 100644
--- a/drivers/char/specialix.c
+++ b/drivers/char/specialix.c
@@ -77,7 +77,7 @@
77 77
78#include <linux/module.h> 78#include <linux/module.h>
79 79
80#include <asm/io.h> 80#include <linux/io.h>
81#include <linux/kernel.h> 81#include <linux/kernel.h>
82#include <linux/sched.h> 82#include <linux/sched.h>
83#include <linux/ioport.h> 83#include <linux/ioport.h>
@@ -92,7 +92,7 @@
92#include <linux/delay.h> 92#include <linux/delay.h>
93#include <linux/pci.h> 93#include <linux/pci.h>
94#include <linux/init.h> 94#include <linux/init.h>
95#include <asm/uaccess.h> 95#include <linux/uaccess.h>
96 96
97#include "specialix_io8.h" 97#include "specialix_io8.h"
98#include "cd1865.h" 98#include "cd1865.h"
@@ -110,9 +110,10 @@
110 110
111static int sx_debug; 111static int sx_debug;
112static int sx_rxfifo = SPECIALIX_RXFIFO; 112static int sx_rxfifo = SPECIALIX_RXFIFO;
113static int sx_rtscts;
113 114
114#ifdef DEBUG 115#ifdef DEBUG
115#define dprintk(f, str...) if (sx_debug & f) printk (str) 116#define dprintk(f, str...) if (sx_debug & f) printk(str)
116#else 117#else
117#define dprintk(f, str...) /* nothing */ 118#define dprintk(f, str...) /* nothing */
118#endif 119#endif
@@ -131,10 +132,8 @@ static int sx_rxfifo = SPECIALIX_RXFIFO;
131#define SX_DEBUG_FIFO 0x0800 132#define SX_DEBUG_FIFO 0x0800
132 133
133 134
134#define func_enter() dprintk (SX_DEBUG_FLOW, "io8: enter %s\n",__func__) 135#define func_enter() dprintk(SX_DEBUG_FLOW, "io8: enter %s\n", __func__)
135#define func_exit() dprintk (SX_DEBUG_FLOW, "io8: exit %s\n", __func__) 136#define func_exit() dprintk(SX_DEBUG_FLOW, "io8: exit %s\n", __func__)
136
137#define jiffies_from_ms(a) ((((a) * HZ)/1000)+1)
138 137
139 138
140/* Configurable options: */ 139/* Configurable options: */
@@ -142,17 +141,6 @@ static int sx_rxfifo = SPECIALIX_RXFIFO;
142/* Am I paranoid or not ? ;-) */ 141/* Am I paranoid or not ? ;-) */
143#define SPECIALIX_PARANOIA_CHECK 142#define SPECIALIX_PARANOIA_CHECK
144 143
145/* Do I trust the IRQ from the card? (enabeling it doesn't seem to help)
146 When the IRQ routine leaves the chip in a state that is keeps on
147 requiring attention, the timer doesn't help either. */
148#undef SPECIALIX_TIMER
149
150#ifdef SPECIALIX_TIMER
151static int sx_poll = HZ;
152#endif
153
154
155
156/* 144/*
157 * The following defines are mostly for testing purposes. But if you need 145 * The following defines are mostly for testing purposes. But if you need
158 * some nice reporting in your syslog, you can define them also. 146 * some nice reporting in your syslog, you can define them also.
@@ -162,16 +150,6 @@ static int sx_poll = HZ;
162 150
163 151
164 152
165#ifdef CONFIG_SPECIALIX_RTSCTS
166#define SX_CRTSCTS(bla) 1
167#else
168#define SX_CRTSCTS(tty) C_CRTSCTS(tty)
169#endif
170
171
172/* Used to be outb (0xff, 0x80); */
173#define short_pause() udelay (1)
174
175 153
176#define SPECIALIX_LEGAL_FLAGS \ 154#define SPECIALIX_LEGAL_FLAGS \
177 (ASYNC_HUP_NOTIFY | ASYNC_SAK | ASYNC_SPLIT_TERMIOS | \ 155 (ASYNC_HUP_NOTIFY | ASYNC_SAK | ASYNC_SPLIT_TERMIOS | \
@@ -190,21 +168,14 @@ static struct specialix_board sx_board[SX_NBOARD] = {
190static struct specialix_port sx_port[SX_NBOARD * SX_NPORT]; 168static struct specialix_port sx_port[SX_NBOARD * SX_NPORT];
191 169
192 170
193#ifdef SPECIALIX_TIMER 171static int sx_paranoia_check(struct specialix_port const *port,
194static struct timer_list missed_irq_timer;
195static irqreturn_t sx_interrupt(int irq, void * dev_id);
196#endif
197
198
199
200static inline int sx_paranoia_check(struct specialix_port const * port,
201 char *name, const char *routine) 172 char *name, const char *routine)
202{ 173{
203#ifdef SPECIALIX_PARANOIA_CHECK 174#ifdef SPECIALIX_PARANOIA_CHECK
204 static const char *badmagic = 175 static const char *badmagic = KERN_ERR
205 KERN_ERR "sx: Warning: bad specialix port magic number for device %s in %s\n"; 176 "sx: Warning: bad specialix port magic number for device %s in %s\n";
206 static const char *badinfo = 177 static const char *badinfo = KERN_ERR
207 KERN_ERR "sx: Warning: null specialix port for device %s in %s\n"; 178 "sx: Warning: null specialix port for device %s in %s\n";
208 179
209 if (!port) { 180 if (!port) {
210 printk(badinfo, name, routine); 181 printk(badinfo, name, routine);
@@ -226,66 +197,69 @@ static inline int sx_paranoia_check(struct specialix_port const * port,
226 */ 197 */
227 198
228/* Get board number from pointer */ 199/* Get board number from pointer */
229static inline int board_No (struct specialix_board * bp) 200static inline int board_No(struct specialix_board *bp)
230{ 201{
231 return bp - sx_board; 202 return bp - sx_board;
232} 203}
233 204
234 205
235/* Get port number from pointer */ 206/* Get port number from pointer */
236static inline int port_No (struct specialix_port const * port) 207static inline int port_No(struct specialix_port const *port)
237{ 208{
238 return SX_PORT(port - sx_port); 209 return SX_PORT(port - sx_port);
239} 210}
240 211
241 212
242/* Get pointer to board from pointer to port */ 213/* Get pointer to board from pointer to port */
243static inline struct specialix_board * port_Board(struct specialix_port const * port) 214static inline struct specialix_board *port_Board(
215 struct specialix_port const *port)
244{ 216{
245 return &sx_board[SX_BOARD(port - sx_port)]; 217 return &sx_board[SX_BOARD(port - sx_port)];
246} 218}
247 219
248 220
249/* Input Byte from CL CD186x register */ 221/* Input Byte from CL CD186x register */
250static inline unsigned char sx_in(struct specialix_board * bp, unsigned short reg) 222static inline unsigned char sx_in(struct specialix_board *bp,
223 unsigned short reg)
251{ 224{
252 bp->reg = reg | 0x80; 225 bp->reg = reg | 0x80;
253 outb (reg | 0x80, bp->base + SX_ADDR_REG); 226 outb(reg | 0x80, bp->base + SX_ADDR_REG);
254 return inb (bp->base + SX_DATA_REG); 227 return inb(bp->base + SX_DATA_REG);
255} 228}
256 229
257 230
258/* Output Byte to CL CD186x register */ 231/* Output Byte to CL CD186x register */
259static inline void sx_out(struct specialix_board * bp, unsigned short reg, 232static inline void sx_out(struct specialix_board *bp, unsigned short reg,
260 unsigned char val) 233 unsigned char val)
261{ 234{
262 bp->reg = reg | 0x80; 235 bp->reg = reg | 0x80;
263 outb (reg | 0x80, bp->base + SX_ADDR_REG); 236 outb(reg | 0x80, bp->base + SX_ADDR_REG);
264 outb (val, bp->base + SX_DATA_REG); 237 outb(val, bp->base + SX_DATA_REG);
265} 238}
266 239
267 240
268/* Input Byte from CL CD186x register */ 241/* Input Byte from CL CD186x register */
269static inline unsigned char sx_in_off(struct specialix_board * bp, unsigned short reg) 242static inline unsigned char sx_in_off(struct specialix_board *bp,
243 unsigned short reg)
270{ 244{
271 bp->reg = reg; 245 bp->reg = reg;
272 outb (reg, bp->base + SX_ADDR_REG); 246 outb(reg, bp->base + SX_ADDR_REG);
273 return inb (bp->base + SX_DATA_REG); 247 return inb(bp->base + SX_DATA_REG);
274} 248}
275 249
276 250
277/* Output Byte to CL CD186x register */ 251/* Output Byte to CL CD186x register */
278static inline void sx_out_off(struct specialix_board * bp, unsigned short reg, 252static inline void sx_out_off(struct specialix_board *bp,
279 unsigned char val) 253 unsigned short reg, unsigned char val)
280{ 254{
281 bp->reg = reg; 255 bp->reg = reg;
282 outb (reg, bp->base + SX_ADDR_REG); 256 outb(reg, bp->base + SX_ADDR_REG);
283 outb (val, bp->base + SX_DATA_REG); 257 outb(val, bp->base + SX_DATA_REG);
284} 258}
285 259
286 260
287/* Wait for Channel Command Register ready */ 261/* Wait for Channel Command Register ready */
288static inline void sx_wait_CCR(struct specialix_board * bp) 262static void sx_wait_CCR(struct specialix_board *bp)
289{ 263{
290 unsigned long delay, flags; 264 unsigned long delay, flags;
291 unsigned char ccr; 265 unsigned char ccr;
@@ -296,7 +270,7 @@ static inline void sx_wait_CCR(struct specialix_board * bp)
296 spin_unlock_irqrestore(&bp->lock, flags); 270 spin_unlock_irqrestore(&bp->lock, flags);
297 if (!ccr) 271 if (!ccr)
298 return; 272 return;
299 udelay (1); 273 udelay(1);
300 } 274 }
301 275
302 printk(KERN_ERR "sx%d: Timeout waiting for CCR.\n", board_No(bp)); 276 printk(KERN_ERR "sx%d: Timeout waiting for CCR.\n", board_No(bp));
@@ -304,7 +278,7 @@ static inline void sx_wait_CCR(struct specialix_board * bp)
304 278
305 279
306/* Wait for Channel Command Register ready */ 280/* Wait for Channel Command Register ready */
307static inline void sx_wait_CCR_off(struct specialix_board * bp) 281static void sx_wait_CCR_off(struct specialix_board *bp)
308{ 282{
309 unsigned long delay; 283 unsigned long delay;
310 unsigned char crr; 284 unsigned char crr;
@@ -316,7 +290,7 @@ static inline void sx_wait_CCR_off(struct specialix_board * bp)
316 spin_unlock_irqrestore(&bp->lock, flags); 290 spin_unlock_irqrestore(&bp->lock, flags);
317 if (!crr) 291 if (!crr)
318 return; 292 return;
319 udelay (1); 293 udelay(1);
320 } 294 }
321 295
322 printk(KERN_ERR "sx%d: Timeout waiting for CCR.\n", board_No(bp)); 296 printk(KERN_ERR "sx%d: Timeout waiting for CCR.\n", board_No(bp));
@@ -327,7 +301,7 @@ static inline void sx_wait_CCR_off(struct specialix_board * bp)
327 * specialix IO8+ IO range functions. 301 * specialix IO8+ IO range functions.
328 */ 302 */
329 303
330static inline int sx_request_io_range(struct specialix_board * bp) 304static int sx_request_io_range(struct specialix_board *bp)
331{ 305{
332 return request_region(bp->base, 306 return request_region(bp->base,
333 bp->flags & SX_BOARD_IS_PCI ? SX_PCI_IO_SPACE : SX_IO_SPACE, 307 bp->flags & SX_BOARD_IS_PCI ? SX_PCI_IO_SPACE : SX_IO_SPACE,
@@ -335,15 +309,15 @@ static inline int sx_request_io_range(struct specialix_board * bp)
335} 309}
336 310
337 311
338static inline void sx_release_io_range(struct specialix_board * bp) 312static void sx_release_io_range(struct specialix_board *bp)
339{ 313{
340 release_region(bp->base, 314 release_region(bp->base, bp->flags & SX_BOARD_IS_PCI ?
341 bp->flags&SX_BOARD_IS_PCI?SX_PCI_IO_SPACE:SX_IO_SPACE); 315 SX_PCI_IO_SPACE : SX_IO_SPACE);
342} 316}
343 317
344 318
345/* Set the IRQ using the RTS lines that run to the PAL on the board.... */ 319/* Set the IRQ using the RTS lines that run to the PAL on the board.... */
346static int sx_set_irq ( struct specialix_board *bp) 320static int sx_set_irq(struct specialix_board *bp)
347{ 321{
348 int virq; 322 int virq;
349 int i; 323 int i;
@@ -353,15 +327,24 @@ static int sx_set_irq ( struct specialix_board *bp)
353 return 1; 327 return 1;
354 switch (bp->irq) { 328 switch (bp->irq) {
355 /* In the same order as in the docs... */ 329 /* In the same order as in the docs... */
356 case 15: virq = 0;break; 330 case 15:
357 case 12: virq = 1;break; 331 virq = 0;
358 case 11: virq = 2;break; 332 break;
359 case 9: virq = 3;break; 333 case 12:
360 default: printk (KERN_ERR "Speclialix: cannot set irq to %d.\n", bp->irq); 334 virq = 1;
361 return 0; 335 break;
336 case 11:
337 virq = 2;
338 break;
339 case 9:
340 virq = 3;
341 break;
342 default:printk(KERN_ERR
343 "Speclialix: cannot set irq to %d.\n", bp->irq);
344 return 0;
362 } 345 }
363 spin_lock_irqsave(&bp->lock, flags); 346 spin_lock_irqsave(&bp->lock, flags);
364 for (i=0;i<2;i++) { 347 for (i = 0; i < 2; i++) {
365 sx_out(bp, CD186x_CAR, i); 348 sx_out(bp, CD186x_CAR, i);
366 sx_out(bp, CD186x_MSVRTS, ((virq >> i) & 0x1)? MSVR_RTS:0); 349 sx_out(bp, CD186x_MSVRTS, ((virq >> i) & 0x1)? MSVR_RTS:0);
367 } 350 }
@@ -371,7 +354,7 @@ static int sx_set_irq ( struct specialix_board *bp)
371 354
372 355
373/* Reset and setup CD186x chip */ 356/* Reset and setup CD186x chip */
374static int sx_init_CD186x(struct specialix_board * bp) 357static int sx_init_CD186x(struct specialix_board *bp)
375{ 358{
376 unsigned long flags; 359 unsigned long flags;
377 int scaler; 360 int scaler;
@@ -390,7 +373,7 @@ static int sx_init_CD186x(struct specialix_board * bp)
390 sx_out_off(bp, CD186x_PILR2, SX_ACK_TINT); /* Prio for transmitter intr */ 373 sx_out_off(bp, CD186x_PILR2, SX_ACK_TINT); /* Prio for transmitter intr */
391 sx_out_off(bp, CD186x_PILR3, SX_ACK_RINT); /* Prio for receiver intr */ 374 sx_out_off(bp, CD186x_PILR3, SX_ACK_RINT); /* Prio for receiver intr */
392 /* Set RegAckEn */ 375 /* Set RegAckEn */
393 sx_out_off(bp, CD186x_SRCR, sx_in (bp, CD186x_SRCR) | SRCR_REGACKEN); 376 sx_out_off(bp, CD186x_SRCR, sx_in(bp, CD186x_SRCR) | SRCR_REGACKEN);
394 377
395 /* Setting up prescaler. We need 4 ticks per 1 ms */ 378 /* Setting up prescaler. We need 4 ticks per 1 ms */
396 scaler = SX_OSCFREQ/SPECIALIX_TPS; 379 scaler = SX_OSCFREQ/SPECIALIX_TPS;
@@ -399,9 +382,9 @@ static int sx_init_CD186x(struct specialix_board * bp)
399 sx_out_off(bp, CD186x_PPRL, scaler & 0xff); 382 sx_out_off(bp, CD186x_PPRL, scaler & 0xff);
400 spin_unlock_irqrestore(&bp->lock, flags); 383 spin_unlock_irqrestore(&bp->lock, flags);
401 384
402 if (!sx_set_irq (bp)) { 385 if (!sx_set_irq(bp)) {
403 /* Figure out how to pass this along... */ 386 /* Figure out how to pass this along... */
404 printk (KERN_ERR "Cannot set irq to %d.\n", bp->irq); 387 printk(KERN_ERR "Cannot set irq to %d.\n", bp->irq);
405 rv = 0; 388 rv = 0;
406 } 389 }
407 390
@@ -410,16 +393,16 @@ static int sx_init_CD186x(struct specialix_board * bp)
410} 393}
411 394
412 395
413static int read_cross_byte (struct specialix_board *bp, int reg, int bit) 396static int read_cross_byte(struct specialix_board *bp, int reg, int bit)
414{ 397{
415 int i; 398 int i;
416 int t; 399 int t;
417 unsigned long flags; 400 unsigned long flags;
418 401
419 spin_lock_irqsave(&bp->lock, flags); 402 spin_lock_irqsave(&bp->lock, flags);
420 for (i=0, t=0;i<8;i++) { 403 for (i = 0, t = 0; i < 8; i++) {
421 sx_out_off (bp, CD186x_CAR, i); 404 sx_out_off(bp, CD186x_CAR, i);
422 if (sx_in_off (bp, reg) & bit) 405 if (sx_in_off(bp, reg) & bit)
423 t |= 1 << i; 406 t |= 1 << i;
424 } 407 }
425 spin_unlock_irqrestore(&bp->lock, flags); 408 spin_unlock_irqrestore(&bp->lock, flags);
@@ -428,37 +411,10 @@ static int read_cross_byte (struct specialix_board *bp, int reg, int bit)
428} 411}
429 412
430 413
431#ifdef SPECIALIX_TIMER
432void missed_irq (unsigned long data)
433{
434 unsigned char irq;
435 unsigned long flags;
436 struct specialix_board *bp = (struct specialix_board *)data;
437
438 spin_lock_irqsave(&bp->lock, flags);
439 irq = sx_in ((struct specialix_board *)data, CD186x_SRSR) &
440 (SRSR_RREQint |
441 SRSR_TREQint |
442 SRSR_MREQint);
443 spin_unlock_irqrestore(&bp->lock, flags);
444 if (irq) {
445 printk (KERN_INFO "Missed interrupt... Calling int from timer. \n");
446 sx_interrupt (-1, bp);
447 }
448 mod_timer(&missed_irq_timer, jiffies + sx_poll);
449}
450#endif
451
452
453
454/* Main probing routine, also sets irq. */ 414/* Main probing routine, also sets irq. */
455static int sx_probe(struct specialix_board *bp) 415static int sx_probe(struct specialix_board *bp)
456{ 416{
457 unsigned char val1, val2; 417 unsigned char val1, val2;
458#if 0
459 int irqs = 0;
460 int retries;
461#endif
462 int rev; 418 int rev;
463 int chip; 419 int chip;
464 420
@@ -471,17 +427,18 @@ static int sx_probe(struct specialix_board *bp)
471 427
472 /* Are the I/O ports here ? */ 428 /* Are the I/O ports here ? */
473 sx_out_off(bp, CD186x_PPRL, 0x5a); 429 sx_out_off(bp, CD186x_PPRL, 0x5a);
474 short_pause (); 430 udelay(1);
475 val1 = sx_in_off(bp, CD186x_PPRL); 431 val1 = sx_in_off(bp, CD186x_PPRL);
476 432
477 sx_out_off(bp, CD186x_PPRL, 0xa5); 433 sx_out_off(bp, CD186x_PPRL, 0xa5);
478 short_pause (); 434 udelay(1);
479 val2 = sx_in_off(bp, CD186x_PPRL); 435 val2 = sx_in_off(bp, CD186x_PPRL);
480 436
481 437
482 if ((val1 != 0x5a) || (val2 != 0xa5)) { 438 if (val1 != 0x5a || val2 != 0xa5) {
483 printk(KERN_INFO "sx%d: specialix IO8+ Board at 0x%03x not found.\n", 439 printk(KERN_INFO
484 board_No(bp), bp->base); 440 "sx%d: specialix IO8+ Board at 0x%03x not found.\n",
441 board_No(bp), bp->base);
485 sx_release_io_range(bp); 442 sx_release_io_range(bp);
486 func_exit(); 443 func_exit();
487 return 1; 444 return 1;
@@ -489,10 +446,11 @@ static int sx_probe(struct specialix_board *bp)
489 446
490 /* Check the DSR lines that Specialix uses as board 447 /* Check the DSR lines that Specialix uses as board
491 identification */ 448 identification */
492 val1 = read_cross_byte (bp, CD186x_MSVR, MSVR_DSR); 449 val1 = read_cross_byte(bp, CD186x_MSVR, MSVR_DSR);
493 val2 = read_cross_byte (bp, CD186x_MSVR, MSVR_RTS); 450 val2 = read_cross_byte(bp, CD186x_MSVR, MSVR_RTS);
494 dprintk (SX_DEBUG_INIT, "sx%d: DSR lines are: %02x, rts lines are: %02x\n", 451 dprintk(SX_DEBUG_INIT,
495 board_No(bp), val1, val2); 452 "sx%d: DSR lines are: %02x, rts lines are: %02x\n",
453 board_No(bp), val1, val2);
496 454
497 /* They managed to switch the bit order between the docs and 455 /* They managed to switch the bit order between the docs and
498 the IO8+ card. The new PCI card now conforms to old docs. 456 the IO8+ card. The new PCI card now conforms to old docs.
@@ -500,7 +458,8 @@ static int sx_probe(struct specialix_board *bp)
500 old card. */ 458 old card. */
501 val2 = (bp->flags & SX_BOARD_IS_PCI)?0x4d : 0xb2; 459 val2 = (bp->flags & SX_BOARD_IS_PCI)?0x4d : 0xb2;
502 if (val1 != val2) { 460 if (val1 != val2) {
503 printk(KERN_INFO "sx%d: specialix IO8+ ID %02x at 0x%03x not found (%02x).\n", 461 printk(KERN_INFO
462 "sx%d: specialix IO8+ ID %02x at 0x%03x not found (%02x).\n",
504 board_No(bp), val2, bp->base, val1); 463 board_No(bp), val2, bp->base, val1);
505 sx_release_io_range(bp); 464 sx_release_io_range(bp);
506 func_exit(); 465 func_exit();
@@ -508,47 +467,6 @@ static int sx_probe(struct specialix_board *bp)
508 } 467 }
509 468
510 469
511#if 0
512 /* It's time to find IRQ for this board */
513 for (retries = 0; retries < 5 && irqs <= 0; retries++) {
514 irqs = probe_irq_on();
515 sx_init_CD186x(bp); /* Reset CD186x chip */
516 sx_out(bp, CD186x_CAR, 2); /* Select port 2 */
517 sx_wait_CCR(bp);
518 sx_out(bp, CD186x_CCR, CCR_TXEN); /* Enable transmitter */
519 sx_out(bp, CD186x_IER, IER_TXRDY); /* Enable tx empty intr */
520 msleep(50);
521 irqs = probe_irq_off(irqs);
522
523 dprintk (SX_DEBUG_INIT, "SRSR = %02x, ", sx_in(bp, CD186x_SRSR));
524 dprintk (SX_DEBUG_INIT, "TRAR = %02x, ", sx_in(bp, CD186x_TRAR));
525 dprintk (SX_DEBUG_INIT, "GIVR = %02x, ", sx_in(bp, CD186x_GIVR));
526 dprintk (SX_DEBUG_INIT, "GICR = %02x, ", sx_in(bp, CD186x_GICR));
527 dprintk (SX_DEBUG_INIT, "\n");
528
529 /* Reset CD186x again */
530 if (!sx_init_CD186x(bp)) {
531 /* Hmmm. This is dead code anyway. */
532 }
533
534 dprintk (SX_DEBUG_INIT "val1 = %02x, val2 = %02x, val3 = %02x.\n",
535 val1, val2, val3);
536
537 }
538
539#if 0
540 if (irqs <= 0) {
541 printk(KERN_ERR "sx%d: Can't find IRQ for specialix IO8+ board at 0x%03x.\n",
542 board_No(bp), bp->base);
543 sx_release_io_range(bp);
544 func_exit();
545 return 1;
546 }
547#endif
548 printk (KERN_INFO "Started with irq=%d, but now have irq=%d.\n", bp->irq, irqs);
549 if (irqs > 0)
550 bp->irq = irqs;
551#endif
552 /* Reset CD186x again */ 470 /* Reset CD186x again */
553 if (!sx_init_CD186x(bp)) { 471 if (!sx_init_CD186x(bp)) {
554 sx_release_io_range(bp); 472 sx_release_io_range(bp);
@@ -560,7 +478,7 @@ static int sx_probe(struct specialix_board *bp)
560 bp->flags |= SX_BOARD_PRESENT; 478 bp->flags |= SX_BOARD_PRESENT;
561 479
562 /* Chip revcode pkgtype 480 /* Chip revcode pkgtype
563 GFRCR SRCR bit 7 481 GFRCR SRCR bit 7
564 CD180 rev B 0x81 0 482 CD180 rev B 0x81 0
565 CD180 rev C 0x82 0 483 CD180 rev C 0x82 0
566 CD1864 rev A 0x82 1 484 CD1864 rev A 0x82 1
@@ -570,24 +488,32 @@ static int sx_probe(struct specialix_board *bp)
570 */ 488 */
571 489
572 switch (sx_in_off(bp, CD186x_GFRCR)) { 490 switch (sx_in_off(bp, CD186x_GFRCR)) {
573 case 0x82:chip = 1864;rev='A';break; 491 case 0x82:
574 case 0x83:chip = 1865;rev='A';break; 492 chip = 1864;
575 case 0x84:chip = 1865;rev='B';break; 493 rev = 'A';
576 case 0x85:chip = 1865;rev='C';break; /* Does not exist at this time */ 494 break;
577 default:chip=-1;rev='x'; 495 case 0x83:
496 chip = 1865;
497 rev = 'A';
498 break;
499 case 0x84:
500 chip = 1865;
501 rev = 'B';
502 break;
503 case 0x85:
504 chip = 1865;
505 rev = 'C';
506 break; /* Does not exist at this time */
507 default:
508 chip = -1;
509 rev = 'x';
578 } 510 }
579 511
580 dprintk (SX_DEBUG_INIT, " GFCR = 0x%02x\n", sx_in_off(bp, CD186x_GFRCR) ); 512 dprintk(SX_DEBUG_INIT, " GFCR = 0x%02x\n", sx_in_off(bp, CD186x_GFRCR));
581
582#ifdef SPECIALIX_TIMER
583 setup_timer(&missed_irq_timer, missed_irq, (unsigned long)bp);
584 mod_timer(&missed_irq_timer, jiffies + sx_poll);
585#endif
586 513
587 printk(KERN_INFO"sx%d: specialix IO8+ board detected at 0x%03x, IRQ %d, CD%d Rev. %c.\n", 514 printk(KERN_INFO
588 board_No(bp), 515 "sx%d: specialix IO8+ board detected at 0x%03x, IRQ %d, CD%d Rev. %c.\n",
589 bp->base, bp->irq, 516 board_No(bp), bp->base, bp->irq, chip, rev);
590 chip, rev);
591 517
592 func_exit(); 518 func_exit();
593 return 0; 519 return 0;
@@ -598,20 +524,22 @@ static int sx_probe(struct specialix_board *bp)
598 * Interrupt processing routines. 524 * Interrupt processing routines.
599 * */ 525 * */
600 526
601static inline struct specialix_port * sx_get_port(struct specialix_board * bp, 527static struct specialix_port *sx_get_port(struct specialix_board *bp,
602 unsigned char const * what) 528 unsigned char const *what)
603{ 529{
604 unsigned char channel; 530 unsigned char channel;
605 struct specialix_port * port = NULL; 531 struct specialix_port *port = NULL;
606 532
607 channel = sx_in(bp, CD186x_GICR) >> GICR_CHAN_OFF; 533 channel = sx_in(bp, CD186x_GICR) >> GICR_CHAN_OFF;
608 dprintk (SX_DEBUG_CHAN, "channel: %d\n", channel); 534 dprintk(SX_DEBUG_CHAN, "channel: %d\n", channel);
609 if (channel < CD186x_NCH) { 535 if (channel < CD186x_NCH) {
610 port = &sx_port[board_No(bp) * SX_NPORT + channel]; 536 port = &sx_port[board_No(bp) * SX_NPORT + channel];
611 dprintk (SX_DEBUG_CHAN, "port: %d %p flags: 0x%lx\n",board_No(bp) * SX_NPORT + channel, port, port->port.flags & ASYNC_INITIALIZED); 537 dprintk(SX_DEBUG_CHAN, "port: %d %p flags: 0x%lx\n",
538 board_No(bp) * SX_NPORT + channel, port,
539 port->port.flags & ASYNC_INITIALIZED);
612 540
613 if (port->port.flags & ASYNC_INITIALIZED) { 541 if (port->port.flags & ASYNC_INITIALIZED) {
614 dprintk (SX_DEBUG_CHAN, "port: %d %p\n", channel, port); 542 dprintk(SX_DEBUG_CHAN, "port: %d %p\n", channel, port);
615 func_exit(); 543 func_exit();
616 return port; 544 return port;
617 } 545 }
@@ -622,7 +550,7 @@ static inline struct specialix_port * sx_get_port(struct specialix_board * bp,
622} 550}
623 551
624 552
625static inline void sx_receive_exc(struct specialix_board * bp) 553static void sx_receive_exc(struct specialix_board *bp)
626{ 554{
627 struct specialix_port *port; 555 struct specialix_port *port;
628 struct tty_struct *tty; 556 struct tty_struct *tty;
@@ -633,7 +561,7 @@ static inline void sx_receive_exc(struct specialix_board * bp)
633 561
634 port = sx_get_port(bp, "Receive"); 562 port = sx_get_port(bp, "Receive");
635 if (!port) { 563 if (!port) {
636 dprintk (SX_DEBUG_RX, "Hmm, couldn't find port.\n"); 564 dprintk(SX_DEBUG_RX, "Hmm, couldn't find port.\n");
637 func_exit(); 565 func_exit();
638 return; 566 return;
639 } 567 }
@@ -641,19 +569,21 @@ static inline void sx_receive_exc(struct specialix_board * bp)
641 569
642 status = sx_in(bp, CD186x_RCSR); 570 status = sx_in(bp, CD186x_RCSR);
643 571
644 dprintk (SX_DEBUG_RX, "status: 0x%x\n", status); 572 dprintk(SX_DEBUG_RX, "status: 0x%x\n", status);
645 if (status & RCSR_OE) { 573 if (status & RCSR_OE) {
646 port->overrun++; 574 port->overrun++;
647 dprintk(SX_DEBUG_FIFO, "sx%d: port %d: Overrun. Total %ld overruns.\n", 575 dprintk(SX_DEBUG_FIFO,
648 board_No(bp), port_No(port), port->overrun); 576 "sx%d: port %d: Overrun. Total %ld overruns.\n",
577 board_No(bp), port_No(port), port->overrun);
649 } 578 }
650 status &= port->mark_mask; 579 status &= port->mark_mask;
651 580
652 /* This flip buffer check needs to be below the reading of the 581 /* This flip buffer check needs to be below the reading of the
653 status register to reset the chip's IRQ.... */ 582 status register to reset the chip's IRQ.... */
654 if (tty_buffer_request_room(tty, 1) == 0) { 583 if (tty_buffer_request_room(tty, 1) == 0) {
655 dprintk(SX_DEBUG_FIFO, "sx%d: port %d: Working around flip buffer overflow.\n", 584 dprintk(SX_DEBUG_FIFO,
656 board_No(bp), port_No(port)); 585 "sx%d: port %d: Working around flip buffer overflow.\n",
586 board_No(bp), port_No(port));
657 func_exit(); 587 func_exit();
658 return; 588 return;
659 } 589 }
@@ -664,8 +594,9 @@ static inline void sx_receive_exc(struct specialix_board * bp)
664 return; 594 return;
665 } 595 }
666 if (status & RCSR_TOUT) { 596 if (status & RCSR_TOUT) {
667 printk(KERN_INFO "sx%d: port %d: Receiver timeout. Hardware problems ?\n", 597 printk(KERN_INFO
668 board_No(bp), port_No(port)); 598 "sx%d: port %d: Receiver timeout. Hardware problems ?\n",
599 board_No(bp), port_No(port));
669 func_exit(); 600 func_exit();
670 return; 601 return;
671 602
@@ -688,13 +619,13 @@ static inline void sx_receive_exc(struct specialix_board * bp)
688 else 619 else
689 flag = TTY_NORMAL; 620 flag = TTY_NORMAL;
690 621
691 if(tty_insert_flip_char(tty, ch, flag)) 622 if (tty_insert_flip_char(tty, ch, flag))
692 tty_flip_buffer_push(tty); 623 tty_flip_buffer_push(tty);
693 func_exit(); 624 func_exit();
694} 625}
695 626
696 627
697static inline void sx_receive(struct specialix_board * bp) 628static void sx_receive(struct specialix_board *bp)
698{ 629{
699 struct specialix_port *port; 630 struct specialix_port *port;
700 struct tty_struct *tty; 631 struct tty_struct *tty;
@@ -702,15 +633,16 @@ static inline void sx_receive(struct specialix_board * bp)
702 633
703 func_enter(); 634 func_enter();
704 635
705 if (!(port = sx_get_port(bp, "Receive"))) { 636 port = sx_get_port(bp, "Receive");
706 dprintk (SX_DEBUG_RX, "Hmm, couldn't find port.\n"); 637 if (port == NULL) {
638 dprintk(SX_DEBUG_RX, "Hmm, couldn't find port.\n");
707 func_exit(); 639 func_exit();
708 return; 640 return;
709 } 641 }
710 tty = port->port.tty; 642 tty = port->port.tty;
711 643
712 count = sx_in(bp, CD186x_RDCR); 644 count = sx_in(bp, CD186x_RDCR);
713 dprintk (SX_DEBUG_RX, "port: %p: count: %d\n", port, count); 645 dprintk(SX_DEBUG_RX, "port: %p: count: %d\n", port, count);
714 port->hits[count > 8 ? 9 : count]++; 646 port->hits[count > 8 ? 9 : count]++;
715 647
716 tty_buffer_request_room(tty, count); 648 tty_buffer_request_room(tty, count);
@@ -722,18 +654,19 @@ static inline void sx_receive(struct specialix_board * bp)
722} 654}
723 655
724 656
725static inline void sx_transmit(struct specialix_board * bp) 657static void sx_transmit(struct specialix_board *bp)
726{ 658{
727 struct specialix_port *port; 659 struct specialix_port *port;
728 struct tty_struct *tty; 660 struct tty_struct *tty;
729 unsigned char count; 661 unsigned char count;
730 662
731 func_enter(); 663 func_enter();
732 if (!(port = sx_get_port(bp, "Transmit"))) { 664 port = sx_get_port(bp, "Transmit");
665 if (port == NULL) {
733 func_exit(); 666 func_exit();
734 return; 667 return;
735 } 668 }
736 dprintk (SX_DEBUG_TX, "port: %p\n", port); 669 dprintk(SX_DEBUG_TX, "port: %p\n", port);
737 tty = port->port.tty; 670 tty = port->port.tty;
738 671
739 if (port->IER & IER_TXEMPTY) { 672 if (port->IER & IER_TXEMPTY) {
@@ -765,7 +698,8 @@ static inline void sx_transmit(struct specialix_board * bp)
765 sx_out(bp, CD186x_TDR, CD186x_C_ESC); 698 sx_out(bp, CD186x_TDR, CD186x_C_ESC);
766 sx_out(bp, CD186x_TDR, CD186x_C_DELAY); 699 sx_out(bp, CD186x_TDR, CD186x_C_DELAY);
767 sx_out(bp, CD186x_TDR, count); 700 sx_out(bp, CD186x_TDR, count);
768 if (!(port->break_length -= count)) 701 port->break_length -= count;
702 if (port->break_length == 0)
769 port->break_length--; 703 port->break_length--;
770 } else { 704 } else {
771 sx_out(bp, CD186x_TDR, CD186x_C_ESC); 705 sx_out(bp, CD186x_TDR, CD186x_C_ESC);
@@ -794,36 +728,36 @@ static inline void sx_transmit(struct specialix_board * bp)
794 sx_out(bp, CD186x_IER, port->IER); 728 sx_out(bp, CD186x_IER, port->IER);
795 } 729 }
796 if (port->xmit_cnt <= port->wakeup_chars) 730 if (port->xmit_cnt <= port->wakeup_chars)
797 tty_wakeup(tty); 731 tty_wakeup(tty);
798 732
799 func_exit(); 733 func_exit();
800} 734}
801 735
802 736
803static inline void sx_check_modem(struct specialix_board * bp) 737static void sx_check_modem(struct specialix_board *bp)
804{ 738{
805 struct specialix_port *port; 739 struct specialix_port *port;
806 struct tty_struct *tty; 740 struct tty_struct *tty;
807 unsigned char mcr; 741 unsigned char mcr;
808 int msvr_cd; 742 int msvr_cd;
809 743
810 dprintk (SX_DEBUG_SIGNALS, "Modem intr. "); 744 dprintk(SX_DEBUG_SIGNALS, "Modem intr. ");
811 if (!(port = sx_get_port(bp, "Modem"))) 745 port = sx_get_port(bp, "Modem");
746 if (port == NULL)
812 return; 747 return;
813 748
814 tty = port->port.tty; 749 tty = port->port.tty;
815 750
816 mcr = sx_in(bp, CD186x_MCR); 751 mcr = sx_in(bp, CD186x_MCR);
817 printk ("mcr = %02x.\n", mcr);
818 752
819 if ((mcr & MCR_CDCHG)) { 753 if ((mcr & MCR_CDCHG)) {
820 dprintk (SX_DEBUG_SIGNALS, "CD just changed... "); 754 dprintk(SX_DEBUG_SIGNALS, "CD just changed... ");
821 msvr_cd = sx_in(bp, CD186x_MSVR) & MSVR_CD; 755 msvr_cd = sx_in(bp, CD186x_MSVR) & MSVR_CD;
822 if (msvr_cd) { 756 if (msvr_cd) {
823 dprintk (SX_DEBUG_SIGNALS, "Waking up guys in open.\n"); 757 dprintk(SX_DEBUG_SIGNALS, "Waking up guys in open.\n");
824 wake_up_interruptible(&port->port.open_wait); 758 wake_up_interruptible(&port->port.open_wait);
825 } else { 759 } else {
826 dprintk (SX_DEBUG_SIGNALS, "Sending HUP.\n"); 760 dprintk(SX_DEBUG_SIGNALS, "Sending HUP.\n");
827 tty_hangup(tty); 761 tty_hangup(tty);
828 } 762 }
829 } 763 }
@@ -874,9 +808,12 @@ static irqreturn_t sx_interrupt(int dummy, void *dev_id)
874 808
875 spin_lock_irqsave(&bp->lock, flags); 809 spin_lock_irqsave(&bp->lock, flags);
876 810
877 dprintk (SX_DEBUG_FLOW, "enter %s port %d room: %ld\n", __func__, port_No(sx_get_port(bp, "INT")), SERIAL_XMIT_SIZE - sx_get_port(bp, "ITN")->xmit_cnt - 1); 811 dprintk(SX_DEBUG_FLOW, "enter %s port %d room: %ld\n", __func__,
812 port_No(sx_get_port(bp, "INT")),
813 SERIAL_XMIT_SIZE - sx_get_port(bp, "ITN")->xmit_cnt - 1);
878 if (!(bp->flags & SX_BOARD_ACTIVE)) { 814 if (!(bp->flags & SX_BOARD_ACTIVE)) {
879 dprintk (SX_DEBUG_IRQ, "sx: False interrupt. irq %d.\n", bp->irq); 815 dprintk(SX_DEBUG_IRQ, "sx: False interrupt. irq %d.\n",
816 bp->irq);
880 spin_unlock_irqrestore(&bp->lock, flags); 817 spin_unlock_irqrestore(&bp->lock, flags);
881 func_exit(); 818 func_exit();
882 return IRQ_NONE; 819 return IRQ_NONE;
@@ -884,10 +821,11 @@ static irqreturn_t sx_interrupt(int dummy, void *dev_id)
884 821
885 saved_reg = bp->reg; 822 saved_reg = bp->reg;
886 823
887 while ((++loop < 16) && (status = (sx_in(bp, CD186x_SRSR) & 824 while (++loop < 16) {
888 (SRSR_RREQint | 825 status = sx_in(bp, CD186x_SRSR) &
889 SRSR_TREQint | 826 (SRSR_RREQint | SRSR_TREQint | SRSR_MREQint);
890 SRSR_MREQint)))) { 827 if (status == 0)
828 break;
891 if (status & SRSR_RREQint) { 829 if (status & SRSR_RREQint) {
892 ack = sx_in(bp, CD186x_RRAR); 830 ack = sx_in(bp, CD186x_RRAR);
893 831
@@ -896,8 +834,9 @@ static irqreturn_t sx_interrupt(int dummy, void *dev_id)
896 else if (ack == (SX_ID | GIVR_IT_REXC)) 834 else if (ack == (SX_ID | GIVR_IT_REXC))
897 sx_receive_exc(bp); 835 sx_receive_exc(bp);
898 else 836 else
899 printk(KERN_ERR "sx%d: status: 0x%x Bad receive ack 0x%02x.\n", 837 printk(KERN_ERR
900 board_No(bp), status, ack); 838 "sx%d: status: 0x%x Bad receive ack 0x%02x.\n",
839 board_No(bp), status, ack);
901 840
902 } else if (status & SRSR_TREQint) { 841 } else if (status & SRSR_TREQint) {
903 ack = sx_in(bp, CD186x_TRAR); 842 ack = sx_in(bp, CD186x_TRAR);
@@ -906,14 +845,16 @@ static irqreturn_t sx_interrupt(int dummy, void *dev_id)
906 sx_transmit(bp); 845 sx_transmit(bp);
907 else 846 else
908 printk(KERN_ERR "sx%d: status: 0x%x Bad transmit ack 0x%02x. port: %d\n", 847 printk(KERN_ERR "sx%d: status: 0x%x Bad transmit ack 0x%02x. port: %d\n",
909 board_No(bp), status, ack, port_No (sx_get_port (bp, "Int"))); 848 board_No(bp), status, ack,
849 port_No(sx_get_port(bp, "Int")));
910 } else if (status & SRSR_MREQint) { 850 } else if (status & SRSR_MREQint) {
911 ack = sx_in(bp, CD186x_MRAR); 851 ack = sx_in(bp, CD186x_MRAR);
912 852
913 if (ack == (SX_ID | GIVR_IT_MODEM)) 853 if (ack == (SX_ID | GIVR_IT_MODEM))
914 sx_check_modem(bp); 854 sx_check_modem(bp);
915 else 855 else
916 printk(KERN_ERR "sx%d: status: 0x%x Bad modem ack 0x%02x.\n", 856 printk(KERN_ERR
857 "sx%d: status: 0x%x Bad modem ack 0x%02x.\n",
917 board_No(bp), status, ack); 858 board_No(bp), status, ack);
918 859
919 } 860 }
@@ -921,7 +862,7 @@ static irqreturn_t sx_interrupt(int dummy, void *dev_id)
921 sx_out(bp, CD186x_EOIR, 0); /* Mark end of interrupt */ 862 sx_out(bp, CD186x_EOIR, 0); /* Mark end of interrupt */
922 } 863 }
923 bp->reg = saved_reg; 864 bp->reg = saved_reg;
924 outb (bp->reg, bp->base + SX_ADDR_REG); 865 outb(bp->reg, bp->base + SX_ADDR_REG);
925 spin_unlock_irqrestore(&bp->lock, flags); 866 spin_unlock_irqrestore(&bp->lock, flags);
926 func_exit(); 867 func_exit();
927 return IRQ_HANDLED; 868 return IRQ_HANDLED;
@@ -932,36 +873,26 @@ static irqreturn_t sx_interrupt(int dummy, void *dev_id)
932 * Routines for open & close processing. 873 * Routines for open & close processing.
933 */ 874 */
934 875
935static void turn_ints_off (struct specialix_board *bp) 876static void turn_ints_off(struct specialix_board *bp)
936{ 877{
937 unsigned long flags; 878 unsigned long flags;
938 879
939 func_enter(); 880 func_enter();
940 if (bp->flags & SX_BOARD_IS_PCI) {
941 /* This was intended for enabeling the interrupt on the
942 * PCI card. However it seems that it's already enabled
943 * and as PCI interrupts can be shared, there is no real
944 * reason to have to turn it off. */
945 }
946
947 spin_lock_irqsave(&bp->lock, flags); 881 spin_lock_irqsave(&bp->lock, flags);
948 (void) sx_in_off (bp, 0); /* Turn off interrupts. */ 882 (void) sx_in_off(bp, 0); /* Turn off interrupts. */
949 spin_unlock_irqrestore(&bp->lock, flags); 883 spin_unlock_irqrestore(&bp->lock, flags);
950 884
951 func_exit(); 885 func_exit();
952} 886}
953 887
954static void turn_ints_on (struct specialix_board *bp) 888static void turn_ints_on(struct specialix_board *bp)
955{ 889{
956 unsigned long flags; 890 unsigned long flags;
957 891
958 func_enter(); 892 func_enter();
959 893
960 if (bp->flags & SX_BOARD_IS_PCI) {
961 /* play with the PCI chip. See comment above. */
962 }
963 spin_lock_irqsave(&bp->lock, flags); 894 spin_lock_irqsave(&bp->lock, flags);
964 (void) sx_in (bp, 0); /* Turn ON interrupts. */ 895 (void) sx_in(bp, 0); /* Turn ON interrupts. */
965 spin_unlock_irqrestore(&bp->lock, flags); 896 spin_unlock_irqrestore(&bp->lock, flags);
966 897
967 func_exit(); 898 func_exit();
@@ -969,7 +900,7 @@ static void turn_ints_on (struct specialix_board *bp)
969 900
970 901
971/* Called with disabled interrupts */ 902/* Called with disabled interrupts */
972static inline int sx_setup_board(struct specialix_board * bp) 903static int sx_setup_board(struct specialix_board *bp)
973{ 904{
974 int error; 905 int error;
975 906
@@ -977,14 +908,16 @@ static inline int sx_setup_board(struct specialix_board * bp)
977 return 0; 908 return 0;
978 909
979 if (bp->flags & SX_BOARD_IS_PCI) 910 if (bp->flags & SX_BOARD_IS_PCI)
980 error = request_irq(bp->irq, sx_interrupt, IRQF_DISABLED | IRQF_SHARED, "specialix IO8+", bp); 911 error = request_irq(bp->irq, sx_interrupt,
912 IRQF_DISABLED | IRQF_SHARED, "specialix IO8+", bp);
981 else 913 else
982 error = request_irq(bp->irq, sx_interrupt, IRQF_DISABLED, "specialix IO8+", bp); 914 error = request_irq(bp->irq, sx_interrupt,
915 IRQF_DISABLED, "specialix IO8+", bp);
983 916
984 if (error) 917 if (error)
985 return error; 918 return error;
986 919
987 turn_ints_on (bp); 920 turn_ints_on(bp);
988 bp->flags |= SX_BOARD_ACTIVE; 921 bp->flags |= SX_BOARD_ACTIVE;
989 922
990 return 0; 923 return 0;
@@ -992,7 +925,7 @@ static inline int sx_setup_board(struct specialix_board * bp)
992 925
993 926
994/* Called with disabled interrupts */ 927/* Called with disabled interrupts */
995static inline void sx_shutdown_board(struct specialix_board *bp) 928static void sx_shutdown_board(struct specialix_board *bp)
996{ 929{
997 func_enter(); 930 func_enter();
998 931
@@ -1003,22 +936,26 @@ static inline void sx_shutdown_board(struct specialix_board *bp)
1003 936
1004 bp->flags &= ~SX_BOARD_ACTIVE; 937 bp->flags &= ~SX_BOARD_ACTIVE;
1005 938
1006 dprintk (SX_DEBUG_IRQ, "Freeing IRQ%d for board %d.\n", 939 dprintk(SX_DEBUG_IRQ, "Freeing IRQ%d for board %d.\n",
1007 bp->irq, board_No (bp)); 940 bp->irq, board_No(bp));
1008 free_irq(bp->irq, bp); 941 free_irq(bp->irq, bp);
1009 942 turn_ints_off(bp);
1010 turn_ints_off (bp);
1011
1012
1013 func_exit(); 943 func_exit();
1014} 944}
1015 945
946static unsigned int sx_crtscts(struct tty_struct *tty)
947{
948 if (sx_rtscts)
949 return C_CRTSCTS(tty);
950 return 1;
951}
1016 952
1017/* 953/*
1018 * Setting up port characteristics. 954 * Setting up port characteristics.
1019 * Must be called with disabled interrupts 955 * Must be called with disabled interrupts
1020 */ 956 */
1021static void sx_change_speed(struct specialix_board *bp, struct specialix_port *port) 957static void sx_change_speed(struct specialix_board *bp,
958 struct specialix_port *port)
1022{ 959{
1023 struct tty_struct *tty; 960 struct tty_struct *tty;
1024 unsigned long baud; 961 unsigned long baud;
@@ -1030,7 +967,8 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1030 967
1031 func_enter(); 968 func_enter();
1032 969
1033 if (!(tty = port->port.tty) || !tty->termios) { 970 tty = port->port.tty;
971 if (!tty || !tty->termios) {
1034 func_exit(); 972 func_exit();
1035 return; 973 return;
1036 } 974 }
@@ -1043,12 +981,12 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1043 981
1044 /* The Specialix board doens't implement the RTS lines. 982 /* The Specialix board doens't implement the RTS lines.
1045 They are used to set the IRQ level. Don't touch them. */ 983 They are used to set the IRQ level. Don't touch them. */
1046 if (SX_CRTSCTS(tty)) 984 if (sx_crtscts(tty))
1047 port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS); 985 port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS);
1048 else 986 else
1049 port->MSVR = (sx_in(bp, CD186x_MSVR) & MSVR_RTS); 987 port->MSVR = (sx_in(bp, CD186x_MSVR) & MSVR_RTS);
1050 spin_unlock_irqrestore(&bp->lock, flags); 988 spin_unlock_irqrestore(&bp->lock, flags);
1051 dprintk (SX_DEBUG_TERMIOS, "sx: got MSVR=%02x.\n", port->MSVR); 989 dprintk(SX_DEBUG_TERMIOS, "sx: got MSVR=%02x.\n", port->MSVR);
1052 baud = tty_get_baud_rate(tty); 990 baud = tty_get_baud_rate(tty);
1053 991
1054 if (baud == 38400) { 992 if (baud == 38400) {
@@ -1060,21 +998,19 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1060 998
1061 if (!baud) { 999 if (!baud) {
1062 /* Drop DTR & exit */ 1000 /* Drop DTR & exit */
1063 dprintk (SX_DEBUG_TERMIOS, "Dropping DTR... Hmm....\n"); 1001 dprintk(SX_DEBUG_TERMIOS, "Dropping DTR... Hmm....\n");
1064 if (!SX_CRTSCTS (tty)) { 1002 if (!sx_crtscts(tty)) {
1065 port -> MSVR &= ~ MSVR_DTR; 1003 port->MSVR &= ~MSVR_DTR;
1066 spin_lock_irqsave(&bp->lock, flags); 1004 spin_lock_irqsave(&bp->lock, flags);
1067 sx_out(bp, CD186x_MSVR, port->MSVR ); 1005 sx_out(bp, CD186x_MSVR, port->MSVR);
1068 spin_unlock_irqrestore(&bp->lock, flags); 1006 spin_unlock_irqrestore(&bp->lock, flags);
1069 } 1007 } else
1070 else 1008 dprintk(SX_DEBUG_TERMIOS, "Can't drop DTR: no DTR.\n");
1071 dprintk (SX_DEBUG_TERMIOS, "Can't drop DTR: no DTR.\n");
1072 return; 1009 return;
1073 } else { 1010 } else {
1074 /* Set DTR on */ 1011 /* Set DTR on */
1075 if (!SX_CRTSCTS (tty)) { 1012 if (!sx_crtscts(tty))
1076 port ->MSVR |= MSVR_DTR; 1013 port->MSVR |= MSVR_DTR;
1077 }
1078 } 1014 }
1079 1015
1080 /* 1016 /*
@@ -1083,28 +1019,27 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1083 1019
1084 /* Set baud rate for port */ 1020 /* Set baud rate for port */
1085 tmp = port->custom_divisor ; 1021 tmp = port->custom_divisor ;
1086 if ( tmp ) 1022 if (tmp)
1087 printk (KERN_INFO "sx%d: Using custom baud rate divisor %ld. \n" 1023 printk(KERN_INFO
1088 "This is an untested option, please be carefull.\n", 1024 "sx%d: Using custom baud rate divisor %ld. \n"
1089 port_No (port), tmp); 1025 "This is an untested option, please be careful.\n",
1026 port_No(port), tmp);
1090 else 1027 else
1091 tmp = (((SX_OSCFREQ + baud/2) / baud + 1028 tmp = (((SX_OSCFREQ + baud/2) / baud + CD186x_TPC/2) /
1092 CD186x_TPC/2) / CD186x_TPC); 1029 CD186x_TPC);
1093 1030
1094 if ((tmp < 0x10) && time_before(again, jiffies)) { 1031 if (tmp < 0x10 && time_before(again, jiffies)) {
1095 again = jiffies + HZ * 60; 1032 again = jiffies + HZ * 60;
1096 /* Page 48 of version 2.0 of the CL-CD1865 databook */ 1033 /* Page 48 of version 2.0 of the CL-CD1865 databook */
1097 if (tmp >= 12) { 1034 if (tmp >= 12) {
1098 printk (KERN_INFO "sx%d: Baud rate divisor is %ld. \n" 1035 printk(KERN_INFO "sx%d: Baud rate divisor is %ld. \n"
1099 "Performance degradation is possible.\n" 1036 "Performance degradation is possible.\n"
1100 "Read specialix.txt for more info.\n", 1037 "Read specialix.txt for more info.\n",
1101 port_No (port), tmp); 1038 port_No(port), tmp);
1102 } else { 1039 } else {
1103 printk (KERN_INFO "sx%d: Baud rate divisor is %ld. \n" 1040 printk(KERN_INFO "sx%d: Baud rate divisor is %ld. \n"
1104 "Warning: overstressing Cirrus chip. " 1041 "Warning: overstressing Cirrus chip. This might not work.\n"
1105 "This might not work.\n" 1042 "Read specialix.txt for more info.\n", port_No(port), tmp);
1106 "Read specialix.txt for more info.\n",
1107 port_No (port), tmp);
1108 } 1043 }
1109 } 1044 }
1110 spin_lock_irqsave(&bp->lock, flags); 1045 spin_lock_irqsave(&bp->lock, flags);
@@ -1114,7 +1049,8 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1114 sx_out(bp, CD186x_TBPRL, tmp & 0xff); 1049 sx_out(bp, CD186x_TBPRL, tmp & 0xff);
1115 spin_unlock_irqrestore(&bp->lock, flags); 1050 spin_unlock_irqrestore(&bp->lock, flags);
1116 if (port->custom_divisor) 1051 if (port->custom_divisor)
1117 baud = (SX_OSCFREQ + port->custom_divisor/2) / port->custom_divisor; 1052 baud = (SX_OSCFREQ + port->custom_divisor/2) /
1053 port->custom_divisor;
1118 baud = (baud + 5) / 10; /* Estimated CPS */ 1054 baud = (baud + 5) / 10; /* Estimated CPS */
1119 1055
1120 /* Two timer ticks seems enough to wakeup something like SLIP driver */ 1056 /* Two timer ticks seems enough to wakeup something like SLIP driver */
@@ -1129,16 +1065,16 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1129 sx_out(bp, CD186x_RTPR, tmp); 1065 sx_out(bp, CD186x_RTPR, tmp);
1130 spin_unlock_irqrestore(&bp->lock, flags); 1066 spin_unlock_irqrestore(&bp->lock, flags);
1131 switch (C_CSIZE(tty)) { 1067 switch (C_CSIZE(tty)) {
1132 case CS5: 1068 case CS5:
1133 cor1 |= COR1_5BITS; 1069 cor1 |= COR1_5BITS;
1134 break; 1070 break;
1135 case CS6: 1071 case CS6:
1136 cor1 |= COR1_6BITS; 1072 cor1 |= COR1_6BITS;
1137 break; 1073 break;
1138 case CS7: 1074 case CS7:
1139 cor1 |= COR1_7BITS; 1075 cor1 |= COR1_7BITS;
1140 break; 1076 break;
1141 case CS8: 1077 case CS8:
1142 cor1 |= COR1_8BITS; 1078 cor1 |= COR1_8BITS;
1143 break; 1079 break;
1144 } 1080 }
@@ -1175,7 +1111,8 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1175 mcor1 |= MCOR1_DSRZD | MCOR1_CTSZD; 1111 mcor1 |= MCOR1_DSRZD | MCOR1_CTSZD;
1176 mcor2 |= MCOR2_DSROD | MCOR2_CTSOD; 1112 mcor2 |= MCOR2_DSROD | MCOR2_CTSOD;
1177 spin_lock_irqsave(&bp->lock, flags); 1113 spin_lock_irqsave(&bp->lock, flags);
1178 tty->hw_stopped = !(sx_in(bp, CD186x_MSVR) & (MSVR_CTS|MSVR_DSR)); 1114 tty->hw_stopped = !(sx_in(bp, CD186x_MSVR) &
1115 (MSVR_CTS|MSVR_DSR));
1179 spin_unlock_irqrestore(&bp->lock, flags); 1116 spin_unlock_irqrestore(&bp->lock, flags);
1180#else 1117#else
1181 port->COR2 |= COR2_CTSAE; 1118 port->COR2 |= COR2_CTSAE;
@@ -1219,7 +1156,8 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1219 spin_lock_irqsave(&bp->lock, flags); 1156 spin_lock_irqsave(&bp->lock, flags);
1220 sx_out(bp, CD186x_CCR, CCR_CORCHG1 | CCR_CORCHG2 | CCR_CORCHG3); 1157 sx_out(bp, CD186x_CCR, CCR_CORCHG1 | CCR_CORCHG2 | CCR_CORCHG3);
1221 /* Setting up modem option registers */ 1158 /* Setting up modem option registers */
1222 dprintk (SX_DEBUG_TERMIOS, "Mcor1 = %02x, mcor2 = %02x.\n", mcor1, mcor2); 1159 dprintk(SX_DEBUG_TERMIOS, "Mcor1 = %02x, mcor2 = %02x.\n",
1160 mcor1, mcor2);
1223 sx_out(bp, CD186x_MCOR1, mcor1); 1161 sx_out(bp, CD186x_MCOR1, mcor1);
1224 sx_out(bp, CD186x_MCOR2, mcor2); 1162 sx_out(bp, CD186x_MCOR2, mcor2);
1225 spin_unlock_irqrestore(&bp->lock, flags); 1163 spin_unlock_irqrestore(&bp->lock, flags);
@@ -1238,7 +1176,8 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
1238 1176
1239 1177
1240/* Must be called with interrupts enabled */ 1178/* Must be called with interrupts enabled */
1241static int sx_setup_port(struct specialix_board *bp, struct specialix_port *port) 1179static int sx_setup_port(struct specialix_board *bp,
1180 struct specialix_port *port)
1242{ 1181{
1243 unsigned long flags; 1182 unsigned long flags;
1244 1183
@@ -1253,7 +1192,8 @@ static int sx_setup_port(struct specialix_board *bp, struct specialix_port *port
1253 /* We may sleep in get_zeroed_page() */ 1192 /* We may sleep in get_zeroed_page() */
1254 unsigned long tmp; 1193 unsigned long tmp;
1255 1194
1256 if (!(tmp = get_zeroed_page(GFP_KERNEL))) { 1195 tmp = get_zeroed_page(GFP_KERNEL);
1196 if (tmp == 0L) {
1257 func_exit(); 1197 func_exit();
1258 return -ENOMEM; 1198 return -ENOMEM;
1259 } 1199 }
@@ -1284,7 +1224,8 @@ static int sx_setup_port(struct specialix_board *bp, struct specialix_port *port
1284 1224
1285 1225
1286/* Must be called with interrupts disabled */ 1226/* Must be called with interrupts disabled */
1287static void sx_shutdown_port(struct specialix_board *bp, struct specialix_port *port) 1227static void sx_shutdown_port(struct specialix_board *bp,
1228 struct specialix_port *port)
1288{ 1229{
1289 struct tty_struct *tty; 1230 struct tty_struct *tty;
1290 int i; 1231 int i;
@@ -1298,11 +1239,11 @@ static void sx_shutdown_port(struct specialix_board *bp, struct specialix_port *
1298 } 1239 }
1299 1240
1300 if (sx_debug & SX_DEBUG_FIFO) { 1241 if (sx_debug & SX_DEBUG_FIFO) {
1301 dprintk(SX_DEBUG_FIFO, "sx%d: port %d: %ld overruns, FIFO hits [ ", 1242 dprintk(SX_DEBUG_FIFO,
1302 board_No(bp), port_No(port), port->overrun); 1243 "sx%d: port %d: %ld overruns, FIFO hits [ ",
1303 for (i = 0; i < 10; i++) { 1244 board_No(bp), port_No(port), port->overrun);
1245 for (i = 0; i < 10; i++)
1304 dprintk(SX_DEBUG_FIFO, "%ld ", port->hits[i]); 1246 dprintk(SX_DEBUG_FIFO, "%ld ", port->hits[i]);
1305 }
1306 dprintk(SX_DEBUG_FIFO, "].\n"); 1247 dprintk(SX_DEBUG_FIFO, "].\n");
1307 } 1248 }
1308 1249
@@ -1315,7 +1256,8 @@ static void sx_shutdown_port(struct specialix_board *bp, struct specialix_port *
1315 spin_lock_irqsave(&bp->lock, flags); 1256 spin_lock_irqsave(&bp->lock, flags);
1316 sx_out(bp, CD186x_CAR, port_No(port)); 1257 sx_out(bp, CD186x_CAR, port_No(port));
1317 1258
1318 if (!(tty = port->port.tty) || C_HUPCL(tty)) { 1259 tty = port->port.tty;
1260 if (tty == NULL || C_HUPCL(tty)) {
1319 /* Drop DTR */ 1261 /* Drop DTR */
1320 sx_out(bp, CD186x_MSVDTR, 0); 1262 sx_out(bp, CD186x_MSVDTR, 0);
1321 } 1263 }
@@ -1338,8 +1280,8 @@ static void sx_shutdown_port(struct specialix_board *bp, struct specialix_port *
1338} 1280}
1339 1281
1340 1282
1341static int block_til_ready(struct tty_struct *tty, struct file * filp, 1283static int block_til_ready(struct tty_struct *tty, struct file *filp,
1342 struct specialix_port *port) 1284 struct specialix_port *port)
1343{ 1285{
1344 DECLARE_WAITQUEUE(wait, current); 1286 DECLARE_WAITQUEUE(wait, current);
1345 struct specialix_board *bp = port_Board(port); 1287 struct specialix_board *bp = port_Board(port);
@@ -1389,23 +1331,22 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1389 retval = 0; 1331 retval = 0;
1390 add_wait_queue(&port->port.open_wait, &wait); 1332 add_wait_queue(&port->port.open_wait, &wait);
1391 spin_lock_irqsave(&port->lock, flags); 1333 spin_lock_irqsave(&port->lock, flags);
1392 if (!tty_hung_up_p(filp)) { 1334 if (!tty_hung_up_p(filp))
1393 port->port.count--; 1335 port->port.count--;
1394 }
1395 spin_unlock_irqrestore(&port->lock, flags); 1336 spin_unlock_irqrestore(&port->lock, flags);
1396 port->port.blocked_open++; 1337 port->port.blocked_open++;
1397 while (1) { 1338 while (1) {
1398 spin_lock_irqsave(&bp->lock, flags); 1339 spin_lock_irqsave(&bp->lock, flags);
1399 sx_out(bp, CD186x_CAR, port_No(port)); 1340 sx_out(bp, CD186x_CAR, port_No(port));
1400 CD = sx_in(bp, CD186x_MSVR) & MSVR_CD; 1341 CD = sx_in(bp, CD186x_MSVR) & MSVR_CD;
1401 if (SX_CRTSCTS (tty)) { 1342 if (sx_crtscts(tty)) {
1402 /* Activate RTS */ 1343 /* Activate RTS */
1403 port->MSVR |= MSVR_DTR; /* WTF? */ 1344 port->MSVR |= MSVR_DTR; /* WTF? */
1404 sx_out (bp, CD186x_MSVR, port->MSVR); 1345 sx_out(bp, CD186x_MSVR, port->MSVR);
1405 } else { 1346 } else {
1406 /* Activate DTR */ 1347 /* Activate DTR */
1407 port->MSVR |= MSVR_DTR; 1348 port->MSVR |= MSVR_DTR;
1408 sx_out (bp, CD186x_MSVR, port->MSVR); 1349 sx_out(bp, CD186x_MSVR, port->MSVR);
1409 } 1350 }
1410 spin_unlock_irqrestore(&bp->lock, flags); 1351 spin_unlock_irqrestore(&bp->lock, flags);
1411 set_current_state(TASK_INTERRUPTIBLE); 1352 set_current_state(TASK_INTERRUPTIBLE);
@@ -1430,9 +1371,8 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1430 set_current_state(TASK_RUNNING); 1371 set_current_state(TASK_RUNNING);
1431 remove_wait_queue(&port->port.open_wait, &wait); 1372 remove_wait_queue(&port->port.open_wait, &wait);
1432 spin_lock_irqsave(&port->lock, flags); 1373 spin_lock_irqsave(&port->lock, flags);
1433 if (!tty_hung_up_p(filp)) { 1374 if (!tty_hung_up_p(filp))
1434 port->port.count++; 1375 port->port.count++;
1435 }
1436 port->port.blocked_open--; 1376 port->port.blocked_open--;
1437 spin_unlock_irqrestore(&port->lock, flags); 1377 spin_unlock_irqrestore(&port->lock, flags);
1438 if (retval) { 1378 if (retval) {
@@ -1446,12 +1386,12 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1446} 1386}
1447 1387
1448 1388
1449static int sx_open(struct tty_struct * tty, struct file * filp) 1389static int sx_open(struct tty_struct *tty, struct file *filp)
1450{ 1390{
1451 int board; 1391 int board;
1452 int error; 1392 int error;
1453 struct specialix_port * port; 1393 struct specialix_port *port;
1454 struct specialix_board * bp; 1394 struct specialix_board *bp;
1455 int i; 1395 int i;
1456 unsigned long flags; 1396 unsigned long flags;
1457 1397
@@ -1468,17 +1408,19 @@ static int sx_open(struct tty_struct * tty, struct file * filp)
1468 port = sx_port + board * SX_NPORT + SX_PORT(tty->index); 1408 port = sx_port + board * SX_NPORT + SX_PORT(tty->index);
1469 port->overrun = 0; 1409 port->overrun = 0;
1470 for (i = 0; i < 10; i++) 1410 for (i = 0; i < 10; i++)
1471 port->hits[i]=0; 1411 port->hits[i] = 0;
1472 1412
1473 dprintk (SX_DEBUG_OPEN, "Board = %d, bp = %p, port = %p, portno = %d.\n", 1413 dprintk(SX_DEBUG_OPEN,
1474 board, bp, port, SX_PORT(tty->index)); 1414 "Board = %d, bp = %p, port = %p, portno = %d.\n",
1415 board, bp, port, SX_PORT(tty->index));
1475 1416
1476 if (sx_paranoia_check(port, tty->name, "sx_open")) { 1417 if (sx_paranoia_check(port, tty->name, "sx_open")) {
1477 func_enter(); 1418 func_enter();
1478 return -ENODEV; 1419 return -ENODEV;
1479 } 1420 }
1480 1421
1481 if ((error = sx_setup_board(bp))) { 1422 error = sx_setup_board(bp);
1423 if (error) {
1482 func_exit(); 1424 func_exit();
1483 return error; 1425 return error;
1484 } 1426 }
@@ -1490,12 +1432,14 @@ static int sx_open(struct tty_struct * tty, struct file * filp)
1490 port->port.tty = tty; 1432 port->port.tty = tty;
1491 spin_unlock_irqrestore(&bp->lock, flags); 1433 spin_unlock_irqrestore(&bp->lock, flags);
1492 1434
1493 if ((error = sx_setup_port(bp, port))) { 1435 error = sx_setup_port(bp, port);
1436 if (error) {
1494 func_enter(); 1437 func_enter();
1495 return error; 1438 return error;
1496 } 1439 }
1497 1440
1498 if ((error = block_til_ready(tty, filp, port))) { 1441 error = block_til_ready(tty, filp, port);
1442 if (error) {
1499 func_enter(); 1443 func_enter();
1500 return error; 1444 return error;
1501 } 1445 }
@@ -1508,7 +1452,7 @@ static void sx_flush_buffer(struct tty_struct *tty)
1508{ 1452{
1509 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1453 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1510 unsigned long flags; 1454 unsigned long flags;
1511 struct specialix_board * bp; 1455 struct specialix_board *bp;
1512 1456
1513 func_enter(); 1457 func_enter();
1514 1458
@@ -1526,9 +1470,9 @@ static void sx_flush_buffer(struct tty_struct *tty)
1526 func_exit(); 1470 func_exit();
1527} 1471}
1528 1472
1529static void sx_close(struct tty_struct * tty, struct file * filp) 1473static void sx_close(struct tty_struct *tty, struct file *filp)
1530{ 1474{
1531 struct specialix_port *port = (struct specialix_port *) tty->driver_data; 1475 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1532 struct specialix_board *bp; 1476 struct specialix_board *bp;
1533 unsigned long flags; 1477 unsigned long flags;
1534 unsigned long timeout; 1478 unsigned long timeout;
@@ -1547,7 +1491,7 @@ static void sx_close(struct tty_struct * tty, struct file * filp)
1547 } 1491 }
1548 1492
1549 bp = port_Board(port); 1493 bp = port_Board(port);
1550 if ((tty->count == 1) && (port->port.count != 1)) { 1494 if (tty->count == 1 && port->port.count != 1) {
1551 printk(KERN_ERR "sx%d: sx_close: bad port count;" 1495 printk(KERN_ERR "sx%d: sx_close: bad port count;"
1552 " tty->count is 1, port count is %d\n", 1496 " tty->count is 1, port count is %d\n",
1553 board_No(bp), port->port.count); 1497 board_No(bp), port->port.count);
@@ -1570,17 +1514,16 @@ static void sx_close(struct tty_struct * tty, struct file * filp)
1570 */ 1514 */
1571 tty->closing = 1; 1515 tty->closing = 1;
1572 spin_unlock_irqrestore(&port->lock, flags); 1516 spin_unlock_irqrestore(&port->lock, flags);
1573 dprintk (SX_DEBUG_OPEN, "Closing\n"); 1517 dprintk(SX_DEBUG_OPEN, "Closing\n");
1574 if (port->port.closing_wait != ASYNC_CLOSING_WAIT_NONE) { 1518 if (port->port.closing_wait != ASYNC_CLOSING_WAIT_NONE)
1575 tty_wait_until_sent(tty, port->port.closing_wait); 1519 tty_wait_until_sent(tty, port->port.closing_wait);
1576 }
1577 /* 1520 /*
1578 * At this point we stop accepting input. To do this, we 1521 * At this point we stop accepting input. To do this, we
1579 * disable the receive line status interrupts, and tell the 1522 * disable the receive line status interrupts, and tell the
1580 * interrupt driver to stop checking the data ready bit in the 1523 * interrupt driver to stop checking the data ready bit in the
1581 * line status register. 1524 * line status register.
1582 */ 1525 */
1583 dprintk (SX_DEBUG_OPEN, "Closed\n"); 1526 dprintk(SX_DEBUG_OPEN, "Closed\n");
1584 port->IER &= ~IER_RXD; 1527 port->IER &= ~IER_RXD;
1585 if (port->port.flags & ASYNC_INITIALIZED) { 1528 if (port->port.flags & ASYNC_INITIALIZED) {
1586 port->IER &= ~IER_TXRDY; 1529 port->IER &= ~IER_TXRDY;
@@ -1595,11 +1538,11 @@ static void sx_close(struct tty_struct * tty, struct file * filp)
1595 * important if there is a transmit FIFO! 1538 * important if there is a transmit FIFO!
1596 */ 1539 */
1597 timeout = jiffies+HZ; 1540 timeout = jiffies+HZ;
1598 while(port->IER & IER_TXEMPTY) { 1541 while (port->IER & IER_TXEMPTY) {
1599 set_current_state (TASK_INTERRUPTIBLE); 1542 set_current_state(TASK_INTERRUPTIBLE);
1600 msleep_interruptible(jiffies_to_msecs(port->timeout)); 1543 msleep_interruptible(jiffies_to_msecs(port->timeout));
1601 if (time_after(jiffies, timeout)) { 1544 if (time_after(jiffies, timeout)) {
1602 printk (KERN_INFO "Timeout waiting for close\n"); 1545 printk(KERN_INFO "Timeout waiting for close\n");
1603 break; 1546 break;
1604 } 1547 }
1605 } 1548 }
@@ -1607,13 +1550,15 @@ static void sx_close(struct tty_struct * tty, struct file * filp)
1607 } 1550 }
1608 1551
1609 if (--bp->count < 0) { 1552 if (--bp->count < 0) {
1610 printk(KERN_ERR "sx%d: sx_shutdown_port: bad board count: %d port: %d\n", 1553 printk(KERN_ERR
1611 board_No(bp), bp->count, tty->index); 1554 "sx%d: sx_shutdown_port: bad board count: %d port: %d\n",
1555 board_No(bp), bp->count, tty->index);
1612 bp->count = 0; 1556 bp->count = 0;
1613 } 1557 }
1614 if (--port->port.count < 0) { 1558 if (--port->port.count < 0) {
1615 printk(KERN_ERR "sx%d: sx_close: bad port count for tty%d: %d\n", 1559 printk(KERN_ERR
1616 board_No(bp), port_No(port), port->port.count); 1560 "sx%d: sx_close: bad port count for tty%d: %d\n",
1561 board_No(bp), port_No(port), port->port.count);
1617 port->port.count = 0; 1562 port->port.count = 0;
1618 } 1563 }
1619 1564
@@ -1625,9 +1570,9 @@ static void sx_close(struct tty_struct * tty, struct file * filp)
1625 port->port.tty = NULL; 1570 port->port.tty = NULL;
1626 spin_unlock_irqrestore(&port->lock, flags); 1571 spin_unlock_irqrestore(&port->lock, flags);
1627 if (port->port.blocked_open) { 1572 if (port->port.blocked_open) {
1628 if (port->port.close_delay) { 1573 if (port->port.close_delay)
1629 msleep_interruptible(jiffies_to_msecs(port->port.close_delay)); 1574 msleep_interruptible(
1630 } 1575 jiffies_to_msecs(port->port.close_delay));
1631 wake_up_interruptible(&port->port.open_wait); 1576 wake_up_interruptible(&port->port.open_wait);
1632 } 1577 }
1633 port->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); 1578 port->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
@@ -1637,8 +1582,8 @@ static void sx_close(struct tty_struct * tty, struct file * filp)
1637} 1582}
1638 1583
1639 1584
1640static int sx_write(struct tty_struct * tty, 1585static int sx_write(struct tty_struct *tty,
1641 const unsigned char *buf, int count) 1586 const unsigned char *buf, int count)
1642{ 1587{
1643 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1588 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1644 struct specialix_board *bp; 1589 struct specialix_board *bp;
@@ -1690,11 +1635,11 @@ static int sx_write(struct tty_struct * tty,
1690} 1635}
1691 1636
1692 1637
1693static int sx_put_char(struct tty_struct * tty, unsigned char ch) 1638static int sx_put_char(struct tty_struct *tty, unsigned char ch)
1694{ 1639{
1695 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1640 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1696 unsigned long flags; 1641 unsigned long flags;
1697 struct specialix_board * bp; 1642 struct specialix_board *bp;
1698 1643
1699 func_enter(); 1644 func_enter();
1700 1645
@@ -1702,7 +1647,7 @@ static int sx_put_char(struct tty_struct * tty, unsigned char ch)
1702 func_exit(); 1647 func_exit();
1703 return 0; 1648 return 0;
1704 } 1649 }
1705 dprintk (SX_DEBUG_TX, "check tty: %p %p\n", tty, port->xmit_buf); 1650 dprintk(SX_DEBUG_TX, "check tty: %p %p\n", tty, port->xmit_buf);
1706 if (!port->xmit_buf) { 1651 if (!port->xmit_buf) {
1707 func_exit(); 1652 func_exit();
1708 return 0; 1653 return 0;
@@ -1710,14 +1655,15 @@ static int sx_put_char(struct tty_struct * tty, unsigned char ch)
1710 bp = port_Board(port); 1655 bp = port_Board(port);
1711 spin_lock_irqsave(&port->lock, flags); 1656 spin_lock_irqsave(&port->lock, flags);
1712 1657
1713 dprintk (SX_DEBUG_TX, "xmit_cnt: %d xmit_buf: %p\n", port->xmit_cnt, port->xmit_buf); 1658 dprintk(SX_DEBUG_TX, "xmit_cnt: %d xmit_buf: %p\n",
1714 if ((port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) || (!port->xmit_buf)) { 1659 port->xmit_cnt, port->xmit_buf);
1660 if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1 || !port->xmit_buf) {
1715 spin_unlock_irqrestore(&port->lock, flags); 1661 spin_unlock_irqrestore(&port->lock, flags);
1716 dprintk (SX_DEBUG_TX, "Exit size\n"); 1662 dprintk(SX_DEBUG_TX, "Exit size\n");
1717 func_exit(); 1663 func_exit();
1718 return 0; 1664 return 0;
1719 } 1665 }
1720 dprintk (SX_DEBUG_TX, "Handle xmit: %p %p\n", port, port->xmit_buf); 1666 dprintk(SX_DEBUG_TX, "Handle xmit: %p %p\n", port, port->xmit_buf);
1721 port->xmit_buf[port->xmit_head++] = ch; 1667 port->xmit_buf[port->xmit_head++] = ch;
1722 port->xmit_head &= SERIAL_XMIT_SIZE - 1; 1668 port->xmit_head &= SERIAL_XMIT_SIZE - 1;
1723 port->xmit_cnt++; 1669 port->xmit_cnt++;
@@ -1728,11 +1674,11 @@ static int sx_put_char(struct tty_struct * tty, unsigned char ch)
1728} 1674}
1729 1675
1730 1676
1731static void sx_flush_chars(struct tty_struct * tty) 1677static void sx_flush_chars(struct tty_struct *tty)
1732{ 1678{
1733 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1679 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1734 unsigned long flags; 1680 unsigned long flags;
1735 struct specialix_board * bp = port_Board(port); 1681 struct specialix_board *bp = port_Board(port);
1736 1682
1737 func_enter(); 1683 func_enter();
1738 1684
@@ -1755,7 +1701,7 @@ static void sx_flush_chars(struct tty_struct * tty)
1755} 1701}
1756 1702
1757 1703
1758static int sx_write_room(struct tty_struct * tty) 1704static int sx_write_room(struct tty_struct *tty)
1759{ 1705{
1760 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1706 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1761 int ret; 1707 int ret;
@@ -1790,12 +1736,10 @@ static int sx_chars_in_buffer(struct tty_struct *tty)
1790 return port->xmit_cnt; 1736 return port->xmit_cnt;
1791} 1737}
1792 1738
1793
1794
1795static int sx_tiocmget(struct tty_struct *tty, struct file *file) 1739static int sx_tiocmget(struct tty_struct *tty, struct file *file)
1796{ 1740{
1797 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1741 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1798 struct specialix_board * bp; 1742 struct specialix_board *bp;
1799 unsigned char status; 1743 unsigned char status;
1800 unsigned int result; 1744 unsigned int result;
1801 unsigned long flags; 1745 unsigned long flags;
@@ -1808,25 +1752,23 @@ static int sx_tiocmget(struct tty_struct *tty, struct file *file)
1808 } 1752 }
1809 1753
1810 bp = port_Board(port); 1754 bp = port_Board(port);
1811 spin_lock_irqsave (&bp->lock, flags); 1755 spin_lock_irqsave(&bp->lock, flags);
1812 sx_out(bp, CD186x_CAR, port_No(port)); 1756 sx_out(bp, CD186x_CAR, port_No(port));
1813 status = sx_in(bp, CD186x_MSVR); 1757 status = sx_in(bp, CD186x_MSVR);
1814 spin_unlock_irqrestore(&bp->lock, flags); 1758 spin_unlock_irqrestore(&bp->lock, flags);
1815 dprintk (SX_DEBUG_INIT, "Got msvr[%d] = %02x, car = %d.\n", 1759 dprintk(SX_DEBUG_INIT, "Got msvr[%d] = %02x, car = %d.\n",
1816 port_No(port), status, sx_in (bp, CD186x_CAR)); 1760 port_No(port), status, sx_in(bp, CD186x_CAR));
1817 dprintk (SX_DEBUG_INIT, "sx_port = %p, port = %p\n", sx_port, port); 1761 dprintk(SX_DEBUG_INIT, "sx_port = %p, port = %p\n", sx_port, port);
1818 if (SX_CRTSCTS(port->port.tty)) { 1762 if (sx_crtscts(port->port.tty)) {
1819 result = /* (status & MSVR_RTS) ? */ TIOCM_DTR /* : 0) */ 1763 result = TIOCM_DTR | TIOCM_DSR
1820 | ((status & MSVR_DTR) ? TIOCM_RTS : 0) 1764 | ((status & MSVR_DTR) ? TIOCM_RTS : 0)
1821 | ((status & MSVR_CD) ? TIOCM_CAR : 0) 1765 | ((status & MSVR_CD) ? TIOCM_CAR : 0)
1822 |/* ((status & MSVR_DSR) ? */ TIOCM_DSR /* : 0) */ 1766 | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
1823 | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
1824 } else { 1767 } else {
1825 result = /* (status & MSVR_RTS) ? */ TIOCM_RTS /* : 0) */ 1768 result = TIOCM_RTS | TIOCM_DSR
1826 | ((status & MSVR_DTR) ? TIOCM_DTR : 0) 1769 | ((status & MSVR_DTR) ? TIOCM_DTR : 0)
1827 | ((status & MSVR_CD) ? TIOCM_CAR : 0) 1770 | ((status & MSVR_CD) ? TIOCM_CAR : 0)
1828 |/* ((status & MSVR_DSR) ? */ TIOCM_DSR /* : 0) */ 1771 | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
1829 | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
1830 } 1772 }
1831 1773
1832 func_exit(); 1774 func_exit();
@@ -1852,24 +1794,14 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file,
1852 bp = port_Board(port); 1794 bp = port_Board(port);
1853 1795
1854 spin_lock_irqsave(&port->lock, flags); 1796 spin_lock_irqsave(&port->lock, flags);
1855 /* if (set & TIOCM_RTS) 1797 if (sx_crtscts(port->port.tty)) {
1856 port->MSVR |= MSVR_RTS; */
1857 /* if (set & TIOCM_DTR)
1858 port->MSVR |= MSVR_DTR; */
1859
1860 if (SX_CRTSCTS(port->port.tty)) {
1861 if (set & TIOCM_RTS) 1798 if (set & TIOCM_RTS)
1862 port->MSVR |= MSVR_DTR; 1799 port->MSVR |= MSVR_DTR;
1863 } else { 1800 } else {
1864 if (set & TIOCM_DTR) 1801 if (set & TIOCM_DTR)
1865 port->MSVR |= MSVR_DTR; 1802 port->MSVR |= MSVR_DTR;
1866 } 1803 }
1867 1804 if (sx_crtscts(port->port.tty)) {
1868 /* if (clear & TIOCM_RTS)
1869 port->MSVR &= ~MSVR_RTS; */
1870 /* if (clear & TIOCM_DTR)
1871 port->MSVR &= ~MSVR_DTR; */
1872 if (SX_CRTSCTS(port->port.tty)) {
1873 if (clear & TIOCM_RTS) 1805 if (clear & TIOCM_RTS)
1874 port->MSVR &= ~MSVR_DTR; 1806 port->MSVR &= ~MSVR_DTR;
1875 } else { 1807 } else {
@@ -1886,14 +1818,17 @@ static int sx_tiocmset(struct tty_struct *tty, struct file *file,
1886} 1818}
1887 1819
1888 1820
1889static inline void sx_send_break(struct specialix_port * port, unsigned long length) 1821static int sx_send_break(struct tty_struct *tty, int length)
1890{ 1822{
1823 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1891 struct specialix_board *bp = port_Board(port); 1824 struct specialix_board *bp = port_Board(port);
1892 unsigned long flags; 1825 unsigned long flags;
1893 1826
1894 func_enter(); 1827 func_enter();
1828 if (length == 0 || length == -1)
1829 return -EOPNOTSUPP;
1895 1830
1896 spin_lock_irqsave (&port->lock, flags); 1831 spin_lock_irqsave(&port->lock, flags);
1897 port->break_length = SPECIALIX_TPS / HZ * length; 1832 port->break_length = SPECIALIX_TPS / HZ * length;
1898 port->COR2 |= COR2_ETC; 1833 port->COR2 |= COR2_ETC;
1899 port->IER |= IER_TXRDY; 1834 port->IER |= IER_TXRDY;
@@ -1902,7 +1837,7 @@ static inline void sx_send_break(struct specialix_port * port, unsigned long len
1902 sx_out(bp, CD186x_COR2, port->COR2); 1837 sx_out(bp, CD186x_COR2, port->COR2);
1903 sx_out(bp, CD186x_IER, port->IER); 1838 sx_out(bp, CD186x_IER, port->IER);
1904 spin_unlock_irqrestore(&bp->lock, flags); 1839 spin_unlock_irqrestore(&bp->lock, flags);
1905 spin_unlock_irqrestore (&port->lock, flags); 1840 spin_unlock_irqrestore(&port->lock, flags);
1906 sx_wait_CCR(bp); 1841 sx_wait_CCR(bp);
1907 spin_lock_irqsave(&bp->lock, flags); 1842 spin_lock_irqsave(&bp->lock, flags);
1908 sx_out(bp, CD186x_CCR, CCR_CORCHG2); 1843 sx_out(bp, CD186x_CCR, CCR_CORCHG2);
@@ -1910,11 +1845,12 @@ static inline void sx_send_break(struct specialix_port * port, unsigned long len
1910 sx_wait_CCR(bp); 1845 sx_wait_CCR(bp);
1911 1846
1912 func_exit(); 1847 func_exit();
1848 return 0;
1913} 1849}
1914 1850
1915 1851
1916static inline int sx_set_serial_info(struct specialix_port * port, 1852static int sx_set_serial_info(struct specialix_port *port,
1917 struct serial_struct __user * newinfo) 1853 struct serial_struct __user *newinfo)
1918{ 1854{
1919 struct serial_struct tmp; 1855 struct serial_struct tmp;
1920 struct specialix_board *bp = port_Board(port); 1856 struct specialix_board *bp = port_Board(port);
@@ -1943,25 +1879,25 @@ static inline int sx_set_serial_info(struct specialix_port * port,
1943 return -EPERM; 1879 return -EPERM;
1944 } 1880 }
1945 port->port.flags = ((port->port.flags & ~ASYNC_USR_MASK) | 1881 port->port.flags = ((port->port.flags & ~ASYNC_USR_MASK) |
1946 (tmp.flags & ASYNC_USR_MASK)); 1882 (tmp.flags & ASYNC_USR_MASK));
1947 port->custom_divisor = tmp.custom_divisor; 1883 port->custom_divisor = tmp.custom_divisor;
1948 } else { 1884 } else {
1949 port->port.flags = ((port->port.flags & ~ASYNC_FLAGS) | 1885 port->port.flags = ((port->port.flags & ~ASYNC_FLAGS) |
1950 (tmp.flags & ASYNC_FLAGS)); 1886 (tmp.flags & ASYNC_FLAGS));
1951 port->port.close_delay = tmp.close_delay; 1887 port->port.close_delay = tmp.close_delay;
1952 port->port.closing_wait = tmp.closing_wait; 1888 port->port.closing_wait = tmp.closing_wait;
1953 port->custom_divisor = tmp.custom_divisor; 1889 port->custom_divisor = tmp.custom_divisor;
1954 } 1890 }
1955 if (change_speed) { 1891 if (change_speed)
1956 sx_change_speed(bp, port); 1892 sx_change_speed(bp, port);
1957 } 1893
1958 func_exit(); 1894 func_exit();
1959 unlock_kernel(); 1895 unlock_kernel();
1960 return 0; 1896 return 0;
1961} 1897}
1962 1898
1963 1899
1964static inline int sx_get_serial_info(struct specialix_port * port, 1900static int sx_get_serial_info(struct specialix_port *port,
1965 struct serial_struct __user *retinfo) 1901 struct serial_struct __user *retinfo)
1966{ 1902{
1967 struct serial_struct tmp; 1903 struct serial_struct tmp;
@@ -1992,11 +1928,10 @@ static inline int sx_get_serial_info(struct specialix_port * port,
1992} 1928}
1993 1929
1994 1930
1995static int sx_ioctl(struct tty_struct * tty, struct file * filp, 1931static int sx_ioctl(struct tty_struct *tty, struct file *filp,
1996 unsigned int cmd, unsigned long arg) 1932 unsigned int cmd, unsigned long arg)
1997{ 1933{
1998 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1934 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1999 int retval;
2000 void __user *argp = (void __user *)arg; 1935 void __user *argp = (void __user *)arg;
2001 1936
2002 func_enter(); 1937 func_enter();
@@ -2007,34 +1942,14 @@ static int sx_ioctl(struct tty_struct * tty, struct file * filp,
2007 } 1942 }
2008 1943
2009 switch (cmd) { 1944 switch (cmd) {
2010 case TCSBRK: /* SVID version: non-zero arg --> no break */ 1945 case TIOCGSERIAL:
2011 retval = tty_check_change(tty);
2012 if (retval) {
2013 func_exit();
2014 return retval;
2015 }
2016 tty_wait_until_sent(tty, 0);
2017 if (!arg)
2018 sx_send_break(port, HZ/4); /* 1/4 second */
2019 return 0;
2020 case TCSBRKP: /* support for POSIX tcsendbreak() */
2021 retval = tty_check_change(tty);
2022 if (retval) {
2023 func_exit();
2024 return retval;
2025 }
2026 tty_wait_until_sent(tty, 0);
2027 sx_send_break(port, arg ? arg*(HZ/10) : HZ/4);
2028 func_exit(); 1946 func_exit();
2029 return 0;
2030 case TIOCGSERIAL:
2031 func_exit();
2032 return sx_get_serial_info(port, argp); 1947 return sx_get_serial_info(port, argp);
2033 case TIOCSSERIAL: 1948 case TIOCSSERIAL:
2034 func_exit(); 1949 func_exit();
2035 return sx_set_serial_info(port, argp); 1950 return sx_set_serial_info(port, argp);
2036 default: 1951 default:
2037 func_exit(); 1952 func_exit();
2038 return -ENOIOCTLCMD; 1953 return -ENOIOCTLCMD;
2039 } 1954 }
2040 func_exit(); 1955 func_exit();
@@ -2042,7 +1957,7 @@ static int sx_ioctl(struct tty_struct * tty, struct file * filp,
2042} 1957}
2043 1958
2044 1959
2045static void sx_throttle(struct tty_struct * tty) 1960static void sx_throttle(struct tty_struct *tty)
2046{ 1961{
2047 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 1962 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
2048 struct specialix_board *bp; 1963 struct specialix_board *bp;
@@ -2058,15 +1973,16 @@ static void sx_throttle(struct tty_struct * tty)
2058 bp = port_Board(port); 1973 bp = port_Board(port);
2059 1974
2060 /* Use DTR instead of RTS ! */ 1975 /* Use DTR instead of RTS ! */
2061 if (SX_CRTSCTS (tty)) 1976 if (sx_crtscts(tty))
2062 port->MSVR &= ~MSVR_DTR; 1977 port->MSVR &= ~MSVR_DTR;
2063 else { 1978 else {
2064 /* Auch!!! I think the system shouldn't call this then. */ 1979 /* Auch!!! I think the system shouldn't call this then. */
2065 /* Or maybe we're supposed (allowed?) to do our side of hw 1980 /* Or maybe we're supposed (allowed?) to do our side of hw
2066 handshake anyway, even when hardware handshake is off. 1981 handshake anyway, even when hardware handshake is off.
2067 When you see this in your logs, please report.... */ 1982 When you see this in your logs, please report.... */
2068 printk (KERN_ERR "sx%d: Need to throttle, but can't (hardware hs is off)\n", 1983 printk(KERN_ERR
2069 port_No (port)); 1984 "sx%d: Need to throttle, but can't (hardware hs is off)\n",
1985 port_No(port));
2070 } 1986 }
2071 spin_lock_irqsave(&bp->lock, flags); 1987 spin_lock_irqsave(&bp->lock, flags);
2072 sx_out(bp, CD186x_CAR, port_No(port)); 1988 sx_out(bp, CD186x_CAR, port_No(port));
@@ -2086,7 +2002,7 @@ static void sx_throttle(struct tty_struct * tty)
2086} 2002}
2087 2003
2088 2004
2089static void sx_unthrottle(struct tty_struct * tty) 2005static void sx_unthrottle(struct tty_struct *tty)
2090{ 2006{
2091 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 2007 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
2092 struct specialix_board *bp; 2008 struct specialix_board *bp;
@@ -2103,9 +2019,9 @@ static void sx_unthrottle(struct tty_struct * tty)
2103 2019
2104 spin_lock_irqsave(&port->lock, flags); 2020 spin_lock_irqsave(&port->lock, flags);
2105 /* XXXX Use DTR INSTEAD???? */ 2021 /* XXXX Use DTR INSTEAD???? */
2106 if (SX_CRTSCTS(tty)) { 2022 if (sx_crtscts(tty))
2107 port->MSVR |= MSVR_DTR; 2023 port->MSVR |= MSVR_DTR;
2108 } /* Else clause: see remark in "sx_throttle"... */ 2024 /* Else clause: see remark in "sx_throttle"... */
2109 spin_lock_irqsave(&bp->lock, flags); 2025 spin_lock_irqsave(&bp->lock, flags);
2110 sx_out(bp, CD186x_CAR, port_No(port)); 2026 sx_out(bp, CD186x_CAR, port_No(port));
2111 spin_unlock_irqrestore(&bp->lock, flags); 2027 spin_unlock_irqrestore(&bp->lock, flags);
@@ -2127,7 +2043,7 @@ static void sx_unthrottle(struct tty_struct * tty)
2127} 2043}
2128 2044
2129 2045
2130static void sx_stop(struct tty_struct * tty) 2046static void sx_stop(struct tty_struct *tty)
2131{ 2047{
2132 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 2048 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
2133 struct specialix_board *bp; 2049 struct specialix_board *bp;
@@ -2154,7 +2070,7 @@ static void sx_stop(struct tty_struct * tty)
2154} 2070}
2155 2071
2156 2072
2157static void sx_start(struct tty_struct * tty) 2073static void sx_start(struct tty_struct *tty)
2158{ 2074{
2159 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 2075 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
2160 struct specialix_board *bp; 2076 struct specialix_board *bp;
@@ -2182,7 +2098,7 @@ static void sx_start(struct tty_struct * tty)
2182 func_exit(); 2098 func_exit();
2183} 2099}
2184 2100
2185static void sx_hangup(struct tty_struct * tty) 2101static void sx_hangup(struct tty_struct *tty)
2186{ 2102{
2187 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 2103 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
2188 struct specialix_board *bp; 2104 struct specialix_board *bp;
@@ -2201,8 +2117,9 @@ static void sx_hangup(struct tty_struct * tty)
2201 spin_lock_irqsave(&port->lock, flags); 2117 spin_lock_irqsave(&port->lock, flags);
2202 bp->count -= port->port.count; 2118 bp->count -= port->port.count;
2203 if (bp->count < 0) { 2119 if (bp->count < 0) {
2204 printk(KERN_ERR "sx%d: sx_hangup: bad board count: %d port: %d\n", 2120 printk(KERN_ERR
2205 board_No(bp), bp->count, tty->index); 2121 "sx%d: sx_hangup: bad board count: %d port: %d\n",
2122 board_No(bp), bp->count, tty->index);
2206 bp->count = 0; 2123 bp->count = 0;
2207 } 2124 }
2208 port->port.count = 0; 2125 port->port.count = 0;
@@ -2215,11 +2132,12 @@ static void sx_hangup(struct tty_struct * tty)
2215} 2132}
2216 2133
2217 2134
2218static void sx_set_termios(struct tty_struct * tty, struct ktermios * old_termios) 2135static void sx_set_termios(struct tty_struct *tty,
2136 struct ktermios *old_termios)
2219{ 2137{
2220 struct specialix_port *port = (struct specialix_port *)tty->driver_data; 2138 struct specialix_port *port = (struct specialix_port *)tty->driver_data;
2221 unsigned long flags; 2139 unsigned long flags;
2222 struct specialix_board * bp; 2140 struct specialix_board *bp;
2223 2141
2224 if (sx_paranoia_check(port, tty->name, "sx_set_termios")) 2142 if (sx_paranoia_check(port, tty->name, "sx_set_termios"))
2225 return; 2143 return;
@@ -2254,6 +2172,7 @@ static const struct tty_operations sx_ops = {
2254 .hangup = sx_hangup, 2172 .hangup = sx_hangup,
2255 .tiocmget = sx_tiocmget, 2173 .tiocmget = sx_tiocmget,
2256 .tiocmset = sx_tiocmset, 2174 .tiocmset = sx_tiocmset,
2175 .break_ctl = sx_send_break,
2257}; 2176};
2258 2177
2259static int sx_init_drivers(void) 2178static int sx_init_drivers(void)
@@ -2280,13 +2199,16 @@ static int sx_init_drivers(void)
2280 B9600 | CS8 | CREAD | HUPCL | CLOCAL; 2199 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2281 specialix_driver->init_termios.c_ispeed = 9600; 2200 specialix_driver->init_termios.c_ispeed = 9600;
2282 specialix_driver->init_termios.c_ospeed = 9600; 2201 specialix_driver->init_termios.c_ospeed = 9600;
2283 specialix_driver->flags = TTY_DRIVER_REAL_RAW; 2202 specialix_driver->flags = TTY_DRIVER_REAL_RAW |
2203 TTY_DRIVER_HARDWARE_BREAK;
2284 tty_set_operations(specialix_driver, &sx_ops); 2204 tty_set_operations(specialix_driver, &sx_ops);
2285 2205
2286 if ((error = tty_register_driver(specialix_driver))) { 2206 error = tty_register_driver(specialix_driver);
2207 if (error) {
2287 put_tty_driver(specialix_driver); 2208 put_tty_driver(specialix_driver);
2288 printk(KERN_ERR "sx: Couldn't register specialix IO8+ driver, error = %d\n", 2209 printk(KERN_ERR
2289 error); 2210 "sx: Couldn't register specialix IO8+ driver, error = %d\n",
2211 error);
2290 func_exit(); 2212 func_exit();
2291 return 1; 2213 return 1;
2292 } 2214 }
@@ -2322,11 +2244,11 @@ static int __init specialix_init(void)
2322 2244
2323 printk(KERN_INFO "sx: Specialix IO8+ driver v" VERSION ", (c) R.E.Wolff 1997/1998.\n"); 2245 printk(KERN_INFO "sx: Specialix IO8+ driver v" VERSION ", (c) R.E.Wolff 1997/1998.\n");
2324 printk(KERN_INFO "sx: derived from work (c) D.Gorodchanin 1994-1996.\n"); 2246 printk(KERN_INFO "sx: derived from work (c) D.Gorodchanin 1994-1996.\n");
2325#ifdef CONFIG_SPECIALIX_RTSCTS 2247 if (sx_rtscts)
2326 printk (KERN_INFO "sx: DTR/RTS pin is always RTS.\n"); 2248 printk(KERN_INFO
2327#else 2249 "sx: DTR/RTS pin is RTS when CRTSCTS is on.\n");
2328 printk (KERN_INFO "sx: DTR/RTS pin is RTS when CRTSCTS is on.\n"); 2250 else
2329#endif 2251 printk(KERN_INFO "sx: DTR/RTS pin is always RTS.\n");
2330 2252
2331 for (i = 0; i < SX_NBOARD; i++) 2253 for (i = 0; i < SX_NBOARD; i++)
2332 spin_lock_init(&sx_board[i].lock); 2254 spin_lock_init(&sx_board[i].lock);
@@ -2344,27 +2266,27 @@ static int __init specialix_init(void)
2344 { 2266 {
2345 struct pci_dev *pdev = NULL; 2267 struct pci_dev *pdev = NULL;
2346 2268
2347 i=0; 2269 i = 0;
2348 while (i < SX_NBOARD) { 2270 while (i < SX_NBOARD) {
2349 if (sx_board[i].flags & SX_BOARD_PRESENT) { 2271 if (sx_board[i].flags & SX_BOARD_PRESENT) {
2350 i++; 2272 i++;
2351 continue; 2273 continue;
2352 } 2274 }
2353 pdev = pci_get_device (PCI_VENDOR_ID_SPECIALIX, 2275 pdev = pci_get_device(PCI_VENDOR_ID_SPECIALIX,
2354 PCI_DEVICE_ID_SPECIALIX_IO8, 2276 PCI_DEVICE_ID_SPECIALIX_IO8, pdev);
2355 pdev); 2277 if (!pdev)
2356 if (!pdev) break; 2278 break;
2357 2279
2358 if (pci_enable_device(pdev)) 2280 if (pci_enable_device(pdev))
2359 continue; 2281 continue;
2360 2282
2361 sx_board[i].irq = pdev->irq; 2283 sx_board[i].irq = pdev->irq;
2362 2284
2363 sx_board[i].base = pci_resource_start (pdev, 2); 2285 sx_board[i].base = pci_resource_start(pdev, 2);
2364 2286
2365 sx_board[i].flags |= SX_BOARD_IS_PCI; 2287 sx_board[i].flags |= SX_BOARD_IS_PCI;
2366 if (!sx_probe(&sx_board[i])) 2288 if (!sx_probe(&sx_board[i]))
2367 found ++; 2289 found++;
2368 } 2290 }
2369 /* May exit pci_get sequence early with lots of boards */ 2291 /* May exit pci_get sequence early with lots of boards */
2370 if (pdev != NULL) 2292 if (pdev != NULL)
@@ -2384,16 +2306,13 @@ static int __init specialix_init(void)
2384} 2306}
2385 2307
2386static int iobase[SX_NBOARD] = {0,}; 2308static int iobase[SX_NBOARD] = {0,};
2387 2309static int irq[SX_NBOARD] = {0,};
2388static int irq [SX_NBOARD] = {0,};
2389 2310
2390module_param_array(iobase, int, NULL, 0); 2311module_param_array(iobase, int, NULL, 0);
2391module_param_array(irq, int, NULL, 0); 2312module_param_array(irq, int, NULL, 0);
2392module_param(sx_debug, int, 0); 2313module_param(sx_debug, int, 0);
2314module_param(sx_rtscts, int, 0);
2393module_param(sx_rxfifo, int, 0); 2315module_param(sx_rxfifo, int, 0);
2394#ifdef SPECIALIX_TIMER
2395module_param(sx_poll, int, 0);
2396#endif
2397 2316
2398/* 2317/*
2399 * You can setup up to 4 boards. 2318 * You can setup up to 4 boards.
@@ -2411,10 +2330,10 @@ static int __init specialix_init_module(void)
2411 func_enter(); 2330 func_enter();
2412 2331
2413 if (iobase[0] || iobase[1] || iobase[2] || iobase[3]) { 2332 if (iobase[0] || iobase[1] || iobase[2] || iobase[3]) {
2414 for(i = 0; i < SX_NBOARD; i++) { 2333 for (i = 0; i < SX_NBOARD; i++) {
2415 sx_board[i].base = iobase[i]; 2334 sx_board[i].base = iobase[i];
2416 sx_board[i].irq = irq[i]; 2335 sx_board[i].irq = irq[i];
2417 sx_board[i].count= 0; 2336 sx_board[i].count = 0;
2418 } 2337 }
2419 } 2338 }
2420 2339
@@ -2433,10 +2352,6 @@ static void __exit specialix_exit_module(void)
2433 for (i = 0; i < SX_NBOARD; i++) 2352 for (i = 0; i < SX_NBOARD; i++)
2434 if (sx_board[i].flags & SX_BOARD_PRESENT) 2353 if (sx_board[i].flags & SX_BOARD_PRESENT)
2435 sx_release_io_range(&sx_board[i]); 2354 sx_release_io_range(&sx_board[i]);
2436#ifdef SPECIALIX_TIMER
2437 del_timer_sync(&missed_irq_timer);
2438#endif
2439
2440 func_exit(); 2355 func_exit();
2441} 2356}
2442 2357
diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c
index 0243efb0be95..19db1eb87c26 100644
--- a/drivers/char/stallion.c
+++ b/drivers/char/stallion.c
@@ -1025,7 +1025,7 @@ static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count
1025 1025
1026/*****************************************************************************/ 1026/*****************************************************************************/
1027 1027
1028static void stl_putchar(struct tty_struct *tty, unsigned char ch) 1028static int stl_putchar(struct tty_struct *tty, unsigned char ch)
1029{ 1029{
1030 struct stlport *portp; 1030 struct stlport *portp;
1031 unsigned int len; 1031 unsigned int len;
@@ -1034,12 +1034,12 @@ static void stl_putchar(struct tty_struct *tty, unsigned char ch)
1034 pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch); 1034 pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch);
1035 1035
1036 if (tty == NULL) 1036 if (tty == NULL)
1037 return; 1037 return -EINVAL;
1038 portp = tty->driver_data; 1038 portp = tty->driver_data;
1039 if (portp == NULL) 1039 if (portp == NULL)
1040 return; 1040 return -EINVAL;
1041 if (portp->tx.buf == NULL) 1041 if (portp->tx.buf == NULL)
1042 return; 1042 return -EINVAL;
1043 1043
1044 head = portp->tx.head; 1044 head = portp->tx.head;
1045 tail = portp->tx.tail; 1045 tail = portp->tx.tail;
@@ -1053,6 +1053,7 @@ static void stl_putchar(struct tty_struct *tty, unsigned char ch)
1053 head = portp->tx.buf; 1053 head = portp->tx.buf;
1054 } 1054 }
1055 portp->tx.head = head; 1055 portp->tx.head = head;
1056 return 0;
1056} 1057}
1057 1058
1058/*****************************************************************************/ 1059/*****************************************************************************/
@@ -1255,7 +1256,6 @@ static int stl_tiocmset(struct tty_struct *tty, struct file *file,
1255static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg) 1256static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
1256{ 1257{
1257 struct stlport *portp; 1258 struct stlport *portp;
1258 unsigned int ival;
1259 int rc; 1259 int rc;
1260 void __user *argp = (void __user *)arg; 1260 void __user *argp = (void __user *)arg;
1261 1261
@@ -1460,19 +1460,20 @@ static void stl_hangup(struct tty_struct *tty)
1460 1460
1461/*****************************************************************************/ 1461/*****************************************************************************/
1462 1462
1463static void stl_breakctl(struct tty_struct *tty, int state) 1463static int stl_breakctl(struct tty_struct *tty, int state)
1464{ 1464{
1465 struct stlport *portp; 1465 struct stlport *portp;
1466 1466
1467 pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state); 1467 pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state);
1468 1468
1469 if (tty == NULL) 1469 if (tty == NULL)
1470 return; 1470 return -EINVAL;
1471 portp = tty->driver_data; 1471 portp = tty->driver_data;
1472 if (portp == NULL) 1472 if (portp == NULL)
1473 return; 1473 return -EINVAL;
1474 1474
1475 stl_sendbreak(portp, ((state == -1) ? 1 : 2)); 1475 stl_sendbreak(portp, ((state == -1) ? 1 : 2));
1476 return 0;
1476} 1477}
1477 1478
1478/*****************************************************************************/ 1479/*****************************************************************************/
@@ -4753,8 +4754,8 @@ static int __init stallion_module_init(void)
4753 if (IS_ERR(stallion_class)) 4754 if (IS_ERR(stallion_class))
4754 printk("STALLION: failed to create class\n"); 4755 printk("STALLION: failed to create class\n");
4755 for (i = 0; i < 4; i++) 4756 for (i = 0; i < 4; i++)
4756 device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i), 4757 device_create_drvdata(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
4757 "staliomem%d", i); 4758 NULL, "staliomem%d", i);
4758 4759
4759 return 0; 4760 return 0;
4760err_unrtty: 4761err_unrtty:
diff --git a/drivers/char/sx.c b/drivers/char/sx.c
index d5cffcd6a572..2162439bbe48 100644
--- a/drivers/char/sx.c
+++ b/drivers/char/sx.c
@@ -1840,7 +1840,7 @@ static int sx_fw_ioctl(struct inode *inode, struct file *filp,
1840 return rc; 1840 return rc;
1841} 1841}
1842 1842
1843static void sx_break(struct tty_struct *tty, int flag) 1843static int sx_break(struct tty_struct *tty, int flag)
1844{ 1844{
1845 struct sx_port *port = tty->driver_data; 1845 struct sx_port *port = tty->driver_data;
1846 int rv; 1846 int rv;
@@ -1857,6 +1857,7 @@ static void sx_break(struct tty_struct *tty, int flag)
1857 read_sx_byte(port->board, CHAN_OFFSET(port, hi_hstat))); 1857 read_sx_byte(port->board, CHAN_OFFSET(port, hi_hstat)));
1858 unlock_kernel(); 1858 unlock_kernel();
1859 func_exit(); 1859 func_exit();
1860 return 0;
1860} 1861}
1861 1862
1862static int sx_tiocmget(struct tty_struct *tty, struct file *file) 1863static int sx_tiocmget(struct tty_struct *tty, struct file *file)
diff --git a/drivers/char/synclink.c b/drivers/char/synclink.c
index 527d220aa4aa..ef6706f09061 100644
--- a/drivers/char/synclink.c
+++ b/drivers/char/synclink.c
@@ -2897,9 +2897,9 @@ static int tiocmset(struct tty_struct *tty, struct file *file,
2897 * 2897 *
2898 * Arguments: tty pointer to tty instance data 2898 * Arguments: tty pointer to tty instance data
2899 * break_state -1=set break condition, 0=clear 2899 * break_state -1=set break condition, 0=clear
2900 * Return Value: None 2900 * Return Value: error code
2901 */ 2901 */
2902static void mgsl_break(struct tty_struct *tty, int break_state) 2902static int mgsl_break(struct tty_struct *tty, int break_state)
2903{ 2903{
2904 struct mgsl_struct * info = (struct mgsl_struct *)tty->driver_data; 2904 struct mgsl_struct * info = (struct mgsl_struct *)tty->driver_data;
2905 unsigned long flags; 2905 unsigned long flags;
@@ -2909,7 +2909,7 @@ static void mgsl_break(struct tty_struct *tty, int break_state)
2909 __FILE__,__LINE__, info->device_name, break_state); 2909 __FILE__,__LINE__, info->device_name, break_state);
2910 2910
2911 if (mgsl_paranoia_check(info, tty->name, "mgsl_break")) 2911 if (mgsl_paranoia_check(info, tty->name, "mgsl_break"))
2912 return; 2912 return -EINVAL;
2913 2913
2914 spin_lock_irqsave(&info->irq_spinlock,flags); 2914 spin_lock_irqsave(&info->irq_spinlock,flags);
2915 if (break_state == -1) 2915 if (break_state == -1)
@@ -2917,6 +2917,7 @@ static void mgsl_break(struct tty_struct *tty, int break_state)
2917 else 2917 else
2918 usc_OutReg(info,IOCR,(u16)(usc_InReg(info,IOCR) & ~BIT7)); 2918 usc_OutReg(info,IOCR,(u16)(usc_InReg(info,IOCR) & ~BIT7));
2919 spin_unlock_irqrestore(&info->irq_spinlock,flags); 2919 spin_unlock_irqrestore(&info->irq_spinlock,flags);
2920 return 0;
2920 2921
2921} /* end of mgsl_break() */ 2922} /* end of mgsl_break() */
2922 2923
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c
index 2c3e43bb2cc9..3e9058993e41 100644
--- a/drivers/char/synclink_gt.c
+++ b/drivers/char/synclink_gt.c
@@ -165,7 +165,7 @@ static int read_proc(char *page, char **start, off_t off, int count,int *eof, v
165static int chars_in_buffer(struct tty_struct *tty); 165static int chars_in_buffer(struct tty_struct *tty);
166static void throttle(struct tty_struct * tty); 166static void throttle(struct tty_struct * tty);
167static void unthrottle(struct tty_struct * tty); 167static void unthrottle(struct tty_struct * tty);
168static void set_break(struct tty_struct *tty, int break_state); 168static int set_break(struct tty_struct *tty, int break_state);
169 169
170/* 170/*
171 * generic HDLC support and callbacks 171 * generic HDLC support and callbacks
@@ -214,6 +214,7 @@ struct slgt_desc
214 char *buf; /* virtual address of data buffer */ 214 char *buf; /* virtual address of data buffer */
215 unsigned int pdesc; /* physical address of this descriptor */ 215 unsigned int pdesc; /* physical address of this descriptor */
216 dma_addr_t buf_dma_addr; 216 dma_addr_t buf_dma_addr;
217 unsigned short buf_count;
217}; 218};
218 219
219#define set_desc_buffer(a,b) (a).pbuf = cpu_to_le32((unsigned int)(b)) 220#define set_desc_buffer(a,b) (a).pbuf = cpu_to_le32((unsigned int)(b))
@@ -302,7 +303,7 @@ struct slgt_info {
302 u32 idle_mode; 303 u32 idle_mode;
303 u32 max_frame_size; /* as set by device config */ 304 u32 max_frame_size; /* as set by device config */
304 305
305 unsigned int raw_rx_size; 306 unsigned int rbuf_fill_level;
306 unsigned int if_mode; 307 unsigned int if_mode;
307 308
308 /* device status */ 309 /* device status */
@@ -466,6 +467,7 @@ static void tx_start(struct slgt_info *info);
466static void tx_stop(struct slgt_info *info); 467static void tx_stop(struct slgt_info *info);
467static void tx_set_idle(struct slgt_info *info); 468static void tx_set_idle(struct slgt_info *info);
468static unsigned int free_tbuf_count(struct slgt_info *info); 469static unsigned int free_tbuf_count(struct slgt_info *info);
470static unsigned int tbuf_bytes(struct slgt_info *info);
469static void reset_tbufs(struct slgt_info *info); 471static void reset_tbufs(struct slgt_info *info);
470static void tdma_reset(struct slgt_info *info); 472static void tdma_reset(struct slgt_info *info);
471static void tdma_start(struct slgt_info *info); 473static void tdma_start(struct slgt_info *info);
@@ -513,7 +515,7 @@ static int wait_mgsl_event(struct slgt_info *info, int __user *mask_ptr);
513static int tiocmget(struct tty_struct *tty, struct file *file); 515static int tiocmget(struct tty_struct *tty, struct file *file);
514static int tiocmset(struct tty_struct *tty, struct file *file, 516static int tiocmset(struct tty_struct *tty, struct file *file,
515 unsigned int set, unsigned int clear); 517 unsigned int set, unsigned int clear);
516static void set_break(struct tty_struct *tty, int break_state); 518static int set_break(struct tty_struct *tty, int break_state);
517static int get_interface(struct slgt_info *info, int __user *if_mode); 519static int get_interface(struct slgt_info *info, int __user *if_mode);
518static int set_interface(struct slgt_info *info, int if_mode); 520static int set_interface(struct slgt_info *info, int if_mode);
519static int set_gpio(struct slgt_info *info, struct gpio_desc __user *gpio); 521static int set_gpio(struct slgt_info *info, struct gpio_desc __user *gpio);
@@ -849,6 +851,7 @@ static int write(struct tty_struct *tty,
849 int ret = 0; 851 int ret = 0;
850 struct slgt_info *info = tty->driver_data; 852 struct slgt_info *info = tty->driver_data;
851 unsigned long flags; 853 unsigned long flags;
854 unsigned int bufs_needed;
852 855
853 if (sanity_check(info, tty->name, "write")) 856 if (sanity_check(info, tty->name, "write"))
854 goto cleanup; 857 goto cleanup;
@@ -865,25 +868,16 @@ static int write(struct tty_struct *tty,
865 if (!count) 868 if (!count)
866 goto cleanup; 869 goto cleanup;
867 870
868 if (info->params.mode == MGSL_MODE_RAW || 871 if (!info->tx_active && info->tx_count) {
869 info->params.mode == MGSL_MODE_MONOSYNC || 872 /* send accumulated data from send_char() */
870 info->params.mode == MGSL_MODE_BISYNC) { 873 tx_load(info, info->tx_buf, info->tx_count);
871 unsigned int bufs_needed = (count/DMABUFSIZE); 874 goto start;
872 unsigned int bufs_free = free_tbuf_count(info);
873 if (count % DMABUFSIZE)
874 ++bufs_needed;
875 if (bufs_needed > bufs_free)
876 goto cleanup;
877 } else {
878 if (info->tx_active)
879 goto cleanup;
880 if (info->tx_count) {
881 /* send accumulated data from send_char() calls */
882 /* as frame and wait before accepting more data. */
883 tx_load(info, info->tx_buf, info->tx_count);
884 goto start;
885 }
886 } 875 }
876 bufs_needed = (count/DMABUFSIZE);
877 if (count % DMABUFSIZE)
878 ++bufs_needed;
879 if (bufs_needed > free_tbuf_count(info))
880 goto cleanup;
887 881
888 ret = info->tx_count = count; 882 ret = info->tx_count = count;
889 tx_load(info, buf, count); 883 tx_load(info, buf, count);
@@ -1396,10 +1390,12 @@ done:
1396static int chars_in_buffer(struct tty_struct *tty) 1390static int chars_in_buffer(struct tty_struct *tty)
1397{ 1391{
1398 struct slgt_info *info = tty->driver_data; 1392 struct slgt_info *info = tty->driver_data;
1393 int count;
1399 if (sanity_check(info, tty->name, "chars_in_buffer")) 1394 if (sanity_check(info, tty->name, "chars_in_buffer"))
1400 return 0; 1395 return 0;
1401 DBGINFO(("%s chars_in_buffer()=%d\n", info->device_name, info->tx_count)); 1396 count = tbuf_bytes(info);
1402 return info->tx_count; 1397 DBGINFO(("%s chars_in_buffer()=%d\n", info->device_name, count));
1398 return count;
1403} 1399}
1404 1400
1405/* 1401/*
@@ -1452,14 +1448,14 @@ static void unthrottle(struct tty_struct * tty)
1452 * set or clear transmit break condition 1448 * set or clear transmit break condition
1453 * break_state -1=set break condition, 0=clear 1449 * break_state -1=set break condition, 0=clear
1454 */ 1450 */
1455static void set_break(struct tty_struct *tty, int break_state) 1451static int set_break(struct tty_struct *tty, int break_state)
1456{ 1452{
1457 struct slgt_info *info = tty->driver_data; 1453 struct slgt_info *info = tty->driver_data;
1458 unsigned short value; 1454 unsigned short value;
1459 unsigned long flags; 1455 unsigned long flags;
1460 1456
1461 if (sanity_check(info, tty->name, "set_break")) 1457 if (sanity_check(info, tty->name, "set_break"))
1462 return; 1458 return -EINVAL;
1463 DBGINFO(("%s set_break(%d)\n", info->device_name, break_state)); 1459 DBGINFO(("%s set_break(%d)\n", info->device_name, break_state));
1464 1460
1465 spin_lock_irqsave(&info->lock,flags); 1461 spin_lock_irqsave(&info->lock,flags);
@@ -1470,6 +1466,7 @@ static void set_break(struct tty_struct *tty, int break_state)
1470 value &= ~BIT6; 1466 value &= ~BIT6;
1471 wr_reg16(info, TCR, value); 1467 wr_reg16(info, TCR, value);
1472 spin_unlock_irqrestore(&info->lock,flags); 1468 spin_unlock_irqrestore(&info->lock,flags);
1469 return 0;
1473} 1470}
1474 1471
1475#if SYNCLINK_GENERIC_HDLC 1472#if SYNCLINK_GENERIC_HDLC
@@ -2679,8 +2676,31 @@ static int tx_abort(struct slgt_info *info)
2679static int rx_enable(struct slgt_info *info, int enable) 2676static int rx_enable(struct slgt_info *info, int enable)
2680{ 2677{
2681 unsigned long flags; 2678 unsigned long flags;
2682 DBGINFO(("%s rx_enable(%d)\n", info->device_name, enable)); 2679 unsigned int rbuf_fill_level;
2680 DBGINFO(("%s rx_enable(%08x)\n", info->device_name, enable));
2683 spin_lock_irqsave(&info->lock,flags); 2681 spin_lock_irqsave(&info->lock,flags);
2682 /*
2683 * enable[31..16] = receive DMA buffer fill level
2684 * 0 = noop (leave fill level unchanged)
2685 * fill level must be multiple of 4 and <= buffer size
2686 */
2687 rbuf_fill_level = ((unsigned int)enable) >> 16;
2688 if (rbuf_fill_level) {
2689 if ((rbuf_fill_level > DMABUFSIZE) || (rbuf_fill_level % 4)) {
2690 spin_unlock_irqrestore(&info->lock, flags);
2691 return -EINVAL;
2692 }
2693 info->rbuf_fill_level = rbuf_fill_level;
2694 rx_stop(info); /* restart receiver to use new fill level */
2695 }
2696
2697 /*
2698 * enable[1..0] = receiver enable command
2699 * 0 = disable
2700 * 1 = enable
2701 * 2 = enable or force hunt mode if already enabled
2702 */
2703 enable &= 3;
2684 if (enable) { 2704 if (enable) {
2685 if (!info->rx_enabled) 2705 if (!info->rx_enabled)
2686 rx_start(info); 2706 rx_start(info);
@@ -3447,7 +3467,7 @@ static struct slgt_info *alloc_dev(int adapter_num, int port_num, struct pci_dev
3447 info->magic = MGSL_MAGIC; 3467 info->magic = MGSL_MAGIC;
3448 INIT_WORK(&info->task, bh_handler); 3468 INIT_WORK(&info->task, bh_handler);
3449 info->max_frame_size = 4096; 3469 info->max_frame_size = 4096;
3450 info->raw_rx_size = DMABUFSIZE; 3470 info->rbuf_fill_level = DMABUFSIZE;
3451 info->port.close_delay = 5*HZ/10; 3471 info->port.close_delay = 5*HZ/10;
3452 info->port.closing_wait = 30*HZ; 3472 info->port.closing_wait = 30*HZ;
3453 init_waitqueue_head(&info->status_event_wait_q); 3473 init_waitqueue_head(&info->status_event_wait_q);
@@ -3934,15 +3954,7 @@ static void tdma_start(struct slgt_info *info)
3934 3954
3935 /* set 1st descriptor address */ 3955 /* set 1st descriptor address */
3936 wr_reg32(info, TDDAR, info->tbufs[info->tbuf_start].pdesc); 3956 wr_reg32(info, TDDAR, info->tbufs[info->tbuf_start].pdesc);
3937 switch(info->params.mode) { 3957 wr_reg32(info, TDCSR, BIT2 + BIT0); /* IRQ + DMA enable */
3938 case MGSL_MODE_RAW:
3939 case MGSL_MODE_MONOSYNC:
3940 case MGSL_MODE_BISYNC:
3941 wr_reg32(info, TDCSR, BIT2 + BIT0); /* IRQ + DMA enable */
3942 break;
3943 default:
3944 wr_reg32(info, TDCSR, BIT0); /* DMA enable */
3945 }
3946} 3958}
3947 3959
3948static void tx_stop(struct slgt_info *info) 3960static void tx_stop(struct slgt_info *info)
@@ -4145,7 +4157,7 @@ static void sync_mode(struct slgt_info *info)
4145 * 01 enable 4157 * 01 enable
4146 * 00 auto-CTS enable 4158 * 00 auto-CTS enable
4147 */ 4159 */
4148 val = 0; 4160 val = BIT2;
4149 4161
4150 switch(info->params.mode) { 4162 switch(info->params.mode) {
4151 case MGSL_MODE_MONOSYNC: val |= BIT14 + BIT13; break; 4163 case MGSL_MODE_MONOSYNC: val |= BIT14 + BIT13; break;
@@ -4418,6 +4430,8 @@ static void msc_set_vcr(struct slgt_info *info)
4418 break; 4430 break;
4419 } 4431 }
4420 4432
4433 if (info->if_mode & MGSL_INTERFACE_MSB_FIRST)
4434 val |= BIT4;
4421 if (info->signals & SerialSignal_DTR) 4435 if (info->signals & SerialSignal_DTR)
4422 val |= BIT3; 4436 val |= BIT3;
4423 if (info->signals & SerialSignal_RTS) 4437 if (info->signals & SerialSignal_RTS)
@@ -4456,16 +4470,7 @@ static void free_rbufs(struct slgt_info *info, unsigned int i, unsigned int last
4456 while(!done) { 4470 while(!done) {
4457 /* reset current buffer for reuse */ 4471 /* reset current buffer for reuse */
4458 info->rbufs[i].status = 0; 4472 info->rbufs[i].status = 0;
4459 switch(info->params.mode) { 4473 set_desc_count(info->rbufs[i], info->rbuf_fill_level);
4460 case MGSL_MODE_RAW:
4461 case MGSL_MODE_MONOSYNC:
4462 case MGSL_MODE_BISYNC:
4463 set_desc_count(info->rbufs[i], info->raw_rx_size);
4464 break;
4465 default:
4466 set_desc_count(info->rbufs[i], DMABUFSIZE);
4467 }
4468
4469 if (i == last) 4474 if (i == last)
4470 done = 1; 4475 done = 1;
4471 if (++i == info->rbuf_count) 4476 if (++i == info->rbuf_count)
@@ -4572,7 +4577,7 @@ check_again:
4572 4577
4573 DBGBH(("%s rx frame status=%04X size=%d\n", 4578 DBGBH(("%s rx frame status=%04X size=%d\n",
4574 info->device_name, status, framesize)); 4579 info->device_name, status, framesize));
4575 DBGDATA(info, info->rbufs[start].buf, min_t(int, framesize, DMABUFSIZE), "rx"); 4580 DBGDATA(info, info->rbufs[start].buf, min_t(int, framesize, info->rbuf_fill_level), "rx");
4576 4581
4577 if (framesize) { 4582 if (framesize) {
4578 if (!(info->params.crc_type & HDLC_CRC_RETURN_EX)) { 4583 if (!(info->params.crc_type & HDLC_CRC_RETURN_EX)) {
@@ -4592,7 +4597,7 @@ check_again:
4592 info->icount.rxok++; 4597 info->icount.rxok++;
4593 4598
4594 while(copy_count) { 4599 while(copy_count) {
4595 int partial_count = min(copy_count, DMABUFSIZE); 4600 int partial_count = min_t(int, copy_count, info->rbuf_fill_level);
4596 memcpy(p, info->rbufs[i].buf, partial_count); 4601 memcpy(p, info->rbufs[i].buf, partial_count);
4597 p += partial_count; 4602 p += partial_count;
4598 copy_count -= partial_count; 4603 copy_count -= partial_count;
@@ -4684,6 +4689,56 @@ static unsigned int free_tbuf_count(struct slgt_info *info)
4684} 4689}
4685 4690
4686/* 4691/*
4692 * return number of bytes in unsent transmit DMA buffers
4693 * and the serial controller tx FIFO
4694 */
4695static unsigned int tbuf_bytes(struct slgt_info *info)
4696{
4697 unsigned int total_count = 0;
4698 unsigned int i = info->tbuf_current;
4699 unsigned int reg_value;
4700 unsigned int count;
4701 unsigned int active_buf_count = 0;
4702
4703 /*
4704 * Add descriptor counts for all tx DMA buffers.
4705 * If count is zero (cleared by DMA controller after read),
4706 * the buffer is complete or is actively being read from.
4707 *
4708 * Record buf_count of last buffer with zero count starting
4709 * from current ring position. buf_count is mirror
4710 * copy of count and is not cleared by serial controller.
4711 * If DMA controller is active, that buffer is actively
4712 * being read so add to total.
4713 */
4714 do {
4715 count = desc_count(info->tbufs[i]);
4716 if (count)
4717 total_count += count;
4718 else if (!total_count)
4719 active_buf_count = info->tbufs[i].buf_count;
4720 if (++i == info->tbuf_count)
4721 i = 0;
4722 } while (i != info->tbuf_current);
4723
4724 /* read tx DMA status register */
4725 reg_value = rd_reg32(info, TDCSR);
4726
4727 /* if tx DMA active, last zero count buffer is in use */
4728 if (reg_value & BIT0)
4729 total_count += active_buf_count;
4730
4731 /* add tx FIFO count = reg_value[15..8] */
4732 total_count += (reg_value >> 8) & 0xff;
4733
4734 /* if transmitter active add one byte for shift register */
4735 if (info->tx_active)
4736 total_count++;
4737
4738 return total_count;
4739}
4740
4741/*
4687 * load transmit DMA buffer(s) with data 4742 * load transmit DMA buffer(s) with data
4688 */ 4743 */
4689static void tx_load(struct slgt_info *info, const char *buf, unsigned int size) 4744static void tx_load(struct slgt_info *info, const char *buf, unsigned int size)
@@ -4721,6 +4776,7 @@ static void tx_load(struct slgt_info *info, const char *buf, unsigned int size)
4721 set_desc_eof(*d, 0); 4776 set_desc_eof(*d, 0);
4722 4777
4723 set_desc_count(*d, count); 4778 set_desc_count(*d, count);
4779 d->buf_count = count;
4724 } 4780 }
4725 4781
4726 info->tbuf_current = i; 4782 info->tbuf_current = i;
diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c
index 5768c4136342..c0490cbd0db2 100644
--- a/drivers/char/synclinkmp.c
+++ b/drivers/char/synclinkmp.c
@@ -527,7 +527,7 @@ static int read_proc(char *page, char **start, off_t off, int count,int *eof, v
527static int chars_in_buffer(struct tty_struct *tty); 527static int chars_in_buffer(struct tty_struct *tty);
528static void throttle(struct tty_struct * tty); 528static void throttle(struct tty_struct * tty);
529static void unthrottle(struct tty_struct * tty); 529static void unthrottle(struct tty_struct * tty);
530static void set_break(struct tty_struct *tty, int break_state); 530static int set_break(struct tty_struct *tty, int break_state);
531 531
532#if SYNCLINK_GENERIC_HDLC 532#if SYNCLINK_GENERIC_HDLC
533#define dev_to_port(D) (dev_to_hdlc(D)->priv) 533#define dev_to_port(D) (dev_to_hdlc(D)->priv)
@@ -552,7 +552,7 @@ static int wait_mgsl_event(SLMP_INFO *info, int __user *mask_ptr);
552static int tiocmget(struct tty_struct *tty, struct file *file); 552static int tiocmget(struct tty_struct *tty, struct file *file);
553static int tiocmset(struct tty_struct *tty, struct file *file, 553static int tiocmset(struct tty_struct *tty, struct file *file,
554 unsigned int set, unsigned int clear); 554 unsigned int set, unsigned int clear);
555static void set_break(struct tty_struct *tty, int break_state); 555static int set_break(struct tty_struct *tty, int break_state);
556 556
557static void add_device(SLMP_INFO *info); 557static void add_device(SLMP_INFO *info);
558static void device_init(int adapter_num, struct pci_dev *pdev); 558static void device_init(int adapter_num, struct pci_dev *pdev);
@@ -1587,7 +1587,7 @@ static void unthrottle(struct tty_struct * tty)
1587/* set or clear transmit break condition 1587/* set or clear transmit break condition
1588 * break_state -1=set break condition, 0=clear 1588 * break_state -1=set break condition, 0=clear
1589 */ 1589 */
1590static void set_break(struct tty_struct *tty, int break_state) 1590static int set_break(struct tty_struct *tty, int break_state)
1591{ 1591{
1592 unsigned char RegValue; 1592 unsigned char RegValue;
1593 SLMP_INFO * info = (SLMP_INFO *)tty->driver_data; 1593 SLMP_INFO * info = (SLMP_INFO *)tty->driver_data;
@@ -1598,7 +1598,7 @@ static void set_break(struct tty_struct *tty, int break_state)
1598 __FILE__,__LINE__, info->device_name, break_state); 1598 __FILE__,__LINE__, info->device_name, break_state);
1599 1599
1600 if (sanity_check(info, tty->name, "set_break")) 1600 if (sanity_check(info, tty->name, "set_break"))
1601 return; 1601 return -EINVAL;
1602 1602
1603 spin_lock_irqsave(&info->lock,flags); 1603 spin_lock_irqsave(&info->lock,flags);
1604 RegValue = read_reg(info, CTL); 1604 RegValue = read_reg(info, CTL);
@@ -1608,6 +1608,7 @@ static void set_break(struct tty_struct *tty, int break_state)
1608 RegValue &= ~BIT3; 1608 RegValue &= ~BIT3;
1609 write_reg(info, CTL, RegValue); 1609 write_reg(info, CTL, RegValue);
1610 spin_unlock_irqrestore(&info->lock,flags); 1610 spin_unlock_irqrestore(&info->lock,flags);
1611 return 0;
1611} 1612}
1612 1613
1613#if SYNCLINK_GENERIC_HDLC 1614#if SYNCLINK_GENERIC_HDLC
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 82f6a8c86332..6f4d856df987 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -656,558 +656,6 @@ EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
656 656
657 657
658/** 658/**
659 * tty_set_termios_ldisc - set ldisc field
660 * @tty: tty structure
661 * @num: line discipline number
662 *
663 * This is probably overkill for real world processors but
664 * they are not on hot paths so a little discipline won't do
665 * any harm.
666 *
667 * Locking: takes termios_mutex
668 */
669
670static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
671{
672 mutex_lock(&tty->termios_mutex);
673 tty->termios->c_line = num;
674 mutex_unlock(&tty->termios_mutex);
675}
676
677/*
678 * This guards the refcounted line discipline lists. The lock
679 * must be taken with irqs off because there are hangup path
680 * callers who will do ldisc lookups and cannot sleep.
681 */
682
683static DEFINE_SPINLOCK(tty_ldisc_lock);
684static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
685/* Line disc dispatch table */
686static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
687
688/**
689 * tty_register_ldisc - install a line discipline
690 * @disc: ldisc number
691 * @new_ldisc: pointer to the ldisc object
692 *
693 * Installs a new line discipline into the kernel. The discipline
694 * is set up as unreferenced and then made available to the kernel
695 * from this point onwards.
696 *
697 * Locking:
698 * takes tty_ldisc_lock to guard against ldisc races
699 */
700
701int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
702{
703 unsigned long flags;
704 int ret = 0;
705
706 if (disc < N_TTY || disc >= NR_LDISCS)
707 return -EINVAL;
708
709 spin_lock_irqsave(&tty_ldisc_lock, flags);
710 tty_ldiscs[disc] = new_ldisc;
711 new_ldisc->num = disc;
712 new_ldisc->refcount = 0;
713 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
714
715 return ret;
716}
717EXPORT_SYMBOL(tty_register_ldisc);
718
719/**
720 * tty_unregister_ldisc - unload a line discipline
721 * @disc: ldisc number
722 * @new_ldisc: pointer to the ldisc object
723 *
724 * Remove a line discipline from the kernel providing it is not
725 * currently in use.
726 *
727 * Locking:
728 * takes tty_ldisc_lock to guard against ldisc races
729 */
730
731int tty_unregister_ldisc(int disc)
732{
733 unsigned long flags;
734 int ret = 0;
735
736 if (disc < N_TTY || disc >= NR_LDISCS)
737 return -EINVAL;
738
739 spin_lock_irqsave(&tty_ldisc_lock, flags);
740 if (tty_ldiscs[disc]->refcount)
741 ret = -EBUSY;
742 else
743 tty_ldiscs[disc] = NULL;
744 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
745
746 return ret;
747}
748EXPORT_SYMBOL(tty_unregister_ldisc);
749
750
751/**
752 * tty_ldisc_try_get - try and reference an ldisc
753 * @disc: ldisc number
754 * @ld: tty ldisc structure to complete
755 *
756 * Attempt to open and lock a line discipline into place. Return
757 * the line discipline refcounted and assigned in ld. On an error
758 * report the error code back
759 */
760
761static int tty_ldisc_try_get(int disc, struct tty_ldisc *ld)
762{
763 unsigned long flags;
764 struct tty_ldisc_ops *ldops;
765 int err = -EINVAL;
766
767 spin_lock_irqsave(&tty_ldisc_lock, flags);
768 ld->ops = NULL;
769 ldops = tty_ldiscs[disc];
770 /* Check the entry is defined */
771 if (ldops) {
772 /* If the module is being unloaded we can't use it */
773 if (!try_module_get(ldops->owner))
774 err = -EAGAIN;
775 else {
776 /* lock it */
777 ldops->refcount++;
778 ld->ops = ldops;
779 err = 0;
780 }
781 }
782 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
783 return err;
784}
785
786/**
787 * tty_ldisc_get - take a reference to an ldisc
788 * @disc: ldisc number
789 * @ld: tty line discipline structure to use
790 *
791 * Takes a reference to a line discipline. Deals with refcounts and
792 * module locking counts. Returns NULL if the discipline is not available.
793 * Returns a pointer to the discipline and bumps the ref count if it is
794 * available
795 *
796 * Locking:
797 * takes tty_ldisc_lock to guard against ldisc races
798 */
799
800static int tty_ldisc_get(int disc, struct tty_ldisc *ld)
801{
802 int err;
803
804 if (disc < N_TTY || disc >= NR_LDISCS)
805 return -EINVAL;
806 err = tty_ldisc_try_get(disc, ld);
807 if (err == -EAGAIN) {
808 request_module("tty-ldisc-%d", disc);
809 err = tty_ldisc_try_get(disc, ld);
810 }
811 return err;
812}
813
814/**
815 * tty_ldisc_put - drop ldisc reference
816 * @disc: ldisc number
817 *
818 * Drop a reference to a line discipline. Manage refcounts and
819 * module usage counts
820 *
821 * Locking:
822 * takes tty_ldisc_lock to guard against ldisc races
823 */
824
825static void tty_ldisc_put(struct tty_ldisc_ops *ld)
826{
827 unsigned long flags;
828 int disc = ld->num;
829
830 BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
831
832 spin_lock_irqsave(&tty_ldisc_lock, flags);
833 ld = tty_ldiscs[disc];
834 BUG_ON(ld->refcount == 0);
835 ld->refcount--;
836 module_put(ld->owner);
837 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
838}
839
840static void * tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
841{
842 return (*pos < NR_LDISCS) ? pos : NULL;
843}
844
845static void * tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
846{
847 (*pos)++;
848 return (*pos < NR_LDISCS) ? pos : NULL;
849}
850
851static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
852{
853}
854
855static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
856{
857 int i = *(loff_t *)v;
858 struct tty_ldisc ld;
859
860 if (tty_ldisc_get(i, &ld) < 0)
861 return 0;
862 seq_printf(m, "%-10s %2d\n", ld.ops->name ? ld.ops->name : "???", i);
863 tty_ldisc_put(ld.ops);
864 return 0;
865}
866
867static const struct seq_operations tty_ldiscs_seq_ops = {
868 .start = tty_ldiscs_seq_start,
869 .next = tty_ldiscs_seq_next,
870 .stop = tty_ldiscs_seq_stop,
871 .show = tty_ldiscs_seq_show,
872};
873
874static int proc_tty_ldiscs_open(struct inode *inode, struct file *file)
875{
876 return seq_open(file, &tty_ldiscs_seq_ops);
877}
878
879const struct file_operations tty_ldiscs_proc_fops = {
880 .owner = THIS_MODULE,
881 .open = proc_tty_ldiscs_open,
882 .read = seq_read,
883 .llseek = seq_lseek,
884 .release = seq_release,
885};
886
887/**
888 * tty_ldisc_assign - set ldisc on a tty
889 * @tty: tty to assign
890 * @ld: line discipline
891 *
892 * Install an instance of a line discipline into a tty structure. The
893 * ldisc must have a reference count above zero to ensure it remains/
894 * The tty instance refcount starts at zero.
895 *
896 * Locking:
897 * Caller must hold references
898 */
899
900static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
901{
902 ld->refcount = 0;
903 tty->ldisc = *ld;
904}
905
906/**
907 * tty_ldisc_try - internal helper
908 * @tty: the tty
909 *
910 * Make a single attempt to grab and bump the refcount on
911 * the tty ldisc. Return 0 on failure or 1 on success. This is
912 * used to implement both the waiting and non waiting versions
913 * of tty_ldisc_ref
914 *
915 * Locking: takes tty_ldisc_lock
916 */
917
918static int tty_ldisc_try(struct tty_struct *tty)
919{
920 unsigned long flags;
921 struct tty_ldisc *ld;
922 int ret = 0;
923
924 spin_lock_irqsave(&tty_ldisc_lock, flags);
925 ld = &tty->ldisc;
926 if (test_bit(TTY_LDISC, &tty->flags)) {
927 ld->refcount++;
928 ret = 1;
929 }
930 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
931 return ret;
932}
933
934/**
935 * tty_ldisc_ref_wait - wait for the tty ldisc
936 * @tty: tty device
937 *
938 * Dereference the line discipline for the terminal and take a
939 * reference to it. If the line discipline is in flux then
940 * wait patiently until it changes.
941 *
942 * Note: Must not be called from an IRQ/timer context. The caller
943 * must also be careful not to hold other locks that will deadlock
944 * against a discipline change, such as an existing ldisc reference
945 * (which we check for)
946 *
947 * Locking: call functions take tty_ldisc_lock
948 */
949
950struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
951{
952 /* wait_event is a macro */
953 wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
954 if (tty->ldisc.refcount == 0)
955 printk(KERN_ERR "tty_ldisc_ref_wait\n");
956 return &tty->ldisc;
957}
958
959EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
960
961/**
962 * tty_ldisc_ref - get the tty ldisc
963 * @tty: tty device
964 *
965 * Dereference the line discipline for the terminal and take a
966 * reference to it. If the line discipline is in flux then
967 * return NULL. Can be called from IRQ and timer functions.
968 *
969 * Locking: called functions take tty_ldisc_lock
970 */
971
972struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
973{
974 if (tty_ldisc_try(tty))
975 return &tty->ldisc;
976 return NULL;
977}
978
979EXPORT_SYMBOL_GPL(tty_ldisc_ref);
980
981/**
982 * tty_ldisc_deref - free a tty ldisc reference
983 * @ld: reference to free up
984 *
985 * Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
986 * be called in IRQ context.
987 *
988 * Locking: takes tty_ldisc_lock
989 */
990
991void tty_ldisc_deref(struct tty_ldisc *ld)
992{
993 unsigned long flags;
994
995 BUG_ON(ld == NULL);
996
997 spin_lock_irqsave(&tty_ldisc_lock, flags);
998 if (ld->refcount == 0)
999 printk(KERN_ERR "tty_ldisc_deref: no references.\n");
1000 else
1001 ld->refcount--;
1002 if (ld->refcount == 0)
1003 wake_up(&tty_ldisc_wait);
1004 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1005}
1006
1007EXPORT_SYMBOL_GPL(tty_ldisc_deref);
1008
1009/**
1010 * tty_ldisc_enable - allow ldisc use
1011 * @tty: terminal to activate ldisc on
1012 *
1013 * Set the TTY_LDISC flag when the line discipline can be called
1014 * again. Do necessary wakeups for existing sleepers.
1015 *
1016 * Note: nobody should set this bit except via this function. Clearing
1017 * directly is allowed.
1018 */
1019
1020static void tty_ldisc_enable(struct tty_struct *tty)
1021{
1022 set_bit(TTY_LDISC, &tty->flags);
1023 wake_up(&tty_ldisc_wait);
1024}
1025
1026/**
1027 * tty_ldisc_restore - helper for tty ldisc change
1028 * @tty: tty to recover
1029 * @old: previous ldisc
1030 *
1031 * Restore the previous line discipline or N_TTY when a line discipline
1032 * change fails due to an open error
1033 */
1034
1035static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
1036{
1037 char buf[64];
1038 struct tty_ldisc new_ldisc;
1039
1040 /* There is an outstanding reference here so this is safe */
1041 tty_ldisc_get(old->ops->num, old);
1042 tty_ldisc_assign(tty, old);
1043 tty_set_termios_ldisc(tty, old->ops->num);
1044 if (old->ops->open && (old->ops->open(tty) < 0)) {
1045 tty_ldisc_put(old->ops);
1046 /* This driver is always present */
1047 if (tty_ldisc_get(N_TTY, &new_ldisc) < 0)
1048 panic("n_tty: get");
1049 tty_ldisc_assign(tty, &new_ldisc);
1050 tty_set_termios_ldisc(tty, N_TTY);
1051 if (new_ldisc.ops->open) {
1052 int r = new_ldisc.ops->open(tty);
1053 if (r < 0)
1054 panic("Couldn't open N_TTY ldisc for "
1055 "%s --- error %d.",
1056 tty_name(tty, buf), r);
1057 }
1058 }
1059}
1060
1061/**
1062 * tty_set_ldisc - set line discipline
1063 * @tty: the terminal to set
1064 * @ldisc: the line discipline
1065 *
1066 * Set the discipline of a tty line. Must be called from a process
1067 * context.
1068 *
1069 * Locking: takes tty_ldisc_lock.
1070 * called functions take termios_mutex
1071 */
1072
1073static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
1074{
1075 int retval;
1076 struct tty_ldisc o_ldisc, new_ldisc;
1077 int work;
1078 unsigned long flags;
1079 struct tty_struct *o_tty;
1080
1081restart:
1082 /* This is a bit ugly for now but means we can break the 'ldisc
1083 is part of the tty struct' assumption later */
1084 retval = tty_ldisc_get(ldisc, &new_ldisc);
1085 if (retval)
1086 return retval;
1087
1088 /*
1089 * Problem: What do we do if this blocks ?
1090 */
1091
1092 tty_wait_until_sent(tty, 0);
1093
1094 if (tty->ldisc.ops->num == ldisc) {
1095 tty_ldisc_put(new_ldisc.ops);
1096 return 0;
1097 }
1098
1099 /*
1100 * No more input please, we are switching. The new ldisc
1101 * will update this value in the ldisc open function
1102 */
1103
1104 tty->receive_room = 0;
1105
1106 o_ldisc = tty->ldisc;
1107 o_tty = tty->link;
1108
1109 /*
1110 * Make sure we don't change while someone holds a
1111 * reference to the line discipline. The TTY_LDISC bit
1112 * prevents anyone taking a reference once it is clear.
1113 * We need the lock to avoid racing reference takers.
1114 */
1115
1116 spin_lock_irqsave(&tty_ldisc_lock, flags);
1117 if (tty->ldisc.refcount || (o_tty && o_tty->ldisc.refcount)) {
1118 if (tty->ldisc.refcount) {
1119 /* Free the new ldisc we grabbed. Must drop the lock
1120 first. */
1121 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1122 tty_ldisc_put(o_ldisc.ops);
1123 /*
1124 * There are several reasons we may be busy, including
1125 * random momentary I/O traffic. We must therefore
1126 * retry. We could distinguish between blocking ops
1127 * and retries if we made tty_ldisc_wait() smarter.
1128 * That is up for discussion.
1129 */
1130 if (wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
1131 return -ERESTARTSYS;
1132 goto restart;
1133 }
1134 if (o_tty && o_tty->ldisc.refcount) {
1135 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1136 tty_ldisc_put(o_tty->ldisc.ops);
1137 if (wait_event_interruptible(tty_ldisc_wait, o_tty->ldisc.refcount == 0) < 0)
1138 return -ERESTARTSYS;
1139 goto restart;
1140 }
1141 }
1142 /*
1143 * If the TTY_LDISC bit is set, then we are racing against
1144 * another ldisc change
1145 */
1146 if (!test_bit(TTY_LDISC, &tty->flags)) {
1147 struct tty_ldisc *ld;
1148 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1149 tty_ldisc_put(new_ldisc.ops);
1150 ld = tty_ldisc_ref_wait(tty);
1151 tty_ldisc_deref(ld);
1152 goto restart;
1153 }
1154
1155 clear_bit(TTY_LDISC, &tty->flags);
1156 if (o_tty)
1157 clear_bit(TTY_LDISC, &o_tty->flags);
1158 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1159
1160 /*
1161 * From this point on we know nobody has an ldisc
1162 * usage reference, nor can they obtain one until
1163 * we say so later on.
1164 */
1165
1166 work = cancel_delayed_work(&tty->buf.work);
1167 /*
1168 * Wait for ->hangup_work and ->buf.work handlers to terminate
1169 * MUST NOT hold locks here.
1170 */
1171 flush_scheduled_work();
1172 /* Shutdown the current discipline. */
1173 if (o_ldisc.ops->close)
1174 (o_ldisc.ops->close)(tty);
1175
1176 /* Now set up the new line discipline. */
1177 tty_ldisc_assign(tty, &new_ldisc);
1178 tty_set_termios_ldisc(tty, ldisc);
1179 if (new_ldisc.ops->open)
1180 retval = (new_ldisc.ops->open)(tty);
1181 if (retval < 0) {
1182 tty_ldisc_put(new_ldisc.ops);
1183 tty_ldisc_restore(tty, &o_ldisc);
1184 }
1185 /* At this point we hold a reference to the new ldisc and a
1186 a reference to the old ldisc. If we ended up flipping back
1187 to the existing ldisc we have two references to it */
1188
1189 if (tty->ldisc.ops->num != o_ldisc.ops->num && tty->ops->set_ldisc)
1190 tty->ops->set_ldisc(tty);
1191
1192 tty_ldisc_put(o_ldisc.ops);
1193
1194 /*
1195 * Allow ldisc referencing to occur as soon as the driver
1196 * ldisc callback completes.
1197 */
1198
1199 tty_ldisc_enable(tty);
1200 if (o_tty)
1201 tty_ldisc_enable(o_tty);
1202
1203 /* Restart it in case no characters kick it off. Safe if
1204 already running */
1205 if (work)
1206 schedule_delayed_work(&tty->buf.work, 1);
1207 return retval;
1208}
1209
1210/**
1211 * get_tty_driver - find device of a tty 659 * get_tty_driver - find device of a tty
1212 * @dev_t: device identifier 660 * @dev_t: device identifier
1213 * @index: returns the index of the tty 661 * @index: returns the index of the tty
@@ -1467,7 +915,7 @@ static void tty_reset_termios(struct tty_struct *tty)
1467 * do_tty_hangup - actual handler for hangup events 915 * do_tty_hangup - actual handler for hangup events
1468 * @work: tty device 916 * @work: tty device
1469 * 917 *
1470k * This can be called by the "eventd" kernel thread. That is process 918 * This can be called by the "eventd" kernel thread. That is process
1471 * synchronous but doesn't hold any locks, so we need to make sure we 919 * synchronous but doesn't hold any locks, so we need to make sure we
1472 * have the appropriate locks for what we're doing. 920 * have the appropriate locks for what we're doing.
1473 * 921 *
@@ -1671,19 +1119,6 @@ int tty_hung_up_p(struct file *filp)
1671 1119
1672EXPORT_SYMBOL(tty_hung_up_p); 1120EXPORT_SYMBOL(tty_hung_up_p);
1673 1121
1674/**
1675 * is_tty - checker whether file is a TTY
1676 * @filp: file handle that may be a tty
1677 *
1678 * Check if the file handle is a tty handle.
1679 */
1680
1681int is_tty(struct file *filp)
1682{
1683 return filp->f_op->read == tty_read
1684 || filp->f_op->read == hung_up_tty_read;
1685}
1686
1687static void session_clear_tty(struct pid *session) 1122static void session_clear_tty(struct pid *session)
1688{ 1123{
1689 struct task_struct *p; 1124 struct task_struct *p;
@@ -2193,7 +1628,6 @@ static int init_dev(struct tty_driver *driver, int idx,
2193 struct ktermios *tp, **tp_loc, *o_tp, **o_tp_loc; 1628 struct ktermios *tp, **tp_loc, *o_tp, **o_tp_loc;
2194 struct ktermios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc; 1629 struct ktermios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
2195 int retval = 0; 1630 int retval = 0;
2196 struct tty_ldisc *ld;
2197 1631
2198 /* check whether we're reopening an existing tty */ 1632 /* check whether we're reopening an existing tty */
2199 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) { 1633 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
@@ -2342,25 +1776,12 @@ static int init_dev(struct tty_driver *driver, int idx,
2342 * If we fail here just call release_tty to clean up. No need 1776 * If we fail here just call release_tty to clean up. No need
2343 * to decrement the use counts, as release_tty doesn't care. 1777 * to decrement the use counts, as release_tty doesn't care.
2344 */ 1778 */
2345
2346 ld = &tty->ldisc;
2347 1779
2348 if (ld->ops->open) { 1780 retval = tty_ldisc_setup(tty, o_tty);
2349 retval = (ld->ops->open)(tty); 1781
2350 if (retval) 1782 if (retval)
2351 goto release_mem_out; 1783 goto release_mem_out;
2352 } 1784 goto success;
2353 if (o_tty && o_tty->ldisc.ops->open) {
2354 retval = (o_tty->ldisc.ops->open)(o_tty);
2355 if (retval) {
2356 if (ld->ops->close)
2357 (ld->ops->close)(tty);
2358 goto release_mem_out;
2359 }
2360 tty_ldisc_enable(o_tty);
2361 }
2362 tty_ldisc_enable(tty);
2363 goto success;
2364 1785
2365 /* 1786 /*
2366 * This fast open can be used if the tty is already open. 1787 * This fast open can be used if the tty is already open.
@@ -2498,12 +1919,10 @@ static void release_tty(struct tty_struct *tty, int idx)
2498static void release_dev(struct file *filp) 1919static void release_dev(struct file *filp)
2499{ 1920{
2500 struct tty_struct *tty, *o_tty; 1921 struct tty_struct *tty, *o_tty;
2501 struct tty_ldisc ld;
2502 int pty_master, tty_closing, o_tty_closing, do_sleep; 1922 int pty_master, tty_closing, o_tty_closing, do_sleep;
2503 int devpts; 1923 int devpts;
2504 int idx; 1924 int idx;
2505 char buf[64]; 1925 char buf[64];
2506 unsigned long flags;
2507 1926
2508 tty = (struct tty_struct *)filp->private_data; 1927 tty = (struct tty_struct *)filp->private_data;
2509 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, 1928 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode,
@@ -2705,56 +2124,9 @@ static void release_dev(struct file *filp)
2705 printk(KERN_DEBUG "freeing tty structure..."); 2124 printk(KERN_DEBUG "freeing tty structure...");
2706#endif 2125#endif
2707 /* 2126 /*
2708 * Prevent flush_to_ldisc() from rescheduling the work for later. Then 2127 * Ask the line discipline code to release its structures
2709 * kill any delayed work. As this is the final close it does not
2710 * race with the set_ldisc code path.
2711 */ 2128 */
2712 clear_bit(TTY_LDISC, &tty->flags); 2129 tty_ldisc_release(tty, o_tty);
2713 cancel_delayed_work(&tty->buf.work);
2714
2715 /*
2716 * Wait for ->hangup_work and ->buf.work handlers to terminate
2717 */
2718
2719 flush_scheduled_work();
2720
2721 /*
2722 * Wait for any short term users (we know they are just driver
2723 * side waiters as the file is closing so user count on the file
2724 * side is zero.
2725 */
2726 spin_lock_irqsave(&tty_ldisc_lock, flags);
2727 while (tty->ldisc.refcount) {
2728 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
2729 wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
2730 spin_lock_irqsave(&tty_ldisc_lock, flags);
2731 }
2732 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
2733 /*
2734 * Shutdown the current line discipline, and reset it to N_TTY.
2735 *
2736 * FIXME: this MUST get fixed for the new reflocking
2737 */
2738 if (tty->ldisc.ops->close)
2739 (tty->ldisc.ops->close)(tty);
2740 tty_ldisc_put(tty->ldisc.ops);
2741
2742 /*
2743 * Switch the line discipline back
2744 */
2745 WARN_ON(tty_ldisc_get(N_TTY, &ld));
2746 tty_ldisc_assign(tty, &ld);
2747 tty_set_termios_ldisc(tty, N_TTY);
2748 if (o_tty) {
2749 /* FIXME: could o_tty be in setldisc here ? */
2750 clear_bit(TTY_LDISC, &o_tty->flags);
2751 if (o_tty->ldisc.ops->close)
2752 (o_tty->ldisc.ops->close)(o_tty);
2753 tty_ldisc_put(o_tty->ldisc.ops);
2754 WARN_ON(tty_ldisc_get(N_TTY, &ld));
2755 tty_ldisc_assign(o_tty, &ld);
2756 tty_set_termios_ldisc(o_tty, N_TTY);
2757 }
2758 /* 2130 /*
2759 * The release_tty function takes care of the details of clearing 2131 * The release_tty function takes care of the details of clearing
2760 * the slots and preserving the termios structure. 2132 * the slots and preserving the termios structure.
@@ -3464,16 +2836,29 @@ static int tiocsetd(struct tty_struct *tty, int __user *p)
3464 2836
3465static int send_break(struct tty_struct *tty, unsigned int duration) 2837static int send_break(struct tty_struct *tty, unsigned int duration)
3466{ 2838{
3467 if (tty_write_lock(tty, 0) < 0) 2839 int retval;
3468 return -EINTR; 2840
3469 tty->ops->break_ctl(tty, -1); 2841 if (tty->ops->break_ctl == NULL)
3470 if (!signal_pending(current)) 2842 return 0;
3471 msleep_interruptible(duration); 2843
3472 tty->ops->break_ctl(tty, 0); 2844 if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK)
3473 tty_write_unlock(tty); 2845 retval = tty->ops->break_ctl(tty, duration);
3474 if (signal_pending(current)) 2846 else {
3475 return -EINTR; 2847 /* Do the work ourselves */
3476 return 0; 2848 if (tty_write_lock(tty, 0) < 0)
2849 return -EINTR;
2850 retval = tty->ops->break_ctl(tty, -1);
2851 if (retval)
2852 goto out;
2853 if (!signal_pending(current))
2854 msleep_interruptible(duration);
2855 retval = tty->ops->break_ctl(tty, 0);
2856out:
2857 tty_write_unlock(tty);
2858 if (signal_pending(current))
2859 retval = -EINTR;
2860 }
2861 return retval;
3477} 2862}
3478 2863
3479/** 2864/**
@@ -3564,36 +2949,6 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
3564 tty->driver->subtype == PTY_TYPE_MASTER) 2949 tty->driver->subtype == PTY_TYPE_MASTER)
3565 real_tty = tty->link; 2950 real_tty = tty->link;
3566 2951
3567 /*
3568 * Break handling by driver
3569 */
3570
3571 retval = -EINVAL;
3572
3573 if (!tty->ops->break_ctl) {
3574 switch (cmd) {
3575 case TIOCSBRK:
3576 case TIOCCBRK:
3577 if (tty->ops->ioctl)
3578 retval = tty->ops->ioctl(tty, file, cmd, arg);
3579 if (retval != -EINVAL && retval != -ENOIOCTLCMD)
3580 printk(KERN_WARNING "tty: driver %s needs updating to use break_ctl\n", tty->driver->name);
3581 return retval;
3582
3583 /* These two ioctl's always return success; even if */
3584 /* the driver doesn't support them. */
3585 case TCSBRK:
3586 case TCSBRKP:
3587 if (!tty->ops->ioctl)
3588 return 0;
3589 retval = tty->ops->ioctl(tty, file, cmd, arg);
3590 if (retval != -EINVAL && retval != -ENOIOCTLCMD)
3591 printk(KERN_WARNING "tty: driver %s needs updating to use break_ctl\n", tty->driver->name);
3592 if (retval == -ENOIOCTLCMD)
3593 retval = 0;
3594 return retval;
3595 }
3596 }
3597 2952
3598 /* 2953 /*
3599 * Factor out some common prep work 2954 * Factor out some common prep work
@@ -3615,6 +2970,9 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
3615 break; 2970 break;
3616 } 2971 }
3617 2972
2973 /*
2974 * Now do the stuff.
2975 */
3618 switch (cmd) { 2976 switch (cmd) {
3619 case TIOCSTI: 2977 case TIOCSTI:
3620 return tiocsti(tty, p); 2978 return tiocsti(tty, p);
@@ -3658,12 +3016,11 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
3658 */ 3016 */
3659 case TIOCSBRK: /* Turn break on, unconditionally */ 3017 case TIOCSBRK: /* Turn break on, unconditionally */
3660 if (tty->ops->break_ctl) 3018 if (tty->ops->break_ctl)
3661 tty->ops->break_ctl(tty, -1); 3019 return tty->ops->break_ctl(tty, -1);
3662 return 0; 3020 return 0;
3663
3664 case TIOCCBRK: /* Turn break off, unconditionally */ 3021 case TIOCCBRK: /* Turn break off, unconditionally */
3665 if (tty->ops->break_ctl) 3022 if (tty->ops->break_ctl)
3666 tty->ops->break_ctl(tty, 0); 3023 return tty->ops->break_ctl(tty, 0);
3667 return 0; 3024 return 0;
3668 case TCSBRK: /* SVID version: non-zero arg --> no break */ 3025 case TCSBRK: /* SVID version: non-zero arg --> no break */
3669 /* non-zero arg means wait for all output data 3026 /* non-zero arg means wait for all output data
@@ -3962,12 +3319,9 @@ EXPORT_SYMBOL(tty_flip_buffer_push);
3962 3319
3963static void initialize_tty_struct(struct tty_struct *tty) 3320static void initialize_tty_struct(struct tty_struct *tty)
3964{ 3321{
3965 struct tty_ldisc ld;
3966 memset(tty, 0, sizeof(struct tty_struct)); 3322 memset(tty, 0, sizeof(struct tty_struct));
3967 tty->magic = TTY_MAGIC; 3323 tty->magic = TTY_MAGIC;
3968 if (tty_ldisc_get(N_TTY, &ld) < 0) 3324 tty_ldisc_init(tty);
3969 panic("n_tty: init_tty");
3970 tty_ldisc_assign(tty, &ld);
3971 tty->session = NULL; 3325 tty->session = NULL;
3972 tty->pgrp = NULL; 3326 tty->pgrp = NULL;
3973 tty->overrun_time = jiffies; 3327 tty->overrun_time = jiffies;
@@ -4045,7 +3399,7 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,
4045 else 3399 else
4046 tty_line_name(driver, index, name); 3400 tty_line_name(driver, index, name);
4047 3401
4048 return device_create(tty_class, device, dev, name); 3402 return device_create_drvdata(tty_class, device, dev, NULL, name);
4049} 3403}
4050 3404
4051/** 3405/**
@@ -4280,7 +3634,7 @@ void __init console_init(void)
4280 initcall_t *call; 3634 initcall_t *call;
4281 3635
4282 /* Setup the default TTY line discipline. */ 3636 /* Setup the default TTY line discipline. */
4283 (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY); 3637 tty_ldisc_begin();
4284 3638
4285 /* 3639 /*
4286 * set up the console device so that later boot sequences can 3640 * set up the console device so that later boot sequences can
@@ -4323,20 +3677,22 @@ static int __init tty_init(void)
4323 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) || 3677 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
4324 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0) 3678 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
4325 panic("Couldn't register /dev/tty driver\n"); 3679 panic("Couldn't register /dev/tty driver\n");
4326 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), "tty"); 3680 device_create_drvdata(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL,
3681 "tty");
4327 3682
4328 cdev_init(&console_cdev, &console_fops); 3683 cdev_init(&console_cdev, &console_fops);
4329 if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) || 3684 if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
4330 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0) 3685 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
4331 panic("Couldn't register /dev/console driver\n"); 3686 panic("Couldn't register /dev/console driver\n");
4332 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), "console"); 3687 device_create_drvdata(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL,
3688 "console");
4333 3689
4334#ifdef CONFIG_UNIX98_PTYS 3690#ifdef CONFIG_UNIX98_PTYS
4335 cdev_init(&ptmx_cdev, &ptmx_fops); 3691 cdev_init(&ptmx_cdev, &ptmx_fops);
4336 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || 3692 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
4337 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) 3693 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
4338 panic("Couldn't register /dev/ptmx driver\n"); 3694 panic("Couldn't register /dev/ptmx driver\n");
4339 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), "ptmx"); 3695 device_create_drvdata(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
4340#endif 3696#endif
4341 3697
4342#ifdef CONFIG_VT 3698#ifdef CONFIG_VT
@@ -4344,7 +3700,7 @@ static int __init tty_init(void)
4344 if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) || 3700 if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
4345 register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0) 3701 register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
4346 panic("Couldn't register /dev/tty0 driver\n"); 3702 panic("Couldn't register /dev/tty0 driver\n");
4347 device_create(tty_class, NULL, MKDEV(TTY_MAJOR, 0), "tty0"); 3703 device_create_drvdata(tty_class, NULL, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
4348 3704
4349 vty_init(); 3705 vty_init();
4350#endif 3706#endif
diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c
new file mode 100644
index 000000000000..241cbdea65ab
--- /dev/null
+++ b/drivers/char/tty_ldisc.c
@@ -0,0 +1,714 @@
1#include <linux/types.h>
2#include <linux/major.h>
3#include <linux/errno.h>
4#include <linux/signal.h>
5#include <linux/fcntl.h>
6#include <linux/sched.h>
7#include <linux/interrupt.h>
8#include <linux/tty.h>
9#include <linux/tty_driver.h>
10#include <linux/tty_flip.h>
11#include <linux/devpts_fs.h>
12#include <linux/file.h>
13#include <linux/fdtable.h>
14#include <linux/console.h>
15#include <linux/timer.h>
16#include <linux/ctype.h>
17#include <linux/kd.h>
18#include <linux/mm.h>
19#include <linux/string.h>
20#include <linux/slab.h>
21#include <linux/poll.h>
22#include <linux/proc_fs.h>
23#include <linux/init.h>
24#include <linux/module.h>
25#include <linux/smp_lock.h>
26#include <linux/device.h>
27#include <linux/wait.h>
28#include <linux/bitops.h>
29#include <linux/delay.h>
30#include <linux/seq_file.h>
31
32#include <linux/uaccess.h>
33#include <asm/system.h>
34
35#include <linux/kbd_kern.h>
36#include <linux/vt_kern.h>
37#include <linux/selection.h>
38
39#include <linux/kmod.h>
40#include <linux/nsproxy.h>
41
42/*
43 * This guards the refcounted line discipline lists. The lock
44 * must be taken with irqs off because there are hangup path
45 * callers who will do ldisc lookups and cannot sleep.
46 */
47
48static DEFINE_SPINLOCK(tty_ldisc_lock);
49static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
50/* Line disc dispatch table */
51static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
52
53/**
54 * tty_register_ldisc - install a line discipline
55 * @disc: ldisc number
56 * @new_ldisc: pointer to the ldisc object
57 *
58 * Installs a new line discipline into the kernel. The discipline
59 * is set up as unreferenced and then made available to the kernel
60 * from this point onwards.
61 *
62 * Locking:
63 * takes tty_ldisc_lock to guard against ldisc races
64 */
65
66int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
67{
68 unsigned long flags;
69 int ret = 0;
70
71 if (disc < N_TTY || disc >= NR_LDISCS)
72 return -EINVAL;
73
74 spin_lock_irqsave(&tty_ldisc_lock, flags);
75 tty_ldiscs[disc] = new_ldisc;
76 new_ldisc->num = disc;
77 new_ldisc->refcount = 0;
78 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
79
80 return ret;
81}
82EXPORT_SYMBOL(tty_register_ldisc);
83
84/**
85 * tty_unregister_ldisc - unload a line discipline
86 * @disc: ldisc number
87 * @new_ldisc: pointer to the ldisc object
88 *
89 * Remove a line discipline from the kernel providing it is not
90 * currently in use.
91 *
92 * Locking:
93 * takes tty_ldisc_lock to guard against ldisc races
94 */
95
96int tty_unregister_ldisc(int disc)
97{
98 unsigned long flags;
99 int ret = 0;
100
101 if (disc < N_TTY || disc >= NR_LDISCS)
102 return -EINVAL;
103
104 spin_lock_irqsave(&tty_ldisc_lock, flags);
105 if (tty_ldiscs[disc]->refcount)
106 ret = -EBUSY;
107 else
108 tty_ldiscs[disc] = NULL;
109 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
110
111 return ret;
112}
113EXPORT_SYMBOL(tty_unregister_ldisc);
114
115
116/**
117 * tty_ldisc_try_get - try and reference an ldisc
118 * @disc: ldisc number
119 * @ld: tty ldisc structure to complete
120 *
121 * Attempt to open and lock a line discipline into place. Return
122 * the line discipline refcounted and assigned in ld. On an error
123 * report the error code back
124 */
125
126static int tty_ldisc_try_get(int disc, struct tty_ldisc *ld)
127{
128 unsigned long flags;
129 struct tty_ldisc_ops *ldops;
130 int err = -EINVAL;
131
132 spin_lock_irqsave(&tty_ldisc_lock, flags);
133 ld->ops = NULL;
134 ldops = tty_ldiscs[disc];
135 /* Check the entry is defined */
136 if (ldops) {
137 /* If the module is being unloaded we can't use it */
138 if (!try_module_get(ldops->owner))
139 err = -EAGAIN;
140 else {
141 /* lock it */
142 ldops->refcount++;
143 ld->ops = ldops;
144 err = 0;
145 }
146 }
147 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
148 return err;
149}
150
151/**
152 * tty_ldisc_get - take a reference to an ldisc
153 * @disc: ldisc number
154 * @ld: tty line discipline structure to use
155 *
156 * Takes a reference to a line discipline. Deals with refcounts and
157 * module locking counts. Returns NULL if the discipline is not available.
158 * Returns a pointer to the discipline and bumps the ref count if it is
159 * available
160 *
161 * Locking:
162 * takes tty_ldisc_lock to guard against ldisc races
163 */
164
165static int tty_ldisc_get(int disc, struct tty_ldisc *ld)
166{
167 int err;
168
169 if (disc < N_TTY || disc >= NR_LDISCS)
170 return -EINVAL;
171 err = tty_ldisc_try_get(disc, ld);
172 if (err == -EAGAIN) {
173 request_module("tty-ldisc-%d", disc);
174 err = tty_ldisc_try_get(disc, ld);
175 }
176 return err;
177}
178
179/**
180 * tty_ldisc_put - drop ldisc reference
181 * @disc: ldisc number
182 *
183 * Drop a reference to a line discipline. Manage refcounts and
184 * module usage counts
185 *
186 * Locking:
187 * takes tty_ldisc_lock to guard against ldisc races
188 */
189
190static void tty_ldisc_put(struct tty_ldisc_ops *ld)
191{
192 unsigned long flags;
193 int disc = ld->num;
194
195 BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
196
197 spin_lock_irqsave(&tty_ldisc_lock, flags);
198 ld = tty_ldiscs[disc];
199 BUG_ON(ld->refcount == 0);
200 ld->refcount--;
201 module_put(ld->owner);
202 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
203}
204
205static void * tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
206{
207 return (*pos < NR_LDISCS) ? pos : NULL;
208}
209
210static void * tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
211{
212 (*pos)++;
213 return (*pos < NR_LDISCS) ? pos : NULL;
214}
215
216static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
217{
218}
219
220static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
221{
222 int i = *(loff_t *)v;
223 struct tty_ldisc ld;
224
225 if (tty_ldisc_get(i, &ld) < 0)
226 return 0;
227 seq_printf(m, "%-10s %2d\n", ld.ops->name ? ld.ops->name : "???", i);
228 tty_ldisc_put(ld.ops);
229 return 0;
230}
231
232static const struct seq_operations tty_ldiscs_seq_ops = {
233 .start = tty_ldiscs_seq_start,
234 .next = tty_ldiscs_seq_next,
235 .stop = tty_ldiscs_seq_stop,
236 .show = tty_ldiscs_seq_show,
237};
238
239static int proc_tty_ldiscs_open(struct inode *inode, struct file *file)
240{
241 return seq_open(file, &tty_ldiscs_seq_ops);
242}
243
244const struct file_operations tty_ldiscs_proc_fops = {
245 .owner = THIS_MODULE,
246 .open = proc_tty_ldiscs_open,
247 .read = seq_read,
248 .llseek = seq_lseek,
249 .release = seq_release,
250};
251
252/**
253 * tty_ldisc_assign - set ldisc on a tty
254 * @tty: tty to assign
255 * @ld: line discipline
256 *
257 * Install an instance of a line discipline into a tty structure. The
258 * ldisc must have a reference count above zero to ensure it remains/
259 * The tty instance refcount starts at zero.
260 *
261 * Locking:
262 * Caller must hold references
263 */
264
265static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
266{
267 ld->refcount = 0;
268 tty->ldisc = *ld;
269}
270
271/**
272 * tty_ldisc_try - internal helper
273 * @tty: the tty
274 *
275 * Make a single attempt to grab and bump the refcount on
276 * the tty ldisc. Return 0 on failure or 1 on success. This is
277 * used to implement both the waiting and non waiting versions
278 * of tty_ldisc_ref
279 *
280 * Locking: takes tty_ldisc_lock
281 */
282
283static int tty_ldisc_try(struct tty_struct *tty)
284{
285 unsigned long flags;
286 struct tty_ldisc *ld;
287 int ret = 0;
288
289 spin_lock_irqsave(&tty_ldisc_lock, flags);
290 ld = &tty->ldisc;
291 if (test_bit(TTY_LDISC, &tty->flags)) {
292 ld->refcount++;
293 ret = 1;
294 }
295 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
296 return ret;
297}
298
299/**
300 * tty_ldisc_ref_wait - wait for the tty ldisc
301 * @tty: tty device
302 *
303 * Dereference the line discipline for the terminal and take a
304 * reference to it. If the line discipline is in flux then
305 * wait patiently until it changes.
306 *
307 * Note: Must not be called from an IRQ/timer context. The caller
308 * must also be careful not to hold other locks that will deadlock
309 * against a discipline change, such as an existing ldisc reference
310 * (which we check for)
311 *
312 * Locking: call functions take tty_ldisc_lock
313 */
314
315struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
316{
317 /* wait_event is a macro */
318 wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
319 if (tty->ldisc.refcount == 0)
320 printk(KERN_ERR "tty_ldisc_ref_wait\n");
321 return &tty->ldisc;
322}
323
324EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
325
326/**
327 * tty_ldisc_ref - get the tty ldisc
328 * @tty: tty device
329 *
330 * Dereference the line discipline for the terminal and take a
331 * reference to it. If the line discipline is in flux then
332 * return NULL. Can be called from IRQ and timer functions.
333 *
334 * Locking: called functions take tty_ldisc_lock
335 */
336
337struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
338{
339 if (tty_ldisc_try(tty))
340 return &tty->ldisc;
341 return NULL;
342}
343
344EXPORT_SYMBOL_GPL(tty_ldisc_ref);
345
346/**
347 * tty_ldisc_deref - free a tty ldisc reference
348 * @ld: reference to free up
349 *
350 * Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
351 * be called in IRQ context.
352 *
353 * Locking: takes tty_ldisc_lock
354 */
355
356void tty_ldisc_deref(struct tty_ldisc *ld)
357{
358 unsigned long flags;
359
360 BUG_ON(ld == NULL);
361
362 spin_lock_irqsave(&tty_ldisc_lock, flags);
363 if (ld->refcount == 0)
364 printk(KERN_ERR "tty_ldisc_deref: no references.\n");
365 else
366 ld->refcount--;
367 if (ld->refcount == 0)
368 wake_up(&tty_ldisc_wait);
369 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
370}
371
372EXPORT_SYMBOL_GPL(tty_ldisc_deref);
373
374/**
375 * tty_ldisc_enable - allow ldisc use
376 * @tty: terminal to activate ldisc on
377 *
378 * Set the TTY_LDISC flag when the line discipline can be called
379 * again. Do necessary wakeups for existing sleepers.
380 *
381 * Note: nobody should set this bit except via this function. Clearing
382 * directly is allowed.
383 */
384
385void tty_ldisc_enable(struct tty_struct *tty)
386{
387 set_bit(TTY_LDISC, &tty->flags);
388 wake_up(&tty_ldisc_wait);
389}
390
391/**
392 * tty_set_termios_ldisc - set ldisc field
393 * @tty: tty structure
394 * @num: line discipline number
395 *
396 * This is probably overkill for real world processors but
397 * they are not on hot paths so a little discipline won't do
398 * any harm.
399 *
400 * Locking: takes termios_mutex
401 */
402
403static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
404{
405 mutex_lock(&tty->termios_mutex);
406 tty->termios->c_line = num;
407 mutex_unlock(&tty->termios_mutex);
408}
409
410
411/**
412 * tty_ldisc_restore - helper for tty ldisc change
413 * @tty: tty to recover
414 * @old: previous ldisc
415 *
416 * Restore the previous line discipline or N_TTY when a line discipline
417 * change fails due to an open error
418 */
419
420static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
421{
422 char buf[64];
423 struct tty_ldisc new_ldisc;
424
425 /* There is an outstanding reference here so this is safe */
426 tty_ldisc_get(old->ops->num, old);
427 tty_ldisc_assign(tty, old);
428 tty_set_termios_ldisc(tty, old->ops->num);
429 if (old->ops->open && (old->ops->open(tty) < 0)) {
430 tty_ldisc_put(old->ops);
431 /* This driver is always present */
432 if (tty_ldisc_get(N_TTY, &new_ldisc) < 0)
433 panic("n_tty: get");
434 tty_ldisc_assign(tty, &new_ldisc);
435 tty_set_termios_ldisc(tty, N_TTY);
436 if (new_ldisc.ops->open) {
437 int r = new_ldisc.ops->open(tty);
438 if (r < 0)
439 panic("Couldn't open N_TTY ldisc for "
440 "%s --- error %d.",
441 tty_name(tty, buf), r);
442 }
443 }
444}
445
446/**
447 * tty_set_ldisc - set line discipline
448 * @tty: the terminal to set
449 * @ldisc: the line discipline
450 *
451 * Set the discipline of a tty line. Must be called from a process
452 * context.
453 *
454 * Locking: takes tty_ldisc_lock.
455 * called functions take termios_mutex
456 */
457
458int tty_set_ldisc(struct tty_struct *tty, int ldisc)
459{
460 int retval;
461 struct tty_ldisc o_ldisc, new_ldisc;
462 int work;
463 unsigned long flags;
464 struct tty_struct *o_tty;
465
466restart:
467 /* This is a bit ugly for now but means we can break the 'ldisc
468 is part of the tty struct' assumption later */
469 retval = tty_ldisc_get(ldisc, &new_ldisc);
470 if (retval)
471 return retval;
472
473 /*
474 * Problem: What do we do if this blocks ?
475 */
476
477 tty_wait_until_sent(tty, 0);
478
479 if (tty->ldisc.ops->num == ldisc) {
480 tty_ldisc_put(new_ldisc.ops);
481 return 0;
482 }
483
484 /*
485 * No more input please, we are switching. The new ldisc
486 * will update this value in the ldisc open function
487 */
488
489 tty->receive_room = 0;
490
491 o_ldisc = tty->ldisc;
492 o_tty = tty->link;
493
494 /*
495 * Make sure we don't change while someone holds a
496 * reference to the line discipline. The TTY_LDISC bit
497 * prevents anyone taking a reference once it is clear.
498 * We need the lock to avoid racing reference takers.
499 */
500
501 spin_lock_irqsave(&tty_ldisc_lock, flags);
502 if (tty->ldisc.refcount || (o_tty && o_tty->ldisc.refcount)) {
503 if (tty->ldisc.refcount) {
504 /* Free the new ldisc we grabbed. Must drop the lock
505 first. */
506 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
507 tty_ldisc_put(o_ldisc.ops);
508 /*
509 * There are several reasons we may be busy, including
510 * random momentary I/O traffic. We must therefore
511 * retry. We could distinguish between blocking ops
512 * and retries if we made tty_ldisc_wait() smarter.
513 * That is up for discussion.
514 */
515 if (wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
516 return -ERESTARTSYS;
517 goto restart;
518 }
519 if (o_tty && o_tty->ldisc.refcount) {
520 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
521 tty_ldisc_put(o_tty->ldisc.ops);
522 if (wait_event_interruptible(tty_ldisc_wait, o_tty->ldisc.refcount == 0) < 0)
523 return -ERESTARTSYS;
524 goto restart;
525 }
526 }
527 /*
528 * If the TTY_LDISC bit is set, then we are racing against
529 * another ldisc change
530 */
531 if (!test_bit(TTY_LDISC, &tty->flags)) {
532 struct tty_ldisc *ld;
533 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
534 tty_ldisc_put(new_ldisc.ops);
535 ld = tty_ldisc_ref_wait(tty);
536 tty_ldisc_deref(ld);
537 goto restart;
538 }
539
540 clear_bit(TTY_LDISC, &tty->flags);
541 if (o_tty)
542 clear_bit(TTY_LDISC, &o_tty->flags);
543 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
544
545 /*
546 * From this point on we know nobody has an ldisc
547 * usage reference, nor can they obtain one until
548 * we say so later on.
549 */
550
551 work = cancel_delayed_work(&tty->buf.work);
552 /*
553 * Wait for ->hangup_work and ->buf.work handlers to terminate
554 * MUST NOT hold locks here.
555 */
556 flush_scheduled_work();
557 /* Shutdown the current discipline. */
558 if (o_ldisc.ops->close)
559 (o_ldisc.ops->close)(tty);
560
561 /* Now set up the new line discipline. */
562 tty_ldisc_assign(tty, &new_ldisc);
563 tty_set_termios_ldisc(tty, ldisc);
564 if (new_ldisc.ops->open)
565 retval = (new_ldisc.ops->open)(tty);
566 if (retval < 0) {
567 tty_ldisc_put(new_ldisc.ops);
568 tty_ldisc_restore(tty, &o_ldisc);
569 }
570 /* At this point we hold a reference to the new ldisc and a
571 a reference to the old ldisc. If we ended up flipping back
572 to the existing ldisc we have two references to it */
573
574 if (tty->ldisc.ops->num != o_ldisc.ops->num && tty->ops->set_ldisc)
575 tty->ops->set_ldisc(tty);
576
577 tty_ldisc_put(o_ldisc.ops);
578
579 /*
580 * Allow ldisc referencing to occur as soon as the driver
581 * ldisc callback completes.
582 */
583
584 tty_ldisc_enable(tty);
585 if (o_tty)
586 tty_ldisc_enable(o_tty);
587
588 /* Restart it in case no characters kick it off. Safe if
589 already running */
590 if (work)
591 schedule_delayed_work(&tty->buf.work, 1);
592 return retval;
593}
594
595
596/**
597 * tty_ldisc_setup - open line discipline
598 * @tty: tty being shut down
599 * @o_tty: pair tty for pty/tty pairs
600 *
601 * Called during the initial open of a tty/pty pair in order to set up the
602 * line discplines and bind them to the tty.
603 */
604
605int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
606{
607 struct tty_ldisc *ld = &tty->ldisc;
608 int retval;
609
610 if (ld->ops->open) {
611 retval = (ld->ops->open)(tty);
612 if (retval)
613 return retval;
614 }
615 if (o_tty && o_tty->ldisc.ops->open) {
616 retval = (o_tty->ldisc.ops->open)(o_tty);
617 if (retval) {
618 if (ld->ops->close)
619 (ld->ops->close)(tty);
620 return retval;
621 }
622 tty_ldisc_enable(o_tty);
623 }
624 tty_ldisc_enable(tty);
625 return 0;
626}
627
628/**
629 * tty_ldisc_release - release line discipline
630 * @tty: tty being shut down
631 * @o_tty: pair tty for pty/tty pairs
632 *
633 * Called during the final close of a tty/pty pair in order to shut down the
634 * line discpline layer.
635 */
636
637void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
638{
639 unsigned long flags;
640 struct tty_ldisc ld;
641 /*
642 * Prevent flush_to_ldisc() from rescheduling the work for later. Then
643 * kill any delayed work. As this is the final close it does not
644 * race with the set_ldisc code path.
645 */
646 clear_bit(TTY_LDISC, &tty->flags);
647 cancel_delayed_work(&tty->buf.work);
648
649 /*
650 * Wait for ->hangup_work and ->buf.work handlers to terminate
651 */
652
653 flush_scheduled_work();
654
655 /*
656 * Wait for any short term users (we know they are just driver
657 * side waiters as the file is closing so user count on the file
658 * side is zero.
659 */
660 spin_lock_irqsave(&tty_ldisc_lock, flags);
661 while (tty->ldisc.refcount) {
662 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
663 wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
664 spin_lock_irqsave(&tty_ldisc_lock, flags);
665 }
666 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
667 /*
668 * Shutdown the current line discipline, and reset it to N_TTY.
669 *
670 * FIXME: this MUST get fixed for the new reflocking
671 */
672 if (tty->ldisc.ops->close)
673 (tty->ldisc.ops->close)(tty);
674 tty_ldisc_put(tty->ldisc.ops);
675
676 /*
677 * Switch the line discipline back
678 */
679 WARN_ON(tty_ldisc_get(N_TTY, &ld));
680 tty_ldisc_assign(tty, &ld);
681 tty_set_termios_ldisc(tty, N_TTY);
682 if (o_tty) {
683 /* FIXME: could o_tty be in setldisc here ? */
684 clear_bit(TTY_LDISC, &o_tty->flags);
685 if (o_tty->ldisc.ops->close)
686 (o_tty->ldisc.ops->close)(o_tty);
687 tty_ldisc_put(o_tty->ldisc.ops);
688 WARN_ON(tty_ldisc_get(N_TTY, &ld));
689 tty_ldisc_assign(o_tty, &ld);
690 tty_set_termios_ldisc(o_tty, N_TTY);
691 }
692}
693
694/**
695 * tty_ldisc_init - ldisc setup for new tty
696 * @tty: tty being allocated
697 *
698 * Set up the line discipline objects for a newly allocated tty. Note that
699 * the tty structure is not completely set up when this call is made.
700 */
701
702void tty_ldisc_init(struct tty_struct *tty)
703{
704 struct tty_ldisc ld;
705 if (tty_ldisc_get(N_TTY, &ld) < 0)
706 panic("n_tty: init_tty");
707 tty_ldisc_assign(tty, &ld);
708}
709
710void tty_ldisc_begin(void)
711{
712 /* Setup the default TTY line discipline. */
713 (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
714}
diff --git a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c
index eebfad2777d2..c2ae52dd53d1 100644
--- a/drivers/char/vc_screen.c
+++ b/drivers/char/vc_screen.c
@@ -481,10 +481,10 @@ static struct class *vc_class;
481 481
482void vcs_make_sysfs(struct tty_struct *tty) 482void vcs_make_sysfs(struct tty_struct *tty)
483{ 483{
484 device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1), 484 device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1),
485 "vcs%u", tty->index + 1); 485 NULL, "vcs%u", tty->index + 1);
486 device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129), 486 device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129),
487 "vcsa%u", tty->index + 1); 487 NULL, "vcsa%u", tty->index + 1);
488} 488}
489 489
490void vcs_remove_sysfs(struct tty_struct *tty) 490void vcs_remove_sysfs(struct tty_struct *tty)
@@ -499,7 +499,7 @@ int __init vcs_init(void)
499 panic("unable to get major %d for vcs device", VCS_MAJOR); 499 panic("unable to get major %d for vcs device", VCS_MAJOR);
500 vc_class = class_create(THIS_MODULE, "vc"); 500 vc_class = class_create(THIS_MODULE, "vc");
501 501
502 device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 0), "vcs"); 502 device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
503 device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 128), "vcsa"); 503 device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
504 return 0; 504 return 0;
505} 505}
diff --git a/drivers/char/viotape.c b/drivers/char/viotape.c
index e5da98d8f9cd..7a70a40ad639 100644
--- a/drivers/char/viotape.c
+++ b/drivers/char/viotape.c
@@ -886,10 +886,10 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
886 state[i].cur_part = 0; 886 state[i].cur_part = 0;
887 for (j = 0; j < MAX_PARTITIONS; ++j) 887 for (j = 0; j < MAX_PARTITIONS; ++j)
888 state[i].part_stat_rwi[j] = VIOT_IDLE; 888 state[i].part_stat_rwi[j] = VIOT_IDLE;
889 device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i), 889 device_create_drvdata(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i),
890 "iseries!vt%d", i); 890 NULL, "iseries!vt%d", i);
891 device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80), 891 device_create_drvdata(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80),
892 "iseries!nvt%d", i); 892 NULL, "iseries!nvt%d", i);
893 printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries " 893 printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries "
894 "resource %10.10s type %4.4s, model %3.3s\n", 894 "resource %10.10s type %4.4s, model %3.3s\n",
895 i, viotape_unitinfo[i].rsrcname, 895 i, viotape_unitinfo[i].rsrcname,
diff --git a/drivers/char/vme_scc.c b/drivers/char/vme_scc.c
index f17ac043b551..69c5afe97f19 100644
--- a/drivers/char/vme_scc.c
+++ b/drivers/char/vme_scc.c
@@ -85,7 +85,7 @@ static irqreturn_t scc_rx_int(int irq, void *data);
85static irqreturn_t scc_stat_int(int irq, void *data); 85static irqreturn_t scc_stat_int(int irq, void *data);
86static irqreturn_t scc_spcond_int(int irq, void *data); 86static irqreturn_t scc_spcond_int(int irq, void *data);
87static void scc_setsignals(struct scc_port *port, int dtr, int rts); 87static void scc_setsignals(struct scc_port *port, int dtr, int rts);
88static void scc_break_ctl(struct tty_struct *tty, int break_state); 88static int scc_break_ctl(struct tty_struct *tty, int break_state);
89 89
90static struct tty_driver *scc_driver; 90static struct tty_driver *scc_driver;
91 91
@@ -942,7 +942,7 @@ static int scc_ioctl(struct tty_struct *tty, struct file *file,
942} 942}
943 943
944 944
945static void scc_break_ctl(struct tty_struct *tty, int break_state) 945static int scc_break_ctl(struct tty_struct *tty, int break_state)
946{ 946{
947 struct scc_port *port = (struct scc_port *)tty->driver_data; 947 struct scc_port *port = (struct scc_port *)tty->driver_data;
948 unsigned long flags; 948 unsigned long flags;
@@ -952,6 +952,7 @@ static void scc_break_ctl(struct tty_struct *tty, int break_state)
952 SCCmod(TX_CTRL_REG, ~TCR_SEND_BREAK, 952 SCCmod(TX_CTRL_REG, ~TCR_SEND_BREAK,
953 break_state ? TCR_SEND_BREAK : 0); 953 break_state ? TCR_SEND_BREAK : 0);
954 local_irq_restore(flags); 954 local_irq_restore(flags);
955 return 0;
955} 956}
956 957
957 958
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index 935f1c207a1f..cb8c90da3934 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -261,7 +261,7 @@ static void notify_update(struct vc_data *vc)
261#ifdef VT_BUF_VRAM_ONLY 261#ifdef VT_BUF_VRAM_ONLY
262#define DO_UPDATE(vc) 0 262#define DO_UPDATE(vc) 0
263#else 263#else
264#define DO_UPDATE(vc) CON_IS_VISIBLE(vc) 264#define DO_UPDATE(vc) (CON_IS_VISIBLE(vc) && !console_blanked)
265#endif 265#endif
266 266
267static inline unsigned short *screenpos(struct vc_data *vc, int offset, int viewed) 267static inline unsigned short *screenpos(struct vc_data *vc, int offset, int viewed)
@@ -2749,8 +2749,8 @@ static int con_open(struct tty_struct *tty, struct file *filp)
2749 tty->termios->c_iflag |= IUTF8; 2749 tty->termios->c_iflag |= IUTF8;
2750 else 2750 else
2751 tty->termios->c_iflag &= ~IUTF8; 2751 tty->termios->c_iflag &= ~IUTF8;
2752 release_console_sem();
2753 vcs_make_sysfs(tty); 2752 vcs_make_sysfs(tty);
2753 release_console_sem();
2754 return ret; 2754 return ret;
2755 } 2755 }
2756 } 2756 }
@@ -2775,8 +2775,8 @@ static void con_close(struct tty_struct *tty, struct file *filp)
2775 if (vc) 2775 if (vc)
2776 vc->vc_tty = NULL; 2776 vc->vc_tty = NULL;
2777 tty->driver_data = NULL; 2777 tty->driver_data = NULL;
2778 release_console_sem();
2779 vcs_remove_sysfs(tty); 2778 vcs_remove_sysfs(tty);
2779 release_console_sem();
2780 mutex_unlock(&tty_mutex); 2780 mutex_unlock(&tty_mutex);
2781 /* 2781 /*
2782 * tty_mutex is released, but we still hold BKL, so there is 2782 * tty_mutex is released, but we still hold BKL, so there is
@@ -3425,9 +3425,10 @@ int register_con_driver(const struct consw *csw, int first, int last)
3425 if (retval) 3425 if (retval)
3426 goto err; 3426 goto err;
3427 3427
3428 con_driver->dev = device_create(vtconsole_class, NULL, 3428 con_driver->dev = device_create_drvdata(vtconsole_class, NULL,
3429 MKDEV(0, con_driver->node), 3429 MKDEV(0, con_driver->node),
3430 "vtcon%i", con_driver->node); 3430 NULL, "vtcon%i",
3431 con_driver->node);
3431 3432
3432 if (IS_ERR(con_driver->dev)) { 3433 if (IS_ERR(con_driver->dev)) {
3433 printk(KERN_WARNING "Unable to create device for %s; " 3434 printk(KERN_WARNING "Unable to create device for %s; "
@@ -3535,9 +3536,10 @@ static int __init vtconsole_class_init(void)
3535 struct con_driver *con = &registered_con_driver[i]; 3536 struct con_driver *con = &registered_con_driver[i];
3536 3537
3537 if (con->con && !con->dev) { 3538 if (con->con && !con->dev) {
3538 con->dev = device_create(vtconsole_class, NULL, 3539 con->dev = device_create_drvdata(vtconsole_class, NULL,
3539 MKDEV(0, con->node), 3540 MKDEV(0, con->node),
3540 "vtcon%i", con->node); 3541 NULL, "vtcon%i",
3542 con->node);
3541 3543
3542 if (IS_ERR(con->dev)) { 3544 if (IS_ERR(con->dev)) {
3543 printk(KERN_WARNING "Unable to create " 3545 printk(KERN_WARNING "Unable to create "
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
index 1e1b81e57cdc..51966ccf4ea3 100644
--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c
+++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
@@ -658,8 +658,9 @@ static int __devinit hwicap_setup(struct device *dev, int id,
658 dev_err(dev, "cdev_add() failed\n"); 658 dev_err(dev, "cdev_add() failed\n");
659 goto failed3; 659 goto failed3;
660 } 660 }
661 /* devfs_mk_cdev(devt, S_IFCHR|S_IRUGO|S_IWUGO, DRIVER_NAME); */ 661
662 device_create(icap_class, dev, devt, "%s%d", DRIVER_NAME, id); 662 device_create_drvdata(icap_class, dev, devt, NULL,
663 "%s%d", DRIVER_NAME, id);
663 return 0; /* success */ 664 return 0; /* success */
664 665
665 failed3: 666 failed3:
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 1d41496ed2f8..8d6a3ff02672 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -38,10 +38,10 @@
38 * also protects the cpufreq_cpu_data array. 38 * also protects the cpufreq_cpu_data array.
39 */ 39 */
40static struct cpufreq_driver *cpufreq_driver; 40static struct cpufreq_driver *cpufreq_driver;
41static struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS]; 41static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
42#ifdef CONFIG_HOTPLUG_CPU 42#ifdef CONFIG_HOTPLUG_CPU
43/* This one keeps track of the previously set governor of a removed CPU */ 43/* This one keeps track of the previously set governor of a removed CPU */
44static struct cpufreq_governor *cpufreq_cpu_governor[NR_CPUS]; 44static DEFINE_PER_CPU(struct cpufreq_governor *, cpufreq_cpu_governor);
45#endif 45#endif
46static DEFINE_SPINLOCK(cpufreq_driver_lock); 46static DEFINE_SPINLOCK(cpufreq_driver_lock);
47 47
@@ -135,7 +135,7 @@ struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
135 struct cpufreq_policy *data; 135 struct cpufreq_policy *data;
136 unsigned long flags; 136 unsigned long flags;
137 137
138 if (cpu >= NR_CPUS) 138 if (cpu >= nr_cpu_ids)
139 goto err_out; 139 goto err_out;
140 140
141 /* get the cpufreq driver */ 141 /* get the cpufreq driver */
@@ -149,7 +149,7 @@ struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
149 149
150 150
151 /* get the CPU */ 151 /* get the CPU */
152 data = cpufreq_cpu_data[cpu]; 152 data = per_cpu(cpufreq_cpu_data, cpu);
153 153
154 if (!data) 154 if (!data)
155 goto err_out_put_module; 155 goto err_out_put_module;
@@ -327,7 +327,7 @@ void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)
327 dprintk("notification %u of frequency transition to %u kHz\n", 327 dprintk("notification %u of frequency transition to %u kHz\n",
328 state, freqs->new); 328 state, freqs->new);
329 329
330 policy = cpufreq_cpu_data[freqs->cpu]; 330 policy = per_cpu(cpufreq_cpu_data, freqs->cpu);
331 switch (state) { 331 switch (state) {
332 332
333 case CPUFREQ_PRECHANGE: 333 case CPUFREQ_PRECHANGE:
@@ -589,7 +589,7 @@ static ssize_t show_cpus(cpumask_t mask, char *buf)
589 ssize_t i = 0; 589 ssize_t i = 0;
590 unsigned int cpu; 590 unsigned int cpu;
591 591
592 for_each_cpu_mask(cpu, mask) { 592 for_each_cpu_mask_nr(cpu, mask) {
593 if (i) 593 if (i)
594 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " "); 594 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
595 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu); 595 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
@@ -828,14 +828,14 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
828#ifdef CONFIG_SMP 828#ifdef CONFIG_SMP
829 829
830#ifdef CONFIG_HOTPLUG_CPU 830#ifdef CONFIG_HOTPLUG_CPU
831 if (cpufreq_cpu_governor[cpu]){ 831 if (per_cpu(cpufreq_cpu_governor, cpu)) {
832 policy->governor = cpufreq_cpu_governor[cpu]; 832 policy->governor = per_cpu(cpufreq_cpu_governor, cpu);
833 dprintk("Restoring governor %s for cpu %d\n", 833 dprintk("Restoring governor %s for cpu %d\n",
834 policy->governor->name, cpu); 834 policy->governor->name, cpu);
835 } 835 }
836#endif 836#endif
837 837
838 for_each_cpu_mask(j, policy->cpus) { 838 for_each_cpu_mask_nr(j, policy->cpus) {
839 if (cpu == j) 839 if (cpu == j)
840 continue; 840 continue;
841 841
@@ -854,7 +854,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
854 854
855 spin_lock_irqsave(&cpufreq_driver_lock, flags); 855 spin_lock_irqsave(&cpufreq_driver_lock, flags);
856 managed_policy->cpus = policy->cpus; 856 managed_policy->cpus = policy->cpus;
857 cpufreq_cpu_data[cpu] = managed_policy; 857 per_cpu(cpufreq_cpu_data, cpu) = managed_policy;
858 spin_unlock_irqrestore(&cpufreq_driver_lock, flags); 858 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
859 859
860 dprintk("CPU already managed, adding link\n"); 860 dprintk("CPU already managed, adding link\n");
@@ -898,14 +898,14 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
898 } 898 }
899 899
900 spin_lock_irqsave(&cpufreq_driver_lock, flags); 900 spin_lock_irqsave(&cpufreq_driver_lock, flags);
901 for_each_cpu_mask(j, policy->cpus) { 901 for_each_cpu_mask_nr(j, policy->cpus) {
902 cpufreq_cpu_data[j] = policy; 902 per_cpu(cpufreq_cpu_data, j) = policy;
903 per_cpu(policy_cpu, j) = policy->cpu; 903 per_cpu(policy_cpu, j) = policy->cpu;
904 } 904 }
905 spin_unlock_irqrestore(&cpufreq_driver_lock, flags); 905 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
906 906
907 /* symlink affected CPUs */ 907 /* symlink affected CPUs */
908 for_each_cpu_mask(j, policy->cpus) { 908 for_each_cpu_mask_nr(j, policy->cpus) {
909 if (j == cpu) 909 if (j == cpu)
910 continue; 910 continue;
911 if (!cpu_online(j)) 911 if (!cpu_online(j))
@@ -945,8 +945,8 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
945 945
946err_out_unregister: 946err_out_unregister:
947 spin_lock_irqsave(&cpufreq_driver_lock, flags); 947 spin_lock_irqsave(&cpufreq_driver_lock, flags);
948 for_each_cpu_mask(j, policy->cpus) 948 for_each_cpu_mask_nr(j, policy->cpus)
949 cpufreq_cpu_data[j] = NULL; 949 per_cpu(cpufreq_cpu_data, j) = NULL;
950 spin_unlock_irqrestore(&cpufreq_driver_lock, flags); 950 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
951 951
952 kobject_put(&policy->kobj); 952 kobject_put(&policy->kobj);
@@ -989,7 +989,7 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
989 dprintk("unregistering CPU %u\n", cpu); 989 dprintk("unregistering CPU %u\n", cpu);
990 990
991 spin_lock_irqsave(&cpufreq_driver_lock, flags); 991 spin_lock_irqsave(&cpufreq_driver_lock, flags);
992 data = cpufreq_cpu_data[cpu]; 992 data = per_cpu(cpufreq_cpu_data, cpu);
993 993
994 if (!data) { 994 if (!data) {
995 spin_unlock_irqrestore(&cpufreq_driver_lock, flags); 995 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
@@ -997,7 +997,7 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
997 unlock_policy_rwsem_write(cpu); 997 unlock_policy_rwsem_write(cpu);
998 return -EINVAL; 998 return -EINVAL;
999 } 999 }
1000 cpufreq_cpu_data[cpu] = NULL; 1000 per_cpu(cpufreq_cpu_data, cpu) = NULL;
1001 1001
1002 1002
1003#ifdef CONFIG_SMP 1003#ifdef CONFIG_SMP
@@ -1019,31 +1019,31 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
1019#ifdef CONFIG_SMP 1019#ifdef CONFIG_SMP
1020 1020
1021#ifdef CONFIG_HOTPLUG_CPU 1021#ifdef CONFIG_HOTPLUG_CPU
1022 cpufreq_cpu_governor[cpu] = data->governor; 1022 per_cpu(cpufreq_cpu_governor, cpu) = data->governor;
1023#endif 1023#endif
1024 1024
1025 /* if we have other CPUs still registered, we need to unlink them, 1025 /* if we have other CPUs still registered, we need to unlink them,
1026 * or else wait_for_completion below will lock up. Clean the 1026 * or else wait_for_completion below will lock up. Clean the
1027 * cpufreq_cpu_data[] while holding the lock, and remove the sysfs 1027 * per_cpu(cpufreq_cpu_data) while holding the lock, and remove
1028 * links afterwards. 1028 * the sysfs links afterwards.
1029 */ 1029 */
1030 if (unlikely(cpus_weight(data->cpus) > 1)) { 1030 if (unlikely(cpus_weight(data->cpus) > 1)) {
1031 for_each_cpu_mask(j, data->cpus) { 1031 for_each_cpu_mask_nr(j, data->cpus) {
1032 if (j == cpu) 1032 if (j == cpu)
1033 continue; 1033 continue;
1034 cpufreq_cpu_data[j] = NULL; 1034 per_cpu(cpufreq_cpu_data, j) = NULL;
1035 } 1035 }
1036 } 1036 }
1037 1037
1038 spin_unlock_irqrestore(&cpufreq_driver_lock, flags); 1038 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1039 1039
1040 if (unlikely(cpus_weight(data->cpus) > 1)) { 1040 if (unlikely(cpus_weight(data->cpus) > 1)) {
1041 for_each_cpu_mask(j, data->cpus) { 1041 for_each_cpu_mask_nr(j, data->cpus) {
1042 if (j == cpu) 1042 if (j == cpu)
1043 continue; 1043 continue;
1044 dprintk("removing link for cpu %u\n", j); 1044 dprintk("removing link for cpu %u\n", j);
1045#ifdef CONFIG_HOTPLUG_CPU 1045#ifdef CONFIG_HOTPLUG_CPU
1046 cpufreq_cpu_governor[j] = data->governor; 1046 per_cpu(cpufreq_cpu_governor, j) = data->governor;
1047#endif 1047#endif
1048 cpu_sys_dev = get_cpu_sysdev(j); 1048 cpu_sys_dev = get_cpu_sysdev(j);
1049 sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq"); 1049 sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq");
@@ -1153,7 +1153,7 @@ EXPORT_SYMBOL(cpufreq_quick_get);
1153 1153
1154static unsigned int __cpufreq_get(unsigned int cpu) 1154static unsigned int __cpufreq_get(unsigned int cpu)
1155{ 1155{
1156 struct cpufreq_policy *policy = cpufreq_cpu_data[cpu]; 1156 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
1157 unsigned int ret_freq = 0; 1157 unsigned int ret_freq = 0;
1158 1158
1159 if (!cpufreq_driver->get) 1159 if (!cpufreq_driver->get)
@@ -1822,16 +1822,19 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
1822 cpufreq_driver = driver_data; 1822 cpufreq_driver = driver_data;
1823 spin_unlock_irqrestore(&cpufreq_driver_lock, flags); 1823 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1824 1824
1825 ret = sysdev_driver_register(&cpu_sysdev_class,&cpufreq_sysdev_driver); 1825 ret = sysdev_driver_register(&cpu_sysdev_class,
1826 &cpufreq_sysdev_driver);
1826 1827
1827 if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) { 1828 if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) {
1828 int i; 1829 int i;
1829 ret = -ENODEV; 1830 ret = -ENODEV;
1830 1831
1831 /* check for at least one working CPU */ 1832 /* check for at least one working CPU */
1832 for (i=0; i<NR_CPUS; i++) 1833 for (i = 0; i < nr_cpu_ids; i++)
1833 if (cpufreq_cpu_data[i]) 1834 if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) {
1834 ret = 0; 1835 ret = 0;
1836 break;
1837 }
1835 1838
1836 /* if all ->init() calls failed, unregister */ 1839 /* if all ->init() calls failed, unregister */
1837 if (ret) { 1840 if (ret) {
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index 5d3a04ba6ad2..fe565ee43757 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -497,7 +497,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
497 return rc; 497 return rc;
498 } 498 }
499 499
500 for_each_cpu_mask(j, policy->cpus) { 500 for_each_cpu_mask_nr(j, policy->cpus) {
501 struct cpu_dbs_info_s *j_dbs_info; 501 struct cpu_dbs_info_s *j_dbs_info;
502 j_dbs_info = &per_cpu(cpu_dbs_info, j); 502 j_dbs_info = &per_cpu(cpu_dbs_info, j);
503 j_dbs_info->cur_policy = policy; 503 j_dbs_info->cur_policy = policy;
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index d2af20dda382..33855cb3cf16 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -367,7 +367,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
367 367
368 /* Get Idle Time */ 368 /* Get Idle Time */
369 idle_ticks = UINT_MAX; 369 idle_ticks = UINT_MAX;
370 for_each_cpu_mask(j, policy->cpus) { 370 for_each_cpu_mask_nr(j, policy->cpus) {
371 cputime64_t total_idle_ticks; 371 cputime64_t total_idle_ticks;
372 unsigned int tmp_idle_ticks; 372 unsigned int tmp_idle_ticks;
373 struct cpu_dbs_info_s *j_dbs_info; 373 struct cpu_dbs_info_s *j_dbs_info;
@@ -521,7 +521,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
521 return rc; 521 return rc;
522 } 522 }
523 523
524 for_each_cpu_mask(j, policy->cpus) { 524 for_each_cpu_mask_nr(j, policy->cpus) {
525 struct cpu_dbs_info_s *j_dbs_info; 525 struct cpu_dbs_info_s *j_dbs_info;
526 j_dbs_info = &per_cpu(cpu_dbs_info, j); 526 j_dbs_info = &per_cpu(cpu_dbs_info, j);
527 j_dbs_info->cur_policy = policy; 527 j_dbs_info->cur_policy = policy;
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
index ae70d63a8b26..c0ff97d375d7 100644
--- a/drivers/cpufreq/cpufreq_stats.c
+++ b/drivers/cpufreq/cpufreq_stats.c
@@ -43,7 +43,7 @@ struct cpufreq_stats {
43#endif 43#endif
44}; 44};
45 45
46static struct cpufreq_stats *cpufreq_stats_table[NR_CPUS]; 46static DEFINE_PER_CPU(struct cpufreq_stats *, cpufreq_stats_table);
47 47
48struct cpufreq_stats_attribute { 48struct cpufreq_stats_attribute {
49 struct attribute attr; 49 struct attribute attr;
@@ -58,7 +58,7 @@ cpufreq_stats_update (unsigned int cpu)
58 58
59 cur_time = get_jiffies_64(); 59 cur_time = get_jiffies_64();
60 spin_lock(&cpufreq_stats_lock); 60 spin_lock(&cpufreq_stats_lock);
61 stat = cpufreq_stats_table[cpu]; 61 stat = per_cpu(cpufreq_stats_table, cpu);
62 if (stat->time_in_state) 62 if (stat->time_in_state)
63 stat->time_in_state[stat->last_index] = 63 stat->time_in_state[stat->last_index] =
64 cputime64_add(stat->time_in_state[stat->last_index], 64 cputime64_add(stat->time_in_state[stat->last_index],
@@ -71,11 +71,11 @@ cpufreq_stats_update (unsigned int cpu)
71static ssize_t 71static ssize_t
72show_total_trans(struct cpufreq_policy *policy, char *buf) 72show_total_trans(struct cpufreq_policy *policy, char *buf)
73{ 73{
74 struct cpufreq_stats *stat = cpufreq_stats_table[policy->cpu]; 74 struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, policy->cpu);
75 if (!stat) 75 if (!stat)
76 return 0; 76 return 0;
77 return sprintf(buf, "%d\n", 77 return sprintf(buf, "%d\n",
78 cpufreq_stats_table[stat->cpu]->total_trans); 78 per_cpu(cpufreq_stats_table, stat->cpu)->total_trans);
79} 79}
80 80
81static ssize_t 81static ssize_t
@@ -83,7 +83,7 @@ show_time_in_state(struct cpufreq_policy *policy, char *buf)
83{ 83{
84 ssize_t len = 0; 84 ssize_t len = 0;
85 int i; 85 int i;
86 struct cpufreq_stats *stat = cpufreq_stats_table[policy->cpu]; 86 struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, policy->cpu);
87 if (!stat) 87 if (!stat)
88 return 0; 88 return 0;
89 cpufreq_stats_update(stat->cpu); 89 cpufreq_stats_update(stat->cpu);
@@ -101,7 +101,7 @@ show_trans_table(struct cpufreq_policy *policy, char *buf)
101 ssize_t len = 0; 101 ssize_t len = 0;
102 int i, j; 102 int i, j;
103 103
104 struct cpufreq_stats *stat = cpufreq_stats_table[policy->cpu]; 104 struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, policy->cpu);
105 if (!stat) 105 if (!stat)
106 return 0; 106 return 0;
107 cpufreq_stats_update(stat->cpu); 107 cpufreq_stats_update(stat->cpu);
@@ -170,7 +170,7 @@ freq_table_get_index(struct cpufreq_stats *stat, unsigned int freq)
170 170
171static void cpufreq_stats_free_table(unsigned int cpu) 171static void cpufreq_stats_free_table(unsigned int cpu)
172{ 172{
173 struct cpufreq_stats *stat = cpufreq_stats_table[cpu]; 173 struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, cpu);
174 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); 174 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
175 if (policy && policy->cpu == cpu) 175 if (policy && policy->cpu == cpu)
176 sysfs_remove_group(&policy->kobj, &stats_attr_group); 176 sysfs_remove_group(&policy->kobj, &stats_attr_group);
@@ -178,7 +178,7 @@ static void cpufreq_stats_free_table(unsigned int cpu)
178 kfree(stat->time_in_state); 178 kfree(stat->time_in_state);
179 kfree(stat); 179 kfree(stat);
180 } 180 }
181 cpufreq_stats_table[cpu] = NULL; 181 per_cpu(cpufreq_stats_table, cpu) = NULL;
182 if (policy) 182 if (policy)
183 cpufreq_cpu_put(policy); 183 cpufreq_cpu_put(policy);
184} 184}
@@ -192,7 +192,7 @@ cpufreq_stats_create_table (struct cpufreq_policy *policy,
192 struct cpufreq_policy *data; 192 struct cpufreq_policy *data;
193 unsigned int alloc_size; 193 unsigned int alloc_size;
194 unsigned int cpu = policy->cpu; 194 unsigned int cpu = policy->cpu;
195 if (cpufreq_stats_table[cpu]) 195 if (per_cpu(cpufreq_stats_table, cpu))
196 return -EBUSY; 196 return -EBUSY;
197 if ((stat = kzalloc(sizeof(struct cpufreq_stats), GFP_KERNEL)) == NULL) 197 if ((stat = kzalloc(sizeof(struct cpufreq_stats), GFP_KERNEL)) == NULL)
198 return -ENOMEM; 198 return -ENOMEM;
@@ -207,7 +207,7 @@ cpufreq_stats_create_table (struct cpufreq_policy *policy,
207 goto error_out; 207 goto error_out;
208 208
209 stat->cpu = cpu; 209 stat->cpu = cpu;
210 cpufreq_stats_table[cpu] = stat; 210 per_cpu(cpufreq_stats_table, cpu) = stat;
211 211
212 for (i=0; table[i].frequency != CPUFREQ_TABLE_END; i++) { 212 for (i=0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
213 unsigned int freq = table[i].frequency; 213 unsigned int freq = table[i].frequency;
@@ -251,7 +251,7 @@ error_out:
251 cpufreq_cpu_put(data); 251 cpufreq_cpu_put(data);
252error_get_fail: 252error_get_fail:
253 kfree(stat); 253 kfree(stat);
254 cpufreq_stats_table[cpu] = NULL; 254 per_cpu(cpufreq_stats_table, cpu) = NULL;
255 return ret; 255 return ret;
256} 256}
257 257
@@ -284,7 +284,7 @@ cpufreq_stat_notifier_trans (struct notifier_block *nb, unsigned long val,
284 if (val != CPUFREQ_POSTCHANGE) 284 if (val != CPUFREQ_POSTCHANGE)
285 return 0; 285 return 0;
286 286
287 stat = cpufreq_stats_table[freq->cpu]; 287 stat = per_cpu(cpufreq_stats_table, freq->cpu);
288 if (!stat) 288 if (!stat)
289 return 0; 289 return 0;
290 290
diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c
index cb2ac01a41a1..32244aa7cc0c 100644
--- a/drivers/cpufreq/cpufreq_userspace.c
+++ b/drivers/cpufreq/cpufreq_userspace.c
@@ -30,16 +30,18 @@
30/** 30/**
31 * A few values needed by the userspace governor 31 * A few values needed by the userspace governor
32 */ 32 */
33static unsigned int cpu_max_freq[NR_CPUS]; 33static DEFINE_PER_CPU(unsigned int, cpu_max_freq);
34static unsigned int cpu_min_freq[NR_CPUS]; 34static DEFINE_PER_CPU(unsigned int, cpu_min_freq);
35static unsigned int cpu_cur_freq[NR_CPUS]; /* current CPU freq */ 35static DEFINE_PER_CPU(unsigned int, cpu_cur_freq); /* current CPU freq */
36static unsigned int cpu_set_freq[NR_CPUS]; /* CPU freq desired by userspace */ 36static DEFINE_PER_CPU(unsigned int, cpu_set_freq); /* CPU freq desired by
37static unsigned int cpu_is_managed[NR_CPUS]; 37 userspace */
38static DEFINE_PER_CPU(unsigned int, cpu_is_managed);
38 39
39static DEFINE_MUTEX (userspace_mutex); 40static DEFINE_MUTEX (userspace_mutex);
40static int cpus_using_userspace_governor; 41static int cpus_using_userspace_governor;
41 42
42#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg) 43#define dprintk(msg...) \
44 cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg)
43 45
44/* keep track of frequency transitions */ 46/* keep track of frequency transitions */
45static int 47static int
@@ -48,12 +50,12 @@ userspace_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
48{ 50{
49 struct cpufreq_freqs *freq = data; 51 struct cpufreq_freqs *freq = data;
50 52
51 if (!cpu_is_managed[freq->cpu]) 53 if (!per_cpu(cpu_is_managed, freq->cpu))
52 return 0; 54 return 0;
53 55
54 dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n", 56 dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n",
55 freq->cpu, freq->new); 57 freq->cpu, freq->new);
56 cpu_cur_freq[freq->cpu] = freq->new; 58 per_cpu(cpu_cur_freq, freq->cpu) = freq->new;
57 59
58 return 0; 60 return 0;
59} 61}
@@ -77,15 +79,15 @@ static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
77 dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq); 79 dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);
78 80
79 mutex_lock(&userspace_mutex); 81 mutex_lock(&userspace_mutex);
80 if (!cpu_is_managed[policy->cpu]) 82 if (!per_cpu(cpu_is_managed, policy->cpu))
81 goto err; 83 goto err;
82 84
83 cpu_set_freq[policy->cpu] = freq; 85 per_cpu(cpu_set_freq, policy->cpu) = freq;
84 86
85 if (freq < cpu_min_freq[policy->cpu]) 87 if (freq < per_cpu(cpu_min_freq, policy->cpu))
86 freq = cpu_min_freq[policy->cpu]; 88 freq = per_cpu(cpu_min_freq, policy->cpu);
87 if (freq > cpu_max_freq[policy->cpu]) 89 if (freq > per_cpu(cpu_max_freq, policy->cpu))
88 freq = cpu_max_freq[policy->cpu]; 90 freq = per_cpu(cpu_max_freq, policy->cpu);
89 91
90 /* 92 /*
91 * We're safe from concurrent calls to ->target() here 93 * We're safe from concurrent calls to ->target() here
@@ -104,7 +106,7 @@ static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
104 106
105static ssize_t show_speed(struct cpufreq_policy *policy, char *buf) 107static ssize_t show_speed(struct cpufreq_policy *policy, char *buf)
106{ 108{
107 return sprintf(buf, "%u\n", cpu_cur_freq[policy->cpu]); 109 return sprintf(buf, "%u\n", per_cpu(cpu_cur_freq, policy->cpu));
108} 110}
109 111
110static int cpufreq_governor_userspace(struct cpufreq_policy *policy, 112static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
@@ -127,12 +129,17 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
127 } 129 }
128 cpus_using_userspace_governor++; 130 cpus_using_userspace_governor++;
129 131
130 cpu_is_managed[cpu] = 1; 132 per_cpu(cpu_is_managed, cpu) = 1;
131 cpu_min_freq[cpu] = policy->min; 133 per_cpu(cpu_min_freq, cpu) = policy->min;
132 cpu_max_freq[cpu] = policy->max; 134 per_cpu(cpu_max_freq, cpu) = policy->max;
133 cpu_cur_freq[cpu] = policy->cur; 135 per_cpu(cpu_cur_freq, cpu) = policy->cur;
134 cpu_set_freq[cpu] = policy->cur; 136 per_cpu(cpu_set_freq, cpu) = policy->cur;
135 dprintk("managing cpu %u started (%u - %u kHz, currently %u kHz)\n", cpu, cpu_min_freq[cpu], cpu_max_freq[cpu], cpu_cur_freq[cpu]); 137 dprintk("managing cpu %u started "
138 "(%u - %u kHz, currently %u kHz)\n",
139 cpu,
140 per_cpu(cpu_min_freq, cpu),
141 per_cpu(cpu_max_freq, cpu),
142 per_cpu(cpu_cur_freq, cpu));
136 143
137 mutex_unlock(&userspace_mutex); 144 mutex_unlock(&userspace_mutex);
138 break; 145 break;
@@ -145,34 +152,34 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
145 CPUFREQ_TRANSITION_NOTIFIER); 152 CPUFREQ_TRANSITION_NOTIFIER);
146 } 153 }
147 154
148 cpu_is_managed[cpu] = 0; 155 per_cpu(cpu_is_managed, cpu) = 0;
149 cpu_min_freq[cpu] = 0; 156 per_cpu(cpu_min_freq, cpu) = 0;
150 cpu_max_freq[cpu] = 0; 157 per_cpu(cpu_max_freq, cpu) = 0;
151 cpu_set_freq[cpu] = 0; 158 per_cpu(cpu_set_freq, cpu) = 0;
152 dprintk("managing cpu %u stopped\n", cpu); 159 dprintk("managing cpu %u stopped\n", cpu);
153 mutex_unlock(&userspace_mutex); 160 mutex_unlock(&userspace_mutex);
154 break; 161 break;
155 case CPUFREQ_GOV_LIMITS: 162 case CPUFREQ_GOV_LIMITS:
156 mutex_lock(&userspace_mutex); 163 mutex_lock(&userspace_mutex);
157 dprintk("limit event for cpu %u: %u - %u kHz," 164 dprintk("limit event for cpu %u: %u - %u kHz, "
158 "currently %u kHz, last set to %u kHz\n", 165 "currently %u kHz, last set to %u kHz\n",
159 cpu, policy->min, policy->max, 166 cpu, policy->min, policy->max,
160 cpu_cur_freq[cpu], cpu_set_freq[cpu]); 167 per_cpu(cpu_cur_freq, cpu),
161 if (policy->max < cpu_set_freq[cpu]) { 168 per_cpu(cpu_set_freq, cpu));
169 if (policy->max < per_cpu(cpu_set_freq, cpu)) {
162 __cpufreq_driver_target(policy, policy->max, 170 __cpufreq_driver_target(policy, policy->max,
163 CPUFREQ_RELATION_H); 171 CPUFREQ_RELATION_H);
164 } 172 } else if (policy->min > per_cpu(cpu_set_freq, cpu)) {
165 else if (policy->min > cpu_set_freq[cpu]) {
166 __cpufreq_driver_target(policy, policy->min, 173 __cpufreq_driver_target(policy, policy->min,
167 CPUFREQ_RELATION_L); 174 CPUFREQ_RELATION_L);
168 } 175 } else {
169 else { 176 __cpufreq_driver_target(policy,
170 __cpufreq_driver_target(policy, cpu_set_freq[cpu], 177 per_cpu(cpu_set_freq, cpu),
171 CPUFREQ_RELATION_L); 178 CPUFREQ_RELATION_L);
172 } 179 }
173 cpu_min_freq[cpu] = policy->min; 180 per_cpu(cpu_min_freq, cpu) = policy->min;
174 cpu_max_freq[cpu] = policy->max; 181 per_cpu(cpu_max_freq, cpu) = policy->max;
175 cpu_cur_freq[cpu] = policy->cur; 182 per_cpu(cpu_cur_freq, cpu) = policy->cur;
176 mutex_unlock(&userspace_mutex); 183 mutex_unlock(&userspace_mutex);
177 break; 184 break;
178 } 185 }
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index b64c6bc445e3..9071d80fbba2 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -174,7 +174,7 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
174} 174}
175EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target); 175EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target);
176 176
177static struct cpufreq_frequency_table *show_table[NR_CPUS]; 177static DEFINE_PER_CPU(struct cpufreq_frequency_table *, show_table);
178/** 178/**
179 * show_available_freqs - show available frequencies for the specified CPU 179 * show_available_freqs - show available frequencies for the specified CPU
180 */ 180 */
@@ -185,10 +185,10 @@ static ssize_t show_available_freqs (struct cpufreq_policy *policy, char *buf)
185 ssize_t count = 0; 185 ssize_t count = 0;
186 struct cpufreq_frequency_table *table; 186 struct cpufreq_frequency_table *table;
187 187
188 if (!show_table[cpu]) 188 if (!per_cpu(show_table, cpu))
189 return -ENODEV; 189 return -ENODEV;
190 190
191 table = show_table[cpu]; 191 table = per_cpu(show_table, cpu);
192 192
193 for (i=0; (table[i].frequency != CPUFREQ_TABLE_END); i++) { 193 for (i=0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
194 if (table[i].frequency == CPUFREQ_ENTRY_INVALID) 194 if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
@@ -217,20 +217,20 @@ void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
217 unsigned int cpu) 217 unsigned int cpu)
218{ 218{
219 dprintk("setting show_table for cpu %u to %p\n", cpu, table); 219 dprintk("setting show_table for cpu %u to %p\n", cpu, table);
220 show_table[cpu] = table; 220 per_cpu(show_table, cpu) = table;
221} 221}
222EXPORT_SYMBOL_GPL(cpufreq_frequency_table_get_attr); 222EXPORT_SYMBOL_GPL(cpufreq_frequency_table_get_attr);
223 223
224void cpufreq_frequency_table_put_attr(unsigned int cpu) 224void cpufreq_frequency_table_put_attr(unsigned int cpu)
225{ 225{
226 dprintk("clearing show_table for cpu %u\n", cpu); 226 dprintk("clearing show_table for cpu %u\n", cpu);
227 show_table[cpu] = NULL; 227 per_cpu(show_table, cpu) = NULL;
228} 228}
229EXPORT_SYMBOL_GPL(cpufreq_frequency_table_put_attr); 229EXPORT_SYMBOL_GPL(cpufreq_frequency_table_put_attr);
230 230
231struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu) 231struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu)
232{ 232{
233 return show_table[cpu]; 233 return per_cpu(show_table, cpu);
234} 234}
235EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table); 235EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table);
236 236
diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c
index e949618b9be0..31a0e0b455b6 100644
--- a/drivers/cpuidle/sysfs.c
+++ b/drivers/cpuidle/sysfs.c
@@ -21,7 +21,8 @@ static int __init cpuidle_sysfs_setup(char *unused)
21} 21}
22__setup("cpuidle_sysfs_switch", cpuidle_sysfs_setup); 22__setup("cpuidle_sysfs_switch", cpuidle_sysfs_setup);
23 23
24static ssize_t show_available_governors(struct sys_device *dev, char *buf) 24static ssize_t show_available_governors(struct sys_device *dev,
25 struct sysdev_attribute *attr, char *buf)
25{ 26{
26 ssize_t i = 0; 27 ssize_t i = 0;
27 struct cpuidle_governor *tmp; 28 struct cpuidle_governor *tmp;
@@ -39,7 +40,8 @@ out:
39 return i; 40 return i;
40} 41}
41 42
42static ssize_t show_current_driver(struct sys_device *dev, char *buf) 43static ssize_t show_current_driver(struct sys_device *dev,
44 struct sysdev_attribute *attr, char *buf)
43{ 45{
44 ssize_t ret; 46 ssize_t ret;
45 47
@@ -53,7 +55,8 @@ static ssize_t show_current_driver(struct sys_device *dev, char *buf)
53 return ret; 55 return ret;
54} 56}
55 57
56static ssize_t show_current_governor(struct sys_device *dev, char *buf) 58static ssize_t show_current_governor(struct sys_device *dev,
59 struct sysdev_attribute *attr, char *buf)
57{ 60{
58 ssize_t ret; 61 ssize_t ret;
59 62
@@ -68,6 +71,7 @@ static ssize_t show_current_governor(struct sys_device *dev, char *buf)
68} 71}
69 72
70static ssize_t store_current_governor(struct sys_device *dev, 73static ssize_t store_current_governor(struct sys_device *dev,
74 struct sysdev_attribute *attr,
71 const char *buf, size_t count) 75 const char *buf, size_t count)
72{ 76{
73 char gov_name[CPUIDLE_NAME_LEN]; 77 char gov_name[CPUIDLE_NAME_LEN];
diff --git a/drivers/dca/dca-core.c b/drivers/dca/dca-core.c
index bf5b92f86df7..ec249d2db633 100644
--- a/drivers/dca/dca-core.c
+++ b/drivers/dca/dca-core.c
@@ -28,13 +28,29 @@
28#include <linux/device.h> 28#include <linux/device.h>
29#include <linux/dca.h> 29#include <linux/dca.h>
30 30
31MODULE_LICENSE("GPL"); 31#define DCA_VERSION "1.4"
32 32
33/* For now we're assuming a single, global, DCA provider for the system. */ 33MODULE_VERSION(DCA_VERSION);
34MODULE_LICENSE("GPL");
35MODULE_AUTHOR("Intel Corporation");
34 36
35static DEFINE_SPINLOCK(dca_lock); 37static DEFINE_SPINLOCK(dca_lock);
36 38
37static struct dca_provider *global_dca = NULL; 39static LIST_HEAD(dca_providers);
40
41static struct dca_provider *dca_find_provider_by_dev(struct device *dev)
42{
43 struct dca_provider *dca, *ret = NULL;
44
45 list_for_each_entry(dca, &dca_providers, node) {
46 if ((!dev) || (dca->ops->dev_managed(dca, dev))) {
47 ret = dca;
48 break;
49 }
50 }
51
52 return ret;
53}
38 54
39/** 55/**
40 * dca_add_requester - add a dca client to the list 56 * dca_add_requester - add a dca client to the list
@@ -42,25 +58,39 @@ static struct dca_provider *global_dca = NULL;
42 */ 58 */
43int dca_add_requester(struct device *dev) 59int dca_add_requester(struct device *dev)
44{ 60{
45 int err, slot; 61 struct dca_provider *dca;
62 int err, slot = -ENODEV;
46 63
47 if (!global_dca) 64 if (!dev)
48 return -ENODEV; 65 return -EFAULT;
49 66
50 spin_lock(&dca_lock); 67 spin_lock(&dca_lock);
51 slot = global_dca->ops->add_requester(global_dca, dev); 68
52 spin_unlock(&dca_lock); 69 /* check if the requester has not been added already */
53 if (slot < 0) 70 dca = dca_find_provider_by_dev(dev);
71 if (dca) {
72 spin_unlock(&dca_lock);
73 return -EEXIST;
74 }
75
76 list_for_each_entry(dca, &dca_providers, node) {
77 slot = dca->ops->add_requester(dca, dev);
78 if (slot >= 0)
79 break;
80 }
81 if (slot < 0) {
82 spin_unlock(&dca_lock);
54 return slot; 83 return slot;
84 }
55 85
56 err = dca_sysfs_add_req(global_dca, dev, slot); 86 err = dca_sysfs_add_req(dca, dev, slot);
57 if (err) { 87 if (err) {
58 spin_lock(&dca_lock); 88 dca->ops->remove_requester(dca, dev);
59 global_dca->ops->remove_requester(global_dca, dev);
60 spin_unlock(&dca_lock); 89 spin_unlock(&dca_lock);
61 return err; 90 return err;
62 } 91 }
63 92
93 spin_unlock(&dca_lock);
64 return 0; 94 return 0;
65} 95}
66EXPORT_SYMBOL_GPL(dca_add_requester); 96EXPORT_SYMBOL_GPL(dca_add_requester);
@@ -71,30 +101,78 @@ EXPORT_SYMBOL_GPL(dca_add_requester);
71 */ 101 */
72int dca_remove_requester(struct device *dev) 102int dca_remove_requester(struct device *dev)
73{ 103{
104 struct dca_provider *dca;
74 int slot; 105 int slot;
75 if (!global_dca) 106
76 return -ENODEV; 107 if (!dev)
108 return -EFAULT;
77 109
78 spin_lock(&dca_lock); 110 spin_lock(&dca_lock);
79 slot = global_dca->ops->remove_requester(global_dca, dev); 111 dca = dca_find_provider_by_dev(dev);
80 spin_unlock(&dca_lock); 112 if (!dca) {
81 if (slot < 0) 113 spin_unlock(&dca_lock);
114 return -ENODEV;
115 }
116 slot = dca->ops->remove_requester(dca, dev);
117 if (slot < 0) {
118 spin_unlock(&dca_lock);
82 return slot; 119 return slot;
120 }
83 121
84 dca_sysfs_remove_req(global_dca, slot); 122 dca_sysfs_remove_req(dca, slot);
123
124 spin_unlock(&dca_lock);
85 return 0; 125 return 0;
86} 126}
87EXPORT_SYMBOL_GPL(dca_remove_requester); 127EXPORT_SYMBOL_GPL(dca_remove_requester);
88 128
89/** 129/**
90 * dca_get_tag - return the dca tag for the given cpu 130 * dca_common_get_tag - return the dca tag (serves both new and old api)
131 * @dev - the device that wants dca service
91 * @cpu - the cpuid as returned by get_cpu() 132 * @cpu - the cpuid as returned by get_cpu()
92 */ 133 */
93u8 dca_get_tag(int cpu) 134u8 dca_common_get_tag(struct device *dev, int cpu)
94{ 135{
95 if (!global_dca) 136 struct dca_provider *dca;
137 u8 tag;
138
139 spin_lock(&dca_lock);
140
141 dca = dca_find_provider_by_dev(dev);
142 if (!dca) {
143 spin_unlock(&dca_lock);
96 return -ENODEV; 144 return -ENODEV;
97 return global_dca->ops->get_tag(global_dca, cpu); 145 }
146 tag = dca->ops->get_tag(dca, dev, cpu);
147
148 spin_unlock(&dca_lock);
149 return tag;
150}
151
152/**
153 * dca3_get_tag - return the dca tag to the requester device
154 * for the given cpu (new api)
155 * @dev - the device that wants dca service
156 * @cpu - the cpuid as returned by get_cpu()
157 */
158u8 dca3_get_tag(struct device *dev, int cpu)
159{
160 if (!dev)
161 return -EFAULT;
162
163 return dca_common_get_tag(dev, cpu);
164}
165EXPORT_SYMBOL_GPL(dca3_get_tag);
166
167/**
168 * dca_get_tag - return the dca tag for the given cpu (old api)
169 * @cpu - the cpuid as returned by get_cpu()
170 */
171u8 dca_get_tag(int cpu)
172{
173 struct device *dev = NULL;
174
175 return dca_common_get_tag(dev, cpu);
98} 176}
99EXPORT_SYMBOL_GPL(dca_get_tag); 177EXPORT_SYMBOL_GPL(dca_get_tag);
100 178
@@ -140,12 +218,10 @@ int register_dca_provider(struct dca_provider *dca, struct device *dev)
140{ 218{
141 int err; 219 int err;
142 220
143 if (global_dca)
144 return -EEXIST;
145 err = dca_sysfs_add_provider(dca, dev); 221 err = dca_sysfs_add_provider(dca, dev);
146 if (err) 222 if (err)
147 return err; 223 return err;
148 global_dca = dca; 224 list_add(&dca->node, &dca_providers);
149 blocking_notifier_call_chain(&dca_provider_chain, 225 blocking_notifier_call_chain(&dca_provider_chain,
150 DCA_PROVIDER_ADD, NULL); 226 DCA_PROVIDER_ADD, NULL);
151 return 0; 227 return 0;
@@ -158,11 +234,9 @@ EXPORT_SYMBOL_GPL(register_dca_provider);
158 */ 234 */
159void unregister_dca_provider(struct dca_provider *dca) 235void unregister_dca_provider(struct dca_provider *dca)
160{ 236{
161 if (!global_dca)
162 return;
163 blocking_notifier_call_chain(&dca_provider_chain, 237 blocking_notifier_call_chain(&dca_provider_chain,
164 DCA_PROVIDER_REMOVE, NULL); 238 DCA_PROVIDER_REMOVE, NULL);
165 global_dca = NULL; 239 list_del(&dca->node);
166 dca_sysfs_remove_provider(dca); 240 dca_sysfs_remove_provider(dca);
167} 241}
168EXPORT_SYMBOL_GPL(unregister_dca_provider); 242EXPORT_SYMBOL_GPL(unregister_dca_provider);
@@ -187,6 +261,7 @@ EXPORT_SYMBOL_GPL(dca_unregister_notify);
187 261
188static int __init dca_init(void) 262static int __init dca_init(void)
189{ 263{
264 printk(KERN_ERR "dca service started, version %s\n", DCA_VERSION);
190 return dca_sysfs_init(); 265 return dca_sysfs_init();
191} 266}
192 267
diff --git a/drivers/dca/dca-sysfs.c b/drivers/dca/dca-sysfs.c
index 011328faa5f2..7af4b403bd2d 100644
--- a/drivers/dca/dca-sysfs.c
+++ b/drivers/dca/dca-sysfs.c
@@ -13,9 +13,11 @@ static spinlock_t dca_idr_lock;
13int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot) 13int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot)
14{ 14{
15 struct device *cd; 15 struct device *cd;
16 static int req_count;
16 17
17 cd = device_create(dca_class, dca->cd, MKDEV(0, slot + 1), 18 cd = device_create_drvdata(dca_class, dca->cd,
18 "requester%d", slot); 19 MKDEV(0, slot + 1), NULL,
20 "requester%d", req_count++);
19 if (IS_ERR(cd)) 21 if (IS_ERR(cd))
20 return PTR_ERR(cd); 22 return PTR_ERR(cd);
21 return 0; 23 return 0;
@@ -46,7 +48,8 @@ idr_try_again:
46 return err; 48 return err;
47 } 49 }
48 50
49 cd = device_create(dca_class, dev, MKDEV(0, 0), "dca%d", dca->id); 51 cd = device_create_drvdata(dca_class, dev, MKDEV(0, 0), NULL,
52 "dca%d", dca->id);
50 if (IS_ERR(cd)) { 53 if (IS_ERR(cd)) {
51 spin_lock(&dca_idr_lock); 54 spin_lock(&dca_idr_lock);
52 idr_remove(&dca_idr, dca->id); 55 idr_remove(&dca_idr, dca->id);
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 6239c3df30ac..cd303901eb5b 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -4,13 +4,14 @@
4 4
5menuconfig DMADEVICES 5menuconfig DMADEVICES
6 bool "DMA Engine support" 6 bool "DMA Engine support"
7 depends on (PCI && X86) || ARCH_IOP32X || ARCH_IOP33X || ARCH_IOP13XX || PPC 7 depends on !HIGHMEM64G && HAS_DMA
8 depends on !HIGHMEM64G
9 help 8 help
10 DMA engines can do asynchronous data transfers without 9 DMA engines can do asynchronous data transfers without
11 involving the host CPU. Currently, this framework can be 10 involving the host CPU. Currently, this framework can be
12 used to offload memory copies in the network stack and 11 used to offload memory copies in the network stack and
13 RAID operations in the MD driver. 12 RAID operations in the MD driver. This menu only presents
13 DMA Device drivers supported by the configured arch, it may
14 be empty in some cases.
14 15
15if DMADEVICES 16if DMADEVICES
16 17
@@ -37,6 +38,15 @@ config INTEL_IOP_ADMA
37 help 38 help
38 Enable support for the Intel(R) IOP Series RAID engines. 39 Enable support for the Intel(R) IOP Series RAID engines.
39 40
41config DW_DMAC
42 tristate "Synopsys DesignWare AHB DMA support"
43 depends on AVR32
44 select DMA_ENGINE
45 default y if CPU_AT32AP7000
46 help
47 Support the Synopsys DesignWare AHB DMA controller. This
48 can be integrated in chips such as the Atmel AT32ap7000.
49
40config FSL_DMA 50config FSL_DMA
41 bool "Freescale MPC85xx/MPC83xx DMA support" 51 bool "Freescale MPC85xx/MPC83xx DMA support"
42 depends on PPC 52 depends on PPC
@@ -46,6 +56,14 @@ config FSL_DMA
46 MPC8560/40, MPC8555, MPC8548 and MPC8641 processors. 56 MPC8560/40, MPC8555, MPC8548 and MPC8641 processors.
47 The MPC8349, MPC8360 is also supported. 57 The MPC8349, MPC8360 is also supported.
48 58
59config MV_XOR
60 bool "Marvell XOR engine support"
61 depends on PLAT_ORION
62 select ASYNC_CORE
63 select DMA_ENGINE
64 ---help---
65 Enable support for the Marvell XOR engine.
66
49config DMA_ENGINE 67config DMA_ENGINE
50 bool 68 bool
51 69
@@ -55,10 +73,19 @@ comment "DMA Clients"
55config NET_DMA 73config NET_DMA
56 bool "Network: TCP receive copy offload" 74 bool "Network: TCP receive copy offload"
57 depends on DMA_ENGINE && NET 75 depends on DMA_ENGINE && NET
76 default (INTEL_IOATDMA || FSL_DMA)
58 help 77 help
59 This enables the use of DMA engines in the network stack to 78 This enables the use of DMA engines in the network stack to
60 offload receive copy-to-user operations, freeing CPU cycles. 79 offload receive copy-to-user operations, freeing CPU cycles.
61 Since this is the main user of the DMA engine, it should be enabled; 80
62 say Y here. 81 Say Y here if you enabled INTEL_IOATDMA or FSL_DMA, otherwise
82 say N.
83
84config DMATEST
85 tristate "DMA Test client"
86 depends on DMA_ENGINE
87 help
88 Simple DMA test client. Say N unless you're debugging a
89 DMA Device driver.
63 90
64endif 91endif
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index c8036d945902..14f59527d4f6 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -1,6 +1,9 @@
1obj-$(CONFIG_DMA_ENGINE) += dmaengine.o 1obj-$(CONFIG_DMA_ENGINE) += dmaengine.o
2obj-$(CONFIG_NET_DMA) += iovlock.o 2obj-$(CONFIG_NET_DMA) += iovlock.o
3obj-$(CONFIG_DMATEST) += dmatest.o
3obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o 4obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o
4ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o 5ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o
5obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o 6obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
6obj-$(CONFIG_FSL_DMA) += fsldma.o 7obj-$(CONFIG_FSL_DMA) += fsldma.o
8obj-$(CONFIG_MV_XOR) += mv_xor.o
9obj-$(CONFIG_DW_DMAC) += dw_dmac.o
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
index 97b329e76798..dc003a3a787d 100644
--- a/drivers/dma/dmaengine.c
+++ b/drivers/dma/dmaengine.c
@@ -169,12 +169,18 @@ static void dma_client_chan_alloc(struct dma_client *client)
169 enum dma_state_client ack; 169 enum dma_state_client ack;
170 170
171 /* Find a channel */ 171 /* Find a channel */
172 list_for_each_entry(device, &dma_device_list, global_node) 172 list_for_each_entry(device, &dma_device_list, global_node) {
173 /* Does the client require a specific DMA controller? */
174 if (client->slave && client->slave->dma_dev
175 && client->slave->dma_dev != device->dev)
176 continue;
177
173 list_for_each_entry(chan, &device->channels, device_node) { 178 list_for_each_entry(chan, &device->channels, device_node) {
174 if (!dma_chan_satisfies_mask(chan, client->cap_mask)) 179 if (!dma_chan_satisfies_mask(chan, client->cap_mask))
175 continue; 180 continue;
176 181
177 desc = chan->device->device_alloc_chan_resources(chan); 182 desc = chan->device->device_alloc_chan_resources(
183 chan, client);
178 if (desc >= 0) { 184 if (desc >= 0) {
179 ack = client->event_callback(client, 185 ack = client->event_callback(client,
180 chan, 186 chan,
@@ -183,12 +189,14 @@ static void dma_client_chan_alloc(struct dma_client *client)
183 /* we are done once this client rejects 189 /* we are done once this client rejects
184 * an available resource 190 * an available resource
185 */ 191 */
186 if (ack == DMA_ACK) 192 if (ack == DMA_ACK) {
187 dma_chan_get(chan); 193 dma_chan_get(chan);
188 else if (ack == DMA_NAK) 194 chan->client_count++;
195 } else if (ack == DMA_NAK)
189 return; 196 return;
190 } 197 }
191 } 198 }
199 }
192} 200}
193 201
194enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie) 202enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie)
@@ -272,8 +280,10 @@ static void dma_clients_notify_removed(struct dma_chan *chan)
272 /* client was holding resources for this channel so 280 /* client was holding resources for this channel so
273 * free it 281 * free it
274 */ 282 */
275 if (ack == DMA_ACK) 283 if (ack == DMA_ACK) {
276 dma_chan_put(chan); 284 dma_chan_put(chan);
285 chan->client_count--;
286 }
277 } 287 }
278 288
279 mutex_unlock(&dma_list_mutex); 289 mutex_unlock(&dma_list_mutex);
@@ -285,6 +295,10 @@ static void dma_clients_notify_removed(struct dma_chan *chan)
285 */ 295 */
286void dma_async_client_register(struct dma_client *client) 296void dma_async_client_register(struct dma_client *client)
287{ 297{
298 /* validate client data */
299 BUG_ON(dma_has_cap(DMA_SLAVE, client->cap_mask) &&
300 !client->slave);
301
288 mutex_lock(&dma_list_mutex); 302 mutex_lock(&dma_list_mutex);
289 list_add_tail(&client->global_node, &dma_client_list); 303 list_add_tail(&client->global_node, &dma_client_list);
290 mutex_unlock(&dma_list_mutex); 304 mutex_unlock(&dma_list_mutex);
@@ -313,8 +327,10 @@ void dma_async_client_unregister(struct dma_client *client)
313 ack = client->event_callback(client, chan, 327 ack = client->event_callback(client, chan,
314 DMA_RESOURCE_REMOVED); 328 DMA_RESOURCE_REMOVED);
315 329
316 if (ack == DMA_ACK) 330 if (ack == DMA_ACK) {
317 dma_chan_put(chan); 331 dma_chan_put(chan);
332 chan->client_count--;
333 }
318 } 334 }
319 335
320 list_del(&client->global_node); 336 list_del(&client->global_node);
@@ -359,6 +375,10 @@ int dma_async_device_register(struct dma_device *device)
359 !device->device_prep_dma_memset); 375 !device->device_prep_dma_memset);
360 BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) && 376 BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) &&
361 !device->device_prep_dma_interrupt); 377 !device->device_prep_dma_interrupt);
378 BUG_ON(dma_has_cap(DMA_SLAVE, device->cap_mask) &&
379 !device->device_prep_slave_sg);
380 BUG_ON(dma_has_cap(DMA_SLAVE, device->cap_mask) &&
381 !device->device_terminate_all);
362 382
363 BUG_ON(!device->device_alloc_chan_resources); 383 BUG_ON(!device->device_alloc_chan_resources);
364 BUG_ON(!device->device_free_chan_resources); 384 BUG_ON(!device->device_free_chan_resources);
@@ -378,7 +398,7 @@ int dma_async_device_register(struct dma_device *device)
378 398
379 chan->chan_id = chancnt++; 399 chan->chan_id = chancnt++;
380 chan->dev.class = &dma_devclass; 400 chan->dev.class = &dma_devclass;
381 chan->dev.parent = NULL; 401 chan->dev.parent = device->dev;
382 snprintf(chan->dev.bus_id, BUS_ID_SIZE, "dma%dchan%d", 402 snprintf(chan->dev.bus_id, BUS_ID_SIZE, "dma%dchan%d",
383 device->dev_id, chan->chan_id); 403 device->dev_id, chan->chan_id);
384 404
@@ -394,6 +414,7 @@ int dma_async_device_register(struct dma_device *device)
394 kref_get(&device->refcount); 414 kref_get(&device->refcount);
395 kref_get(&device->refcount); 415 kref_get(&device->refcount);
396 kref_init(&chan->refcount); 416 kref_init(&chan->refcount);
417 chan->client_count = 0;
397 chan->slow_ref = 0; 418 chan->slow_ref = 0;
398 INIT_RCU_HEAD(&chan->rcu); 419 INIT_RCU_HEAD(&chan->rcu);
399 } 420 }
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
new file mode 100644
index 000000000000..a08d19704743
--- /dev/null
+++ b/drivers/dma/dmatest.c
@@ -0,0 +1,444 @@
1/*
2 * DMA Engine test module
3 *
4 * Copyright (C) 2007 Atmel Corporation
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/delay.h>
11#include <linux/dmaengine.h>
12#include <linux/init.h>
13#include <linux/kthread.h>
14#include <linux/module.h>
15#include <linux/moduleparam.h>
16#include <linux/random.h>
17#include <linux/wait.h>
18
19static unsigned int test_buf_size = 16384;
20module_param(test_buf_size, uint, S_IRUGO);
21MODULE_PARM_DESC(test_buf_size, "Size of the memcpy test buffer");
22
23static char test_channel[BUS_ID_SIZE];
24module_param_string(channel, test_channel, sizeof(test_channel), S_IRUGO);
25MODULE_PARM_DESC(channel, "Bus ID of the channel to test (default: any)");
26
27static char test_device[BUS_ID_SIZE];
28module_param_string(device, test_device, sizeof(test_device), S_IRUGO);
29MODULE_PARM_DESC(device, "Bus ID of the DMA Engine to test (default: any)");
30
31static unsigned int threads_per_chan = 1;
32module_param(threads_per_chan, uint, S_IRUGO);
33MODULE_PARM_DESC(threads_per_chan,
34 "Number of threads to start per channel (default: 1)");
35
36static unsigned int max_channels;
37module_param(max_channels, uint, S_IRUGO);
38MODULE_PARM_DESC(nr_channels,
39 "Maximum number of channels to use (default: all)");
40
41/*
42 * Initialization patterns. All bytes in the source buffer has bit 7
43 * set, all bytes in the destination buffer has bit 7 cleared.
44 *
45 * Bit 6 is set for all bytes which are to be copied by the DMA
46 * engine. Bit 5 is set for all bytes which are to be overwritten by
47 * the DMA engine.
48 *
49 * The remaining bits are the inverse of a counter which increments by
50 * one for each byte address.
51 */
52#define PATTERN_SRC 0x80
53#define PATTERN_DST 0x00
54#define PATTERN_COPY 0x40
55#define PATTERN_OVERWRITE 0x20
56#define PATTERN_COUNT_MASK 0x1f
57
58struct dmatest_thread {
59 struct list_head node;
60 struct task_struct *task;
61 struct dma_chan *chan;
62 u8 *srcbuf;
63 u8 *dstbuf;
64};
65
66struct dmatest_chan {
67 struct list_head node;
68 struct dma_chan *chan;
69 struct list_head threads;
70};
71
72/*
73 * These are protected by dma_list_mutex since they're only used by
74 * the DMA client event callback
75 */
76static LIST_HEAD(dmatest_channels);
77static unsigned int nr_channels;
78
79static bool dmatest_match_channel(struct dma_chan *chan)
80{
81 if (test_channel[0] == '\0')
82 return true;
83 return strcmp(chan->dev.bus_id, test_channel) == 0;
84}
85
86static bool dmatest_match_device(struct dma_device *device)
87{
88 if (test_device[0] == '\0')
89 return true;
90 return strcmp(device->dev->bus_id, test_device) == 0;
91}
92
93static unsigned long dmatest_random(void)
94{
95 unsigned long buf;
96
97 get_random_bytes(&buf, sizeof(buf));
98 return buf;
99}
100
101static void dmatest_init_srcbuf(u8 *buf, unsigned int start, unsigned int len)
102{
103 unsigned int i;
104
105 for (i = 0; i < start; i++)
106 buf[i] = PATTERN_SRC | (~i & PATTERN_COUNT_MASK);
107 for ( ; i < start + len; i++)
108 buf[i] = PATTERN_SRC | PATTERN_COPY
109 | (~i & PATTERN_COUNT_MASK);;
110 for ( ; i < test_buf_size; i++)
111 buf[i] = PATTERN_SRC | (~i & PATTERN_COUNT_MASK);
112}
113
114static void dmatest_init_dstbuf(u8 *buf, unsigned int start, unsigned int len)
115{
116 unsigned int i;
117
118 for (i = 0; i < start; i++)
119 buf[i] = PATTERN_DST | (~i & PATTERN_COUNT_MASK);
120 for ( ; i < start + len; i++)
121 buf[i] = PATTERN_DST | PATTERN_OVERWRITE
122 | (~i & PATTERN_COUNT_MASK);
123 for ( ; i < test_buf_size; i++)
124 buf[i] = PATTERN_DST | (~i & PATTERN_COUNT_MASK);
125}
126
127static void dmatest_mismatch(u8 actual, u8 pattern, unsigned int index,
128 unsigned int counter, bool is_srcbuf)
129{
130 u8 diff = actual ^ pattern;
131 u8 expected = pattern | (~counter & PATTERN_COUNT_MASK);
132 const char *thread_name = current->comm;
133
134 if (is_srcbuf)
135 pr_warning("%s: srcbuf[0x%x] overwritten!"
136 " Expected %02x, got %02x\n",
137 thread_name, index, expected, actual);
138 else if ((pattern & PATTERN_COPY)
139 && (diff & (PATTERN_COPY | PATTERN_OVERWRITE)))
140 pr_warning("%s: dstbuf[0x%x] not copied!"
141 " Expected %02x, got %02x\n",
142 thread_name, index, expected, actual);
143 else if (diff & PATTERN_SRC)
144 pr_warning("%s: dstbuf[0x%x] was copied!"
145 " Expected %02x, got %02x\n",
146 thread_name, index, expected, actual);
147 else
148 pr_warning("%s: dstbuf[0x%x] mismatch!"
149 " Expected %02x, got %02x\n",
150 thread_name, index, expected, actual);
151}
152
153static unsigned int dmatest_verify(u8 *buf, unsigned int start,
154 unsigned int end, unsigned int counter, u8 pattern,
155 bool is_srcbuf)
156{
157 unsigned int i;
158 unsigned int error_count = 0;
159 u8 actual;
160
161 for (i = start; i < end; i++) {
162 actual = buf[i];
163 if (actual != (pattern | (~counter & PATTERN_COUNT_MASK))) {
164 if (error_count < 32)
165 dmatest_mismatch(actual, pattern, i, counter,
166 is_srcbuf);
167 error_count++;
168 }
169 counter++;
170 }
171
172 if (error_count > 32)
173 pr_warning("%s: %u errors suppressed\n",
174 current->comm, error_count - 32);
175
176 return error_count;
177}
178
179/*
180 * This function repeatedly tests DMA transfers of various lengths and
181 * offsets until it is told to exit by kthread_stop(). There may be
182 * multiple threads running this function in parallel for a single
183 * channel, and there may be multiple channels being tested in
184 * parallel.
185 *
186 * Before each test, the source and destination buffer is initialized
187 * with a known pattern. This pattern is different depending on
188 * whether it's in an area which is supposed to be copied or
189 * overwritten, and different in the source and destination buffers.
190 * So if the DMA engine doesn't copy exactly what we tell it to copy,
191 * we'll notice.
192 */
193static int dmatest_func(void *data)
194{
195 struct dmatest_thread *thread = data;
196 struct dma_chan *chan;
197 const char *thread_name;
198 unsigned int src_off, dst_off, len;
199 unsigned int error_count;
200 unsigned int failed_tests = 0;
201 unsigned int total_tests = 0;
202 dma_cookie_t cookie;
203 enum dma_status status;
204 int ret;
205
206 thread_name = current->comm;
207
208 ret = -ENOMEM;
209 thread->srcbuf = kmalloc(test_buf_size, GFP_KERNEL);
210 if (!thread->srcbuf)
211 goto err_srcbuf;
212 thread->dstbuf = kmalloc(test_buf_size, GFP_KERNEL);
213 if (!thread->dstbuf)
214 goto err_dstbuf;
215
216 smp_rmb();
217 chan = thread->chan;
218 dma_chan_get(chan);
219
220 while (!kthread_should_stop()) {
221 total_tests++;
222
223 len = dmatest_random() % test_buf_size + 1;
224 src_off = dmatest_random() % (test_buf_size - len + 1);
225 dst_off = dmatest_random() % (test_buf_size - len + 1);
226
227 dmatest_init_srcbuf(thread->srcbuf, src_off, len);
228 dmatest_init_dstbuf(thread->dstbuf, dst_off, len);
229
230 cookie = dma_async_memcpy_buf_to_buf(chan,
231 thread->dstbuf + dst_off,
232 thread->srcbuf + src_off,
233 len);
234 if (dma_submit_error(cookie)) {
235 pr_warning("%s: #%u: submit error %d with src_off=0x%x "
236 "dst_off=0x%x len=0x%x\n",
237 thread_name, total_tests - 1, cookie,
238 src_off, dst_off, len);
239 msleep(100);
240 failed_tests++;
241 continue;
242 }
243 dma_async_memcpy_issue_pending(chan);
244
245 do {
246 msleep(1);
247 status = dma_async_memcpy_complete(
248 chan, cookie, NULL, NULL);
249 } while (status == DMA_IN_PROGRESS);
250
251 if (status == DMA_ERROR) {
252 pr_warning("%s: #%u: error during copy\n",
253 thread_name, total_tests - 1);
254 failed_tests++;
255 continue;
256 }
257
258 error_count = 0;
259
260 pr_debug("%s: verifying source buffer...\n", thread_name);
261 error_count += dmatest_verify(thread->srcbuf, 0, src_off,
262 0, PATTERN_SRC, true);
263 error_count += dmatest_verify(thread->srcbuf, src_off,
264 src_off + len, src_off,
265 PATTERN_SRC | PATTERN_COPY, true);
266 error_count += dmatest_verify(thread->srcbuf, src_off + len,
267 test_buf_size, src_off + len,
268 PATTERN_SRC, true);
269
270 pr_debug("%s: verifying dest buffer...\n",
271 thread->task->comm);
272 error_count += dmatest_verify(thread->dstbuf, 0, dst_off,
273 0, PATTERN_DST, false);
274 error_count += dmatest_verify(thread->dstbuf, dst_off,
275 dst_off + len, src_off,
276 PATTERN_SRC | PATTERN_COPY, false);
277 error_count += dmatest_verify(thread->dstbuf, dst_off + len,
278 test_buf_size, dst_off + len,
279 PATTERN_DST, false);
280
281 if (error_count) {
282 pr_warning("%s: #%u: %u errors with "
283 "src_off=0x%x dst_off=0x%x len=0x%x\n",
284 thread_name, total_tests - 1, error_count,
285 src_off, dst_off, len);
286 failed_tests++;
287 } else {
288 pr_debug("%s: #%u: No errors with "
289 "src_off=0x%x dst_off=0x%x len=0x%x\n",
290 thread_name, total_tests - 1,
291 src_off, dst_off, len);
292 }
293 }
294
295 ret = 0;
296 dma_chan_put(chan);
297 kfree(thread->dstbuf);
298err_dstbuf:
299 kfree(thread->srcbuf);
300err_srcbuf:
301 pr_notice("%s: terminating after %u tests, %u failures (status %d)\n",
302 thread_name, total_tests, failed_tests, ret);
303 return ret;
304}
305
306static void dmatest_cleanup_channel(struct dmatest_chan *dtc)
307{
308 struct dmatest_thread *thread;
309 struct dmatest_thread *_thread;
310 int ret;
311
312 list_for_each_entry_safe(thread, _thread, &dtc->threads, node) {
313 ret = kthread_stop(thread->task);
314 pr_debug("dmatest: thread %s exited with status %d\n",
315 thread->task->comm, ret);
316 list_del(&thread->node);
317 kfree(thread);
318 }
319 kfree(dtc);
320}
321
322static enum dma_state_client dmatest_add_channel(struct dma_chan *chan)
323{
324 struct dmatest_chan *dtc;
325 struct dmatest_thread *thread;
326 unsigned int i;
327
328 dtc = kmalloc(sizeof(struct dmatest_chan), GFP_ATOMIC);
329 if (!dtc) {
330 pr_warning("dmatest: No memory for %s\n", chan->dev.bus_id);
331 return DMA_NAK;
332 }
333
334 dtc->chan = chan;
335 INIT_LIST_HEAD(&dtc->threads);
336
337 for (i = 0; i < threads_per_chan; i++) {
338 thread = kzalloc(sizeof(struct dmatest_thread), GFP_KERNEL);
339 if (!thread) {
340 pr_warning("dmatest: No memory for %s-test%u\n",
341 chan->dev.bus_id, i);
342 break;
343 }
344 thread->chan = dtc->chan;
345 smp_wmb();
346 thread->task = kthread_run(dmatest_func, thread, "%s-test%u",
347 chan->dev.bus_id, i);
348 if (IS_ERR(thread->task)) {
349 pr_warning("dmatest: Failed to run thread %s-test%u\n",
350 chan->dev.bus_id, i);
351 kfree(thread);
352 break;
353 }
354
355 /* srcbuf and dstbuf are allocated by the thread itself */
356
357 list_add_tail(&thread->node, &dtc->threads);
358 }
359
360 pr_info("dmatest: Started %u threads using %s\n", i, chan->dev.bus_id);
361
362 list_add_tail(&dtc->node, &dmatest_channels);
363 nr_channels++;
364
365 return DMA_ACK;
366}
367
368static enum dma_state_client dmatest_remove_channel(struct dma_chan *chan)
369{
370 struct dmatest_chan *dtc, *_dtc;
371
372 list_for_each_entry_safe(dtc, _dtc, &dmatest_channels, node) {
373 if (dtc->chan == chan) {
374 list_del(&dtc->node);
375 dmatest_cleanup_channel(dtc);
376 pr_debug("dmatest: lost channel %s\n",
377 chan->dev.bus_id);
378 return DMA_ACK;
379 }
380 }
381
382 return DMA_DUP;
383}
384
385/*
386 * Start testing threads as new channels are assigned to us, and kill
387 * them when the channels go away.
388 *
389 * When we unregister the client, all channels are removed so this
390 * will also take care of cleaning things up when the module is
391 * unloaded.
392 */
393static enum dma_state_client
394dmatest_event(struct dma_client *client, struct dma_chan *chan,
395 enum dma_state state)
396{
397 enum dma_state_client ack = DMA_NAK;
398
399 switch (state) {
400 case DMA_RESOURCE_AVAILABLE:
401 if (!dmatest_match_channel(chan)
402 || !dmatest_match_device(chan->device))
403 ack = DMA_DUP;
404 else if (max_channels && nr_channels >= max_channels)
405 ack = DMA_NAK;
406 else
407 ack = dmatest_add_channel(chan);
408 break;
409
410 case DMA_RESOURCE_REMOVED:
411 ack = dmatest_remove_channel(chan);
412 break;
413
414 default:
415 pr_info("dmatest: Unhandled event %u (%s)\n",
416 state, chan->dev.bus_id);
417 break;
418 }
419
420 return ack;
421}
422
423static struct dma_client dmatest_client = {
424 .event_callback = dmatest_event,
425};
426
427static int __init dmatest_init(void)
428{
429 dma_cap_set(DMA_MEMCPY, dmatest_client.cap_mask);
430 dma_async_client_register(&dmatest_client);
431 dma_async_client_chan_request(&dmatest_client);
432
433 return 0;
434}
435module_init(dmatest_init);
436
437static void __exit dmatest_exit(void)
438{
439 dma_async_client_unregister(&dmatest_client);
440}
441module_exit(dmatest_exit);
442
443MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
444MODULE_LICENSE("GPL v2");
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
new file mode 100644
index 000000000000..94df91771243
--- /dev/null
+++ b/drivers/dma/dw_dmac.c
@@ -0,0 +1,1122 @@
1/*
2 * Driver for the Synopsys DesignWare DMA Controller (aka DMACA on
3 * AVR32 systems.)
4 *
5 * Copyright (C) 2007-2008 Atmel Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/clk.h>
12#include <linux/delay.h>
13#include <linux/dmaengine.h>
14#include <linux/dma-mapping.h>
15#include <linux/init.h>
16#include <linux/interrupt.h>
17#include <linux/io.h>
18#include <linux/mm.h>
19#include <linux/module.h>
20#include <linux/platform_device.h>
21#include <linux/slab.h>
22
23#include "dw_dmac_regs.h"
24
25/*
26 * This supports the Synopsys "DesignWare AHB Central DMA Controller",
27 * (DW_ahb_dmac) which is used with various AMBA 2.0 systems (not all
28 * of which use ARM any more). See the "Databook" from Synopsys for
29 * information beyond what licensees probably provide.
30 *
31 * The driver has currently been tested only with the Atmel AT32AP7000,
32 * which does not support descriptor writeback.
33 */
34
35/* NOTE: DMS+SMS is system-specific. We should get this information
36 * from the platform code somehow.
37 */
38#define DWC_DEFAULT_CTLLO (DWC_CTLL_DST_MSIZE(0) \
39 | DWC_CTLL_SRC_MSIZE(0) \
40 | DWC_CTLL_DMS(0) \
41 | DWC_CTLL_SMS(1) \
42 | DWC_CTLL_LLP_D_EN \
43 | DWC_CTLL_LLP_S_EN)
44
45/*
46 * This is configuration-dependent and usually a funny size like 4095.
47 * Let's round it down to the nearest power of two.
48 *
49 * Note that this is a transfer count, i.e. if we transfer 32-bit
50 * words, we can do 8192 bytes per descriptor.
51 *
52 * This parameter is also system-specific.
53 */
54#define DWC_MAX_COUNT 2048U
55
56/*
57 * Number of descriptors to allocate for each channel. This should be
58 * made configurable somehow; preferably, the clients (at least the
59 * ones using slave transfers) should be able to give us a hint.
60 */
61#define NR_DESCS_PER_CHANNEL 64
62
63/*----------------------------------------------------------------------*/
64
65/*
66 * Because we're not relying on writeback from the controller (it may not
67 * even be configured into the core!) we don't need to use dma_pool. These
68 * descriptors -- and associated data -- are cacheable. We do need to make
69 * sure their dcache entries are written back before handing them off to
70 * the controller, though.
71 */
72
73static struct dw_desc *dwc_first_active(struct dw_dma_chan *dwc)
74{
75 return list_entry(dwc->active_list.next, struct dw_desc, desc_node);
76}
77
78static struct dw_desc *dwc_first_queued(struct dw_dma_chan *dwc)
79{
80 return list_entry(dwc->queue.next, struct dw_desc, desc_node);
81}
82
83static struct dw_desc *dwc_desc_get(struct dw_dma_chan *dwc)
84{
85 struct dw_desc *desc, *_desc;
86 struct dw_desc *ret = NULL;
87 unsigned int i = 0;
88
89 spin_lock_bh(&dwc->lock);
90 list_for_each_entry_safe(desc, _desc, &dwc->free_list, desc_node) {
91 if (async_tx_test_ack(&desc->txd)) {
92 list_del(&desc->desc_node);
93 ret = desc;
94 break;
95 }
96 dev_dbg(&dwc->chan.dev, "desc %p not ACKed\n", desc);
97 i++;
98 }
99 spin_unlock_bh(&dwc->lock);
100
101 dev_vdbg(&dwc->chan.dev, "scanned %u descriptors on freelist\n", i);
102
103 return ret;
104}
105
106static void dwc_sync_desc_for_cpu(struct dw_dma_chan *dwc, struct dw_desc *desc)
107{
108 struct dw_desc *child;
109
110 list_for_each_entry(child, &desc->txd.tx_list, desc_node)
111 dma_sync_single_for_cpu(dwc->chan.dev.parent,
112 child->txd.phys, sizeof(child->lli),
113 DMA_TO_DEVICE);
114 dma_sync_single_for_cpu(dwc->chan.dev.parent,
115 desc->txd.phys, sizeof(desc->lli),
116 DMA_TO_DEVICE);
117}
118
119/*
120 * Move a descriptor, including any children, to the free list.
121 * `desc' must not be on any lists.
122 */
123static void dwc_desc_put(struct dw_dma_chan *dwc, struct dw_desc *desc)
124{
125 if (desc) {
126 struct dw_desc *child;
127
128 dwc_sync_desc_for_cpu(dwc, desc);
129
130 spin_lock_bh(&dwc->lock);
131 list_for_each_entry(child, &desc->txd.tx_list, desc_node)
132 dev_vdbg(&dwc->chan.dev,
133 "moving child desc %p to freelist\n",
134 child);
135 list_splice_init(&desc->txd.tx_list, &dwc->free_list);
136 dev_vdbg(&dwc->chan.dev, "moving desc %p to freelist\n", desc);
137 list_add(&desc->desc_node, &dwc->free_list);
138 spin_unlock_bh(&dwc->lock);
139 }
140}
141
142/* Called with dwc->lock held and bh disabled */
143static dma_cookie_t
144dwc_assign_cookie(struct dw_dma_chan *dwc, struct dw_desc *desc)
145{
146 dma_cookie_t cookie = dwc->chan.cookie;
147
148 if (++cookie < 0)
149 cookie = 1;
150
151 dwc->chan.cookie = cookie;
152 desc->txd.cookie = cookie;
153
154 return cookie;
155}
156
157/*----------------------------------------------------------------------*/
158
159/* Called with dwc->lock held and bh disabled */
160static void dwc_dostart(struct dw_dma_chan *dwc, struct dw_desc *first)
161{
162 struct dw_dma *dw = to_dw_dma(dwc->chan.device);
163
164 /* ASSERT: channel is idle */
165 if (dma_readl(dw, CH_EN) & dwc->mask) {
166 dev_err(&dwc->chan.dev,
167 "BUG: Attempted to start non-idle channel\n");
168 dev_err(&dwc->chan.dev,
169 " SAR: 0x%x DAR: 0x%x LLP: 0x%x CTL: 0x%x:%08x\n",
170 channel_readl(dwc, SAR),
171 channel_readl(dwc, DAR),
172 channel_readl(dwc, LLP),
173 channel_readl(dwc, CTL_HI),
174 channel_readl(dwc, CTL_LO));
175
176 /* The tasklet will hopefully advance the queue... */
177 return;
178 }
179
180 channel_writel(dwc, LLP, first->txd.phys);
181 channel_writel(dwc, CTL_LO,
182 DWC_CTLL_LLP_D_EN | DWC_CTLL_LLP_S_EN);
183 channel_writel(dwc, CTL_HI, 0);
184 channel_set_bit(dw, CH_EN, dwc->mask);
185}
186
187/*----------------------------------------------------------------------*/
188
189static void
190dwc_descriptor_complete(struct dw_dma_chan *dwc, struct dw_desc *desc)
191{
192 dma_async_tx_callback callback;
193 void *param;
194 struct dma_async_tx_descriptor *txd = &desc->txd;
195
196 dev_vdbg(&dwc->chan.dev, "descriptor %u complete\n", txd->cookie);
197
198 dwc->completed = txd->cookie;
199 callback = txd->callback;
200 param = txd->callback_param;
201
202 dwc_sync_desc_for_cpu(dwc, desc);
203 list_splice_init(&txd->tx_list, &dwc->free_list);
204 list_move(&desc->desc_node, &dwc->free_list);
205
206 /*
207 * We use dma_unmap_page() regardless of how the buffers were
208 * mapped before they were submitted...
209 */
210 if (!(txd->flags & DMA_COMPL_SKIP_DEST_UNMAP))
211 dma_unmap_page(dwc->chan.dev.parent, desc->lli.dar, desc->len,
212 DMA_FROM_DEVICE);
213 if (!(txd->flags & DMA_COMPL_SKIP_SRC_UNMAP))
214 dma_unmap_page(dwc->chan.dev.parent, desc->lli.sar, desc->len,
215 DMA_TO_DEVICE);
216
217 /*
218 * The API requires that no submissions are done from a
219 * callback, so we don't need to drop the lock here
220 */
221 if (callback)
222 callback(param);
223}
224
225static void dwc_complete_all(struct dw_dma *dw, struct dw_dma_chan *dwc)
226{
227 struct dw_desc *desc, *_desc;
228 LIST_HEAD(list);
229
230 if (dma_readl(dw, CH_EN) & dwc->mask) {
231 dev_err(&dwc->chan.dev,
232 "BUG: XFER bit set, but channel not idle!\n");
233
234 /* Try to continue after resetting the channel... */
235 channel_clear_bit(dw, CH_EN, dwc->mask);
236 while (dma_readl(dw, CH_EN) & dwc->mask)
237 cpu_relax();
238 }
239
240 /*
241 * Submit queued descriptors ASAP, i.e. before we go through
242 * the completed ones.
243 */
244 if (!list_empty(&dwc->queue))
245 dwc_dostart(dwc, dwc_first_queued(dwc));
246 list_splice_init(&dwc->active_list, &list);
247 list_splice_init(&dwc->queue, &dwc->active_list);
248
249 list_for_each_entry_safe(desc, _desc, &list, desc_node)
250 dwc_descriptor_complete(dwc, desc);
251}
252
253static void dwc_scan_descriptors(struct dw_dma *dw, struct dw_dma_chan *dwc)
254{
255 dma_addr_t llp;
256 struct dw_desc *desc, *_desc;
257 struct dw_desc *child;
258 u32 status_xfer;
259
260 /*
261 * Clear block interrupt flag before scanning so that we don't
262 * miss any, and read LLP before RAW_XFER to ensure it is
263 * valid if we decide to scan the list.
264 */
265 dma_writel(dw, CLEAR.BLOCK, dwc->mask);
266 llp = channel_readl(dwc, LLP);
267 status_xfer = dma_readl(dw, RAW.XFER);
268
269 if (status_xfer & dwc->mask) {
270 /* Everything we've submitted is done */
271 dma_writel(dw, CLEAR.XFER, dwc->mask);
272 dwc_complete_all(dw, dwc);
273 return;
274 }
275
276 dev_vdbg(&dwc->chan.dev, "scan_descriptors: llp=0x%x\n", llp);
277
278 list_for_each_entry_safe(desc, _desc, &dwc->active_list, desc_node) {
279 if (desc->lli.llp == llp)
280 /* This one is currently in progress */
281 return;
282
283 list_for_each_entry(child, &desc->txd.tx_list, desc_node)
284 if (child->lli.llp == llp)
285 /* Currently in progress */
286 return;
287
288 /*
289 * No descriptors so far seem to be in progress, i.e.
290 * this one must be done.
291 */
292 dwc_descriptor_complete(dwc, desc);
293 }
294
295 dev_err(&dwc->chan.dev,
296 "BUG: All descriptors done, but channel not idle!\n");
297
298 /* Try to continue after resetting the channel... */
299 channel_clear_bit(dw, CH_EN, dwc->mask);
300 while (dma_readl(dw, CH_EN) & dwc->mask)
301 cpu_relax();
302
303 if (!list_empty(&dwc->queue)) {
304 dwc_dostart(dwc, dwc_first_queued(dwc));
305 list_splice_init(&dwc->queue, &dwc->active_list);
306 }
307}
308
309static void dwc_dump_lli(struct dw_dma_chan *dwc, struct dw_lli *lli)
310{
311 dev_printk(KERN_CRIT, &dwc->chan.dev,
312 " desc: s0x%x d0x%x l0x%x c0x%x:%x\n",
313 lli->sar, lli->dar, lli->llp,
314 lli->ctlhi, lli->ctllo);
315}
316
317static void dwc_handle_error(struct dw_dma *dw, struct dw_dma_chan *dwc)
318{
319 struct dw_desc *bad_desc;
320 struct dw_desc *child;
321
322 dwc_scan_descriptors(dw, dwc);
323
324 /*
325 * The descriptor currently at the head of the active list is
326 * borked. Since we don't have any way to report errors, we'll
327 * just have to scream loudly and try to carry on.
328 */
329 bad_desc = dwc_first_active(dwc);
330 list_del_init(&bad_desc->desc_node);
331 list_splice_init(&dwc->queue, dwc->active_list.prev);
332
333 /* Clear the error flag and try to restart the controller */
334 dma_writel(dw, CLEAR.ERROR, dwc->mask);
335 if (!list_empty(&dwc->active_list))
336 dwc_dostart(dwc, dwc_first_active(dwc));
337
338 /*
339 * KERN_CRITICAL may seem harsh, but since this only happens
340 * when someone submits a bad physical address in a
341 * descriptor, we should consider ourselves lucky that the
342 * controller flagged an error instead of scribbling over
343 * random memory locations.
344 */
345 dev_printk(KERN_CRIT, &dwc->chan.dev,
346 "Bad descriptor submitted for DMA!\n");
347 dev_printk(KERN_CRIT, &dwc->chan.dev,
348 " cookie: %d\n", bad_desc->txd.cookie);
349 dwc_dump_lli(dwc, &bad_desc->lli);
350 list_for_each_entry(child, &bad_desc->txd.tx_list, desc_node)
351 dwc_dump_lli(dwc, &child->lli);
352
353 /* Pretend the descriptor completed successfully */
354 dwc_descriptor_complete(dwc, bad_desc);
355}
356
357static void dw_dma_tasklet(unsigned long data)
358{
359 struct dw_dma *dw = (struct dw_dma *)data;
360 struct dw_dma_chan *dwc;
361 u32 status_block;
362 u32 status_xfer;
363 u32 status_err;
364 int i;
365
366 status_block = dma_readl(dw, RAW.BLOCK);
367 status_xfer = dma_readl(dw, RAW.BLOCK);
368 status_err = dma_readl(dw, RAW.ERROR);
369
370 dev_vdbg(dw->dma.dev, "tasklet: status_block=%x status_err=%x\n",
371 status_block, status_err);
372
373 for (i = 0; i < dw->dma.chancnt; i++) {
374 dwc = &dw->chan[i];
375 spin_lock(&dwc->lock);
376 if (status_err & (1 << i))
377 dwc_handle_error(dw, dwc);
378 else if ((status_block | status_xfer) & (1 << i))
379 dwc_scan_descriptors(dw, dwc);
380 spin_unlock(&dwc->lock);
381 }
382
383 /*
384 * Re-enable interrupts. Block Complete interrupts are only
385 * enabled if the INT_EN bit in the descriptor is set. This
386 * will trigger a scan before the whole list is done.
387 */
388 channel_set_bit(dw, MASK.XFER, dw->all_chan_mask);
389 channel_set_bit(dw, MASK.BLOCK, dw->all_chan_mask);
390 channel_set_bit(dw, MASK.ERROR, dw->all_chan_mask);
391}
392
393static irqreturn_t dw_dma_interrupt(int irq, void *dev_id)
394{
395 struct dw_dma *dw = dev_id;
396 u32 status;
397
398 dev_vdbg(dw->dma.dev, "interrupt: status=0x%x\n",
399 dma_readl(dw, STATUS_INT));
400
401 /*
402 * Just disable the interrupts. We'll turn them back on in the
403 * softirq handler.
404 */
405 channel_clear_bit(dw, MASK.XFER, dw->all_chan_mask);
406 channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask);
407 channel_clear_bit(dw, MASK.ERROR, dw->all_chan_mask);
408
409 status = dma_readl(dw, STATUS_INT);
410 if (status) {
411 dev_err(dw->dma.dev,
412 "BUG: Unexpected interrupts pending: 0x%x\n",
413 status);
414
415 /* Try to recover */
416 channel_clear_bit(dw, MASK.XFER, (1 << 8) - 1);
417 channel_clear_bit(dw, MASK.BLOCK, (1 << 8) - 1);
418 channel_clear_bit(dw, MASK.SRC_TRAN, (1 << 8) - 1);
419 channel_clear_bit(dw, MASK.DST_TRAN, (1 << 8) - 1);
420 channel_clear_bit(dw, MASK.ERROR, (1 << 8) - 1);
421 }
422
423 tasklet_schedule(&dw->tasklet);
424
425 return IRQ_HANDLED;
426}
427
428/*----------------------------------------------------------------------*/
429
430static dma_cookie_t dwc_tx_submit(struct dma_async_tx_descriptor *tx)
431{
432 struct dw_desc *desc = txd_to_dw_desc(tx);
433 struct dw_dma_chan *dwc = to_dw_dma_chan(tx->chan);
434 dma_cookie_t cookie;
435
436 spin_lock_bh(&dwc->lock);
437 cookie = dwc_assign_cookie(dwc, desc);
438
439 /*
440 * REVISIT: We should attempt to chain as many descriptors as
441 * possible, perhaps even appending to those already submitted
442 * for DMA. But this is hard to do in a race-free manner.
443 */
444 if (list_empty(&dwc->active_list)) {
445 dev_vdbg(&tx->chan->dev, "tx_submit: started %u\n",
446 desc->txd.cookie);
447 dwc_dostart(dwc, desc);
448 list_add_tail(&desc->desc_node, &dwc->active_list);
449 } else {
450 dev_vdbg(&tx->chan->dev, "tx_submit: queued %u\n",
451 desc->txd.cookie);
452
453 list_add_tail(&desc->desc_node, &dwc->queue);
454 }
455
456 spin_unlock_bh(&dwc->lock);
457
458 return cookie;
459}
460
461static struct dma_async_tx_descriptor *
462dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
463 size_t len, unsigned long flags)
464{
465 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
466 struct dw_desc *desc;
467 struct dw_desc *first;
468 struct dw_desc *prev;
469 size_t xfer_count;
470 size_t offset;
471 unsigned int src_width;
472 unsigned int dst_width;
473 u32 ctllo;
474
475 dev_vdbg(&chan->dev, "prep_dma_memcpy d0x%x s0x%x l0x%zx f0x%lx\n",
476 dest, src, len, flags);
477
478 if (unlikely(!len)) {
479 dev_dbg(&chan->dev, "prep_dma_memcpy: length is zero!\n");
480 return NULL;
481 }
482
483 /*
484 * We can be a lot more clever here, but this should take care
485 * of the most common optimization.
486 */
487 if (!((src | dest | len) & 3))
488 src_width = dst_width = 2;
489 else if (!((src | dest | len) & 1))
490 src_width = dst_width = 1;
491 else
492 src_width = dst_width = 0;
493
494 ctllo = DWC_DEFAULT_CTLLO
495 | DWC_CTLL_DST_WIDTH(dst_width)
496 | DWC_CTLL_SRC_WIDTH(src_width)
497 | DWC_CTLL_DST_INC
498 | DWC_CTLL_SRC_INC
499 | DWC_CTLL_FC_M2M;
500 prev = first = NULL;
501
502 for (offset = 0; offset < len; offset += xfer_count << src_width) {
503 xfer_count = min_t(size_t, (len - offset) >> src_width,
504 DWC_MAX_COUNT);
505
506 desc = dwc_desc_get(dwc);
507 if (!desc)
508 goto err_desc_get;
509
510 desc->lli.sar = src + offset;
511 desc->lli.dar = dest + offset;
512 desc->lli.ctllo = ctllo;
513 desc->lli.ctlhi = xfer_count;
514
515 if (!first) {
516 first = desc;
517 } else {
518 prev->lli.llp = desc->txd.phys;
519 dma_sync_single_for_device(chan->dev.parent,
520 prev->txd.phys, sizeof(prev->lli),
521 DMA_TO_DEVICE);
522 list_add_tail(&desc->desc_node,
523 &first->txd.tx_list);
524 }
525 prev = desc;
526 }
527
528
529 if (flags & DMA_PREP_INTERRUPT)
530 /* Trigger interrupt after last block */
531 prev->lli.ctllo |= DWC_CTLL_INT_EN;
532
533 prev->lli.llp = 0;
534 dma_sync_single_for_device(chan->dev.parent,
535 prev->txd.phys, sizeof(prev->lli),
536 DMA_TO_DEVICE);
537
538 first->txd.flags = flags;
539 first->len = len;
540
541 return &first->txd;
542
543err_desc_get:
544 dwc_desc_put(dwc, first);
545 return NULL;
546}
547
548static struct dma_async_tx_descriptor *
549dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
550 unsigned int sg_len, enum dma_data_direction direction,
551 unsigned long flags)
552{
553 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
554 struct dw_dma_slave *dws = dwc->dws;
555 struct dw_desc *prev;
556 struct dw_desc *first;
557 u32 ctllo;
558 dma_addr_t reg;
559 unsigned int reg_width;
560 unsigned int mem_width;
561 unsigned int i;
562 struct scatterlist *sg;
563 size_t total_len = 0;
564
565 dev_vdbg(&chan->dev, "prep_dma_slave\n");
566
567 if (unlikely(!dws || !sg_len))
568 return NULL;
569
570 reg_width = dws->slave.reg_width;
571 prev = first = NULL;
572
573 sg_len = dma_map_sg(chan->dev.parent, sgl, sg_len, direction);
574
575 switch (direction) {
576 case DMA_TO_DEVICE:
577 ctllo = (DWC_DEFAULT_CTLLO
578 | DWC_CTLL_DST_WIDTH(reg_width)
579 | DWC_CTLL_DST_FIX
580 | DWC_CTLL_SRC_INC
581 | DWC_CTLL_FC_M2P);
582 reg = dws->slave.tx_reg;
583 for_each_sg(sgl, sg, sg_len, i) {
584 struct dw_desc *desc;
585 u32 len;
586 u32 mem;
587
588 desc = dwc_desc_get(dwc);
589 if (!desc) {
590 dev_err(&chan->dev,
591 "not enough descriptors available\n");
592 goto err_desc_get;
593 }
594
595 mem = sg_phys(sg);
596 len = sg_dma_len(sg);
597 mem_width = 2;
598 if (unlikely(mem & 3 || len & 3))
599 mem_width = 0;
600
601 desc->lli.sar = mem;
602 desc->lli.dar = reg;
603 desc->lli.ctllo = ctllo | DWC_CTLL_SRC_WIDTH(mem_width);
604 desc->lli.ctlhi = len >> mem_width;
605
606 if (!first) {
607 first = desc;
608 } else {
609 prev->lli.llp = desc->txd.phys;
610 dma_sync_single_for_device(chan->dev.parent,
611 prev->txd.phys,
612 sizeof(prev->lli),
613 DMA_TO_DEVICE);
614 list_add_tail(&desc->desc_node,
615 &first->txd.tx_list);
616 }
617 prev = desc;
618 total_len += len;
619 }
620 break;
621 case DMA_FROM_DEVICE:
622 ctllo = (DWC_DEFAULT_CTLLO
623 | DWC_CTLL_SRC_WIDTH(reg_width)
624 | DWC_CTLL_DST_INC
625 | DWC_CTLL_SRC_FIX
626 | DWC_CTLL_FC_P2M);
627
628 reg = dws->slave.rx_reg;
629 for_each_sg(sgl, sg, sg_len, i) {
630 struct dw_desc *desc;
631 u32 len;
632 u32 mem;
633
634 desc = dwc_desc_get(dwc);
635 if (!desc) {
636 dev_err(&chan->dev,
637 "not enough descriptors available\n");
638 goto err_desc_get;
639 }
640
641 mem = sg_phys(sg);
642 len = sg_dma_len(sg);
643 mem_width = 2;
644 if (unlikely(mem & 3 || len & 3))
645 mem_width = 0;
646
647 desc->lli.sar = reg;
648 desc->lli.dar = mem;
649 desc->lli.ctllo = ctllo | DWC_CTLL_DST_WIDTH(mem_width);
650 desc->lli.ctlhi = len >> reg_width;
651
652 if (!first) {
653 first = desc;
654 } else {
655 prev->lli.llp = desc->txd.phys;
656 dma_sync_single_for_device(chan->dev.parent,
657 prev->txd.phys,
658 sizeof(prev->lli),
659 DMA_TO_DEVICE);
660 list_add_tail(&desc->desc_node,
661 &first->txd.tx_list);
662 }
663 prev = desc;
664 total_len += len;
665 }
666 break;
667 default:
668 return NULL;
669 }
670
671 if (flags & DMA_PREP_INTERRUPT)
672 /* Trigger interrupt after last block */
673 prev->lli.ctllo |= DWC_CTLL_INT_EN;
674
675 prev->lli.llp = 0;
676 dma_sync_single_for_device(chan->dev.parent,
677 prev->txd.phys, sizeof(prev->lli),
678 DMA_TO_DEVICE);
679
680 first->len = total_len;
681
682 return &first->txd;
683
684err_desc_get:
685 dwc_desc_put(dwc, first);
686 return NULL;
687}
688
689static void dwc_terminate_all(struct dma_chan *chan)
690{
691 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
692 struct dw_dma *dw = to_dw_dma(chan->device);
693 struct dw_desc *desc, *_desc;
694 LIST_HEAD(list);
695
696 /*
697 * This is only called when something went wrong elsewhere, so
698 * we don't really care about the data. Just disable the
699 * channel. We still have to poll the channel enable bit due
700 * to AHB/HSB limitations.
701 */
702 spin_lock_bh(&dwc->lock);
703
704 channel_clear_bit(dw, CH_EN, dwc->mask);
705
706 while (dma_readl(dw, CH_EN) & dwc->mask)
707 cpu_relax();
708
709 /* active_list entries will end up before queued entries */
710 list_splice_init(&dwc->queue, &list);
711 list_splice_init(&dwc->active_list, &list);
712
713 spin_unlock_bh(&dwc->lock);
714
715 /* Flush all pending and queued descriptors */
716 list_for_each_entry_safe(desc, _desc, &list, desc_node)
717 dwc_descriptor_complete(dwc, desc);
718}
719
720static enum dma_status
721dwc_is_tx_complete(struct dma_chan *chan,
722 dma_cookie_t cookie,
723 dma_cookie_t *done, dma_cookie_t *used)
724{
725 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
726 dma_cookie_t last_used;
727 dma_cookie_t last_complete;
728 int ret;
729
730 last_complete = dwc->completed;
731 last_used = chan->cookie;
732
733 ret = dma_async_is_complete(cookie, last_complete, last_used);
734 if (ret != DMA_SUCCESS) {
735 dwc_scan_descriptors(to_dw_dma(chan->device), dwc);
736
737 last_complete = dwc->completed;
738 last_used = chan->cookie;
739
740 ret = dma_async_is_complete(cookie, last_complete, last_used);
741 }
742
743 if (done)
744 *done = last_complete;
745 if (used)
746 *used = last_used;
747
748 return ret;
749}
750
751static void dwc_issue_pending(struct dma_chan *chan)
752{
753 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
754
755 spin_lock_bh(&dwc->lock);
756 if (!list_empty(&dwc->queue))
757 dwc_scan_descriptors(to_dw_dma(chan->device), dwc);
758 spin_unlock_bh(&dwc->lock);
759}
760
761static int dwc_alloc_chan_resources(struct dma_chan *chan,
762 struct dma_client *client)
763{
764 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
765 struct dw_dma *dw = to_dw_dma(chan->device);
766 struct dw_desc *desc;
767 struct dma_slave *slave;
768 struct dw_dma_slave *dws;
769 int i;
770 u32 cfghi;
771 u32 cfglo;
772
773 dev_vdbg(&chan->dev, "alloc_chan_resources\n");
774
775 /* Channels doing slave DMA can only handle one client. */
776 if (dwc->dws || client->slave) {
777 if (chan->client_count)
778 return -EBUSY;
779 }
780
781 /* ASSERT: channel is idle */
782 if (dma_readl(dw, CH_EN) & dwc->mask) {
783 dev_dbg(&chan->dev, "DMA channel not idle?\n");
784 return -EIO;
785 }
786
787 dwc->completed = chan->cookie = 1;
788
789 cfghi = DWC_CFGH_FIFO_MODE;
790 cfglo = 0;
791
792 slave = client->slave;
793 if (slave) {
794 /*
795 * We need controller-specific data to set up slave
796 * transfers.
797 */
798 BUG_ON(!slave->dma_dev || slave->dma_dev != dw->dma.dev);
799
800 dws = container_of(slave, struct dw_dma_slave, slave);
801
802 dwc->dws = dws;
803 cfghi = dws->cfg_hi;
804 cfglo = dws->cfg_lo;
805 } else {
806 dwc->dws = NULL;
807 }
808
809 channel_writel(dwc, CFG_LO, cfglo);
810 channel_writel(dwc, CFG_HI, cfghi);
811
812 /*
813 * NOTE: some controllers may have additional features that we
814 * need to initialize here, like "scatter-gather" (which
815 * doesn't mean what you think it means), and status writeback.
816 */
817
818 spin_lock_bh(&dwc->lock);
819 i = dwc->descs_allocated;
820 while (dwc->descs_allocated < NR_DESCS_PER_CHANNEL) {
821 spin_unlock_bh(&dwc->lock);
822
823 desc = kzalloc(sizeof(struct dw_desc), GFP_KERNEL);
824 if (!desc) {
825 dev_info(&chan->dev,
826 "only allocated %d descriptors\n", i);
827 spin_lock_bh(&dwc->lock);
828 break;
829 }
830
831 dma_async_tx_descriptor_init(&desc->txd, chan);
832 desc->txd.tx_submit = dwc_tx_submit;
833 desc->txd.flags = DMA_CTRL_ACK;
834 INIT_LIST_HEAD(&desc->txd.tx_list);
835 desc->txd.phys = dma_map_single(chan->dev.parent, &desc->lli,
836 sizeof(desc->lli), DMA_TO_DEVICE);
837 dwc_desc_put(dwc, desc);
838
839 spin_lock_bh(&dwc->lock);
840 i = ++dwc->descs_allocated;
841 }
842
843 /* Enable interrupts */
844 channel_set_bit(dw, MASK.XFER, dwc->mask);
845 channel_set_bit(dw, MASK.BLOCK, dwc->mask);
846 channel_set_bit(dw, MASK.ERROR, dwc->mask);
847
848 spin_unlock_bh(&dwc->lock);
849
850 dev_dbg(&chan->dev,
851 "alloc_chan_resources allocated %d descriptors\n", i);
852
853 return i;
854}
855
856static void dwc_free_chan_resources(struct dma_chan *chan)
857{
858 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
859 struct dw_dma *dw = to_dw_dma(chan->device);
860 struct dw_desc *desc, *_desc;
861 LIST_HEAD(list);
862
863 dev_dbg(&chan->dev, "free_chan_resources (descs allocated=%u)\n",
864 dwc->descs_allocated);
865
866 /* ASSERT: channel is idle */
867 BUG_ON(!list_empty(&dwc->active_list));
868 BUG_ON(!list_empty(&dwc->queue));
869 BUG_ON(dma_readl(to_dw_dma(chan->device), CH_EN) & dwc->mask);
870
871 spin_lock_bh(&dwc->lock);
872 list_splice_init(&dwc->free_list, &list);
873 dwc->descs_allocated = 0;
874 dwc->dws = NULL;
875
876 /* Disable interrupts */
877 channel_clear_bit(dw, MASK.XFER, dwc->mask);
878 channel_clear_bit(dw, MASK.BLOCK, dwc->mask);
879 channel_clear_bit(dw, MASK.ERROR, dwc->mask);
880
881 spin_unlock_bh(&dwc->lock);
882
883 list_for_each_entry_safe(desc, _desc, &list, desc_node) {
884 dev_vdbg(&chan->dev, " freeing descriptor %p\n", desc);
885 dma_unmap_single(chan->dev.parent, desc->txd.phys,
886 sizeof(desc->lli), DMA_TO_DEVICE);
887 kfree(desc);
888 }
889
890 dev_vdbg(&chan->dev, "free_chan_resources done\n");
891}
892
893/*----------------------------------------------------------------------*/
894
895static void dw_dma_off(struct dw_dma *dw)
896{
897 dma_writel(dw, CFG, 0);
898
899 channel_clear_bit(dw, MASK.XFER, dw->all_chan_mask);
900 channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask);
901 channel_clear_bit(dw, MASK.SRC_TRAN, dw->all_chan_mask);
902 channel_clear_bit(dw, MASK.DST_TRAN, dw->all_chan_mask);
903 channel_clear_bit(dw, MASK.ERROR, dw->all_chan_mask);
904
905 while (dma_readl(dw, CFG) & DW_CFG_DMA_EN)
906 cpu_relax();
907}
908
909static int __init dw_probe(struct platform_device *pdev)
910{
911 struct dw_dma_platform_data *pdata;
912 struct resource *io;
913 struct dw_dma *dw;
914 size_t size;
915 int irq;
916 int err;
917 int i;
918
919 pdata = pdev->dev.platform_data;
920 if (!pdata || pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS)
921 return -EINVAL;
922
923 io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
924 if (!io)
925 return -EINVAL;
926
927 irq = platform_get_irq(pdev, 0);
928 if (irq < 0)
929 return irq;
930
931 size = sizeof(struct dw_dma);
932 size += pdata->nr_channels * sizeof(struct dw_dma_chan);
933 dw = kzalloc(size, GFP_KERNEL);
934 if (!dw)
935 return -ENOMEM;
936
937 if (!request_mem_region(io->start, DW_REGLEN, pdev->dev.driver->name)) {
938 err = -EBUSY;
939 goto err_kfree;
940 }
941
942 memset(dw, 0, sizeof *dw);
943
944 dw->regs = ioremap(io->start, DW_REGLEN);
945 if (!dw->regs) {
946 err = -ENOMEM;
947 goto err_release_r;
948 }
949
950 dw->clk = clk_get(&pdev->dev, "hclk");
951 if (IS_ERR(dw->clk)) {
952 err = PTR_ERR(dw->clk);
953 goto err_clk;
954 }
955 clk_enable(dw->clk);
956
957 /* force dma off, just in case */
958 dw_dma_off(dw);
959
960 err = request_irq(irq, dw_dma_interrupt, 0, "dw_dmac", dw);
961 if (err)
962 goto err_irq;
963
964 platform_set_drvdata(pdev, dw);
965
966 tasklet_init(&dw->tasklet, dw_dma_tasklet, (unsigned long)dw);
967
968 dw->all_chan_mask = (1 << pdata->nr_channels) - 1;
969
970 INIT_LIST_HEAD(&dw->dma.channels);
971 for (i = 0; i < pdata->nr_channels; i++, dw->dma.chancnt++) {
972 struct dw_dma_chan *dwc = &dw->chan[i];
973
974 dwc->chan.device = &dw->dma;
975 dwc->chan.cookie = dwc->completed = 1;
976 dwc->chan.chan_id = i;
977 list_add_tail(&dwc->chan.device_node, &dw->dma.channels);
978
979 dwc->ch_regs = &__dw_regs(dw)->CHAN[i];
980 spin_lock_init(&dwc->lock);
981 dwc->mask = 1 << i;
982
983 INIT_LIST_HEAD(&dwc->active_list);
984 INIT_LIST_HEAD(&dwc->queue);
985 INIT_LIST_HEAD(&dwc->free_list);
986
987 channel_clear_bit(dw, CH_EN, dwc->mask);
988 }
989
990 /* Clear/disable all interrupts on all channels. */
991 dma_writel(dw, CLEAR.XFER, dw->all_chan_mask);
992 dma_writel(dw, CLEAR.BLOCK, dw->all_chan_mask);
993 dma_writel(dw, CLEAR.SRC_TRAN, dw->all_chan_mask);
994 dma_writel(dw, CLEAR.DST_TRAN, dw->all_chan_mask);
995 dma_writel(dw, CLEAR.ERROR, dw->all_chan_mask);
996
997 channel_clear_bit(dw, MASK.XFER, dw->all_chan_mask);
998 channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask);
999 channel_clear_bit(dw, MASK.SRC_TRAN, dw->all_chan_mask);
1000 channel_clear_bit(dw, MASK.DST_TRAN, dw->all_chan_mask);
1001 channel_clear_bit(dw, MASK.ERROR, dw->all_chan_mask);
1002
1003 dma_cap_set(DMA_MEMCPY, dw->dma.cap_mask);
1004 dma_cap_set(DMA_SLAVE, dw->dma.cap_mask);
1005 dw->dma.dev = &pdev->dev;
1006 dw->dma.device_alloc_chan_resources = dwc_alloc_chan_resources;
1007 dw->dma.device_free_chan_resources = dwc_free_chan_resources;
1008
1009 dw->dma.device_prep_dma_memcpy = dwc_prep_dma_memcpy;
1010
1011 dw->dma.device_prep_slave_sg = dwc_prep_slave_sg;
1012 dw->dma.device_terminate_all = dwc_terminate_all;
1013
1014 dw->dma.device_is_tx_complete = dwc_is_tx_complete;
1015 dw->dma.device_issue_pending = dwc_issue_pending;
1016
1017 dma_writel(dw, CFG, DW_CFG_DMA_EN);
1018
1019 printk(KERN_INFO "%s: DesignWare DMA Controller, %d channels\n",
1020 pdev->dev.bus_id, dw->dma.chancnt);
1021
1022 dma_async_device_register(&dw->dma);
1023
1024 return 0;
1025
1026err_irq:
1027 clk_disable(dw->clk);
1028 clk_put(dw->clk);
1029err_clk:
1030 iounmap(dw->regs);
1031 dw->regs = NULL;
1032err_release_r:
1033 release_resource(io);
1034err_kfree:
1035 kfree(dw);
1036 return err;
1037}
1038
1039static int __exit dw_remove(struct platform_device *pdev)
1040{
1041 struct dw_dma *dw = platform_get_drvdata(pdev);
1042 struct dw_dma_chan *dwc, *_dwc;
1043 struct resource *io;
1044
1045 dw_dma_off(dw);
1046 dma_async_device_unregister(&dw->dma);
1047
1048 free_irq(platform_get_irq(pdev, 0), dw);
1049 tasklet_kill(&dw->tasklet);
1050
1051 list_for_each_entry_safe(dwc, _dwc, &dw->dma.channels,
1052 chan.device_node) {
1053 list_del(&dwc->chan.device_node);
1054 channel_clear_bit(dw, CH_EN, dwc->mask);
1055 }
1056
1057 clk_disable(dw->clk);
1058 clk_put(dw->clk);
1059
1060 iounmap(dw->regs);
1061 dw->regs = NULL;
1062
1063 io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1064 release_mem_region(io->start, DW_REGLEN);
1065
1066 kfree(dw);
1067
1068 return 0;
1069}
1070
1071static void dw_shutdown(struct platform_device *pdev)
1072{
1073 struct dw_dma *dw = platform_get_drvdata(pdev);
1074
1075 dw_dma_off(platform_get_drvdata(pdev));
1076 clk_disable(dw->clk);
1077}
1078
1079static int dw_suspend_late(struct platform_device *pdev, pm_message_t mesg)
1080{
1081 struct dw_dma *dw = platform_get_drvdata(pdev);
1082
1083 dw_dma_off(platform_get_drvdata(pdev));
1084 clk_disable(dw->clk);
1085 return 0;
1086}
1087
1088static int dw_resume_early(struct platform_device *pdev)
1089{
1090 struct dw_dma *dw = platform_get_drvdata(pdev);
1091
1092 clk_enable(dw->clk);
1093 dma_writel(dw, CFG, DW_CFG_DMA_EN);
1094 return 0;
1095
1096}
1097
1098static struct platform_driver dw_driver = {
1099 .remove = __exit_p(dw_remove),
1100 .shutdown = dw_shutdown,
1101 .suspend_late = dw_suspend_late,
1102 .resume_early = dw_resume_early,
1103 .driver = {
1104 .name = "dw_dmac",
1105 },
1106};
1107
1108static int __init dw_init(void)
1109{
1110 return platform_driver_probe(&dw_driver, dw_probe);
1111}
1112module_init(dw_init);
1113
1114static void __exit dw_exit(void)
1115{
1116 platform_driver_unregister(&dw_driver);
1117}
1118module_exit(dw_exit);
1119
1120MODULE_LICENSE("GPL v2");
1121MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller driver");
1122MODULE_AUTHOR("Haavard Skinnemoen <haavard.skinnemoen@atmel.com>");
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
new file mode 100644
index 000000000000..00fdd187bb0c
--- /dev/null
+++ b/drivers/dma/dw_dmac_regs.h
@@ -0,0 +1,225 @@
1/*
2 * Driver for the Synopsys DesignWare AHB DMA Controller
3 *
4 * Copyright (C) 2005-2007 Atmel Corporation
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/dw_dmac.h>
12
13#define DW_DMA_MAX_NR_CHANNELS 8
14
15/*
16 * Redefine this macro to handle differences between 32- and 64-bit
17 * addressing, big vs. little endian, etc.
18 */
19#define DW_REG(name) u32 name; u32 __pad_##name
20
21/* Hardware register definitions. */
22struct dw_dma_chan_regs {
23 DW_REG(SAR); /* Source Address Register */
24 DW_REG(DAR); /* Destination Address Register */
25 DW_REG(LLP); /* Linked List Pointer */
26 u32 CTL_LO; /* Control Register Low */
27 u32 CTL_HI; /* Control Register High */
28 DW_REG(SSTAT);
29 DW_REG(DSTAT);
30 DW_REG(SSTATAR);
31 DW_REG(DSTATAR);
32 u32 CFG_LO; /* Configuration Register Low */
33 u32 CFG_HI; /* Configuration Register High */
34 DW_REG(SGR);
35 DW_REG(DSR);
36};
37
38struct dw_dma_irq_regs {
39 DW_REG(XFER);
40 DW_REG(BLOCK);
41 DW_REG(SRC_TRAN);
42 DW_REG(DST_TRAN);
43 DW_REG(ERROR);
44};
45
46struct dw_dma_regs {
47 /* per-channel registers */
48 struct dw_dma_chan_regs CHAN[DW_DMA_MAX_NR_CHANNELS];
49
50 /* irq handling */
51 struct dw_dma_irq_regs RAW; /* r */
52 struct dw_dma_irq_regs STATUS; /* r (raw & mask) */
53 struct dw_dma_irq_regs MASK; /* rw (set = irq enabled) */
54 struct dw_dma_irq_regs CLEAR; /* w (ack, affects "raw") */
55
56 DW_REG(STATUS_INT); /* r */
57
58 /* software handshaking */
59 DW_REG(REQ_SRC);
60 DW_REG(REQ_DST);
61 DW_REG(SGL_REQ_SRC);
62 DW_REG(SGL_REQ_DST);
63 DW_REG(LAST_SRC);
64 DW_REG(LAST_DST);
65
66 /* miscellaneous */
67 DW_REG(CFG);
68 DW_REG(CH_EN);
69 DW_REG(ID);
70 DW_REG(TEST);
71
72 /* optional encoded params, 0x3c8..0x3 */
73};
74
75/* Bitfields in CTL_LO */
76#define DWC_CTLL_INT_EN (1 << 0) /* irqs enabled? */
77#define DWC_CTLL_DST_WIDTH(n) ((n)<<1) /* bytes per element */
78#define DWC_CTLL_SRC_WIDTH(n) ((n)<<4)
79#define DWC_CTLL_DST_INC (0<<7) /* DAR update/not */
80#define DWC_CTLL_DST_DEC (1<<7)
81#define DWC_CTLL_DST_FIX (2<<7)
82#define DWC_CTLL_SRC_INC (0<<7) /* SAR update/not */
83#define DWC_CTLL_SRC_DEC (1<<9)
84#define DWC_CTLL_SRC_FIX (2<<9)
85#define DWC_CTLL_DST_MSIZE(n) ((n)<<11) /* burst, #elements */
86#define DWC_CTLL_SRC_MSIZE(n) ((n)<<14)
87#define DWC_CTLL_S_GATH_EN (1 << 17) /* src gather, !FIX */
88#define DWC_CTLL_D_SCAT_EN (1 << 18) /* dst scatter, !FIX */
89#define DWC_CTLL_FC_M2M (0 << 20) /* mem-to-mem */
90#define DWC_CTLL_FC_M2P (1 << 20) /* mem-to-periph */
91#define DWC_CTLL_FC_P2M (2 << 20) /* periph-to-mem */
92#define DWC_CTLL_FC_P2P (3 << 20) /* periph-to-periph */
93/* plus 4 transfer types for peripheral-as-flow-controller */
94#define DWC_CTLL_DMS(n) ((n)<<23) /* dst master select */
95#define DWC_CTLL_SMS(n) ((n)<<25) /* src master select */
96#define DWC_CTLL_LLP_D_EN (1 << 27) /* dest block chain */
97#define DWC_CTLL_LLP_S_EN (1 << 28) /* src block chain */
98
99/* Bitfields in CTL_HI */
100#define DWC_CTLH_DONE 0x00001000
101#define DWC_CTLH_BLOCK_TS_MASK 0x00000fff
102
103/* Bitfields in CFG_LO. Platform-configurable bits are in <linux/dw_dmac.h> */
104#define DWC_CFGL_CH_SUSP (1 << 8) /* pause xfer */
105#define DWC_CFGL_FIFO_EMPTY (1 << 9) /* pause xfer */
106#define DWC_CFGL_HS_DST (1 << 10) /* handshake w/dst */
107#define DWC_CFGL_HS_SRC (1 << 11) /* handshake w/src */
108#define DWC_CFGL_MAX_BURST(x) ((x) << 20)
109#define DWC_CFGL_RELOAD_SAR (1 << 30)
110#define DWC_CFGL_RELOAD_DAR (1 << 31)
111
112/* Bitfields in CFG_HI. Platform-configurable bits are in <linux/dw_dmac.h> */
113#define DWC_CFGH_DS_UPD_EN (1 << 5)
114#define DWC_CFGH_SS_UPD_EN (1 << 6)
115
116/* Bitfields in SGR */
117#define DWC_SGR_SGI(x) ((x) << 0)
118#define DWC_SGR_SGC(x) ((x) << 20)
119
120/* Bitfields in DSR */
121#define DWC_DSR_DSI(x) ((x) << 0)
122#define DWC_DSR_DSC(x) ((x) << 20)
123
124/* Bitfields in CFG */
125#define DW_CFG_DMA_EN (1 << 0)
126
127#define DW_REGLEN 0x400
128
129struct dw_dma_chan {
130 struct dma_chan chan;
131 void __iomem *ch_regs;
132 u8 mask;
133
134 spinlock_t lock;
135
136 /* these other elements are all protected by lock */
137 dma_cookie_t completed;
138 struct list_head active_list;
139 struct list_head queue;
140 struct list_head free_list;
141
142 struct dw_dma_slave *dws;
143
144 unsigned int descs_allocated;
145};
146
147static inline struct dw_dma_chan_regs __iomem *
148__dwc_regs(struct dw_dma_chan *dwc)
149{
150 return dwc->ch_regs;
151}
152
153#define channel_readl(dwc, name) \
154 __raw_readl(&(__dwc_regs(dwc)->name))
155#define channel_writel(dwc, name, val) \
156 __raw_writel((val), &(__dwc_regs(dwc)->name))
157
158static inline struct dw_dma_chan *to_dw_dma_chan(struct dma_chan *chan)
159{
160 return container_of(chan, struct dw_dma_chan, chan);
161}
162
163
164struct dw_dma {
165 struct dma_device dma;
166 void __iomem *regs;
167 struct tasklet_struct tasklet;
168 struct clk *clk;
169
170 u8 all_chan_mask;
171
172 struct dw_dma_chan chan[0];
173};
174
175static inline struct dw_dma_regs __iomem *__dw_regs(struct dw_dma *dw)
176{
177 return dw->regs;
178}
179
180#define dma_readl(dw, name) \
181 __raw_readl(&(__dw_regs(dw)->name))
182#define dma_writel(dw, name, val) \
183 __raw_writel((val), &(__dw_regs(dw)->name))
184
185#define channel_set_bit(dw, reg, mask) \
186 dma_writel(dw, reg, ((mask) << 8) | (mask))
187#define channel_clear_bit(dw, reg, mask) \
188 dma_writel(dw, reg, ((mask) << 8) | 0)
189
190static inline struct dw_dma *to_dw_dma(struct dma_device *ddev)
191{
192 return container_of(ddev, struct dw_dma, dma);
193}
194
195/* LLI == Linked List Item; a.k.a. DMA block descriptor */
196struct dw_lli {
197 /* values that are not changed by hardware */
198 dma_addr_t sar;
199 dma_addr_t dar;
200 dma_addr_t llp; /* chain to next lli */
201 u32 ctllo;
202 /* values that may get written back: */
203 u32 ctlhi;
204 /* sstat and dstat can snapshot peripheral register state.
205 * silicon config may discard either or both...
206 */
207 u32 sstat;
208 u32 dstat;
209};
210
211struct dw_desc {
212 /* FIRST values the hardware uses */
213 struct dw_lli lli;
214
215 /* THEN values for driver housekeeping */
216 struct list_head desc_node;
217 struct dma_async_tx_descriptor txd;
218 size_t len;
219};
220
221static inline struct dw_desc *
222txd_to_dw_desc(struct dma_async_tx_descriptor *txd)
223{
224 return container_of(txd, struct dw_desc, txd);
225}
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 054eabffc185..c0059ca58340 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -366,7 +366,8 @@ static struct fsl_desc_sw *fsl_dma_alloc_descriptor(
366 * 366 *
367 * Return - The number of descriptors allocated. 367 * Return - The number of descriptors allocated.
368 */ 368 */
369static int fsl_dma_alloc_chan_resources(struct dma_chan *chan) 369static int fsl_dma_alloc_chan_resources(struct dma_chan *chan,
370 struct dma_client *client)
370{ 371{
371 struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); 372 struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan);
372 LIST_HEAD(tmp_list); 373 LIST_HEAD(tmp_list);
@@ -809,8 +810,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
809 if (!src) { 810 if (!src) {
810 dev_err(fsl_chan->dev, 811 dev_err(fsl_chan->dev,
811 "selftest: Cannot alloc memory for test!\n"); 812 "selftest: Cannot alloc memory for test!\n");
812 err = -ENOMEM; 813 return -ENOMEM;
813 goto out;
814 } 814 }
815 815
816 dest = src + test_size; 816 dest = src + test_size;
@@ -820,7 +820,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
820 820
821 chan = &fsl_chan->common; 821 chan = &fsl_chan->common;
822 822
823 if (fsl_dma_alloc_chan_resources(chan) < 1) { 823 if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) {
824 dev_err(fsl_chan->dev, 824 dev_err(fsl_chan->dev,
825 "selftest: Cannot alloc resources for DMA\n"); 825 "selftest: Cannot alloc resources for DMA\n");
826 err = -ENODEV; 826 err = -ENODEV;
@@ -842,13 +842,13 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
842 if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { 842 if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) {
843 dev_err(fsl_chan->dev, "selftest: Time out!\n"); 843 dev_err(fsl_chan->dev, "selftest: Time out!\n");
844 err = -ENODEV; 844 err = -ENODEV;
845 goto out; 845 goto free_resources;
846 } 846 }
847 847
848 /* Test free and re-alloc channel resources */ 848 /* Test free and re-alloc channel resources */
849 fsl_dma_free_chan_resources(chan); 849 fsl_dma_free_chan_resources(chan);
850 850
851 if (fsl_dma_alloc_chan_resources(chan) < 1) { 851 if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) {
852 dev_err(fsl_chan->dev, 852 dev_err(fsl_chan->dev,
853 "selftest: Cannot alloc resources for DMA\n"); 853 "selftest: Cannot alloc resources for DMA\n");
854 err = -ENODEV; 854 err = -ENODEV;
@@ -927,8 +927,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
927 if (!new_fsl_chan) { 927 if (!new_fsl_chan) {
928 dev_err(&dev->dev, "No free memory for allocating " 928 dev_err(&dev->dev, "No free memory for allocating "
929 "dma channels!\n"); 929 "dma channels!\n");
930 err = -ENOMEM; 930 return -ENOMEM;
931 goto err;
932 } 931 }
933 932
934 /* get dma channel register base */ 933 /* get dma channel register base */
@@ -936,7 +935,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
936 if (err) { 935 if (err) {
937 dev_err(&dev->dev, "Can't get %s property 'reg'\n", 936 dev_err(&dev->dev, "Can't get %s property 'reg'\n",
938 dev->node->full_name); 937 dev->node->full_name);
939 goto err; 938 goto err_no_reg;
940 } 939 }
941 940
942 new_fsl_chan->feature = *(u32 *)match->data; 941 new_fsl_chan->feature = *(u32 *)match->data;
@@ -958,7 +957,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
958 dev_err(&dev->dev, "There is no %d channel!\n", 957 dev_err(&dev->dev, "There is no %d channel!\n",
959 new_fsl_chan->id); 958 new_fsl_chan->id);
960 err = -EINVAL; 959 err = -EINVAL;
961 goto err; 960 goto err_no_chan;
962 } 961 }
963 fdev->chan[new_fsl_chan->id] = new_fsl_chan; 962 fdev->chan[new_fsl_chan->id] = new_fsl_chan;
964 tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet, 963 tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet,
@@ -997,23 +996,26 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
997 if (err) { 996 if (err) {
998 dev_err(&dev->dev, "DMA channel %s request_irq error " 997 dev_err(&dev->dev, "DMA channel %s request_irq error "
999 "with return %d\n", dev->node->full_name, err); 998 "with return %d\n", dev->node->full_name, err);
1000 goto err; 999 goto err_no_irq;
1001 } 1000 }
1002 } 1001 }
1003 1002
1004 err = fsl_dma_self_test(new_fsl_chan); 1003 err = fsl_dma_self_test(new_fsl_chan);
1005 if (err) 1004 if (err)
1006 goto err; 1005 goto err_self_test;
1007 1006
1008 dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id, 1007 dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id,
1009 match->compatible, new_fsl_chan->irq); 1008 match->compatible, new_fsl_chan->irq);
1010 1009
1011 return 0; 1010 return 0;
1012err: 1011
1013 dma_halt(new_fsl_chan); 1012err_self_test:
1014 iounmap(new_fsl_chan->reg_base);
1015 free_irq(new_fsl_chan->irq, new_fsl_chan); 1013 free_irq(new_fsl_chan->irq, new_fsl_chan);
1014err_no_irq:
1016 list_del(&new_fsl_chan->common.device_node); 1015 list_del(&new_fsl_chan->common.device_node);
1016err_no_chan:
1017 iounmap(new_fsl_chan->reg_base);
1018err_no_reg:
1017 kfree(new_fsl_chan); 1019 kfree(new_fsl_chan);
1018 return err; 1020 return err;
1019} 1021}
@@ -1054,8 +1056,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
1054 fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL); 1056 fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL);
1055 if (!fdev) { 1057 if (!fdev) {
1056 dev_err(&dev->dev, "No enough memory for 'priv'\n"); 1058 dev_err(&dev->dev, "No enough memory for 'priv'\n");
1057 err = -ENOMEM; 1059 return -ENOMEM;
1058 goto err;
1059 } 1060 }
1060 fdev->dev = &dev->dev; 1061 fdev->dev = &dev->dev;
1061 INIT_LIST_HEAD(&fdev->common.channels); 1062 INIT_LIST_HEAD(&fdev->common.channels);
@@ -1065,7 +1066,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
1065 if (err) { 1066 if (err) {
1066 dev_err(&dev->dev, "Can't get %s property 'reg'\n", 1067 dev_err(&dev->dev, "Can't get %s property 'reg'\n",
1067 dev->node->full_name); 1068 dev->node->full_name);
1068 goto err; 1069 goto err_no_reg;
1069 } 1070 }
1070 1071
1071 dev_info(&dev->dev, "Probe the Freescale DMA driver for %s " 1072 dev_info(&dev->dev, "Probe the Freescale DMA driver for %s "
@@ -1103,6 +1104,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
1103 1104
1104err: 1105err:
1105 iounmap(fdev->reg_base); 1106 iounmap(fdev->reg_base);
1107err_no_reg:
1106 kfree(fdev); 1108 kfree(fdev);
1107 return err; 1109 return err;
1108} 1110}
diff --git a/drivers/dma/ioat.c b/drivers/dma/ioat.c
index 16e0fd8facfb..9b16a3af9a0a 100644
--- a/drivers/dma/ioat.c
+++ b/drivers/dma/ioat.c
@@ -47,6 +47,16 @@ static struct pci_device_id ioat_pci_tbl[] = {
47 47
48 /* I/OAT v2 platforms */ 48 /* I/OAT v2 platforms */
49 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB) }, 49 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB) },
50
51 /* I/OAT v3 platforms */
52 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG0) },
53 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG1) },
54 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG2) },
55 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG3) },
56 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG4) },
57 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG5) },
58 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG6) },
59 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG7) },
50 { 0, } 60 { 0, }
51}; 61};
52 62
@@ -83,6 +93,11 @@ static int ioat_setup_functionality(struct pci_dev *pdev, void __iomem *iobase)
83 if (device->dma && ioat_dca_enabled) 93 if (device->dma && ioat_dca_enabled)
84 device->dca = ioat2_dca_init(pdev, iobase); 94 device->dca = ioat2_dca_init(pdev, iobase);
85 break; 95 break;
96 case IOAT_VER_3_0:
97 device->dma = ioat_dma_probe(pdev, iobase);
98 if (device->dma && ioat_dca_enabled)
99 device->dca = ioat3_dca_init(pdev, iobase);
100 break;
86 default: 101 default:
87 err = -ENODEV; 102 err = -ENODEV;
88 break; 103 break;
diff --git a/drivers/dma/ioat_dca.c b/drivers/dma/ioat_dca.c
index 9e922760b7ff..6cf622da0286 100644
--- a/drivers/dma/ioat_dca.c
+++ b/drivers/dma/ioat_dca.c
@@ -37,12 +37,18 @@
37#include "ioatdma_registers.h" 37#include "ioatdma_registers.h"
38 38
39/* 39/*
40 * Bit 16 of a tag map entry is the "valid" bit, if it is set then bits 0:15 40 * Bit 7 of a tag map entry is the "valid" bit, if it is set then bits 0:6
41 * contain the bit number of the APIC ID to map into the DCA tag. If the valid 41 * contain the bit number of the APIC ID to map into the DCA tag. If the valid
42 * bit is not set, then the value must be 0 or 1 and defines the bit in the tag. 42 * bit is not set, then the value must be 0 or 1 and defines the bit in the tag.
43 */ 43 */
44#define DCA_TAG_MAP_VALID 0x80 44#define DCA_TAG_MAP_VALID 0x80
45 45
46#define DCA3_TAG_MAP_BIT_TO_INV 0x80
47#define DCA3_TAG_MAP_BIT_TO_SEL 0x40
48#define DCA3_TAG_MAP_LITERAL_VAL 0x1
49
50#define DCA_TAG_MAP_MASK 0xDF
51
46/* 52/*
47 * "Legacy" DCA systems do not implement the DCA register set in the 53 * "Legacy" DCA systems do not implement the DCA register set in the
48 * I/OAT device. Software needs direct support for their tag mappings. 54 * I/OAT device. Software needs direct support for their tag mappings.
@@ -95,6 +101,7 @@ struct ioat_dca_slot {
95}; 101};
96 102
97#define IOAT_DCA_MAX_REQ 6 103#define IOAT_DCA_MAX_REQ 6
104#define IOAT3_DCA_MAX_REQ 2
98 105
99struct ioat_dca_priv { 106struct ioat_dca_priv {
100 void __iomem *iobase; 107 void __iomem *iobase;
@@ -171,7 +178,9 @@ static int ioat_dca_remove_requester(struct dca_provider *dca,
171 return -ENODEV; 178 return -ENODEV;
172} 179}
173 180
174static u8 ioat_dca_get_tag(struct dca_provider *dca, int cpu) 181static u8 ioat_dca_get_tag(struct dca_provider *dca,
182 struct device *dev,
183 int cpu)
175{ 184{
176 struct ioat_dca_priv *ioatdca = dca_priv(dca); 185 struct ioat_dca_priv *ioatdca = dca_priv(dca);
177 int i, apic_id, bit, value; 186 int i, apic_id, bit, value;
@@ -193,10 +202,26 @@ static u8 ioat_dca_get_tag(struct dca_provider *dca, int cpu)
193 return tag; 202 return tag;
194} 203}
195 204
205static int ioat_dca_dev_managed(struct dca_provider *dca,
206 struct device *dev)
207{
208 struct ioat_dca_priv *ioatdca = dca_priv(dca);
209 struct pci_dev *pdev;
210 int i;
211
212 pdev = to_pci_dev(dev);
213 for (i = 0; i < ioatdca->max_requesters; i++) {
214 if (ioatdca->req_slots[i].pdev == pdev)
215 return 1;
216 }
217 return 0;
218}
219
196static struct dca_ops ioat_dca_ops = { 220static struct dca_ops ioat_dca_ops = {
197 .add_requester = ioat_dca_add_requester, 221 .add_requester = ioat_dca_add_requester,
198 .remove_requester = ioat_dca_remove_requester, 222 .remove_requester = ioat_dca_remove_requester,
199 .get_tag = ioat_dca_get_tag, 223 .get_tag = ioat_dca_get_tag,
224 .dev_managed = ioat_dca_dev_managed,
200}; 225};
201 226
202 227
@@ -207,6 +232,8 @@ struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
207 u8 *tag_map = NULL; 232 u8 *tag_map = NULL;
208 int i; 233 int i;
209 int err; 234 int err;
235 u8 version;
236 u8 max_requesters;
210 237
211 if (!system_has_dca_enabled(pdev)) 238 if (!system_has_dca_enabled(pdev))
212 return NULL; 239 return NULL;
@@ -237,15 +264,20 @@ struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
237 if (tag_map == NULL) 264 if (tag_map == NULL)
238 return NULL; 265 return NULL;
239 266
267 version = readb(iobase + IOAT_VER_OFFSET);
268 if (version == IOAT_VER_3_0)
269 max_requesters = IOAT3_DCA_MAX_REQ;
270 else
271 max_requesters = IOAT_DCA_MAX_REQ;
272
240 dca = alloc_dca_provider(&ioat_dca_ops, 273 dca = alloc_dca_provider(&ioat_dca_ops,
241 sizeof(*ioatdca) + 274 sizeof(*ioatdca) +
242 (sizeof(struct ioat_dca_slot) * IOAT_DCA_MAX_REQ)); 275 (sizeof(struct ioat_dca_slot) * max_requesters));
243 if (!dca) 276 if (!dca)
244 return NULL; 277 return NULL;
245 278
246 ioatdca = dca_priv(dca); 279 ioatdca = dca_priv(dca);
247 ioatdca->max_requesters = IOAT_DCA_MAX_REQ; 280 ioatdca->max_requesters = max_requesters;
248
249 ioatdca->dca_base = iobase + 0x54; 281 ioatdca->dca_base = iobase + 0x54;
250 282
251 /* copy over the APIC ID to DCA tag mapping */ 283 /* copy over the APIC ID to DCA tag mapping */
@@ -323,11 +355,13 @@ static int ioat2_dca_remove_requester(struct dca_provider *dca,
323 return -ENODEV; 355 return -ENODEV;
324} 356}
325 357
326static u8 ioat2_dca_get_tag(struct dca_provider *dca, int cpu) 358static u8 ioat2_dca_get_tag(struct dca_provider *dca,
359 struct device *dev,
360 int cpu)
327{ 361{
328 u8 tag; 362 u8 tag;
329 363
330 tag = ioat_dca_get_tag(dca, cpu); 364 tag = ioat_dca_get_tag(dca, dev, cpu);
331 tag = (~tag) & 0x1F; 365 tag = (~tag) & 0x1F;
332 return tag; 366 return tag;
333} 367}
@@ -336,6 +370,7 @@ static struct dca_ops ioat2_dca_ops = {
336 .add_requester = ioat2_dca_add_requester, 370 .add_requester = ioat2_dca_add_requester,
337 .remove_requester = ioat2_dca_remove_requester, 371 .remove_requester = ioat2_dca_remove_requester,
338 .get_tag = ioat2_dca_get_tag, 372 .get_tag = ioat2_dca_get_tag,
373 .dev_managed = ioat_dca_dev_managed,
339}; 374};
340 375
341static int ioat2_dca_count_dca_slots(void __iomem *iobase, u16 dca_offset) 376static int ioat2_dca_count_dca_slots(void __iomem *iobase, u16 dca_offset)
@@ -425,3 +460,198 @@ struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase)
425 460
426 return dca; 461 return dca;
427} 462}
463
464static int ioat3_dca_add_requester(struct dca_provider *dca, struct device *dev)
465{
466 struct ioat_dca_priv *ioatdca = dca_priv(dca);
467 struct pci_dev *pdev;
468 int i;
469 u16 id;
470 u16 global_req_table;
471
472 /* This implementation only supports PCI-Express */
473 if (dev->bus != &pci_bus_type)
474 return -ENODEV;
475 pdev = to_pci_dev(dev);
476 id = dcaid_from_pcidev(pdev);
477
478 if (ioatdca->requester_count == ioatdca->max_requesters)
479 return -ENODEV;
480
481 for (i = 0; i < ioatdca->max_requesters; i++) {
482 if (ioatdca->req_slots[i].pdev == NULL) {
483 /* found an empty slot */
484 ioatdca->requester_count++;
485 ioatdca->req_slots[i].pdev = pdev;
486 ioatdca->req_slots[i].rid = id;
487 global_req_table =
488 readw(ioatdca->dca_base + IOAT3_DCA_GREQID_OFFSET);
489 writel(id | IOAT_DCA_GREQID_VALID,
490 ioatdca->iobase + global_req_table + (i * 4));
491 return i;
492 }
493 }
494 /* Error, ioatdma->requester_count is out of whack */
495 return -EFAULT;
496}
497
498static int ioat3_dca_remove_requester(struct dca_provider *dca,
499 struct device *dev)
500{
501 struct ioat_dca_priv *ioatdca = dca_priv(dca);
502 struct pci_dev *pdev;
503 int i;
504 u16 global_req_table;
505
506 /* This implementation only supports PCI-Express */
507 if (dev->bus != &pci_bus_type)
508 return -ENODEV;
509 pdev = to_pci_dev(dev);
510
511 for (i = 0; i < ioatdca->max_requesters; i++) {
512 if (ioatdca->req_slots[i].pdev == pdev) {
513 global_req_table =
514 readw(ioatdca->dca_base + IOAT3_DCA_GREQID_OFFSET);
515 writel(0, ioatdca->iobase + global_req_table + (i * 4));
516 ioatdca->req_slots[i].pdev = NULL;
517 ioatdca->req_slots[i].rid = 0;
518 ioatdca->requester_count--;
519 return i;
520 }
521 }
522 return -ENODEV;
523}
524
525static u8 ioat3_dca_get_tag(struct dca_provider *dca,
526 struct device *dev,
527 int cpu)
528{
529 u8 tag;
530
531 struct ioat_dca_priv *ioatdca = dca_priv(dca);
532 int i, apic_id, bit, value;
533 u8 entry;
534
535 tag = 0;
536 apic_id = cpu_physical_id(cpu);
537
538 for (i = 0; i < IOAT_TAG_MAP_LEN; i++) {
539 entry = ioatdca->tag_map[i];
540 if (entry & DCA3_TAG_MAP_BIT_TO_SEL) {
541 bit = entry &
542 ~(DCA3_TAG_MAP_BIT_TO_SEL | DCA3_TAG_MAP_BIT_TO_INV);
543 value = (apic_id & (1 << bit)) ? 1 : 0;
544 } else if (entry & DCA3_TAG_MAP_BIT_TO_INV) {
545 bit = entry & ~DCA3_TAG_MAP_BIT_TO_INV;
546 value = (apic_id & (1 << bit)) ? 0 : 1;
547 } else {
548 value = (entry & DCA3_TAG_MAP_LITERAL_VAL) ? 1 : 0;
549 }
550 tag |= (value << i);
551 }
552
553 return tag;
554}
555
556static struct dca_ops ioat3_dca_ops = {
557 .add_requester = ioat3_dca_add_requester,
558 .remove_requester = ioat3_dca_remove_requester,
559 .get_tag = ioat3_dca_get_tag,
560 .dev_managed = ioat_dca_dev_managed,
561};
562
563static int ioat3_dca_count_dca_slots(void *iobase, u16 dca_offset)
564{
565 int slots = 0;
566 u32 req;
567 u16 global_req_table;
568
569 global_req_table = readw(iobase + dca_offset + IOAT3_DCA_GREQID_OFFSET);
570 if (global_req_table == 0)
571 return 0;
572
573 do {
574 req = readl(iobase + global_req_table + (slots * sizeof(u32)));
575 slots++;
576 } while ((req & IOAT_DCA_GREQID_LASTID) == 0);
577
578 return slots;
579}
580
581struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase)
582{
583 struct dca_provider *dca;
584 struct ioat_dca_priv *ioatdca;
585 int slots;
586 int i;
587 int err;
588 u16 dca_offset;
589 u16 csi_fsb_control;
590 u16 pcie_control;
591 u8 bit;
592
593 union {
594 u64 full;
595 struct {
596 u32 low;
597 u32 high;
598 };
599 } tag_map;
600
601 if (!system_has_dca_enabled(pdev))
602 return NULL;
603
604 dca_offset = readw(iobase + IOAT_DCAOFFSET_OFFSET);
605 if (dca_offset == 0)
606 return NULL;
607
608 slots = ioat3_dca_count_dca_slots(iobase, dca_offset);
609 if (slots == 0)
610 return NULL;
611
612 dca = alloc_dca_provider(&ioat3_dca_ops,
613 sizeof(*ioatdca)
614 + (sizeof(struct ioat_dca_slot) * slots));
615 if (!dca)
616 return NULL;
617
618 ioatdca = dca_priv(dca);
619 ioatdca->iobase = iobase;
620 ioatdca->dca_base = iobase + dca_offset;
621 ioatdca->max_requesters = slots;
622
623 /* some bios might not know to turn these on */
624 csi_fsb_control = readw(ioatdca->dca_base + IOAT3_CSI_CONTROL_OFFSET);
625 if ((csi_fsb_control & IOAT3_CSI_CONTROL_PREFETCH) == 0) {
626 csi_fsb_control |= IOAT3_CSI_CONTROL_PREFETCH;
627 writew(csi_fsb_control,
628 ioatdca->dca_base + IOAT3_CSI_CONTROL_OFFSET);
629 }
630 pcie_control = readw(ioatdca->dca_base + IOAT3_PCI_CONTROL_OFFSET);
631 if ((pcie_control & IOAT3_PCI_CONTROL_MEMWR) == 0) {
632 pcie_control |= IOAT3_PCI_CONTROL_MEMWR;
633 writew(pcie_control,
634 ioatdca->dca_base + IOAT3_PCI_CONTROL_OFFSET);
635 }
636
637
638 /* TODO version, compatibility and configuration checks */
639
640 /* copy out the APIC to DCA tag map */
641 tag_map.low =
642 readl(ioatdca->dca_base + IOAT3_APICID_TAG_MAP_OFFSET_LOW);
643 tag_map.high =
644 readl(ioatdca->dca_base + IOAT3_APICID_TAG_MAP_OFFSET_HIGH);
645 for (i = 0; i < 8; i++) {
646 bit = tag_map.full >> (8 * i);
647 ioatdca->tag_map[i] = bit & DCA_TAG_MAP_MASK;
648 }
649
650 err = register_dca_provider(dca, &pdev->dev);
651 if (err) {
652 free_dca_provider(dca);
653 return NULL;
654 }
655
656 return dca;
657}
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
index 318e8a22d814..a52156e56886 100644
--- a/drivers/dma/ioat_dma.c
+++ b/drivers/dma/ioat_dma.c
@@ -32,6 +32,7 @@
32#include <linux/dmaengine.h> 32#include <linux/dmaengine.h>
33#include <linux/delay.h> 33#include <linux/delay.h>
34#include <linux/dma-mapping.h> 34#include <linux/dma-mapping.h>
35#include <linux/workqueue.h>
35#include "ioatdma.h" 36#include "ioatdma.h"
36#include "ioatdma_registers.h" 37#include "ioatdma_registers.h"
37#include "ioatdma_hw.h" 38#include "ioatdma_hw.h"
@@ -41,11 +42,23 @@
41#define to_ioat_desc(lh) container_of(lh, struct ioat_desc_sw, node) 42#define to_ioat_desc(lh) container_of(lh, struct ioat_desc_sw, node)
42#define tx_to_ioat_desc(tx) container_of(tx, struct ioat_desc_sw, async_tx) 43#define tx_to_ioat_desc(tx) container_of(tx, struct ioat_desc_sw, async_tx)
43 44
45#define chan_num(ch) ((int)((ch)->reg_base - (ch)->device->reg_base) / 0x80)
44static int ioat_pending_level = 4; 46static int ioat_pending_level = 4;
45module_param(ioat_pending_level, int, 0644); 47module_param(ioat_pending_level, int, 0644);
46MODULE_PARM_DESC(ioat_pending_level, 48MODULE_PARM_DESC(ioat_pending_level,
47 "high-water mark for pushing ioat descriptors (default: 4)"); 49 "high-water mark for pushing ioat descriptors (default: 4)");
48 50
51#define RESET_DELAY msecs_to_jiffies(100)
52#define WATCHDOG_DELAY round_jiffies(msecs_to_jiffies(2000))
53static void ioat_dma_chan_reset_part2(struct work_struct *work);
54static void ioat_dma_chan_watchdog(struct work_struct *work);
55
56/*
57 * workaround for IOAT ver.3.0 null descriptor issue
58 * (channel returns error when size is 0)
59 */
60#define NULL_DESC_BUFFER_SIZE 1
61
49/* internal functions */ 62/* internal functions */
50static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan); 63static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan);
51static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan); 64static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan);
@@ -122,6 +135,38 @@ static int ioat_dma_enumerate_channels(struct ioatdma_device *device)
122 int i; 135 int i;
123 struct ioat_dma_chan *ioat_chan; 136 struct ioat_dma_chan *ioat_chan;
124 137
138 /*
139 * IOAT ver.3 workarounds
140 */
141 if (device->version == IOAT_VER_3_0) {
142 u32 chan_err_mask;
143 u16 dev_id;
144 u32 dmauncerrsts;
145
146 /*
147 * Write CHANERRMSK_INT with 3E07h to mask out the errors
148 * that can cause stability issues for IOAT ver.3
149 */
150 chan_err_mask = 0x3E07;
151 pci_write_config_dword(device->pdev,
152 IOAT_PCI_CHANERRMASK_INT_OFFSET,
153 chan_err_mask);
154
155 /*
156 * Clear DMAUNCERRSTS Cfg-Reg Parity Error status bit
157 * (workaround for spurious config parity error after restart)
158 */
159 pci_read_config_word(device->pdev,
160 IOAT_PCI_DEVICE_ID_OFFSET,
161 &dev_id);
162 if (dev_id == PCI_DEVICE_ID_INTEL_IOAT_TBG0) {
163 dmauncerrsts = 0x10;
164 pci_write_config_dword(device->pdev,
165 IOAT_PCI_DMAUNCERRSTS_OFFSET,
166 dmauncerrsts);
167 }
168 }
169
125 device->common.chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET); 170 device->common.chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET);
126 xfercap_scale = readb(device->reg_base + IOAT_XFERCAP_OFFSET); 171 xfercap_scale = readb(device->reg_base + IOAT_XFERCAP_OFFSET);
127 xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale)); 172 xfercap = (xfercap_scale == 0 ? -1 : (1UL << xfercap_scale));
@@ -137,6 +182,7 @@ static int ioat_dma_enumerate_channels(struct ioatdma_device *device)
137 ioat_chan->reg_base = device->reg_base + (0x80 * (i + 1)); 182 ioat_chan->reg_base = device->reg_base + (0x80 * (i + 1));
138 ioat_chan->xfercap = xfercap; 183 ioat_chan->xfercap = xfercap;
139 ioat_chan->desccount = 0; 184 ioat_chan->desccount = 0;
185 INIT_DELAYED_WORK(&ioat_chan->work, ioat_dma_chan_reset_part2);
140 if (ioat_chan->device->version != IOAT_VER_1_2) { 186 if (ioat_chan->device->version != IOAT_VER_1_2) {
141 writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE 187 writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE
142 | IOAT_DMA_DCA_ANY_CPU, 188 | IOAT_DMA_DCA_ANY_CPU,
@@ -175,7 +221,7 @@ static void ioat1_dma_memcpy_issue_pending(struct dma_chan *chan)
175{ 221{
176 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 222 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
177 223
178 if (ioat_chan->pending != 0) { 224 if (ioat_chan->pending > 0) {
179 spin_lock_bh(&ioat_chan->desc_lock); 225 spin_lock_bh(&ioat_chan->desc_lock);
180 __ioat1_dma_memcpy_issue_pending(ioat_chan); 226 __ioat1_dma_memcpy_issue_pending(ioat_chan);
181 spin_unlock_bh(&ioat_chan->desc_lock); 227 spin_unlock_bh(&ioat_chan->desc_lock);
@@ -194,13 +240,228 @@ static void ioat2_dma_memcpy_issue_pending(struct dma_chan *chan)
194{ 240{
195 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 241 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
196 242
197 if (ioat_chan->pending != 0) { 243 if (ioat_chan->pending > 0) {
198 spin_lock_bh(&ioat_chan->desc_lock); 244 spin_lock_bh(&ioat_chan->desc_lock);
199 __ioat2_dma_memcpy_issue_pending(ioat_chan); 245 __ioat2_dma_memcpy_issue_pending(ioat_chan);
200 spin_unlock_bh(&ioat_chan->desc_lock); 246 spin_unlock_bh(&ioat_chan->desc_lock);
201 } 247 }
202} 248}
203 249
250
251/**
252 * ioat_dma_chan_reset_part2 - reinit the channel after a reset
253 */
254static void ioat_dma_chan_reset_part2(struct work_struct *work)
255{
256 struct ioat_dma_chan *ioat_chan =
257 container_of(work, struct ioat_dma_chan, work.work);
258 struct ioat_desc_sw *desc;
259
260 spin_lock_bh(&ioat_chan->cleanup_lock);
261 spin_lock_bh(&ioat_chan->desc_lock);
262
263 ioat_chan->completion_virt->low = 0;
264 ioat_chan->completion_virt->high = 0;
265 ioat_chan->pending = 0;
266
267 /*
268 * count the descriptors waiting, and be sure to do it
269 * right for both the CB1 line and the CB2 ring
270 */
271 ioat_chan->dmacount = 0;
272 if (ioat_chan->used_desc.prev) {
273 desc = to_ioat_desc(ioat_chan->used_desc.prev);
274 do {
275 ioat_chan->dmacount++;
276 desc = to_ioat_desc(desc->node.next);
277 } while (&desc->node != ioat_chan->used_desc.next);
278 }
279
280 /*
281 * write the new starting descriptor address
282 * this puts channel engine into ARMED state
283 */
284 desc = to_ioat_desc(ioat_chan->used_desc.prev);
285 switch (ioat_chan->device->version) {
286 case IOAT_VER_1_2:
287 writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF,
288 ioat_chan->reg_base + IOAT1_CHAINADDR_OFFSET_LOW);
289 writel(((u64) desc->async_tx.phys) >> 32,
290 ioat_chan->reg_base + IOAT1_CHAINADDR_OFFSET_HIGH);
291
292 writeb(IOAT_CHANCMD_START, ioat_chan->reg_base
293 + IOAT_CHANCMD_OFFSET(ioat_chan->device->version));
294 break;
295 case IOAT_VER_2_0:
296 writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF,
297 ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_LOW);
298 writel(((u64) desc->async_tx.phys) >> 32,
299 ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_HIGH);
300
301 /* tell the engine to go with what's left to be done */
302 writew(ioat_chan->dmacount,
303 ioat_chan->reg_base + IOAT_CHAN_DMACOUNT_OFFSET);
304
305 break;
306 }
307 dev_err(&ioat_chan->device->pdev->dev,
308 "chan%d reset - %d descs waiting, %d total desc\n",
309 chan_num(ioat_chan), ioat_chan->dmacount, ioat_chan->desccount);
310
311 spin_unlock_bh(&ioat_chan->desc_lock);
312 spin_unlock_bh(&ioat_chan->cleanup_lock);
313}
314
315/**
316 * ioat_dma_reset_channel - restart a channel
317 * @ioat_chan: IOAT DMA channel handle
318 */
319static void ioat_dma_reset_channel(struct ioat_dma_chan *ioat_chan)
320{
321 u32 chansts, chanerr;
322
323 if (!ioat_chan->used_desc.prev)
324 return;
325
326 chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
327 chansts = (ioat_chan->completion_virt->low
328 & IOAT_CHANSTS_DMA_TRANSFER_STATUS);
329 if (chanerr) {
330 dev_err(&ioat_chan->device->pdev->dev,
331 "chan%d, CHANSTS = 0x%08x CHANERR = 0x%04x, clearing\n",
332 chan_num(ioat_chan), chansts, chanerr);
333 writel(chanerr, ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
334 }
335
336 /*
337 * whack it upside the head with a reset
338 * and wait for things to settle out.
339 * force the pending count to a really big negative
340 * to make sure no one forces an issue_pending
341 * while we're waiting.
342 */
343
344 spin_lock_bh(&ioat_chan->desc_lock);
345 ioat_chan->pending = INT_MIN;
346 writeb(IOAT_CHANCMD_RESET,
347 ioat_chan->reg_base
348 + IOAT_CHANCMD_OFFSET(ioat_chan->device->version));
349 spin_unlock_bh(&ioat_chan->desc_lock);
350
351 /* schedule the 2nd half instead of sleeping a long time */
352 schedule_delayed_work(&ioat_chan->work, RESET_DELAY);
353}
354
355/**
356 * ioat_dma_chan_watchdog - watch for stuck channels
357 */
358static void ioat_dma_chan_watchdog(struct work_struct *work)
359{
360 struct ioatdma_device *device =
361 container_of(work, struct ioatdma_device, work.work);
362 struct ioat_dma_chan *ioat_chan;
363 int i;
364
365 union {
366 u64 full;
367 struct {
368 u32 low;
369 u32 high;
370 };
371 } completion_hw;
372 unsigned long compl_desc_addr_hw;
373
374 for (i = 0; i < device->common.chancnt; i++) {
375 ioat_chan = ioat_lookup_chan_by_index(device, i);
376
377 if (ioat_chan->device->version == IOAT_VER_1_2
378 /* have we started processing anything yet */
379 && ioat_chan->last_completion
380 /* have we completed any since last watchdog cycle? */
381 && (ioat_chan->last_completion ==
382 ioat_chan->watchdog_completion)
383 /* has TCP stuck on one cookie since last watchdog? */
384 && (ioat_chan->watchdog_tcp_cookie ==
385 ioat_chan->watchdog_last_tcp_cookie)
386 && (ioat_chan->watchdog_tcp_cookie !=
387 ioat_chan->completed_cookie)
388 /* is there something in the chain to be processed? */
389 /* CB1 chain always has at least the last one processed */
390 && (ioat_chan->used_desc.prev != ioat_chan->used_desc.next)
391 && ioat_chan->pending == 0) {
392
393 /*
394 * check CHANSTS register for completed
395 * descriptor address.
396 * if it is different than completion writeback,
397 * it is not zero
398 * and it has changed since the last watchdog
399 * we can assume that channel
400 * is still working correctly
401 * and the problem is in completion writeback.
402 * update completion writeback
403 * with actual CHANSTS value
404 * else
405 * try resetting the channel
406 */
407
408 completion_hw.low = readl(ioat_chan->reg_base +
409 IOAT_CHANSTS_OFFSET_LOW(ioat_chan->device->version));
410 completion_hw.high = readl(ioat_chan->reg_base +
411 IOAT_CHANSTS_OFFSET_HIGH(ioat_chan->device->version));
412#if (BITS_PER_LONG == 64)
413 compl_desc_addr_hw =
414 completion_hw.full
415 & IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR;
416#else
417 compl_desc_addr_hw =
418 completion_hw.low & IOAT_LOW_COMPLETION_MASK;
419#endif
420
421 if ((compl_desc_addr_hw != 0)
422 && (compl_desc_addr_hw != ioat_chan->watchdog_completion)
423 && (compl_desc_addr_hw != ioat_chan->last_compl_desc_addr_hw)) {
424 ioat_chan->last_compl_desc_addr_hw = compl_desc_addr_hw;
425 ioat_chan->completion_virt->low = completion_hw.low;
426 ioat_chan->completion_virt->high = completion_hw.high;
427 } else {
428 ioat_dma_reset_channel(ioat_chan);
429 ioat_chan->watchdog_completion = 0;
430 ioat_chan->last_compl_desc_addr_hw = 0;
431 }
432
433 /*
434 * for version 2.0 if there are descriptors yet to be processed
435 * and the last completed hasn't changed since the last watchdog
436 * if they haven't hit the pending level
437 * issue the pending to push them through
438 * else
439 * try resetting the channel
440 */
441 } else if (ioat_chan->device->version == IOAT_VER_2_0
442 && ioat_chan->used_desc.prev
443 && ioat_chan->last_completion
444 && ioat_chan->last_completion == ioat_chan->watchdog_completion) {
445
446 if (ioat_chan->pending < ioat_pending_level)
447 ioat2_dma_memcpy_issue_pending(&ioat_chan->common);
448 else {
449 ioat_dma_reset_channel(ioat_chan);
450 ioat_chan->watchdog_completion = 0;
451 }
452 } else {
453 ioat_chan->last_compl_desc_addr_hw = 0;
454 ioat_chan->watchdog_completion
455 = ioat_chan->last_completion;
456 }
457
458 ioat_chan->watchdog_last_tcp_cookie =
459 ioat_chan->watchdog_tcp_cookie;
460 }
461
462 schedule_delayed_work(&device->work, WATCHDOG_DELAY);
463}
464
204static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx) 465static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx)
205{ 466{
206 struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan); 467 struct ioat_dma_chan *ioat_chan = to_ioat_chan(tx->chan);
@@ -250,6 +511,13 @@ static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx)
250 prev = new; 511 prev = new;
251 } while (len && (new = ioat1_dma_get_next_descriptor(ioat_chan))); 512 } while (len && (new = ioat1_dma_get_next_descriptor(ioat_chan)));
252 513
514 if (!new) {
515 dev_err(&ioat_chan->device->pdev->dev,
516 "tx submit failed\n");
517 spin_unlock_bh(&ioat_chan->desc_lock);
518 return -ENOMEM;
519 }
520
253 hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS; 521 hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
254 if (new->async_tx.callback) { 522 if (new->async_tx.callback) {
255 hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN; 523 hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;
@@ -335,7 +603,14 @@ static dma_cookie_t ioat2_tx_submit(struct dma_async_tx_descriptor *tx)
335 desc_count++; 603 desc_count++;
336 } while (len && (new = ioat2_dma_get_next_descriptor(ioat_chan))); 604 } while (len && (new = ioat2_dma_get_next_descriptor(ioat_chan)));
337 605
338 hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS; 606 if (!new) {
607 dev_err(&ioat_chan->device->pdev->dev,
608 "tx submit failed\n");
609 spin_unlock_bh(&ioat_chan->desc_lock);
610 return -ENOMEM;
611 }
612
613 hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
339 if (new->async_tx.callback) { 614 if (new->async_tx.callback) {
340 hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN; 615 hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;
341 if (first != new) { 616 if (first != new) {
@@ -406,6 +681,7 @@ static struct ioat_desc_sw *ioat_dma_alloc_descriptor(
406 desc_sw->async_tx.tx_submit = ioat1_tx_submit; 681 desc_sw->async_tx.tx_submit = ioat1_tx_submit;
407 break; 682 break;
408 case IOAT_VER_2_0: 683 case IOAT_VER_2_0:
684 case IOAT_VER_3_0:
409 desc_sw->async_tx.tx_submit = ioat2_tx_submit; 685 desc_sw->async_tx.tx_submit = ioat2_tx_submit;
410 break; 686 break;
411 } 687 }
@@ -452,7 +728,8 @@ static void ioat2_dma_massage_chan_desc(struct ioat_dma_chan *ioat_chan)
452 * ioat_dma_alloc_chan_resources - returns the number of allocated descriptors 728 * ioat_dma_alloc_chan_resources - returns the number of allocated descriptors
453 * @chan: the channel to be filled out 729 * @chan: the channel to be filled out
454 */ 730 */
455static int ioat_dma_alloc_chan_resources(struct dma_chan *chan) 731static int ioat_dma_alloc_chan_resources(struct dma_chan *chan,
732 struct dma_client *client)
456{ 733{
457 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); 734 struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
458 struct ioat_desc_sw *desc; 735 struct ioat_desc_sw *desc;
@@ -555,6 +832,7 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)
555 } 832 }
556 break; 833 break;
557 case IOAT_VER_2_0: 834 case IOAT_VER_2_0:
835 case IOAT_VER_3_0:
558 list_for_each_entry_safe(desc, _desc, 836 list_for_each_entry_safe(desc, _desc,
559 ioat_chan->free_desc.next, node) { 837 ioat_chan->free_desc.next, node) {
560 list_del(&desc->node); 838 list_del(&desc->node);
@@ -585,6 +863,10 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)
585 ioat_chan->last_completion = ioat_chan->completion_addr = 0; 863 ioat_chan->last_completion = ioat_chan->completion_addr = 0;
586 ioat_chan->pending = 0; 864 ioat_chan->pending = 0;
587 ioat_chan->dmacount = 0; 865 ioat_chan->dmacount = 0;
866 ioat_chan->watchdog_completion = 0;
867 ioat_chan->last_compl_desc_addr_hw = 0;
868 ioat_chan->watchdog_tcp_cookie =
869 ioat_chan->watchdog_last_tcp_cookie = 0;
588} 870}
589 871
590/** 872/**
@@ -640,7 +922,8 @@ ioat2_dma_get_next_descriptor(struct ioat_dma_chan *ioat_chan)
640 922
641 /* set up the noop descriptor */ 923 /* set up the noop descriptor */
642 noop_desc = to_ioat_desc(ioat_chan->used_desc.next); 924 noop_desc = to_ioat_desc(ioat_chan->used_desc.next);
643 noop_desc->hw->size = 0; 925 /* set size to non-zero value (channel returns error when size is 0) */
926 noop_desc->hw->size = NULL_DESC_BUFFER_SIZE;
644 noop_desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL; 927 noop_desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL;
645 noop_desc->hw->src_addr = 0; 928 noop_desc->hw->src_addr = 0;
646 noop_desc->hw->dst_addr = 0; 929 noop_desc->hw->dst_addr = 0;
@@ -690,6 +973,7 @@ static struct ioat_desc_sw *ioat_dma_get_next_descriptor(
690 return ioat1_dma_get_next_descriptor(ioat_chan); 973 return ioat1_dma_get_next_descriptor(ioat_chan);
691 break; 974 break;
692 case IOAT_VER_2_0: 975 case IOAT_VER_2_0:
976 case IOAT_VER_3_0:
693 return ioat2_dma_get_next_descriptor(ioat_chan); 977 return ioat2_dma_get_next_descriptor(ioat_chan);
694 break; 978 break;
695 } 979 }
@@ -716,8 +1000,12 @@ static struct dma_async_tx_descriptor *ioat1_dma_prep_memcpy(
716 new->src = dma_src; 1000 new->src = dma_src;
717 new->async_tx.flags = flags; 1001 new->async_tx.flags = flags;
718 return &new->async_tx; 1002 return &new->async_tx;
719 } else 1003 } else {
1004 dev_err(&ioat_chan->device->pdev->dev,
1005 "chan%d - get_next_desc failed: %d descs waiting, %d total desc\n",
1006 chan_num(ioat_chan), ioat_chan->dmacount, ioat_chan->desccount);
720 return NULL; 1007 return NULL;
1008 }
721} 1009}
722 1010
723static struct dma_async_tx_descriptor *ioat2_dma_prep_memcpy( 1011static struct dma_async_tx_descriptor *ioat2_dma_prep_memcpy(
@@ -744,8 +1032,13 @@ static struct dma_async_tx_descriptor *ioat2_dma_prep_memcpy(
744 new->src = dma_src; 1032 new->src = dma_src;
745 new->async_tx.flags = flags; 1033 new->async_tx.flags = flags;
746 return &new->async_tx; 1034 return &new->async_tx;
747 } else 1035 } else {
1036 spin_unlock_bh(&ioat_chan->desc_lock);
1037 dev_err(&ioat_chan->device->pdev->dev,
1038 "chan%d - get_next_desc failed: %d descs waiting, %d total desc\n",
1039 chan_num(ioat_chan), ioat_chan->dmacount, ioat_chan->desccount);
748 return NULL; 1040 return NULL;
1041 }
749} 1042}
750 1043
751static void ioat_dma_cleanup_tasklet(unsigned long data) 1044static void ioat_dma_cleanup_tasklet(unsigned long data)
@@ -756,6 +1049,27 @@ static void ioat_dma_cleanup_tasklet(unsigned long data)
756 chan->reg_base + IOAT_CHANCTRL_OFFSET); 1049 chan->reg_base + IOAT_CHANCTRL_OFFSET);
757} 1050}
758 1051
1052static void
1053ioat_dma_unmap(struct ioat_dma_chan *ioat_chan, struct ioat_desc_sw *desc)
1054{
1055 /*
1056 * yes we are unmapping both _page and _single
1057 * alloc'd regions with unmap_page. Is this
1058 * *really* that bad?
1059 */
1060 if (!(desc->async_tx.flags & DMA_COMPL_SKIP_DEST_UNMAP))
1061 pci_unmap_page(ioat_chan->device->pdev,
1062 pci_unmap_addr(desc, dst),
1063 pci_unmap_len(desc, len),
1064 PCI_DMA_FROMDEVICE);
1065
1066 if (!(desc->async_tx.flags & DMA_COMPL_SKIP_SRC_UNMAP))
1067 pci_unmap_page(ioat_chan->device->pdev,
1068 pci_unmap_addr(desc, src),
1069 pci_unmap_len(desc, len),
1070 PCI_DMA_TODEVICE);
1071}
1072
759/** 1073/**
760 * ioat_dma_memcpy_cleanup - cleanup up finished descriptors 1074 * ioat_dma_memcpy_cleanup - cleanup up finished descriptors
761 * @chan: ioat channel to be cleaned up 1075 * @chan: ioat channel to be cleaned up
@@ -799,11 +1113,27 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
799 1113
800 if (phys_complete == ioat_chan->last_completion) { 1114 if (phys_complete == ioat_chan->last_completion) {
801 spin_unlock_bh(&ioat_chan->cleanup_lock); 1115 spin_unlock_bh(&ioat_chan->cleanup_lock);
1116 /*
1117 * perhaps we're stuck so hard that the watchdog can't go off?
1118 * try to catch it after 2 seconds
1119 */
1120 if (ioat_chan->device->version != IOAT_VER_3_0) {
1121 if (time_after(jiffies,
1122 ioat_chan->last_completion_time + HZ*WATCHDOG_DELAY)) {
1123 ioat_dma_chan_watchdog(&(ioat_chan->device->work.work));
1124 ioat_chan->last_completion_time = jiffies;
1125 }
1126 }
802 return; 1127 return;
803 } 1128 }
1129 ioat_chan->last_completion_time = jiffies;
804 1130
805 cookie = 0; 1131 cookie = 0;
806 spin_lock_bh(&ioat_chan->desc_lock); 1132 if (!spin_trylock_bh(&ioat_chan->desc_lock)) {
1133 spin_unlock_bh(&ioat_chan->cleanup_lock);
1134 return;
1135 }
1136
807 switch (ioat_chan->device->version) { 1137 switch (ioat_chan->device->version) {
808 case IOAT_VER_1_2: 1138 case IOAT_VER_1_2:
809 list_for_each_entry_safe(desc, _desc, 1139 list_for_each_entry_safe(desc, _desc,
@@ -816,21 +1146,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
816 */ 1146 */
817 if (desc->async_tx.cookie) { 1147 if (desc->async_tx.cookie) {
818 cookie = desc->async_tx.cookie; 1148 cookie = desc->async_tx.cookie;
819 1149 ioat_dma_unmap(ioat_chan, desc);
820 /*
821 * yes we are unmapping both _page and _single
822 * alloc'd regions with unmap_page. Is this
823 * *really* that bad?
824 */
825 pci_unmap_page(ioat_chan->device->pdev,
826 pci_unmap_addr(desc, dst),
827 pci_unmap_len(desc, len),
828 PCI_DMA_FROMDEVICE);
829 pci_unmap_page(ioat_chan->device->pdev,
830 pci_unmap_addr(desc, src),
831 pci_unmap_len(desc, len),
832 PCI_DMA_TODEVICE);
833
834 if (desc->async_tx.callback) { 1150 if (desc->async_tx.callback) {
835 desc->async_tx.callback(desc->async_tx.callback_param); 1151 desc->async_tx.callback(desc->async_tx.callback_param);
836 desc->async_tx.callback = NULL; 1152 desc->async_tx.callback = NULL;
@@ -862,6 +1178,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
862 } 1178 }
863 break; 1179 break;
864 case IOAT_VER_2_0: 1180 case IOAT_VER_2_0:
1181 case IOAT_VER_3_0:
865 /* has some other thread has already cleaned up? */ 1182 /* has some other thread has already cleaned up? */
866 if (ioat_chan->used_desc.prev == NULL) 1183 if (ioat_chan->used_desc.prev == NULL)
867 break; 1184 break;
@@ -889,16 +1206,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
889 if (desc->async_tx.cookie) { 1206 if (desc->async_tx.cookie) {
890 cookie = desc->async_tx.cookie; 1207 cookie = desc->async_tx.cookie;
891 desc->async_tx.cookie = 0; 1208 desc->async_tx.cookie = 0;
892 1209 ioat_dma_unmap(ioat_chan, desc);
893 pci_unmap_page(ioat_chan->device->pdev,
894 pci_unmap_addr(desc, dst),
895 pci_unmap_len(desc, len),
896 PCI_DMA_FROMDEVICE);
897 pci_unmap_page(ioat_chan->device->pdev,
898 pci_unmap_addr(desc, src),
899 pci_unmap_len(desc, len),
900 PCI_DMA_TODEVICE);
901
902 if (desc->async_tx.callback) { 1210 if (desc->async_tx.callback) {
903 desc->async_tx.callback(desc->async_tx.callback_param); 1211 desc->async_tx.callback(desc->async_tx.callback_param);
904 desc->async_tx.callback = NULL; 1212 desc->async_tx.callback = NULL;
@@ -943,6 +1251,7 @@ static enum dma_status ioat_dma_is_complete(struct dma_chan *chan,
943 1251
944 last_used = chan->cookie; 1252 last_used = chan->cookie;
945 last_complete = ioat_chan->completed_cookie; 1253 last_complete = ioat_chan->completed_cookie;
1254 ioat_chan->watchdog_tcp_cookie = cookie;
946 1255
947 if (done) 1256 if (done)
948 *done = last_complete; 1257 *done = last_complete;
@@ -973,10 +1282,19 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
973 spin_lock_bh(&ioat_chan->desc_lock); 1282 spin_lock_bh(&ioat_chan->desc_lock);
974 1283
975 desc = ioat_dma_get_next_descriptor(ioat_chan); 1284 desc = ioat_dma_get_next_descriptor(ioat_chan);
1285
1286 if (!desc) {
1287 dev_err(&ioat_chan->device->pdev->dev,
1288 "Unable to start null desc - get next desc failed\n");
1289 spin_unlock_bh(&ioat_chan->desc_lock);
1290 return;
1291 }
1292
976 desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL 1293 desc->hw->ctl = IOAT_DMA_DESCRIPTOR_NUL
977 | IOAT_DMA_DESCRIPTOR_CTL_INT_GN 1294 | IOAT_DMA_DESCRIPTOR_CTL_INT_GN
978 | IOAT_DMA_DESCRIPTOR_CTL_CP_STS; 1295 | IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
979 desc->hw->size = 0; 1296 /* set size to non-zero value (channel returns error when size is 0) */
1297 desc->hw->size = NULL_DESC_BUFFER_SIZE;
980 desc->hw->src_addr = 0; 1298 desc->hw->src_addr = 0;
981 desc->hw->dst_addr = 0; 1299 desc->hw->dst_addr = 0;
982 async_tx_ack(&desc->async_tx); 1300 async_tx_ack(&desc->async_tx);
@@ -994,6 +1312,7 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
994 + IOAT_CHANCMD_OFFSET(ioat_chan->device->version)); 1312 + IOAT_CHANCMD_OFFSET(ioat_chan->device->version));
995 break; 1313 break;
996 case IOAT_VER_2_0: 1314 case IOAT_VER_2_0:
1315 case IOAT_VER_3_0:
997 writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF, 1316 writel(((u64) desc->async_tx.phys) & 0x00000000FFFFFFFF,
998 ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_LOW); 1317 ioat_chan->reg_base + IOAT2_CHAINADDR_OFFSET_LOW);
999 writel(((u64) desc->async_tx.phys) >> 32, 1318 writel(((u64) desc->async_tx.phys) >> 32,
@@ -1049,7 +1368,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
1049 dma_chan = container_of(device->common.channels.next, 1368 dma_chan = container_of(device->common.channels.next,
1050 struct dma_chan, 1369 struct dma_chan,
1051 device_node); 1370 device_node);
1052 if (device->common.device_alloc_chan_resources(dma_chan) < 1) { 1371 if (device->common.device_alloc_chan_resources(dma_chan, NULL) < 1) {
1053 dev_err(&device->pdev->dev, 1372 dev_err(&device->pdev->dev,
1054 "selftest cannot allocate chan resource\n"); 1373 "selftest cannot allocate chan resource\n");
1055 err = -ENODEV; 1374 err = -ENODEV;
@@ -1312,6 +1631,7 @@ struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
1312 ioat1_dma_memcpy_issue_pending; 1631 ioat1_dma_memcpy_issue_pending;
1313 break; 1632 break;
1314 case IOAT_VER_2_0: 1633 case IOAT_VER_2_0:
1634 case IOAT_VER_3_0:
1315 device->common.device_prep_dma_memcpy = ioat2_dma_prep_memcpy; 1635 device->common.device_prep_dma_memcpy = ioat2_dma_prep_memcpy;
1316 device->common.device_issue_pending = 1636 device->common.device_issue_pending =
1317 ioat2_dma_memcpy_issue_pending; 1637 ioat2_dma_memcpy_issue_pending;
@@ -1331,8 +1651,16 @@ struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
1331 if (err) 1651 if (err)
1332 goto err_self_test; 1652 goto err_self_test;
1333 1653
1654 ioat_set_tcp_copy_break(device);
1655
1334 dma_async_device_register(&device->common); 1656 dma_async_device_register(&device->common);
1335 1657
1658 if (device->version != IOAT_VER_3_0) {
1659 INIT_DELAYED_WORK(&device->work, ioat_dma_chan_watchdog);
1660 schedule_delayed_work(&device->work,
1661 WATCHDOG_DELAY);
1662 }
1663
1336 return device; 1664 return device;
1337 1665
1338err_self_test: 1666err_self_test:
@@ -1365,6 +1693,10 @@ void ioat_dma_remove(struct ioatdma_device *device)
1365 pci_release_regions(device->pdev); 1693 pci_release_regions(device->pdev);
1366 pci_disable_device(device->pdev); 1694 pci_disable_device(device->pdev);
1367 1695
1696 if (device->version != IOAT_VER_3_0) {
1697 cancel_delayed_work(&device->work);
1698 }
1699
1368 list_for_each_entry_safe(chan, _chan, 1700 list_for_each_entry_safe(chan, _chan,
1369 &device->common.channels, device_node) { 1701 &device->common.channels, device_node) {
1370 ioat_chan = to_ioat_chan(chan); 1702 ioat_chan = to_ioat_chan(chan);
diff --git a/drivers/dma/ioatdma.h b/drivers/dma/ioatdma.h
index f2c7fedbf009..a3306d0e1372 100644
--- a/drivers/dma/ioatdma.h
+++ b/drivers/dma/ioatdma.h
@@ -27,8 +27,9 @@
27#include <linux/dmapool.h> 27#include <linux/dmapool.h>
28#include <linux/cache.h> 28#include <linux/cache.h>
29#include <linux/pci_ids.h> 29#include <linux/pci_ids.h>
30#include <net/tcp.h>
30 31
31#define IOAT_DMA_VERSION "2.04" 32#define IOAT_DMA_VERSION "3.30"
32 33
33enum ioat_interrupt { 34enum ioat_interrupt {
34 none = 0, 35 none = 0,
@@ -40,6 +41,7 @@ enum ioat_interrupt {
40 41
41#define IOAT_LOW_COMPLETION_MASK 0xffffffc0 42#define IOAT_LOW_COMPLETION_MASK 0xffffffc0
42#define IOAT_DMA_DCA_ANY_CPU ~0 43#define IOAT_DMA_DCA_ANY_CPU ~0
44#define IOAT_WATCHDOG_PERIOD (2 * HZ)
43 45
44 46
45/** 47/**
@@ -62,6 +64,7 @@ struct ioatdma_device {
62 struct dma_device common; 64 struct dma_device common;
63 u8 version; 65 u8 version;
64 enum ioat_interrupt irq_mode; 66 enum ioat_interrupt irq_mode;
67 struct delayed_work work;
65 struct msix_entry msix_entries[4]; 68 struct msix_entry msix_entries[4];
66 struct ioat_dma_chan *idx[4]; 69 struct ioat_dma_chan *idx[4];
67}; 70};
@@ -75,6 +78,7 @@ struct ioat_dma_chan {
75 78
76 dma_cookie_t completed_cookie; 79 dma_cookie_t completed_cookie;
77 unsigned long last_completion; 80 unsigned long last_completion;
81 unsigned long last_completion_time;
78 82
79 size_t xfercap; /* XFERCAP register value expanded out */ 83 size_t xfercap; /* XFERCAP register value expanded out */
80 84
@@ -82,6 +86,10 @@ struct ioat_dma_chan {
82 spinlock_t desc_lock; 86 spinlock_t desc_lock;
83 struct list_head free_desc; 87 struct list_head free_desc;
84 struct list_head used_desc; 88 struct list_head used_desc;
89 unsigned long watchdog_completion;
90 int watchdog_tcp_cookie;
91 u32 watchdog_last_tcp_cookie;
92 struct delayed_work work;
85 93
86 int pending; 94 int pending;
87 int dmacount; 95 int dmacount;
@@ -98,6 +106,7 @@ struct ioat_dma_chan {
98 u32 high; 106 u32 high;
99 }; 107 };
100 } *completion_virt; 108 } *completion_virt;
109 unsigned long last_compl_desc_addr_hw;
101 struct tasklet_struct cleanup_task; 110 struct tasklet_struct cleanup_task;
102}; 111};
103 112
@@ -121,17 +130,34 @@ struct ioat_desc_sw {
121 struct dma_async_tx_descriptor async_tx; 130 struct dma_async_tx_descriptor async_tx;
122}; 131};
123 132
133static inline void ioat_set_tcp_copy_break(struct ioatdma_device *dev)
134{
135 #ifdef CONFIG_NET_DMA
136 switch (dev->version) {
137 case IOAT_VER_1_2:
138 case IOAT_VER_3_0:
139 sysctl_tcp_dma_copybreak = 4096;
140 break;
141 case IOAT_VER_2_0:
142 sysctl_tcp_dma_copybreak = 2048;
143 break;
144 }
145 #endif
146}
147
124#if defined(CONFIG_INTEL_IOATDMA) || defined(CONFIG_INTEL_IOATDMA_MODULE) 148#if defined(CONFIG_INTEL_IOATDMA) || defined(CONFIG_INTEL_IOATDMA_MODULE)
125struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev, 149struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,
126 void __iomem *iobase); 150 void __iomem *iobase);
127void ioat_dma_remove(struct ioatdma_device *device); 151void ioat_dma_remove(struct ioatdma_device *device);
128struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase); 152struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase);
129struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase); 153struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase);
154struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase);
130#else 155#else
131#define ioat_dma_probe(pdev, iobase) NULL 156#define ioat_dma_probe(pdev, iobase) NULL
132#define ioat_dma_remove(device) do { } while (0) 157#define ioat_dma_remove(device) do { } while (0)
133#define ioat_dca_init(pdev, iobase) NULL 158#define ioat_dca_init(pdev, iobase) NULL
134#define ioat2_dca_init(pdev, iobase) NULL 159#define ioat2_dca_init(pdev, iobase) NULL
160#define ioat3_dca_init(pdev, iobase) NULL
135#endif 161#endif
136 162
137#endif /* IOATDMA_H */ 163#endif /* IOATDMA_H */
diff --git a/drivers/dma/ioatdma_hw.h b/drivers/dma/ioatdma_hw.h
index dd470fa91d86..f1ae2c776f74 100644
--- a/drivers/dma/ioatdma_hw.h
+++ b/drivers/dma/ioatdma_hw.h
@@ -35,6 +35,7 @@
35#define IOAT_PCI_SID 0x8086 35#define IOAT_PCI_SID 0x8086
36#define IOAT_VER_1_2 0x12 /* Version 1.2 */ 36#define IOAT_VER_1_2 0x12 /* Version 1.2 */
37#define IOAT_VER_2_0 0x20 /* Version 2.0 */ 37#define IOAT_VER_2_0 0x20 /* Version 2.0 */
38#define IOAT_VER_3_0 0x30 /* Version 3.0 */
38 39
39struct ioat_dma_descriptor { 40struct ioat_dma_descriptor {
40 uint32_t size; 41 uint32_t size;
diff --git a/drivers/dma/ioatdma_registers.h b/drivers/dma/ioatdma_registers.h
index 9832d7ebd931..827cb503cac6 100644
--- a/drivers/dma/ioatdma_registers.h
+++ b/drivers/dma/ioatdma_registers.h
@@ -25,6 +25,10 @@
25#define IOAT_PCI_DMACTRL_DMA_EN 0x00000001 25#define IOAT_PCI_DMACTRL_DMA_EN 0x00000001
26#define IOAT_PCI_DMACTRL_MSI_EN 0x00000002 26#define IOAT_PCI_DMACTRL_MSI_EN 0x00000002
27 27
28#define IOAT_PCI_DEVICE_ID_OFFSET 0x02
29#define IOAT_PCI_DMAUNCERRSTS_OFFSET 0x148
30#define IOAT_PCI_CHANERRMASK_INT_OFFSET 0x184
31
28/* MMIO Device Registers */ 32/* MMIO Device Registers */
29#define IOAT_CHANCNT_OFFSET 0x00 /* 8-bit */ 33#define IOAT_CHANCNT_OFFSET 0x00 /* 8-bit */
30 34
@@ -149,7 +153,23 @@
149#define IOAT_DCA_GREQID_VALID 0x20000000 153#define IOAT_DCA_GREQID_VALID 0x20000000
150#define IOAT_DCA_GREQID_LASTID 0x80000000 154#define IOAT_DCA_GREQID_LASTID 0x80000000
151 155
156#define IOAT3_CSI_CAPABILITY_OFFSET 0x08
157#define IOAT3_CSI_CAPABILITY_PREFETCH 0x1
158
159#define IOAT3_PCI_CAPABILITY_OFFSET 0x0A
160#define IOAT3_PCI_CAPABILITY_MEMWR 0x1
161
162#define IOAT3_CSI_CONTROL_OFFSET 0x0C
163#define IOAT3_CSI_CONTROL_PREFETCH 0x1
164
165#define IOAT3_PCI_CONTROL_OFFSET 0x0E
166#define IOAT3_PCI_CONTROL_MEMWR 0x1
167
168#define IOAT3_APICID_TAG_MAP_OFFSET 0x10
169#define IOAT3_APICID_TAG_MAP_OFFSET_LOW 0x10
170#define IOAT3_APICID_TAG_MAP_OFFSET_HIGH 0x14
152 171
172#define IOAT3_DCA_GREQID_OFFSET 0x02
153 173
154#define IOAT1_CHAINADDR_OFFSET 0x0C /* 64-bit Descriptor Chain Address Register */ 174#define IOAT1_CHAINADDR_OFFSET 0x0C /* 64-bit Descriptor Chain Address Register */
155#define IOAT2_CHAINADDR_OFFSET 0x10 /* 64-bit Descriptor Chain Address Register */ 175#define IOAT2_CHAINADDR_OFFSET 0x10 /* 64-bit Descriptor Chain Address Register */
diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c
index 0ec0f431e6a1..85bfeba4d85e 100644
--- a/drivers/dma/iop-adma.c
+++ b/drivers/dma/iop-adma.c
@@ -82,17 +82,24 @@ iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc,
82 struct device *dev = 82 struct device *dev =
83 &iop_chan->device->pdev->dev; 83 &iop_chan->device->pdev->dev;
84 u32 len = unmap->unmap_len; 84 u32 len = unmap->unmap_len;
85 u32 src_cnt = unmap->unmap_src_cnt; 85 enum dma_ctrl_flags flags = desc->async_tx.flags;
86 dma_addr_t addr = iop_desc_get_dest_addr(unmap, 86 u32 src_cnt;
87 iop_chan); 87 dma_addr_t addr;
88 88
89 dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE); 89 if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) {
90 while (src_cnt--) { 90 addr = iop_desc_get_dest_addr(unmap, iop_chan);
91 addr = iop_desc_get_src_addr(unmap, 91 dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE);
92 iop_chan, 92 }
93 src_cnt); 93
94 dma_unmap_page(dev, addr, len, 94 if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) {
95 DMA_TO_DEVICE); 95 src_cnt = unmap->unmap_src_cnt;
96 while (src_cnt--) {
97 addr = iop_desc_get_src_addr(unmap,
98 iop_chan,
99 src_cnt);
100 dma_unmap_page(dev, addr, len,
101 DMA_TO_DEVICE);
102 }
96 } 103 }
97 desc->group_head = NULL; 104 desc->group_head = NULL;
98 } 105 }
@@ -366,8 +373,8 @@ retry:
366 if (!retry++) 373 if (!retry++)
367 goto retry; 374 goto retry;
368 375
369 /* try to free some slots if the allocation fails */ 376 /* perform direct reclaim if the allocation fails */
370 tasklet_schedule(&iop_chan->irq_tasklet); 377 __iop_adma_slot_cleanup(iop_chan);
371 378
372 return NULL; 379 return NULL;
373} 380}
@@ -443,8 +450,18 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
443static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan); 450static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan);
444static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan); 451static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan);
445 452
446/* returns the number of allocated descriptors */ 453/**
447static int iop_adma_alloc_chan_resources(struct dma_chan *chan) 454 * iop_adma_alloc_chan_resources - returns the number of allocated descriptors
455 * @chan - allocate descriptor resources for this channel
456 * @client - current client requesting the channel be ready for requests
457 *
458 * Note: We keep the slots for 1 operation on iop_chan->chain at all times. To
459 * avoid deadlock, via async_xor, num_descs_in_pool must at a minimum be
460 * greater than 2x the number slots needed to satisfy a device->max_xor
461 * request.
462 * */
463static int iop_adma_alloc_chan_resources(struct dma_chan *chan,
464 struct dma_client *client)
448{ 465{
449 char *hw_desc; 466 char *hw_desc;
450 int idx; 467 int idx;
@@ -838,7 +855,7 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
838 dma_chan = container_of(device->common.channels.next, 855 dma_chan = container_of(device->common.channels.next,
839 struct dma_chan, 856 struct dma_chan,
840 device_node); 857 device_node);
841 if (iop_adma_alloc_chan_resources(dma_chan) < 1) { 858 if (iop_adma_alloc_chan_resources(dma_chan, NULL) < 1) {
842 err = -ENODEV; 859 err = -ENODEV;
843 goto out; 860 goto out;
844 } 861 }
@@ -936,7 +953,7 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device)
936 dma_chan = container_of(device->common.channels.next, 953 dma_chan = container_of(device->common.channels.next,
937 struct dma_chan, 954 struct dma_chan,
938 device_node); 955 device_node);
939 if (iop_adma_alloc_chan_resources(dma_chan) < 1) { 956 if (iop_adma_alloc_chan_resources(dma_chan, NULL) < 1) {
940 err = -ENODEV; 957 err = -ENODEV;
941 goto out; 958 goto out;
942 } 959 }
@@ -1387,6 +1404,8 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
1387 spin_unlock_bh(&iop_chan->lock); 1404 spin_unlock_bh(&iop_chan->lock);
1388} 1405}
1389 1406
1407MODULE_ALIAS("platform:iop-adma");
1408
1390static struct platform_driver iop_adma_driver = { 1409static struct platform_driver iop_adma_driver = {
1391 .probe = iop_adma_probe, 1410 .probe = iop_adma_probe,
1392 .remove = iop_adma_remove, 1411 .remove = iop_adma_remove,
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c
new file mode 100644
index 000000000000..a4e4494663bf
--- /dev/null
+++ b/drivers/dma/mv_xor.c
@@ -0,0 +1,1375 @@
1/*
2 * offload engine driver for the Marvell XOR engine
3 * Copyright (C) 2007, 2008, Marvell International Ltd.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
19#include <linux/init.h>
20#include <linux/module.h>
21#include <linux/async_tx.h>
22#include <linux/delay.h>
23#include <linux/dma-mapping.h>
24#include <linux/spinlock.h>
25#include <linux/interrupt.h>
26#include <linux/platform_device.h>
27#include <linux/memory.h>
28#include <asm/plat-orion/mv_xor.h>
29#include "mv_xor.h"
30
31static void mv_xor_issue_pending(struct dma_chan *chan);
32
33#define to_mv_xor_chan(chan) \
34 container_of(chan, struct mv_xor_chan, common)
35
36#define to_mv_xor_device(dev) \
37 container_of(dev, struct mv_xor_device, common)
38
39#define to_mv_xor_slot(tx) \
40 container_of(tx, struct mv_xor_desc_slot, async_tx)
41
42static void mv_desc_init(struct mv_xor_desc_slot *desc, unsigned long flags)
43{
44 struct mv_xor_desc *hw_desc = desc->hw_desc;
45
46 hw_desc->status = (1 << 31);
47 hw_desc->phy_next_desc = 0;
48 hw_desc->desc_command = (1 << 31);
49}
50
51static u32 mv_desc_get_dest_addr(struct mv_xor_desc_slot *desc)
52{
53 struct mv_xor_desc *hw_desc = desc->hw_desc;
54 return hw_desc->phy_dest_addr;
55}
56
57static u32 mv_desc_get_src_addr(struct mv_xor_desc_slot *desc,
58 int src_idx)
59{
60 struct mv_xor_desc *hw_desc = desc->hw_desc;
61 return hw_desc->phy_src_addr[src_idx];
62}
63
64
65static void mv_desc_set_byte_count(struct mv_xor_desc_slot *desc,
66 u32 byte_count)
67{
68 struct mv_xor_desc *hw_desc = desc->hw_desc;
69 hw_desc->byte_count = byte_count;
70}
71
72static void mv_desc_set_next_desc(struct mv_xor_desc_slot *desc,
73 u32 next_desc_addr)
74{
75 struct mv_xor_desc *hw_desc = desc->hw_desc;
76 BUG_ON(hw_desc->phy_next_desc);
77 hw_desc->phy_next_desc = next_desc_addr;
78}
79
80static void mv_desc_clear_next_desc(struct mv_xor_desc_slot *desc)
81{
82 struct mv_xor_desc *hw_desc = desc->hw_desc;
83 hw_desc->phy_next_desc = 0;
84}
85
86static void mv_desc_set_block_fill_val(struct mv_xor_desc_slot *desc, u32 val)
87{
88 desc->value = val;
89}
90
91static void mv_desc_set_dest_addr(struct mv_xor_desc_slot *desc,
92 dma_addr_t addr)
93{
94 struct mv_xor_desc *hw_desc = desc->hw_desc;
95 hw_desc->phy_dest_addr = addr;
96}
97
98static int mv_chan_memset_slot_count(size_t len)
99{
100 return 1;
101}
102
103#define mv_chan_memcpy_slot_count(c) mv_chan_memset_slot_count(c)
104
105static void mv_desc_set_src_addr(struct mv_xor_desc_slot *desc,
106 int index, dma_addr_t addr)
107{
108 struct mv_xor_desc *hw_desc = desc->hw_desc;
109 hw_desc->phy_src_addr[index] = addr;
110 if (desc->type == DMA_XOR)
111 hw_desc->desc_command |= (1 << index);
112}
113
114static u32 mv_chan_get_current_desc(struct mv_xor_chan *chan)
115{
116 return __raw_readl(XOR_CURR_DESC(chan));
117}
118
119static void mv_chan_set_next_descriptor(struct mv_xor_chan *chan,
120 u32 next_desc_addr)
121{
122 __raw_writel(next_desc_addr, XOR_NEXT_DESC(chan));
123}
124
125static void mv_chan_set_dest_pointer(struct mv_xor_chan *chan, u32 desc_addr)
126{
127 __raw_writel(desc_addr, XOR_DEST_POINTER(chan));
128}
129
130static void mv_chan_set_block_size(struct mv_xor_chan *chan, u32 block_size)
131{
132 __raw_writel(block_size, XOR_BLOCK_SIZE(chan));
133}
134
135static void mv_chan_set_value(struct mv_xor_chan *chan, u32 value)
136{
137 __raw_writel(value, XOR_INIT_VALUE_LOW(chan));
138 __raw_writel(value, XOR_INIT_VALUE_HIGH(chan));
139}
140
141static void mv_chan_unmask_interrupts(struct mv_xor_chan *chan)
142{
143 u32 val = __raw_readl(XOR_INTR_MASK(chan));
144 val |= XOR_INTR_MASK_VALUE << (chan->idx * 16);
145 __raw_writel(val, XOR_INTR_MASK(chan));
146}
147
148static u32 mv_chan_get_intr_cause(struct mv_xor_chan *chan)
149{
150 u32 intr_cause = __raw_readl(XOR_INTR_CAUSE(chan));
151 intr_cause = (intr_cause >> (chan->idx * 16)) & 0xFFFF;
152 return intr_cause;
153}
154
155static int mv_is_err_intr(u32 intr_cause)
156{
157 if (intr_cause & ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)))
158 return 1;
159
160 return 0;
161}
162
163static void mv_xor_device_clear_eoc_cause(struct mv_xor_chan *chan)
164{
165 u32 val = (1 << (1 + (chan->idx * 16)));
166 dev_dbg(chan->device->common.dev, "%s, val 0x%08x\n", __func__, val);
167 __raw_writel(val, XOR_INTR_CAUSE(chan));
168}
169
170static void mv_xor_device_clear_err_status(struct mv_xor_chan *chan)
171{
172 u32 val = 0xFFFF0000 >> (chan->idx * 16);
173 __raw_writel(val, XOR_INTR_CAUSE(chan));
174}
175
176static int mv_can_chain(struct mv_xor_desc_slot *desc)
177{
178 struct mv_xor_desc_slot *chain_old_tail = list_entry(
179 desc->chain_node.prev, struct mv_xor_desc_slot, chain_node);
180
181 if (chain_old_tail->type != desc->type)
182 return 0;
183 if (desc->type == DMA_MEMSET)
184 return 0;
185
186 return 1;
187}
188
189static void mv_set_mode(struct mv_xor_chan *chan,
190 enum dma_transaction_type type)
191{
192 u32 op_mode;
193 u32 config = __raw_readl(XOR_CONFIG(chan));
194
195 switch (type) {
196 case DMA_XOR:
197 op_mode = XOR_OPERATION_MODE_XOR;
198 break;
199 case DMA_MEMCPY:
200 op_mode = XOR_OPERATION_MODE_MEMCPY;
201 break;
202 case DMA_MEMSET:
203 op_mode = XOR_OPERATION_MODE_MEMSET;
204 break;
205 default:
206 dev_printk(KERN_ERR, chan->device->common.dev,
207 "error: unsupported operation %d.\n",
208 type);
209 BUG();
210 return;
211 }
212
213 config &= ~0x7;
214 config |= op_mode;
215 __raw_writel(config, XOR_CONFIG(chan));
216 chan->current_type = type;
217}
218
219static void mv_chan_activate(struct mv_xor_chan *chan)
220{
221 u32 activation;
222
223 dev_dbg(chan->device->common.dev, " activate chan.\n");
224 activation = __raw_readl(XOR_ACTIVATION(chan));
225 activation |= 0x1;
226 __raw_writel(activation, XOR_ACTIVATION(chan));
227}
228
229static char mv_chan_is_busy(struct mv_xor_chan *chan)
230{
231 u32 state = __raw_readl(XOR_ACTIVATION(chan));
232
233 state = (state >> 4) & 0x3;
234
235 return (state == 1) ? 1 : 0;
236}
237
238static int mv_chan_xor_slot_count(size_t len, int src_cnt)
239{
240 return 1;
241}
242
243/**
244 * mv_xor_free_slots - flags descriptor slots for reuse
245 * @slot: Slot to free
246 * Caller must hold &mv_chan->lock while calling this function
247 */
248static void mv_xor_free_slots(struct mv_xor_chan *mv_chan,
249 struct mv_xor_desc_slot *slot)
250{
251 dev_dbg(mv_chan->device->common.dev, "%s %d slot %p\n",
252 __func__, __LINE__, slot);
253
254 slot->slots_per_op = 0;
255
256}
257
258/*
259 * mv_xor_start_new_chain - program the engine to operate on new chain headed by
260 * sw_desc
261 * Caller must hold &mv_chan->lock while calling this function
262 */
263static void mv_xor_start_new_chain(struct mv_xor_chan *mv_chan,
264 struct mv_xor_desc_slot *sw_desc)
265{
266 dev_dbg(mv_chan->device->common.dev, "%s %d: sw_desc %p\n",
267 __func__, __LINE__, sw_desc);
268 if (sw_desc->type != mv_chan->current_type)
269 mv_set_mode(mv_chan, sw_desc->type);
270
271 if (sw_desc->type == DMA_MEMSET) {
272 /* for memset requests we need to program the engine, no
273 * descriptors used.
274 */
275 struct mv_xor_desc *hw_desc = sw_desc->hw_desc;
276 mv_chan_set_dest_pointer(mv_chan, hw_desc->phy_dest_addr);
277 mv_chan_set_block_size(mv_chan, sw_desc->unmap_len);
278 mv_chan_set_value(mv_chan, sw_desc->value);
279 } else {
280 /* set the hardware chain */
281 mv_chan_set_next_descriptor(mv_chan, sw_desc->async_tx.phys);
282 }
283 mv_chan->pending += sw_desc->slot_cnt;
284 mv_xor_issue_pending(&mv_chan->common);
285}
286
287static dma_cookie_t
288mv_xor_run_tx_complete_actions(struct mv_xor_desc_slot *desc,
289 struct mv_xor_chan *mv_chan, dma_cookie_t cookie)
290{
291 BUG_ON(desc->async_tx.cookie < 0);
292
293 if (desc->async_tx.cookie > 0) {
294 cookie = desc->async_tx.cookie;
295
296 /* call the callback (must not sleep or submit new
297 * operations to this channel)
298 */
299 if (desc->async_tx.callback)
300 desc->async_tx.callback(
301 desc->async_tx.callback_param);
302
303 /* unmap dma addresses
304 * (unmap_single vs unmap_page?)
305 */
306 if (desc->group_head && desc->unmap_len) {
307 struct mv_xor_desc_slot *unmap = desc->group_head;
308 struct device *dev =
309 &mv_chan->device->pdev->dev;
310 u32 len = unmap->unmap_len;
311 enum dma_ctrl_flags flags = desc->async_tx.flags;
312 u32 src_cnt;
313 dma_addr_t addr;
314
315 if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) {
316 addr = mv_desc_get_dest_addr(unmap);
317 dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE);
318 }
319
320 if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) {
321 src_cnt = unmap->unmap_src_cnt;
322 while (src_cnt--) {
323 addr = mv_desc_get_src_addr(unmap,
324 src_cnt);
325 dma_unmap_page(dev, addr, len,
326 DMA_TO_DEVICE);
327 }
328 }
329 desc->group_head = NULL;
330 }
331 }
332
333 /* run dependent operations */
334 async_tx_run_dependencies(&desc->async_tx);
335
336 return cookie;
337}
338
339static int
340mv_xor_clean_completed_slots(struct mv_xor_chan *mv_chan)
341{
342 struct mv_xor_desc_slot *iter, *_iter;
343
344 dev_dbg(mv_chan->device->common.dev, "%s %d\n", __func__, __LINE__);
345 list_for_each_entry_safe(iter, _iter, &mv_chan->completed_slots,
346 completed_node) {
347
348 if (async_tx_test_ack(&iter->async_tx)) {
349 list_del(&iter->completed_node);
350 mv_xor_free_slots(mv_chan, iter);
351 }
352 }
353 return 0;
354}
355
356static int
357mv_xor_clean_slot(struct mv_xor_desc_slot *desc,
358 struct mv_xor_chan *mv_chan)
359{
360 dev_dbg(mv_chan->device->common.dev, "%s %d: desc %p flags %d\n",
361 __func__, __LINE__, desc, desc->async_tx.flags);
362 list_del(&desc->chain_node);
363 /* the client is allowed to attach dependent operations
364 * until 'ack' is set
365 */
366 if (!async_tx_test_ack(&desc->async_tx)) {
367 /* move this slot to the completed_slots */
368 list_add_tail(&desc->completed_node, &mv_chan->completed_slots);
369 return 0;
370 }
371
372 mv_xor_free_slots(mv_chan, desc);
373 return 0;
374}
375
376static void __mv_xor_slot_cleanup(struct mv_xor_chan *mv_chan)
377{
378 struct mv_xor_desc_slot *iter, *_iter;
379 dma_cookie_t cookie = 0;
380 int busy = mv_chan_is_busy(mv_chan);
381 u32 current_desc = mv_chan_get_current_desc(mv_chan);
382 int seen_current = 0;
383
384 dev_dbg(mv_chan->device->common.dev, "%s %d\n", __func__, __LINE__);
385 dev_dbg(mv_chan->device->common.dev, "current_desc %x\n", current_desc);
386 mv_xor_clean_completed_slots(mv_chan);
387
388 /* free completed slots from the chain starting with
389 * the oldest descriptor
390 */
391
392 list_for_each_entry_safe(iter, _iter, &mv_chan->chain,
393 chain_node) {
394 prefetch(_iter);
395 prefetch(&_iter->async_tx);
396
397 /* do not advance past the current descriptor loaded into the
398 * hardware channel, subsequent descriptors are either in
399 * process or have not been submitted
400 */
401 if (seen_current)
402 break;
403
404 /* stop the search if we reach the current descriptor and the
405 * channel is busy
406 */
407 if (iter->async_tx.phys == current_desc) {
408 seen_current = 1;
409 if (busy)
410 break;
411 }
412
413 cookie = mv_xor_run_tx_complete_actions(iter, mv_chan, cookie);
414
415 if (mv_xor_clean_slot(iter, mv_chan))
416 break;
417 }
418
419 if ((busy == 0) && !list_empty(&mv_chan->chain)) {
420 struct mv_xor_desc_slot *chain_head;
421 chain_head = list_entry(mv_chan->chain.next,
422 struct mv_xor_desc_slot,
423 chain_node);
424
425 mv_xor_start_new_chain(mv_chan, chain_head);
426 }
427
428 if (cookie > 0)
429 mv_chan->completed_cookie = cookie;
430}
431
432static void
433mv_xor_slot_cleanup(struct mv_xor_chan *mv_chan)
434{
435 spin_lock_bh(&mv_chan->lock);
436 __mv_xor_slot_cleanup(mv_chan);
437 spin_unlock_bh(&mv_chan->lock);
438}
439
440static void mv_xor_tasklet(unsigned long data)
441{
442 struct mv_xor_chan *chan = (struct mv_xor_chan *) data;
443 __mv_xor_slot_cleanup(chan);
444}
445
446static struct mv_xor_desc_slot *
447mv_xor_alloc_slots(struct mv_xor_chan *mv_chan, int num_slots,
448 int slots_per_op)
449{
450 struct mv_xor_desc_slot *iter, *_iter, *alloc_start = NULL;
451 LIST_HEAD(chain);
452 int slots_found, retry = 0;
453
454 /* start search from the last allocated descrtiptor
455 * if a contiguous allocation can not be found start searching
456 * from the beginning of the list
457 */
458retry:
459 slots_found = 0;
460 if (retry == 0)
461 iter = mv_chan->last_used;
462 else
463 iter = list_entry(&mv_chan->all_slots,
464 struct mv_xor_desc_slot,
465 slot_node);
466
467 list_for_each_entry_safe_continue(
468 iter, _iter, &mv_chan->all_slots, slot_node) {
469 prefetch(_iter);
470 prefetch(&_iter->async_tx);
471 if (iter->slots_per_op) {
472 /* give up after finding the first busy slot
473 * on the second pass through the list
474 */
475 if (retry)
476 break;
477
478 slots_found = 0;
479 continue;
480 }
481
482 /* start the allocation if the slot is correctly aligned */
483 if (!slots_found++)
484 alloc_start = iter;
485
486 if (slots_found == num_slots) {
487 struct mv_xor_desc_slot *alloc_tail = NULL;
488 struct mv_xor_desc_slot *last_used = NULL;
489 iter = alloc_start;
490 while (num_slots) {
491 int i;
492
493 /* pre-ack all but the last descriptor */
494 async_tx_ack(&iter->async_tx);
495
496 list_add_tail(&iter->chain_node, &chain);
497 alloc_tail = iter;
498 iter->async_tx.cookie = 0;
499 iter->slot_cnt = num_slots;
500 iter->xor_check_result = NULL;
501 for (i = 0; i < slots_per_op; i++) {
502 iter->slots_per_op = slots_per_op - i;
503 last_used = iter;
504 iter = list_entry(iter->slot_node.next,
505 struct mv_xor_desc_slot,
506 slot_node);
507 }
508 num_slots -= slots_per_op;
509 }
510 alloc_tail->group_head = alloc_start;
511 alloc_tail->async_tx.cookie = -EBUSY;
512 list_splice(&chain, &alloc_tail->async_tx.tx_list);
513 mv_chan->last_used = last_used;
514 mv_desc_clear_next_desc(alloc_start);
515 mv_desc_clear_next_desc(alloc_tail);
516 return alloc_tail;
517 }
518 }
519 if (!retry++)
520 goto retry;
521
522 /* try to free some slots if the allocation fails */
523 tasklet_schedule(&mv_chan->irq_tasklet);
524
525 return NULL;
526}
527
528static dma_cookie_t
529mv_desc_assign_cookie(struct mv_xor_chan *mv_chan,
530 struct mv_xor_desc_slot *desc)
531{
532 dma_cookie_t cookie = mv_chan->common.cookie;
533
534 if (++cookie < 0)
535 cookie = 1;
536 mv_chan->common.cookie = desc->async_tx.cookie = cookie;
537 return cookie;
538}
539
540/************************ DMA engine API functions ****************************/
541static dma_cookie_t
542mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
543{
544 struct mv_xor_desc_slot *sw_desc = to_mv_xor_slot(tx);
545 struct mv_xor_chan *mv_chan = to_mv_xor_chan(tx->chan);
546 struct mv_xor_desc_slot *grp_start, *old_chain_tail;
547 dma_cookie_t cookie;
548 int new_hw_chain = 1;
549
550 dev_dbg(mv_chan->device->common.dev,
551 "%s sw_desc %p: async_tx %p\n",
552 __func__, sw_desc, &sw_desc->async_tx);
553
554 grp_start = sw_desc->group_head;
555
556 spin_lock_bh(&mv_chan->lock);
557 cookie = mv_desc_assign_cookie(mv_chan, sw_desc);
558
559 if (list_empty(&mv_chan->chain))
560 list_splice_init(&sw_desc->async_tx.tx_list, &mv_chan->chain);
561 else {
562 new_hw_chain = 0;
563
564 old_chain_tail = list_entry(mv_chan->chain.prev,
565 struct mv_xor_desc_slot,
566 chain_node);
567 list_splice_init(&grp_start->async_tx.tx_list,
568 &old_chain_tail->chain_node);
569
570 if (!mv_can_chain(grp_start))
571 goto submit_done;
572
573 dev_dbg(mv_chan->device->common.dev, "Append to last desc %x\n",
574 old_chain_tail->async_tx.phys);
575
576 /* fix up the hardware chain */
577 mv_desc_set_next_desc(old_chain_tail, grp_start->async_tx.phys);
578
579 /* if the channel is not busy */
580 if (!mv_chan_is_busy(mv_chan)) {
581 u32 current_desc = mv_chan_get_current_desc(mv_chan);
582 /*
583 * and the curren desc is the end of the chain before
584 * the append, then we need to start the channel
585 */
586 if (current_desc == old_chain_tail->async_tx.phys)
587 new_hw_chain = 1;
588 }
589 }
590
591 if (new_hw_chain)
592 mv_xor_start_new_chain(mv_chan, grp_start);
593
594submit_done:
595 spin_unlock_bh(&mv_chan->lock);
596
597 return cookie;
598}
599
600/* returns the number of allocated descriptors */
601static int mv_xor_alloc_chan_resources(struct dma_chan *chan,
602 struct dma_client *client)
603{
604 char *hw_desc;
605 int idx;
606 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
607 struct mv_xor_desc_slot *slot = NULL;
608 struct mv_xor_platform_data *plat_data =
609 mv_chan->device->pdev->dev.platform_data;
610 int num_descs_in_pool = plat_data->pool_size/MV_XOR_SLOT_SIZE;
611
612 /* Allocate descriptor slots */
613 idx = mv_chan->slots_allocated;
614 while (idx < num_descs_in_pool) {
615 slot = kzalloc(sizeof(*slot), GFP_KERNEL);
616 if (!slot) {
617 printk(KERN_INFO "MV XOR Channel only initialized"
618 " %d descriptor slots", idx);
619 break;
620 }
621 hw_desc = (char *) mv_chan->device->dma_desc_pool_virt;
622 slot->hw_desc = (void *) &hw_desc[idx * MV_XOR_SLOT_SIZE];
623
624 dma_async_tx_descriptor_init(&slot->async_tx, chan);
625 slot->async_tx.tx_submit = mv_xor_tx_submit;
626 INIT_LIST_HEAD(&slot->chain_node);
627 INIT_LIST_HEAD(&slot->slot_node);
628 INIT_LIST_HEAD(&slot->async_tx.tx_list);
629 hw_desc = (char *) mv_chan->device->dma_desc_pool;
630 slot->async_tx.phys =
631 (dma_addr_t) &hw_desc[idx * MV_XOR_SLOT_SIZE];
632 slot->idx = idx++;
633
634 spin_lock_bh(&mv_chan->lock);
635 mv_chan->slots_allocated = idx;
636 list_add_tail(&slot->slot_node, &mv_chan->all_slots);
637 spin_unlock_bh(&mv_chan->lock);
638 }
639
640 if (mv_chan->slots_allocated && !mv_chan->last_used)
641 mv_chan->last_used = list_entry(mv_chan->all_slots.next,
642 struct mv_xor_desc_slot,
643 slot_node);
644
645 dev_dbg(mv_chan->device->common.dev,
646 "allocated %d descriptor slots last_used: %p\n",
647 mv_chan->slots_allocated, mv_chan->last_used);
648
649 return mv_chan->slots_allocated ? : -ENOMEM;
650}
651
652static struct dma_async_tx_descriptor *
653mv_xor_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
654 size_t len, unsigned long flags)
655{
656 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
657 struct mv_xor_desc_slot *sw_desc, *grp_start;
658 int slot_cnt;
659
660 dev_dbg(mv_chan->device->common.dev,
661 "%s dest: %x src %x len: %u flags: %ld\n",
662 __func__, dest, src, len, flags);
663 if (unlikely(len < MV_XOR_MIN_BYTE_COUNT))
664 return NULL;
665
666 BUG_ON(unlikely(len > MV_XOR_MAX_BYTE_COUNT));
667
668 spin_lock_bh(&mv_chan->lock);
669 slot_cnt = mv_chan_memcpy_slot_count(len);
670 sw_desc = mv_xor_alloc_slots(mv_chan, slot_cnt, 1);
671 if (sw_desc) {
672 sw_desc->type = DMA_MEMCPY;
673 sw_desc->async_tx.flags = flags;
674 grp_start = sw_desc->group_head;
675 mv_desc_init(grp_start, flags);
676 mv_desc_set_byte_count(grp_start, len);
677 mv_desc_set_dest_addr(sw_desc->group_head, dest);
678 mv_desc_set_src_addr(grp_start, 0, src);
679 sw_desc->unmap_src_cnt = 1;
680 sw_desc->unmap_len = len;
681 }
682 spin_unlock_bh(&mv_chan->lock);
683
684 dev_dbg(mv_chan->device->common.dev,
685 "%s sw_desc %p async_tx %p\n",
686 __func__, sw_desc, sw_desc ? &sw_desc->async_tx : 0);
687
688 return sw_desc ? &sw_desc->async_tx : NULL;
689}
690
691static struct dma_async_tx_descriptor *
692mv_xor_prep_dma_memset(struct dma_chan *chan, dma_addr_t dest, int value,
693 size_t len, unsigned long flags)
694{
695 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
696 struct mv_xor_desc_slot *sw_desc, *grp_start;
697 int slot_cnt;
698
699 dev_dbg(mv_chan->device->common.dev,
700 "%s dest: %x len: %u flags: %ld\n",
701 __func__, dest, len, flags);
702 if (unlikely(len < MV_XOR_MIN_BYTE_COUNT))
703 return NULL;
704
705 BUG_ON(unlikely(len > MV_XOR_MAX_BYTE_COUNT));
706
707 spin_lock_bh(&mv_chan->lock);
708 slot_cnt = mv_chan_memset_slot_count(len);
709 sw_desc = mv_xor_alloc_slots(mv_chan, slot_cnt, 1);
710 if (sw_desc) {
711 sw_desc->type = DMA_MEMSET;
712 sw_desc->async_tx.flags = flags;
713 grp_start = sw_desc->group_head;
714 mv_desc_init(grp_start, flags);
715 mv_desc_set_byte_count(grp_start, len);
716 mv_desc_set_dest_addr(sw_desc->group_head, dest);
717 mv_desc_set_block_fill_val(grp_start, value);
718 sw_desc->unmap_src_cnt = 1;
719 sw_desc->unmap_len = len;
720 }
721 spin_unlock_bh(&mv_chan->lock);
722 dev_dbg(mv_chan->device->common.dev,
723 "%s sw_desc %p async_tx %p \n",
724 __func__, sw_desc, &sw_desc->async_tx);
725 return sw_desc ? &sw_desc->async_tx : NULL;
726}
727
728static struct dma_async_tx_descriptor *
729mv_xor_prep_dma_xor(struct dma_chan *chan, dma_addr_t dest, dma_addr_t *src,
730 unsigned int src_cnt, size_t len, unsigned long flags)
731{
732 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
733 struct mv_xor_desc_slot *sw_desc, *grp_start;
734 int slot_cnt;
735
736 if (unlikely(len < MV_XOR_MIN_BYTE_COUNT))
737 return NULL;
738
739 BUG_ON(unlikely(len > MV_XOR_MAX_BYTE_COUNT));
740
741 dev_dbg(mv_chan->device->common.dev,
742 "%s src_cnt: %d len: dest %x %u flags: %ld\n",
743 __func__, src_cnt, len, dest, flags);
744
745 spin_lock_bh(&mv_chan->lock);
746 slot_cnt = mv_chan_xor_slot_count(len, src_cnt);
747 sw_desc = mv_xor_alloc_slots(mv_chan, slot_cnt, 1);
748 if (sw_desc) {
749 sw_desc->type = DMA_XOR;
750 sw_desc->async_tx.flags = flags;
751 grp_start = sw_desc->group_head;
752 mv_desc_init(grp_start, flags);
753 /* the byte count field is the same as in memcpy desc*/
754 mv_desc_set_byte_count(grp_start, len);
755 mv_desc_set_dest_addr(sw_desc->group_head, dest);
756 sw_desc->unmap_src_cnt = src_cnt;
757 sw_desc->unmap_len = len;
758 while (src_cnt--)
759 mv_desc_set_src_addr(grp_start, src_cnt, src[src_cnt]);
760 }
761 spin_unlock_bh(&mv_chan->lock);
762 dev_dbg(mv_chan->device->common.dev,
763 "%s sw_desc %p async_tx %p \n",
764 __func__, sw_desc, &sw_desc->async_tx);
765 return sw_desc ? &sw_desc->async_tx : NULL;
766}
767
768static void mv_xor_free_chan_resources(struct dma_chan *chan)
769{
770 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
771 struct mv_xor_desc_slot *iter, *_iter;
772 int in_use_descs = 0;
773
774 mv_xor_slot_cleanup(mv_chan);
775
776 spin_lock_bh(&mv_chan->lock);
777 list_for_each_entry_safe(iter, _iter, &mv_chan->chain,
778 chain_node) {
779 in_use_descs++;
780 list_del(&iter->chain_node);
781 }
782 list_for_each_entry_safe(iter, _iter, &mv_chan->completed_slots,
783 completed_node) {
784 in_use_descs++;
785 list_del(&iter->completed_node);
786 }
787 list_for_each_entry_safe_reverse(
788 iter, _iter, &mv_chan->all_slots, slot_node) {
789 list_del(&iter->slot_node);
790 kfree(iter);
791 mv_chan->slots_allocated--;
792 }
793 mv_chan->last_used = NULL;
794
795 dev_dbg(mv_chan->device->common.dev, "%s slots_allocated %d\n",
796 __func__, mv_chan->slots_allocated);
797 spin_unlock_bh(&mv_chan->lock);
798
799 if (in_use_descs)
800 dev_err(mv_chan->device->common.dev,
801 "freeing %d in use descriptors!\n", in_use_descs);
802}
803
804/**
805 * mv_xor_is_complete - poll the status of an XOR transaction
806 * @chan: XOR channel handle
807 * @cookie: XOR transaction identifier
808 */
809static enum dma_status mv_xor_is_complete(struct dma_chan *chan,
810 dma_cookie_t cookie,
811 dma_cookie_t *done,
812 dma_cookie_t *used)
813{
814 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
815 dma_cookie_t last_used;
816 dma_cookie_t last_complete;
817 enum dma_status ret;
818
819 last_used = chan->cookie;
820 last_complete = mv_chan->completed_cookie;
821 mv_chan->is_complete_cookie = cookie;
822 if (done)
823 *done = last_complete;
824 if (used)
825 *used = last_used;
826
827 ret = dma_async_is_complete(cookie, last_complete, last_used);
828 if (ret == DMA_SUCCESS) {
829 mv_xor_clean_completed_slots(mv_chan);
830 return ret;
831 }
832 mv_xor_slot_cleanup(mv_chan);
833
834 last_used = chan->cookie;
835 last_complete = mv_chan->completed_cookie;
836
837 if (done)
838 *done = last_complete;
839 if (used)
840 *used = last_used;
841
842 return dma_async_is_complete(cookie, last_complete, last_used);
843}
844
845static void mv_dump_xor_regs(struct mv_xor_chan *chan)
846{
847 u32 val;
848
849 val = __raw_readl(XOR_CONFIG(chan));
850 dev_printk(KERN_ERR, chan->device->common.dev,
851 "config 0x%08x.\n", val);
852
853 val = __raw_readl(XOR_ACTIVATION(chan));
854 dev_printk(KERN_ERR, chan->device->common.dev,
855 "activation 0x%08x.\n", val);
856
857 val = __raw_readl(XOR_INTR_CAUSE(chan));
858 dev_printk(KERN_ERR, chan->device->common.dev,
859 "intr cause 0x%08x.\n", val);
860
861 val = __raw_readl(XOR_INTR_MASK(chan));
862 dev_printk(KERN_ERR, chan->device->common.dev,
863 "intr mask 0x%08x.\n", val);
864
865 val = __raw_readl(XOR_ERROR_CAUSE(chan));
866 dev_printk(KERN_ERR, chan->device->common.dev,
867 "error cause 0x%08x.\n", val);
868
869 val = __raw_readl(XOR_ERROR_ADDR(chan));
870 dev_printk(KERN_ERR, chan->device->common.dev,
871 "error addr 0x%08x.\n", val);
872}
873
874static void mv_xor_err_interrupt_handler(struct mv_xor_chan *chan,
875 u32 intr_cause)
876{
877 if (intr_cause & (1 << 4)) {
878 dev_dbg(chan->device->common.dev,
879 "ignore this error\n");
880 return;
881 }
882
883 dev_printk(KERN_ERR, chan->device->common.dev,
884 "error on chan %d. intr cause 0x%08x.\n",
885 chan->idx, intr_cause);
886
887 mv_dump_xor_regs(chan);
888 BUG();
889}
890
891static irqreturn_t mv_xor_interrupt_handler(int irq, void *data)
892{
893 struct mv_xor_chan *chan = data;
894 u32 intr_cause = mv_chan_get_intr_cause(chan);
895
896 dev_dbg(chan->device->common.dev, "intr cause %x\n", intr_cause);
897
898 if (mv_is_err_intr(intr_cause))
899 mv_xor_err_interrupt_handler(chan, intr_cause);
900
901 tasklet_schedule(&chan->irq_tasklet);
902
903 mv_xor_device_clear_eoc_cause(chan);
904
905 return IRQ_HANDLED;
906}
907
908static void mv_xor_issue_pending(struct dma_chan *chan)
909{
910 struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
911
912 if (mv_chan->pending >= MV_XOR_THRESHOLD) {
913 mv_chan->pending = 0;
914 mv_chan_activate(mv_chan);
915 }
916}
917
918/*
919 * Perform a transaction to verify the HW works.
920 */
921#define MV_XOR_TEST_SIZE 2000
922
923static int __devinit mv_xor_memcpy_self_test(struct mv_xor_device *device)
924{
925 int i;
926 void *src, *dest;
927 dma_addr_t src_dma, dest_dma;
928 struct dma_chan *dma_chan;
929 dma_cookie_t cookie;
930 struct dma_async_tx_descriptor *tx;
931 int err = 0;
932 struct mv_xor_chan *mv_chan;
933
934 src = kmalloc(sizeof(u8) * MV_XOR_TEST_SIZE, GFP_KERNEL);
935 if (!src)
936 return -ENOMEM;
937
938 dest = kzalloc(sizeof(u8) * MV_XOR_TEST_SIZE, GFP_KERNEL);
939 if (!dest) {
940 kfree(src);
941 return -ENOMEM;
942 }
943
944 /* Fill in src buffer */
945 for (i = 0; i < MV_XOR_TEST_SIZE; i++)
946 ((u8 *) src)[i] = (u8)i;
947
948 /* Start copy, using first DMA channel */
949 dma_chan = container_of(device->common.channels.next,
950 struct dma_chan,
951 device_node);
952 if (mv_xor_alloc_chan_resources(dma_chan, NULL) < 1) {
953 err = -ENODEV;
954 goto out;
955 }
956
957 dest_dma = dma_map_single(dma_chan->device->dev, dest,
958 MV_XOR_TEST_SIZE, DMA_FROM_DEVICE);
959
960 src_dma = dma_map_single(dma_chan->device->dev, src,
961 MV_XOR_TEST_SIZE, DMA_TO_DEVICE);
962
963 tx = mv_xor_prep_dma_memcpy(dma_chan, dest_dma, src_dma,
964 MV_XOR_TEST_SIZE, 0);
965 cookie = mv_xor_tx_submit(tx);
966 mv_xor_issue_pending(dma_chan);
967 async_tx_ack(tx);
968 msleep(1);
969
970 if (mv_xor_is_complete(dma_chan, cookie, NULL, NULL) !=
971 DMA_SUCCESS) {
972 dev_printk(KERN_ERR, dma_chan->device->dev,
973 "Self-test copy timed out, disabling\n");
974 err = -ENODEV;
975 goto free_resources;
976 }
977
978 mv_chan = to_mv_xor_chan(dma_chan);
979 dma_sync_single_for_cpu(&mv_chan->device->pdev->dev, dest_dma,
980 MV_XOR_TEST_SIZE, DMA_FROM_DEVICE);
981 if (memcmp(src, dest, MV_XOR_TEST_SIZE)) {
982 dev_printk(KERN_ERR, dma_chan->device->dev,
983 "Self-test copy failed compare, disabling\n");
984 err = -ENODEV;
985 goto free_resources;
986 }
987
988free_resources:
989 mv_xor_free_chan_resources(dma_chan);
990out:
991 kfree(src);
992 kfree(dest);
993 return err;
994}
995
996#define MV_XOR_NUM_SRC_TEST 4 /* must be <= 15 */
997static int __devinit
998mv_xor_xor_self_test(struct mv_xor_device *device)
999{
1000 int i, src_idx;
1001 struct page *dest;
1002 struct page *xor_srcs[MV_XOR_NUM_SRC_TEST];
1003 dma_addr_t dma_srcs[MV_XOR_NUM_SRC_TEST];
1004 dma_addr_t dest_dma;
1005 struct dma_async_tx_descriptor *tx;
1006 struct dma_chan *dma_chan;
1007 dma_cookie_t cookie;
1008 u8 cmp_byte = 0;
1009 u32 cmp_word;
1010 int err = 0;
1011 struct mv_xor_chan *mv_chan;
1012
1013 for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {
1014 xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
1015 if (!xor_srcs[src_idx])
1016 while (src_idx--) {
1017 __free_page(xor_srcs[src_idx]);
1018 return -ENOMEM;
1019 }
1020 }
1021
1022 dest = alloc_page(GFP_KERNEL);
1023 if (!dest)
1024 while (src_idx--) {
1025 __free_page(xor_srcs[src_idx]);
1026 return -ENOMEM;
1027 }
1028
1029 /* Fill in src buffers */
1030 for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {
1031 u8 *ptr = page_address(xor_srcs[src_idx]);
1032 for (i = 0; i < PAGE_SIZE; i++)
1033 ptr[i] = (1 << src_idx);
1034 }
1035
1036 for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++)
1037 cmp_byte ^= (u8) (1 << src_idx);
1038
1039 cmp_word = (cmp_byte << 24) | (cmp_byte << 16) |
1040 (cmp_byte << 8) | cmp_byte;
1041
1042 memset(page_address(dest), 0, PAGE_SIZE);
1043
1044 dma_chan = container_of(device->common.channels.next,
1045 struct dma_chan,
1046 device_node);
1047 if (mv_xor_alloc_chan_resources(dma_chan, NULL) < 1) {
1048 err = -ENODEV;
1049 goto out;
1050 }
1051
1052 /* test xor */
1053 dest_dma = dma_map_page(dma_chan->device->dev, dest, 0, PAGE_SIZE,
1054 DMA_FROM_DEVICE);
1055
1056 for (i = 0; i < MV_XOR_NUM_SRC_TEST; i++)
1057 dma_srcs[i] = dma_map_page(dma_chan->device->dev, xor_srcs[i],
1058 0, PAGE_SIZE, DMA_TO_DEVICE);
1059
1060 tx = mv_xor_prep_dma_xor(dma_chan, dest_dma, dma_srcs,
1061 MV_XOR_NUM_SRC_TEST, PAGE_SIZE, 0);
1062
1063 cookie = mv_xor_tx_submit(tx);
1064 mv_xor_issue_pending(dma_chan);
1065 async_tx_ack(tx);
1066 msleep(8);
1067
1068 if (mv_xor_is_complete(dma_chan, cookie, NULL, NULL) !=
1069 DMA_SUCCESS) {
1070 dev_printk(KERN_ERR, dma_chan->device->dev,
1071 "Self-test xor timed out, disabling\n");
1072 err = -ENODEV;
1073 goto free_resources;
1074 }
1075
1076 mv_chan = to_mv_xor_chan(dma_chan);
1077 dma_sync_single_for_cpu(&mv_chan->device->pdev->dev, dest_dma,
1078 PAGE_SIZE, DMA_FROM_DEVICE);
1079 for (i = 0; i < (PAGE_SIZE / sizeof(u32)); i++) {
1080 u32 *ptr = page_address(dest);
1081 if (ptr[i] != cmp_word) {
1082 dev_printk(KERN_ERR, dma_chan->device->dev,
1083 "Self-test xor failed compare, disabling."
1084 " index %d, data %x, expected %x\n", i,
1085 ptr[i], cmp_word);
1086 err = -ENODEV;
1087 goto free_resources;
1088 }
1089 }
1090
1091free_resources:
1092 mv_xor_free_chan_resources(dma_chan);
1093out:
1094 src_idx = MV_XOR_NUM_SRC_TEST;
1095 while (src_idx--)
1096 __free_page(xor_srcs[src_idx]);
1097 __free_page(dest);
1098 return err;
1099}
1100
1101static int __devexit mv_xor_remove(struct platform_device *dev)
1102{
1103 struct mv_xor_device *device = platform_get_drvdata(dev);
1104 struct dma_chan *chan, *_chan;
1105 struct mv_xor_chan *mv_chan;
1106 struct mv_xor_platform_data *plat_data = dev->dev.platform_data;
1107
1108 dma_async_device_unregister(&device->common);
1109
1110 dma_free_coherent(&dev->dev, plat_data->pool_size,
1111 device->dma_desc_pool_virt, device->dma_desc_pool);
1112
1113 list_for_each_entry_safe(chan, _chan, &device->common.channels,
1114 device_node) {
1115 mv_chan = to_mv_xor_chan(chan);
1116 list_del(&chan->device_node);
1117 }
1118
1119 return 0;
1120}
1121
1122static int __devinit mv_xor_probe(struct platform_device *pdev)
1123{
1124 int ret = 0;
1125 int irq;
1126 struct mv_xor_device *adev;
1127 struct mv_xor_chan *mv_chan;
1128 struct dma_device *dma_dev;
1129 struct mv_xor_platform_data *plat_data = pdev->dev.platform_data;
1130
1131
1132 adev = devm_kzalloc(&pdev->dev, sizeof(*adev), GFP_KERNEL);
1133 if (!adev)
1134 return -ENOMEM;
1135
1136 dma_dev = &adev->common;
1137
1138 /* allocate coherent memory for hardware descriptors
1139 * note: writecombine gives slightly better performance, but
1140 * requires that we explicitly flush the writes
1141 */
1142 adev->dma_desc_pool_virt = dma_alloc_writecombine(&pdev->dev,
1143 plat_data->pool_size,
1144 &adev->dma_desc_pool,
1145 GFP_KERNEL);
1146 if (!adev->dma_desc_pool_virt)
1147 return -ENOMEM;
1148
1149 adev->id = plat_data->hw_id;
1150
1151 /* discover transaction capabilites from the platform data */
1152 dma_dev->cap_mask = plat_data->cap_mask;
1153 adev->pdev = pdev;
1154 platform_set_drvdata(pdev, adev);
1155
1156 adev->shared = platform_get_drvdata(plat_data->shared);
1157
1158 INIT_LIST_HEAD(&dma_dev->channels);
1159
1160 /* set base routines */
1161 dma_dev->device_alloc_chan_resources = mv_xor_alloc_chan_resources;
1162 dma_dev->device_free_chan_resources = mv_xor_free_chan_resources;
1163 dma_dev->device_is_tx_complete = mv_xor_is_complete;
1164 dma_dev->device_issue_pending = mv_xor_issue_pending;
1165 dma_dev->dev = &pdev->dev;
1166
1167 /* set prep routines based on capability */
1168 if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask))
1169 dma_dev->device_prep_dma_memcpy = mv_xor_prep_dma_memcpy;
1170 if (dma_has_cap(DMA_MEMSET, dma_dev->cap_mask))
1171 dma_dev->device_prep_dma_memset = mv_xor_prep_dma_memset;
1172 if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) {
1173 dma_dev->max_xor = 8; ;
1174 dma_dev->device_prep_dma_xor = mv_xor_prep_dma_xor;
1175 }
1176
1177 mv_chan = devm_kzalloc(&pdev->dev, sizeof(*mv_chan), GFP_KERNEL);
1178 if (!mv_chan) {
1179 ret = -ENOMEM;
1180 goto err_free_dma;
1181 }
1182 mv_chan->device = adev;
1183 mv_chan->idx = plat_data->hw_id;
1184 mv_chan->mmr_base = adev->shared->xor_base;
1185
1186 if (!mv_chan->mmr_base) {
1187 ret = -ENOMEM;
1188 goto err_free_dma;
1189 }
1190 tasklet_init(&mv_chan->irq_tasklet, mv_xor_tasklet, (unsigned long)
1191 mv_chan);
1192
1193 /* clear errors before enabling interrupts */
1194 mv_xor_device_clear_err_status(mv_chan);
1195
1196 irq = platform_get_irq(pdev, 0);
1197 if (irq < 0) {
1198 ret = irq;
1199 goto err_free_dma;
1200 }
1201 ret = devm_request_irq(&pdev->dev, irq,
1202 mv_xor_interrupt_handler,
1203 0, dev_name(&pdev->dev), mv_chan);
1204 if (ret)
1205 goto err_free_dma;
1206
1207 mv_chan_unmask_interrupts(mv_chan);
1208
1209 mv_set_mode(mv_chan, DMA_MEMCPY);
1210
1211 spin_lock_init(&mv_chan->lock);
1212 INIT_LIST_HEAD(&mv_chan->chain);
1213 INIT_LIST_HEAD(&mv_chan->completed_slots);
1214 INIT_LIST_HEAD(&mv_chan->all_slots);
1215 INIT_RCU_HEAD(&mv_chan->common.rcu);
1216 mv_chan->common.device = dma_dev;
1217
1218 list_add_tail(&mv_chan->common.device_node, &dma_dev->channels);
1219
1220 if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
1221 ret = mv_xor_memcpy_self_test(adev);
1222 dev_dbg(&pdev->dev, "memcpy self test returned %d\n", ret);
1223 if (ret)
1224 goto err_free_dma;
1225 }
1226
1227 if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) {
1228 ret = mv_xor_xor_self_test(adev);
1229 dev_dbg(&pdev->dev, "xor self test returned %d\n", ret);
1230 if (ret)
1231 goto err_free_dma;
1232 }
1233
1234 dev_printk(KERN_INFO, &pdev->dev, "Marvell XOR: "
1235 "( %s%s%s%s)\n",
1236 dma_has_cap(DMA_XOR, dma_dev->cap_mask) ? "xor " : "",
1237 dma_has_cap(DMA_MEMSET, dma_dev->cap_mask) ? "fill " : "",
1238 dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask) ? "cpy " : "",
1239 dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask) ? "intr " : "");
1240
1241 dma_async_device_register(dma_dev);
1242 goto out;
1243
1244 err_free_dma:
1245 dma_free_coherent(&adev->pdev->dev, plat_data->pool_size,
1246 adev->dma_desc_pool_virt, adev->dma_desc_pool);
1247 out:
1248 return ret;
1249}
1250
1251static void
1252mv_xor_conf_mbus_windows(struct mv_xor_shared_private *msp,
1253 struct mbus_dram_target_info *dram)
1254{
1255 void __iomem *base = msp->xor_base;
1256 u32 win_enable = 0;
1257 int i;
1258
1259 for (i = 0; i < 8; i++) {
1260 writel(0, base + WINDOW_BASE(i));
1261 writel(0, base + WINDOW_SIZE(i));
1262 if (i < 4)
1263 writel(0, base + WINDOW_REMAP_HIGH(i));
1264 }
1265
1266 for (i = 0; i < dram->num_cs; i++) {
1267 struct mbus_dram_window *cs = dram->cs + i;
1268
1269 writel((cs->base & 0xffff0000) |
1270 (cs->mbus_attr << 8) |
1271 dram->mbus_dram_target_id, base + WINDOW_BASE(i));
1272 writel((cs->size - 1) & 0xffff0000, base + WINDOW_SIZE(i));
1273
1274 win_enable |= (1 << i);
1275 win_enable |= 3 << (16 + (2 * i));
1276 }
1277
1278 writel(win_enable, base + WINDOW_BAR_ENABLE(0));
1279 writel(win_enable, base + WINDOW_BAR_ENABLE(1));
1280}
1281
1282static struct platform_driver mv_xor_driver = {
1283 .probe = mv_xor_probe,
1284 .remove = mv_xor_remove,
1285 .driver = {
1286 .owner = THIS_MODULE,
1287 .name = MV_XOR_NAME,
1288 },
1289};
1290
1291static int mv_xor_shared_probe(struct platform_device *pdev)
1292{
1293 struct mv_xor_platform_shared_data *msd = pdev->dev.platform_data;
1294 struct mv_xor_shared_private *msp;
1295 struct resource *res;
1296
1297 dev_printk(KERN_NOTICE, &pdev->dev, "Marvell shared XOR driver\n");
1298
1299 msp = devm_kzalloc(&pdev->dev, sizeof(*msp), GFP_KERNEL);
1300 if (!msp)
1301 return -ENOMEM;
1302
1303 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1304 if (!res)
1305 return -ENODEV;
1306
1307 msp->xor_base = devm_ioremap(&pdev->dev, res->start,
1308 res->end - res->start + 1);
1309 if (!msp->xor_base)
1310 return -EBUSY;
1311
1312 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1313 if (!res)
1314 return -ENODEV;
1315
1316 msp->xor_high_base = devm_ioremap(&pdev->dev, res->start,
1317 res->end - res->start + 1);
1318 if (!msp->xor_high_base)
1319 return -EBUSY;
1320
1321 platform_set_drvdata(pdev, msp);
1322
1323 /*
1324 * (Re-)program MBUS remapping windows if we are asked to.
1325 */
1326 if (msd != NULL && msd->dram != NULL)
1327 mv_xor_conf_mbus_windows(msp, msd->dram);
1328
1329 return 0;
1330}
1331
1332static int mv_xor_shared_remove(struct platform_device *pdev)
1333{
1334 return 0;
1335}
1336
1337static struct platform_driver mv_xor_shared_driver = {
1338 .probe = mv_xor_shared_probe,
1339 .remove = mv_xor_shared_remove,
1340 .driver = {
1341 .owner = THIS_MODULE,
1342 .name = MV_XOR_SHARED_NAME,
1343 },
1344};
1345
1346
1347static int __init mv_xor_init(void)
1348{
1349 int rc;
1350
1351 rc = platform_driver_register(&mv_xor_shared_driver);
1352 if (!rc) {
1353 rc = platform_driver_register(&mv_xor_driver);
1354 if (rc)
1355 platform_driver_unregister(&mv_xor_shared_driver);
1356 }
1357 return rc;
1358}
1359module_init(mv_xor_init);
1360
1361/* it's currently unsafe to unload this module */
1362#if 0
1363static void __exit mv_xor_exit(void)
1364{
1365 platform_driver_unregister(&mv_xor_driver);
1366 platform_driver_unregister(&mv_xor_shared_driver);
1367 return;
1368}
1369
1370module_exit(mv_xor_exit);
1371#endif
1372
1373MODULE_AUTHOR("Saeed Bishara <saeed@marvell.com>");
1374MODULE_DESCRIPTION("DMA engine driver for Marvell's XOR engine");
1375MODULE_LICENSE("GPL");
diff --git a/drivers/dma/mv_xor.h b/drivers/dma/mv_xor.h
new file mode 100644
index 000000000000..06cafe1ef521
--- /dev/null
+++ b/drivers/dma/mv_xor.h
@@ -0,0 +1,183 @@
1/*
2 * Copyright (C) 2007, 2008, Marvell International Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software Foundation,
15 * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
18#ifndef MV_XOR_H
19#define MV_XOR_H
20
21#include <linux/types.h>
22#include <linux/io.h>
23#include <linux/dmaengine.h>
24#include <linux/interrupt.h>
25
26#define USE_TIMER
27#define MV_XOR_SLOT_SIZE 64
28#define MV_XOR_THRESHOLD 1
29
30#define XOR_OPERATION_MODE_XOR 0
31#define XOR_OPERATION_MODE_MEMCPY 2
32#define XOR_OPERATION_MODE_MEMSET 4
33
34#define XOR_CURR_DESC(chan) (chan->mmr_base + 0x210 + (chan->idx * 4))
35#define XOR_NEXT_DESC(chan) (chan->mmr_base + 0x200 + (chan->idx * 4))
36#define XOR_BYTE_COUNT(chan) (chan->mmr_base + 0x220 + (chan->idx * 4))
37#define XOR_DEST_POINTER(chan) (chan->mmr_base + 0x2B0 + (chan->idx * 4))
38#define XOR_BLOCK_SIZE(chan) (chan->mmr_base + 0x2C0 + (chan->idx * 4))
39#define XOR_INIT_VALUE_LOW(chan) (chan->mmr_base + 0x2E0)
40#define XOR_INIT_VALUE_HIGH(chan) (chan->mmr_base + 0x2E4)
41
42#define XOR_CONFIG(chan) (chan->mmr_base + 0x10 + (chan->idx * 4))
43#define XOR_ACTIVATION(chan) (chan->mmr_base + 0x20 + (chan->idx * 4))
44#define XOR_INTR_CAUSE(chan) (chan->mmr_base + 0x30)
45#define XOR_INTR_MASK(chan) (chan->mmr_base + 0x40)
46#define XOR_ERROR_CAUSE(chan) (chan->mmr_base + 0x50)
47#define XOR_ERROR_ADDR(chan) (chan->mmr_base + 0x60)
48#define XOR_INTR_MASK_VALUE 0x3F5
49
50#define WINDOW_BASE(w) (0x250 + ((w) << 2))
51#define WINDOW_SIZE(w) (0x270 + ((w) << 2))
52#define WINDOW_REMAP_HIGH(w) (0x290 + ((w) << 2))
53#define WINDOW_BAR_ENABLE(chan) (0x240 + ((chan) << 2))
54
55struct mv_xor_shared_private {
56 void __iomem *xor_base;
57 void __iomem *xor_high_base;
58};
59
60
61/**
62 * struct mv_xor_device - internal representation of a XOR device
63 * @pdev: Platform device
64 * @id: HW XOR Device selector
65 * @dma_desc_pool: base of DMA descriptor region (DMA address)
66 * @dma_desc_pool_virt: base of DMA descriptor region (CPU address)
67 * @common: embedded struct dma_device
68 */
69struct mv_xor_device {
70 struct platform_device *pdev;
71 int id;
72 dma_addr_t dma_desc_pool;
73 void *dma_desc_pool_virt;
74 struct dma_device common;
75 struct mv_xor_shared_private *shared;
76};
77
78/**
79 * struct mv_xor_chan - internal representation of a XOR channel
80 * @pending: allows batching of hardware operations
81 * @completed_cookie: identifier for the most recently completed operation
82 * @lock: serializes enqueue/dequeue operations to the descriptors pool
83 * @mmr_base: memory mapped register base
84 * @idx: the index of the xor channel
85 * @chain: device chain view of the descriptors
86 * @completed_slots: slots completed by HW but still need to be acked
87 * @device: parent device
88 * @common: common dmaengine channel object members
89 * @last_used: place holder for allocation to continue from where it left off
90 * @all_slots: complete domain of slots usable by the channel
91 * @slots_allocated: records the actual size of the descriptor slot pool
92 * @irq_tasklet: bottom half where mv_xor_slot_cleanup runs
93 */
94struct mv_xor_chan {
95 int pending;
96 dma_cookie_t completed_cookie;
97 spinlock_t lock; /* protects the descriptor slot pool */
98 void __iomem *mmr_base;
99 unsigned int idx;
100 enum dma_transaction_type current_type;
101 struct list_head chain;
102 struct list_head completed_slots;
103 struct mv_xor_device *device;
104 struct dma_chan common;
105 struct mv_xor_desc_slot *last_used;
106 struct list_head all_slots;
107 int slots_allocated;
108 struct tasklet_struct irq_tasklet;
109#ifdef USE_TIMER
110 unsigned long cleanup_time;
111 u32 current_on_last_cleanup;
112 dma_cookie_t is_complete_cookie;
113#endif
114};
115
116/**
117 * struct mv_xor_desc_slot - software descriptor
118 * @slot_node: node on the mv_xor_chan.all_slots list
119 * @chain_node: node on the mv_xor_chan.chain list
120 * @completed_node: node on the mv_xor_chan.completed_slots list
121 * @hw_desc: virtual address of the hardware descriptor chain
122 * @phys: hardware address of the hardware descriptor chain
123 * @group_head: first operation in a transaction
124 * @slot_cnt: total slots used in an transaction (group of operations)
125 * @slots_per_op: number of slots per operation
126 * @idx: pool index
127 * @unmap_src_cnt: number of xor sources
128 * @unmap_len: transaction bytecount
129 * @async_tx: support for the async_tx api
130 * @group_list: list of slots that make up a multi-descriptor transaction
131 * for example transfer lengths larger than the supported hw max
132 * @xor_check_result: result of zero sum
133 * @crc32_result: result crc calculation
134 */
135struct mv_xor_desc_slot {
136 struct list_head slot_node;
137 struct list_head chain_node;
138 struct list_head completed_node;
139 enum dma_transaction_type type;
140 void *hw_desc;
141 struct mv_xor_desc_slot *group_head;
142 u16 slot_cnt;
143 u16 slots_per_op;
144 u16 idx;
145 u16 unmap_src_cnt;
146 u32 value;
147 size_t unmap_len;
148 struct dma_async_tx_descriptor async_tx;
149 union {
150 u32 *xor_check_result;
151 u32 *crc32_result;
152 };
153#ifdef USE_TIMER
154 unsigned long arrival_time;
155 struct timer_list timeout;
156#endif
157};
158
159/* This structure describes XOR descriptor size 64bytes */
160struct mv_xor_desc {
161 u32 status; /* descriptor execution status */
162 u32 crc32_result; /* result of CRC-32 calculation */
163 u32 desc_command; /* type of operation to be carried out */
164 u32 phy_next_desc; /* next descriptor address pointer */
165 u32 byte_count; /* size of src/dst blocks in bytes */
166 u32 phy_dest_addr; /* destination block address */
167 u32 phy_src_addr[8]; /* source block addresses */
168 u32 reserved0;
169 u32 reserved1;
170};
171
172#define to_mv_sw_desc(addr_hw_desc) \
173 container_of(addr_hw_desc, struct mv_xor_desc_slot, hw_desc)
174
175#define mv_hw_desc_slot_idx(hw_desc, idx) \
176 ((void *)(((unsigned long)hw_desc) + ((idx) << 5)))
177
178#define MV_XOR_MIN_BYTE_COUNT (128)
179#define XOR_MAX_BYTE_COUNT ((16 * 1024 * 1024) - 1)
180#define MV_XOR_MAX_BYTE_COUNT XOR_MAX_BYTE_COUNT
181
182
183#endif
diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
index b54112ffd282..0e024fe2d8c4 100644
--- a/drivers/edac/cell_edac.c
+++ b/drivers/edac/cell_edac.c
@@ -33,7 +33,7 @@ static void cell_edac_count_ce(struct mem_ctl_info *mci, int chan, u64 ar)
33{ 33{
34 struct cell_edac_priv *priv = mci->pvt_info; 34 struct cell_edac_priv *priv = mci->pvt_info;
35 struct csrow_info *csrow = &mci->csrows[0]; 35 struct csrow_info *csrow = &mci->csrows[0];
36 unsigned long address, pfn, offset; 36 unsigned long address, pfn, offset, syndrome;
37 37
38 dev_dbg(mci->dev, "ECC CE err on node %d, channel %d, ar = 0x%016lx\n", 38 dev_dbg(mci->dev, "ECC CE err on node %d, channel %d, ar = 0x%016lx\n",
39 priv->node, chan, ar); 39 priv->node, chan, ar);
@@ -44,10 +44,11 @@ static void cell_edac_count_ce(struct mem_ctl_info *mci, int chan, u64 ar)
44 address = (address << 1) | chan; 44 address = (address << 1) | chan;
45 pfn = address >> PAGE_SHIFT; 45 pfn = address >> PAGE_SHIFT;
46 offset = address & ~PAGE_MASK; 46 offset = address & ~PAGE_MASK;
47 syndrome = (ar & 0x000000001fe00000ul) >> 21;
47 48
48 /* TODO: Decoding of the error addresss */ 49 /* TODO: Decoding of the error addresss */
49 edac_mc_handle_ce(mci, csrow->first_page + pfn, offset, 50 edac_mc_handle_ce(mci, csrow->first_page + pfn, offset,
50 0, 0, chan, ""); 51 syndrome, 0, chan, "");
51} 52}
52 53
53static void cell_edac_count_ue(struct mem_ctl_info *mci, int chan, u64 ar) 54static void cell_edac_count_ue(struct mem_ctl_info *mci, int chan, u64 ar)
diff --git a/drivers/eisa/Makefile b/drivers/eisa/Makefile
index 70abf93fe6b0..5369ce957c6d 100644
--- a/drivers/eisa/Makefile
+++ b/drivers/eisa/Makefile
@@ -9,7 +9,7 @@ obj-${CONFIG_EISA_VIRTUAL_ROOT} += virtual_root.o
9 9
10 10
11# Ugly hack to get DEVICE_NAME_SIZE value... 11# Ugly hack to get DEVICE_NAME_SIZE value...
12DEVICE_NAME_SIZE =$(shell awk '$$1=="\#define" && $$2=="DEVICE_NAME_SIZE" {print $$3-1}' $(srctree)/include/linux/device.h) 12DEVICE_NAME_SIZE = 50
13 13
14$(obj)/eisa-bus.o: $(obj)/devlist.h 14$(obj)/eisa-bus.o: $(obj)/devlist.h
15 15
diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c
index 65dcf0432653..c950bf8606d9 100644
--- a/drivers/eisa/eisa-bus.c
+++ b/drivers/eisa/eisa-bus.c
@@ -22,7 +22,7 @@
22 22
23struct eisa_device_info { 23struct eisa_device_info {
24 struct eisa_device_id id; 24 struct eisa_device_id id;
25 char name[DEVICE_NAME_SIZE]; 25 char name[50];
26}; 26};
27 27
28#ifdef CONFIG_EISA_NAMES 28#ifdef CONFIG_EISA_NAMES
@@ -63,7 +63,7 @@ static void __init eisa_name_device (struct eisa_device *edev)
63 if (!strcmp (edev->id.sig, eisa_table[i].id.sig)) { 63 if (!strcmp (edev->id.sig, eisa_table[i].id.sig)) {
64 strlcpy (edev->pretty_name, 64 strlcpy (edev->pretty_name,
65 eisa_table[i].name, 65 eisa_table[i].name,
66 DEVICE_NAME_SIZE); 66 sizeof(edev->pretty_name));
67 return; 67 return;
68 } 68 }
69 } 69 }
diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c
index 25918f7dfd0f..0b624e927a6f 100644
--- a/drivers/firmware/dcdbas.c
+++ b/drivers/firmware/dcdbas.c
@@ -254,6 +254,7 @@ static ssize_t host_control_on_shutdown_store(struct device *dev,
254static int smi_request(struct smi_cmd *smi_cmd) 254static int smi_request(struct smi_cmd *smi_cmd)
255{ 255{
256 cpumask_t old_mask; 256 cpumask_t old_mask;
257 cpumask_of_cpu_ptr(new_mask, 0);
257 int ret = 0; 258 int ret = 0;
258 259
259 if (smi_cmd->magic != SMI_CMD_MAGIC) { 260 if (smi_cmd->magic != SMI_CMD_MAGIC) {
@@ -264,7 +265,7 @@ static int smi_request(struct smi_cmd *smi_cmd)
264 265
265 /* SMI requires CPU 0 */ 266 /* SMI requires CPU 0 */
266 old_mask = current->cpus_allowed; 267 old_mask = current->cpus_allowed;
267 set_cpus_allowed_ptr(current, &cpumask_of_cpu(0)); 268 set_cpus_allowed_ptr(current, new_mask);
268 if (smp_processor_id() != 0) { 269 if (smp_processor_id() != 0) {
269 dev_dbg(&dcdbas_pdev->dev, "%s: failed to get CPU 0\n", 270 dev_dbg(&dcdbas_pdev->dev, "%s: failed to get CPU 0\n",
270 __func__); 271 __func__);
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 008c38ba774f..fced1909cbba 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -45,7 +45,7 @@ config GPIO_PCA953X
45 will be called pca953x. 45 will be called pca953x.
46 46
47config GPIO_PCF857X 47config GPIO_PCF857X
48 tristate "PCF857x, PCA857x, and PCA967x I2C GPIO expanders" 48 tristate "PCF857x, PCA{85,96}7x, and MAX732[89] I2C GPIO expanders"
49 depends on I2C 49 depends on I2C
50 help 50 help
51 Say yes here to provide access to most "quasi-bidirectional" I2C 51 Say yes here to provide access to most "quasi-bidirectional" I2C
@@ -54,7 +54,8 @@ config GPIO_PCF857X
54 some of them. Compatible models include: 54 some of them. Compatible models include:
55 55
56 8 bits: pcf8574, pcf8574a, pca8574, pca8574a, 56 8 bits: pcf8574, pcf8574a, pca8574, pca8574a,
57 pca9670, pca9672, pca9674, pca9674a 57 pca9670, pca9672, pca9674, pca9674a,
58 max7328, max7329
58 59
59 16 bits: pcf8575, pcf8575c, pca8575, 60 16 bits: pcf8575, pcf8575c, pca8575,
60 pca9671, pca9673, pca9675 61 pca9671, pca9673, pca9675
@@ -69,6 +70,12 @@ config GPIO_PCF857X
69 70
70comment "SPI GPIO expanders:" 71comment "SPI GPIO expanders:"
71 72
73config GPIO_MAX7301
74 tristate "Maxim MAX7301 GPIO expander"
75 depends on SPI_MASTER
76 help
77 gpio driver for Maxim MAX7301 SPI GPIO expander.
78
72config GPIO_MCP23S08 79config GPIO_MCP23S08
73 tristate "Microchip MCP23S08 I/O expander" 80 tristate "Microchip MCP23S08 I/O expander"
74 depends on SPI_MASTER 81 depends on SPI_MASTER
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index fdde9923cf33..16e796dc5410 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -4,6 +4,7 @@ ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG
4 4
5obj-$(CONFIG_HAVE_GPIO_LIB) += gpiolib.o 5obj-$(CONFIG_HAVE_GPIO_LIB) += gpiolib.o
6 6
7obj-$(CONFIG_GPIO_MAX7301) += max7301.o
7obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o 8obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o
8obj-$(CONFIG_GPIO_PCA953X) += pca953x.o 9obj-$(CONFIG_GPIO_PCA953X) += pca953x.o
9obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o 10obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
diff --git a/drivers/gpio/max7301.c b/drivers/gpio/max7301.c
new file mode 100644
index 000000000000..39c795ad8312
--- /dev/null
+++ b/drivers/gpio/max7301.c
@@ -0,0 +1,339 @@
1/**
2 * drivers/gpio/max7301.c
3 *
4 * Copyright (C) 2006 Juergen Beisert, Pengutronix
5 * Copyright (C) 2008 Guennadi Liakhovetski, Pengutronix
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * The Maxim's MAX7301 device is an SPI driven GPIO expander. There are
12 * 28 GPIOs. 8 of them can trigger an interrupt. See datasheet for more
13 * details
14 * Note:
15 * - DIN must be stable at the rising edge of clock.
16 * - when writing:
17 * - always clock in 16 clocks at once
18 * - at DIN: D15 first, D0 last
19 * - D0..D7 = databyte, D8..D14 = commandbyte
20 * - D15 = low -> write command
21 * - when reading
22 * - always clock in 16 clocks at once
23 * - at DIN: D15 first, D0 last
24 * - D0..D7 = dummy, D8..D14 = register address
25 * - D15 = high -> read command
26 * - raise CS and assert it again
27 * - always clock in 16 clocks at once
28 * - at DOUT: D15 first, D0 last
29 * - D0..D7 contains the data from the first cycle
30 *
31 * The driver exports a standard gpiochip interface
32 */
33
34#include <linux/init.h>
35#include <linux/platform_device.h>
36#include <linux/mutex.h>
37#include <linux/spi/spi.h>
38#include <linux/spi/max7301.h>
39#include <linux/gpio.h>
40
41#define DRIVER_NAME "max7301"
42
43/*
44 * Pin configurations, see MAX7301 datasheet page 6
45 */
46#define PIN_CONFIG_MASK 0x03
47#define PIN_CONFIG_IN_PULLUP 0x03
48#define PIN_CONFIG_IN_WO_PULLUP 0x02
49#define PIN_CONFIG_OUT 0x01
50
51#define PIN_NUMBER 28
52
53
54/*
55 * Some registers must be read back to modify.
56 * To save time we cache them here in memory
57 */
58struct max7301 {
59 struct mutex lock;
60 u8 port_config[8]; /* field 0 is unused */
61 u32 out_level; /* cached output levels */
62 struct gpio_chip chip;
63 struct spi_device *spi;
64};
65
66/**
67 * max7301_write - Write a new register content
68 * @spi: The SPI device
69 * @reg: Register offset
70 * @val: Value to write
71 *
72 * A write to the MAX7301 means one message with one transfer
73 *
74 * Returns 0 if successful or a negative value on error
75 */
76static int max7301_write(struct spi_device *spi, unsigned int reg, unsigned int val)
77{
78 u16 word = ((reg & 0x7F) << 8) | (val & 0xFF);
79 return spi_write(spi, (const u8 *)&word, sizeof(word));
80}
81
82/**
83 * max7301_read - Read back register content
84 * @spi: The SPI device
85 * @reg: Register offset
86 *
87 * A read from the MAX7301 means two transfers; here, one message each
88 *
89 * Returns positive 8 bit value from device if successful or a
90 * negative value on error
91 */
92static int max7301_read(struct spi_device *spi, unsigned int reg)
93{
94 int ret;
95 u16 word;
96
97 word = 0x8000 | (reg << 8);
98 ret = spi_write(spi, (const u8 *)&word, sizeof(word));
99 if (ret)
100 return ret;
101 /*
102 * This relies on the fact, that a transfer with NULL tx_buf shifts out
103 * zero bytes (=NOOP for MAX7301)
104 */
105 ret = spi_read(spi, (u8 *)&word, sizeof(word));
106 if (ret)
107 return ret;
108 return word & 0xff;
109}
110
111static int max7301_direction_input(struct gpio_chip *chip, unsigned offset)
112{
113 struct max7301 *ts = container_of(chip, struct max7301, chip);
114 u8 *config;
115 int ret;
116
117 /* First 4 pins are unused in the controller */
118 offset += 4;
119
120 config = &ts->port_config[offset >> 2];
121
122 mutex_lock(&ts->lock);
123
124 /* Standard GPIO API doesn't support pull-ups, has to be extended.
125 * Hard-coding no pollup for now. */
126 *config = (*config & ~(3 << (offset & 3))) | (1 << (offset & 3));
127
128 ret = max7301_write(ts->spi, 0x08 + (offset >> 2), *config);
129
130 mutex_unlock(&ts->lock);
131
132 return ret;
133}
134
135static int __max7301_set(struct max7301 *ts, unsigned offset, int value)
136{
137 if (value) {
138 ts->out_level |= 1 << offset;
139 return max7301_write(ts->spi, 0x20 + offset, 0x01);
140 } else {
141 ts->out_level &= ~(1 << offset);
142 return max7301_write(ts->spi, 0x20 + offset, 0x00);
143 }
144}
145
146static int max7301_direction_output(struct gpio_chip *chip, unsigned offset,
147 int value)
148{
149 struct max7301 *ts = container_of(chip, struct max7301, chip);
150 u8 *config;
151 int ret;
152
153 /* First 4 pins are unused in the controller */
154 offset += 4;
155
156 config = &ts->port_config[offset >> 2];
157
158 mutex_lock(&ts->lock);
159
160 *config = (*config & ~(3 << (offset & 3))) | (1 << (offset & 3));
161
162 ret = __max7301_set(ts, offset, value);
163
164 if (!ret)
165 ret = max7301_write(ts->spi, 0x08 + (offset >> 2), *config);
166
167 mutex_unlock(&ts->lock);
168
169 return ret;
170}
171
172static int max7301_get(struct gpio_chip *chip, unsigned offset)
173{
174 struct max7301 *ts = container_of(chip, struct max7301, chip);
175 int config, level = -EINVAL;
176
177 /* First 4 pins are unused in the controller */
178 offset += 4;
179
180 mutex_lock(&ts->lock);
181
182 config = (ts->port_config[offset >> 2] >> ((offset & 3) * 2)) & 3;
183
184 switch (config) {
185 case 1:
186 /* Output: return cached level */
187 level = !!(ts->out_level & (1 << offset));
188 break;
189 case 2:
190 case 3:
191 /* Input: read out */
192 level = max7301_read(ts->spi, 0x20 + offset) & 0x01;
193 }
194 mutex_unlock(&ts->lock);
195
196 return level;
197}
198
199static void max7301_set(struct gpio_chip *chip, unsigned offset, int value)
200{
201 struct max7301 *ts = container_of(chip, struct max7301, chip);
202
203 /* First 4 pins are unused in the controller */
204 offset += 4;
205
206 mutex_lock(&ts->lock);
207
208 __max7301_set(ts, offset, value);
209
210 mutex_unlock(&ts->lock);
211}
212
213static int __devinit max7301_probe(struct spi_device *spi)
214{
215 struct max7301 *ts;
216 struct max7301_platform_data *pdata;
217 int i, ret;
218
219 pdata = spi->dev.platform_data;
220 if (!pdata || !pdata->base)
221 return -ENODEV;
222
223 /*
224 * bits_per_word cannot be configured in platform data
225 */
226 spi->bits_per_word = 16;
227
228 ret = spi_setup(spi);
229 if (ret < 0)
230 return ret;
231
232 ts = kzalloc(sizeof(struct max7301), GFP_KERNEL);
233 if (!ts)
234 return -ENOMEM;
235
236 mutex_init(&ts->lock);
237
238 dev_set_drvdata(&spi->dev, ts);
239
240 /* Power up the chip and disable IRQ output */
241 max7301_write(spi, 0x04, 0x01);
242
243 ts->spi = spi;
244
245 ts->chip.label = DRIVER_NAME,
246
247 ts->chip.direction_input = max7301_direction_input;
248 ts->chip.get = max7301_get;
249 ts->chip.direction_output = max7301_direction_output;
250 ts->chip.set = max7301_set;
251
252 ts->chip.base = pdata->base;
253 ts->chip.ngpio = PIN_NUMBER;
254 ts->chip.can_sleep = 1;
255 ts->chip.dev = &spi->dev;
256 ts->chip.owner = THIS_MODULE;
257
258 ret = gpiochip_add(&ts->chip);
259 if (ret)
260 goto exit_destroy;
261
262 /*
263 * tristate all pins in hardware and cache the
264 * register values for later use.
265 */
266 for (i = 1; i < 8; i++) {
267 int j;
268 /* 0xAA means input with internal pullup disabled */
269 max7301_write(spi, 0x08 + i, 0xAA);
270 ts->port_config[i] = 0xAA;
271 for (j = 0; j < 4; j++) {
272 int idx = ts->chip.base + (i - 1) * 4 + j;
273 ret = gpio_direction_input(idx);
274 if (ret)
275 goto exit_remove;
276 gpio_free(idx);
277 }
278 }
279 return ret;
280
281exit_remove:
282 gpiochip_remove(&ts->chip);
283exit_destroy:
284 dev_set_drvdata(&spi->dev, NULL);
285 mutex_destroy(&ts->lock);
286 kfree(ts);
287 return ret;
288}
289
290static int max7301_remove(struct spi_device *spi)
291{
292 struct max7301 *ts;
293 int ret;
294
295 ts = dev_get_drvdata(&spi->dev);
296 if (ts == NULL)
297 return -ENODEV;
298
299 dev_set_drvdata(&spi->dev, NULL);
300
301 /* Power down the chip and disable IRQ output */
302 max7301_write(spi, 0x04, 0x00);
303
304 ret = gpiochip_remove(&ts->chip);
305 if (!ret) {
306 mutex_destroy(&ts->lock);
307 kfree(ts);
308 } else
309 dev_err(&spi->dev, "Failed to remove the GPIO controller: %d\n",
310 ret);
311
312 return ret;
313}
314
315static struct spi_driver max7301_driver = {
316 .driver = {
317 .name = DRIVER_NAME,
318 .owner = THIS_MODULE,
319 },
320 .probe = max7301_probe,
321 .remove = __devexit_p(max7301_remove),
322};
323
324static int __init max7301_init(void)
325{
326 return spi_register_driver(&max7301_driver);
327}
328
329static void __exit max7301_exit(void)
330{
331 spi_unregister_driver(&max7301_driver);
332}
333
334module_init(max7301_init);
335module_exit(max7301_exit);
336
337MODULE_AUTHOR("Juergen Beisert");
338MODULE_LICENSE("GPL v2");
339MODULE_DESCRIPTION("MAX7301 SPI based GPIO-Expander");
diff --git a/drivers/gpio/pcf857x.c b/drivers/gpio/pcf857x.c
index aa6cc8b2a2bc..d25d356c4f20 100644
--- a/drivers/gpio/pcf857x.c
+++ b/drivers/gpio/pcf857x.c
@@ -37,6 +37,8 @@ static const struct i2c_device_id pcf857x_id[] = {
37 { "pca9671", 16 }, 37 { "pca9671", 16 },
38 { "pca9673", 16 }, 38 { "pca9673", 16 },
39 { "pca9675", 16 }, 39 { "pca9675", 16 },
40 { "max7328", 8 },
41 { "max7329", 8 },
40 { } 42 { }
41}; 43};
42MODULE_DEVICE_TABLE(i2c, pcf857x_id); 44MODULE_DEVICE_TABLE(i2c, pcf857x_id);
@@ -56,6 +58,7 @@ MODULE_DEVICE_TABLE(i2c, pcf857x_id);
56struct pcf857x { 58struct pcf857x {
57 struct gpio_chip chip; 59 struct gpio_chip chip;
58 struct i2c_client *client; 60 struct i2c_client *client;
61 struct mutex lock; /* protect 'out' */
59 unsigned out; /* software latch */ 62 unsigned out; /* software latch */
60}; 63};
61 64
@@ -66,9 +69,14 @@ struct pcf857x {
66static int pcf857x_input8(struct gpio_chip *chip, unsigned offset) 69static int pcf857x_input8(struct gpio_chip *chip, unsigned offset)
67{ 70{
68 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip); 71 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip);
72 int status;
69 73
74 mutex_lock(&gpio->lock);
70 gpio->out |= (1 << offset); 75 gpio->out |= (1 << offset);
71 return i2c_smbus_write_byte(gpio->client, gpio->out); 76 status = i2c_smbus_write_byte(gpio->client, gpio->out);
77 mutex_unlock(&gpio->lock);
78
79 return status;
72} 80}
73 81
74static int pcf857x_get8(struct gpio_chip *chip, unsigned offset) 82static int pcf857x_get8(struct gpio_chip *chip, unsigned offset)
@@ -84,12 +92,17 @@ static int pcf857x_output8(struct gpio_chip *chip, unsigned offset, int value)
84{ 92{
85 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip); 93 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip);
86 unsigned bit = 1 << offset; 94 unsigned bit = 1 << offset;
95 int status;
87 96
97 mutex_lock(&gpio->lock);
88 if (value) 98 if (value)
89 gpio->out |= bit; 99 gpio->out |= bit;
90 else 100 else
91 gpio->out &= ~bit; 101 gpio->out &= ~bit;
92 return i2c_smbus_write_byte(gpio->client, gpio->out); 102 status = i2c_smbus_write_byte(gpio->client, gpio->out);
103 mutex_unlock(&gpio->lock);
104
105 return status;
93} 106}
94 107
95static void pcf857x_set8(struct gpio_chip *chip, unsigned offset, int value) 108static void pcf857x_set8(struct gpio_chip *chip, unsigned offset, int value)
@@ -124,9 +137,14 @@ static int i2c_read_le16(struct i2c_client *client)
124static int pcf857x_input16(struct gpio_chip *chip, unsigned offset) 137static int pcf857x_input16(struct gpio_chip *chip, unsigned offset)
125{ 138{
126 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip); 139 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip);
140 int status;
127 141
142 mutex_lock(&gpio->lock);
128 gpio->out |= (1 << offset); 143 gpio->out |= (1 << offset);
129 return i2c_write_le16(gpio->client, gpio->out); 144 status = i2c_write_le16(gpio->client, gpio->out);
145 mutex_unlock(&gpio->lock);
146
147 return status;
130} 148}
131 149
132static int pcf857x_get16(struct gpio_chip *chip, unsigned offset) 150static int pcf857x_get16(struct gpio_chip *chip, unsigned offset)
@@ -142,12 +160,17 @@ static int pcf857x_output16(struct gpio_chip *chip, unsigned offset, int value)
142{ 160{
143 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip); 161 struct pcf857x *gpio = container_of(chip, struct pcf857x, chip);
144 unsigned bit = 1 << offset; 162 unsigned bit = 1 << offset;
163 int status;
145 164
165 mutex_lock(&gpio->lock);
146 if (value) 166 if (value)
147 gpio->out |= bit; 167 gpio->out |= bit;
148 else 168 else
149 gpio->out &= ~bit; 169 gpio->out &= ~bit;
150 return i2c_write_le16(gpio->client, gpio->out); 170 status = i2c_write_le16(gpio->client, gpio->out);
171 mutex_unlock(&gpio->lock);
172
173 return status;
151} 174}
152 175
153static void pcf857x_set16(struct gpio_chip *chip, unsigned offset, int value) 176static void pcf857x_set16(struct gpio_chip *chip, unsigned offset, int value)
@@ -173,6 +196,8 @@ static int pcf857x_probe(struct i2c_client *client,
173 if (!gpio) 196 if (!gpio)
174 return -ENOMEM; 197 return -ENOMEM;
175 198
199 mutex_init(&gpio->lock);
200
176 gpio->chip.base = pdata->gpio_base; 201 gpio->chip.base = pdata->gpio_base;
177 gpio->chip.can_sleep = 1; 202 gpio->chip.can_sleep = 1;
178 gpio->chip.owner = THIS_MODULE; 203 gpio->chip.owner = THIS_MODULE;
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index f43d6d3cf2fa..426ac5add585 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -780,7 +780,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n)
780 */ 780 */
781static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) 781static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value)
782{ 782{
783 __le64 x; 783 u64 x;
784 u64 m = (1ULL << n) - 1; 784 u64 m = (1ULL << n) - 1;
785 785
786 if (n > 32) 786 if (n > 32)
@@ -796,10 +796,10 @@ static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u3
796 report += offset >> 3; 796 report += offset >> 3;
797 offset &= 7; 797 offset &= 7;
798 798
799 x = get_unaligned((__le64 *)report); 799 x = get_unaligned_le64(report);
800 x &= cpu_to_le64(~(m << offset)); 800 x &= ~(m << offset);
801 x |= cpu_to_le64(((u64) value) << offset); 801 x |= ((u64)value) << offset;
802 put_unaligned(x, (__le64 *) report); 802 put_unaligned_le64(x, report);
803} 803}
804 804
805/* 805/*
diff --git a/drivers/hid/hid-input-quirks.c b/drivers/hid/hid-input-quirks.c
index 4c2052c658f1..16feea014494 100644
--- a/drivers/hid/hid-input-quirks.c
+++ b/drivers/hid/hid-input-quirks.c
@@ -89,6 +89,29 @@ static int quirk_logitech_ultrax_remote(struct hid_usage *usage, struct input_de
89 return 1; 89 return 1;
90} 90}
91 91
92static int quirk_gyration_remote(struct hid_usage *usage, struct input_dev *input,
93 unsigned long **bit, int *max)
94{
95 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
96 return 0;
97
98 set_bit(EV_REP, input->evbit);
99 switch(usage->hid & HID_USAGE) {
100 /* Reported on Gyration MCE Remote */
101 case 0x00d: map_key_clear(KEY_HOME); break;
102 case 0x024: map_key_clear(KEY_DVD); break;
103 case 0x025: map_key_clear(KEY_PVR); break;
104 case 0x046: map_key_clear(KEY_MEDIA); break;
105 case 0x047: map_key_clear(KEY_MP3); break;
106 case 0x049: map_key_clear(KEY_CAMERA); break;
107 case 0x04a: map_key_clear(KEY_VIDEO); break;
108
109 default:
110 return 0;
111 }
112 return 1;
113}
114
92static int quirk_chicony_tactical_pad(struct hid_usage *usage, struct input_dev *input, 115static int quirk_chicony_tactical_pad(struct hid_usage *usage, struct input_dev *input,
93 unsigned long **bit, int *max) 116 unsigned long **bit, int *max)
94{ 117{
@@ -303,6 +326,9 @@ static int quirk_sunplus_wdesktop(struct hid_usage *usage, struct input_dev *inp
303#define VENDOR_ID_EZKEY 0x0518 326#define VENDOR_ID_EZKEY 0x0518
304#define DEVICE_ID_BTC_8193 0x0002 327#define DEVICE_ID_BTC_8193 0x0002
305 328
329#define VENDOR_ID_GYRATION 0x0c16
330#define DEVICE_ID_GYRATION_REMOTE 0x0002
331
306#define VENDOR_ID_LOGITECH 0x046d 332#define VENDOR_ID_LOGITECH 0x046d
307#define DEVICE_ID_LOGITECH_RECEIVER 0xc101 333#define DEVICE_ID_LOGITECH_RECEIVER 0xc101
308#define DEVICE_ID_S510_RECEIVER 0xc50c 334#define DEVICE_ID_S510_RECEIVER 0xc50c
@@ -337,6 +363,8 @@ static const struct hid_input_blacklist {
337 363
338 { VENDOR_ID_EZKEY, DEVICE_ID_BTC_8193, quirk_btc_8193 }, 364 { VENDOR_ID_EZKEY, DEVICE_ID_BTC_8193, quirk_btc_8193 },
339 365
366 { VENDOR_ID_GYRATION, DEVICE_ID_GYRATION_REMOTE, quirk_gyration_remote },
367
340 { VENDOR_ID_LOGITECH, DEVICE_ID_LOGITECH_RECEIVER, quirk_logitech_ultrax_remote }, 368 { VENDOR_ID_LOGITECH, DEVICE_ID_LOGITECH_RECEIVER, quirk_logitech_ultrax_remote },
341 { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER, quirk_logitech_wireless }, 369 { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER, quirk_logitech_wireless },
342 { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER_2, quirk_logitech_wireless }, 370 { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER_2, quirk_logitech_wireless },
@@ -438,6 +466,18 @@ int hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, struc
438 input_event(input, usage->type, REL_WHEEL, -value); 466 input_event(input, usage->type, REL_WHEEL, -value);
439 return 1; 467 return 1;
440 } 468 }
469
470 /* Gyration MCE remote "Sleep" key */
471 if (hid->vendor == VENDOR_ID_GYRATION &&
472 hid->product == DEVICE_ID_GYRATION_REMOTE &&
473 (usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK &&
474 (usage->hid & 0xff) == 0x82) {
475 input_event(input, usage->type, usage->code, 1);
476 input_sync(input);
477 input_event(input, usage->type, usage->code, 0);
478 input_sync(input);
479 return 1;
480 }
441 return 0; 481 return 0;
442} 482}
443 483
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 5c52a20ad344..1b2e8dc3398d 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -100,6 +100,8 @@ static struct hidinput_key_translation apple_fn_keys[] = {
100 { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, 100 { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
101 { KEY_F3, KEY_FN_F5, APPLE_FLAG_FKEY }, /* Exposé */ 101 { KEY_F3, KEY_FN_F5, APPLE_FLAG_FKEY }, /* Exposé */
102 { KEY_F4, KEY_FN_F4, APPLE_FLAG_FKEY }, /* Dashboard */ 102 { KEY_F4, KEY_FN_F4, APPLE_FLAG_FKEY }, /* Dashboard */
103 { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY },
104 { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY },
103 { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, 105 { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
104 { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, 106 { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY },
105 { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, 107 { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY },
@@ -612,6 +614,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
612 case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break; 614 case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
613 case 0x0b7: map_key_clear(KEY_STOPCD); break; 615 case 0x0b7: map_key_clear(KEY_STOPCD); break;
614 case 0x0b8: map_key_clear(KEY_EJECTCD); break; 616 case 0x0b8: map_key_clear(KEY_EJECTCD); break;
617 case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT); break;
615 618
616 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break; 619 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
617 case 0x0e0: map_abs_clear(ABS_VOLUME); break; 620 case 0x0e0: map_abs_clear(ABS_VOLUME); break;
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index 2fde6c63f47d..c40f0403edaf 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c
@@ -105,6 +105,7 @@ out:
105static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) 105static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
106{ 106{
107 unsigned int minor = iminor(file->f_path.dentry->d_inode); 107 unsigned int minor = iminor(file->f_path.dentry->d_inode);
108 /* FIXME: What stops hidraw_table going NULL */
108 struct hid_device *dev = hidraw_table[minor]->hid; 109 struct hid_device *dev = hidraw_table[minor]->hid;
109 __u8 *buf; 110 __u8 *buf;
110 int ret = 0; 111 int ret = 0;
@@ -211,38 +212,43 @@ static int hidraw_release(struct inode * inode, struct file * file)
211 kfree(list->hidraw); 212 kfree(list->hidraw);
212 } 213 }
213 214
215 kfree(list);
216
214 return 0; 217 return 0;
215} 218}
216 219
217static int hidraw_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 220static long hidraw_ioctl(struct file *file, unsigned int cmd,
221 unsigned long arg)
218{ 222{
223 struct inode *inode = file->f_path.dentry->d_inode;
219 unsigned int minor = iminor(inode); 224 unsigned int minor = iminor(inode);
225 long ret = 0;
226 /* FIXME: What stops hidraw_table going NULL */
220 struct hidraw *dev = hidraw_table[minor]; 227 struct hidraw *dev = hidraw_table[minor];
221 void __user *user_arg = (void __user*) arg; 228 void __user *user_arg = (void __user*) arg;
222 229
230 lock_kernel();
223 switch (cmd) { 231 switch (cmd) {
224 case HIDIOCGRDESCSIZE: 232 case HIDIOCGRDESCSIZE:
225 if (put_user(dev->hid->rsize, (int __user *)arg)) 233 if (put_user(dev->hid->rsize, (int __user *)arg))
226 return -EFAULT; 234 ret = -EFAULT;
227 return 0; 235 break;
228 236
229 case HIDIOCGRDESC: 237 case HIDIOCGRDESC:
230 { 238 {
231 __u32 len; 239 __u32 len;
232 240
233 if (get_user(len, (int __user *)arg)) 241 if (get_user(len, (int __user *)arg))
234 return -EFAULT; 242 ret = -EFAULT;
235 243 else if (len > HID_MAX_DESCRIPTOR_SIZE - 1)
236 if (len > HID_MAX_DESCRIPTOR_SIZE - 1) 244 ret = -EINVAL;
237 return -EINVAL; 245 else if (copy_to_user(user_arg + offsetof(
238 246 struct hidraw_report_descriptor,
239 if (copy_to_user(user_arg + offsetof( 247 value[0]),
240 struct hidraw_report_descriptor, 248 dev->hid->rdesc,
241 value[0]), 249 min(dev->hid->rsize, len)))
242 dev->hid->rdesc, 250 ret = -EFAULT;
243 min(dev->hid->rsize, len))) 251 break;
244 return -EFAULT;
245 return 0;
246 } 252 }
247 case HIDIOCGRAWINFO: 253 case HIDIOCGRAWINFO:
248 { 254 {
@@ -252,15 +258,13 @@ static int hidraw_ioctl(struct inode *inode, struct file *file, unsigned int cmd
252 dinfo.vendor = dev->hid->vendor; 258 dinfo.vendor = dev->hid->vendor;
253 dinfo.product = dev->hid->product; 259 dinfo.product = dev->hid->product;
254 if (copy_to_user(user_arg, &dinfo, sizeof(dinfo))) 260 if (copy_to_user(user_arg, &dinfo, sizeof(dinfo)))
255 return -EFAULT; 261 ret = -EFAULT;
256 262 break;
257 return 0;
258 } 263 }
259 default: 264 default:
260 printk(KERN_EMERG "hidraw: unsupported ioctl() %x\n", 265 ret = -ENOTTY;
261 cmd);
262 } 266 }
263 return -EINVAL; 267 return ret;
264} 268}
265 269
266static const struct file_operations hidraw_ops = { 270static const struct file_operations hidraw_ops = {
@@ -270,7 +274,7 @@ static const struct file_operations hidraw_ops = {
270 .poll = hidraw_poll, 274 .poll = hidraw_poll,
271 .open = hidraw_open, 275 .open = hidraw_open,
272 .release = hidraw_release, 276 .release = hidraw_release,
273 .ioctl = hidraw_ioctl, 277 .unlocked_ioctl = hidraw_ioctl,
274}; 278};
275 279
276void hidraw_report_event(struct hid_device *hid, u8 *data, int len) 280void hidraw_report_event(struct hid_device *hid, u8 *data, int len)
@@ -322,8 +326,9 @@ int hidraw_connect(struct hid_device *hid)
322 goto out; 326 goto out;
323 } 327 }
324 328
325 dev->dev = device_create(hidraw_class, NULL, MKDEV(hidraw_major, minor), 329 dev->dev = device_create_drvdata(hidraw_class, NULL,
326 "%s%d", "hidraw", minor); 330 MKDEV(hidraw_major, minor), NULL,
331 "%s%d", "hidraw", minor);
327 332
328 if (IS_ERR(dev->dev)) { 333 if (IS_ERR(dev->dev)) {
329 spin_lock(&minors_lock); 334 spin_lock(&minors_lock);
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 01427c51c7cc..27fe4d8912cb 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -122,7 +122,7 @@ static void hid_reset(struct work_struct *work)
122 dev_dbg(&usbhid->intf->dev, "resetting device\n"); 122 dev_dbg(&usbhid->intf->dev, "resetting device\n");
123 rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf); 123 rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
124 if (rc_lock >= 0) { 124 if (rc_lock >= 0) {
125 rc = usb_reset_composite_device(hid_to_usb_dev(hid), usbhid->intf); 125 rc = usb_reset_device(hid_to_usb_dev(hid));
126 if (rc_lock) 126 if (rc_lock)
127 usb_unlock_device(hid_to_usb_dev(hid)); 127 usb_unlock_device(hid_to_usb_dev(hid));
128 } 128 }
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 1df832a8fcbc..61e78a4369b9 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -69,12 +69,18 @@
69#define USB_DEVICE_ID_APPLE_ALU_ANSI 0x0220 69#define USB_DEVICE_ID_APPLE_ALU_ANSI 0x0220
70#define USB_DEVICE_ID_APPLE_ALU_ISO 0x0221 70#define USB_DEVICE_ID_APPLE_ALU_ISO 0x0221
71#define USB_DEVICE_ID_APPLE_ALU_JIS 0x0222 71#define USB_DEVICE_ID_APPLE_ALU_JIS 0x0222
72#define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223
73#define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224
74#define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225
72#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229 75#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229
73#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a 76#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a
74#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b 77#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b
75#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c 78#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c
76#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO 0x022d 79#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO 0x022d
77#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS 0x022e 80#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS 0x022e
81#define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230
82#define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231
83#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232
78#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a 84#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
79#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b 85#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
80#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242 86#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
@@ -241,6 +247,8 @@
241#define USB_DEVICE_ID_LD_MACHINETEST 0x2040 247#define USB_DEVICE_ID_LD_MACHINETEST 0x2040
242 248
243#define USB_VENDOR_ID_LOGITECH 0x046d 249#define USB_VENDOR_ID_LOGITECH 0x046d
250#define USB_DEVICE_ID_LOGITECH_LX3 0xc044
251#define USB_DEVICE_ID_LOGITECH_V150 0xc047
244#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 252#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
245#define USB_DEVICE_ID_LOGITECH_HARMONY 0xc110 253#define USB_DEVICE_ID_LOGITECH_HARMONY 0xc110
246#define USB_DEVICE_ID_LOGITECH_HARMONY_2 0xc111 254#define USB_DEVICE_ID_LOGITECH_HARMONY_2 0xc111
@@ -314,6 +322,7 @@
314#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 322#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
315#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 323#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
316#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 324#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
325#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
317#define USB_DEVICE_ID_DINOVO_EDGE 0xc714 326#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
318#define USB_DEVICE_ID_DINOVO_MINI 0xc71f 327#define USB_DEVICE_ID_DINOVO_MINI 0xc71f
319 328
@@ -443,7 +452,8 @@ static const struct hid_blacklist {
443 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD }, 452 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
444 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, 453 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
445 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, 454 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
446 455
456 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP, HID_QUIRK_DUPLICATE_USAGES },
447 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES }, 457 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES },
448 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI, HID_QUIRK_DUPLICATE_USAGES }, 458 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI, HID_QUIRK_DUPLICATE_USAGES },
449 459
@@ -593,6 +603,8 @@ static const struct hid_blacklist {
593 603
594 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP }, 604 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
595 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP }, 605 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
606 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_LX3, HID_QUIRK_INVERT_HWHEEL },
607 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150, HID_QUIRK_INVERT_HWHEEL },
596 608
597 { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K, HID_QUIRK_MICROSOFT_KEYS }, 609 { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K, HID_QUIRK_MICROSOFT_KEYS },
598 { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K, HID_QUIRK_MICROSOFT_KEYS }, 610 { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K, HID_QUIRK_MICROSOFT_KEYS },
@@ -642,6 +654,12 @@ static const struct hid_blacklist {
642 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, 654 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
643 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, 655 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
644 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, 656 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
657 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN },
658 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
659 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN },
660 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN },
661 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
662 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN },
645 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, 663 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
646 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, 664 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
647 665
@@ -1128,7 +1146,7 @@ static void usbhid_fixup_microsoft_descriptor(unsigned char *rdesc, int rsize)
1128 && rdesc[557] == 0x19 1146 && rdesc[557] == 0x19
1129 && rdesc[559] == 0x29) { 1147 && rdesc[559] == 0x29) {
1130 printk(KERN_INFO "Fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n"); 1148 printk(KERN_INFO "Fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
1131 rdesc[284] = rdesc[304] = rdesc[558] = 0x35; 1149 rdesc[284] = rdesc[304] = rdesc[557] = 0x35;
1132 rdesc[352] = 0x36; 1150 rdesc[352] = 0x36;
1133 rdesc[286] = rdesc[355] = 0x46; 1151 rdesc[286] = rdesc[355] = 0x46;
1134 rdesc[306] = rdesc[559] = 0x45; 1152 rdesc[306] = rdesc[559] = 0x45;
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
index 95cc192bc7af..842e9edb888e 100644
--- a/drivers/hid/usbhid/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
@@ -406,6 +406,7 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
406 uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL); 406 uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
407 if (!uref_multi) 407 if (!uref_multi)
408 return -ENOMEM; 408 return -ENOMEM;
409 lock_kernel();
409 uref = &uref_multi->uref; 410 uref = &uref_multi->uref;
410 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) { 411 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
411 if (copy_from_user(uref_multi, user_arg, 412 if (copy_from_user(uref_multi, user_arg,
@@ -501,12 +502,15 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
501 } 502 }
502 503
503goodreturn: 504goodreturn:
505 unlock_kernel();
504 kfree(uref_multi); 506 kfree(uref_multi);
505 return 0; 507 return 0;
506fault: 508fault:
509 unlock_kernel();
507 kfree(uref_multi); 510 kfree(uref_multi);
508 return -EFAULT; 511 return -EFAULT;
509inval: 512inval:
513 unlock_kernel();
510 kfree(uref_multi); 514 kfree(uref_multi);
511 return -EINVAL; 515 return -EINVAL;
512 } 516 }
@@ -540,7 +544,7 @@ static noinline int hiddev_ioctl_string(struct hiddev *hiddev, unsigned int cmd,
540 return len; 544 return len;
541} 545}
542 546
543static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 547static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
544{ 548{
545 struct hiddev_list *list = file->private_data; 549 struct hiddev_list *list = file->private_data;
546 struct hiddev *hiddev = list->hiddev; 550 struct hiddev *hiddev = list->hiddev;
@@ -555,7 +559,10 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
555 struct usbhid_device *usbhid = hid->driver_data; 559 struct usbhid_device *usbhid = hid->driver_data;
556 void __user *user_arg = (void __user *)arg; 560 void __user *user_arg = (void __user *)arg;
557 int i; 561 int i;
562
563 /* Called without BKL by compat methods so no BKL taken */
558 564
565 /* FIXME: Who or what stop this racing with a disconnect ?? */
559 if (!hiddev->exist) 566 if (!hiddev->exist)
560 return -EIO; 567 return -EIO;
561 568
@@ -756,8 +763,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
756#ifdef CONFIG_COMPAT 763#ifdef CONFIG_COMPAT
757static long hiddev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 764static long hiddev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
758{ 765{
759 struct inode *inode = file->f_path.dentry->d_inode; 766 return hiddev_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
760 return hiddev_ioctl(inode, file, cmd, (unsigned long)compat_ptr(arg));
761} 767}
762#endif 768#endif
763 769
@@ -768,7 +774,7 @@ static const struct file_operations hiddev_fops = {
768 .poll = hiddev_poll, 774 .poll = hiddev_poll,
769 .open = hiddev_open, 775 .open = hiddev_open,
770 .release = hiddev_release, 776 .release = hiddev_release,
771 .ioctl = hiddev_ioctl, 777 .unlocked_ioctl = hiddev_ioctl,
772 .fasync = hiddev_fasync, 778 .fasync = hiddev_fasync,
773#ifdef CONFIG_COMPAT 779#ifdef CONFIG_COMPAT
774 .compat_ioctl = hiddev_compat_ioctl, 780 .compat_ioctl = hiddev_compat_ioctl,
diff --git a/drivers/hid/usbhid/usbkbd.c b/drivers/hid/usbhid/usbkbd.c
index 3cd46d2e53c1..0caaafe01843 100644
--- a/drivers/hid/usbhid/usbkbd.c
+++ b/drivers/hid/usbhid/usbkbd.c
@@ -43,7 +43,7 @@ MODULE_AUTHOR(DRIVER_AUTHOR);
43MODULE_DESCRIPTION(DRIVER_DESC); 43MODULE_DESCRIPTION(DRIVER_DESC);
44MODULE_LICENSE(DRIVER_LICENSE); 44MODULE_LICENSE(DRIVER_LICENSE);
45 45
46static unsigned char usb_kbd_keycode[256] = { 46static const unsigned char usb_kbd_keycode[256] = {
47 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 47 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
48 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, 48 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
49 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, 49 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
@@ -233,14 +233,6 @@ static int usb_kbd_probe(struct usb_interface *iface,
233 if (!usb_endpoint_is_int_in(endpoint)) 233 if (!usb_endpoint_is_int_in(endpoint))
234 return -ENODEV; 234 return -ENODEV;
235 235
236#ifdef CONFIG_USB_HID
237 if (usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
238 le16_to_cpu(dev->descriptor.idProduct))
239 & HID_QUIRK_IGNORE) {
240 return -ENODEV;
241 }
242#endif
243
244 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); 236 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
245 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); 237 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
246 238
diff --git a/drivers/hid/usbhid/usbmouse.c b/drivers/hid/usbhid/usbmouse.c
index 703e9d0e8714..35689ef172cc 100644
--- a/drivers/hid/usbhid/usbmouse.c
+++ b/drivers/hid/usbhid/usbmouse.c
@@ -129,14 +129,6 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
129 if (!usb_endpoint_is_int_in(endpoint)) 129 if (!usb_endpoint_is_int_in(endpoint))
130 return -ENODEV; 130 return -ENODEV;
131 131
132#ifdef CONFIG_USB_HID
133 if (usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
134 le16_to_cpu(dev->descriptor.idProduct))
135 & (HID_QUIRK_IGNORE|HID_QUIRK_IGNORE_MOUSE)) {
136 return -ENODEV;
137 }
138#endif
139
140 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); 132 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
141 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); 133 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
142 134
diff --git a/drivers/hwmon/hdaps.c b/drivers/hwmon/hdaps.c
index 50f22690d611..a4d92d246d52 100644
--- a/drivers/hwmon/hdaps.c
+++ b/drivers/hwmon/hdaps.c
@@ -581,6 +581,8 @@ static int __init hdaps_init(void)
581 /* initialize the input class */ 581 /* initialize the input class */
582 idev = hdaps_idev->input; 582 idev = hdaps_idev->input;
583 idev->name = "hdaps"; 583 idev->name = "hdaps";
584 idev->phys = "isa1600/input0";
585 idev->id.bustype = BUS_ISA;
584 idev->dev.parent = &pdev->dev; 586 idev->dev.parent = &pdev->dev;
585 idev->evbit[0] = BIT_MASK(EV_ABS); 587 idev->evbit[0] = BIT_MASK(EV_ABS);
586 input_set_abs_params(idev, ABS_X, 588 input_set_abs_params(idev, ABS_X,
diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index 3db28450a3b3..7321a88a5112 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -55,7 +55,8 @@ again:
55 return ERR_PTR(err); 55 return ERR_PTR(err);
56 56
57 id = id & MAX_ID_MASK; 57 id = id & MAX_ID_MASK;
58 hwdev = device_create(hwmon_class, dev, MKDEV(0,0), HWMON_ID_FORMAT, id); 58 hwdev = device_create_drvdata(hwmon_class, dev, MKDEV(0, 0), NULL,
59 HWMON_ID_FORMAT, id);
59 60
60 if (IS_ERR(hwdev)) { 61 if (IS_ERR(hwdev)) {
61 spin_lock(&idr_lock); 62 spin_lock(&idr_lock);
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 7608df83d6d1..7bf38c418086 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -722,7 +722,8 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
722 722
723 INIT_LIST_HEAD(&driver->clients); 723 INIT_LIST_HEAD(&driver->clients);
724 /* Walk the adapters that are already present */ 724 /* Walk the adapters that are already present */
725 class_for_each_device(&i2c_adapter_class, driver, __attach_adapter); 725 class_for_each_device(&i2c_adapter_class, NULL, driver,
726 __attach_adapter);
726 727
727 mutex_unlock(&core_lock); 728 mutex_unlock(&core_lock);
728 return 0; 729 return 0;
@@ -782,7 +783,8 @@ void i2c_del_driver(struct i2c_driver *driver)
782{ 783{
783 mutex_lock(&core_lock); 784 mutex_lock(&core_lock);
784 785
785 class_for_each_device(&i2c_adapter_class, driver, __detach_adapter); 786 class_for_each_device(&i2c_adapter_class, NULL, driver,
787 __detach_adapter);
786 788
787 driver_unregister(&driver->driver); 789 driver_unregister(&driver->driver);
788 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name); 790 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
index 86727fa8858f..9d55c6383b23 100644
--- a/drivers/i2c/i2c-dev.c
+++ b/drivers/i2c/i2c-dev.c
@@ -521,9 +521,9 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap)
521 return PTR_ERR(i2c_dev); 521 return PTR_ERR(i2c_dev);
522 522
523 /* register this i2c device with the driver core */ 523 /* register this i2c device with the driver core */
524 i2c_dev->dev = device_create(i2c_dev_class, &adap->dev, 524 i2c_dev->dev = device_create_drvdata(i2c_dev_class, &adap->dev,
525 MKDEV(I2C_MAJOR, adap->nr), 525 MKDEV(I2C_MAJOR, adap->nr),
526 "i2c-%d", adap->nr); 526 NULL, "i2c-%d", adap->nr);
527 if (IS_ERR(i2c_dev->dev)) { 527 if (IS_ERR(i2c_dev->dev)) {
528 res = PTR_ERR(i2c_dev->dev); 528 res = PTR_ERR(i2c_dev->dev);
529 goto error; 529 goto error;
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
index 15b09b89588a..04d9c4d459d0 100644
--- a/drivers/ide/Kconfig
+++ b/drivers/ide/Kconfig
@@ -510,6 +510,7 @@ config BLK_DEV_TRIFLEX
510 510
511config BLK_DEV_CY82C693 511config BLK_DEV_CY82C693
512 tristate "CY82C693 chipset support" 512 tristate "CY82C693 chipset support"
513 depends on ALPHA
513 select IDE_TIMINGS 514 select IDE_TIMINGS
514 select BLK_DEV_IDEDMA_PCI 515 select BLK_DEV_IDEDMA_PCI
515 help 516 help
@@ -548,6 +549,7 @@ config BLK_DEV_CS5535
548 549
549config BLK_DEV_HPT34X 550config BLK_DEV_HPT34X
550 tristate "HPT34X chipset support" 551 tristate "HPT34X chipset support"
552 depends on BROKEN
551 select BLK_DEV_IDEDMA_PCI 553 select BLK_DEV_IDEDMA_PCI
552 help 554 help
553 This driver adds up to 4 more EIDE devices sharing a single 555 This driver adds up to 4 more EIDE devices sharing a single
diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c
index 52f58c885783..f575e8341aec 100644
--- a/drivers/ide/arm/icside.c
+++ b/drivers/ide/arm/icside.c
@@ -72,7 +72,7 @@ struct icside_state {
72 void __iomem *ioc_base; 72 void __iomem *ioc_base;
73 unsigned int sel; 73 unsigned int sel;
74 unsigned int type; 74 unsigned int type;
75 ide_hwif_t *hwif[2]; 75 struct ide_host *host;
76}; 76};
77 77
78#define ICS_TYPE_A3IN 0 78#define ICS_TYPE_A3IN 0
@@ -375,12 +375,14 @@ static int icside_dma_test_irq(ide_drive_t *drive)
375 375
376static void icside_dma_timeout(ide_drive_t *drive) 376static void icside_dma_timeout(ide_drive_t *drive)
377{ 377{
378 ide_hwif_t *hwif = drive->hwif;
379
378 printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name); 380 printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name);
379 381
380 if (icside_dma_test_irq(drive)) 382 if (icside_dma_test_irq(drive))
381 return; 383 return;
382 384
383 ide_dump_status(drive, "DMA timeout", ide_read_status(drive)); 385 ide_dump_status(drive, "DMA timeout", hwif->tp_ops->read_status(hwif));
384 386
385 icside_dma_end(drive); 387 icside_dma_end(drive);
386} 388}
@@ -440,10 +442,10 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base,
440static int __init 442static int __init
441icside_register_v5(struct icside_state *state, struct expansion_card *ec) 443icside_register_v5(struct icside_state *state, struct expansion_card *ec)
442{ 444{
443 ide_hwif_t *hwif;
444 void __iomem *base; 445 void __iomem *base;
445 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 446 struct ide_host *host;
446 hw_regs_t hw; 447 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
448 int ret;
447 449
448 base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); 450 base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
449 if (!base) 451 if (!base)
@@ -463,22 +465,23 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
463 465
464 icside_setup_ports(&hw, base, &icside_cardinfo_v5, ec); 466 icside_setup_ports(&hw, base, &icside_cardinfo_v5, ec);
465 467
466 hwif = ide_find_port(); 468 host = ide_host_alloc(NULL, hws);
467 if (!hwif) 469 if (host == NULL)
468 return -ENODEV; 470 return -ENODEV;
469 471
470 ide_init_port_hw(hwif, &hw); 472 state->host = host;
471 default_hwif_mmiops(hwif);
472
473 state->hwif[0] = hwif;
474 473
475 ecard_set_drvdata(ec, state); 474 ecard_set_drvdata(ec, state);
476 475
477 idx[0] = hwif->index; 476 ret = ide_host_register(host, NULL, hws);
478 477 if (ret)
479 ide_device_add(idx, NULL); 478 goto err_free;
480 479
481 return 0; 480 return 0;
481err_free:
482 ide_host_free(host);
483 ecard_set_drvdata(ec, NULL);
484 return ret;
482} 485}
483 486
484static const struct ide_port_info icside_v6_port_info __initdata = { 487static const struct ide_port_info icside_v6_port_info __initdata = {
@@ -493,13 +496,12 @@ static const struct ide_port_info icside_v6_port_info __initdata = {
493static int __init 496static int __init
494icside_register_v6(struct icside_state *state, struct expansion_card *ec) 497icside_register_v6(struct icside_state *state, struct expansion_card *ec)
495{ 498{
496 ide_hwif_t *hwif, *mate;
497 void __iomem *ioc_base, *easi_base; 499 void __iomem *ioc_base, *easi_base;
500 struct ide_host *host;
498 unsigned int sel = 0; 501 unsigned int sel = 0;
499 int ret; 502 int ret;
500 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 503 hw_regs_t hw[2], *hws[] = { &hw[0], NULL, NULL, NULL };
501 struct ide_port_info d = icside_v6_port_info; 504 struct ide_port_info d = icside_v6_port_info;
502 hw_regs_t hw[2];
503 505
504 ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); 506 ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
505 if (!ioc_base) { 507 if (!ioc_base) {
@@ -538,28 +540,11 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
538 icside_setup_ports(&hw[0], easi_base, &icside_cardinfo_v6_1, ec); 540 icside_setup_ports(&hw[0], easi_base, &icside_cardinfo_v6_1, ec);
539 icside_setup_ports(&hw[1], easi_base, &icside_cardinfo_v6_2, ec); 541 icside_setup_ports(&hw[1], easi_base, &icside_cardinfo_v6_2, ec);
540 542
541 /* 543 host = ide_host_alloc(&d, hws);
542 * Find and register the interfaces. 544 if (host == NULL)
543 */
544 hwif = ide_find_port();
545 if (hwif == NULL)
546 return -ENODEV; 545 return -ENODEV;
547 546
548 ide_init_port_hw(hwif, &hw[0]); 547 state->host = host;
549 default_hwif_mmiops(hwif);
550
551 idx[0] = hwif->index;
552
553 mate = ide_find_port();
554 if (mate) {
555 ide_init_port_hw(mate, &hw[1]);
556 default_hwif_mmiops(mate);
557
558 idx[1] = mate->index;
559 }
560
561 state->hwif[0] = hwif;
562 state->hwif[1] = mate;
563 548
564 ecard_set_drvdata(ec, state); 549 ecard_set_drvdata(ec, state);
565 550
@@ -569,11 +554,17 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
569 d.dma_ops = NULL; 554 d.dma_ops = NULL;
570 } 555 }
571 556
572 ide_device_add(idx, &d); 557 ret = ide_host_register(host, NULL, hws);
558 if (ret)
559 goto err_free;
573 560
574 return 0; 561 return 0;
575 562err_free:
576 out: 563 ide_host_free(host);
564 if (d.dma_ops)
565 free_dma(ec->dma);
566 ecard_set_drvdata(ec, NULL);
567out:
577 return ret; 568 return ret;
578} 569}
579 570
diff --git a/drivers/ide/arm/ide_arm.c b/drivers/ide/arm/ide_arm.c
index 2f311da4c963..176532ffae0e 100644
--- a/drivers/ide/arm/ide_arm.c
+++ b/drivers/ide/arm/ide_arm.c
@@ -28,10 +28,8 @@
28 28
29static int __init ide_arm_init(void) 29static int __init ide_arm_init(void)
30{ 30{
31 ide_hwif_t *hwif;
32 hw_regs_t hw;
33 unsigned long base = IDE_ARM_IO, ctl = IDE_ARM_IO + 0x206; 31 unsigned long base = IDE_ARM_IO, ctl = IDE_ARM_IO + 0x206;
34 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 32 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
35 33
36 if (!request_region(base, 8, DRV_NAME)) { 34 if (!request_region(base, 8, DRV_NAME)) {
37 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", 35 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
@@ -51,15 +49,7 @@ static int __init ide_arm_init(void)
51 hw.irq = IDE_ARM_IRQ; 49 hw.irq = IDE_ARM_IRQ;
52 hw.chipset = ide_generic; 50 hw.chipset = ide_generic;
53 51
54 hwif = ide_find_port(); 52 return ide_host_add(NULL, hws, NULL);
55 if (hwif) {
56 ide_init_port_hw(hwif, &hw);
57 idx[0] = hwif->index;
58
59 ide_device_add(idx, NULL);
60 }
61
62 return 0;
63} 53}
64 54
65module_init(ide_arm_init); 55module_init(ide_arm_init);
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c
index c79b85b6e4a3..65bb4b8fd570 100644
--- a/drivers/ide/arm/palm_bk3710.c
+++ b/drivers/ide/arm/palm_bk3710.c
@@ -316,15 +316,14 @@ static u8 __devinit palm_bk3710_cable_detect(ide_hwif_t *hwif)
316static int __devinit palm_bk3710_init_dma(ide_hwif_t *hwif, 316static int __devinit palm_bk3710_init_dma(ide_hwif_t *hwif,
317 const struct ide_port_info *d) 317 const struct ide_port_info *d)
318{ 318{
319 unsigned long base =
320 hwif->io_ports.data_addr - IDE_PALM_ATA_PRI_REG_OFFSET;
321
322 printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); 319 printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name);
323 320
324 if (ide_allocate_dma_engine(hwif)) 321 if (ide_allocate_dma_engine(hwif))
325 return -1; 322 return -1;
326 323
327 ide_setup_dma(hwif, base); 324 hwif->dma_base = hwif->io_ports.data_addr - IDE_PALM_ATA_PRI_REG_OFFSET;
325
326 hwif->dma_ops = &sff_dma_ops;
328 327
329 return 0; 328 return 0;
330} 329}
@@ -348,11 +347,10 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
348{ 347{
349 struct clk *clk; 348 struct clk *clk;
350 struct resource *mem, *irq; 349 struct resource *mem, *irq;
351 ide_hwif_t *hwif; 350 struct ide_host *host;
352 unsigned long base, rate; 351 unsigned long base, rate;
353 int i; 352 int i, rc;
354 hw_regs_t hw; 353 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
355 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
356 354
357 clk = clk_get(NULL, "IDECLK"); 355 clk = clk_get(NULL, "IDECLK");
358 if (IS_ERR(clk)) 356 if (IS_ERR(clk))
@@ -394,24 +392,14 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
394 hw.irq = irq->start; 392 hw.irq = irq->start;
395 hw.chipset = ide_palm3710; 393 hw.chipset = ide_palm3710;
396 394
397 hwif = ide_find_port(); 395 rc = ide_host_add(&palm_bk3710_port_info, hws, NULL);
398 if (hwif == NULL) 396 if (rc)
399 goto out; 397 goto out;
400 398
401 i = hwif->index;
402
403 ide_init_port_hw(hwif, &hw);
404
405 default_hwif_mmiops(hwif);
406
407 idx[0] = i;
408
409 ide_device_add(idx, &palm_bk3710_port_info);
410
411 return 0; 399 return 0;
412out: 400out:
413 printk(KERN_WARNING "Palm Chip BK3710 IDE Register Fail\n"); 401 printk(KERN_WARNING "Palm Chip BK3710 IDE Register Fail\n");
414 return -ENODEV; 402 return rc;
415} 403}
416 404
417/* work with hotplug and coldplug */ 405/* work with hotplug and coldplug */
diff --git a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c
index 43057e0303c8..2bdd8b734afb 100644
--- a/drivers/ide/arm/rapide.c
+++ b/drivers/ide/arm/rapide.c
@@ -32,11 +32,10 @@ static void rapide_setup_ports(hw_regs_t *hw, void __iomem *base,
32static int __devinit 32static int __devinit
33rapide_probe(struct expansion_card *ec, const struct ecard_id *id) 33rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
34{ 34{
35 ide_hwif_t *hwif;
36 void __iomem *base; 35 void __iomem *base;
36 struct ide_host *host;
37 int ret; 37 int ret;
38 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 38 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
39 hw_regs_t hw;
40 39
41 ret = ecard_request_resources(ec); 40 ret = ecard_request_resources(ec);
42 if (ret) 41 if (ret)
@@ -53,20 +52,11 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
53 hw.chipset = ide_generic; 52 hw.chipset = ide_generic;
54 hw.dev = &ec->dev; 53 hw.dev = &ec->dev;
55 54
56 hwif = ide_find_port(); 55 ret = ide_host_add(&rapide_port_info, hws, &host);
57 if (hwif == NULL) { 56 if (ret)
58 ret = -ENOENT;
59 goto release; 57 goto release;
60 }
61
62 ide_init_port_hw(hwif, &hw);
63 default_hwif_mmiops(hwif);
64
65 idx[0] = hwif->index;
66
67 ide_device_add(idx, &rapide_port_info);
68 58
69 ecard_set_drvdata(ec, hwif); 59 ecard_set_drvdata(ec, host);
70 goto out; 60 goto out;
71 61
72 release: 62 release:
@@ -77,11 +67,11 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
77 67
78static void __devexit rapide_remove(struct expansion_card *ec) 68static void __devexit rapide_remove(struct expansion_card *ec)
79{ 69{
80 ide_hwif_t *hwif = ecard_get_drvdata(ec); 70 struct ide_host *host = ecard_get_drvdata(ec);
81 71
82 ecard_set_drvdata(ec, NULL); 72 ecard_set_drvdata(ec, NULL);
83 73
84 ide_unregister(hwif); 74 ide_host_remove(host);
85 75
86 ecard_release_resources(ec); 76 ecard_release_resources(ec);
87} 77}
diff --git a/drivers/ide/h8300/ide-h8300.c b/drivers/ide/h8300/ide-h8300.c
index 20fad6d542cc..bde7a585f198 100644
--- a/drivers/ide/h8300/ide-h8300.c
+++ b/drivers/ide/h8300/ide-h8300.c
@@ -100,6 +100,8 @@ static void h8300_tf_read(ide_drive_t *drive, ide_task_t *task)
100 /* be sure we're looking at the low order bits */ 100 /* be sure we're looking at the low order bits */
101 outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr); 101 outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
102 102
103 if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
104 tf->feature = inb(io_ports->feature_addr);
103 if (task->tf_flags & IDE_TFLAG_IN_NSECT) 105 if (task->tf_flags & IDE_TFLAG_IN_NSECT)
104 tf->nsect = inb(io_ports->nsect_addr); 106 tf->nsect = inb(io_ports->nsect_addr);
105 if (task->tf_flags & IDE_TFLAG_IN_LBAL) 107 if (task->tf_flags & IDE_TFLAG_IN_LBAL)
@@ -153,6 +155,21 @@ static void h8300_output_data(ide_drive_t *drive, struct request *rq,
153 mm_outsw(drive->hwif->io_ports.data_addr, buf, (len + 1) / 2); 155 mm_outsw(drive->hwif->io_ports.data_addr, buf, (len + 1) / 2);
154} 156}
155 157
158static const struct ide_tp_ops h8300_tp_ops = {
159 .exec_command = ide_exec_command,
160 .read_status = ide_read_status,
161 .read_altstatus = ide_read_altstatus,
162 .read_sff_dma_status = ide_read_sff_dma_status,
163
164 .set_irq = ide_set_irq,
165
166 .tf_load = h8300_tf_load,
167 .tf_read = h8300_tf_read,
168
169 .input_data = h8300_input_data,
170 .output_data = h8300_output_data,
171};
172
156#define H8300_IDE_GAP (2) 173#define H8300_IDE_GAP (2)
157 174
158static inline void hw_setup(hw_regs_t *hw) 175static inline void hw_setup(hw_regs_t *hw)
@@ -167,27 +184,14 @@ static inline void hw_setup(hw_regs_t *hw)
167 hw->chipset = ide_generic; 184 hw->chipset = ide_generic;
168} 185}
169 186
170static inline void hwif_setup(ide_hwif_t *hwif)
171{
172 default_hwif_iops(hwif);
173
174 hwif->tf_load = h8300_tf_load;
175 hwif->tf_read = h8300_tf_read;
176
177 hwif->input_data = h8300_input_data;
178 hwif->output_data = h8300_output_data;
179}
180
181static const struct ide_port_info h8300_port_info = { 187static const struct ide_port_info h8300_port_info = {
188 .tp_ops = &h8300_tp_ops,
182 .host_flags = IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_NO_DMA, 189 .host_flags = IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_NO_DMA,
183}; 190};
184 191
185static int __init h8300_ide_init(void) 192static int __init h8300_ide_init(void)
186{ 193{
187 hw_regs_t hw; 194 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
188 ide_hwif_t *hwif;
189 int index;
190 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
191 195
192 printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n"); 196 printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n");
193 197
@@ -200,19 +204,7 @@ static int __init h8300_ide_init(void)
200 204
201 hw_setup(&hw); 205 hw_setup(&hw);
202 206
203 hwif = ide_find_port_slot(&h8300_port_info); 207 return ide_host_add(&h8300_port_info, hws, NULL);
204 if (hwif == NULL)
205 return -ENOENT;
206
207 index = hwif->index;
208 ide_init_port_hw(hwif, &hw);
209 hwif_setup(hwif);
210
211 idx[0] = index;
212
213 ide_device_add(idx, &h8300_port_info);
214
215 return 0;
216 208
217out_busy: 209out_busy:
218 printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n"); 210 printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n");
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c
index 2802031de670..adf04f99cdeb 100644
--- a/drivers/ide/ide-atapi.c
+++ b/drivers/ide/ide-atapi.c
@@ -22,6 +22,8 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
22 void (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int)) 22 void (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int))
23{ 23{
24 ide_hwif_t *hwif = drive->hwif; 24 ide_hwif_t *hwif = drive->hwif;
25 struct request *rq = hwif->hwgroup->rq;
26 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
25 xfer_func_t *xferfunc; 27 xfer_func_t *xferfunc;
26 unsigned int temp; 28 unsigned int temp;
27 u16 bcount; 29 u16 bcount;
@@ -30,12 +32,12 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
30 debug_log("Enter %s - interrupt handler\n", __func__); 32 debug_log("Enter %s - interrupt handler\n", __func__);
31 33
32 if (pc->flags & PC_FLAG_TIMEDOUT) { 34 if (pc->flags & PC_FLAG_TIMEDOUT) {
33 pc->callback(drive); 35 drive->pc_callback(drive);
34 return ide_stopped; 36 return ide_stopped;
35 } 37 }
36 38
37 /* Clear the interrupt */ 39 /* Clear the interrupt */
38 stat = ide_read_status(drive); 40 stat = tp_ops->read_status(hwif);
39 41
40 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { 42 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
41 if (hwif->dma_ops->dma_end(drive) || 43 if (hwif->dma_ops->dma_end(drive) ||
@@ -63,8 +65,9 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
63 local_irq_enable_in_hardirq(); 65 local_irq_enable_in_hardirq();
64 66
65 if (drive->media == ide_tape && !scsi && 67 if (drive->media == ide_tape && !scsi &&
66 (stat & ERR_STAT) && pc->c[0] == REQUEST_SENSE) 68 (stat & ERR_STAT) && rq->cmd[0] == REQUEST_SENSE)
67 stat &= ~ERR_STAT; 69 stat &= ~ERR_STAT;
70
68 if ((stat & ERR_STAT) || (pc->flags & PC_FLAG_DMA_ERROR)) { 71 if ((stat & ERR_STAT) || (pc->flags & PC_FLAG_DMA_ERROR)) {
69 /* Error detected */ 72 /* Error detected */
70 debug_log("%s: I/O error\n", drive->name); 73 debug_log("%s: I/O error\n", drive->name);
@@ -75,16 +78,17 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
75 goto cmd_finished; 78 goto cmd_finished;
76 } 79 }
77 80
78 if (pc->c[0] == REQUEST_SENSE) { 81 if (rq->cmd[0] == REQUEST_SENSE) {
79 printk(KERN_ERR "%s: I/O error in request sense" 82 printk(KERN_ERR "%s: I/O error in request sense"
80 " command\n", drive->name); 83 " command\n", drive->name);
81 return ide_do_reset(drive); 84 return ide_do_reset(drive);
82 } 85 }
83 86
84 debug_log("[cmd %x]: check condition\n", pc->c[0]); 87 debug_log("[cmd %x]: check condition\n", rq->cmd[0]);
85 88
86 /* Retry operation */ 89 /* Retry operation */
87 retry_pc(drive); 90 retry_pc(drive);
91
88 /* queued, but not started */ 92 /* queued, but not started */
89 return ide_stopped; 93 return ide_stopped;
90 } 94 }
@@ -95,8 +99,10 @@ cmd_finished:
95 dsc_handle(drive); 99 dsc_handle(drive);
96 return ide_stopped; 100 return ide_stopped;
97 } 101 }
102
98 /* Command finished - Call the callback function */ 103 /* Command finished - Call the callback function */
99 pc->callback(drive); 104 drive->pc_callback(drive);
105
100 return ide_stopped; 106 return ide_stopped;
101 } 107 }
102 108
@@ -107,16 +113,15 @@ cmd_finished:
107 ide_dma_off(drive); 113 ide_dma_off(drive);
108 return ide_do_reset(drive); 114 return ide_do_reset(drive);
109 } 115 }
110 /* Get the number of bytes to transfer on this interrupt. */
111 bcount = (hwif->INB(hwif->io_ports.lbah_addr) << 8) |
112 hwif->INB(hwif->io_ports.lbam_addr);
113 116
114 ireason = hwif->INB(hwif->io_ports.nsect_addr); 117 /* Get the number of bytes to transfer on this interrupt. */
118 ide_read_bcount_and_ireason(drive, &bcount, &ireason);
115 119
116 if (ireason & CD) { 120 if (ireason & CD) {
117 printk(KERN_ERR "%s: CoD != 0 in %s\n", drive->name, __func__); 121 printk(KERN_ERR "%s: CoD != 0 in %s\n", drive->name, __func__);
118 return ide_do_reset(drive); 122 return ide_do_reset(drive);
119 } 123 }
124
120 if (((ireason & IO) == IO) == !!(pc->flags & PC_FLAG_WRITING)) { 125 if (((ireason & IO) == IO) == !!(pc->flags & PC_FLAG_WRITING)) {
121 /* Hopefully, we will never get here */ 126 /* Hopefully, we will never get here */
122 printk(KERN_ERR "%s: We wanted to %s, but the device wants us " 127 printk(KERN_ERR "%s: We wanted to %s, but the device wants us "
@@ -125,6 +130,7 @@ cmd_finished:
125 (ireason & IO) ? "Read" : "Write"); 130 (ireason & IO) ? "Read" : "Write");
126 return ide_do_reset(drive); 131 return ide_do_reset(drive);
127 } 132 }
133
128 if (!(pc->flags & PC_FLAG_WRITING)) { 134 if (!(pc->flags & PC_FLAG_WRITING)) {
129 /* Reading - Check that we have enough space */ 135 /* Reading - Check that we have enough space */
130 temp = pc->xferred + bcount; 136 temp = pc->xferred + bcount;
@@ -142,7 +148,7 @@ cmd_finished:
142 if (pc->sg) 148 if (pc->sg)
143 io_buffers(drive, pc, temp, 0); 149 io_buffers(drive, pc, temp, 0);
144 else 150 else
145 hwif->input_data(drive, NULL, 151 tp_ops->input_data(drive, NULL,
146 pc->cur_pos, temp); 152 pc->cur_pos, temp);
147 printk(KERN_ERR "%s: transferred %d of " 153 printk(KERN_ERR "%s: transferred %d of "
148 "%d bytes\n", 154 "%d bytes\n",
@@ -159,9 +165,9 @@ cmd_finished:
159 debug_log("The device wants to send us more data than " 165 debug_log("The device wants to send us more data than "
160 "expected - allowing transfer\n"); 166 "expected - allowing transfer\n");
161 } 167 }
162 xferfunc = hwif->input_data; 168 xferfunc = tp_ops->input_data;
163 } else 169 } else
164 xferfunc = hwif->output_data; 170 xferfunc = tp_ops->output_data;
165 171
166 if ((drive->media == ide_floppy && !scsi && !pc->buf) || 172 if ((drive->media == ide_floppy && !scsi && !pc->buf) ||
167 (drive->media == ide_tape && !scsi && pc->bh) || 173 (drive->media == ide_tape && !scsi && pc->bh) ||
@@ -175,7 +181,7 @@ cmd_finished:
175 pc->cur_pos += bcount; 181 pc->cur_pos += bcount;
176 182
177 debug_log("[cmd %x] transferred %d bytes on that intr.\n", 183 debug_log("[cmd %x] transferred %d bytes on that intr.\n",
178 pc->c[0], bcount); 184 rq->cmd[0], bcount);
179 185
180 /* And set the interrupt handler again */ 186 /* And set the interrupt handler again */
181 ide_set_handler(drive, handler, timeout, expiry); 187 ide_set_handler(drive, handler, timeout, expiry);
@@ -183,16 +189,27 @@ cmd_finished:
183} 189}
184EXPORT_SYMBOL_GPL(ide_pc_intr); 190EXPORT_SYMBOL_GPL(ide_pc_intr);
185 191
192static u8 ide_read_ireason(ide_drive_t *drive)
193{
194 ide_task_t task;
195
196 memset(&task, 0, sizeof(task));
197 task.tf_flags = IDE_TFLAG_IN_NSECT;
198
199 drive->hwif->tp_ops->tf_read(drive, &task);
200
201 return task.tf.nsect & 3;
202}
203
186static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) 204static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason)
187{ 205{
188 ide_hwif_t *hwif = drive->hwif;
189 int retries = 100; 206 int retries = 100;
190 207
191 while (retries-- && ((ireason & CD) == 0 || (ireason & IO))) { 208 while (retries-- && ((ireason & CD) == 0 || (ireason & IO))) {
192 printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing " 209 printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing "
193 "a packet command, retrying\n", drive->name); 210 "a packet command, retrying\n", drive->name);
194 udelay(100); 211 udelay(100);
195 ireason = hwif->INB(hwif->io_ports.nsect_addr); 212 ireason = ide_read_ireason(drive);
196 if (retries == 0) { 213 if (retries == 0) {
197 printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing " 214 printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing "
198 "a packet command, ignoring\n", 215 "a packet command, ignoring\n",
@@ -210,6 +227,7 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
210 ide_expiry_t *expiry) 227 ide_expiry_t *expiry)
211{ 228{
212 ide_hwif_t *hwif = drive->hwif; 229 ide_hwif_t *hwif = drive->hwif;
230 struct request *rq = hwif->hwgroup->rq;
213 ide_startstop_t startstop; 231 ide_startstop_t startstop;
214 u8 ireason; 232 u8 ireason;
215 233
@@ -219,7 +237,7 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
219 return startstop; 237 return startstop;
220 } 238 }
221 239
222 ireason = hwif->INB(hwif->io_ports.nsect_addr); 240 ireason = ide_read_ireason(drive);
223 if (drive->media == ide_tape && !drive->scsi) 241 if (drive->media == ide_tape && !drive->scsi)
224 ireason = ide_wait_ireason(drive, ireason); 242 ireason = ide_wait_ireason(drive, ireason);
225 243
@@ -239,8 +257,8 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
239 } 257 }
240 258
241 /* Send the actual packet */ 259 /* Send the actual packet */
242 if ((pc->flags & PC_FLAG_ZIP_DRIVE) == 0) 260 if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0)
243 hwif->output_data(drive, NULL, pc->c, 12); 261 hwif->tp_ops->output_data(drive, NULL, rq->cmd, 12);
244 262
245 return ide_started; 263 return ide_started;
246} 264}
@@ -284,7 +302,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
284 bcount, dma); 302 bcount, dma);
285 303
286 /* Issue the packet command */ 304 /* Issue the packet command */
287 if (pc->flags & PC_FLAG_DRQ_INTERRUPT) { 305 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
288 ide_execute_command(drive, WIN_PACKETCMD, handler, 306 ide_execute_command(drive, WIN_PACKETCMD, handler,
289 timeout, NULL); 307 timeout, NULL);
290 return ide_started; 308 return ide_started;
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 6e29dd532090..4e73aeee4053 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -85,10 +85,8 @@ static void ide_cd_put(struct cdrom_info *cd)
85/* Mark that we've seen a media change and invalidate our internal buffers. */ 85/* Mark that we've seen a media change and invalidate our internal buffers. */
86static void cdrom_saw_media_change(ide_drive_t *drive) 86static void cdrom_saw_media_change(ide_drive_t *drive)
87{ 87{
88 struct cdrom_info *cd = drive->driver_data; 88 drive->atapi_flags |= IDE_AFLAG_MEDIA_CHANGED;
89 89 drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID;
90 cd->cd_flags |= IDE_CD_FLAG_MEDIA_CHANGED;
91 cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID;
92} 90}
93 91
94static int cdrom_log_sense(ide_drive_t *drive, struct request *rq, 92static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
@@ -280,11 +278,12 @@ static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 st)
280 */ 278 */
281static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) 279static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
282{ 280{
283 struct request *rq = HWGROUP(drive)->rq; 281 ide_hwif_t *hwif = drive->hwif;
282 struct request *rq = hwif->hwgroup->rq;
284 int stat, err, sense_key; 283 int stat, err, sense_key;
285 284
286 /* check for errors */ 285 /* check for errors */
287 stat = ide_read_status(drive); 286 stat = hwif->tp_ops->read_status(hwif);
288 287
289 if (stat_ret) 288 if (stat_ret)
290 *stat_ret = stat; 289 *stat_ret = stat;
@@ -528,7 +527,7 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
528 ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL, 527 ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL,
529 xferlen, info->dma); 528 xferlen, info->dma);
530 529
531 if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) { 530 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
532 /* waiting for CDB interrupt, not DMA yet. */ 531 /* waiting for CDB interrupt, not DMA yet. */
533 if (info->dma) 532 if (info->dma)
534 drive->waiting_for_dma = 0; 533 drive->waiting_for_dma = 0;
@@ -560,7 +559,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
560 struct cdrom_info *info = drive->driver_data; 559 struct cdrom_info *info = drive->driver_data;
561 ide_startstop_t startstop; 560 ide_startstop_t startstop;
562 561
563 if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) { 562 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
564 /* 563 /*
565 * Here we should have been called after receiving an interrupt 564 * Here we should have been called after receiving an interrupt
566 * from the device. DRQ should how be set. 565 * from the device. DRQ should how be set.
@@ -589,7 +588,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
589 cmd_len = ATAPI_MIN_CDB_BYTES; 588 cmd_len = ATAPI_MIN_CDB_BYTES;
590 589
591 /* send the command to the device */ 590 /* send the command to the device */
592 hwif->output_data(drive, NULL, rq->cmd, cmd_len); 591 hwif->tp_ops->output_data(drive, NULL, rq->cmd, cmd_len);
593 592
594 /* start the DMA if need be */ 593 /* start the DMA if need be */
595 if (info->dma) 594 if (info->dma)
@@ -606,6 +605,8 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
606static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, 605static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,
607 int len, int ireason, int rw) 606 int len, int ireason, int rw)
608{ 607{
608 ide_hwif_t *hwif = drive->hwif;
609
609 /* 610 /*
610 * ireason == 0: the drive wants to receive data from us 611 * ireason == 0: the drive wants to receive data from us
611 * ireason == 2: the drive is expecting to transfer data to us 612 * ireason == 2: the drive is expecting to transfer data to us
@@ -624,7 +625,7 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,
624 * Some drives (ASUS) seem to tell us that status info is 625 * Some drives (ASUS) seem to tell us that status info is
625 * available. Just get it and ignore. 626 * available. Just get it and ignore.
626 */ 627 */
627 (void)ide_read_status(drive); 628 (void)hwif->tp_ops->read_status(hwif);
628 return 0; 629 return 0;
629 } else { 630 } else {
630 /* drive wants a command packet, or invalid ireason... */ 631 /* drive wants a command packet, or invalid ireason... */
@@ -645,20 +646,18 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,
645 */ 646 */
646static int ide_cd_check_transfer_size(ide_drive_t *drive, int len) 647static int ide_cd_check_transfer_size(ide_drive_t *drive, int len)
647{ 648{
648 struct cdrom_info *cd = drive->driver_data;
649
650 if ((len % SECTOR_SIZE) == 0) 649 if ((len % SECTOR_SIZE) == 0)
651 return 0; 650 return 0;
652 651
653 printk(KERN_ERR "%s: %s: Bad transfer size %d\n", 652 printk(KERN_ERR "%s: %s: Bad transfer size %d\n",
654 drive->name, __func__, len); 653 drive->name, __func__, len);
655 654
656 if (cd->cd_flags & IDE_CD_FLAG_LIMIT_NFRAMES) 655 if (drive->atapi_flags & IDE_AFLAG_LIMIT_NFRAMES)
657 printk(KERN_ERR " This drive is not supported by " 656 printk(KERN_ERR " This drive is not supported by "
658 "this version of the driver\n"); 657 "this version of the driver\n");
659 else { 658 else {
660 printk(KERN_ERR " Trying to limit transfer sizes\n"); 659 printk(KERN_ERR " Trying to limit transfer sizes\n");
661 cd->cd_flags |= IDE_CD_FLAG_LIMIT_NFRAMES; 660 drive->atapi_flags |= IDE_AFLAG_LIMIT_NFRAMES;
662 } 661 }
663 662
664 return 1; 663 return 1;
@@ -735,7 +734,7 @@ static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive)
735 if (cdrom_decode_status(drive, 0, &stat)) 734 if (cdrom_decode_status(drive, 0, &stat))
736 return ide_stopped; 735 return ide_stopped;
737 736
738 info->cd_flags |= IDE_CD_FLAG_SEEKING; 737 drive->atapi_flags |= IDE_AFLAG_SEEKING;
739 738
740 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) { 739 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
741 if (--retry == 0) 740 if (--retry == 0)
@@ -892,10 +891,11 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
892 struct request *rq = HWGROUP(drive)->rq; 891 struct request *rq = HWGROUP(drive)->rq;
893 xfer_func_t *xferfunc; 892 xfer_func_t *xferfunc;
894 ide_expiry_t *expiry = NULL; 893 ide_expiry_t *expiry = NULL;
895 int dma_error = 0, dma, stat, ireason, len, thislen, uptodate = 0; 894 int dma_error = 0, dma, stat, thislen, uptodate = 0;
896 int write = (rq_data_dir(rq) == WRITE) ? 1 : 0; 895 int write = (rq_data_dir(rq) == WRITE) ? 1 : 0;
897 unsigned int timeout; 896 unsigned int timeout;
898 u8 lowcyl, highcyl; 897 u16 len;
898 u8 ireason;
899 899
900 /* check for errors */ 900 /* check for errors */
901 dma = info->dma; 901 dma = info->dma;
@@ -923,12 +923,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
923 goto end_request; 923 goto end_request;
924 } 924 }
925 925
926 /* ok we fall to pio :/ */ 926 ide_read_bcount_and_ireason(drive, &len, &ireason);
927 ireason = hwif->INB(hwif->io_ports.nsect_addr) & 0x3;
928 lowcyl = hwif->INB(hwif->io_ports.lbam_addr);
929 highcyl = hwif->INB(hwif->io_ports.lbah_addr);
930
931 len = lowcyl + (256 * highcyl);
932 927
933 thislen = blk_fs_request(rq) ? len : rq->data_len; 928 thislen = blk_fs_request(rq) ? len : rq->data_len;
934 if (thislen > len) 929 if (thislen > len)
@@ -991,10 +986,10 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
991 986
992 if (ireason == 0) { 987 if (ireason == 0) {
993 write = 1; 988 write = 1;
994 xferfunc = hwif->output_data; 989 xferfunc = hwif->tp_ops->output_data;
995 } else { 990 } else {
996 write = 0; 991 write = 0;
997 xferfunc = hwif->input_data; 992 xferfunc = hwif->tp_ops->input_data;
998 } 993 }
999 994
1000 /* transfer data */ 995 /* transfer data */
@@ -1198,9 +1193,10 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
1198 int xferlen; 1193 int xferlen;
1199 1194
1200 if (blk_fs_request(rq)) { 1195 if (blk_fs_request(rq)) {
1201 if (info->cd_flags & IDE_CD_FLAG_SEEKING) { 1196 if (drive->atapi_flags & IDE_AFLAG_SEEKING) {
1197 ide_hwif_t *hwif = drive->hwif;
1202 unsigned long elapsed = jiffies - info->start_seek; 1198 unsigned long elapsed = jiffies - info->start_seek;
1203 int stat = ide_read_status(drive); 1199 int stat = hwif->tp_ops->read_status(hwif);
1204 1200
1205 if ((stat & SEEK_STAT) != SEEK_STAT) { 1201 if ((stat & SEEK_STAT) != SEEK_STAT) {
1206 if (elapsed < IDECD_SEEK_TIMEOUT) { 1202 if (elapsed < IDECD_SEEK_TIMEOUT) {
@@ -1211,7 +1207,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
1211 printk(KERN_ERR "%s: DSC timeout\n", 1207 printk(KERN_ERR "%s: DSC timeout\n",
1212 drive->name); 1208 drive->name);
1213 } 1209 }
1214 info->cd_flags &= ~IDE_CD_FLAG_SEEKING; 1210 drive->atapi_flags &= ~IDE_AFLAG_SEEKING;
1215 } 1211 }
1216 if (rq_data_dir(rq) == READ && 1212 if (rq_data_dir(rq) == READ &&
1217 IDE_LARGE_SEEK(info->last_block, block, 1213 IDE_LARGE_SEEK(info->last_block, block,
@@ -1288,7 +1284,7 @@ int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
1288 */ 1284 */
1289 cmd[7] = cdi->sanyo_slot % 3; 1285 cmd[7] = cdi->sanyo_slot % 3;
1290 1286
1291 return ide_cd_queue_pc(drive, cmd, 0, NULL, 0, sense, 0, REQ_QUIET); 1287 return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, sense, 0, REQ_QUIET);
1292} 1288}
1293 1289
1294static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, 1290static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
@@ -1296,8 +1292,8 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
1296 struct request_sense *sense) 1292 struct request_sense *sense)
1297{ 1293{
1298 struct { 1294 struct {
1299 __u32 lba; 1295 __be32 lba;
1300 __u32 blocklen; 1296 __be32 blocklen;
1301 } capbuf; 1297 } capbuf;
1302 1298
1303 int stat; 1299 int stat;
@@ -1369,7 +1365,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1369 */ 1365 */
1370 (void) cdrom_check_status(drive, sense); 1366 (void) cdrom_check_status(drive, sense);
1371 1367
1372 if (info->cd_flags & IDE_CD_FLAG_TOC_VALID) 1368 if (drive->atapi_flags & IDE_AFLAG_TOC_VALID)
1373 return 0; 1369 return 0;
1374 1370
1375 /* try to get the total cdrom capacity and sector size */ 1371 /* try to get the total cdrom capacity and sector size */
@@ -1391,7 +1387,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1391 if (stat) 1387 if (stat)
1392 return stat; 1388 return stat;
1393 1389
1394 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) { 1390 if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
1395 toc->hdr.first_track = BCD2BIN(toc->hdr.first_track); 1391 toc->hdr.first_track = BCD2BIN(toc->hdr.first_track);
1396 toc->hdr.last_track = BCD2BIN(toc->hdr.last_track); 1392 toc->hdr.last_track = BCD2BIN(toc->hdr.last_track);
1397 } 1393 }
@@ -1432,7 +1428,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1432 if (stat) 1428 if (stat)
1433 return stat; 1429 return stat;
1434 1430
1435 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) { 1431 if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
1436 toc->hdr.first_track = (u8)BIN2BCD(CDROM_LEADOUT); 1432 toc->hdr.first_track = (u8)BIN2BCD(CDROM_LEADOUT);
1437 toc->hdr.last_track = (u8)BIN2BCD(CDROM_LEADOUT); 1433 toc->hdr.last_track = (u8)BIN2BCD(CDROM_LEADOUT);
1438 } else { 1434 } else {
@@ -1446,14 +1442,14 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1446 1442
1447 toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length); 1443 toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length);
1448 1444
1449 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) { 1445 if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
1450 toc->hdr.first_track = BCD2BIN(toc->hdr.first_track); 1446 toc->hdr.first_track = BCD2BIN(toc->hdr.first_track);
1451 toc->hdr.last_track = BCD2BIN(toc->hdr.last_track); 1447 toc->hdr.last_track = BCD2BIN(toc->hdr.last_track);
1452 } 1448 }
1453 1449
1454 for (i = 0; i <= ntracks; i++) { 1450 for (i = 0; i <= ntracks; i++) {
1455 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) { 1451 if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) {
1456 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) 1452 if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD)
1457 toc->ent[i].track = BCD2BIN(toc->ent[i].track); 1453 toc->ent[i].track = BCD2BIN(toc->ent[i].track);
1458 msf_from_bcd(&toc->ent[i].addr.msf); 1454 msf_from_bcd(&toc->ent[i].addr.msf);
1459 } 1455 }
@@ -1476,7 +1472,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1476 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */ 1472 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
1477 } 1473 }
1478 1474
1479 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) { 1475 if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) {
1480 /* re-read multisession information using MSF format */ 1476 /* re-read multisession information using MSF format */
1481 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp, 1477 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
1482 sizeof(ms_tmp), sense); 1478 sizeof(ms_tmp), sense);
@@ -1500,7 +1496,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
1500 } 1496 }
1501 1497
1502 /* Remember that we've read this stuff. */ 1498 /* Remember that we've read this stuff. */
1503 info->cd_flags |= IDE_CD_FLAG_TOC_VALID; 1499 drive->atapi_flags |= IDE_AFLAG_TOC_VALID;
1504 1500
1505 return 0; 1501 return 0;
1506} 1502}
@@ -1512,7 +1508,7 @@ int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf)
1512 struct packet_command cgc; 1508 struct packet_command cgc;
1513 int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE; 1509 int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE;
1514 1510
1515 if ((info->cd_flags & IDE_CD_FLAG_FULL_CAPS_PAGE) == 0) 1511 if ((drive->atapi_flags & IDE_AFLAG_FULL_CAPS_PAGE) == 0)
1516 size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE; 1512 size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE;
1517 1513
1518 init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN); 1514 init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN);
@@ -1530,15 +1526,12 @@ void ide_cdrom_update_speed(ide_drive_t *drive, u8 *buf)
1530 struct cdrom_info *cd = drive->driver_data; 1526 struct cdrom_info *cd = drive->driver_data;
1531 u16 curspeed, maxspeed; 1527 u16 curspeed, maxspeed;
1532 1528
1533 curspeed = *(u16 *)&buf[8 + 14]; 1529 if (drive->atapi_flags & IDE_AFLAG_LE_SPEED_FIELDS) {
1534 maxspeed = *(u16 *)&buf[8 + 8]; 1530 curspeed = le16_to_cpup((__le16 *)&buf[8 + 14]);
1535 1531 maxspeed = le16_to_cpup((__le16 *)&buf[8 + 8]);
1536 if (cd->cd_flags & IDE_CD_FLAG_LE_SPEED_FIELDS) {
1537 curspeed = le16_to_cpu(curspeed);
1538 maxspeed = le16_to_cpu(maxspeed);
1539 } else { 1532 } else {
1540 curspeed = be16_to_cpu(curspeed); 1533 curspeed = be16_to_cpup((__be16 *)&buf[8 + 14]);
1541 maxspeed = be16_to_cpu(maxspeed); 1534 maxspeed = be16_to_cpup((__be16 *)&buf[8 + 8]);
1542 } 1535 }
1543 1536
1544 cd->current_speed = (curspeed + (176/2)) / 176; 1537 cd->current_speed = (curspeed + (176/2)) / 176;
@@ -1579,7 +1572,7 @@ static int ide_cdrom_register(ide_drive_t *drive, int nslots)
1579 devinfo->handle = drive; 1572 devinfo->handle = drive;
1580 strcpy(devinfo->name, drive->name); 1573 strcpy(devinfo->name, drive->name);
1581 1574
1582 if (info->cd_flags & IDE_CD_FLAG_NO_SPEED_SELECT) 1575 if (drive->atapi_flags & IDE_AFLAG_NO_SPEED_SELECT)
1583 devinfo->mask |= CDC_SELECT_SPEED; 1576 devinfo->mask |= CDC_SELECT_SPEED;
1584 1577
1585 devinfo->disk = info->disk; 1578 devinfo->disk = info->disk;
@@ -1605,8 +1598,8 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1605 return nslots; 1598 return nslots;
1606 } 1599 }
1607 1600
1608 if (cd->cd_flags & IDE_CD_FLAG_PRE_ATAPI12) { 1601 if (drive->atapi_flags & IDE_AFLAG_PRE_ATAPI12) {
1609 cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT; 1602 drive->atapi_flags &= ~IDE_AFLAG_NO_EJECT;
1610 cdi->mask &= ~CDC_PLAY_AUDIO; 1603 cdi->mask &= ~CDC_PLAY_AUDIO;
1611 return nslots; 1604 return nslots;
1612 } 1605 }
@@ -1624,9 +1617,9 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1624 return 0; 1617 return 0;
1625 1618
1626 if ((buf[8 + 6] & 0x01) == 0) 1619 if ((buf[8 + 6] & 0x01) == 0)
1627 cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK; 1620 drive->atapi_flags |= IDE_AFLAG_NO_DOORLOCK;
1628 if (buf[8 + 6] & 0x08) 1621 if (buf[8 + 6] & 0x08)
1629 cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT; 1622 drive->atapi_flags &= ~IDE_AFLAG_NO_EJECT;
1630 if (buf[8 + 3] & 0x01) 1623 if (buf[8 + 3] & 0x01)
1631 cdi->mask &= ~CDC_CD_R; 1624 cdi->mask &= ~CDC_CD_R;
1632 if (buf[8 + 3] & 0x02) 1625 if (buf[8 + 3] & 0x02)
@@ -1637,7 +1630,7 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1637 cdi->mask &= ~(CDC_DVD_RAM | CDC_RAM); 1630 cdi->mask &= ~(CDC_DVD_RAM | CDC_RAM);
1638 if (buf[8 + 3] & 0x10) 1631 if (buf[8 + 3] & 0x10)
1639 cdi->mask &= ~CDC_DVD_R; 1632 cdi->mask &= ~CDC_DVD_R;
1640 if ((buf[8 + 4] & 0x01) || (cd->cd_flags & IDE_CD_FLAG_PLAY_AUDIO_OK)) 1633 if ((buf[8 + 4] & 0x01) || (drive->atapi_flags & IDE_AFLAG_PLAY_AUDIO_OK))
1641 cdi->mask &= ~CDC_PLAY_AUDIO; 1634 cdi->mask &= ~CDC_PLAY_AUDIO;
1642 1635
1643 mechtype = buf[8 + 6] >> 5; 1636 mechtype = buf[8 + 6] >> 5;
@@ -1679,7 +1672,7 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
1679 else 1672 else
1680 printk(KERN_CONT " drive"); 1673 printk(KERN_CONT " drive");
1681 1674
1682 printk(KERN_CONT ", %dkB Cache\n", be16_to_cpu(*(u16 *)&buf[8 + 12])); 1675 printk(KERN_CONT ", %dkB Cache\n", be16_to_cpup((__be16 *)&buf[8 + 12]));
1683 1676
1684 return nslots; 1677 return nslots;
1685} 1678}
@@ -1802,43 +1795,43 @@ static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
1802 1795
1803static const struct cd_list_entry ide_cd_quirks_list[] = { 1796static const struct cd_list_entry ide_cd_quirks_list[] = {
1804 /* Limit transfer size per interrupt. */ 1797 /* Limit transfer size per interrupt. */
1805 { "SAMSUNG CD-ROM SCR-2430", NULL, IDE_CD_FLAG_LIMIT_NFRAMES }, 1798 { "SAMSUNG CD-ROM SCR-2430", NULL, IDE_AFLAG_LIMIT_NFRAMES },
1806 { "SAMSUNG CD-ROM SCR-2432", NULL, IDE_CD_FLAG_LIMIT_NFRAMES }, 1799 { "SAMSUNG CD-ROM SCR-2432", NULL, IDE_AFLAG_LIMIT_NFRAMES },
1807 /* SCR-3231 doesn't support the SET_CD_SPEED command. */ 1800 /* SCR-3231 doesn't support the SET_CD_SPEED command. */
1808 { "SAMSUNG CD-ROM SCR-3231", NULL, IDE_CD_FLAG_NO_SPEED_SELECT }, 1801 { "SAMSUNG CD-ROM SCR-3231", NULL, IDE_AFLAG_NO_SPEED_SELECT },
1809 /* Old NEC260 (not R) was released before ATAPI 1.2 spec. */ 1802 /* Old NEC260 (not R) was released before ATAPI 1.2 spec. */
1810 { "NEC CD-ROM DRIVE:260", "1.01", IDE_CD_FLAG_TOCADDR_AS_BCD | 1803 { "NEC CD-ROM DRIVE:260", "1.01", IDE_AFLAG_TOCADDR_AS_BCD |
1811 IDE_CD_FLAG_PRE_ATAPI12, }, 1804 IDE_AFLAG_PRE_ATAPI12, },
1812 /* Vertos 300, some versions of this drive like to talk BCD. */ 1805 /* Vertos 300, some versions of this drive like to talk BCD. */
1813 { "V003S0DS", NULL, IDE_CD_FLAG_VERTOS_300_SSD, }, 1806 { "V003S0DS", NULL, IDE_AFLAG_VERTOS_300_SSD, },
1814 /* Vertos 600 ESD. */ 1807 /* Vertos 600 ESD. */
1815 { "V006E0DS", NULL, IDE_CD_FLAG_VERTOS_600_ESD, }, 1808 { "V006E0DS", NULL, IDE_AFLAG_VERTOS_600_ESD, },
1816 /* 1809 /*
1817 * Sanyo 3 CD changer uses a non-standard command for CD changing 1810 * Sanyo 3 CD changer uses a non-standard command for CD changing
1818 * (by default standard ATAPI support for CD changers is used). 1811 * (by default standard ATAPI support for CD changers is used).
1819 */ 1812 */
1820 { "CD-ROM CDR-C3 G", NULL, IDE_CD_FLAG_SANYO_3CD }, 1813 { "CD-ROM CDR-C3 G", NULL, IDE_AFLAG_SANYO_3CD },
1821 { "CD-ROM CDR-C3G", NULL, IDE_CD_FLAG_SANYO_3CD }, 1814 { "CD-ROM CDR-C3G", NULL, IDE_AFLAG_SANYO_3CD },
1822 { "CD-ROM CDR_C36", NULL, IDE_CD_FLAG_SANYO_3CD }, 1815 { "CD-ROM CDR_C36", NULL, IDE_AFLAG_SANYO_3CD },
1823 /* Stingray 8X CD-ROM. */ 1816 /* Stingray 8X CD-ROM. */
1824 { "STINGRAY 8422 IDE 8X CD-ROM 7-27-95", NULL, IDE_CD_FLAG_PRE_ATAPI12}, 1817 { "STINGRAY 8422 IDE 8X CD-ROM 7-27-95", NULL, IDE_AFLAG_PRE_ATAPI12 },
1825 /* 1818 /*
1826 * ACER 50X CD-ROM and WPI 32X CD-ROM require the full spec length 1819 * ACER 50X CD-ROM and WPI 32X CD-ROM require the full spec length
1827 * mode sense page capabilities size, but older drives break. 1820 * mode sense page capabilities size, but older drives break.
1828 */ 1821 */
1829 { "ATAPI CD ROM DRIVE 50X MAX", NULL, IDE_CD_FLAG_FULL_CAPS_PAGE }, 1822 { "ATAPI CD ROM DRIVE 50X MAX", NULL, IDE_AFLAG_FULL_CAPS_PAGE },
1830 { "WPI CDS-32X", NULL, IDE_CD_FLAG_FULL_CAPS_PAGE }, 1823 { "WPI CDS-32X", NULL, IDE_AFLAG_FULL_CAPS_PAGE },
1831 /* ACER/AOpen 24X CD-ROM has the speed fields byte-swapped. */ 1824 /* ACER/AOpen 24X CD-ROM has the speed fields byte-swapped. */
1832 { "", "241N", IDE_CD_FLAG_LE_SPEED_FIELDS }, 1825 { "", "241N", IDE_AFLAG_LE_SPEED_FIELDS },
1833 /* 1826 /*
1834 * Some drives used by Apple don't advertise audio play 1827 * Some drives used by Apple don't advertise audio play
1835 * but they do support reading TOC & audio datas. 1828 * but they do support reading TOC & audio datas.
1836 */ 1829 */
1837 { "MATSHITADVD-ROM SR-8187", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, 1830 { "MATSHITADVD-ROM SR-8187", NULL, IDE_AFLAG_PLAY_AUDIO_OK },
1838 { "MATSHITADVD-ROM SR-8186", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, 1831 { "MATSHITADVD-ROM SR-8186", NULL, IDE_AFLAG_PLAY_AUDIO_OK },
1839 { "MATSHITADVD-ROM SR-8176", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, 1832 { "MATSHITADVD-ROM SR-8176", NULL, IDE_AFLAG_PLAY_AUDIO_OK },
1840 { "MATSHITADVD-ROM SR-8174", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, 1833 { "MATSHITADVD-ROM SR-8174", NULL, IDE_AFLAG_PLAY_AUDIO_OK },
1841 { "Optiarc DVD RW AD-5200A", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, 1834 { "Optiarc DVD RW AD-5200A", NULL, IDE_AFLAG_PLAY_AUDIO_OK },
1842 { NULL, NULL, 0 } 1835 { NULL, NULL, 0 }
1843}; 1836};
1844 1837
@@ -1873,20 +1866,20 @@ static int ide_cdrom_setup(ide_drive_t *drive)
1873 1866
1874 drive->special.all = 0; 1867 drive->special.all = 0;
1875 1868
1876 cd->cd_flags = IDE_CD_FLAG_MEDIA_CHANGED | IDE_CD_FLAG_NO_EJECT | 1869 drive->atapi_flags = IDE_AFLAG_MEDIA_CHANGED | IDE_AFLAG_NO_EJECT |
1877 ide_cd_flags(id); 1870 ide_cd_flags(id);
1878 1871
1879 if ((id->config & 0x0060) == 0x20) 1872 if ((id->config & 0x0060) == 0x20)
1880 cd->cd_flags |= IDE_CD_FLAG_DRQ_INTERRUPT; 1873 drive->atapi_flags |= IDE_AFLAG_DRQ_INTERRUPT;
1881 1874
1882 if ((cd->cd_flags & IDE_CD_FLAG_VERTOS_300_SSD) && 1875 if ((drive->atapi_flags & IDE_AFLAG_VERTOS_300_SSD) &&
1883 id->fw_rev[4] == '1' && id->fw_rev[6] <= '2') 1876 id->fw_rev[4] == '1' && id->fw_rev[6] <= '2')
1884 cd->cd_flags |= (IDE_CD_FLAG_TOCTRACKS_AS_BCD | 1877 drive->atapi_flags |= (IDE_AFLAG_TOCTRACKS_AS_BCD |
1885 IDE_CD_FLAG_TOCADDR_AS_BCD); 1878 IDE_AFLAG_TOCADDR_AS_BCD);
1886 else if ((cd->cd_flags & IDE_CD_FLAG_VERTOS_600_ESD) && 1879 else if ((drive->atapi_flags & IDE_AFLAG_VERTOS_600_ESD) &&
1887 id->fw_rev[4] == '1' && id->fw_rev[6] <= '2') 1880 id->fw_rev[4] == '1' && id->fw_rev[6] <= '2')
1888 cd->cd_flags |= IDE_CD_FLAG_TOCTRACKS_AS_BCD; 1881 drive->atapi_flags |= IDE_AFLAG_TOCTRACKS_AS_BCD;
1889 else if (cd->cd_flags & IDE_CD_FLAG_SANYO_3CD) 1882 else if (drive->atapi_flags & IDE_AFLAG_SANYO_3CD)
1890 /* 3 => use CD in slot 0 */ 1883 /* 3 => use CD in slot 0 */
1891 cdi->sanyo_slot = 3; 1884 cdi->sanyo_slot = 3;
1892 1885
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h
index fe0ea36e4124..61a4599b77db 100644
--- a/drivers/ide/ide-cd.h
+++ b/drivers/ide/ide-cd.h
@@ -27,42 +27,6 @@
27#define ATAPI_CAPABILITIES_PAGE_SIZE (8 + 20) 27#define ATAPI_CAPABILITIES_PAGE_SIZE (8 + 20)
28#define ATAPI_CAPABILITIES_PAGE_PAD_SIZE 4 28#define ATAPI_CAPABILITIES_PAGE_PAD_SIZE 4
29 29
30enum {
31 /* Device sends an interrupt when ready for a packet command. */
32 IDE_CD_FLAG_DRQ_INTERRUPT = (1 << 0),
33 /* Drive cannot lock the door. */
34 IDE_CD_FLAG_NO_DOORLOCK = (1 << 1),
35 /* Drive cannot eject the disc. */
36 IDE_CD_FLAG_NO_EJECT = (1 << 2),
37 /* Drive is a pre ATAPI 1.2 drive. */
38 IDE_CD_FLAG_PRE_ATAPI12 = (1 << 3),
39 /* TOC addresses are in BCD. */
40 IDE_CD_FLAG_TOCADDR_AS_BCD = (1 << 4),
41 /* TOC track numbers are in BCD. */
42 IDE_CD_FLAG_TOCTRACKS_AS_BCD = (1 << 5),
43 /*
44 * Drive does not provide data in multiples of SECTOR_SIZE
45 * when more than one interrupt is needed.
46 */
47 IDE_CD_FLAG_LIMIT_NFRAMES = (1 << 6),
48 /* Seeking in progress. */
49 IDE_CD_FLAG_SEEKING = (1 << 7),
50 /* Driver has noticed a media change. */
51 IDE_CD_FLAG_MEDIA_CHANGED = (1 << 8),
52 /* Saved TOC information is current. */
53 IDE_CD_FLAG_TOC_VALID = (1 << 9),
54 /* We think that the drive door is locked. */
55 IDE_CD_FLAG_DOOR_LOCKED = (1 << 10),
56 /* SET_CD_SPEED command is unsupported. */
57 IDE_CD_FLAG_NO_SPEED_SELECT = (1 << 11),
58 IDE_CD_FLAG_VERTOS_300_SSD = (1 << 12),
59 IDE_CD_FLAG_VERTOS_600_ESD = (1 << 13),
60 IDE_CD_FLAG_SANYO_3CD = (1 << 14),
61 IDE_CD_FLAG_FULL_CAPS_PAGE = (1 << 15),
62 IDE_CD_FLAG_PLAY_AUDIO_OK = (1 << 16),
63 IDE_CD_FLAG_LE_SPEED_FIELDS = (1 << 17),
64};
65
66/* Structure of a MSF cdrom address. */ 30/* Structure of a MSF cdrom address. */
67struct atapi_msf { 31struct atapi_msf {
68 byte reserved; 32 byte reserved;
@@ -128,8 +92,6 @@ struct cdrom_info {
128 unsigned long last_block; 92 unsigned long last_block;
129 unsigned long start_seek; 93 unsigned long start_seek;
130 94
131 unsigned int cd_flags;
132
133 u8 max_speed; /* Max speed of the drive. */ 95 u8 max_speed; /* Max speed of the drive. */
134 u8 current_speed; /* Current speed of the drive. */ 96 u8 current_speed; /* Current speed of the drive. */
135 97
diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c
index 24d002addf73..74231b41f611 100644
--- a/drivers/ide/ide-cd_ioctl.c
+++ b/drivers/ide/ide-cd_ioctl.c
@@ -27,10 +27,9 @@ int ide_cdrom_open_real(struct cdrom_device_info *cdi, int purpose)
27void ide_cdrom_release_real(struct cdrom_device_info *cdi) 27void ide_cdrom_release_real(struct cdrom_device_info *cdi)
28{ 28{
29 ide_drive_t *drive = cdi->handle; 29 ide_drive_t *drive = cdi->handle;
30 struct cdrom_info *cd = drive->driver_data;
31 30
32 if (!cdi->use_count) 31 if (!cdi->use_count)
33 cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID; 32 drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID;
34} 33}
35 34
36/* 35/*
@@ -83,13 +82,12 @@ int ide_cdrom_check_media_change_real(struct cdrom_device_info *cdi,
83 int slot_nr) 82 int slot_nr)
84{ 83{
85 ide_drive_t *drive = cdi->handle; 84 ide_drive_t *drive = cdi->handle;
86 struct cdrom_info *cd = drive->driver_data;
87 int retval; 85 int retval;
88 86
89 if (slot_nr == CDSL_CURRENT) { 87 if (slot_nr == CDSL_CURRENT) {
90 (void) cdrom_check_status(drive, NULL); 88 (void) cdrom_check_status(drive, NULL);
91 retval = (cd->cd_flags & IDE_CD_FLAG_MEDIA_CHANGED) ? 1 : 0; 89 retval = (drive->atapi_flags & IDE_AFLAG_MEDIA_CHANGED) ? 1 : 0;
92 cd->cd_flags &= ~IDE_CD_FLAG_MEDIA_CHANGED; 90 drive->atapi_flags &= ~IDE_AFLAG_MEDIA_CHANGED;
93 return retval; 91 return retval;
94 } else { 92 } else {
95 return -EINVAL; 93 return -EINVAL;
@@ -107,11 +105,11 @@ int cdrom_eject(ide_drive_t *drive, int ejectflag,
107 char loej = 0x02; 105 char loej = 0x02;
108 unsigned char cmd[BLK_MAX_CDB]; 106 unsigned char cmd[BLK_MAX_CDB];
109 107
110 if ((cd->cd_flags & IDE_CD_FLAG_NO_EJECT) && !ejectflag) 108 if ((drive->atapi_flags & IDE_AFLAG_NO_EJECT) && !ejectflag)
111 return -EDRIVE_CANT_DO_THIS; 109 return -EDRIVE_CANT_DO_THIS;
112 110
113 /* reload fails on some drives, if the tray is locked */ 111 /* reload fails on some drives, if the tray is locked */
114 if ((cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED) && ejectflag) 112 if ((drive->atapi_flags & IDE_AFLAG_DOOR_LOCKED) && ejectflag)
115 return 0; 113 return 0;
116 114
117 /* only tell drive to close tray if open, if it can do that */ 115 /* only tell drive to close tray if open, if it can do that */
@@ -123,7 +121,7 @@ int cdrom_eject(ide_drive_t *drive, int ejectflag,
123 cmd[0] = GPCMD_START_STOP_UNIT; 121 cmd[0] = GPCMD_START_STOP_UNIT;
124 cmd[4] = loej | (ejectflag != 0); 122 cmd[4] = loej | (ejectflag != 0);
125 123
126 return ide_cd_queue_pc(drive, cmd, 0, NULL, 0, sense, 0, 0); 124 return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, sense, 0, 0);
127} 125}
128 126
129/* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */ 127/* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
@@ -131,7 +129,6 @@ static
131int ide_cd_lockdoor(ide_drive_t *drive, int lockflag, 129int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,
132 struct request_sense *sense) 130 struct request_sense *sense)
133{ 131{
134 struct cdrom_info *cd = drive->driver_data;
135 struct request_sense my_sense; 132 struct request_sense my_sense;
136 int stat; 133 int stat;
137 134
@@ -139,7 +136,7 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,
139 sense = &my_sense; 136 sense = &my_sense;
140 137
141 /* If the drive cannot lock the door, just pretend. */ 138 /* If the drive cannot lock the door, just pretend. */
142 if (cd->cd_flags & IDE_CD_FLAG_NO_DOORLOCK) { 139 if (drive->atapi_flags & IDE_AFLAG_NO_DOORLOCK) {
143 stat = 0; 140 stat = 0;
144 } else { 141 } else {
145 unsigned char cmd[BLK_MAX_CDB]; 142 unsigned char cmd[BLK_MAX_CDB];
@@ -149,7 +146,7 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,
149 cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL; 146 cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
150 cmd[4] = lockflag ? 1 : 0; 147 cmd[4] = lockflag ? 1 : 0;
151 148
152 stat = ide_cd_queue_pc(drive, cmd, 0, NULL, 0, 149 stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL,
153 sense, 0, 0); 150 sense, 0, 0);
154 } 151 }
155 152
@@ -160,7 +157,7 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,
160 (sense->asc == 0x24 || sense->asc == 0x20)) { 157 (sense->asc == 0x24 || sense->asc == 0x20)) {
161 printk(KERN_ERR "%s: door locking not supported\n", 158 printk(KERN_ERR "%s: door locking not supported\n",
162 drive->name); 159 drive->name);
163 cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK; 160 drive->atapi_flags |= IDE_AFLAG_NO_DOORLOCK;
164 stat = 0; 161 stat = 0;
165 } 162 }
166 163
@@ -170,9 +167,9 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,
170 167
171 if (stat == 0) { 168 if (stat == 0) {
172 if (lockflag) 169 if (lockflag)
173 cd->cd_flags |= IDE_CD_FLAG_DOOR_LOCKED; 170 drive->atapi_flags |= IDE_AFLAG_DOOR_LOCKED;
174 else 171 else
175 cd->cd_flags &= ~IDE_CD_FLAG_DOOR_LOCKED; 172 drive->atapi_flags &= ~IDE_AFLAG_DOOR_LOCKED;
176 } 173 }
177 174
178 return stat; 175 return stat;
@@ -231,7 +228,7 @@ int ide_cdrom_select_speed(struct cdrom_device_info *cdi, int speed)
231 cmd[5] = speed & 0xff; 228 cmd[5] = speed & 0xff;
232 } 229 }
233 230
234 stat = ide_cd_queue_pc(drive, cmd, 0, NULL, 0, &sense, 0, 0); 231 stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, &sense, 0, 0);
235 232
236 if (!ide_cdrom_get_capabilities(drive, buf)) { 233 if (!ide_cdrom_get_capabilities(drive, buf)) {
237 ide_cdrom_update_speed(drive, buf); 234 ide_cdrom_update_speed(drive, buf);
@@ -250,7 +247,7 @@ int ide_cdrom_get_last_session(struct cdrom_device_info *cdi,
250 struct request_sense sense; 247 struct request_sense sense;
251 int ret; 248 int ret;
252 249
253 if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0 || !info->toc) { 250 if ((drive->atapi_flags & IDE_AFLAG_TOC_VALID) == 0 || !info->toc) {
254 ret = ide_cd_read_toc(drive, &sense); 251 ret = ide_cd_read_toc(drive, &sense);
255 if (ret) 252 if (ret)
256 return ret; 253 return ret;
@@ -308,7 +305,7 @@ int ide_cdrom_reset(struct cdrom_device_info *cdi)
308 * A reset will unlock the door. If it was previously locked, 305 * A reset will unlock the door. If it was previously locked,
309 * lock it again. 306 * lock it again.
310 */ 307 */
311 if (cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED) 308 if (drive->atapi_flags & IDE_AFLAG_DOOR_LOCKED)
312 (void)ide_cd_lockdoor(drive, 1, &sense); 309 (void)ide_cd_lockdoor(drive, 1, &sense);
313 310
314 return ret; 311 return ret;
@@ -324,7 +321,7 @@ static int ide_cd_get_toc_entry(ide_drive_t *drive, int track,
324 /* 321 /*
325 * don't serve cached data, if the toc isn't valid 322 * don't serve cached data, if the toc isn't valid
326 */ 323 */
327 if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0) 324 if ((drive->atapi_flags & IDE_AFLAG_TOC_VALID) == 0)
328 return -EINVAL; 325 return -EINVAL;
329 326
330 /* Check validity of requested track number. */ 327 /* Check validity of requested track number. */
@@ -374,7 +371,7 @@ static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
374 lba_to_msf(lba_start, &cmd[3], &cmd[4], &cmd[5]); 371 lba_to_msf(lba_start, &cmd[3], &cmd[4], &cmd[5]);
375 lba_to_msf(lba_end - 1, &cmd[6], &cmd[7], &cmd[8]); 372 lba_to_msf(lba_end - 1, &cmd[6], &cmd[7], &cmd[8]);
376 373
377 return ide_cd_queue_pc(drive, cmd, 0, NULL, 0, &sense, 0, 0); 374 return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, &sense, 0, 0);
378} 375}
379 376
380static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg) 377static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 3a2e80237c10..df5fe5756871 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -158,7 +158,7 @@ static void ide_tf_set_cmd(ide_drive_t *drive, ide_task_t *task, u8 dma)
158 write = (task->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0; 158 write = (task->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0;
159 159
160 if (dma) 160 if (dma)
161 index = drive->vdma ? 4 : 8; 161 index = 8;
162 else 162 else
163 index = drive->mult_count ? 0 : 4; 163 index = drive->mult_count ? 0 : 4;
164 164
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
index 7ee44f86bc54..be99d463dcc7 100644
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -100,10 +100,11 @@ static const struct drive_list_entry drive_blacklist [] = {
100 100
101ide_startstop_t ide_dma_intr (ide_drive_t *drive) 101ide_startstop_t ide_dma_intr (ide_drive_t *drive)
102{ 102{
103 ide_hwif_t *hwif = drive->hwif;
103 u8 stat = 0, dma_stat = 0; 104 u8 stat = 0, dma_stat = 0;
104 105
105 dma_stat = drive->hwif->dma_ops->dma_end(drive); 106 dma_stat = hwif->dma_ops->dma_end(drive);
106 stat = ide_read_status(drive); 107 stat = hwif->tp_ops->read_status(hwif);
107 108
108 if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { 109 if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
109 if (!dma_stat) { 110 if (!dma_stat) {
@@ -334,7 +335,7 @@ static int config_drive_for_dma (ide_drive_t *drive)
334static int dma_timer_expiry (ide_drive_t *drive) 335static int dma_timer_expiry (ide_drive_t *drive)
335{ 336{
336 ide_hwif_t *hwif = HWIF(drive); 337 ide_hwif_t *hwif = HWIF(drive);
337 u8 dma_stat = hwif->INB(hwif->dma_status); 338 u8 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
338 339
339 printk(KERN_WARNING "%s: dma_timer_expiry: dma status == 0x%02x\n", 340 printk(KERN_WARNING "%s: dma_timer_expiry: dma status == 0x%02x\n",
340 drive->name, dma_stat); 341 drive->name, dma_stat);
@@ -369,14 +370,18 @@ void ide_dma_host_set(ide_drive_t *drive, int on)
369{ 370{
370 ide_hwif_t *hwif = HWIF(drive); 371 ide_hwif_t *hwif = HWIF(drive);
371 u8 unit = (drive->select.b.unit & 0x01); 372 u8 unit = (drive->select.b.unit & 0x01);
372 u8 dma_stat = hwif->INB(hwif->dma_status); 373 u8 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
373 374
374 if (on) 375 if (on)
375 dma_stat |= (1 << (5 + unit)); 376 dma_stat |= (1 << (5 + unit));
376 else 377 else
377 dma_stat &= ~(1 << (5 + unit)); 378 dma_stat &= ~(1 << (5 + unit));
378 379
379 hwif->OUTB(dma_stat, hwif->dma_status); 380 if (hwif->host_flags & IDE_HFLAG_MMIO)
381 writeb(dma_stat,
382 (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
383 else
384 outb(dma_stat, hwif->dma_base + ATA_DMA_STATUS);
380} 385}
381 386
382EXPORT_SYMBOL_GPL(ide_dma_host_set); 387EXPORT_SYMBOL_GPL(ide_dma_host_set);
@@ -449,6 +454,7 @@ int ide_dma_setup(ide_drive_t *drive)
449 ide_hwif_t *hwif = drive->hwif; 454 ide_hwif_t *hwif = drive->hwif;
450 struct request *rq = HWGROUP(drive)->rq; 455 struct request *rq = HWGROUP(drive)->rq;
451 unsigned int reading; 456 unsigned int reading;
457 u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
452 u8 dma_stat; 458 u8 dma_stat;
453 459
454 if (rq_data_dir(rq)) 460 if (rq_data_dir(rq))
@@ -470,13 +476,21 @@ int ide_dma_setup(ide_drive_t *drive)
470 outl(hwif->dmatable_dma, hwif->dma_base + ATA_DMA_TABLE_OFS); 476 outl(hwif->dmatable_dma, hwif->dma_base + ATA_DMA_TABLE_OFS);
471 477
472 /* specify r/w */ 478 /* specify r/w */
473 hwif->OUTB(reading, hwif->dma_command); 479 if (mmio)
480 writeb(reading, (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
481 else
482 outb(reading, hwif->dma_base + ATA_DMA_CMD);
474 483
475 /* read dma_status for INTR & ERROR flags */ 484 /* read DMA status for INTR & ERROR flags */
476 dma_stat = hwif->INB(hwif->dma_status); 485 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
477 486
478 /* clear INTR & ERROR flags */ 487 /* clear INTR & ERROR flags */
479 hwif->OUTB(dma_stat|6, hwif->dma_status); 488 if (mmio)
489 writeb(dma_stat | 6,
490 (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
491 else
492 outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
493
480 drive->waiting_for_dma = 1; 494 drive->waiting_for_dma = 1;
481 return 0; 495 return 0;
482} 496}
@@ -492,16 +506,24 @@ EXPORT_SYMBOL_GPL(ide_dma_exec_cmd);
492 506
493void ide_dma_start(ide_drive_t *drive) 507void ide_dma_start(ide_drive_t *drive)
494{ 508{
495 ide_hwif_t *hwif = HWIF(drive); 509 ide_hwif_t *hwif = drive->hwif;
496 u8 dma_cmd = hwif->INB(hwif->dma_command); 510 u8 dma_cmd;
497 511
498 /* Note that this is done *after* the cmd has 512 /* Note that this is done *after* the cmd has
499 * been issued to the drive, as per the BM-IDE spec. 513 * been issued to the drive, as per the BM-IDE spec.
500 * The Promise Ultra33 doesn't work correctly when 514 * The Promise Ultra33 doesn't work correctly when
501 * we do this part before issuing the drive cmd. 515 * we do this part before issuing the drive cmd.
502 */ 516 */
503 /* start DMA */ 517 if (hwif->host_flags & IDE_HFLAG_MMIO) {
504 hwif->OUTB(dma_cmd|1, hwif->dma_command); 518 dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
519 /* start DMA */
520 writeb(dma_cmd | 1,
521 (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
522 } else {
523 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
524 outb(dma_cmd | 1, hwif->dma_base + ATA_DMA_CMD);
525 }
526
505 hwif->dma = 1; 527 hwif->dma = 1;
506 wmb(); 528 wmb();
507} 529}
@@ -511,18 +533,33 @@ EXPORT_SYMBOL_GPL(ide_dma_start);
511/* returns 1 on error, 0 otherwise */ 533/* returns 1 on error, 0 otherwise */
512int __ide_dma_end (ide_drive_t *drive) 534int __ide_dma_end (ide_drive_t *drive)
513{ 535{
514 ide_hwif_t *hwif = HWIF(drive); 536 ide_hwif_t *hwif = drive->hwif;
537 u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
515 u8 dma_stat = 0, dma_cmd = 0; 538 u8 dma_stat = 0, dma_cmd = 0;
516 539
517 drive->waiting_for_dma = 0; 540 drive->waiting_for_dma = 0;
518 /* get dma_command mode */ 541
519 dma_cmd = hwif->INB(hwif->dma_command); 542 if (mmio) {
520 /* stop DMA */ 543 /* get DMA command mode */
521 hwif->OUTB(dma_cmd&~1, hwif->dma_command); 544 dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
545 /* stop DMA */
546 writeb(dma_cmd & ~1,
547 (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
548 } else {
549 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
550 outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
551 }
552
522 /* get DMA status */ 553 /* get DMA status */
523 dma_stat = hwif->INB(hwif->dma_status); 554 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
524 /* clear the INTR & ERROR bits */ 555
525 hwif->OUTB(dma_stat|6, hwif->dma_status); 556 if (mmio)
557 /* clear the INTR & ERROR bits */
558 writeb(dma_stat | 6,
559 (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
560 else
561 outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
562
526 /* purge DMA mappings */ 563 /* purge DMA mappings */
527 ide_destroy_dmatable(drive); 564 ide_destroy_dmatable(drive);
528 /* verify good DMA status */ 565 /* verify good DMA status */
@@ -537,7 +574,7 @@ EXPORT_SYMBOL(__ide_dma_end);
537int ide_dma_test_irq(ide_drive_t *drive) 574int ide_dma_test_irq(ide_drive_t *drive)
538{ 575{
539 ide_hwif_t *hwif = HWIF(drive); 576 ide_hwif_t *hwif = HWIF(drive);
540 u8 dma_stat = hwif->INB(hwif->dma_status); 577 u8 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
541 578
542 /* return 1 if INTR asserted */ 579 /* return 1 if INTR asserted */
543 if ((dma_stat & 4) == 4) 580 if ((dma_stat & 4) == 4)
@@ -719,9 +756,8 @@ static int ide_tune_dma(ide_drive_t *drive)
719static int ide_dma_check(ide_drive_t *drive) 756static int ide_dma_check(ide_drive_t *drive)
720{ 757{
721 ide_hwif_t *hwif = drive->hwif; 758 ide_hwif_t *hwif = drive->hwif;
722 int vdma = (hwif->host_flags & IDE_HFLAG_VDMA)? 1 : 0;
723 759
724 if (!vdma && ide_tune_dma(drive)) 760 if (ide_tune_dma(drive))
725 return 0; 761 return 0;
726 762
727 /* TODO: always do PIO fallback */ 763 /* TODO: always do PIO fallback */
@@ -730,7 +766,7 @@ static int ide_dma_check(ide_drive_t *drive)
730 766
731 ide_set_max_pio(drive); 767 ide_set_max_pio(drive);
732 768
733 return vdma ? 0 : -1; 769 return -1;
734} 770}
735 771
736int ide_id_dma_bug(ide_drive_t *drive) 772int ide_id_dma_bug(ide_drive_t *drive)
@@ -842,7 +878,7 @@ int ide_allocate_dma_engine(ide_hwif_t *hwif)
842} 878}
843EXPORT_SYMBOL_GPL(ide_allocate_dma_engine); 879EXPORT_SYMBOL_GPL(ide_allocate_dma_engine);
844 880
845static const struct ide_dma_ops sff_dma_ops = { 881const struct ide_dma_ops sff_dma_ops = {
846 .dma_host_set = ide_dma_host_set, 882 .dma_host_set = ide_dma_host_set,
847 .dma_setup = ide_dma_setup, 883 .dma_setup = ide_dma_setup,
848 .dma_exec_cmd = ide_dma_exec_cmd, 884 .dma_exec_cmd = ide_dma_exec_cmd,
@@ -852,18 +888,5 @@ static const struct ide_dma_ops sff_dma_ops = {
852 .dma_timeout = ide_dma_timeout, 888 .dma_timeout = ide_dma_timeout,
853 .dma_lost_irq = ide_dma_lost_irq, 889 .dma_lost_irq = ide_dma_lost_irq,
854}; 890};
855 891EXPORT_SYMBOL_GPL(sff_dma_ops);
856void ide_setup_dma(ide_hwif_t *hwif, unsigned long base)
857{
858 hwif->dma_base = base;
859
860 if (!hwif->dma_command)
861 hwif->dma_command = hwif->dma_base + 0;
862 if (!hwif->dma_status)
863 hwif->dma_status = hwif->dma_base + 2;
864
865 hwif->dma_ops = &sff_dma_ops;
866}
867
868EXPORT_SYMBOL_GPL(ide_setup_dma);
869#endif /* CONFIG_BLK_DEV_IDEDMA_SFF */ 892#endif /* CONFIG_BLK_DEV_IDEDMA_SFF */
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index 011d72011cc4..3d8e6dd0f41e 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -125,26 +125,10 @@ typedef struct ide_floppy_obj {
125 int wp; 125 int wp;
126 /* Supports format progress report */ 126 /* Supports format progress report */
127 int srfp; 127 int srfp;
128 /* Status/Action flags */
129 unsigned long flags;
130} idefloppy_floppy_t; 128} idefloppy_floppy_t;
131 129
132#define IDEFLOPPY_TICKS_DELAY HZ/20 /* default delay for ZIP 100 (50ms) */ 130#define IDEFLOPPY_TICKS_DELAY HZ/20 /* default delay for ZIP 100 (50ms) */
133 131
134/* Floppy flag bits values. */
135enum {
136 /* DRQ interrupt device */
137 IDEFLOPPY_FLAG_DRQ_INTERRUPT = (1 << 0),
138 /* Media may have changed */
139 IDEFLOPPY_FLAG_MEDIA_CHANGED = (1 << 1),
140 /* Format in progress */
141 IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS = (1 << 2),
142 /* Avoid commands not supported in Clik drive */
143 IDEFLOPPY_FLAG_CLIK_DRIVE = (1 << 3),
144 /* Requires BH algorithm for packets */
145 IDEFLOPPY_FLAG_ZIP_DRIVE = (1 << 4),
146};
147
148/* Defines for the MODE SENSE command */ 132/* Defines for the MODE SENSE command */
149#define MODE_SENSE_CURRENT 0x00 133#define MODE_SENSE_CURRENT 0x00
150#define MODE_SENSE_CHANGEABLE 0x01 134#define MODE_SENSE_CHANGEABLE 0x01
@@ -247,9 +231,9 @@ static void ide_floppy_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
247 231
248 data = bvec_kmap_irq(bvec, &flags); 232 data = bvec_kmap_irq(bvec, &flags);
249 if (direction) 233 if (direction)
250 hwif->output_data(drive, NULL, data, count); 234 hwif->tp_ops->output_data(drive, NULL, data, count);
251 else 235 else
252 hwif->input_data(drive, NULL, data, count); 236 hwif->tp_ops->input_data(drive, NULL, data, count);
253 bvec_kunmap_irq(data, &flags); 237 bvec_kunmap_irq(data, &flags);
254 238
255 bcount -= count; 239 bcount -= count;
@@ -291,6 +275,7 @@ static void idefloppy_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,
291 rq->cmd_type = REQ_TYPE_SPECIAL; 275 rq->cmd_type = REQ_TYPE_SPECIAL;
292 rq->cmd_flags |= REQ_PREEMPT; 276 rq->cmd_flags |= REQ_PREEMPT;
293 rq->rq_disk = floppy->disk; 277 rq->rq_disk = floppy->disk;
278 memcpy(rq->cmd, pc->c, 12);
294 ide_do_drive_cmd(drive, rq); 279 ide_do_drive_cmd(drive, rq);
295} 280}
296 281
@@ -354,7 +339,6 @@ static void idefloppy_init_pc(struct ide_atapi_pc *pc)
354 memset(pc, 0, sizeof(*pc)); 339 memset(pc, 0, sizeof(*pc));
355 pc->buf = pc->pc_buf; 340 pc->buf = pc->pc_buf;
356 pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE; 341 pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE;
357 pc->callback = ide_floppy_callback;
358} 342}
359 343
360static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc) 344static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
@@ -402,7 +386,7 @@ static int idefloppy_transfer_pc(ide_drive_t *drive)
402 idefloppy_floppy_t *floppy = drive->driver_data; 386 idefloppy_floppy_t *floppy = drive->driver_data;
403 387
404 /* Send the actual packet */ 388 /* Send the actual packet */
405 drive->hwif->output_data(drive, NULL, floppy->pc->c, 12); 389 drive->hwif->tp_ops->output_data(drive, NULL, floppy->pc->c, 12);
406 390
407 /* Timeout for the packet command */ 391 /* Timeout for the packet command */
408 return IDEFLOPPY_WAIT_CMD; 392 return IDEFLOPPY_WAIT_CMD;
@@ -429,7 +413,7 @@ static ide_startstop_t idefloppy_start_pc_transfer(ide_drive_t *drive)
429 * 40 and 50msec work well. idefloppy_pc_intr will not be actually 413 * 40 and 50msec work well. idefloppy_pc_intr will not be actually
430 * used until after the packet is moved in about 50 msec. 414 * used until after the packet is moved in about 50 msec.
431 */ 415 */
432 if (pc->flags & PC_FLAG_ZIP_DRIVE) { 416 if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) {
433 timeout = floppy->ticks; 417 timeout = floppy->ticks;
434 expiry = &idefloppy_transfer_pc; 418 expiry = &idefloppy_transfer_pc;
435 } else { 419 } else {
@@ -474,7 +458,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
474 pc->error = IDEFLOPPY_ERROR_GENERAL; 458 pc->error = IDEFLOPPY_ERROR_GENERAL;
475 459
476 floppy->failed_pc = NULL; 460 floppy->failed_pc = NULL;
477 pc->callback(drive); 461 drive->pc_callback(drive);
478 return ide_stopped; 462 return ide_stopped;
479 } 463 }
480 464
@@ -574,6 +558,8 @@ static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy,
574 put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); 558 put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]);
575 put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); 559 put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]);
576 560
561 memcpy(rq->cmd, pc->c, 12);
562
577 pc->rq = rq; 563 pc->rq = rq;
578 pc->b_count = cmd == READ ? 0 : rq->bio->bi_size; 564 pc->b_count = cmd == READ ? 0 : rq->bio->bi_size;
579 if (rq->cmd_flags & REQ_RW) 565 if (rq->cmd_flags & REQ_RW)
@@ -647,12 +633,6 @@ static ide_startstop_t idefloppy_do_request(ide_drive_t *drive,
647 return ide_stopped; 633 return ide_stopped;
648 } 634 }
649 635
650 if (floppy->flags & IDEFLOPPY_FLAG_DRQ_INTERRUPT)
651 pc->flags |= PC_FLAG_DRQ_INTERRUPT;
652
653 if (floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE)
654 pc->flags |= PC_FLAG_ZIP_DRIVE;
655
656 pc->rq = rq; 636 pc->rq = rq;
657 637
658 return idefloppy_issue_pc(drive, pc); 638 return idefloppy_issue_pc(drive, pc);
@@ -671,6 +651,7 @@ static int idefloppy_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
671 rq = blk_get_request(drive->queue, READ, __GFP_WAIT); 651 rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
672 rq->buffer = (char *) pc; 652 rq->buffer = (char *) pc;
673 rq->cmd_type = REQ_TYPE_SPECIAL; 653 rq->cmd_type = REQ_TYPE_SPECIAL;
654 memcpy(rq->cmd, pc->c, 12);
674 error = blk_execute_rq(drive->queue, floppy->disk, rq, 0); 655 error = blk_execute_rq(drive->queue, floppy->disk, rq, 0);
675 blk_put_request(rq); 656 blk_put_request(rq);
676 657
@@ -795,7 +776,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
795 switch (pc.buf[desc_start + 4] & 0x03) { 776 switch (pc.buf[desc_start + 4] & 0x03) {
796 /* Clik! drive returns this instead of CAPACITY_CURRENT */ 777 /* Clik! drive returns this instead of CAPACITY_CURRENT */
797 case CAPACITY_UNFORMATTED: 778 case CAPACITY_UNFORMATTED:
798 if (!(floppy->flags & IDEFLOPPY_FLAG_CLIK_DRIVE)) 779 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE))
799 /* 780 /*
800 * If it is not a clik drive, break out 781 * If it is not a clik drive, break out
801 * (maintains previous driver behaviour) 782 * (maintains previous driver behaviour)
@@ -841,7 +822,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
841 } 822 }
842 823
843 /* Clik! disk does not support get_flexible_disk_page */ 824 /* Clik! disk does not support get_flexible_disk_page */
844 if (!(floppy->flags & IDEFLOPPY_FLAG_CLIK_DRIVE)) 825 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE))
845 (void) ide_floppy_get_flexible_disk_page(drive); 826 (void) ide_floppy_get_flexible_disk_page(drive);
846 827
847 set_capacity(floppy->disk, floppy->blocks * floppy->bs_factor); 828 set_capacity(floppy->disk, floppy->blocks * floppy->bs_factor);
@@ -949,11 +930,12 @@ static int idefloppy_get_format_progress(ide_drive_t *drive, int __user *arg)
949 930
950 /* Else assume format_unit has finished, and we're at 0x10000 */ 931 /* Else assume format_unit has finished, and we're at 0x10000 */
951 } else { 932 } else {
933 ide_hwif_t *hwif = drive->hwif;
952 unsigned long flags; 934 unsigned long flags;
953 u8 stat; 935 u8 stat;
954 936
955 local_irq_save(flags); 937 local_irq_save(flags);
956 stat = ide_read_status(drive); 938 stat = hwif->tp_ops->read_status(hwif);
957 local_irq_restore(flags); 939 local_irq_restore(flags);
958 940
959 progress_indication = ((stat & SEEK_STAT) == 0) ? 0 : 0x10000; 941 progress_indication = ((stat & SEEK_STAT) == 0) ? 0 : 0x10000;
@@ -1039,9 +1021,10 @@ static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy)
1039 1021
1040 *((u16 *) &gcw) = drive->id->config; 1022 *((u16 *) &gcw) = drive->id->config;
1041 floppy->pc = floppy->pc_stack; 1023 floppy->pc = floppy->pc_stack;
1024 drive->pc_callback = ide_floppy_callback;
1042 1025
1043 if (((gcw[0] & 0x60) >> 5) == 1) 1026 if (((gcw[0] & 0x60) >> 5) == 1)
1044 floppy->flags |= IDEFLOPPY_FLAG_DRQ_INTERRUPT; 1027 drive->atapi_flags |= IDE_AFLAG_DRQ_INTERRUPT;
1045 /* 1028 /*
1046 * We used to check revisions here. At this point however I'm giving up. 1029 * We used to check revisions here. At this point however I'm giving up.
1047 * Just assume they are all broken, its easier. 1030 * Just assume they are all broken, its easier.
@@ -1052,7 +1035,7 @@ static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy)
1052 * we'll leave the limitation below for the 2.2.x tree. 1035 * we'll leave the limitation below for the 2.2.x tree.
1053 */ 1036 */
1054 if (!strncmp(drive->id->model, "IOMEGA ZIP 100 ATAPI", 20)) { 1037 if (!strncmp(drive->id->model, "IOMEGA ZIP 100 ATAPI", 20)) {
1055 floppy->flags |= IDEFLOPPY_FLAG_ZIP_DRIVE; 1038 drive->atapi_flags |= IDE_AFLAG_ZIP_DRIVE;
1056 /* This value will be visible in the /proc/ide/hdx/settings */ 1039 /* This value will be visible in the /proc/ide/hdx/settings */
1057 floppy->ticks = IDEFLOPPY_TICKS_DELAY; 1040 floppy->ticks = IDEFLOPPY_TICKS_DELAY;
1058 blk_queue_max_sectors(drive->queue, 64); 1041 blk_queue_max_sectors(drive->queue, 64);
@@ -1064,7 +1047,7 @@ static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy)
1064 */ 1047 */
1065 if (strncmp(drive->id->model, "IOMEGA Clik!", 11) == 0) { 1048 if (strncmp(drive->id->model, "IOMEGA Clik!", 11) == 0) {
1066 blk_queue_max_sectors(drive->queue, 64); 1049 blk_queue_max_sectors(drive->queue, 64);
1067 floppy->flags |= IDEFLOPPY_FLAG_CLIK_DRIVE; 1050 drive->atapi_flags |= IDE_AFLAG_CLIK_DRIVE;
1068 } 1051 }
1069 1052
1070 (void) ide_floppy_get_capacity(drive); 1053 (void) ide_floppy_get_capacity(drive);
@@ -1153,7 +1136,7 @@ static int idefloppy_open(struct inode *inode, struct file *filp)
1153 floppy->openers++; 1136 floppy->openers++;
1154 1137
1155 if (floppy->openers == 1) { 1138 if (floppy->openers == 1) {
1156 floppy->flags &= ~IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; 1139 drive->atapi_flags &= ~IDE_AFLAG_FORMAT_IN_PROGRESS;
1157 /* Just in case */ 1140 /* Just in case */
1158 1141
1159 idefloppy_init_pc(&pc); 1142 idefloppy_init_pc(&pc);
@@ -1180,14 +1163,14 @@ static int idefloppy_open(struct inode *inode, struct file *filp)
1180 ret = -EROFS; 1163 ret = -EROFS;
1181 goto out_put_floppy; 1164 goto out_put_floppy;
1182 } 1165 }
1183 floppy->flags |= IDEFLOPPY_FLAG_MEDIA_CHANGED; 1166 drive->atapi_flags |= IDE_AFLAG_MEDIA_CHANGED;
1184 /* IOMEGA Clik! drives do not support lock/unlock commands */ 1167 /* IOMEGA Clik! drives do not support lock/unlock commands */
1185 if (!(floppy->flags & IDEFLOPPY_FLAG_CLIK_DRIVE)) { 1168 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) {
1186 idefloppy_create_prevent_cmd(&pc, 1); 1169 idefloppy_create_prevent_cmd(&pc, 1);
1187 (void) idefloppy_queue_pc_tail(drive, &pc); 1170 (void) idefloppy_queue_pc_tail(drive, &pc);
1188 } 1171 }
1189 check_disk_change(inode->i_bdev); 1172 check_disk_change(inode->i_bdev);
1190 } else if (floppy->flags & IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS) { 1173 } else if (drive->atapi_flags & IDE_AFLAG_FORMAT_IN_PROGRESS) {
1191 ret = -EBUSY; 1174 ret = -EBUSY;
1192 goto out_put_floppy; 1175 goto out_put_floppy;
1193 } 1176 }
@@ -1210,12 +1193,12 @@ static int idefloppy_release(struct inode *inode, struct file *filp)
1210 1193
1211 if (floppy->openers == 1) { 1194 if (floppy->openers == 1) {
1212 /* IOMEGA Clik! drives do not support lock/unlock commands */ 1195 /* IOMEGA Clik! drives do not support lock/unlock commands */
1213 if (!(floppy->flags & IDEFLOPPY_FLAG_CLIK_DRIVE)) { 1196 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) {
1214 idefloppy_create_prevent_cmd(&pc, 0); 1197 idefloppy_create_prevent_cmd(&pc, 0);
1215 (void) idefloppy_queue_pc_tail(drive, &pc); 1198 (void) idefloppy_queue_pc_tail(drive, &pc);
1216 } 1199 }
1217 1200
1218 floppy->flags &= ~IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; 1201 drive->atapi_flags &= ~IDE_AFLAG_FORMAT_IN_PROGRESS;
1219 } 1202 }
1220 1203
1221 floppy->openers--; 1204 floppy->openers--;
@@ -1236,15 +1219,17 @@ static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo)
1236 return 0; 1219 return 0;
1237} 1220}
1238 1221
1239static int ide_floppy_lockdoor(idefloppy_floppy_t *floppy, 1222static int ide_floppy_lockdoor(ide_drive_t *drive, struct ide_atapi_pc *pc,
1240 struct ide_atapi_pc *pc, unsigned long arg, unsigned int cmd) 1223 unsigned long arg, unsigned int cmd)
1241{ 1224{
1225 idefloppy_floppy_t *floppy = drive->driver_data;
1226
1242 if (floppy->openers > 1) 1227 if (floppy->openers > 1)
1243 return -EBUSY; 1228 return -EBUSY;
1244 1229
1245 /* The IOMEGA Clik! Drive doesn't support this command - 1230 /* The IOMEGA Clik! Drive doesn't support this command -
1246 * no room for an eject mechanism */ 1231 * no room for an eject mechanism */
1247 if (!(floppy->flags & IDEFLOPPY_FLAG_CLIK_DRIVE)) { 1232 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) {
1248 int prevent = arg ? 1 : 0; 1233 int prevent = arg ? 1 : 0;
1249 1234
1250 if (cmd == CDROMEJECT) 1235 if (cmd == CDROMEJECT)
@@ -1265,16 +1250,17 @@ static int ide_floppy_lockdoor(idefloppy_floppy_t *floppy,
1265static int ide_floppy_format_unit(idefloppy_floppy_t *floppy, 1250static int ide_floppy_format_unit(idefloppy_floppy_t *floppy,
1266 int __user *arg) 1251 int __user *arg)
1267{ 1252{
1268 int blocks, length, flags, err = 0;
1269 struct ide_atapi_pc pc; 1253 struct ide_atapi_pc pc;
1254 ide_drive_t *drive = floppy->drive;
1255 int blocks, length, flags, err = 0;
1270 1256
1271 if (floppy->openers > 1) { 1257 if (floppy->openers > 1) {
1272 /* Don't format if someone is using the disk */ 1258 /* Don't format if someone is using the disk */
1273 floppy->flags &= ~IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; 1259 drive->atapi_flags &= ~IDE_AFLAG_FORMAT_IN_PROGRESS;
1274 return -EBUSY; 1260 return -EBUSY;
1275 } 1261 }
1276 1262
1277 floppy->flags |= IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; 1263 drive->atapi_flags |= IDE_AFLAG_FORMAT_IN_PROGRESS;
1278 1264
1279 /* 1265 /*
1280 * Send ATAPI_FORMAT_UNIT to the drive. 1266 * Send ATAPI_FORMAT_UNIT to the drive.
@@ -1298,15 +1284,15 @@ static int ide_floppy_format_unit(idefloppy_floppy_t *floppy,
1298 goto out; 1284 goto out;
1299 } 1285 }
1300 1286
1301 (void) idefloppy_get_sfrp_bit(floppy->drive); 1287 (void) idefloppy_get_sfrp_bit(drive);
1302 idefloppy_create_format_unit_cmd(&pc, blocks, length, flags); 1288 idefloppy_create_format_unit_cmd(&pc, blocks, length, flags);
1303 1289
1304 if (idefloppy_queue_pc_tail(floppy->drive, &pc)) 1290 if (idefloppy_queue_pc_tail(drive, &pc))
1305 err = -EIO; 1291 err = -EIO;
1306 1292
1307out: 1293out:
1308 if (err) 1294 if (err)
1309 floppy->flags &= ~IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; 1295 drive->atapi_flags &= ~IDE_AFLAG_FORMAT_IN_PROGRESS;
1310 return err; 1296 return err;
1311} 1297}
1312 1298
@@ -1325,7 +1311,7 @@ static int idefloppy_ioctl(struct inode *inode, struct file *file,
1325 case CDROMEJECT: 1311 case CDROMEJECT:
1326 /* fall through */ 1312 /* fall through */
1327 case CDROM_LOCKDOOR: 1313 case CDROM_LOCKDOOR:
1328 return ide_floppy_lockdoor(floppy, &pc, arg, cmd); 1314 return ide_floppy_lockdoor(drive, &pc, arg, cmd);
1329 case IDEFLOPPY_IOCTL_FORMAT_SUPPORTED: 1315 case IDEFLOPPY_IOCTL_FORMAT_SUPPORTED:
1330 return 0; 1316 return 0;
1331 case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY: 1317 case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY:
@@ -1366,8 +1352,8 @@ static int idefloppy_media_changed(struct gendisk *disk)
1366 drive->attach = 0; 1352 drive->attach = 0;
1367 return 0; 1353 return 0;
1368 } 1354 }
1369 ret = !!(floppy->flags & IDEFLOPPY_FLAG_MEDIA_CHANGED); 1355 ret = !!(drive->atapi_flags & IDE_AFLAG_MEDIA_CHANGED);
1370 floppy->flags &= ~IDEFLOPPY_FLAG_MEDIA_CHANGED; 1356 drive->atapi_flags &= ~IDE_AFLAG_MEDIA_CHANGED;
1371 return ret; 1357 return ret;
1372} 1358}
1373 1359
diff --git a/drivers/ide/ide-generic.c b/drivers/ide/ide-generic.c
index 2d92214096ab..31d98fec775f 100644
--- a/drivers/ide/ide-generic.c
+++ b/drivers/ide/ide-generic.c
@@ -28,29 +28,21 @@ MODULE_PARM_DESC(probe_mask, "probe mask for legacy ISA IDE ports");
28 28
29static ssize_t store_add(struct class *cls, const char *buf, size_t n) 29static ssize_t store_add(struct class *cls, const char *buf, size_t n)
30{ 30{
31 ide_hwif_t *hwif;
32 unsigned int base, ctl; 31 unsigned int base, ctl;
33 int irq; 32 int irq, rc;
34 hw_regs_t hw; 33 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
35 u8 idx[] = { 0xff, 0xff, 0xff, 0xff };
36 34
37 if (sscanf(buf, "%x:%x:%d", &base, &ctl, &irq) != 3) 35 if (sscanf(buf, "%x:%x:%d", &base, &ctl, &irq) != 3)
38 return -EINVAL; 36 return -EINVAL;
39 37
40 hwif = ide_find_port();
41 if (hwif == NULL)
42 return -ENOENT;
43
44 memset(&hw, 0, sizeof(hw)); 38 memset(&hw, 0, sizeof(hw));
45 ide_std_init_ports(&hw, base, ctl); 39 ide_std_init_ports(&hw, base, ctl);
46 hw.irq = irq; 40 hw.irq = irq;
47 hw.chipset = ide_generic; 41 hw.chipset = ide_generic;
48 42
49 ide_init_port_hw(hwif, &hw); 43 rc = ide_host_add(NULL, hws, NULL);
50 44 if (rc)
51 idx[0] = hwif->index; 45 return rc;
52
53 ide_device_add(idx, NULL);
54 46
55 return n; 47 return n;
56}; 48};
@@ -90,18 +82,18 @@ static int __init ide_generic_sysfs_init(void)
90 82
91static int __init ide_generic_init(void) 83static int __init ide_generic_init(void)
92{ 84{
93 u8 idx[MAX_HWIFS]; 85 hw_regs_t hw[MAX_HWIFS], *hws[MAX_HWIFS];
94 int i; 86 struct ide_host *host;
87 unsigned long io_addr;
88 int i, rc;
95 89
96 printk(KERN_INFO DRV_NAME ": please use \"probe_mask=0x3f\" module " 90 printk(KERN_INFO DRV_NAME ": please use \"probe_mask=0x3f\" module "
97 "parameter for probing all legacy ISA IDE ports\n"); 91 "parameter for probing all legacy ISA IDE ports\n");
98 92
99 for (i = 0; i < MAX_HWIFS; i++) { 93 for (i = 0; i < MAX_HWIFS; i++) {
100 ide_hwif_t *hwif; 94 io_addr = ide_default_io_base(i);
101 unsigned long io_addr = ide_default_io_base(i);
102 hw_regs_t hw;
103 95
104 idx[i] = 0xff; 96 hws[i] = NULL;
105 97
106 if ((probe_mask & (1 << i)) && io_addr) { 98 if ((probe_mask & (1 << i)) && io_addr) {
107 if (!request_region(io_addr, 8, DRV_NAME)) { 99 if (!request_region(io_addr, 8, DRV_NAME)) {
@@ -119,33 +111,42 @@ static int __init ide_generic_init(void)
119 continue; 111 continue;
120 } 112 }
121 113
122 /* 114 memset(&hw[i], 0, sizeof(hw[i]));
123 * Skip probing if the corresponding 115 ide_std_init_ports(&hw[i], io_addr, io_addr + 0x206);
124 * slot is already occupied. 116 hw[i].irq = ide_default_irq(io_addr);
125 */ 117 hw[i].chipset = ide_generic;
126 hwif = ide_find_port();
127 if (hwif == NULL || hwif->index != i) {
128 idx[i] = 0xff;
129 continue;
130 }
131
132 memset(&hw, 0, sizeof(hw));
133 ide_std_init_ports(&hw, io_addr, io_addr + 0x206);
134 hw.irq = ide_default_irq(io_addr);
135 hw.chipset = ide_generic;
136 ide_init_port_hw(hwif, &hw);
137 118
138 idx[i] = i; 119 hws[i] = &hw[i];
139 } 120 }
140 } 121 }
141 122
142 ide_device_add_all(idx, NULL); 123 host = ide_host_alloc_all(NULL, hws);
124 if (host == NULL) {
125 rc = -ENOMEM;
126 goto err;
127 }
128
129 rc = ide_host_register(host, NULL, hws);
130 if (rc)
131 goto err_free;
143 132
144 if (ide_generic_sysfs_init()) 133 if (ide_generic_sysfs_init())
145 printk(KERN_ERR DRV_NAME ": failed to create ide_generic " 134 printk(KERN_ERR DRV_NAME ": failed to create ide_generic "
146 "class\n"); 135 "class\n");
147 136
148 return 0; 137 return 0;
138err_free:
139 ide_host_free(host);
140err:
141 for (i = 0; i < MAX_HWIFS; i++) {
142 if (hws[i] == NULL)
143 continue;
144
145 io_addr = hws[i]->io_ports.data_addr;
146 release_region(io_addr + 0x206, 1);
147 release_region(io_addr, 8);
148 }
149 return rc;
149} 150}
150 151
151module_init(ide_generic_init); 152module_init(ide_generic_init);
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 661b75a89d4d..a896a283f27f 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -330,7 +330,7 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
330 tf->error = err; 330 tf->error = err;
331 tf->status = stat; 331 tf->status = stat;
332 332
333 drive->hwif->tf_read(drive, task); 333 drive->hwif->tp_ops->tf_read(drive, task);
334 334
335 if (task->tf_flags & IDE_TFLAG_DYN) 335 if (task->tf_flags & IDE_TFLAG_DYN)
336 kfree(task); 336 kfree(task);
@@ -381,8 +381,7 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8
381 if (err == ABRT_ERR) { 381 if (err == ABRT_ERR) {
382 if (drive->select.b.lba && 382 if (drive->select.b.lba &&
383 /* some newer drives don't support WIN_SPECIFY */ 383 /* some newer drives don't support WIN_SPECIFY */
384 hwif->INB(hwif->io_ports.command_addr) == 384 hwif->tp_ops->read_status(hwif) == WIN_SPECIFY)
385 WIN_SPECIFY)
386 return ide_stopped; 385 return ide_stopped;
387 } else if ((err & BAD_CRC) == BAD_CRC) { 386 } else if ((err & BAD_CRC) == BAD_CRC) {
388 /* UDMA crc error, just retry the operation */ 387 /* UDMA crc error, just retry the operation */
@@ -408,7 +407,7 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8
408 return ide_stopped; 407 return ide_stopped;
409 } 408 }
410 409
411 if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) 410 if (hwif->tp_ops->read_status(hwif) & (BUSY_STAT | DRQ_STAT))
412 rq->errors |= ERROR_RESET; 411 rq->errors |= ERROR_RESET;
413 412
414 if ((rq->errors & ERROR_RESET) == ERROR_RESET) { 413 if ((rq->errors & ERROR_RESET) == ERROR_RESET) {
@@ -435,10 +434,9 @@ static ide_startstop_t ide_atapi_error(ide_drive_t *drive, struct request *rq, u
435 /* add decoding error stuff */ 434 /* add decoding error stuff */
436 } 435 }
437 436
438 if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) 437 if (hwif->tp_ops->read_status(hwif) & (BUSY_STAT | DRQ_STAT))
439 /* force an abort */ 438 /* force an abort */
440 hwif->OUTBSYNC(hwif, WIN_IDLEIMMEDIATE, 439 hwif->tp_ops->exec_command(hwif, WIN_IDLEIMMEDIATE);
441 hwif->io_ports.command_addr);
442 440
443 if (rq->errors >= ERROR_MAX) { 441 if (rq->errors >= ERROR_MAX) {
444 ide_kill_rq(drive, rq); 442 ide_kill_rq(drive, rq);
@@ -712,7 +710,8 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive,
712#ifdef DEBUG 710#ifdef DEBUG
713 printk("%s: DRIVE_CMD (null)\n", drive->name); 711 printk("%s: DRIVE_CMD (null)\n", drive->name);
714#endif 712#endif
715 ide_end_drive_cmd(drive, ide_read_status(drive), ide_read_error(drive)); 713 ide_end_drive_cmd(drive, hwif->tp_ops->read_status(hwif),
714 ide_read_error(drive));
716 715
717 return ide_stopped; 716 return ide_stopped;
718} 717}
@@ -747,16 +746,17 @@ static void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
747 * the bus may be broken enough to walk on our toes at this 746 * the bus may be broken enough to walk on our toes at this
748 * point. 747 * point.
749 */ 748 */
749 ide_hwif_t *hwif = drive->hwif;
750 int rc; 750 int rc;
751#ifdef DEBUG_PM 751#ifdef DEBUG_PM
752 printk("%s: Wakeup request inited, waiting for !BSY...\n", drive->name); 752 printk("%s: Wakeup request inited, waiting for !BSY...\n", drive->name);
753#endif 753#endif
754 rc = ide_wait_not_busy(HWIF(drive), 35000); 754 rc = ide_wait_not_busy(hwif, 35000);
755 if (rc) 755 if (rc)
756 printk(KERN_WARNING "%s: bus not ready on wakeup\n", drive->name); 756 printk(KERN_WARNING "%s: bus not ready on wakeup\n", drive->name);
757 SELECT_DRIVE(drive); 757 SELECT_DRIVE(drive);
758 ide_set_irq(drive, 1); 758 hwif->tp_ops->set_irq(hwif, 1);
759 rc = ide_wait_not_busy(HWIF(drive), 100000); 759 rc = ide_wait_not_busy(hwif, 100000);
760 if (rc) 760 if (rc)
761 printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name); 761 printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name);
762 } 762 }
@@ -1042,7 +1042,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
1042 * quirk_list may not like intr setups/cleanups 1042 * quirk_list may not like intr setups/cleanups
1043 */ 1043 */
1044 if (drive->quirk_list != 1) 1044 if (drive->quirk_list != 1)
1045 ide_set_irq(drive, 0); 1045 hwif->tp_ops->set_irq(hwif, 0);
1046 } 1046 }
1047 hwgroup->hwif = hwif; 1047 hwgroup->hwif = hwif;
1048 hwgroup->drive = drive; 1048 hwgroup->drive = drive;
@@ -1142,7 +1142,7 @@ static ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error)
1142 printk(KERN_WARNING "%s: DMA timeout error\n", drive->name); 1142 printk(KERN_WARNING "%s: DMA timeout error\n", drive->name);
1143 (void)hwif->dma_ops->dma_end(drive); 1143 (void)hwif->dma_ops->dma_end(drive);
1144 ret = ide_error(drive, "dma timeout error", 1144 ret = ide_error(drive, "dma timeout error",
1145 ide_read_status(drive)); 1145 hwif->tp_ops->read_status(hwif));
1146 } else { 1146 } else {
1147 printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name); 1147 printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
1148 hwif->dma_ops->dma_timeout(drive); 1148 hwif->dma_ops->dma_timeout(drive);
@@ -1267,7 +1267,7 @@ void ide_timer_expiry (unsigned long data)
1267 } else 1267 } else
1268 startstop = 1268 startstop =
1269 ide_error(drive, "irq timeout", 1269 ide_error(drive, "irq timeout",
1270 ide_read_status(drive)); 1270 hwif->tp_ops->read_status(hwif));
1271 } 1271 }
1272 drive->service_time = jiffies - drive->service_start; 1272 drive->service_time = jiffies - drive->service_start;
1273 spin_lock_irq(&ide_lock); 1273 spin_lock_irq(&ide_lock);
@@ -1323,7 +1323,8 @@ static void unexpected_intr (int irq, ide_hwgroup_t *hwgroup)
1323 */ 1323 */
1324 do { 1324 do {
1325 if (hwif->irq == irq) { 1325 if (hwif->irq == irq) {
1326 stat = hwif->INB(hwif->io_ports.status_addr); 1326 stat = hwif->tp_ops->read_status(hwif);
1327
1327 if (!OK_STAT(stat, READY_STAT, BAD_STAT)) { 1328 if (!OK_STAT(stat, READY_STAT, BAD_STAT)) {
1328 /* Try to not flood the console with msgs */ 1329 /* Try to not flood the console with msgs */
1329 static unsigned long last_msgtime, count; 1330 static unsigned long last_msgtime, count;
@@ -1413,7 +1414,7 @@ irqreturn_t ide_intr (int irq, void *dev_id)
1413 * Whack the status register, just in case 1414 * Whack the status register, just in case
1414 * we have a leftover pending IRQ. 1415 * we have a leftover pending IRQ.
1415 */ 1416 */
1416 (void) hwif->INB(hwif->io_ports.status_addr); 1417 (void)hwif->tp_ops->read_status(hwif);
1417#endif /* CONFIG_BLK_DEV_IDEPCI */ 1418#endif /* CONFIG_BLK_DEV_IDEPCI */
1418 } 1419 }
1419 spin_unlock_irqrestore(&ide_lock, flags); 1420 spin_unlock_irqrestore(&ide_lock, flags);
@@ -1519,6 +1520,7 @@ EXPORT_SYMBOL(ide_do_drive_cmd);
1519 1520
1520void ide_pktcmd_tf_load(ide_drive_t *drive, u32 tf_flags, u16 bcount, u8 dma) 1521void ide_pktcmd_tf_load(ide_drive_t *drive, u32 tf_flags, u16 bcount, u8 dma)
1521{ 1522{
1523 ide_hwif_t *hwif = drive->hwif;
1522 ide_task_t task; 1524 ide_task_t task;
1523 1525
1524 memset(&task, 0, sizeof(task)); 1526 memset(&task, 0, sizeof(task));
@@ -1529,9 +1531,9 @@ void ide_pktcmd_tf_load(ide_drive_t *drive, u32 tf_flags, u16 bcount, u8 dma)
1529 task.tf.lbah = (bcount >> 8) & 0xff; 1531 task.tf.lbah = (bcount >> 8) & 0xff;
1530 1532
1531 ide_tf_dump(drive->name, &task.tf); 1533 ide_tf_dump(drive->name, &task.tf);
1532 ide_set_irq(drive, 1); 1534 hwif->tp_ops->set_irq(hwif, 1);
1533 SELECT_MASK(drive, 0); 1535 SELECT_MASK(drive, 0);
1534 drive->hwif->tf_load(drive, &task); 1536 hwif->tp_ops->tf_load(drive, &task);
1535} 1537}
1536 1538
1537EXPORT_SYMBOL_GPL(ide_pktcmd_tf_load); 1539EXPORT_SYMBOL_GPL(ide_pktcmd_tf_load);
@@ -1543,9 +1545,9 @@ void ide_pad_transfer(ide_drive_t *drive, int write, int len)
1543 1545
1544 while (len > 0) { 1546 while (len > 0) {
1545 if (write) 1547 if (write)
1546 hwif->output_data(drive, NULL, buf, min(4, len)); 1548 hwif->tp_ops->output_data(drive, NULL, buf, min(4, len));
1547 else 1549 else
1548 hwif->input_data(drive, NULL, buf, min(4, len)); 1550 hwif->tp_ops->input_data(drive, NULL, buf, min(4, len));
1549 len -= 4; 1551 len -= 4;
1550 } 1552 }
1551} 1553}
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
index 44aaec256a30..07da5fb9eaff 100644
--- a/drivers/ide/ide-iops.c
+++ b/drivers/ide/ide-iops.c
@@ -42,18 +42,6 @@ static void ide_outb (u8 val, unsigned long port)
42 outb(val, port); 42 outb(val, port);
43} 43}
44 44
45static void ide_outbsync(ide_hwif_t *hwif, u8 addr, unsigned long port)
46{
47 outb(addr, port);
48}
49
50void default_hwif_iops (ide_hwif_t *hwif)
51{
52 hwif->OUTB = ide_outb;
53 hwif->OUTBSYNC = ide_outbsync;
54 hwif->INB = ide_inb;
55}
56
57/* 45/*
58 * MMIO operations, typically used for SATA controllers 46 * MMIO operations, typically used for SATA controllers
59 */ 47 */
@@ -68,31 +56,19 @@ static void ide_mm_outb (u8 value, unsigned long port)
68 writeb(value, (void __iomem *) port); 56 writeb(value, (void __iomem *) port);
69} 57}
70 58
71static void ide_mm_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port)
72{
73 writeb(value, (void __iomem *) port);
74}
75
76void default_hwif_mmiops (ide_hwif_t *hwif)
77{
78 hwif->OUTB = ide_mm_outb;
79 /* Most systems will need to override OUTBSYNC, alas however
80 this one is controller specific! */
81 hwif->OUTBSYNC = ide_mm_outbsync;
82 hwif->INB = ide_mm_inb;
83}
84
85EXPORT_SYMBOL(default_hwif_mmiops);
86
87void SELECT_DRIVE (ide_drive_t *drive) 59void SELECT_DRIVE (ide_drive_t *drive)
88{ 60{
89 ide_hwif_t *hwif = drive->hwif; 61 ide_hwif_t *hwif = drive->hwif;
90 const struct ide_port_ops *port_ops = hwif->port_ops; 62 const struct ide_port_ops *port_ops = hwif->port_ops;
63 ide_task_t task;
91 64
92 if (port_ops && port_ops->selectproc) 65 if (port_ops && port_ops->selectproc)
93 port_ops->selectproc(drive); 66 port_ops->selectproc(drive);
94 67
95 hwif->OUTB(drive->select.all, hwif->io_ports.device_addr); 68 memset(&task, 0, sizeof(task));
69 task.tf_flags = IDE_TFLAG_OUT_DEVICE;
70
71 drive->hwif->tp_ops->tf_load(drive, &task);
96} 72}
97 73
98void SELECT_MASK(ide_drive_t *drive, int mask) 74void SELECT_MASK(ide_drive_t *drive, int mask)
@@ -103,7 +79,61 @@ void SELECT_MASK(ide_drive_t *drive, int mask)
103 port_ops->maskproc(drive, mask); 79 port_ops->maskproc(drive, mask);
104} 80}
105 81
106static void ide_tf_load(ide_drive_t *drive, ide_task_t *task) 82void ide_exec_command(ide_hwif_t *hwif, u8 cmd)
83{
84 if (hwif->host_flags & IDE_HFLAG_MMIO)
85 writeb(cmd, (void __iomem *)hwif->io_ports.command_addr);
86 else
87 outb(cmd, hwif->io_ports.command_addr);
88}
89EXPORT_SYMBOL_GPL(ide_exec_command);
90
91u8 ide_read_status(ide_hwif_t *hwif)
92{
93 if (hwif->host_flags & IDE_HFLAG_MMIO)
94 return readb((void __iomem *)hwif->io_ports.status_addr);
95 else
96 return inb(hwif->io_ports.status_addr);
97}
98EXPORT_SYMBOL_GPL(ide_read_status);
99
100u8 ide_read_altstatus(ide_hwif_t *hwif)
101{
102 if (hwif->host_flags & IDE_HFLAG_MMIO)
103 return readb((void __iomem *)hwif->io_ports.ctl_addr);
104 else
105 return inb(hwif->io_ports.ctl_addr);
106}
107EXPORT_SYMBOL_GPL(ide_read_altstatus);
108
109u8 ide_read_sff_dma_status(ide_hwif_t *hwif)
110{
111 if (hwif->host_flags & IDE_HFLAG_MMIO)
112 return readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
113 else
114 return inb(hwif->dma_base + ATA_DMA_STATUS);
115}
116EXPORT_SYMBOL_GPL(ide_read_sff_dma_status);
117
118void ide_set_irq(ide_hwif_t *hwif, int on)
119{
120 u8 ctl = ATA_DEVCTL_OBS;
121
122 if (on == 4) { /* hack for SRST */
123 ctl |= 4;
124 on &= ~4;
125 }
126
127 ctl |= on ? 0 : 2;
128
129 if (hwif->host_flags & IDE_HFLAG_MMIO)
130 writeb(ctl, (void __iomem *)hwif->io_ports.ctl_addr);
131 else
132 outb(ctl, hwif->io_ports.ctl_addr);
133}
134EXPORT_SYMBOL_GPL(ide_set_irq);
135
136void ide_tf_load(ide_drive_t *drive, ide_task_t *task)
107{ 137{
108 ide_hwif_t *hwif = drive->hwif; 138 ide_hwif_t *hwif = drive->hwif;
109 struct ide_io_ports *io_ports = &hwif->io_ports; 139 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -155,8 +185,9 @@ static void ide_tf_load(ide_drive_t *drive, ide_task_t *task)
155 tf_outb((tf->device & HIHI) | drive->select.all, 185 tf_outb((tf->device & HIHI) | drive->select.all,
156 io_ports->device_addr); 186 io_ports->device_addr);
157} 187}
188EXPORT_SYMBOL_GPL(ide_tf_load);
158 189
159static void ide_tf_read(ide_drive_t *drive, ide_task_t *task) 190void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
160{ 191{
161 ide_hwif_t *hwif = drive->hwif; 192 ide_hwif_t *hwif = drive->hwif;
162 struct ide_io_ports *io_ports = &hwif->io_ports; 193 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -188,6 +219,8 @@ static void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
188 /* be sure we're looking at the low order bits */ 219 /* be sure we're looking at the low order bits */
189 tf_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr); 220 tf_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
190 221
222 if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
223 tf->feature = tf_inb(io_ports->feature_addr);
191 if (task->tf_flags & IDE_TFLAG_IN_NSECT) 224 if (task->tf_flags & IDE_TFLAG_IN_NSECT)
192 tf->nsect = tf_inb(io_ports->nsect_addr); 225 tf->nsect = tf_inb(io_ports->nsect_addr);
193 if (task->tf_flags & IDE_TFLAG_IN_LBAL) 226 if (task->tf_flags & IDE_TFLAG_IN_LBAL)
@@ -214,6 +247,7 @@ static void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
214 tf->hob_lbah = tf_inb(io_ports->lbah_addr); 247 tf->hob_lbah = tf_inb(io_ports->lbah_addr);
215 } 248 }
216} 249}
250EXPORT_SYMBOL_GPL(ide_tf_read);
217 251
218/* 252/*
219 * Some localbus EIDE interfaces require a special access sequence 253 * Some localbus EIDE interfaces require a special access sequence
@@ -236,8 +270,8 @@ static void ata_vlb_sync(unsigned long port)
236 * so if an odd len is specified, be sure that there's at least one 270 * so if an odd len is specified, be sure that there's at least one
237 * extra byte allocated for the buffer. 271 * extra byte allocated for the buffer.
238 */ 272 */
239static void ata_input_data(ide_drive_t *drive, struct request *rq, 273void ide_input_data(ide_drive_t *drive, struct request *rq, void *buf,
240 void *buf, unsigned int len) 274 unsigned int len)
241{ 275{
242 ide_hwif_t *hwif = drive->hwif; 276 ide_hwif_t *hwif = drive->hwif;
243 struct ide_io_ports *io_ports = &hwif->io_ports; 277 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -277,12 +311,13 @@ static void ata_input_data(ide_drive_t *drive, struct request *rq,
277 insw(data_addr, buf, len / 2); 311 insw(data_addr, buf, len / 2);
278 } 312 }
279} 313}
314EXPORT_SYMBOL_GPL(ide_input_data);
280 315
281/* 316/*
282 * This is used for most PIO data transfers *to* the IDE interface 317 * This is used for most PIO data transfers *to* the IDE interface
283 */ 318 */
284static void ata_output_data(ide_drive_t *drive, struct request *rq, 319void ide_output_data(ide_drive_t *drive, struct request *rq, void *buf,
285 void *buf, unsigned int len) 320 unsigned int len)
286{ 321{
287 ide_hwif_t *hwif = drive->hwif; 322 ide_hwif_t *hwif = drive->hwif;
288 struct ide_io_ports *io_ports = &hwif->io_ports; 323 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -320,15 +355,50 @@ static void ata_output_data(ide_drive_t *drive, struct request *rq,
320 outsw(data_addr, buf, len / 2); 355 outsw(data_addr, buf, len / 2);
321 } 356 }
322} 357}
358EXPORT_SYMBOL_GPL(ide_output_data);
359
360u8 ide_read_error(ide_drive_t *drive)
361{
362 ide_task_t task;
363
364 memset(&task, 0, sizeof(task));
365 task.tf_flags = IDE_TFLAG_IN_FEATURE;
366
367 drive->hwif->tp_ops->tf_read(drive, &task);
368
369 return task.tf.error;
370}
371EXPORT_SYMBOL_GPL(ide_read_error);
323 372
324void default_hwif_transport(ide_hwif_t *hwif) 373void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason)
325{ 374{
326 hwif->tf_load = ide_tf_load; 375 ide_task_t task;
327 hwif->tf_read = ide_tf_read; 376
377 memset(&task, 0, sizeof(task));
378 task.tf_flags = IDE_TFLAG_IN_LBAH | IDE_TFLAG_IN_LBAM |
379 IDE_TFLAG_IN_NSECT;
328 380
329 hwif->input_data = ata_input_data; 381 drive->hwif->tp_ops->tf_read(drive, &task);
330 hwif->output_data = ata_output_data; 382
383 *bcount = (task.tf.lbah << 8) | task.tf.lbam;
384 *ireason = task.tf.nsect & 3;
331} 385}
386EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason);
387
388const struct ide_tp_ops default_tp_ops = {
389 .exec_command = ide_exec_command,
390 .read_status = ide_read_status,
391 .read_altstatus = ide_read_altstatus,
392 .read_sff_dma_status = ide_read_sff_dma_status,
393
394 .set_irq = ide_set_irq,
395
396 .tf_load = ide_tf_load,
397 .tf_read = ide_tf_read,
398
399 .input_data = ide_input_data,
400 .output_data = ide_output_data,
401};
332 402
333void ide_fix_driveid (struct hd_driveid *id) 403void ide_fix_driveid (struct hd_driveid *id)
334{ 404{
@@ -483,10 +553,10 @@ int drive_is_ready (ide_drive_t *drive)
483 * about possible isa-pnp and pci-pnp issues yet. 553 * about possible isa-pnp and pci-pnp issues yet.
484 */ 554 */
485 if (hwif->io_ports.ctl_addr) 555 if (hwif->io_ports.ctl_addr)
486 stat = ide_read_altstatus(drive); 556 stat = hwif->tp_ops->read_altstatus(hwif);
487 else 557 else
488 /* Note: this may clear a pending IRQ!! */ 558 /* Note: this may clear a pending IRQ!! */
489 stat = ide_read_status(drive); 559 stat = hwif->tp_ops->read_status(hwif);
490 560
491 if (stat & BUSY_STAT) 561 if (stat & BUSY_STAT)
492 /* drive busy: definitely not interrupting */ 562 /* drive busy: definitely not interrupting */
@@ -511,24 +581,26 @@ EXPORT_SYMBOL(drive_is_ready);
511 */ 581 */
512static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat) 582static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat)
513{ 583{
584 ide_hwif_t *hwif = drive->hwif;
585 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
514 unsigned long flags; 586 unsigned long flags;
515 int i; 587 int i;
516 u8 stat; 588 u8 stat;
517 589
518 udelay(1); /* spec allows drive 400ns to assert "BUSY" */ 590 udelay(1); /* spec allows drive 400ns to assert "BUSY" */
519 stat = ide_read_status(drive); 591 stat = tp_ops->read_status(hwif);
520 592
521 if (stat & BUSY_STAT) { 593 if (stat & BUSY_STAT) {
522 local_irq_set(flags); 594 local_irq_set(flags);
523 timeout += jiffies; 595 timeout += jiffies;
524 while ((stat = ide_read_status(drive)) & BUSY_STAT) { 596 while ((stat = tp_ops->read_status(hwif)) & BUSY_STAT) {
525 if (time_after(jiffies, timeout)) { 597 if (time_after(jiffies, timeout)) {
526 /* 598 /*
527 * One last read after the timeout in case 599 * One last read after the timeout in case
528 * heavy interrupt load made us not make any 600 * heavy interrupt load made us not make any
529 * progress during the timeout.. 601 * progress during the timeout..
530 */ 602 */
531 stat = ide_read_status(drive); 603 stat = tp_ops->read_status(hwif);
532 if (!(stat & BUSY_STAT)) 604 if (!(stat & BUSY_STAT))
533 break; 605 break;
534 606
@@ -548,7 +620,7 @@ static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long ti
548 */ 620 */
549 for (i = 0; i < 10; i++) { 621 for (i = 0; i < 10; i++) {
550 udelay(1); 622 udelay(1);
551 stat = ide_read_status(drive); 623 stat = tp_ops->read_status(hwif);
552 624
553 if (OK_STAT(stat, good, bad)) { 625 if (OK_STAT(stat, good, bad)) {
554 *rstat = stat; 626 *rstat = stat;
@@ -674,6 +746,7 @@ no_80w:
674int ide_driveid_update(ide_drive_t *drive) 746int ide_driveid_update(ide_drive_t *drive)
675{ 747{
676 ide_hwif_t *hwif = drive->hwif; 748 ide_hwif_t *hwif = drive->hwif;
749 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
677 struct hd_driveid *id; 750 struct hd_driveid *id;
678 unsigned long timeout, flags; 751 unsigned long timeout, flags;
679 u8 stat; 752 u8 stat;
@@ -684,9 +757,9 @@ int ide_driveid_update(ide_drive_t *drive)
684 */ 757 */
685 758
686 SELECT_MASK(drive, 1); 759 SELECT_MASK(drive, 1);
687 ide_set_irq(drive, 0); 760 tp_ops->set_irq(hwif, 0);
688 msleep(50); 761 msleep(50);
689 hwif->OUTBSYNC(hwif, WIN_IDENTIFY, hwif->io_ports.command_addr); 762 tp_ops->exec_command(hwif, WIN_IDENTIFY);
690 timeout = jiffies + WAIT_WORSTCASE; 763 timeout = jiffies + WAIT_WORSTCASE;
691 do { 764 do {
692 if (time_after(jiffies, timeout)) { 765 if (time_after(jiffies, timeout)) {
@@ -695,11 +768,11 @@ int ide_driveid_update(ide_drive_t *drive)
695 } 768 }
696 769
697 msleep(50); /* give drive a breather */ 770 msleep(50); /* give drive a breather */
698 stat = ide_read_altstatus(drive); 771 stat = tp_ops->read_altstatus(hwif);
699 } while (stat & BUSY_STAT); 772 } while (stat & BUSY_STAT);
700 773
701 msleep(50); /* wait for IRQ and DRQ_STAT */ 774 msleep(50); /* wait for IRQ and DRQ_STAT */
702 stat = ide_read_status(drive); 775 stat = tp_ops->read_status(hwif);
703 776
704 if (!OK_STAT(stat, DRQ_STAT, BAD_R_STAT)) { 777 if (!OK_STAT(stat, DRQ_STAT, BAD_R_STAT)) {
705 SELECT_MASK(drive, 0); 778 SELECT_MASK(drive, 0);
@@ -713,8 +786,8 @@ int ide_driveid_update(ide_drive_t *drive)
713 local_irq_restore(flags); 786 local_irq_restore(flags);
714 return 0; 787 return 0;
715 } 788 }
716 hwif->input_data(drive, NULL, id, SECTOR_SIZE); 789 tp_ops->input_data(drive, NULL, id, SECTOR_SIZE);
717 (void)ide_read_status(drive); /* clear drive IRQ */ 790 (void)tp_ops->read_status(hwif); /* clear drive IRQ */
718 local_irq_enable(); 791 local_irq_enable();
719 local_irq_restore(flags); 792 local_irq_restore(flags);
720 ide_fix_driveid(id); 793 ide_fix_driveid(id);
@@ -735,9 +808,10 @@ int ide_driveid_update(ide_drive_t *drive)
735int ide_config_drive_speed(ide_drive_t *drive, u8 speed) 808int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
736{ 809{
737 ide_hwif_t *hwif = drive->hwif; 810 ide_hwif_t *hwif = drive->hwif;
738 struct ide_io_ports *io_ports = &hwif->io_ports; 811 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
739 int error = 0; 812 int error = 0;
740 u8 stat; 813 u8 stat;
814 ide_task_t task;
741 815
742#ifdef CONFIG_BLK_DEV_IDEDMA 816#ifdef CONFIG_BLK_DEV_IDEDMA
743 if (hwif->dma_ops) /* check if host supports DMA */ 817 if (hwif->dma_ops) /* check if host supports DMA */
@@ -770,12 +844,19 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
770 SELECT_DRIVE(drive); 844 SELECT_DRIVE(drive);
771 SELECT_MASK(drive, 0); 845 SELECT_MASK(drive, 0);
772 udelay(1); 846 udelay(1);
773 ide_set_irq(drive, 0); 847 tp_ops->set_irq(hwif, 0);
774 hwif->OUTB(speed, io_ports->nsect_addr); 848
775 hwif->OUTB(SETFEATURES_XFER, io_ports->feature_addr); 849 memset(&task, 0, sizeof(task));
776 hwif->OUTBSYNC(hwif, WIN_SETFEATURES, io_ports->command_addr); 850 task.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT;
851 task.tf.feature = SETFEATURES_XFER;
852 task.tf.nsect = speed;
853
854 tp_ops->tf_load(drive, &task);
855
856 tp_ops->exec_command(hwif, WIN_SETFEATURES);
857
777 if (drive->quirk_list == 2) 858 if (drive->quirk_list == 2)
778 ide_set_irq(drive, 1); 859 tp_ops->set_irq(hwif, 1);
779 860
780 error = __ide_wait_stat(drive, drive->ready_stat, 861 error = __ide_wait_stat(drive, drive->ready_stat,
781 BUSY_STAT|DRQ_STAT|ERR_STAT, 862 BUSY_STAT|DRQ_STAT|ERR_STAT,
@@ -796,8 +877,7 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
796 877
797 skip: 878 skip:
798#ifdef CONFIG_BLK_DEV_IDEDMA 879#ifdef CONFIG_BLK_DEV_IDEDMA
799 if ((speed >= XFER_SW_DMA_0 || (hwif->host_flags & IDE_HFLAG_VDMA)) && 880 if (speed >= XFER_SW_DMA_0 && drive->using_dma)
800 drive->using_dma)
801 hwif->dma_ops->dma_host_set(drive, 1); 881 hwif->dma_ops->dma_host_set(drive, 1);
802 else if (hwif->dma_ops) /* check if host supports DMA */ 882 else if (hwif->dma_ops) /* check if host supports DMA */
803 ide_dma_off_quietly(drive); 883 ide_dma_off_quietly(drive);
@@ -881,7 +961,7 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
881 961
882 spin_lock_irqsave(&ide_lock, flags); 962 spin_lock_irqsave(&ide_lock, flags);
883 __ide_set_handler(drive, handler, timeout, expiry); 963 __ide_set_handler(drive, handler, timeout, expiry);
884 hwif->OUTBSYNC(hwif, cmd, hwif->io_ports.command_addr); 964 hwif->tp_ops->exec_command(hwif, cmd);
885 /* 965 /*
886 * Drive takes 400nS to respond, we must avoid the IRQ being 966 * Drive takes 400nS to respond, we must avoid the IRQ being
887 * serviced before that. 967 * serviced before that.
@@ -899,7 +979,7 @@ void ide_execute_pkt_cmd(ide_drive_t *drive)
899 unsigned long flags; 979 unsigned long flags;
900 980
901 spin_lock_irqsave(&ide_lock, flags); 981 spin_lock_irqsave(&ide_lock, flags);
902 hwif->OUTBSYNC(hwif, WIN_PACKETCMD, hwif->io_ports.command_addr); 982 hwif->tp_ops->exec_command(hwif, WIN_PACKETCMD);
903 ndelay(400); 983 ndelay(400);
904 spin_unlock_irqrestore(&ide_lock, flags); 984 spin_unlock_irqrestore(&ide_lock, flags);
905} 985}
@@ -924,12 +1004,13 @@ static ide_startstop_t do_reset1 (ide_drive_t *, int);
924 */ 1004 */
925static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) 1005static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive)
926{ 1006{
927 ide_hwgroup_t *hwgroup = HWGROUP(drive); 1007 ide_hwif_t *hwif = drive->hwif;
1008 ide_hwgroup_t *hwgroup = hwif->hwgroup;
928 u8 stat; 1009 u8 stat;
929 1010
930 SELECT_DRIVE(drive); 1011 SELECT_DRIVE(drive);
931 udelay (10); 1012 udelay (10);
932 stat = ide_read_status(drive); 1013 stat = hwif->tp_ops->read_status(hwif);
933 1014
934 if (OK_STAT(stat, 0, BUSY_STAT)) 1015 if (OK_STAT(stat, 0, BUSY_STAT))
935 printk("%s: ATAPI reset complete\n", drive->name); 1016 printk("%s: ATAPI reset complete\n", drive->name);
@@ -975,7 +1056,7 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
975 } 1056 }
976 } 1057 }
977 1058
978 tmp = ide_read_status(drive); 1059 tmp = hwif->tp_ops->read_status(hwif);
979 1060
980 if (!OK_STAT(tmp, 0, BUSY_STAT)) { 1061 if (!OK_STAT(tmp, 0, BUSY_STAT)) {
981 if (time_before(jiffies, hwgroup->poll_timeout)) { 1062 if (time_before(jiffies, hwgroup->poll_timeout)) {
@@ -1089,8 +1170,8 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1089 ide_hwif_t *hwif; 1170 ide_hwif_t *hwif;
1090 ide_hwgroup_t *hwgroup; 1171 ide_hwgroup_t *hwgroup;
1091 struct ide_io_ports *io_ports; 1172 struct ide_io_ports *io_ports;
1173 const struct ide_tp_ops *tp_ops;
1092 const struct ide_port_ops *port_ops; 1174 const struct ide_port_ops *port_ops;
1093 u8 ctl;
1094 1175
1095 spin_lock_irqsave(&ide_lock, flags); 1176 spin_lock_irqsave(&ide_lock, flags);
1096 hwif = HWIF(drive); 1177 hwif = HWIF(drive);
@@ -1098,6 +1179,8 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1098 1179
1099 io_ports = &hwif->io_ports; 1180 io_ports = &hwif->io_ports;
1100 1181
1182 tp_ops = hwif->tp_ops;
1183
1101 /* We must not reset with running handlers */ 1184 /* We must not reset with running handlers */
1102 BUG_ON(hwgroup->handler != NULL); 1185 BUG_ON(hwgroup->handler != NULL);
1103 1186
@@ -1106,7 +1189,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1106 pre_reset(drive); 1189 pre_reset(drive);
1107 SELECT_DRIVE(drive); 1190 SELECT_DRIVE(drive);
1108 udelay (20); 1191 udelay (20);
1109 hwif->OUTBSYNC(hwif, WIN_SRST, io_ports->command_addr); 1192 tp_ops->exec_command(hwif, WIN_SRST);
1110 ndelay(400); 1193 ndelay(400);
1111 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; 1194 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
1112 hwgroup->polling = 1; 1195 hwgroup->polling = 1;
@@ -1135,16 +1218,15 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1135 * immediate interrupt due to the edge transition it produces. 1218 * immediate interrupt due to the edge transition it produces.
1136 * This single interrupt gives us a "fast poll" for drives that 1219 * This single interrupt gives us a "fast poll" for drives that
1137 * recover from reset very quickly, saving us the first 50ms wait time. 1220 * recover from reset very quickly, saving us the first 50ms wait time.
1221 *
1222 * TODO: add ->softreset method and stop abusing ->set_irq
1138 */ 1223 */
1139 /* set SRST and nIEN */ 1224 /* set SRST and nIEN */
1140 hwif->OUTBSYNC(hwif, ATA_DEVCTL_OBS | 6, io_ports->ctl_addr); 1225 tp_ops->set_irq(hwif, 4);
1141 /* more than enough time */ 1226 /* more than enough time */
1142 udelay(10); 1227 udelay(10);
1143 if (drive->quirk_list == 2) 1228 /* clear SRST, leave nIEN (unless device is on the quirk list) */
1144 ctl = ATA_DEVCTL_OBS; /* clear SRST and nIEN */ 1229 tp_ops->set_irq(hwif, drive->quirk_list == 2);
1145 else
1146 ctl = ATA_DEVCTL_OBS | 2; /* clear SRST, leave nIEN */
1147 hwif->OUTBSYNC(hwif, ctl, io_ports->ctl_addr);
1148 /* more than enough time */ 1230 /* more than enough time */
1149 udelay(10); 1231 udelay(10);
1150 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; 1232 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
@@ -1189,7 +1271,7 @@ int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout)
1189 * about locking issues (2.5 work ?). 1271 * about locking issues (2.5 work ?).
1190 */ 1272 */
1191 mdelay(1); 1273 mdelay(1);
1192 stat = hwif->INB(hwif->io_ports.status_addr); 1274 stat = hwif->tp_ops->read_status(hwif);
1193 if ((stat & BUSY_STAT) == 0) 1275 if ((stat & BUSY_STAT) == 0)
1194 return 0; 1276 return 0;
1195 /* 1277 /*
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c
index 13af72f09ec4..97fefabea8b8 100644
--- a/drivers/ide/ide-lib.c
+++ b/drivers/ide/ide-lib.c
@@ -266,22 +266,11 @@ int ide_set_xfer_rate(ide_drive_t *drive, u8 rate)
266 266
267 rate = ide_rate_filter(drive, rate); 267 rate = ide_rate_filter(drive, rate);
268 268
269 BUG_ON(rate < XFER_PIO_0);
270
269 if (rate >= XFER_PIO_0 && rate <= XFER_PIO_5) 271 if (rate >= XFER_PIO_0 && rate <= XFER_PIO_5)
270 return ide_set_pio_mode(drive, rate); 272 return ide_set_pio_mode(drive, rate);
271 273
272 /*
273 * TODO: transfer modes 0x00-0x07 passed from the user-space are
274 * currently handled here which needs fixing (please note that such
275 * case could happen iff the transfer mode has already been set on
276 * the device by ide-proc.c::set_xfer_rate()).
277 */
278 if (rate < XFER_PIO_0) {
279 if (hwif->host_flags & IDE_HFLAG_ABUSE_SET_DMA_MODE)
280 return ide_set_dma_mode(drive, rate);
281 else
282 return ide_config_drive_speed(drive, rate);
283 }
284
285 return ide_set_dma_mode(drive, rate); 274 return ide_set_dma_mode(drive, rate);
286} 275}
287 276
@@ -336,7 +325,7 @@ static void ide_dump_sector(ide_drive_t *drive)
336 else 325 else
337 task.tf_flags = IDE_TFLAG_IN_LBA | IDE_TFLAG_IN_DEVICE; 326 task.tf_flags = IDE_TFLAG_IN_LBA | IDE_TFLAG_IN_DEVICE;
338 327
339 drive->hwif->tf_read(drive, &task); 328 drive->hwif->tp_ops->tf_read(drive, &task);
340 329
341 if (lba48 || (tf->device & ATA_LBA)) 330 if (lba48 || (tf->device & ATA_LBA))
342 printk(", LBAsect=%llu", 331 printk(", LBAsect=%llu",
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c
index 03f2ef5470a3..bac9b392b689 100644
--- a/drivers/ide/ide-pnp.c
+++ b/drivers/ide/ide-pnp.c
@@ -29,9 +29,10 @@ static struct pnp_device_id idepnp_devices[] = {
29 29
30static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) 30static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
31{ 31{
32 hw_regs_t hw; 32 struct ide_host *host;
33 ide_hwif_t *hwif;
34 unsigned long base, ctl; 33 unsigned long base, ctl;
34 int rc;
35 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
35 36
36 printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n"); 37 printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n");
37 38
@@ -59,31 +60,25 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
59 hw.irq = pnp_irq(dev, 0); 60 hw.irq = pnp_irq(dev, 0);
60 hw.chipset = ide_generic; 61 hw.chipset = ide_generic;
61 62
62 hwif = ide_find_port(); 63 rc = ide_host_add(NULL, hws, &host);
63 if (hwif) { 64 if (rc)
64 u8 index = hwif->index; 65 goto out;
65 u8 idx[4] = { index, 0xff, 0xff, 0xff };
66 66
67 ide_init_port_hw(hwif, &hw); 67 pnp_set_drvdata(dev, host);
68
69 pnp_set_drvdata(dev, hwif);
70
71 ide_device_add(idx, NULL);
72
73 return 0;
74 }
75 68
69 return 0;
70out:
76 release_region(ctl, 1); 71 release_region(ctl, 1);
77 release_region(base, 8); 72 release_region(base, 8);
78 73
79 return -1; 74 return rc;
80} 75}
81 76
82static void idepnp_remove(struct pnp_dev *dev) 77static void idepnp_remove(struct pnp_dev *dev)
83{ 78{
84 ide_hwif_t *hwif = pnp_get_drvdata(dev); 79 struct ide_host *host = pnp_get_drvdata(dev);
85 80
86 ide_unregister(hwif); 81 ide_host_remove(host);
87 82
88 release_region(pnp_port_start(dev, 1), 1); 83 release_region(pnp_port_start(dev, 1), 1);
89 release_region(pnp_port_start(dev, 0), 8); 84 release_region(pnp_port_start(dev, 0), 8);
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 235ebdb29b28..4aa76c453755 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -39,8 +39,6 @@
39#include <asm/uaccess.h> 39#include <asm/uaccess.h>
40#include <asm/io.h> 40#include <asm/io.h>
41 41
42static ide_hwif_t ide_hwifs[MAX_HWIFS]; /* master data repository */
43
44/** 42/**
45 * generic_id - add a generic drive id 43 * generic_id - add a generic drive id
46 * @drive: drive to make an ID block for 44 * @drive: drive to make an ID block for
@@ -126,7 +124,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
126 124
127 id = drive->id; 125 id = drive->id;
128 /* read 512 bytes of id info */ 126 /* read 512 bytes of id info */
129 hwif->input_data(drive, NULL, id, SECTOR_SIZE); 127 hwif->tp_ops->input_data(drive, NULL, id, SECTOR_SIZE);
130 128
131 drive->id_read = 1; 129 drive->id_read = 1;
132 local_irq_enable(); 130 local_irq_enable();
@@ -267,6 +265,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
267{ 265{
268 ide_hwif_t *hwif = HWIF(drive); 266 ide_hwif_t *hwif = HWIF(drive);
269 struct ide_io_ports *io_ports = &hwif->io_ports; 267 struct ide_io_ports *io_ports = &hwif->io_ports;
268 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
270 int use_altstatus = 0, rc; 269 int use_altstatus = 0, rc;
271 unsigned long timeout; 270 unsigned long timeout;
272 u8 s = 0, a = 0; 271 u8 s = 0, a = 0;
@@ -275,8 +274,8 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
275 msleep(50); 274 msleep(50);
276 275
277 if (io_ports->ctl_addr) { 276 if (io_ports->ctl_addr) {
278 a = ide_read_altstatus(drive); 277 a = tp_ops->read_altstatus(hwif);
279 s = ide_read_status(drive); 278 s = tp_ops->read_status(hwif);
280 if ((a ^ s) & ~INDEX_STAT) 279 if ((a ^ s) & ~INDEX_STAT)
281 /* ancient Seagate drives, broken interfaces */ 280 /* ancient Seagate drives, broken interfaces */
282 printk(KERN_INFO "%s: probing with STATUS(0x%02x) " 281 printk(KERN_INFO "%s: probing with STATUS(0x%02x) "
@@ -290,12 +289,18 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
290 /* set features register for atapi 289 /* set features register for atapi
291 * identify command to be sure of reply 290 * identify command to be sure of reply
292 */ 291 */
293 if ((cmd == WIN_PIDENTIFY)) 292 if (cmd == WIN_PIDENTIFY) {
294 /* disable dma & overlap */ 293 ide_task_t task;
295 hwif->OUTB(0, io_ports->feature_addr); 294
295 memset(&task, 0, sizeof(task));
296 /* disable DMA & overlap */
297 task.tf_flags = IDE_TFLAG_OUT_FEATURE;
298
299 tp_ops->tf_load(drive, &task);
300 }
296 301
297 /* ask drive for ID */ 302 /* ask drive for ID */
298 hwif->OUTBSYNC(hwif, cmd, hwif->io_ports.command_addr); 303 tp_ops->exec_command(hwif, cmd);
299 304
300 timeout = ((cmd == WIN_IDENTIFY) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2; 305 timeout = ((cmd == WIN_IDENTIFY) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
301 timeout += jiffies; 306 timeout += jiffies;
@@ -306,13 +311,13 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
306 } 311 }
307 /* give drive a breather */ 312 /* give drive a breather */
308 msleep(50); 313 msleep(50);
309 s = use_altstatus ? ide_read_altstatus(drive) 314 s = use_altstatus ? tp_ops->read_altstatus(hwif)
310 : ide_read_status(drive); 315 : tp_ops->read_status(hwif);
311 } while (s & BUSY_STAT); 316 } while (s & BUSY_STAT);
312 317
313 /* wait for IRQ and DRQ_STAT */ 318 /* wait for IRQ and DRQ_STAT */
314 msleep(50); 319 msleep(50);
315 s = ide_read_status(drive); 320 s = tp_ops->read_status(hwif);
316 321
317 if (OK_STAT(s, DRQ_STAT, BAD_R_STAT)) { 322 if (OK_STAT(s, DRQ_STAT, BAD_R_STAT)) {
318 unsigned long flags; 323 unsigned long flags;
@@ -324,7 +329,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
324 /* drive responded with ID */ 329 /* drive responded with ID */
325 rc = 0; 330 rc = 0;
326 /* clear drive IRQ */ 331 /* clear drive IRQ */
327 (void)ide_read_status(drive); 332 (void)tp_ops->read_status(hwif);
328 local_irq_restore(flags); 333 local_irq_restore(flags);
329 } else { 334 } else {
330 /* drive refused ID */ 335 /* drive refused ID */
@@ -346,6 +351,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
346static int try_to_identify (ide_drive_t *drive, u8 cmd) 351static int try_to_identify (ide_drive_t *drive, u8 cmd)
347{ 352{
348 ide_hwif_t *hwif = HWIF(drive); 353 ide_hwif_t *hwif = HWIF(drive);
354 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
349 int retval; 355 int retval;
350 int autoprobe = 0; 356 int autoprobe = 0;
351 unsigned long cookie = 0; 357 unsigned long cookie = 0;
@@ -361,7 +367,7 @@ static int try_to_identify (ide_drive_t *drive, u8 cmd)
361 autoprobe = 1; 367 autoprobe = 1;
362 cookie = probe_irq_on(); 368 cookie = probe_irq_on();
363 } 369 }
364 ide_set_irq(drive, autoprobe); 370 tp_ops->set_irq(hwif, autoprobe);
365 } 371 }
366 372
367 retval = actual_try_to_identify(drive, cmd); 373 retval = actual_try_to_identify(drive, cmd);
@@ -369,9 +375,9 @@ static int try_to_identify (ide_drive_t *drive, u8 cmd)
369 if (autoprobe) { 375 if (autoprobe) {
370 int irq; 376 int irq;
371 377
372 ide_set_irq(drive, 0); 378 tp_ops->set_irq(hwif, 0);
373 /* clear drive IRQ */ 379 /* clear drive IRQ */
374 (void)ide_read_status(drive); 380 (void)tp_ops->read_status(hwif);
375 udelay(5); 381 udelay(5);
376 irq = probe_irq_off(cookie); 382 irq = probe_irq_off(cookie);
377 if (!hwif->irq) { 383 if (!hwif->irq) {
@@ -396,7 +402,7 @@ static int ide_busy_sleep(ide_hwif_t *hwif)
396 402
397 do { 403 do {
398 msleep(50); 404 msleep(50);
399 stat = hwif->INB(hwif->io_ports.status_addr); 405 stat = hwif->tp_ops->read_status(hwif);
400 if ((stat & BUSY_STAT) == 0) 406 if ((stat & BUSY_STAT) == 0)
401 return 0; 407 return 0;
402 } while (time_before(jiffies, timeout)); 408 } while (time_before(jiffies, timeout));
@@ -404,6 +410,18 @@ static int ide_busy_sleep(ide_hwif_t *hwif)
404 return 1; 410 return 1;
405} 411}
406 412
413static u8 ide_read_device(ide_drive_t *drive)
414{
415 ide_task_t task;
416
417 memset(&task, 0, sizeof(task));
418 task.tf_flags = IDE_TFLAG_IN_DEVICE;
419
420 drive->hwif->tp_ops->tf_read(drive, &task);
421
422 return task.tf.device;
423}
424
407/** 425/**
408 * do_probe - probe an IDE device 426 * do_probe - probe an IDE device
409 * @drive: drive to probe 427 * @drive: drive to probe
@@ -428,7 +446,7 @@ static int ide_busy_sleep(ide_hwif_t *hwif)
428static int do_probe (ide_drive_t *drive, u8 cmd) 446static int do_probe (ide_drive_t *drive, u8 cmd)
429{ 447{
430 ide_hwif_t *hwif = HWIF(drive); 448 ide_hwif_t *hwif = HWIF(drive);
431 struct ide_io_ports *io_ports = &hwif->io_ports; 449 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
432 int rc; 450 int rc;
433 u8 stat; 451 u8 stat;
434 452
@@ -449,8 +467,8 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
449 msleep(50); 467 msleep(50);
450 SELECT_DRIVE(drive); 468 SELECT_DRIVE(drive);
451 msleep(50); 469 msleep(50);
452 if (hwif->INB(io_ports->device_addr) != drive->select.all && 470
453 !drive->present) { 471 if (ide_read_device(drive) != drive->select.all && !drive->present) {
454 if (drive->select.b.unit != 0) { 472 if (drive->select.b.unit != 0) {
455 /* exit with drive0 selected */ 473 /* exit with drive0 selected */
456 SELECT_DRIVE(&hwif->drives[0]); 474 SELECT_DRIVE(&hwif->drives[0]);
@@ -461,7 +479,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
461 return 3; 479 return 3;
462 } 480 }
463 481
464 stat = ide_read_status(drive); 482 stat = tp_ops->read_status(hwif);
465 483
466 if (OK_STAT(stat, READY_STAT, BUSY_STAT) || 484 if (OK_STAT(stat, READY_STAT, BUSY_STAT) ||
467 drive->present || cmd == WIN_PIDENTIFY) { 485 drive->present || cmd == WIN_PIDENTIFY) {
@@ -471,7 +489,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
471 rc = try_to_identify(drive,cmd); 489 rc = try_to_identify(drive,cmd);
472 } 490 }
473 491
474 stat = ide_read_status(drive); 492 stat = tp_ops->read_status(hwif);
475 493
476 if (stat == (BUSY_STAT | READY_STAT)) 494 if (stat == (BUSY_STAT | READY_STAT))
477 return 4; 495 return 4;
@@ -482,13 +500,13 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
482 msleep(50); 500 msleep(50);
483 SELECT_DRIVE(drive); 501 SELECT_DRIVE(drive);
484 msleep(50); 502 msleep(50);
485 hwif->OUTBSYNC(hwif, WIN_SRST, io_ports->command_addr); 503 tp_ops->exec_command(hwif, WIN_SRST);
486 (void)ide_busy_sleep(hwif); 504 (void)ide_busy_sleep(hwif);
487 rc = try_to_identify(drive, cmd); 505 rc = try_to_identify(drive, cmd);
488 } 506 }
489 507
490 /* ensure drive IRQ is clear */ 508 /* ensure drive IRQ is clear */
491 stat = ide_read_status(drive); 509 stat = tp_ops->read_status(hwif);
492 510
493 if (rc == 1) 511 if (rc == 1)
494 printk(KERN_ERR "%s: no response (status = 0x%02x)\n", 512 printk(KERN_ERR "%s: no response (status = 0x%02x)\n",
@@ -502,7 +520,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
502 SELECT_DRIVE(&hwif->drives[0]); 520 SELECT_DRIVE(&hwif->drives[0]);
503 msleep(50); 521 msleep(50);
504 /* ensure drive irq is clear */ 522 /* ensure drive irq is clear */
505 (void)ide_read_status(drive); 523 (void)tp_ops->read_status(hwif);
506 } 524 }
507 return rc; 525 return rc;
508} 526}
@@ -513,12 +531,13 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
513static void enable_nest (ide_drive_t *drive) 531static void enable_nest (ide_drive_t *drive)
514{ 532{
515 ide_hwif_t *hwif = HWIF(drive); 533 ide_hwif_t *hwif = HWIF(drive);
534 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
516 u8 stat; 535 u8 stat;
517 536
518 printk("%s: enabling %s -- ", hwif->name, drive->id->model); 537 printk("%s: enabling %s -- ", hwif->name, drive->id->model);
519 SELECT_DRIVE(drive); 538 SELECT_DRIVE(drive);
520 msleep(50); 539 msleep(50);
521 hwif->OUTBSYNC(hwif, EXABYTE_ENABLE_NEST, hwif->io_ports.command_addr); 540 tp_ops->exec_command(hwif, EXABYTE_ENABLE_NEST);
522 541
523 if (ide_busy_sleep(hwif)) { 542 if (ide_busy_sleep(hwif)) {
524 printk(KERN_CONT "failed (timeout)\n"); 543 printk(KERN_CONT "failed (timeout)\n");
@@ -527,7 +546,7 @@ static void enable_nest (ide_drive_t *drive)
527 546
528 msleep(50); 547 msleep(50);
529 548
530 stat = ide_read_status(drive); 549 stat = tp_ops->read_status(hwif);
531 550
532 if (!OK_STAT(stat, 0, BAD_STAT)) 551 if (!OK_STAT(stat, 0, BAD_STAT))
533 printk(KERN_CONT "failed (status = 0x%02x)\n", stat); 552 printk(KERN_CONT "failed (status = 0x%02x)\n", stat);
@@ -619,7 +638,7 @@ static inline u8 probe_for_drive (ide_drive_t *drive)
619 return drive->present; 638 return drive->present;
620} 639}
621 640
622static void hwif_release_dev (struct device *dev) 641static void hwif_release_dev(struct device *dev)
623{ 642{
624 ide_hwif_t *hwif = container_of(dev, ide_hwif_t, gendev); 643 ide_hwif_t *hwif = container_of(dev, ide_hwif_t, gendev);
625 644
@@ -709,7 +728,7 @@ static int ide_port_wait_ready(ide_hwif_t *hwif)
709 /* Ignore disks that we will not probe for later. */ 728 /* Ignore disks that we will not probe for later. */
710 if (!drive->noprobe || drive->present) { 729 if (!drive->noprobe || drive->present) {
711 SELECT_DRIVE(drive); 730 SELECT_DRIVE(drive);
712 ide_set_irq(drive, 1); 731 hwif->tp_ops->set_irq(hwif, 1);
713 mdelay(2); 732 mdelay(2);
714 rc = ide_wait_not_busy(hwif, 35000); 733 rc = ide_wait_not_busy(hwif, 35000);
715 if (rc) 734 if (rc)
@@ -971,6 +990,45 @@ static void ide_port_setup_devices(ide_hwif_t *hwif)
971 mutex_unlock(&ide_cfg_mtx); 990 mutex_unlock(&ide_cfg_mtx);
972} 991}
973 992
993static ide_hwif_t *ide_ports[MAX_HWIFS];
994
995void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
996{
997 ide_hwgroup_t *hwgroup = hwif->hwgroup;
998
999 ide_ports[hwif->index] = NULL;
1000
1001 spin_lock_irq(&ide_lock);
1002 /*
1003 * Remove us from the hwgroup, and free
1004 * the hwgroup if we were the only member
1005 */
1006 if (hwif->next == hwif) {
1007 BUG_ON(hwgroup->hwif != hwif);
1008 kfree(hwgroup);
1009 } else {
1010 /* There is another interface in hwgroup.
1011 * Unlink us, and set hwgroup->drive and ->hwif to
1012 * something sane.
1013 */
1014 ide_hwif_t *g = hwgroup->hwif;
1015
1016 while (g->next != hwif)
1017 g = g->next;
1018 g->next = hwif->next;
1019 if (hwgroup->hwif == hwif) {
1020 /* Chose a random hwif for hwgroup->hwif.
1021 * It's guaranteed that there are no drives
1022 * left in the hwgroup.
1023 */
1024 BUG_ON(hwgroup->drive != NULL);
1025 hwgroup->hwif = g;
1026 }
1027 BUG_ON(hwgroup->hwif == hwif);
1028 }
1029 spin_unlock_irq(&ide_lock);
1030}
1031
974/* 1032/*
975 * This routine sets up the irq for an ide interface, and creates a new 1033 * This routine sets up the irq for an ide interface, and creates a new
976 * hwgroup for the irq/hwif if none was previously assigned. 1034 * hwgroup for the irq/hwif if none was previously assigned.
@@ -998,8 +1056,9 @@ static int init_irq (ide_hwif_t *hwif)
998 * Group up with any other hwifs that share our irq(s). 1056 * Group up with any other hwifs that share our irq(s).
999 */ 1057 */
1000 for (index = 0; index < MAX_HWIFS; index++) { 1058 for (index = 0; index < MAX_HWIFS; index++) {
1001 ide_hwif_t *h = &ide_hwifs[index]; 1059 ide_hwif_t *h = ide_ports[index];
1002 if (h->hwgroup) { /* scan only initialized hwif's */ 1060
1061 if (h && h->hwgroup) { /* scan only initialized ports */
1003 if (hwif->irq == h->irq) { 1062 if (hwif->irq == h->irq) {
1004 hwif->sharing_irq = h->sharing_irq = 1; 1063 hwif->sharing_irq = h->sharing_irq = 1;
1005 if (hwif->chipset != ide_pci || 1064 if (hwif->chipset != ide_pci ||
@@ -1053,6 +1112,8 @@ static int init_irq (ide_hwif_t *hwif)
1053 hwgroup->timer.data = (unsigned long) hwgroup; 1112 hwgroup->timer.data = (unsigned long) hwgroup;
1054 } 1113 }
1055 1114
1115 ide_ports[hwif->index] = hwif;
1116
1056 /* 1117 /*
1057 * Allocate the irq, if not already obtained for another hwif 1118 * Allocate the irq, if not already obtained for another hwif
1058 */ 1119 */
@@ -1066,8 +1127,7 @@ static int init_irq (ide_hwif_t *hwif)
1066 sa = IRQF_SHARED; 1127 sa = IRQF_SHARED;
1067 1128
1068 if (io_ports->ctl_addr) 1129 if (io_ports->ctl_addr)
1069 /* clear nIEN */ 1130 hwif->tp_ops->set_irq(hwif, 1);
1070 hwif->OUTBSYNC(hwif, ATA_DEVCTL_OBS, io_ports->ctl_addr);
1071 1131
1072 if (request_irq(hwif->irq,&ide_intr,sa,hwif->name,hwgroup)) 1132 if (request_irq(hwif->irq,&ide_intr,sa,hwif->name,hwgroup))
1073 goto out_unlink; 1133 goto out_unlink;
@@ -1345,6 +1405,9 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
1345 hwif->host_flags |= d->host_flags; 1405 hwif->host_flags |= d->host_flags;
1346 hwif->pio_mask = d->pio_mask; 1406 hwif->pio_mask = d->pio_mask;
1347 1407
1408 if (d->tp_ops)
1409 hwif->tp_ops = d->tp_ops;
1410
1348 /* ->set_pio_mode for DTC2278 is currently limited to port 0 */ 1411 /* ->set_pio_mode for DTC2278 is currently limited to port 0 */
1349 if (hwif->chipset != ide_dtc2278 || hwif->channel == 0) 1412 if (hwif->chipset != ide_dtc2278 || hwif->channel == 0)
1350 hwif->port_ops = d->port_ops; 1413 hwif->port_ops = d->port_ops;
@@ -1363,6 +1426,7 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
1363 1426
1364 if (rc < 0) { 1427 if (rc < 0) {
1365 printk(KERN_INFO "%s: DMA disabled\n", hwif->name); 1428 printk(KERN_INFO "%s: DMA disabled\n", hwif->name);
1429 hwif->dma_base = 0;
1366 hwif->swdma_mask = 0; 1430 hwif->swdma_mask = 0;
1367 hwif->mwdma_mask = 0; 1431 hwif->mwdma_mask = 0;
1368 hwif->ultra_mask = 0; 1432 hwif->ultra_mask = 0;
@@ -1446,18 +1510,20 @@ static int ide_sysfs_register_port(ide_hwif_t *hwif)
1446 return rc; 1510 return rc;
1447} 1511}
1448 1512
1513static unsigned int ide_indexes;
1514
1449/** 1515/**
1450 * ide_find_port_slot - find free ide_hwifs[] slot 1516 * ide_find_port_slot - find free port slot
1451 * @d: IDE port info 1517 * @d: IDE port info
1452 * 1518 *
1453 * Return the new hwif. If we are out of free slots return NULL. 1519 * Return the new port slot index or -ENOENT if we are out of free slots.
1454 */ 1520 */
1455 1521
1456ide_hwif_t *ide_find_port_slot(const struct ide_port_info *d) 1522static int ide_find_port_slot(const struct ide_port_info *d)
1457{ 1523{
1458 ide_hwif_t *hwif; 1524 int idx = -ENOENT;
1459 int i;
1460 u8 bootable = (d && (d->host_flags & IDE_HFLAG_NON_BOOTABLE)) ? 0 : 1; 1525 u8 bootable = (d && (d->host_flags & IDE_HFLAG_NON_BOOTABLE)) ? 0 : 1;
1526 u8 i = (d && (d->host_flags & IDE_HFLAG_QD_2ND_PORT)) ? 1 : 0;;
1461 1527
1462 /* 1528 /*
1463 * Claim an unassigned slot. 1529 * Claim an unassigned slot.
@@ -1469,51 +1535,106 @@ ide_hwif_t *ide_find_port_slot(const struct ide_port_info *d)
1469 * Unless there is a bootable card that does not use the standard 1535 * Unless there is a bootable card that does not use the standard
1470 * ports 0x1f0/0x170 (the ide0/ide1 defaults). 1536 * ports 0x1f0/0x170 (the ide0/ide1 defaults).
1471 */ 1537 */
1472 if (bootable) { 1538 mutex_lock(&ide_cfg_mtx);
1473 i = (d && (d->host_flags & IDE_HFLAG_QD_2ND_PORT)) ? 1 : 0; 1539 if (MAX_HWIFS == 1) {
1474 1540 if (ide_indexes == 0 && i == 0)
1475 for (; i < MAX_HWIFS; i++) { 1541 idx = 1;
1476 hwif = &ide_hwifs[i];
1477 if (hwif->chipset == ide_unknown)
1478 goto out_found;
1479 }
1480 } else { 1542 } else {
1481 for (i = 2; i < MAX_HWIFS; i++) { 1543 if (bootable) {
1482 hwif = &ide_hwifs[i]; 1544 if ((ide_indexes | i) != (1 << MAX_HWIFS) - 1)
1483 if (hwif->chipset == ide_unknown) 1545 idx = ffz(ide_indexes | i);
1484 goto out_found; 1546 } else {
1547 if ((ide_indexes | 3) != (1 << MAX_HWIFS) - 1)
1548 idx = ffz(ide_indexes | 3);
1549 else if ((ide_indexes & 3) != 3)
1550 idx = ffz(ide_indexes);
1485 } 1551 }
1486 for (i = 0; i < 2 && i < MAX_HWIFS; i++) { 1552 }
1487 hwif = &ide_hwifs[i]; 1553 if (idx >= 0)
1488 if (hwif->chipset == ide_unknown) 1554 ide_indexes |= (1 << idx);
1489 goto out_found; 1555 mutex_unlock(&ide_cfg_mtx);
1556
1557 return idx;
1558}
1559
1560static void ide_free_port_slot(int idx)
1561{
1562 mutex_lock(&ide_cfg_mtx);
1563 ide_indexes &= ~(1 << idx);
1564 mutex_unlock(&ide_cfg_mtx);
1565}
1566
1567struct ide_host *ide_host_alloc_all(const struct ide_port_info *d,
1568 hw_regs_t **hws)
1569{
1570 struct ide_host *host;
1571 int i;
1572
1573 host = kzalloc(sizeof(*host), GFP_KERNEL);
1574 if (host == NULL)
1575 return NULL;
1576
1577 for (i = 0; i < MAX_HWIFS; i++) {
1578 ide_hwif_t *hwif;
1579 int idx;
1580
1581 if (hws[i] == NULL)
1582 continue;
1583
1584 hwif = kzalloc(sizeof(*hwif), GFP_KERNEL);
1585 if (hwif == NULL)
1586 continue;
1587
1588 idx = ide_find_port_slot(d);
1589 if (idx < 0) {
1590 printk(KERN_ERR "%s: no free slot for interface\n",
1591 d ? d->name : "ide");
1592 kfree(hwif);
1593 continue;
1490 } 1594 }
1595
1596 ide_init_port_data(hwif, idx);
1597
1598 host->ports[i] = hwif;
1599 host->n_ports++;
1491 } 1600 }
1492 1601
1493 printk(KERN_ERR "%s: no free slot for interface\n", 1602 if (host->n_ports == 0) {
1494 d ? d->name : "ide"); 1603 kfree(host);
1604 return NULL;
1605 }
1495 1606
1496 return NULL; 1607 return host;
1608}
1609EXPORT_SYMBOL_GPL(ide_host_alloc_all);
1610
1611struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws)
1612{
1613 hw_regs_t *hws_all[MAX_HWIFS];
1614 int i;
1497 1615
1498out_found: 1616 for (i = 0; i < MAX_HWIFS; i++)
1499 ide_init_port_data(hwif, i); 1617 hws_all[i] = (i < 4) ? hws[i] : NULL;
1500 return hwif; 1618
1619 return ide_host_alloc_all(d, hws_all);
1501} 1620}
1502EXPORT_SYMBOL_GPL(ide_find_port_slot); 1621EXPORT_SYMBOL_GPL(ide_host_alloc);
1503 1622
1504int ide_device_add_all(u8 *idx, const struct ide_port_info *d) 1623int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
1624 hw_regs_t **hws)
1505{ 1625{
1506 ide_hwif_t *hwif, *mate = NULL; 1626 ide_hwif_t *hwif, *mate = NULL;
1507 int i, rc = 0; 1627 int i, j = 0;
1508 1628
1509 for (i = 0; i < MAX_HWIFS; i++) { 1629 for (i = 0; i < MAX_HWIFS; i++) {
1510 if (idx[i] == 0xff) { 1630 hwif = host->ports[i];
1631
1632 if (hwif == NULL) {
1511 mate = NULL; 1633 mate = NULL;
1512 continue; 1634 continue;
1513 } 1635 }
1514 1636
1515 hwif = &ide_hwifs[idx[i]]; 1637 ide_init_port_hw(hwif, hws[i]);
1516
1517 ide_port_apply_params(hwif); 1638 ide_port_apply_params(hwif);
1518 1639
1519 if (d == NULL) { 1640 if (d == NULL) {
@@ -1534,10 +1655,10 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1534 } 1655 }
1535 1656
1536 for (i = 0; i < MAX_HWIFS; i++) { 1657 for (i = 0; i < MAX_HWIFS; i++) {
1537 if (idx[i] == 0xff) 1658 hwif = host->ports[i];
1538 continue;
1539 1659
1540 hwif = &ide_hwifs[idx[i]]; 1660 if (hwif == NULL)
1661 continue;
1541 1662
1542 if (ide_probe_port(hwif) == 0) 1663 if (ide_probe_port(hwif) == 0)
1543 hwif->present = 1; 1664 hwif->present = 1;
@@ -1551,19 +1672,20 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1551 } 1672 }
1552 1673
1553 for (i = 0; i < MAX_HWIFS; i++) { 1674 for (i = 0; i < MAX_HWIFS; i++) {
1554 if (idx[i] == 0xff) 1675 hwif = host->ports[i];
1555 continue;
1556 1676
1557 hwif = &ide_hwifs[idx[i]]; 1677 if (hwif == NULL)
1678 continue;
1558 1679
1559 if (hwif_init(hwif) == 0) { 1680 if (hwif_init(hwif) == 0) {
1560 printk(KERN_INFO "%s: failed to initialize IDE " 1681 printk(KERN_INFO "%s: failed to initialize IDE "
1561 "interface\n", hwif->name); 1682 "interface\n", hwif->name);
1562 hwif->present = 0; 1683 hwif->present = 0;
1563 rc = -1;
1564 continue; 1684 continue;
1565 } 1685 }
1566 1686
1687 j++;
1688
1567 if (hwif->present) 1689 if (hwif->present)
1568 ide_port_setup_devices(hwif); 1690 ide_port_setup_devices(hwif);
1569 1691
@@ -1574,10 +1696,10 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1574 } 1696 }
1575 1697
1576 for (i = 0; i < MAX_HWIFS; i++) { 1698 for (i = 0; i < MAX_HWIFS; i++) {
1577 if (idx[i] == 0xff) 1699 hwif = host->ports[i];
1578 continue;
1579 1700
1580 hwif = &ide_hwifs[idx[i]]; 1701 if (hwif == NULL)
1702 continue;
1581 1703
1582 if (hwif->chipset == ide_unknown) 1704 if (hwif->chipset == ide_unknown)
1583 hwif->chipset = ide_generic; 1705 hwif->chipset = ide_generic;
@@ -1587,10 +1709,10 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1587 } 1709 }
1588 1710
1589 for (i = 0; i < MAX_HWIFS; i++) { 1711 for (i = 0; i < MAX_HWIFS; i++) {
1590 if (idx[i] == 0xff) 1712 hwif = host->ports[i];
1591 continue;
1592 1713
1593 hwif = &ide_hwifs[idx[i]]; 1714 if (hwif == NULL)
1715 continue;
1594 1716
1595 ide_sysfs_register_port(hwif); 1717 ide_sysfs_register_port(hwif);
1596 ide_proc_register_port(hwif); 1718 ide_proc_register_port(hwif);
@@ -1599,21 +1721,64 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1599 ide_proc_port_register_devices(hwif); 1721 ide_proc_port_register_devices(hwif);
1600 } 1722 }
1601 1723
1602 return rc; 1724 return j ? 0 : -1;
1603} 1725}
1604EXPORT_SYMBOL_GPL(ide_device_add_all); 1726EXPORT_SYMBOL_GPL(ide_host_register);
1605 1727
1606int ide_device_add(u8 idx[4], const struct ide_port_info *d) 1728int ide_host_add(const struct ide_port_info *d, hw_regs_t **hws,
1729 struct ide_host **hostp)
1607{ 1730{
1608 u8 idx_all[MAX_HWIFS]; 1731 struct ide_host *host;
1732 int rc;
1733
1734 host = ide_host_alloc(d, hws);
1735 if (host == NULL)
1736 return -ENOMEM;
1737
1738 rc = ide_host_register(host, d, hws);
1739 if (rc) {
1740 ide_host_free(host);
1741 return rc;
1742 }
1743
1744 if (hostp)
1745 *hostp = host;
1746
1747 return 0;
1748}
1749EXPORT_SYMBOL_GPL(ide_host_add);
1750
1751void ide_host_free(struct ide_host *host)
1752{
1753 ide_hwif_t *hwif;
1609 int i; 1754 int i;
1610 1755
1611 for (i = 0; i < MAX_HWIFS; i++) 1756 for (i = 0; i < MAX_HWIFS; i++) {
1612 idx_all[i] = (i < 4) ? idx[i] : 0xff; 1757 hwif = host->ports[i];
1613 1758
1614 return ide_device_add_all(idx_all, d); 1759 if (hwif == NULL)
1760 continue;
1761
1762 ide_free_port_slot(hwif->index);
1763 kfree(hwif);
1764 }
1765
1766 kfree(host);
1615} 1767}
1616EXPORT_SYMBOL_GPL(ide_device_add); 1768EXPORT_SYMBOL_GPL(ide_host_free);
1769
1770void ide_host_remove(struct ide_host *host)
1771{
1772 int i;
1773
1774 for (i = 0; i < MAX_HWIFS; i++) {
1775 if (host->ports[i])
1776 ide_unregister(host->ports[i]);
1777 }
1778
1779 ide_host_free(host);
1780}
1781EXPORT_SYMBOL_GPL(ide_host_remove);
1617 1782
1618void ide_port_scan(ide_hwif_t *hwif) 1783void ide_port_scan(ide_hwif_t *hwif)
1619{ 1784{
@@ -1634,11 +1799,10 @@ void ide_port_scan(ide_hwif_t *hwif)
1634} 1799}
1635EXPORT_SYMBOL_GPL(ide_port_scan); 1800EXPORT_SYMBOL_GPL(ide_port_scan);
1636 1801
1637static void ide_legacy_init_one(u8 *idx, hw_regs_t *hw, u8 port_no, 1802static void ide_legacy_init_one(hw_regs_t **hws, hw_regs_t *hw,
1638 const struct ide_port_info *d, 1803 u8 port_no, const struct ide_port_info *d,
1639 unsigned long config) 1804 unsigned long config)
1640{ 1805{
1641 ide_hwif_t *hwif;
1642 unsigned long base, ctl; 1806 unsigned long base, ctl;
1643 int irq; 1807 int irq;
1644 1808
@@ -1668,33 +1832,25 @@ static void ide_legacy_init_one(u8 *idx, hw_regs_t *hw, u8 port_no,
1668 ide_std_init_ports(hw, base, ctl); 1832 ide_std_init_ports(hw, base, ctl);
1669 hw->irq = irq; 1833 hw->irq = irq;
1670 hw->chipset = d->chipset; 1834 hw->chipset = d->chipset;
1835 hw->config = config;
1671 1836
1672 hwif = ide_find_port_slot(d); 1837 hws[port_no] = hw;
1673 if (hwif) {
1674 ide_init_port_hw(hwif, hw);
1675 if (config)
1676 hwif->config_data = config;
1677 idx[port_no] = hwif->index;
1678 }
1679} 1838}
1680 1839
1681int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config) 1840int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config)
1682{ 1841{
1683 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 1842 hw_regs_t hw[2], *hws[] = { NULL, NULL, NULL, NULL };
1684 hw_regs_t hw[2];
1685 1843
1686 memset(&hw, 0, sizeof(hw)); 1844 memset(&hw, 0, sizeof(hw));
1687 1845
1688 if ((d->host_flags & IDE_HFLAG_QD_2ND_PORT) == 0) 1846 if ((d->host_flags & IDE_HFLAG_QD_2ND_PORT) == 0)
1689 ide_legacy_init_one(idx, &hw[0], 0, d, config); 1847 ide_legacy_init_one(hws, &hw[0], 0, d, config);
1690 ide_legacy_init_one(idx, &hw[1], 1, d, config); 1848 ide_legacy_init_one(hws, &hw[1], 1, d, config);
1691 1849
1692 if (idx[0] == 0xff && idx[1] == 0xff && 1850 if (hws[0] == NULL && hws[1] == NULL &&
1693 (d->host_flags & IDE_HFLAG_SINGLE)) 1851 (d->host_flags & IDE_HFLAG_SINGLE))
1694 return -ENOENT; 1852 return -ENOENT;
1695 1853
1696 ide_device_add(idx, d); 1854 return ide_host_add(d, hws, NULL);
1697
1698 return 0;
1699} 1855}
1700EXPORT_SYMBOL_GPL(ide_legacy_device_add); 1856EXPORT_SYMBOL_GPL(ide_legacy_device_add);
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c
index 8af88bf0969b..151c91e933da 100644
--- a/drivers/ide/ide-proc.c
+++ b/drivers/ide/ide-proc.c
@@ -345,7 +345,7 @@ static int set_xfer_rate (ide_drive_t *drive, int arg)
345 ide_task_t task; 345 ide_task_t task;
346 int err; 346 int err;
347 347
348 if (arg < 0 || arg > 70) 348 if (arg < XFER_PIO_0 || arg > XFER_UDMA_6)
349 return -EINVAL; 349 return -EINVAL;
350 350
351 memset(&task, 0, sizeof(task)); 351 memset(&task, 0, sizeof(task));
@@ -357,7 +357,7 @@ static int set_xfer_rate (ide_drive_t *drive, int arg)
357 357
358 err = ide_no_data_taskfile(drive, &task); 358 err = ide_no_data_taskfile(drive, &task);
359 359
360 if (!err && arg) { 360 if (!err) {
361 ide_set_xfer_rate(drive, (u8) arg); 361 ide_set_xfer_rate(drive, (u8) arg);
362 ide_driveid_update(drive); 362 ide_driveid_update(drive);
363 } 363 }
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index b711ab96e287..6962ca4891a1 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -195,23 +195,6 @@ enum {
195#define IDETAPE_BLOCK_DESCRIPTOR 0 195#define IDETAPE_BLOCK_DESCRIPTOR 0
196#define IDETAPE_CAPABILITIES_PAGE 0x2a 196#define IDETAPE_CAPABILITIES_PAGE 0x2a
197 197
198/* Tape flag bits values. */
199enum {
200 IDETAPE_FLAG_IGNORE_DSC = (1 << 0),
201 /* 0 When the tape position is unknown */
202 IDETAPE_FLAG_ADDRESS_VALID = (1 << 1),
203 /* Device already opened */
204 IDETAPE_FLAG_BUSY = (1 << 2),
205 /* Attempt to auto-detect the current user block size */
206 IDETAPE_FLAG_DETECT_BS = (1 << 3),
207 /* Currently on a filemark */
208 IDETAPE_FLAG_FILEMARK = (1 << 4),
209 /* DRQ interrupt device */
210 IDETAPE_FLAG_DRQ_INTERRUPT = (1 << 5),
211 /* 0 = no tape is loaded, so we don't rewind after ejecting */
212 IDETAPE_FLAG_MEDIUM_PRESENT = (1 << 6),
213};
214
215/* 198/*
216 * Most of our global data which we need to save even as we leave the driver due 199 * Most of our global data which we need to save even as we leave the driver due
217 * to an interrupt or a timer event is stored in the struct defined below. 200 * to an interrupt or a timer event is stored in the struct defined below.
@@ -312,8 +295,6 @@ typedef struct ide_tape_obj {
312 /* Wasted space in each stage */ 295 /* Wasted space in each stage */
313 int excess_bh_size; 296 int excess_bh_size;
314 297
315 /* Status/Action flags: long for set_bit */
316 unsigned long flags;
317 /* protects the ide-tape queue */ 298 /* protects the ide-tape queue */
318 spinlock_t lock; 299 spinlock_t lock;
319 300
@@ -398,7 +379,7 @@ static void idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
398 count = min( 379 count = min(
399 (unsigned int)(bh->b_size - atomic_read(&bh->b_count)), 380 (unsigned int)(bh->b_size - atomic_read(&bh->b_count)),
400 bcount); 381 bcount);
401 drive->hwif->input_data(drive, NULL, bh->b_data + 382 drive->hwif->tp_ops->input_data(drive, NULL, bh->b_data +
402 atomic_read(&bh->b_count), count); 383 atomic_read(&bh->b_count), count);
403 bcount -= count; 384 bcount -= count;
404 atomic_add(count, &bh->b_count); 385 atomic_add(count, &bh->b_count);
@@ -424,7 +405,7 @@ static void idetape_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
424 return; 405 return;
425 } 406 }
426 count = min((unsigned int)pc->b_count, (unsigned int)bcount); 407 count = min((unsigned int)pc->b_count, (unsigned int)bcount);
427 drive->hwif->output_data(drive, NULL, pc->b_data, count); 408 drive->hwif->tp_ops->output_data(drive, NULL, pc->b_data, count);
428 bcount -= count; 409 bcount -= count;
429 pc->b_data += count; 410 pc->b_data += count;
430 pc->b_count -= count; 411 pc->b_count -= count;
@@ -585,7 +566,6 @@ static void ide_tape_kfree_buffer(idetape_tape_t *tape)
585 bh = bh->b_reqnext; 566 bh = bh->b_reqnext;
586 kfree(prev_bh); 567 kfree(prev_bh);
587 } 568 }
588 kfree(tape->merge_bh);
589} 569}
590 570
591static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects) 571static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects)
@@ -665,7 +645,7 @@ static void ide_tape_callback(ide_drive_t *drive)
665 if (readpos[0] & 0x4) { 645 if (readpos[0] & 0x4) {
666 printk(KERN_INFO "ide-tape: Block location is unknown" 646 printk(KERN_INFO "ide-tape: Block location is unknown"
667 "to the tape\n"); 647 "to the tape\n");
668 clear_bit(IDETAPE_FLAG_ADDRESS_VALID, &tape->flags); 648 clear_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
669 uptodate = 0; 649 uptodate = 0;
670 } else { 650 } else {
671 debug_log(DBG_SENSE, "Block Location - %u\n", 651 debug_log(DBG_SENSE, "Block Location - %u\n",
@@ -673,7 +653,7 @@ static void ide_tape_callback(ide_drive_t *drive)
673 653
674 tape->partition = readpos[1]; 654 tape->partition = readpos[1];
675 tape->first_frame = be32_to_cpu(*(u32 *)&readpos[4]); 655 tape->first_frame = be32_to_cpu(*(u32 *)&readpos[4]);
676 set_bit(IDETAPE_FLAG_ADDRESS_VALID, &tape->flags); 656 set_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
677 } 657 }
678 } 658 }
679 659
@@ -690,7 +670,6 @@ static void idetape_init_pc(struct ide_atapi_pc *pc)
690 pc->buf_size = IDETAPE_PC_BUFFER_SIZE; 670 pc->buf_size = IDETAPE_PC_BUFFER_SIZE;
691 pc->bh = NULL; 671 pc->bh = NULL;
692 pc->b_data = NULL; 672 pc->b_data = NULL;
693 pc->callback = ide_tape_callback;
694} 673}
695 674
696static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc) 675static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc)
@@ -705,7 +684,7 @@ static void idetape_init_rq(struct request *rq, u8 cmd)
705{ 684{
706 blk_rq_init(NULL, rq); 685 blk_rq_init(NULL, rq);
707 rq->cmd_type = REQ_TYPE_SPECIAL; 686 rq->cmd_type = REQ_TYPE_SPECIAL;
708 rq->cmd[0] = cmd; 687 rq->cmd[13] = cmd;
709} 688}
710 689
711/* 690/*
@@ -732,6 +711,7 @@ static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,
732 rq->cmd_flags |= REQ_PREEMPT; 711 rq->cmd_flags |= REQ_PREEMPT;
733 rq->buffer = (char *) pc; 712 rq->buffer = (char *) pc;
734 rq->rq_disk = tape->disk; 713 rq->rq_disk = tape->disk;
714 memcpy(rq->cmd, pc->c, 12);
735 ide_do_drive_cmd(drive, rq); 715 ide_do_drive_cmd(drive, rq);
736} 716}
737 717
@@ -742,7 +722,6 @@ static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,
742 */ 722 */
743static void idetape_retry_pc(ide_drive_t *drive) 723static void idetape_retry_pc(ide_drive_t *drive)
744{ 724{
745 idetape_tape_t *tape = drive->driver_data;
746 struct ide_atapi_pc *pc; 725 struct ide_atapi_pc *pc;
747 struct request *rq; 726 struct request *rq;
748 727
@@ -750,7 +729,7 @@ static void idetape_retry_pc(ide_drive_t *drive)
750 pc = idetape_next_pc_storage(drive); 729 pc = idetape_next_pc_storage(drive);
751 rq = idetape_next_rq_storage(drive); 730 rq = idetape_next_rq_storage(drive);
752 idetape_create_request_sense_cmd(pc); 731 idetape_create_request_sense_cmd(pc);
753 set_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags); 732 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
754 idetape_queue_pc_head(drive, pc, rq); 733 idetape_queue_pc_head(drive, pc, rq);
755} 734}
756 735
@@ -887,7 +866,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
887 pc->error = IDETAPE_ERROR_GENERAL; 866 pc->error = IDETAPE_ERROR_GENERAL;
888 } 867 }
889 tape->failed_pc = NULL; 868 tape->failed_pc = NULL;
890 pc->callback(drive); 869 drive->pc_callback(drive);
891 return ide_stopped; 870 return ide_stopped;
892 } 871 }
893 debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]); 872 debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]);
@@ -927,11 +906,12 @@ static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
927 906
928static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) 907static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
929{ 908{
909 ide_hwif_t *hwif = drive->hwif;
930 idetape_tape_t *tape = drive->driver_data; 910 idetape_tape_t *tape = drive->driver_data;
931 struct ide_atapi_pc *pc = tape->pc; 911 struct ide_atapi_pc *pc = tape->pc;
932 u8 stat; 912 u8 stat;
933 913
934 stat = ide_read_status(drive); 914 stat = hwif->tp_ops->read_status(hwif);
935 915
936 if (stat & SEEK_STAT) { 916 if (stat & SEEK_STAT) {
937 if (stat & ERR_STAT) { 917 if (stat & ERR_STAT) {
@@ -948,14 +928,17 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
948 pc->error = IDETAPE_ERROR_GENERAL; 928 pc->error = IDETAPE_ERROR_GENERAL;
949 tape->failed_pc = NULL; 929 tape->failed_pc = NULL;
950 } 930 }
951 pc->callback(drive); 931 drive->pc_callback(drive);
952 return ide_stopped; 932 return ide_stopped;
953} 933}
954 934
955static void ide_tape_create_rw_cmd(idetape_tape_t *tape, 935static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
956 struct ide_atapi_pc *pc, unsigned int length, 936 struct ide_atapi_pc *pc, struct request *rq,
957 struct idetape_bh *bh, u8 opcode) 937 u8 opcode)
958{ 938{
939 struct idetape_bh *bh = (struct idetape_bh *)rq->special;
940 unsigned int length = rq->current_nr_sectors;
941
959 idetape_init_pc(pc); 942 idetape_init_pc(pc);
960 put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); 943 put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
961 pc->c[1] = 1; 944 pc->c[1] = 1;
@@ -975,11 +958,14 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
975 pc->b_data = bh->b_data; 958 pc->b_data = bh->b_data;
976 pc->b_count = atomic_read(&bh->b_count); 959 pc->b_count = atomic_read(&bh->b_count);
977 } 960 }
961
962 memcpy(rq->cmd, pc->c, 12);
978} 963}
979 964
980static ide_startstop_t idetape_do_request(ide_drive_t *drive, 965static ide_startstop_t idetape_do_request(ide_drive_t *drive,
981 struct request *rq, sector_t block) 966 struct request *rq, sector_t block)
982{ 967{
968 ide_hwif_t *hwif = drive->hwif;
983 idetape_tape_t *tape = drive->driver_data; 969 idetape_tape_t *tape = drive->driver_data;
984 struct ide_atapi_pc *pc = NULL; 970 struct ide_atapi_pc *pc = NULL;
985 struct request *postponed_rq = tape->postponed_rq; 971 struct request *postponed_rq = tape->postponed_rq;
@@ -1017,17 +1003,17 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
1017 * If the tape is still busy, postpone our request and service 1003 * If the tape is still busy, postpone our request and service
1018 * the other device meanwhile. 1004 * the other device meanwhile.
1019 */ 1005 */
1020 stat = ide_read_status(drive); 1006 stat = hwif->tp_ops->read_status(hwif);
1021 1007
1022 if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2)) 1008 if (!drive->dsc_overlap && !(rq->cmd[13] & REQ_IDETAPE_PC2))
1023 set_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags); 1009 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
1024 1010
1025 if (drive->post_reset == 1) { 1011 if (drive->post_reset == 1) {
1026 set_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags); 1012 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
1027 drive->post_reset = 0; 1013 drive->post_reset = 0;
1028 } 1014 }
1029 1015
1030 if (!test_and_clear_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags) && 1016 if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) &&
1031 (stat & SEEK_STAT) == 0) { 1017 (stat & SEEK_STAT) == 0) {
1032 if (postponed_rq == NULL) { 1018 if (postponed_rq == NULL) {
1033 tape->dsc_polling_start = jiffies; 1019 tape->dsc_polling_start = jiffies;
@@ -1036,7 +1022,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
1036 } else if (time_after(jiffies, tape->dsc_timeout)) { 1022 } else if (time_after(jiffies, tape->dsc_timeout)) {
1037 printk(KERN_ERR "ide-tape: %s: DSC timeout\n", 1023 printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
1038 tape->name); 1024 tape->name);
1039 if (rq->cmd[0] & REQ_IDETAPE_PC2) { 1025 if (rq->cmd[13] & REQ_IDETAPE_PC2) {
1040 idetape_media_access_finished(drive); 1026 idetape_media_access_finished(drive);
1041 return ide_stopped; 1027 return ide_stopped;
1042 } else { 1028 } else {
@@ -1049,35 +1035,29 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
1049 idetape_postpone_request(drive); 1035 idetape_postpone_request(drive);
1050 return ide_stopped; 1036 return ide_stopped;
1051 } 1037 }
1052 if (rq->cmd[0] & REQ_IDETAPE_READ) { 1038 if (rq->cmd[13] & REQ_IDETAPE_READ) {
1053 pc = idetape_next_pc_storage(drive); 1039 pc = idetape_next_pc_storage(drive);
1054 ide_tape_create_rw_cmd(tape, pc, rq->current_nr_sectors, 1040 ide_tape_create_rw_cmd(tape, pc, rq, READ_6);
1055 (struct idetape_bh *)rq->special,
1056 READ_6);
1057 goto out; 1041 goto out;
1058 } 1042 }
1059 if (rq->cmd[0] & REQ_IDETAPE_WRITE) { 1043 if (rq->cmd[13] & REQ_IDETAPE_WRITE) {
1060 pc = idetape_next_pc_storage(drive); 1044 pc = idetape_next_pc_storage(drive);
1061 ide_tape_create_rw_cmd(tape, pc, rq->current_nr_sectors, 1045 ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6);
1062 (struct idetape_bh *)rq->special,
1063 WRITE_6);
1064 goto out; 1046 goto out;
1065 } 1047 }
1066 if (rq->cmd[0] & REQ_IDETAPE_PC1) { 1048 if (rq->cmd[13] & REQ_IDETAPE_PC1) {
1067 pc = (struct ide_atapi_pc *) rq->buffer; 1049 pc = (struct ide_atapi_pc *) rq->buffer;
1068 rq->cmd[0] &= ~(REQ_IDETAPE_PC1); 1050 rq->cmd[13] &= ~(REQ_IDETAPE_PC1);
1069 rq->cmd[0] |= REQ_IDETAPE_PC2; 1051 rq->cmd[13] |= REQ_IDETAPE_PC2;
1070 goto out; 1052 goto out;
1071 } 1053 }
1072 if (rq->cmd[0] & REQ_IDETAPE_PC2) { 1054 if (rq->cmd[13] & REQ_IDETAPE_PC2) {
1073 idetape_media_access_finished(drive); 1055 idetape_media_access_finished(drive);
1074 return ide_stopped; 1056 return ide_stopped;
1075 } 1057 }
1076 BUG(); 1058 BUG();
1077out:
1078 if (test_bit(IDETAPE_FLAG_DRQ_INTERRUPT, &tape->flags))
1079 pc->flags |= PC_FLAG_DRQ_INTERRUPT;
1080 1059
1060out:
1081 return idetape_issue_pc(drive, pc); 1061 return idetape_issue_pc(drive, pc);
1082} 1062}
1083 1063
@@ -1281,8 +1261,9 @@ static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
1281 1261
1282 rq = blk_get_request(drive->queue, READ, __GFP_WAIT); 1262 rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
1283 rq->cmd_type = REQ_TYPE_SPECIAL; 1263 rq->cmd_type = REQ_TYPE_SPECIAL;
1284 rq->cmd[0] = REQ_IDETAPE_PC1; 1264 rq->cmd[13] = REQ_IDETAPE_PC1;
1285 rq->buffer = (char *)pc; 1265 rq->buffer = (char *)pc;
1266 memcpy(rq->cmd, pc->c, 12);
1286 error = blk_execute_rq(drive->queue, tape->disk, rq, 0); 1267 error = blk_execute_rq(drive->queue, tape->disk, rq, 0);
1287 blk_put_request(rq); 1268 blk_put_request(rq);
1288 return error; 1269 return error;
@@ -1304,7 +1285,7 @@ static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)
1304 int load_attempted = 0; 1285 int load_attempted = 0;
1305 1286
1306 /* Wait for the tape to become ready */ 1287 /* Wait for the tape to become ready */
1307 set_bit(IDETAPE_FLAG_MEDIUM_PRESENT, &tape->flags); 1288 set_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
1308 timeout += jiffies; 1289 timeout += jiffies;
1309 while (time_before(jiffies, timeout)) { 1290 while (time_before(jiffies, timeout)) {
1310 idetape_create_test_unit_ready_cmd(&pc); 1291 idetape_create_test_unit_ready_cmd(&pc);
@@ -1397,7 +1378,7 @@ static void __ide_tape_discard_merge_buffer(ide_drive_t *drive)
1397 if (tape->chrdev_dir != IDETAPE_DIR_READ) 1378 if (tape->chrdev_dir != IDETAPE_DIR_READ)
1398 return; 1379 return;
1399 1380
1400 clear_bit(IDETAPE_FLAG_FILEMARK, &tape->flags); 1381 clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags);
1401 tape->merge_bh_size = 0; 1382 tape->merge_bh_size = 0;
1402 if (tape->merge_bh != NULL) { 1383 if (tape->merge_bh != NULL) {
1403 ide_tape_kfree_buffer(tape); 1384 ide_tape_kfree_buffer(tape);
@@ -1465,7 +1446,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
1465 1446
1466 rq = blk_get_request(drive->queue, READ, __GFP_WAIT); 1447 rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
1467 rq->cmd_type = REQ_TYPE_SPECIAL; 1448 rq->cmd_type = REQ_TYPE_SPECIAL;
1468 rq->cmd[0] = cmd; 1449 rq->cmd[13] = cmd;
1469 rq->rq_disk = tape->disk; 1450 rq->rq_disk = tape->disk;
1470 rq->special = (void *)bh; 1451 rq->special = (void *)bh;
1471 rq->sector = tape->first_frame; 1452 rq->sector = tape->first_frame;
@@ -1636,7 +1617,7 @@ static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks)
1636 debug_log(DBG_PROCS, "Enter %s, %d blocks\n", __func__, blocks); 1617 debug_log(DBG_PROCS, "Enter %s, %d blocks\n", __func__, blocks);
1637 1618
1638 /* If we are at a filemark, return a read length of 0 */ 1619 /* If we are at a filemark, return a read length of 0 */
1639 if (test_bit(IDETAPE_FLAG_FILEMARK, &tape->flags)) 1620 if (test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
1640 return 0; 1621 return 0;
1641 1622
1642 idetape_init_read(drive); 1623 idetape_init_read(drive);
@@ -1746,7 +1727,7 @@ static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
1746 1727
1747 if (tape->chrdev_dir == IDETAPE_DIR_READ) { 1728 if (tape->chrdev_dir == IDETAPE_DIR_READ) {
1748 tape->merge_bh_size = 0; 1729 tape->merge_bh_size = 0;
1749 if (test_and_clear_bit(IDETAPE_FLAG_FILEMARK, &tape->flags)) 1730 if (test_and_clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
1750 ++count; 1731 ++count;
1751 ide_tape_discard_merge_buffer(drive, 0); 1732 ide_tape_discard_merge_buffer(drive, 0);
1752 } 1733 }
@@ -1801,7 +1782,7 @@ static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
1801 debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); 1782 debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count);
1802 1783
1803 if (tape->chrdev_dir != IDETAPE_DIR_READ) { 1784 if (tape->chrdev_dir != IDETAPE_DIR_READ) {
1804 if (test_bit(IDETAPE_FLAG_DETECT_BS, &tape->flags)) 1785 if (test_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags))
1805 if (count > tape->blk_size && 1786 if (count > tape->blk_size &&
1806 (count % tape->blk_size) == 0) 1787 (count % tape->blk_size) == 0)
1807 tape->user_bs_factor = count / tape->blk_size; 1788 tape->user_bs_factor = count / tape->blk_size;
@@ -1841,7 +1822,7 @@ static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
1841 tape->merge_bh_size = bytes_read-temp; 1822 tape->merge_bh_size = bytes_read-temp;
1842 } 1823 }
1843finish: 1824finish:
1844 if (!actually_read && test_bit(IDETAPE_FLAG_FILEMARK, &tape->flags)) { 1825 if (!actually_read && test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) {
1845 debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name); 1826 debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name);
1846 1827
1847 idetape_space_over_filemarks(drive, MTFSF, 1); 1828 idetape_space_over_filemarks(drive, MTFSF, 1);
@@ -2027,7 +2008,7 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
2027 !IDETAPE_LU_LOAD_MASK); 2008 !IDETAPE_LU_LOAD_MASK);
2028 retval = idetape_queue_pc_tail(drive, &pc); 2009 retval = idetape_queue_pc_tail(drive, &pc);
2029 if (!retval) 2010 if (!retval)
2030 clear_bit(IDETAPE_FLAG_MEDIUM_PRESENT, &tape->flags); 2011 clear_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
2031 return retval; 2012 return retval;
2032 case MTNOP: 2013 case MTNOP:
2033 ide_tape_discard_merge_buffer(drive, 0); 2014 ide_tape_discard_merge_buffer(drive, 0);
@@ -2050,9 +2031,9 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
2050 mt_count % tape->blk_size) 2031 mt_count % tape->blk_size)
2051 return -EIO; 2032 return -EIO;
2052 tape->user_bs_factor = mt_count / tape->blk_size; 2033 tape->user_bs_factor = mt_count / tape->blk_size;
2053 clear_bit(IDETAPE_FLAG_DETECT_BS, &tape->flags); 2034 clear_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
2054 } else 2035 } else
2055 set_bit(IDETAPE_FLAG_DETECT_BS, &tape->flags); 2036 set_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
2056 return 0; 2037 return 0;
2057 case MTSEEK: 2038 case MTSEEK:
2058 ide_tape_discard_merge_buffer(drive, 0); 2039 ide_tape_discard_merge_buffer(drive, 0);
@@ -2202,20 +2183,20 @@ static int idetape_chrdev_open(struct inode *inode, struct file *filp)
2202 2183
2203 filp->private_data = tape; 2184 filp->private_data = tape;
2204 2185
2205 if (test_and_set_bit(IDETAPE_FLAG_BUSY, &tape->flags)) { 2186 if (test_and_set_bit(IDE_AFLAG_BUSY, &drive->atapi_flags)) {
2206 retval = -EBUSY; 2187 retval = -EBUSY;
2207 goto out_put_tape; 2188 goto out_put_tape;
2208 } 2189 }
2209 2190
2210 retval = idetape_wait_ready(drive, 60 * HZ); 2191 retval = idetape_wait_ready(drive, 60 * HZ);
2211 if (retval) { 2192 if (retval) {
2212 clear_bit(IDETAPE_FLAG_BUSY, &tape->flags); 2193 clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
2213 printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name); 2194 printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
2214 goto out_put_tape; 2195 goto out_put_tape;
2215 } 2196 }
2216 2197
2217 idetape_read_position(drive); 2198 idetape_read_position(drive);
2218 if (!test_bit(IDETAPE_FLAG_ADDRESS_VALID, &tape->flags)) 2199 if (!test_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags))
2219 (void)idetape_rewind_tape(drive); 2200 (void)idetape_rewind_tape(drive);
2220 2201
2221 /* Read block size and write protect status from drive. */ 2202 /* Read block size and write protect status from drive. */
@@ -2231,7 +2212,7 @@ static int idetape_chrdev_open(struct inode *inode, struct file *filp)
2231 if (tape->write_prot) { 2212 if (tape->write_prot) {
2232 if ((filp->f_flags & O_ACCMODE) == O_WRONLY || 2213 if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
2233 (filp->f_flags & O_ACCMODE) == O_RDWR) { 2214 (filp->f_flags & O_ACCMODE) == O_RDWR) {
2234 clear_bit(IDETAPE_FLAG_BUSY, &tape->flags); 2215 clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
2235 retval = -EROFS; 2216 retval = -EROFS;
2236 goto out_put_tape; 2217 goto out_put_tape;
2237 } 2218 }
@@ -2291,7 +2272,7 @@ static int idetape_chrdev_release(struct inode *inode, struct file *filp)
2291 ide_tape_discard_merge_buffer(drive, 1); 2272 ide_tape_discard_merge_buffer(drive, 1);
2292 } 2273 }
2293 2274
2294 if (minor < 128 && test_bit(IDETAPE_FLAG_MEDIUM_PRESENT, &tape->flags)) 2275 if (minor < 128 && test_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags))
2295 (void) idetape_rewind_tape(drive); 2276 (void) idetape_rewind_tape(drive);
2296 if (tape->chrdev_dir == IDETAPE_DIR_NONE) { 2277 if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
2297 if (tape->door_locked == DOOR_LOCKED) { 2278 if (tape->door_locked == DOOR_LOCKED) {
@@ -2301,7 +2282,7 @@ static int idetape_chrdev_release(struct inode *inode, struct file *filp)
2301 } 2282 }
2302 } 2283 }
2303 } 2284 }
2304 clear_bit(IDETAPE_FLAG_BUSY, &tape->flags); 2285 clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
2305 ide_tape_put(tape); 2286 ide_tape_put(tape);
2306 unlock_kernel(); 2287 unlock_kernel();
2307 return 0; 2288 return 0;
@@ -2464,6 +2445,8 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
2464 u8 gcw[2]; 2445 u8 gcw[2];
2465 u16 *ctl = (u16 *)&tape->caps[12]; 2446 u16 *ctl = (u16 *)&tape->caps[12];
2466 2447
2448 drive->pc_callback = ide_tape_callback;
2449
2467 spin_lock_init(&tape->lock); 2450 spin_lock_init(&tape->lock);
2468 drive->dsc_overlap = 1; 2451 drive->dsc_overlap = 1;
2469 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) { 2452 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) {
@@ -2484,7 +2467,7 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
2484 2467
2485 /* Command packet DRQ type */ 2468 /* Command packet DRQ type */
2486 if (((gcw[0] & 0x60) >> 5) == 1) 2469 if (((gcw[0] & 0x60) >> 5) == 1)
2487 set_bit(IDETAPE_FLAG_DRQ_INTERRUPT, &tape->flags); 2470 set_bit(IDE_AFLAG_DRQ_INTERRUPT, &drive->atapi_flags);
2488 2471
2489 idetape_get_inquiry_results(drive); 2472 idetape_get_inquiry_results(drive);
2490 idetape_get_mode_sense_results(drive); 2473 idetape_get_mode_sense_results(drive);
@@ -2697,10 +2680,12 @@ static int ide_tape_probe(ide_drive_t *drive)
2697 2680
2698 idetape_setup(drive, tape, minor); 2681 idetape_setup(drive, tape, minor);
2699 2682
2700 device_create(idetape_sysfs_class, &drive->gendev, 2683 device_create_drvdata(idetape_sysfs_class, &drive->gendev,
2701 MKDEV(IDETAPE_MAJOR, minor), "%s", tape->name); 2684 MKDEV(IDETAPE_MAJOR, minor), NULL,
2702 device_create(idetape_sysfs_class, &drive->gendev, 2685 "%s", tape->name);
2703 MKDEV(IDETAPE_MAJOR, minor + 128), "n%s", tape->name); 2686 device_create_drvdata(idetape_sysfs_class, &drive->gendev,
2687 MKDEV(IDETAPE_MAJOR, minor + 128), NULL,
2688 "n%s", tape->name);
2704 2689
2705 g->fops = &idetape_block_ops; 2690 g->fops = &idetape_block_ops;
2706 ide_register_region(g); 2691 ide_register_region(g);
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index 1fbdb746dc88..aeddbbd69e86 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -64,6 +64,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
64 ide_hwif_t *hwif = HWIF(drive); 64 ide_hwif_t *hwif = HWIF(drive);
65 struct ide_taskfile *tf = &task->tf; 65 struct ide_taskfile *tf = &task->tf;
66 ide_handler_t *handler = NULL; 66 ide_handler_t *handler = NULL;
67 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
67 const struct ide_dma_ops *dma_ops = hwif->dma_ops; 68 const struct ide_dma_ops *dma_ops = hwif->dma_ops;
68 69
69 if (task->data_phase == TASKFILE_MULTI_IN || 70 if (task->data_phase == TASKFILE_MULTI_IN ||
@@ -80,15 +81,15 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
80 81
81 if ((task->tf_flags & IDE_TFLAG_DMA_PIO_FALLBACK) == 0) { 82 if ((task->tf_flags & IDE_TFLAG_DMA_PIO_FALLBACK) == 0) {
82 ide_tf_dump(drive->name, tf); 83 ide_tf_dump(drive->name, tf);
83 ide_set_irq(drive, 1); 84 tp_ops->set_irq(hwif, 1);
84 SELECT_MASK(drive, 0); 85 SELECT_MASK(drive, 0);
85 hwif->tf_load(drive, task); 86 tp_ops->tf_load(drive, task);
86 } 87 }
87 88
88 switch (task->data_phase) { 89 switch (task->data_phase) {
89 case TASKFILE_MULTI_OUT: 90 case TASKFILE_MULTI_OUT:
90 case TASKFILE_OUT: 91 case TASKFILE_OUT:
91 hwif->OUTBSYNC(hwif, tf->command, hwif->io_ports.command_addr); 92 tp_ops->exec_command(hwif, tf->command);
92 ndelay(400); /* FIXME */ 93 ndelay(400); /* FIXME */
93 return pre_task_out_intr(drive, task->rq); 94 return pre_task_out_intr(drive, task->rq);
94 case TASKFILE_MULTI_IN: 95 case TASKFILE_MULTI_IN:
@@ -124,7 +125,8 @@ EXPORT_SYMBOL_GPL(do_rw_taskfile);
124 */ 125 */
125static ide_startstop_t set_multmode_intr(ide_drive_t *drive) 126static ide_startstop_t set_multmode_intr(ide_drive_t *drive)
126{ 127{
127 u8 stat = ide_read_status(drive); 128 ide_hwif_t *hwif = drive->hwif;
129 u8 stat = hwif->tp_ops->read_status(hwif);
128 130
129 if (OK_STAT(stat, READY_STAT, BAD_STAT)) 131 if (OK_STAT(stat, READY_STAT, BAD_STAT))
130 drive->mult_count = drive->mult_req; 132 drive->mult_count = drive->mult_req;
@@ -141,11 +143,16 @@ static ide_startstop_t set_multmode_intr(ide_drive_t *drive)
141 */ 143 */
142static ide_startstop_t set_geometry_intr(ide_drive_t *drive) 144static ide_startstop_t set_geometry_intr(ide_drive_t *drive)
143{ 145{
146 ide_hwif_t *hwif = drive->hwif;
144 int retries = 5; 147 int retries = 5;
145 u8 stat; 148 u8 stat;
146 149
147 while (((stat = ide_read_status(drive)) & BUSY_STAT) && retries--) 150 while (1) {
151 stat = hwif->tp_ops->read_status(hwif);
152 if ((stat & BUSY_STAT) == 0 || retries-- == 0)
153 break;
148 udelay(10); 154 udelay(10);
155 };
149 156
150 if (OK_STAT(stat, READY_STAT, BAD_STAT)) 157 if (OK_STAT(stat, READY_STAT, BAD_STAT))
151 return ide_stopped; 158 return ide_stopped;
@@ -162,7 +169,8 @@ static ide_startstop_t set_geometry_intr(ide_drive_t *drive)
162 */ 169 */
163static ide_startstop_t recal_intr(ide_drive_t *drive) 170static ide_startstop_t recal_intr(ide_drive_t *drive)
164{ 171{
165 u8 stat = ide_read_status(drive); 172 ide_hwif_t *hwif = drive->hwif;
173 u8 stat = hwif->tp_ops->read_status(hwif);
166 174
167 if (!OK_STAT(stat, READY_STAT, BAD_STAT)) 175 if (!OK_STAT(stat, READY_STAT, BAD_STAT))
168 return ide_error(drive, "recal_intr", stat); 176 return ide_error(drive, "recal_intr", stat);
@@ -174,11 +182,12 @@ static ide_startstop_t recal_intr(ide_drive_t *drive)
174 */ 182 */
175static ide_startstop_t task_no_data_intr(ide_drive_t *drive) 183static ide_startstop_t task_no_data_intr(ide_drive_t *drive)
176{ 184{
177 ide_task_t *args = HWGROUP(drive)->rq->special; 185 ide_hwif_t *hwif = drive->hwif;
186 ide_task_t *args = hwif->hwgroup->rq->special;
178 u8 stat; 187 u8 stat;
179 188
180 local_irq_enable_in_hardirq(); 189 local_irq_enable_in_hardirq();
181 stat = ide_read_status(drive); 190 stat = hwif->tp_ops->read_status(hwif);
182 191
183 if (!OK_STAT(stat, READY_STAT, BAD_STAT)) 192 if (!OK_STAT(stat, READY_STAT, BAD_STAT))
184 return ide_error(drive, "task_no_data_intr", stat); 193 return ide_error(drive, "task_no_data_intr", stat);
@@ -192,6 +201,7 @@ static ide_startstop_t task_no_data_intr(ide_drive_t *drive)
192 201
193static u8 wait_drive_not_busy(ide_drive_t *drive) 202static u8 wait_drive_not_busy(ide_drive_t *drive)
194{ 203{
204 ide_hwif_t *hwif = drive->hwif;
195 int retries; 205 int retries;
196 u8 stat; 206 u8 stat;
197 207
@@ -200,7 +210,7 @@ static u8 wait_drive_not_busy(ide_drive_t *drive)
200 * take up to 6 ms on some ATAPI devices, so we will wait max 10 ms. 210 * take up to 6 ms on some ATAPI devices, so we will wait max 10 ms.
201 */ 211 */
202 for (retries = 0; retries < 1000; retries++) { 212 for (retries = 0; retries < 1000; retries++) {
203 stat = ide_read_status(drive); 213 stat = hwif->tp_ops->read_status(hwif);
204 214
205 if (stat & BUSY_STAT) 215 if (stat & BUSY_STAT)
206 udelay(10); 216 udelay(10);
@@ -255,9 +265,9 @@ static void ide_pio_sector(ide_drive_t *drive, struct request *rq,
255 265
256 /* do the actual data transfer */ 266 /* do the actual data transfer */
257 if (write) 267 if (write)
258 hwif->output_data(drive, rq, buf, SECTOR_SIZE); 268 hwif->tp_ops->output_data(drive, rq, buf, SECTOR_SIZE);
259 else 269 else
260 hwif->input_data(drive, rq, buf, SECTOR_SIZE); 270 hwif->tp_ops->input_data(drive, rq, buf, SECTOR_SIZE);
261 271
262 kunmap_atomic(buf, KM_BIO_SRC_IRQ); 272 kunmap_atomic(buf, KM_BIO_SRC_IRQ);
263#ifdef CONFIG_HIGHMEM 273#ifdef CONFIG_HIGHMEM
@@ -383,8 +393,8 @@ static ide_startstop_t task_in_unexpected(ide_drive_t *drive, struct request *rq
383static ide_startstop_t task_in_intr(ide_drive_t *drive) 393static ide_startstop_t task_in_intr(ide_drive_t *drive)
384{ 394{
385 ide_hwif_t *hwif = drive->hwif; 395 ide_hwif_t *hwif = drive->hwif;
386 struct request *rq = HWGROUP(drive)->rq; 396 struct request *rq = hwif->hwgroup->rq;
387 u8 stat = ide_read_status(drive); 397 u8 stat = hwif->tp_ops->read_status(hwif);
388 398
389 /* Error? */ 399 /* Error? */
390 if (stat & ERR_STAT) 400 if (stat & ERR_STAT)
@@ -418,7 +428,7 @@ static ide_startstop_t task_out_intr (ide_drive_t *drive)
418{ 428{
419 ide_hwif_t *hwif = drive->hwif; 429 ide_hwif_t *hwif = drive->hwif;
420 struct request *rq = HWGROUP(drive)->rq; 430 struct request *rq = HWGROUP(drive)->rq;
421 u8 stat = ide_read_status(drive); 431 u8 stat = hwif->tp_ops->read_status(hwif);
422 432
423 if (!OK_STAT(stat, DRIVE_READY, drive->bad_wstat)) 433 if (!OK_STAT(stat, DRIVE_READY, drive->bad_wstat))
424 return task_error(drive, rq, __func__, stat); 434 return task_error(drive, rq, __func__, stat);
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index d4a6b102a772..60f0ca66aa93 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Copyright (C) 1994-1998 Linus Torvalds & authors (see below) 2 * Copyright (C) 1994-1998 Linus Torvalds & authors (see below)
3 * Copyrifht (C) 2003-2005, 2007 Bartlomiej Zolnierkiewicz 3 * Copyright (C) 2003-2005, 2007 Bartlomiej Zolnierkiewicz
4 */ 4 */
5 5
6/* 6/*
@@ -101,8 +101,7 @@ void ide_init_port_data(ide_hwif_t *hwif, unsigned int index)
101 101
102 init_completion(&hwif->gendev_rel_comp); 102 init_completion(&hwif->gendev_rel_comp);
103 103
104 default_hwif_iops(hwif); 104 hwif->tp_ops = &default_tp_ops;
105 default_hwif_transport(hwif);
106 105
107 ide_port_init_devices_data(hwif); 106 ide_port_init_devices_data(hwif);
108} 107}
@@ -134,41 +133,6 @@ static void ide_port_init_devices_data(ide_hwif_t *hwif)
134 } 133 }
135} 134}
136 135
137void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
138{
139 ide_hwgroup_t *hwgroup = hwif->hwgroup;
140
141 spin_lock_irq(&ide_lock);
142 /*
143 * Remove us from the hwgroup, and free
144 * the hwgroup if we were the only member
145 */
146 if (hwif->next == hwif) {
147 BUG_ON(hwgroup->hwif != hwif);
148 kfree(hwgroup);
149 } else {
150 /* There is another interface in hwgroup.
151 * Unlink us, and set hwgroup->drive and ->hwif to
152 * something sane.
153 */
154 ide_hwif_t *g = hwgroup->hwif;
155
156 while (g->next != hwif)
157 g = g->next;
158 g->next = hwif->next;
159 if (hwgroup->hwif == hwif) {
160 /* Chose a random hwif for hwgroup->hwif.
161 * It's guaranteed that there are no drives
162 * left in the hwgroup.
163 */
164 BUG_ON(hwgroup->drive != NULL);
165 hwgroup->hwif = g;
166 }
167 BUG_ON(hwgroup->hwif == hwif);
168 }
169 spin_unlock_irq(&ide_lock);
170}
171
172/* Called with ide_lock held. */ 136/* Called with ide_lock held. */
173static void __ide_port_unregister_devices(ide_hwif_t *hwif) 137static void __ide_port_unregister_devices(ide_hwif_t *hwif)
174{ 138{
@@ -269,16 +233,9 @@ void ide_unregister(ide_hwif_t *hwif)
269 if (hwif->dma_base) 233 if (hwif->dma_base)
270 ide_release_dma_engine(hwif); 234 ide_release_dma_engine(hwif);
271 235
272 spin_lock_irq(&ide_lock);
273 /* restore hwif data to pristine status */
274 ide_init_port_data(hwif, hwif->index);
275 spin_unlock_irq(&ide_lock);
276
277 mutex_unlock(&ide_cfg_mtx); 236 mutex_unlock(&ide_cfg_mtx);
278} 237}
279 238
280EXPORT_SYMBOL(ide_unregister);
281
282void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw) 239void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
283{ 240{
284 memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports)); 241 memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports));
@@ -287,8 +244,8 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
287 hwif->dev = hw->dev; 244 hwif->dev = hw->dev;
288 hwif->gendev.parent = hw->parent ? hw->parent : hw->dev; 245 hwif->gendev.parent = hw->parent ? hw->parent : hw->dev;
289 hwif->ack_intr = hw->ack_intr; 246 hwif->ack_intr = hw->ack_intr;
247 hwif->config_data = hw->config;
290} 248}
291EXPORT_SYMBOL_GPL(ide_init_port_hw);
292 249
293/* 250/*
294 * Locks for IDE setting functionality 251 * Locks for IDE setting functionality
diff --git a/drivers/ide/legacy/buddha.c b/drivers/ide/legacy/buddha.c
index 0497e7f85b09..7c2afa97f417 100644
--- a/drivers/ide/legacy/buddha.c
+++ b/drivers/ide/legacy/buddha.c
@@ -37,6 +37,8 @@
37#define CATWEASEL_NUM_HWIFS 3 37#define CATWEASEL_NUM_HWIFS 3
38#define XSURF_NUM_HWIFS 2 38#define XSURF_NUM_HWIFS 2
39 39
40#define MAX_NUM_HWIFS 3
41
40 /* 42 /*
41 * Bases of the IDE interfaces (relative to the board address) 43 * Bases of the IDE interfaces (relative to the board address)
42 */ 44 */
@@ -148,18 +150,14 @@ static void __init buddha_setup_ports(hw_regs_t *hw, unsigned long base,
148 150
149static int __init buddha_init(void) 151static int __init buddha_init(void)
150{ 152{
151 hw_regs_t hw;
152 ide_hwif_t *hwif;
153 int i;
154
155 struct zorro_dev *z = NULL; 153 struct zorro_dev *z = NULL;
156 u_long buddha_board = 0; 154 u_long buddha_board = 0;
157 BuddhaType type; 155 BuddhaType type;
158 int buddha_num_hwifs; 156 int buddha_num_hwifs, i;
159 157
160 while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { 158 while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
161 unsigned long board; 159 unsigned long board;
162 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 160 hw_regs_t hw[MAX_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL };
163 161
164 if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { 162 if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) {
165 buddha_num_hwifs = BUDDHA_NUM_HWIFS; 163 buddha_num_hwifs = BUDDHA_NUM_HWIFS;
@@ -221,19 +219,13 @@ fail_base2:
221 ack_intr = xsurf_ack_intr; 219 ack_intr = xsurf_ack_intr;
222 } 220 }
223 221
224 buddha_setup_ports(&hw, base, ctl, irq_port, ack_intr); 222 buddha_setup_ports(&hw[i], base, ctl, irq_port,
223 ack_intr);
225 224
226 hwif = ide_find_port(); 225 hws[i] = &hw[i];
227 if (hwif) {
228 u8 index = hwif->index;
229
230 ide_init_port_hw(hwif, &hw);
231
232 idx[i] = index;
233 }
234 } 226 }
235 227
236 ide_device_add(idx, NULL); 228 ide_host_add(NULL, hws, NULL);
237 } 229 }
238 230
239 return 0; 231 return 0;
diff --git a/drivers/ide/legacy/falconide.c b/drivers/ide/legacy/falconide.c
index 129a812bb57f..724f95073d80 100644
--- a/drivers/ide/legacy/falconide.c
+++ b/drivers/ide/legacy/falconide.c
@@ -66,6 +66,27 @@ static void falconide_output_data(ide_drive_t *drive, struct request *rq,
66 outsw_swapw(data_addr, buf, (len + 1) / 2); 66 outsw_swapw(data_addr, buf, (len + 1) / 2);
67} 67}
68 68
69/* Atari has a byte-swapped IDE interface */
70static const struct ide_tp_ops falconide_tp_ops = {
71 .exec_command = ide_exec_command,
72 .read_status = ide_read_status,
73 .read_altstatus = ide_read_altstatus,
74 .read_sff_dma_status = ide_read_sff_dma_status,
75
76 .set_irq = ide_set_irq,
77
78 .tf_load = ide_tf_load,
79 .tf_read = ide_tf_read,
80
81 .input_data = falconide_input_data,
82 .output_data = falconide_output_data,
83};
84
85static const struct ide_port_info falconide_port_info = {
86 .tp_ops = &falconide_tp_ops,
87 .host_flags = IDE_HFLAG_NO_DMA,
88};
89
69static void __init falconide_setup_ports(hw_regs_t *hw) 90static void __init falconide_setup_ports(hw_regs_t *hw)
70{ 91{
71 int i; 92 int i;
@@ -91,11 +112,12 @@ static void __init falconide_setup_ports(hw_regs_t *hw)
91 112
92static int __init falconide_init(void) 113static int __init falconide_init(void)
93{ 114{
94 hw_regs_t hw; 115 struct ide_host *host;
95 ide_hwif_t *hwif; 116 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
117 int rc;
96 118
97 if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE)) 119 if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE))
98 return 0; 120 return -ENODEV;
99 121
100 printk(KERN_INFO "ide: Falcon IDE controller\n"); 122 printk(KERN_INFO "ide: Falcon IDE controller\n");
101 123
@@ -106,23 +128,25 @@ static int __init falconide_init(void)
106 128
107 falconide_setup_ports(&hw); 129 falconide_setup_ports(&hw);
108 130
109 hwif = ide_find_port(); 131 host = ide_host_alloc(&falconide_port_info, hws);
110 if (hwif) { 132 if (host == NULL) {
111 u8 index = hwif->index; 133 rc = -ENOMEM;
112 u8 idx[4] = { index, 0xff, 0xff, 0xff }; 134 goto err;
113 135 }
114 ide_init_port_hw(hwif, &hw);
115 136
116 /* Atari has a byte-swapped IDE interface */ 137 ide_get_lock(NULL, NULL);
117 hwif->input_data = falconide_input_data; 138 rc = ide_host_register(host, &falconide_port_info, hws);
118 hwif->output_data = falconide_output_data; 139 ide_release_lock();
119 140
120 ide_get_lock(NULL, NULL); 141 if (rc)
121 ide_device_add(idx, NULL); 142 goto err_free;
122 ide_release_lock();
123 }
124 143
125 return 0; 144 return 0;
145err_free:
146 ide_host_free(host);
147err:
148 release_mem_region(ATA_HD_BASE, 0x40);
149 return rc;
126} 150}
127 151
128module_init(falconide_init); 152module_init(falconide_init);
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c
index 7e74b20202df..dd5c467d8dd0 100644
--- a/drivers/ide/legacy/gayle.c
+++ b/drivers/ide/legacy/gayle.c
@@ -31,6 +31,8 @@
31#define GAYLE_BASE_4000 0xdd2020 /* A4000/A4000T */ 31#define GAYLE_BASE_4000 0xdd2020 /* A4000/A4000T */
32#define GAYLE_BASE_1200 0xda0000 /* A1200/A600 and E-Matrix 530 */ 32#define GAYLE_BASE_1200 0xda0000 /* A1200/A600 and E-Matrix 530 */
33 33
34#define GAYLE_IDEREG_SIZE 0x2000
35
34 /* 36 /*
35 * Offsets from one of the above bases 37 * Offsets from one of the above bases
36 */ 38 */
@@ -56,13 +58,11 @@
56#define GAYLE_NUM_HWIFS 1 58#define GAYLE_NUM_HWIFS 1
57#define GAYLE_NUM_PROBE_HWIFS GAYLE_NUM_HWIFS 59#define GAYLE_NUM_PROBE_HWIFS GAYLE_NUM_HWIFS
58#define GAYLE_HAS_CONTROL_REG 1 60#define GAYLE_HAS_CONTROL_REG 1
59#define GAYLE_IDEREG_SIZE 0x2000
60#else /* CONFIG_BLK_DEV_IDEDOUBLER */ 61#else /* CONFIG_BLK_DEV_IDEDOUBLER */
61#define GAYLE_NUM_HWIFS 2 62#define GAYLE_NUM_HWIFS 2
62#define GAYLE_NUM_PROBE_HWIFS (ide_doubler ? GAYLE_NUM_HWIFS : \ 63#define GAYLE_NUM_PROBE_HWIFS (ide_doubler ? GAYLE_NUM_HWIFS : \
63 GAYLE_NUM_HWIFS-1) 64 GAYLE_NUM_HWIFS-1)
64#define GAYLE_HAS_CONTROL_REG (!ide_doubler) 65#define GAYLE_HAS_CONTROL_REG (!ide_doubler)
65#define GAYLE_IDEREG_SIZE (ide_doubler ? 0x1000 : 0x2000)
66 66
67static int ide_doubler; 67static int ide_doubler;
68module_param_named(doubler, ide_doubler, bool, 0); 68module_param_named(doubler, ide_doubler, bool, 0);
@@ -124,8 +124,11 @@ static void __init gayle_setup_ports(hw_regs_t *hw, unsigned long base,
124 124
125static int __init gayle_init(void) 125static int __init gayle_init(void)
126{ 126{
127 unsigned long phys_base, res_start, res_n;
128 unsigned long base, ctrlport, irqport;
129 ide_ack_intr_t *ack_intr;
127 int a4000, i; 130 int a4000, i;
128 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 131 hw_regs_t hw[GAYLE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL };
129 132
130 if (!MACH_IS_AMIGA) 133 if (!MACH_IS_AMIGA)
131 return -ENODEV; 134 return -ENODEV;
@@ -148,13 +151,6 @@ found:
148#endif 151#endif
149 ""); 152 "");
150 153
151 for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) {
152 unsigned long base, ctrlport, irqport;
153 ide_ack_intr_t *ack_intr;
154 hw_regs_t hw;
155 ide_hwif_t *hwif;
156 unsigned long phys_base, res_start, res_n;
157
158 if (a4000) { 154 if (a4000) {
159 phys_base = GAYLE_BASE_4000; 155 phys_base = GAYLE_BASE_4000;
160 irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); 156 irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000);
@@ -168,33 +164,22 @@ found:
168 * FIXME: we now have selectable modes between mmio v/s iomio 164 * FIXME: we now have selectable modes between mmio v/s iomio
169 */ 165 */
170 166
171 phys_base += i*GAYLE_NEXT_PORT;
172
173 res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); 167 res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1);
174 res_n = GAYLE_IDEREG_SIZE; 168 res_n = GAYLE_IDEREG_SIZE;
175 169
176 if (!request_mem_region(res_start, res_n, "IDE")) 170 if (!request_mem_region(res_start, res_n, "IDE"))
177 continue; 171 return -EBUSY;
178 172
179 base = (unsigned long)ZTWO_VADDR(phys_base); 173 for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) {
174 base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT);
180 ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; 175 ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0;
181 176
182 gayle_setup_ports(&hw, base, ctrlport, irqport, ack_intr); 177 gayle_setup_ports(&hw[i], base, ctrlport, irqport, ack_intr);
183
184 hwif = ide_find_port();
185 if (hwif) {
186 u8 index = hwif->index;
187 178
188 ide_init_port_hw(hwif, &hw); 179 hws[i] = &hw[i];
189
190 idx[i] = index;
191 } else
192 release_mem_region(res_start, res_n);
193 } 180 }
194 181
195 ide_device_add(idx, NULL); 182 return ide_host_add(NULL, hws, NULL);
196
197 return 0;
198} 183}
199 184
200module_init(gayle_init); 185module_init(gayle_init);
diff --git a/drivers/ide/legacy/ide-4drives.c b/drivers/ide/legacy/ide-4drives.c
index 89c8ff0a4d08..c76d55de6996 100644
--- a/drivers/ide/legacy/ide-4drives.c
+++ b/drivers/ide/legacy/ide-4drives.c
@@ -28,10 +28,8 @@ static const struct ide_port_info ide_4drives_port_info = {
28 28
29static int __init ide_4drives_init(void) 29static int __init ide_4drives_init(void)
30{ 30{
31 ide_hwif_t *hwif, *mate;
32 unsigned long base = 0x1f0, ctl = 0x3f6; 31 unsigned long base = 0x1f0, ctl = 0x3f6;
33 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 32 hw_regs_t hw, *hws[] = { &hw, &hw, NULL, NULL };
34 hw_regs_t hw;
35 33
36 if (probe_4drives == 0) 34 if (probe_4drives == 0)
37 return -ENODEV; 35 return -ENODEV;
@@ -55,21 +53,7 @@ static int __init ide_4drives_init(void)
55 hw.irq = 14; 53 hw.irq = 14;
56 hw.chipset = ide_4drives; 54 hw.chipset = ide_4drives;
57 55
58 hwif = ide_find_port(); 56 return ide_host_add(&ide_4drives_port_info, hws, NULL);
59 if (hwif) {
60 ide_init_port_hw(hwif, &hw);
61 idx[0] = hwif->index;
62 }
63
64 mate = ide_find_port();
65 if (mate) {
66 ide_init_port_hw(mate, &hw);
67 idx[1] = mate->index;
68 }
69
70 ide_device_add(idx, &ide_4drives_port_info);
71
72 return 0;
73} 57}
74 58
75module_init(ide_4drives_init); 59module_init(ide_4drives_init);
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c
index 27b1e0b7ecb4..21bfac137844 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -74,7 +74,7 @@ INT_MODULE_PARM(pc_debug, 0);
74 74
75typedef struct ide_info_t { 75typedef struct ide_info_t {
76 struct pcmcia_device *p_dev; 76 struct pcmcia_device *p_dev;
77 ide_hwif_t *hwif; 77 struct ide_host *host;
78 int ndev; 78 int ndev;
79 dev_node_t node; 79 dev_node_t node;
80} ide_info_t; 80} ide_info_t;
@@ -132,7 +132,7 @@ static int ide_probe(struct pcmcia_device *link)
132static void ide_detach(struct pcmcia_device *link) 132static void ide_detach(struct pcmcia_device *link)
133{ 133{
134 ide_info_t *info = link->priv; 134 ide_info_t *info = link->priv;
135 ide_hwif_t *hwif = info->hwif; 135 ide_hwif_t *hwif = info->host->ports[0];
136 unsigned long data_addr, ctl_addr; 136 unsigned long data_addr, ctl_addr;
137 137
138 DEBUG(0, "ide_detach(0x%p)\n", link); 138 DEBUG(0, "ide_detach(0x%p)\n", link);
@@ -157,13 +157,13 @@ static const struct ide_port_info idecs_port_info = {
157 .host_flags = IDE_HFLAG_NO_DMA, 157 .host_flags = IDE_HFLAG_NO_DMA,
158}; 158};
159 159
160static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, 160static struct ide_host *idecs_register(unsigned long io, unsigned long ctl,
161 unsigned long irq, struct pcmcia_device *handle) 161 unsigned long irq, struct pcmcia_device *handle)
162{ 162{
163 struct ide_host *host;
163 ide_hwif_t *hwif; 164 ide_hwif_t *hwif;
164 hw_regs_t hw; 165 int i, rc;
165 int i; 166 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
166 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
167 167
168 if (!request_region(io, 8, DRV_NAME)) { 168 if (!request_region(io, 8, DRV_NAME)) {
169 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", 169 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
@@ -184,30 +184,24 @@ static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl,
184 hw.chipset = ide_pci; 184 hw.chipset = ide_pci;
185 hw.dev = &handle->dev; 185 hw.dev = &handle->dev;
186 186
187 hwif = ide_find_port(); 187 rc = ide_host_add(&idecs_port_info, hws, &host);
188 if (hwif == NULL) 188 if (rc)
189 goto out_release; 189 goto out_release;
190 190
191 i = hwif->index; 191 hwif = host->ports[0];
192
193 ide_init_port_hw(hwif, &hw);
194
195 idx[0] = i;
196
197 ide_device_add(idx, &idecs_port_info);
198 192
199 if (hwif->present) 193 if (hwif->present)
200 return hwif; 194 return host;
201 195
202 /* retry registration in case device is still spinning up */ 196 /* retry registration in case device is still spinning up */
203 for (i = 0; i < 10; i++) { 197 for (i = 0; i < 10; i++) {
204 msleep(100); 198 msleep(100);
205 ide_port_scan(hwif); 199 ide_port_scan(hwif);
206 if (hwif->present) 200 if (hwif->present)
207 return hwif; 201 return host;
208 } 202 }
209 203
210 return hwif; 204 return host;
211 205
212out_release: 206out_release:
213 release_region(ctl, 1); 207 release_region(ctl, 1);
@@ -239,7 +233,7 @@ static int ide_config(struct pcmcia_device *link)
239 cistpl_cftable_entry_t *cfg; 233 cistpl_cftable_entry_t *cfg;
240 int pass, last_ret = 0, last_fn = 0, is_kme = 0; 234 int pass, last_ret = 0, last_fn = 0, is_kme = 0;
241 unsigned long io_base, ctl_base; 235 unsigned long io_base, ctl_base;
242 ide_hwif_t *hwif; 236 struct ide_host *host;
243 237
244 DEBUG(0, "ide_config(0x%p)\n", link); 238 DEBUG(0, "ide_config(0x%p)\n", link);
245 239
@@ -334,21 +328,21 @@ static int ide_config(struct pcmcia_device *link)
334 if (is_kme) 328 if (is_kme)
335 outb(0x81, ctl_base+1); 329 outb(0x81, ctl_base+1);
336 330
337 hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); 331 host = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link);
338 if (hwif == NULL && link->io.NumPorts1 == 0x20) { 332 if (host == NULL && link->io.NumPorts1 == 0x20) {
339 outb(0x02, ctl_base + 0x10); 333 outb(0x02, ctl_base + 0x10);
340 hwif = idecs_register(io_base + 0x10, ctl_base + 0x10, 334 host = idecs_register(io_base + 0x10, ctl_base + 0x10,
341 link->irq.AssignedIRQ, link); 335 link->irq.AssignedIRQ, link);
342 } 336 }
343 337
344 if (hwif == NULL) 338 if (host == NULL)
345 goto failed; 339 goto failed;
346 340
347 info->ndev = 1; 341 info->ndev = 1;
348 sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2); 342 sprintf(info->node.dev_name, "hd%c", 'a' + host->ports[0]->index * 2);
349 info->node.major = hwif->major; 343 info->node.major = host->ports[0]->major;
350 info->node.minor = 0; 344 info->node.minor = 0;
351 info->hwif = hwif; 345 info->host = host;
352 link->dev_node = &info->node; 346 link->dev_node = &info->node;
353 printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n", 347 printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n",
354 info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10); 348 info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10);
@@ -379,15 +373,15 @@ failed:
379static void ide_release(struct pcmcia_device *link) 373static void ide_release(struct pcmcia_device *link)
380{ 374{
381 ide_info_t *info = link->priv; 375 ide_info_t *info = link->priv;
382 ide_hwif_t *hwif = info->hwif; 376 struct ide_host *host = info->host;
383 377
384 DEBUG(0, "ide_release(0x%p)\n", link); 378 DEBUG(0, "ide_release(0x%p)\n", link);
385 379
386 if (info->ndev) { 380 if (info->ndev)
387 /* FIXME: if this fails we need to queue the cleanup somehow 381 /* FIXME: if this fails we need to queue the cleanup somehow
388 -- need to investigate the required PCMCIA magic */ 382 -- need to investigate the required PCMCIA magic */
389 ide_unregister(hwif); 383 ide_host_remove(host);
390 } 384
391 info->ndev = 0; 385 info->ndev = 0;
392 386
393 pcmcia_disable_device(link); 387 pcmcia_disable_device(link);
diff --git a/drivers/ide/legacy/ide_platform.c b/drivers/ide/legacy/ide_platform.c
index a249562b34b5..051b4ab0f359 100644
--- a/drivers/ide/legacy/ide_platform.c
+++ b/drivers/ide/legacy/ide_platform.c
@@ -52,12 +52,10 @@ static int __devinit plat_ide_probe(struct platform_device *pdev)
52{ 52{
53 struct resource *res_base, *res_alt, *res_irq; 53 struct resource *res_base, *res_alt, *res_irq;
54 void __iomem *base, *alt_base; 54 void __iomem *base, *alt_base;
55 ide_hwif_t *hwif;
56 struct pata_platform_info *pdata; 55 struct pata_platform_info *pdata;
57 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 56 struct ide_host *host;
58 int ret = 0; 57 int ret = 0, mmio = 0;
59 int mmio = 0; 58 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
60 hw_regs_t hw;
61 struct ide_port_info d = platform_ide_port_info; 59 struct ide_port_info d = platform_ide_port_info;
62 60
63 pdata = pdev->dev.platform_data; 61 pdata = pdev->dev.platform_data;
@@ -94,28 +92,18 @@ static int __devinit plat_ide_probe(struct platform_device *pdev)
94 res_alt->start, res_alt->end - res_alt->start + 1); 92 res_alt->start, res_alt->end - res_alt->start + 1);
95 } 93 }
96 94
97 hwif = ide_find_port();
98 if (!hwif) {
99 ret = -ENODEV;
100 goto out;
101 }
102
103 memset(&hw, 0, sizeof(hw)); 95 memset(&hw, 0, sizeof(hw));
104 plat_ide_setup_ports(&hw, base, alt_base, pdata, res_irq->start); 96 plat_ide_setup_ports(&hw, base, alt_base, pdata, res_irq->start);
105 hw.dev = &pdev->dev; 97 hw.dev = &pdev->dev;
106 98
107 ide_init_port_hw(hwif, &hw); 99 if (mmio)
108
109 if (mmio) {
110 d.host_flags |= IDE_HFLAG_MMIO; 100 d.host_flags |= IDE_HFLAG_MMIO;
111 default_hwif_mmiops(hwif);
112 }
113 101
114 idx[0] = hwif->index; 102 ret = ide_host_add(&d, hws, &host);
115 103 if (ret)
116 ide_device_add(idx, &d); 104 goto out;
117 105
118 platform_set_drvdata(pdev, hwif); 106 platform_set_drvdata(pdev, host);
119 107
120 return 0; 108 return 0;
121 109
@@ -125,9 +113,9 @@ out:
125 113
126static int __devexit plat_ide_remove(struct platform_device *pdev) 114static int __devexit plat_ide_remove(struct platform_device *pdev)
127{ 115{
128 ide_hwif_t *hwif = pdev->dev.driver_data; 116 struct ide_host *host = pdev->dev.driver_data;
129 117
130 ide_unregister(hwif); 118 ide_host_remove(host);
131 119
132 return 0; 120 return 0;
133} 121}
diff --git a/drivers/ide/legacy/macide.c b/drivers/ide/legacy/macide.c
index 0a6195bcfeda..a0bb167980e7 100644
--- a/drivers/ide/legacy/macide.c
+++ b/drivers/ide/legacy/macide.c
@@ -91,11 +91,10 @@ static const char *mac_ide_name[] =
91 91
92static int __init macide_init(void) 92static int __init macide_init(void)
93{ 93{
94 ide_hwif_t *hwif;
95 ide_ack_intr_t *ack_intr; 94 ide_ack_intr_t *ack_intr;
96 unsigned long base; 95 unsigned long base;
97 int irq; 96 int irq;
98 hw_regs_t hw; 97 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
99 98
100 if (!MACH_IS_MAC) 99 if (!MACH_IS_MAC)
101 return -ENODEV; 100 return -ENODEV;
@@ -125,17 +124,7 @@ static int __init macide_init(void)
125 124
126 macide_setup_ports(&hw, base, irq, ack_intr); 125 macide_setup_ports(&hw, base, irq, ack_intr);
127 126
128 hwif = ide_find_port(); 127 return ide_host_add(NULL, hws, NULL);
129 if (hwif) {
130 u8 index = hwif->index;
131 u8 idx[4] = { index, 0xff, 0xff, 0xff };
132
133 ide_init_port_hw(hwif, &hw);
134
135 ide_device_add(idx, NULL);
136 }
137
138 return 0;
139} 128}
140 129
141module_init(macide_init); 130module_init(macide_init);
diff --git a/drivers/ide/legacy/q40ide.c b/drivers/ide/legacy/q40ide.c
index 9c2b9d078f69..4abd8fc78197 100644
--- a/drivers/ide/legacy/q40ide.c
+++ b/drivers/ide/legacy/q40ide.c
@@ -96,6 +96,27 @@ static void q40ide_output_data(ide_drive_t *drive, struct request *rq,
96 outsw_swapw(data_addr, buf, (len + 1) / 2); 96 outsw_swapw(data_addr, buf, (len + 1) / 2);
97} 97}
98 98
99/* Q40 has a byte-swapped IDE interface */
100static const struct ide_tp_ops q40ide_tp_ops = {
101 .exec_command = ide_exec_command,
102 .read_status = ide_read_status,
103 .read_altstatus = ide_read_altstatus,
104 .read_sff_dma_status = ide_read_sff_dma_status,
105
106 .set_irq = ide_set_irq,
107
108 .tf_load = ide_tf_load,
109 .tf_read = ide_tf_read,
110
111 .input_data = q40ide_input_data,
112 .output_data = q40ide_output_data,
113};
114
115static const struct ide_port_info q40ide_port_info = {
116 .tp_ops = &q40ide_tp_ops,
117 .host_flags = IDE_HFLAG_NO_DMA,
118};
119
99/* 120/*
100 * the static array is needed to have the name reported in /proc/ioports, 121 * the static array is needed to have the name reported in /proc/ioports,
101 * hwif->name unfortunately isn't available yet 122 * hwif->name unfortunately isn't available yet
@@ -111,9 +132,7 @@ static const char *q40_ide_names[Q40IDE_NUM_HWIFS]={
111static int __init q40ide_init(void) 132static int __init q40ide_init(void)
112{ 133{
113 int i; 134 int i;
114 ide_hwif_t *hwif; 135 hw_regs_t hw[Q40IDE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL };
115 const char *name;
116 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
117 136
118 if (!MACH_IS_Q40) 137 if (!MACH_IS_Q40)
119 return -ENODEV; 138 return -ENODEV;
@@ -121,9 +140,8 @@ static int __init q40ide_init(void)
121 printk(KERN_INFO "ide: Q40 IDE controller\n"); 140 printk(KERN_INFO "ide: Q40 IDE controller\n");
122 141
123 for (i = 0; i < Q40IDE_NUM_HWIFS; i++) { 142 for (i = 0; i < Q40IDE_NUM_HWIFS; i++) {
124 hw_regs_t hw; 143 const char *name = q40_ide_names[i];
125 144
126 name = q40_ide_names[i];
127 if (!request_region(pcide_bases[i], 8, name)) { 145 if (!request_region(pcide_bases[i], 8, name)) {
128 printk("could not reserve ports %lx-%lx for %s\n", 146 printk("could not reserve ports %lx-%lx for %s\n",
129 pcide_bases[i],pcide_bases[i]+8,name); 147 pcide_bases[i],pcide_bases[i]+8,name);
@@ -135,26 +153,13 @@ static int __init q40ide_init(void)
135 release_region(pcide_bases[i], 8); 153 release_region(pcide_bases[i], 8);
136 continue; 154 continue;
137 } 155 }
138 q40_ide_setup_ports(&hw, pcide_bases[i], 156 q40_ide_setup_ports(&hw[i], pcide_bases[i], NULL,
139 NULL,
140// m68kide_iops,
141 q40ide_default_irq(pcide_bases[i])); 157 q40ide_default_irq(pcide_bases[i]));
142 158
143 hwif = ide_find_port(); 159 hws[i] = &hw[i];
144 if (hwif) {
145 ide_init_port_hw(hwif, &hw);
146
147 /* Q40 has a byte-swapped IDE interface */
148 hwif->input_data = q40ide_input_data;
149 hwif->output_data = q40ide_output_data;
150
151 idx[i] = hwif->index;
152 }
153 } 160 }
154 161
155 ide_device_add(idx, NULL); 162 return ide_host_add(&q40ide_port_info, hws, NULL);
156
157 return 0;
158} 163}
159 164
160module_init(q40ide_init); 165module_init(q40ide_init);
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c
index 48d57cae63c6..11b7f61aae40 100644
--- a/drivers/ide/mips/au1xxx-ide.c
+++ b/drivers/ide/mips/au1xxx-ide.c
@@ -519,6 +519,23 @@ static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif)
519 *ata_regs = ahwif->regbase + (14 << IDE_REG_SHIFT); 519 *ata_regs = ahwif->regbase + (14 << IDE_REG_SHIFT);
520} 520}
521 521
522#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
523static const struct ide_tp_ops au1xxx_tp_ops = {
524 .exec_command = ide_exec_command,
525 .read_status = ide_read_status,
526 .read_altstatus = ide_read_altstatus,
527 .read_sff_dma_status = ide_read_sff_dma_status,
528
529 .set_irq = ide_set_irq,
530
531 .tf_load = ide_tf_load,
532 .tf_read = ide_tf_read,
533
534 .input_data = au1xxx_input_data,
535 .output_data = au1xxx_output_data,
536};
537#endif
538
522static const struct ide_port_ops au1xxx_port_ops = { 539static const struct ide_port_ops au1xxx_port_ops = {
523 .set_pio_mode = au1xxx_set_pio_mode, 540 .set_pio_mode = au1xxx_set_pio_mode,
524 .set_dma_mode = auide_set_dma_mode, 541 .set_dma_mode = auide_set_dma_mode,
@@ -526,6 +543,9 @@ static const struct ide_port_ops au1xxx_port_ops = {
526 543
527static const struct ide_port_info au1xxx_port_info = { 544static const struct ide_port_info au1xxx_port_info = {
528 .init_dma = auide_ddma_init, 545 .init_dma = auide_ddma_init,
546#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
547 .tp_ops = &au1xxx_tp_ops,
548#endif
529 .port_ops = &au1xxx_port_ops, 549 .port_ops = &au1xxx_port_ops,
530#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA 550#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
531 .dma_ops = &au1xxx_dma_ops, 551 .dma_ops = &au1xxx_dma_ops,
@@ -543,11 +563,10 @@ static int au_ide_probe(struct device *dev)
543{ 563{
544 struct platform_device *pdev = to_platform_device(dev); 564 struct platform_device *pdev = to_platform_device(dev);
545 _auide_hwif *ahwif = &auide_hwif; 565 _auide_hwif *ahwif = &auide_hwif;
546 ide_hwif_t *hwif;
547 struct resource *res; 566 struct resource *res;
567 struct ide_host *host;
548 int ret = 0; 568 int ret = 0;
549 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 569 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
550 hw_regs_t hw;
551 570
552#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) 571#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
553 char *mode = "MWDMA2"; 572 char *mode = "MWDMA2";
@@ -584,36 +603,19 @@ static int au_ide_probe(struct device *dev)
584 goto out; 603 goto out;
585 } 604 }
586 605
587 hwif = ide_find_port();
588 if (hwif == NULL) {
589 ret = -ENOENT;
590 goto out;
591 }
592
593 memset(&hw, 0, sizeof(hw)); 606 memset(&hw, 0, sizeof(hw));
594 auide_setup_ports(&hw, ahwif); 607 auide_setup_ports(&hw, ahwif);
595 hw.irq = ahwif->irq; 608 hw.irq = ahwif->irq;
596 hw.dev = dev; 609 hw.dev = dev;
597 hw.chipset = ide_au1xxx; 610 hw.chipset = ide_au1xxx;
598 611
599 ide_init_port_hw(hwif, &hw); 612 ret = ide_host_add(&au1xxx_port_info, hws, &host);
600 613 if (ret)
601 /* If the user has selected DDMA assisted copies, 614 goto out;
602 then set up a few local I/O function entry points
603 */
604
605#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
606 hwif->input_data = au1xxx_input_data;
607 hwif->output_data = au1xxx_output_data;
608#endif
609
610 auide_hwif.hwif = hwif;
611
612 idx[0] = hwif->index;
613 615
614 ide_device_add(idx, &au1xxx_port_info); 616 auide_hwif.hwif = host->ports[0];
615 617
616 dev_set_drvdata(dev, hwif); 618 dev_set_drvdata(dev, host);
617 619
618 printk(KERN_INFO "Au1xxx IDE(builtin) configured for %s\n", mode ); 620 printk(KERN_INFO "Au1xxx IDE(builtin) configured for %s\n", mode );
619 621
@@ -625,10 +627,10 @@ static int au_ide_remove(struct device *dev)
625{ 627{
626 struct platform_device *pdev = to_platform_device(dev); 628 struct platform_device *pdev = to_platform_device(dev);
627 struct resource *res; 629 struct resource *res;
628 ide_hwif_t *hwif = dev_get_drvdata(dev); 630 struct ide_host *host = dev_get_drvdata(dev);
629 _auide_hwif *ahwif = &auide_hwif; 631 _auide_hwif *ahwif = &auide_hwif;
630 632
631 ide_unregister(hwif); 633 ide_host_remove(host);
632 634
633 iounmap((void *)ahwif->regbase); 635 iounmap((void *)ahwif->regbase);
634 636
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c
index 9f1212cc4aed..badf79fc9e3a 100644
--- a/drivers/ide/mips/swarm.c
+++ b/drivers/ide/mips/swarm.c
@@ -72,12 +72,11 @@ static const struct ide_port_info swarm_port_info = {
72 */ 72 */
73static int __devinit swarm_ide_probe(struct device *dev) 73static int __devinit swarm_ide_probe(struct device *dev)
74{ 74{
75 ide_hwif_t *hwif;
76 u8 __iomem *base; 75 u8 __iomem *base;
76 struct ide_host *host;
77 phys_t offset, size; 77 phys_t offset, size;
78 hw_regs_t hw; 78 int i, rc;
79 int i; 79 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
80 u8 idx[] = { 0xff, 0xff, 0xff, 0xff };
81 80
82 if (!SIBYTE_HAVE_IDE) 81 if (!SIBYTE_HAVE_IDE)
83 return -ENODEV; 82 return -ENODEV;
@@ -116,26 +115,17 @@ static int __devinit swarm_ide_probe(struct device *dev)
116 hw.irq = K_INT_GB_IDE; 115 hw.irq = K_INT_GB_IDE;
117 hw.chipset = ide_generic; 116 hw.chipset = ide_generic;
118 117
119 hwif = ide_find_port_slot(&swarm_port_info); 118 rc = ide_host_add(&swarm_port_info, hws, &host);
120 if (hwif == NULL) 119 if (rc)
121 goto err; 120 goto err;
122 121
123 ide_init_port_hw(hwif, &hw); 122 dev_set_drvdata(dev, host);
124
125 /* Setup MMIO ops. */
126 default_hwif_mmiops(hwif);
127
128 idx[0] = hwif->index;
129
130 ide_device_add(idx, &swarm_port_info);
131
132 dev_set_drvdata(dev, hwif);
133 123
134 return 0; 124 return 0;
135err: 125err:
136 release_resource(&swarm_ide_resource); 126 release_resource(&swarm_ide_resource);
137 iounmap(base); 127 iounmap(base);
138 return -ENOMEM; 128 return rc;
139} 129}
140 130
141static struct device_driver swarm_ide_driver = { 131static struct device_driver swarm_ide_driver = {
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c
index ae7a4329a581..fbc43e121e6b 100644
--- a/drivers/ide/pci/aec62xx.c
+++ b/drivers/ide/pci/aec62xx.c
@@ -195,7 +195,6 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
195 .host_flags = IDE_HFLAG_SERIALIZE | 195 .host_flags = IDE_HFLAG_SERIALIZE |
196 IDE_HFLAG_NO_ATAPI_DMA | 196 IDE_HFLAG_NO_ATAPI_DMA |
197 IDE_HFLAG_NO_DSC | 197 IDE_HFLAG_NO_DSC |
198 IDE_HFLAG_ABUSE_SET_DMA_MODE |
199 IDE_HFLAG_OFF_BOARD, 198 IDE_HFLAG_OFF_BOARD,
200 .pio_mask = ATA_PIO4, 199 .pio_mask = ATA_PIO4,
201 .mwdma_mask = ATA_MWDMA2, 200 .mwdma_mask = ATA_MWDMA2,
@@ -205,7 +204,6 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
205 .init_chipset = init_chipset_aec62xx, 204 .init_chipset = init_chipset_aec62xx,
206 .port_ops = &atp86x_port_ops, 205 .port_ops = &atp86x_port_ops,
207 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_NO_AUTODMA | 206 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_NO_AUTODMA |
208 IDE_HFLAG_ABUSE_SET_DMA_MODE |
209 IDE_HFLAG_OFF_BOARD, 207 IDE_HFLAG_OFF_BOARD,
210 .pio_mask = ATA_PIO4, 208 .pio_mask = ATA_PIO4,
211 .mwdma_mask = ATA_MWDMA2, 209 .mwdma_mask = ATA_MWDMA2,
@@ -216,7 +214,6 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
216 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, 214 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
217 .port_ops = &atp86x_port_ops, 215 .port_ops = &atp86x_port_ops,
218 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 216 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
219 IDE_HFLAG_ABUSE_SET_DMA_MODE |
220 IDE_HFLAG_NON_BOOTABLE, 217 IDE_HFLAG_NON_BOOTABLE,
221 .pio_mask = ATA_PIO4, 218 .pio_mask = ATA_PIO4,
222 .mwdma_mask = ATA_MWDMA2, 219 .mwdma_mask = ATA_MWDMA2,
@@ -226,7 +223,6 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
226 .init_chipset = init_chipset_aec62xx, 223 .init_chipset = init_chipset_aec62xx,
227 .port_ops = &atp86x_port_ops, 224 .port_ops = &atp86x_port_ops,
228 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 225 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
229 IDE_HFLAG_ABUSE_SET_DMA_MODE |
230 IDE_HFLAG_OFF_BOARD, 226 IDE_HFLAG_OFF_BOARD,
231 .pio_mask = ATA_PIO4, 227 .pio_mask = ATA_PIO4,
232 .mwdma_mask = ATA_MWDMA2, 228 .mwdma_mask = ATA_MWDMA2,
@@ -237,7 +233,6 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitdata = {
237 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, 233 .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}},
238 .port_ops = &atp86x_port_ops, 234 .port_ops = &atp86x_port_ops,
239 .host_flags = IDE_HFLAG_NO_ATAPI_DMA | 235 .host_flags = IDE_HFLAG_NO_ATAPI_DMA |
240 IDE_HFLAG_ABUSE_SET_DMA_MODE |
241 IDE_HFLAG_OFF_BOARD, 236 IDE_HFLAG_OFF_BOARD,
242 .pio_mask = ATA_PIO4, 237 .pio_mask = ATA_PIO4,
243 .mwdma_mask = ATA_MWDMA2, 238 .mwdma_mask = ATA_MWDMA2,
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c
index 80d19c0eb780..5ef7817ac64f 100644
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -471,7 +471,15 @@ static int __devinit init_dma_ali15x3(ide_hwif_t *hwif,
471 struct pci_dev *dev = to_pci_dev(hwif->dev); 471 struct pci_dev *dev = to_pci_dev(hwif->dev);
472 unsigned long base = ide_pci_dma_base(hwif, d); 472 unsigned long base = ide_pci_dma_base(hwif, d);
473 473
474 if (base == 0 || ide_pci_set_master(dev, d->name) < 0) 474 if (base == 0)
475 return -1;
476
477 hwif->dma_base = base;
478
479 if (ide_pci_check_simplex(hwif, d) < 0)
480 return -1;
481
482 if (ide_pci_set_master(dev, d->name) < 0)
475 return -1; 483 return -1;
476 484
477 if (!hwif->channel) 485 if (!hwif->channel)
@@ -483,7 +491,7 @@ static int __devinit init_dma_ali15x3(ide_hwif_t *hwif,
483 if (ide_allocate_dma_engine(hwif)) 491 if (ide_allocate_dma_engine(hwif))
484 return -1; 492 return -1;
485 493
486 ide_setup_dma(hwif, base); 494 hwif->dma_ops = &sff_dma_ops;
487 495
488 return 0; 496 return 0;
489} 497}
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c
index 0bfcdd0e77b3..ef7d971031ee 100644
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -218,7 +218,6 @@ static const struct ide_port_ops amd_port_ops = {
218 218
219#define IDE_HFLAGS_AMD \ 219#define IDE_HFLAGS_AMD \
220 (IDE_HFLAG_PIO_NO_BLACKLIST | \ 220 (IDE_HFLAG_PIO_NO_BLACKLIST | \
221 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
222 IDE_HFLAG_POST_SET_MODE | \ 221 IDE_HFLAG_POST_SET_MODE | \
223 IDE_HFLAG_IO_32BIT | \ 222 IDE_HFLAG_IO_32BIT | \
224 IDE_HFLAG_UNMASK_IRQS) 223 IDE_HFLAG_UNMASK_IRQS)
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c
index 1ad1e23e3105..e6c62006ca1a 100644
--- a/drivers/ide/pci/cmd640.c
+++ b/drivers/ide/pci/cmd640.c
@@ -181,11 +181,6 @@ static u8 recovery_counts[4] = {16, 16, 16, 16}; /* Recovery count (encoded) */
181static DEFINE_SPINLOCK(cmd640_lock); 181static DEFINE_SPINLOCK(cmd640_lock);
182 182
183/* 183/*
184 * These are initialized to point at the devices we control
185 */
186static ide_hwif_t *cmd_hwif0, *cmd_hwif1;
187
188/*
189 * Interface to access cmd640x registers 184 * Interface to access cmd640x registers
190 */ 185 */
191static unsigned int cmd640_key; 186static unsigned int cmd640_key;
@@ -717,8 +712,7 @@ static int __init cmd640x_init(void)
717 int second_port_cmd640 = 0, rc; 712 int second_port_cmd640 = 0, rc;
718 const char *bus_type, *port2; 713 const char *bus_type, *port2;
719 u8 b, cfr; 714 u8 b, cfr;
720 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 715 hw_regs_t hw[2], *hws[] = { NULL, NULL, NULL, NULL };
721 hw_regs_t hw[2];
722 716
723 if (cmd640_vlb && probe_for_cmd640_vlb()) { 717 if (cmd640_vlb && probe_for_cmd640_vlb()) {
724 bus_type = "VLB"; 718 bus_type = "VLB";
@@ -781,15 +775,10 @@ static int __init cmd640x_init(void)
781 printk(KERN_INFO "cmd640: buggy cmd640%c interface on %s, config=0x%02x" 775 printk(KERN_INFO "cmd640: buggy cmd640%c interface on %s, config=0x%02x"
782 "\n", 'a' + cmd640_chip_version - 1, bus_type, cfr); 776 "\n", 'a' + cmd640_chip_version - 1, bus_type, cfr);
783 777
784 cmd_hwif0 = ide_find_port();
785
786 /* 778 /*
787 * Initialize data for primary port 779 * Initialize data for primary port
788 */ 780 */
789 if (cmd_hwif0) { 781 hws[0] = &hw[0];
790 ide_init_port_hw(cmd_hwif0, &hw[0]);
791 idx[0] = cmd_hwif0->index;
792 }
793 782
794 /* 783 /*
795 * Ensure compatibility by always using the slowest timings 784 * Ensure compatibility by always using the slowest timings
@@ -829,13 +818,9 @@ static int __init cmd640x_init(void)
829 /* 818 /*
830 * Initialize data for secondary cmd640 port, if enabled 819 * Initialize data for secondary cmd640 port, if enabled
831 */ 820 */
832 if (second_port_cmd640) { 821 if (second_port_cmd640)
833 cmd_hwif1 = ide_find_port(); 822 hws[1] = &hw[1];
834 if (cmd_hwif1) { 823
835 ide_init_port_hw(cmd_hwif1, &hw[1]);
836 idx[1] = cmd_hwif1->index;
837 }
838 }
839 printk(KERN_INFO "cmd640: %sserialized, secondary interface %s\n", 824 printk(KERN_INFO "cmd640: %sserialized, secondary interface %s\n",
840 second_port_cmd640 ? "" : "not ", port2); 825 second_port_cmd640 ? "" : "not ", port2);
841 826
@@ -843,9 +828,7 @@ static int __init cmd640x_init(void)
843 cmd640_dump_regs(); 828 cmd640_dump_regs();
844#endif 829#endif
845 830
846 ide_device_add(idx, &cmd640_port_info); 831 return ide_host_add(&cmd640_port_info, hws, NULL);
847
848 return 1;
849} 832}
850 833
851module_param_named(probe_vlb, cmd640_vlb, bool, 0); 834module_param_named(probe_vlb, cmd640_vlb, bool, 0);
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c
index cfa784bacf48..ce58bfcdb3c6 100644
--- a/drivers/ide/pci/cmd64x.c
+++ b/drivers/ide/pci/cmd64x.c
@@ -262,7 +262,7 @@ static int cmd648_dma_test_irq(ide_drive_t *drive)
262 unsigned long base = hwif->dma_base - (hwif->channel * 8); 262 unsigned long base = hwif->dma_base - (hwif->channel * 8);
263 u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : 263 u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 :
264 MRDMODE_INTR_CH0; 264 MRDMODE_INTR_CH0;
265 u8 dma_stat = inb(hwif->dma_status); 265 u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
266 u8 mrdmode = inb(base + 1); 266 u8 mrdmode = inb(base + 1);
267 267
268#ifdef DEBUG 268#ifdef DEBUG
@@ -286,7 +286,7 @@ static int cmd64x_dma_test_irq(ide_drive_t *drive)
286 int irq_reg = hwif->channel ? ARTTIM23 : CFR; 286 int irq_reg = hwif->channel ? ARTTIM23 : CFR;
287 u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : 287 u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 :
288 CFR_INTR_CH0; 288 CFR_INTR_CH0;
289 u8 dma_stat = inb(hwif->dma_status); 289 u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
290 u8 irq_stat = 0; 290 u8 irq_stat = 0;
291 291
292 (void) pci_read_config_byte(dev, irq_reg, &irq_stat); 292 (void) pci_read_config_byte(dev, irq_reg, &irq_stat);
@@ -317,13 +317,13 @@ static int cmd646_1_dma_end(ide_drive_t *drive)
317 317
318 drive->waiting_for_dma = 0; 318 drive->waiting_for_dma = 0;
319 /* get DMA status */ 319 /* get DMA status */
320 dma_stat = inb(hwif->dma_status); 320 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
321 /* read DMA command state */ 321 /* read DMA command state */
322 dma_cmd = inb(hwif->dma_command); 322 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
323 /* stop DMA */ 323 /* stop DMA */
324 outb(dma_cmd & ~1, hwif->dma_command); 324 outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
325 /* clear the INTR & ERROR bits */ 325 /* clear the INTR & ERROR bits */
326 outb(dma_stat | 6, hwif->dma_status); 326 outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
327 /* and free any DMA resources */ 327 /* and free any DMA resources */
328 ide_destroy_dmatable(drive); 328 ide_destroy_dmatable(drive);
329 /* verify good DMA status */ 329 /* verify good DMA status */
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c
index 992b1cf8db69..b03d8ae947e6 100644
--- a/drivers/ide/pci/cs5520.c
+++ b/drivers/ide/pci/cs5520.c
@@ -62,8 +62,6 @@ static void cs5520_set_pio_mode(ide_drive_t *drive, const u8 pio)
62 struct pci_dev *pdev = to_pci_dev(hwif->dev); 62 struct pci_dev *pdev = to_pci_dev(hwif->dev);
63 int controller = drive->dn > 1 ? 1 : 0; 63 int controller = drive->dn > 1 ? 1 : 0;
64 64
65 /* FIXME: if DMA = 1 do we need to set the DMA bit here ? */
66
67 /* 8bit CAT/CRT - 8bit command timing for channel */ 65 /* 8bit CAT/CRT - 8bit command timing for channel */
68 pci_write_config_byte(pdev, 0x62 + controller, 66 pci_write_config_byte(pdev, 0x62 + controller,
69 (cs5520_pio_clocks[pio].recovery << 4) | 67 (cs5520_pio_clocks[pio].recovery << 4) |
@@ -89,46 +87,17 @@ static void cs5520_set_dma_mode(ide_drive_t *drive, const u8 speed)
89 cs5520_set_pio_mode(drive, 0); 87 cs5520_set_pio_mode(drive, 0);
90} 88}
91 89
92/*
93 * We wrap the DMA activate to set the vdma flag. This is needed
94 * so that the IDE DMA layer issues PIO not DMA commands over the
95 * DMA channel
96 *
97 * ATAPI is harder so disable it for now using IDE_HFLAG_NO_ATAPI_DMA
98 */
99
100static void cs5520_dma_host_set(ide_drive_t *drive, int on)
101{
102 drive->vdma = on;
103 ide_dma_host_set(drive, on);
104}
105
106static const struct ide_port_ops cs5520_port_ops = { 90static const struct ide_port_ops cs5520_port_ops = {
107 .set_pio_mode = cs5520_set_pio_mode, 91 .set_pio_mode = cs5520_set_pio_mode,
108 .set_dma_mode = cs5520_set_dma_mode, 92 .set_dma_mode = cs5520_set_dma_mode,
109}; 93};
110 94
111static const struct ide_dma_ops cs5520_dma_ops = {
112 .dma_host_set = cs5520_dma_host_set,
113 .dma_setup = ide_dma_setup,
114 .dma_exec_cmd = ide_dma_exec_cmd,
115 .dma_start = ide_dma_start,
116 .dma_end = __ide_dma_end,
117 .dma_test_irq = ide_dma_test_irq,
118 .dma_lost_irq = ide_dma_lost_irq,
119 .dma_timeout = ide_dma_timeout,
120};
121
122/* FIXME: VDMA is disabled because it caused system hangs */
123#define DECLARE_CS_DEV(name_str) \ 95#define DECLARE_CS_DEV(name_str) \
124 { \ 96 { \
125 .name = name_str, \ 97 .name = name_str, \
126 .port_ops = &cs5520_port_ops, \ 98 .port_ops = &cs5520_port_ops, \
127 .dma_ops = &cs5520_dma_ops, \
128 .host_flags = IDE_HFLAG_ISA_PORTS | \ 99 .host_flags = IDE_HFLAG_ISA_PORTS | \
129 IDE_HFLAG_CS5520 | \ 100 IDE_HFLAG_CS5520, \
130 IDE_HFLAG_NO_ATAPI_DMA | \
131 IDE_HFLAG_ABUSE_SET_DMA_MODE, \
132 .pio_mask = ATA_PIO4, \ 101 .pio_mask = ATA_PIO4, \
133 } 102 }
134 103
@@ -146,7 +115,7 @@ static const struct ide_port_info cyrix_chipsets[] __devinitdata = {
146static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) 115static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
147{ 116{
148 const struct ide_port_info *d = &cyrix_chipsets[id->driver_data]; 117 const struct ide_port_info *d = &cyrix_chipsets[id->driver_data];
149 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 118 hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
150 119
151 ide_setup_pci_noise(dev, d); 120 ide_setup_pci_noise(dev, d);
152 121
@@ -168,11 +137,9 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
168 * do all the device setup for us 137 * do all the device setup for us
169 */ 138 */
170 139
171 ide_pci_setup_ports(dev, d, 14, &idx[0]); 140 ide_pci_setup_ports(dev, d, 14, &hw[0], &hws[0]);
172
173 ide_device_add(idx, d);
174 141
175 return 0; 142 return ide_host_add(d, hws, NULL);
176} 143}
177 144
178static const struct pci_device_id cs5520_pci_tbl[] = { 145static const struct pci_device_id cs5520_pci_tbl[] = {
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c
index dc97c48623f3..5404fe4f701d 100644
--- a/drivers/ide/pci/cs5535.c
+++ b/drivers/ide/pci/cs5535.c
@@ -171,8 +171,7 @@ static const struct ide_port_ops cs5535_port_ops = {
171static const struct ide_port_info cs5535_chipset __devinitdata = { 171static const struct ide_port_info cs5535_chipset __devinitdata = {
172 .name = "CS5535", 172 .name = "CS5535",
173 .port_ops = &cs5535_port_ops, 173 .port_ops = &cs5535_port_ops,
174 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_POST_SET_MODE | 174 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_POST_SET_MODE,
175 IDE_HFLAG_ABUSE_SET_DMA_MODE,
176 .pio_mask = ATA_PIO4, 175 .pio_mask = ATA_PIO4,
177 .mwdma_mask = ATA_MWDMA2, 176 .mwdma_mask = ATA_MWDMA2,
178 .udma_mask = ATA_UDMA4, 177 .udma_mask = ATA_UDMA4,
diff --git a/drivers/ide/pci/delkin_cb.c b/drivers/ide/pci/delkin_cb.c
index 0106e2a2df77..f84bfb4f600f 100644
--- a/drivers/ide/pci/delkin_cb.c
+++ b/drivers/ide/pci/delkin_cb.c
@@ -56,11 +56,10 @@ static const struct ide_port_info delkin_cb_port_info = {
56static int __devinit 56static int __devinit
57delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) 57delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
58{ 58{
59 struct ide_host *host;
59 unsigned long base; 60 unsigned long base;
60 hw_regs_t hw;
61 ide_hwif_t *hwif = NULL;
62 int i, rc; 61 int i, rc;
63 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 62 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
64 63
65 rc = pci_enable_device(dev); 64 rc = pci_enable_device(dev);
66 if (rc) { 65 if (rc) {
@@ -87,34 +86,26 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
87 hw.dev = &dev->dev; 86 hw.dev = &dev->dev;
88 hw.chipset = ide_pci; /* this enables IRQ sharing */ 87 hw.chipset = ide_pci; /* this enables IRQ sharing */
89 88
90 hwif = ide_find_port(); 89 rc = ide_host_add(&delkin_cb_port_info, hws, &host);
91 if (hwif == NULL) 90 if (rc)
92 goto out_disable; 91 goto out_disable;
93 92
94 i = hwif->index; 93 pci_set_drvdata(dev, host);
95
96 ide_init_port_hw(hwif, &hw);
97
98 idx[0] = i;
99
100 ide_device_add(idx, &delkin_cb_port_info);
101
102 pci_set_drvdata(dev, hwif);
103 94
104 return 0; 95 return 0;
105 96
106out_disable: 97out_disable:
107 pci_release_regions(dev); 98 pci_release_regions(dev);
108 pci_disable_device(dev); 99 pci_disable_device(dev);
109 return -ENODEV; 100 return rc;
110} 101}
111 102
112static void 103static void
113delkin_cb_remove (struct pci_dev *dev) 104delkin_cb_remove (struct pci_dev *dev)
114{ 105{
115 ide_hwif_t *hwif = pci_get_drvdata(dev); 106 struct ide_host *host = pci_get_drvdata(dev);
116 107
117 ide_unregister(hwif); 108 ide_host_remove(host);
118 109
119 pci_release_regions(dev); 110 pci_release_regions(dev);
120 pci_disable_device(dev); 111 pci_disable_device(dev);
diff --git a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c
index 84c36c117194..9e1d1c4741da 100644
--- a/drivers/ide/pci/hpt34x.c
+++ b/drivers/ide/pci/hpt34x.c
@@ -123,7 +123,6 @@ static const struct ide_port_ops hpt34x_port_ops = {
123#define IDE_HFLAGS_HPT34X \ 123#define IDE_HFLAGS_HPT34X \
124 (IDE_HFLAG_NO_ATAPI_DMA | \ 124 (IDE_HFLAG_NO_ATAPI_DMA | \
125 IDE_HFLAG_NO_DSC | \ 125 IDE_HFLAG_NO_DSC | \
126 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
127 IDE_HFLAG_NO_AUTODMA) 126 IDE_HFLAG_NO_AUTODMA)
128 127
129static const struct ide_port_info hpt34x_chipsets[] __devinitdata = { 128static const struct ide_port_info hpt34x_chipsets[] __devinitdata = {
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
index 397c6cbe953c..1f1135ce7cd6 100644
--- a/drivers/ide/pci/hpt366.c
+++ b/drivers/ide/pci/hpt366.c
@@ -801,9 +801,9 @@ static void hpt370_irq_timeout(ide_drive_t *drive)
801 printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo & 0x1ff); 801 printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo & 0x1ff);
802 802
803 /* get DMA command mode */ 803 /* get DMA command mode */
804 dma_cmd = inb(hwif->dma_command); 804 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
805 /* stop DMA */ 805 /* stop DMA */
806 outb(dma_cmd & ~0x1, hwif->dma_command); 806 outb(dma_cmd & ~0x1, hwif->dma_base + ATA_DMA_CMD);
807 hpt370_clear_engine(drive); 807 hpt370_clear_engine(drive);
808} 808}
809 809
@@ -818,12 +818,12 @@ static void hpt370_dma_start(ide_drive_t *drive)
818static int hpt370_dma_end(ide_drive_t *drive) 818static int hpt370_dma_end(ide_drive_t *drive)
819{ 819{
820 ide_hwif_t *hwif = HWIF(drive); 820 ide_hwif_t *hwif = HWIF(drive);
821 u8 dma_stat = inb(hwif->dma_status); 821 u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
822 822
823 if (dma_stat & 0x01) { 823 if (dma_stat & 0x01) {
824 /* wait a little */ 824 /* wait a little */
825 udelay(20); 825 udelay(20);
826 dma_stat = inb(hwif->dma_status); 826 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
827 if (dma_stat & 0x01) 827 if (dma_stat & 0x01)
828 hpt370_irq_timeout(drive); 828 hpt370_irq_timeout(drive);
829 } 829 }
@@ -850,7 +850,7 @@ static int hpt374_dma_test_irq(ide_drive_t *drive)
850 return 0; 850 return 0;
851 } 851 }
852 852
853 dma_stat = inb(hwif->dma_status); 853 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
854 /* return 1 if INTR asserted */ 854 /* return 1 if INTR asserted */
855 if (dma_stat & 4) 855 if (dma_stat & 4)
856 return 1; 856 return 1;
@@ -1320,7 +1320,15 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif,
1320 unsigned long flags, base = ide_pci_dma_base(hwif, d); 1320 unsigned long flags, base = ide_pci_dma_base(hwif, d);
1321 u8 dma_old, dma_new, masterdma = 0, slavedma = 0; 1321 u8 dma_old, dma_new, masterdma = 0, slavedma = 0;
1322 1322
1323 if (base == 0 || ide_pci_set_master(dev, d->name) < 0) 1323 if (base == 0)
1324 return -1;
1325
1326 hwif->dma_base = base;
1327
1328 if (ide_pci_check_simplex(hwif, d) < 0)
1329 return -1;
1330
1331 if (ide_pci_set_master(dev, d->name) < 0)
1324 return -1; 1332 return -1;
1325 1333
1326 dma_old = inb(base + 2); 1334 dma_old = inb(base + 2);
@@ -1346,7 +1354,7 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif,
1346 if (ide_allocate_dma_engine(hwif)) 1354 if (ide_allocate_dma_engine(hwif))
1347 return -1; 1355 return -1;
1348 1356
1349 ide_setup_dma(hwif, base); 1357 hwif->dma_ops = &sff_dma_ops;
1350 1358
1351 return 0; 1359 return 0;
1352} 1360}
@@ -1401,7 +1409,6 @@ static int __devinit hpt36x_init(struct pci_dev *dev, struct pci_dev *dev2)
1401 1409
1402#define IDE_HFLAGS_HPT3XX \ 1410#define IDE_HFLAGS_HPT3XX \
1403 (IDE_HFLAG_NO_ATAPI_DMA | \ 1411 (IDE_HFLAG_NO_ATAPI_DMA | \
1404 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
1405 IDE_HFLAG_OFF_BOARD) 1412 IDE_HFLAG_OFF_BOARD)
1406 1413
1407static const struct ide_port_ops hpt3xx_port_ops = { 1414static const struct ide_port_ops hpt3xx_port_ops = {
diff --git a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c
index 45ba71a7182f..5cd2b32ff0ef 100644
--- a/drivers/ide/pci/ns87415.c
+++ b/drivers/ide/pci/ns87415.c
@@ -28,10 +28,6 @@
28 */ 28 */
29#include <asm/superio.h> 29#include <asm/superio.h>
30 30
31static unsigned long superio_ide_status[2];
32static unsigned long superio_ide_select[2];
33static unsigned long superio_ide_dma_status[2];
34
35#define SUPERIO_IDE_MAX_RETRIES 25 31#define SUPERIO_IDE_MAX_RETRIES 25
36 32
37/* Because of a defect in Super I/O, all reads of the PCI DMA status 33/* Because of a defect in Super I/O, all reads of the PCI DMA status
@@ -40,27 +36,28 @@ static unsigned long superio_ide_dma_status[2];
40 */ 36 */
41static u8 superio_ide_inb (unsigned long port) 37static u8 superio_ide_inb (unsigned long port)
42{ 38{
43 if (port == superio_ide_status[0] || 39 u8 tmp;
44 port == superio_ide_status[1] || 40 int retries = SUPERIO_IDE_MAX_RETRIES;
45 port == superio_ide_select[0] ||
46 port == superio_ide_select[1] ||
47 port == superio_ide_dma_status[0] ||
48 port == superio_ide_dma_status[1]) {
49 u8 tmp;
50 int retries = SUPERIO_IDE_MAX_RETRIES;
51 41
52 /* printk(" [ reading port 0x%x with retry ] ", port); */ 42 /* printk(" [ reading port 0x%x with retry ] ", port); */
53 43
54 do { 44 do {
55 tmp = inb(port); 45 tmp = inb(port);
56 if (tmp == 0) 46 if (tmp == 0)
57 udelay(50); 47 udelay(50);
58 } while (tmp == 0 && retries-- > 0); 48 } while (tmp == 0 && retries-- > 0);
59 49
60 return tmp; 50 return tmp;
61 } 51}
62 52
63 return inb(port); 53static u8 superio_read_status(ide_hwif_t *hwif)
54{
55 return superio_ide_inb(hwif->io_ports.status_addr);
56}
57
58static u8 superio_read_sff_dma_status(ide_hwif_t *hwif)
59{
60 return superio_ide_inb(hwif->dma_base + ATA_DMA_STATUS);
64} 61}
65 62
66static void superio_tf_read(ide_drive_t *drive, ide_task_t *task) 63static void superio_tf_read(ide_drive_t *drive, ide_task_t *task)
@@ -78,6 +75,8 @@ static void superio_tf_read(ide_drive_t *drive, ide_task_t *task)
78 /* be sure we're looking at the low order bits */ 75 /* be sure we're looking at the low order bits */
79 outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr); 76 outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
80 77
78 if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
79 tf->feature = inb(io_ports->feature_addr);
81 if (task->tf_flags & IDE_TFLAG_IN_NSECT) 80 if (task->tf_flags & IDE_TFLAG_IN_NSECT)
82 tf->nsect = inb(io_ports->nsect_addr); 81 tf->nsect = inb(io_ports->nsect_addr);
83 if (task->tf_flags & IDE_TFLAG_IN_LBAL) 82 if (task->tf_flags & IDE_TFLAG_IN_LBAL)
@@ -105,36 +104,32 @@ static void superio_tf_read(ide_drive_t *drive, ide_task_t *task)
105 } 104 }
106} 105}
107 106
108static void __devinit superio_ide_init_iops (struct hwif_s *hwif) 107static const struct ide_tp_ops superio_tp_ops = {
109{ 108 .exec_command = ide_exec_command,
110 struct pci_dev *pdev = to_pci_dev(hwif->dev); 109 .read_status = superio_read_status,
111 u32 base, dmabase; 110 .read_altstatus = ide_read_altstatus,
112 u8 port = hwif->channel, tmp; 111 .read_sff_dma_status = superio_read_sff_dma_status,
113 112
114 base = pci_resource_start(pdev, port * 2) & ~3; 113 .set_irq = ide_set_irq,
115 dmabase = pci_resource_start(pdev, 4) & ~3;
116
117 superio_ide_status[port] = base + 7;
118 superio_ide_select[port] = base + 6;
119 superio_ide_dma_status[port] = dmabase + (!port ? 2 : 0xa);
120
121 /* Clear error/interrupt, enable dma */
122 tmp = superio_ide_inb(superio_ide_dma_status[port]);
123 outb(tmp | 0x66, superio_ide_dma_status[port]);
124 114
125 hwif->tf_read = superio_tf_read; 115 .tf_load = ide_tf_load,
116 .tf_read = superio_tf_read,
126 117
127 /* We need to override inb to workaround a SuperIO errata */ 118 .input_data = ide_input_data,
128 hwif->INB = superio_ide_inb; 119 .output_data = ide_output_data,
129} 120};
130 121
131static void __devinit init_iops_ns87415(ide_hwif_t *hwif) 122static void __devinit superio_init_iops(struct hwif_s *hwif)
132{ 123{
133 struct pci_dev *dev = to_pci_dev(hwif->dev); 124 struct pci_dev *pdev = to_pci_dev(hwif->dev);
125 u32 dma_stat;
126 u8 port = hwif->channel, tmp;
134 127
135 if (PCI_SLOT(dev->devfn) == 0xE) 128 dma_stat = (pci_resource_start(pdev, 4) & ~3) + (!port ? 2 : 0xa);
136 /* Built-in - assume it's under superio. */ 129
137 superio_ide_init_iops(hwif); 130 /* Clear error/interrupt, enable dma */
131 tmp = superio_ide_inb(dma_stat);
132 outb(tmp | 0x66, dma_stat);
138} 133}
139#endif 134#endif
140 135
@@ -200,14 +195,14 @@ static int ns87415_dma_end(ide_drive_t *drive)
200 u8 dma_stat = 0, dma_cmd = 0; 195 u8 dma_stat = 0, dma_cmd = 0;
201 196
202 drive->waiting_for_dma = 0; 197 drive->waiting_for_dma = 0;
203 dma_stat = hwif->INB(hwif->dma_status); 198 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
204 /* get dma command mode */ 199 /* get DMA command mode */
205 dma_cmd = hwif->INB(hwif->dma_command); 200 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
206 /* stop DMA */ 201 /* stop DMA */
207 outb(dma_cmd & ~1, hwif->dma_command); 202 outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
208 /* from ERRATA: clear the INTR & ERROR bits */ 203 /* from ERRATA: clear the INTR & ERROR bits */
209 dma_cmd = hwif->INB(hwif->dma_command); 204 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
210 outb(dma_cmd | 6, hwif->dma_command); 205 outb(dma_cmd | 6, hwif->dma_base + ATA_DMA_CMD);
211 /* and free any DMA resources */ 206 /* and free any DMA resources */
212 ide_destroy_dmatable(drive); 207 ide_destroy_dmatable(drive);
213 /* verify good DMA status */ 208 /* verify good DMA status */
@@ -276,7 +271,7 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
276 outb(8, hwif->io_ports.ctl_addr); 271 outb(8, hwif->io_ports.ctl_addr);
277 do { 272 do {
278 udelay(50); 273 udelay(50);
279 stat = hwif->INB(hwif->io_ports.status_addr); 274 stat = hwif->tp_ops->read_status(hwif);
280 if (stat == 0xff) 275 if (stat == 0xff)
281 break; 276 break;
282 } while ((stat & BUSY_STAT) && --timeout); 277 } while ((stat & BUSY_STAT) && --timeout);
@@ -291,7 +286,7 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
291 if (!hwif->dma_base) 286 if (!hwif->dma_base)
292 return; 287 return;
293 288
294 outb(0x60, hwif->dma_status); 289 outb(0x60, hwif->dma_base + ATA_DMA_STATUS);
295} 290}
296 291
297static const struct ide_port_ops ns87415_port_ops = { 292static const struct ide_port_ops ns87415_port_ops = {
@@ -311,9 +306,6 @@ static const struct ide_dma_ops ns87415_dma_ops = {
311 306
312static const struct ide_port_info ns87415_chipset __devinitdata = { 307static const struct ide_port_info ns87415_chipset __devinitdata = {
313 .name = "NS87415", 308 .name = "NS87415",
314#ifdef CONFIG_SUPERIO
315 .init_iops = init_iops_ns87415,
316#endif
317 .init_hwif = init_hwif_ns87415, 309 .init_hwif = init_hwif_ns87415,
318 .port_ops = &ns87415_port_ops, 310 .port_ops = &ns87415_port_ops,
319 .dma_ops = &ns87415_dma_ops, 311 .dma_ops = &ns87415_dma_ops,
@@ -323,7 +315,16 @@ static const struct ide_port_info ns87415_chipset __devinitdata = {
323 315
324static int __devinit ns87415_init_one(struct pci_dev *dev, const struct pci_device_id *id) 316static int __devinit ns87415_init_one(struct pci_dev *dev, const struct pci_device_id *id)
325{ 317{
326 return ide_setup_pci_device(dev, &ns87415_chipset); 318 struct ide_port_info d = ns87415_chipset;
319
320#ifdef CONFIG_SUPERIO
321 if (PCI_SLOT(dev->devfn) == 0xE) {
322 /* Built-in - assume it's under superio. */
323 d.init_iops = superio_init_iops;
324 d.tp_ops = &superio_tp_ops;
325 }
326#endif
327 return ide_setup_pci_device(dev, &d);
327} 328}
328 329
329static const struct pci_device_id ns87415_pci_tbl[] = { 330static const struct pci_device_id ns87415_pci_tbl[] = {
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c
index fca89eda5c02..e54dc653b8c4 100644
--- a/drivers/ide/pci/pdc202xx_old.c
+++ b/drivers/ide/pci/pdc202xx_old.c
@@ -206,7 +206,7 @@ static int pdc202xx_dma_test_irq(ide_drive_t *drive)
206{ 206{
207 ide_hwif_t *hwif = HWIF(drive); 207 ide_hwif_t *hwif = HWIF(drive);
208 unsigned long high_16 = hwif->extra_base - 16; 208 unsigned long high_16 = hwif->extra_base - 16;
209 u8 dma_stat = inb(hwif->dma_status); 209 u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
210 u8 sc1d = inb(high_16 + 0x001d); 210 u8 sc1d = inb(high_16 + 0x001d);
211 211
212 if (hwif->channel) { 212 if (hwif->channel) {
@@ -312,7 +312,6 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
312 312
313#define IDE_HFLAGS_PDC202XX \ 313#define IDE_HFLAGS_PDC202XX \
314 (IDE_HFLAG_ERROR_STOPS_FIFO | \ 314 (IDE_HFLAG_ERROR_STOPS_FIFO | \
315 IDE_HFLAG_ABUSE_SET_DMA_MODE | \
316 IDE_HFLAG_OFF_BOARD) 315 IDE_HFLAG_OFF_BOARD)
317 316
318static const struct ide_port_ops pdc20246_port_ops = { 317static const struct ide_port_ops pdc20246_port_ops = {
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c
index f04738d14a6f..0ce41b4dddaf 100644
--- a/drivers/ide/pci/piix.c
+++ b/drivers/ide/pci/piix.c
@@ -227,9 +227,9 @@ static void piix_dma_clear_irq(ide_drive_t *drive)
227 u8 dma_stat; 227 u8 dma_stat;
228 228
229 /* clear the INTR & ERROR bits */ 229 /* clear the INTR & ERROR bits */
230 dma_stat = inb(hwif->dma_status); 230 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
231 /* Should we force the bit as well ? */ 231 /* Should we force the bit as well ? */
232 outb(dma_stat, hwif->dma_status); 232 outb(dma_stat, hwif->dma_base + ATA_DMA_STATUS);
233} 233}
234 234
235struct ich_laptop { 235struct ich_laptop {
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c
index 789c66dfbde5..94a7ab864236 100644
--- a/drivers/ide/pci/scc_pata.c
+++ b/drivers/ide/pci/scc_pata.c
@@ -65,7 +65,7 @@
65 65
66static struct scc_ports { 66static struct scc_ports {
67 unsigned long ctl, dma; 67 unsigned long ctl, dma;
68 ide_hwif_t *hwif; /* for removing port from system */ 68 struct ide_host *host; /* for removing port from system */
69} scc_ports[MAX_HWIFS]; 69} scc_ports[MAX_HWIFS];
70 70
71/* PIO transfer mode table */ 71/* PIO transfer mode table */
@@ -126,6 +126,46 @@ static u8 scc_ide_inb(unsigned long port)
126 return (u8)data; 126 return (u8)data;
127} 127}
128 128
129static void scc_exec_command(ide_hwif_t *hwif, u8 cmd)
130{
131 out_be32((void *)hwif->io_ports.command_addr, cmd);
132 eieio();
133 in_be32((void *)(hwif->dma_base + 0x01c));
134 eieio();
135}
136
137static u8 scc_read_status(ide_hwif_t *hwif)
138{
139 return (u8)in_be32((void *)hwif->io_ports.status_addr);
140}
141
142static u8 scc_read_altstatus(ide_hwif_t *hwif)
143{
144 return (u8)in_be32((void *)hwif->io_ports.ctl_addr);
145}
146
147static u8 scc_read_sff_dma_status(ide_hwif_t *hwif)
148{
149 return (u8)in_be32((void *)(hwif->dma_base + 4));
150}
151
152static void scc_set_irq(ide_hwif_t *hwif, int on)
153{
154 u8 ctl = ATA_DEVCTL_OBS;
155
156 if (on == 4) { /* hack for SRST */
157 ctl |= 4;
158 on &= ~4;
159 }
160
161 ctl |= on ? 0 : 2;
162
163 out_be32((void *)hwif->io_ports.ctl_addr, ctl);
164 eieio();
165 in_be32((void *)(hwif->dma_base + 0x01c));
166 eieio();
167}
168
129static void scc_ide_insw(unsigned long port, void *addr, u32 count) 169static void scc_ide_insw(unsigned long port, void *addr, u32 count)
130{ 170{
131 u16 *ptr = (u16 *)addr; 171 u16 *ptr = (u16 *)addr;
@@ -148,14 +188,6 @@ static void scc_ide_outb(u8 addr, unsigned long port)
148 out_be32((void*)port, addr); 188 out_be32((void*)port, addr);
149} 189}
150 190
151static void scc_ide_outbsync(ide_hwif_t *hwif, u8 addr, unsigned long port)
152{
153 out_be32((void*)port, addr);
154 eieio();
155 in_be32((void*)(hwif->dma_base + 0x01c));
156 eieio();
157}
158
159static void 191static void
160scc_ide_outsw(unsigned long port, void *addr, u32 count) 192scc_ide_outsw(unsigned long port, void *addr, u32 count)
161{ 193{
@@ -261,14 +293,14 @@ static void scc_dma_host_set(ide_drive_t *drive, int on)
261{ 293{
262 ide_hwif_t *hwif = drive->hwif; 294 ide_hwif_t *hwif = drive->hwif;
263 u8 unit = (drive->select.b.unit & 0x01); 295 u8 unit = (drive->select.b.unit & 0x01);
264 u8 dma_stat = scc_ide_inb(hwif->dma_status); 296 u8 dma_stat = scc_ide_inb(hwif->dma_base + 4);
265 297
266 if (on) 298 if (on)
267 dma_stat |= (1 << (5 + unit)); 299 dma_stat |= (1 << (5 + unit));
268 else 300 else
269 dma_stat &= ~(1 << (5 + unit)); 301 dma_stat &= ~(1 << (5 + unit));
270 302
271 scc_ide_outb(dma_stat, hwif->dma_status); 303 scc_ide_outb(dma_stat, hwif->dma_base + 4);
272} 304}
273 305
274/** 306/**
@@ -304,13 +336,13 @@ static int scc_dma_setup(ide_drive_t *drive)
304 out_be32((void __iomem *)(hwif->dma_base + 8), hwif->dmatable_dma); 336 out_be32((void __iomem *)(hwif->dma_base + 8), hwif->dmatable_dma);
305 337
306 /* specify r/w */ 338 /* specify r/w */
307 out_be32((void __iomem *)hwif->dma_command, reading); 339 out_be32((void __iomem *)hwif->dma_base, reading);
308 340
309 /* read dma_status for INTR & ERROR flags */ 341 /* read DMA status for INTR & ERROR flags */
310 dma_stat = in_be32((void __iomem *)hwif->dma_status); 342 dma_stat = in_be32((void __iomem *)(hwif->dma_base + 4));
311 343
312 /* clear INTR & ERROR flags */ 344 /* clear INTR & ERROR flags */
313 out_be32((void __iomem *)hwif->dma_status, dma_stat|6); 345 out_be32((void __iomem *)(hwif->dma_base + 4), dma_stat | 6);
314 drive->waiting_for_dma = 1; 346 drive->waiting_for_dma = 1;
315 return 0; 347 return 0;
316} 348}
@@ -318,10 +350,10 @@ static int scc_dma_setup(ide_drive_t *drive)
318static void scc_dma_start(ide_drive_t *drive) 350static void scc_dma_start(ide_drive_t *drive)
319{ 351{
320 ide_hwif_t *hwif = drive->hwif; 352 ide_hwif_t *hwif = drive->hwif;
321 u8 dma_cmd = scc_ide_inb(hwif->dma_command); 353 u8 dma_cmd = scc_ide_inb(hwif->dma_base);
322 354
323 /* start DMA */ 355 /* start DMA */
324 scc_ide_outb(dma_cmd | 1, hwif->dma_command); 356 scc_ide_outb(dma_cmd | 1, hwif->dma_base);
325 hwif->dma = 1; 357 hwif->dma = 1;
326 wmb(); 358 wmb();
327} 359}
@@ -333,13 +365,13 @@ static int __scc_dma_end(ide_drive_t *drive)
333 365
334 drive->waiting_for_dma = 0; 366 drive->waiting_for_dma = 0;
335 /* get DMA command mode */ 367 /* get DMA command mode */
336 dma_cmd = scc_ide_inb(hwif->dma_command); 368 dma_cmd = scc_ide_inb(hwif->dma_base);
337 /* stop DMA */ 369 /* stop DMA */
338 scc_ide_outb(dma_cmd & ~1, hwif->dma_command); 370 scc_ide_outb(dma_cmd & ~1, hwif->dma_base);
339 /* get DMA status */ 371 /* get DMA status */
340 dma_stat = scc_ide_inb(hwif->dma_status); 372 dma_stat = scc_ide_inb(hwif->dma_base + 4);
341 /* clear the INTR & ERROR bits */ 373 /* clear the INTR & ERROR bits */
342 scc_ide_outb(dma_stat | 6, hwif->dma_status); 374 scc_ide_outb(dma_stat | 6, hwif->dma_base + 4);
343 /* purge DMA mappings */ 375 /* purge DMA mappings */
344 ide_destroy_dmatable(drive); 376 ide_destroy_dmatable(drive);
345 /* verify good DMA status */ 377 /* verify good DMA status */
@@ -359,6 +391,7 @@ static int __scc_dma_end(ide_drive_t *drive)
359static int scc_dma_end(ide_drive_t *drive) 391static int scc_dma_end(ide_drive_t *drive)
360{ 392{
361 ide_hwif_t *hwif = HWIF(drive); 393 ide_hwif_t *hwif = HWIF(drive);
394 void __iomem *dma_base = (void __iomem *)hwif->dma_base;
362 unsigned long intsts_port = hwif->dma_base + 0x014; 395 unsigned long intsts_port = hwif->dma_base + 0x014;
363 u32 reg; 396 u32 reg;
364 int dma_stat, data_loss = 0; 397 int dma_stat, data_loss = 0;
@@ -397,7 +430,7 @@ static int scc_dma_end(ide_drive_t *drive)
397 printk(KERN_WARNING "%s: SERROR\n", SCC_PATA_NAME); 430 printk(KERN_WARNING "%s: SERROR\n", SCC_PATA_NAME);
398 out_be32((void __iomem *)intsts_port, INTSTS_SERROR|INTSTS_BMSINT); 431 out_be32((void __iomem *)intsts_port, INTSTS_SERROR|INTSTS_BMSINT);
399 432
400 out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS); 433 out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
401 continue; 434 continue;
402 } 435 }
403 436
@@ -412,7 +445,7 @@ static int scc_dma_end(ide_drive_t *drive)
412 445
413 out_be32((void __iomem *)intsts_port, INTSTS_PRERR|INTSTS_BMSINT); 446 out_be32((void __iomem *)intsts_port, INTSTS_PRERR|INTSTS_BMSINT);
414 447
415 out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS); 448 out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
416 continue; 449 continue;
417 } 450 }
418 451
@@ -420,12 +453,12 @@ static int scc_dma_end(ide_drive_t *drive)
420 printk(KERN_WARNING "%s: Response Error\n", SCC_PATA_NAME); 453 printk(KERN_WARNING "%s: Response Error\n", SCC_PATA_NAME);
421 out_be32((void __iomem *)intsts_port, INTSTS_RERR|INTSTS_BMSINT); 454 out_be32((void __iomem *)intsts_port, INTSTS_RERR|INTSTS_BMSINT);
422 455
423 out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS); 456 out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
424 continue; 457 continue;
425 } 458 }
426 459
427 if (reg & INTSTS_ICERR) { 460 if (reg & INTSTS_ICERR) {
428 out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS); 461 out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
429 462
430 printk(KERN_WARNING "%s: Illegal Configuration\n", SCC_PATA_NAME); 463 printk(KERN_WARNING "%s: Illegal Configuration\n", SCC_PATA_NAME);
431 out_be32((void __iomem *)intsts_port, INTSTS_ICERR|INTSTS_BMSINT); 464 out_be32((void __iomem *)intsts_port, INTSTS_ICERR|INTSTS_BMSINT);
@@ -553,14 +586,9 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev,
553 const struct ide_port_info *d) 586 const struct ide_port_info *d)
554{ 587{
555 struct scc_ports *ports = pci_get_drvdata(dev); 588 struct scc_ports *ports = pci_get_drvdata(dev);
556 ide_hwif_t *hwif = NULL; 589 struct ide_host *host;
557 hw_regs_t hw; 590 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
558 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 591 int i, rc;
559 int i;
560
561 hwif = ide_find_port_slot(d);
562 if (hwif == NULL)
563 return -ENOMEM;
564 592
565 memset(&hw, 0, sizeof(hw)); 593 memset(&hw, 0, sizeof(hw));
566 for (i = 0; i <= 8; i++) 594 for (i = 0; i <= 8; i++)
@@ -568,11 +596,12 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev,
568 hw.irq = dev->irq; 596 hw.irq = dev->irq;
569 hw.dev = &dev->dev; 597 hw.dev = &dev->dev;
570 hw.chipset = ide_pci; 598 hw.chipset = ide_pci;
571 ide_init_port_hw(hwif, &hw);
572 599
573 idx[0] = hwif->index; 600 rc = ide_host_add(d, hws, &host);
601 if (rc)
602 return rc;
574 603
575 ide_device_add(idx, d); 604 ports->host = host;
576 605
577 return 0; 606 return 0;
578} 607}
@@ -701,6 +730,8 @@ static void scc_tf_read(ide_drive_t *drive, ide_task_t *task)
701 /* be sure we're looking at the low order bits */ 730 /* be sure we're looking at the low order bits */
702 scc_ide_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr); 731 scc_ide_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
703 732
733 if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
734 tf->feature = scc_ide_inb(io_ports->feature_addr);
704 if (task->tf_flags & IDE_TFLAG_IN_NSECT) 735 if (task->tf_flags & IDE_TFLAG_IN_NSECT)
705 tf->nsect = scc_ide_inb(io_ports->nsect_addr); 736 tf->nsect = scc_ide_inb(io_ports->nsect_addr);
706 if (task->tf_flags & IDE_TFLAG_IN_LBAL) 737 if (task->tf_flags & IDE_TFLAG_IN_LBAL)
@@ -774,16 +805,6 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
774 805
775 ide_set_hwifdata(hwif, ports); 806 ide_set_hwifdata(hwif, ports);
776 807
777 hwif->tf_load = scc_tf_load;
778 hwif->tf_read = scc_tf_read;
779
780 hwif->input_data = scc_input_data;
781 hwif->output_data = scc_output_data;
782
783 hwif->INB = scc_ide_inb;
784 hwif->OUTB = scc_ide_outb;
785 hwif->OUTBSYNC = scc_ide_outbsync;
786
787 hwif->dma_base = dma_base; 808 hwif->dma_base = dma_base;
788 hwif->config_data = ports->ctl; 809 hwif->config_data = ports->ctl;
789} 810}
@@ -824,11 +845,6 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif)
824{ 845{
825 struct scc_ports *ports = ide_get_hwifdata(hwif); 846 struct scc_ports *ports = ide_get_hwifdata(hwif);
826 847
827 ports->hwif = hwif;
828
829 hwif->dma_command = hwif->dma_base;
830 hwif->dma_status = hwif->dma_base + 0x04;
831
832 /* PTERADD */ 848 /* PTERADD */
833 out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma); 849 out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma);
834 850
@@ -838,6 +854,21 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif)
838 hwif->ultra_mask = ATA_UDMA5; /* 100MHz */ 854 hwif->ultra_mask = ATA_UDMA5; /* 100MHz */
839} 855}
840 856
857static const struct ide_tp_ops scc_tp_ops = {
858 .exec_command = scc_exec_command,
859 .read_status = scc_read_status,
860 .read_altstatus = scc_read_altstatus,
861 .read_sff_dma_status = scc_read_sff_dma_status,
862
863 .set_irq = scc_set_irq,
864
865 .tf_load = scc_tf_load,
866 .tf_read = scc_tf_read,
867
868 .input_data = scc_input_data,
869 .output_data = scc_output_data,
870};
871
841static const struct ide_port_ops scc_port_ops = { 872static const struct ide_port_ops scc_port_ops = {
842 .set_pio_mode = scc_set_pio_mode, 873 .set_pio_mode = scc_set_pio_mode,
843 .set_dma_mode = scc_set_dma_mode, 874 .set_dma_mode = scc_set_dma_mode,
@@ -861,6 +892,7 @@ static const struct ide_dma_ops scc_dma_ops = {
861 .name = name_str, \ 892 .name = name_str, \
862 .init_iops = init_iops_scc, \ 893 .init_iops = init_iops_scc, \
863 .init_hwif = init_hwif_scc, \ 894 .init_hwif = init_hwif_scc, \
895 .tp_ops = &scc_tp_ops, \
864 .port_ops = &scc_port_ops, \ 896 .port_ops = &scc_port_ops, \
865 .dma_ops = &scc_dma_ops, \ 897 .dma_ops = &scc_dma_ops, \
866 .host_flags = IDE_HFLAG_SINGLE, \ 898 .host_flags = IDE_HFLAG_SINGLE, \
@@ -895,7 +927,8 @@ static int __devinit scc_init_one(struct pci_dev *dev, const struct pci_device_i
895static void __devexit scc_remove(struct pci_dev *dev) 927static void __devexit scc_remove(struct pci_dev *dev)
896{ 928{
897 struct scc_ports *ports = pci_get_drvdata(dev); 929 struct scc_ports *ports = pci_get_drvdata(dev);
898 ide_hwif_t *hwif = ports->hwif; 930 struct ide_host *host = ports->host;
931 ide_hwif_t *hwif = host->ports[0];
899 932
900 if (hwif->dmatable_cpu) { 933 if (hwif->dmatable_cpu) {
901 pci_free_consistent(dev, PRD_ENTRIES * PRD_BYTES, 934 pci_free_consistent(dev, PRD_ENTRIES * PRD_BYTES,
@@ -903,7 +936,7 @@ static void __devexit scc_remove(struct pci_dev *dev)
903 hwif->dmatable_cpu = NULL; 936 hwif->dmatable_cpu = NULL;
904 } 937 }
905 938
906 ide_unregister(hwif); 939 ide_host_remove(host);
907 940
908 iounmap((void*)ports->dma); 941 iounmap((void*)ports->dma);
909 iounmap((void*)ports->ctl); 942 iounmap((void*)ports->ctl);
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c
index a1fb20826a5b..127ccb45e261 100644
--- a/drivers/ide/pci/serverworks.c
+++ b/drivers/ide/pci/serverworks.c
@@ -349,9 +349,7 @@ static const struct ide_port_ops svwks_port_ops = {
349 .cable_detect = svwks_cable_detect, 349 .cable_detect = svwks_cable_detect,
350}; 350};
351 351
352#define IDE_HFLAGS_SVWKS \ 352#define IDE_HFLAGS_SVWKS IDE_HFLAG_LEGACY_IRQS
353 (IDE_HFLAG_LEGACY_IRQS | \
354 IDE_HFLAG_ABUSE_SET_DMA_MODE)
355 353
356static const struct ide_port_info serverworks_chipsets[] __devinitdata = { 354static const struct ide_port_info serverworks_chipsets[] __devinitdata = {
357 { /* 0 */ 355 { /* 0 */
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
index c79ff5b41088..42eef19a18f1 100644
--- a/drivers/ide/pci/sgiioc4.c
+++ b/drivers/ide/pci/sgiioc4.c
@@ -127,7 +127,7 @@ sgiioc4_checkirq(ide_hwif_t * hwif)
127 return 0; 127 return 0;
128} 128}
129 129
130static u8 sgiioc4_INB(unsigned long); 130static u8 sgiioc4_read_status(ide_hwif_t *);
131 131
132static int 132static int
133sgiioc4_clearirq(ide_drive_t * drive) 133sgiioc4_clearirq(ide_drive_t * drive)
@@ -141,18 +141,19 @@ sgiioc4_clearirq(ide_drive_t * drive)
141 intr_reg = readl((void __iomem *)other_ir); 141 intr_reg = readl((void __iomem *)other_ir);
142 if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */ 142 if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */
143 /* 143 /*
144 * Using sgiioc4_INB to read the Status register has a side 144 * Using sgiioc4_read_status to read the Status register has a
145 * effect of clearing the interrupt. The first read should 145 * side effect of clearing the interrupt. The first read should
146 * clear it if it is set. The second read should return 146 * clear it if it is set. The second read should return
147 * a "clear" status if it got cleared. If not, then spin 147 * a "clear" status if it got cleared. If not, then spin
148 * for a bit trying to clear it. 148 * for a bit trying to clear it.
149 */ 149 */
150 u8 stat = sgiioc4_INB(io_ports->status_addr); 150 u8 stat = sgiioc4_read_status(hwif);
151 int count = 0; 151 int count = 0;
152 stat = sgiioc4_INB(io_ports->status_addr); 152
153 stat = sgiioc4_read_status(hwif);
153 while ((stat & 0x80) && (count++ < 100)) { 154 while ((stat & 0x80) && (count++ < 100)) {
154 udelay(1); 155 udelay(1);
155 stat = sgiioc4_INB(io_ports->status_addr); 156 stat = sgiioc4_read_status(hwif);
156 } 157 }
157 158
158 if (intr_reg & 0x02) { 159 if (intr_reg & 0x02) {
@@ -304,9 +305,9 @@ sgiioc4_dma_lost_irq(ide_drive_t * drive)
304 ide_dma_lost_irq(drive); 305 ide_dma_lost_irq(drive);
305} 306}
306 307
307static u8 308static u8 sgiioc4_read_status(ide_hwif_t *hwif)
308sgiioc4_INB(unsigned long port)
309{ 309{
310 unsigned long port = hwif->io_ports.status_addr;
310 u8 reg = (u8) readb((void __iomem *) port); 311 u8 reg = (u8) readb((void __iomem *) port);
311 312
312 if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */ 313 if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */
@@ -549,6 +550,21 @@ static int sgiioc4_dma_setup(ide_drive_t *drive)
549 return 0; 550 return 0;
550} 551}
551 552
553static const struct ide_tp_ops sgiioc4_tp_ops = {
554 .exec_command = ide_exec_command,
555 .read_status = sgiioc4_read_status,
556 .read_altstatus = ide_read_altstatus,
557 .read_sff_dma_status = ide_read_sff_dma_status,
558
559 .set_irq = ide_set_irq,
560
561 .tf_load = ide_tf_load,
562 .tf_read = ide_tf_read,
563
564 .input_data = ide_input_data,
565 .output_data = ide_output_data,
566};
567
552static const struct ide_port_ops sgiioc4_port_ops = { 568static const struct ide_port_ops sgiioc4_port_ops = {
553 .set_dma_mode = sgiioc4_set_dma_mode, 569 .set_dma_mode = sgiioc4_set_dma_mode,
554 /* reset DMA engine, clear IRQs */ 570 /* reset DMA engine, clear IRQs */
@@ -571,6 +587,7 @@ static const struct ide_port_info sgiioc4_port_info __devinitdata = {
571 .name = DRV_NAME, 587 .name = DRV_NAME,
572 .chipset = ide_pci, 588 .chipset = ide_pci,
573 .init_dma = ide_dma_sgiioc4, 589 .init_dma = ide_dma_sgiioc4,
590 .tp_ops = &sgiioc4_tp_ops,
574 .port_ops = &sgiioc4_port_ops, 591 .port_ops = &sgiioc4_port_ops,
575 .dma_ops = &sgiioc4_dma_ops, 592 .dma_ops = &sgiioc4_dma_ops,
576 .host_flags = IDE_HFLAG_MMIO, 593 .host_flags = IDE_HFLAG_MMIO,
@@ -583,10 +600,10 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
583 unsigned long cmd_base, irqport; 600 unsigned long cmd_base, irqport;
584 unsigned long bar0, cmd_phys_base, ctl; 601 unsigned long bar0, cmd_phys_base, ctl;
585 void __iomem *virt_base; 602 void __iomem *virt_base;
586 ide_hwif_t *hwif; 603 struct ide_host *host;
587 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 604 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
588 hw_regs_t hw;
589 struct ide_port_info d = sgiioc4_port_info; 605 struct ide_port_info d = sgiioc4_port_info;
606 int rc;
590 607
591 /* Get the CmdBlk and CtrlBlk Base Registers */ 608 /* Get the CmdBlk and CtrlBlk Base Registers */
592 bar0 = pci_resource_start(dev, 0); 609 bar0 = pci_resource_start(dev, 0);
@@ -618,30 +635,26 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
618 hw.chipset = ide_pci; 635 hw.chipset = ide_pci;
619 hw.dev = &dev->dev; 636 hw.dev = &dev->dev;
620 637
621 hwif = ide_find_port_slot(&d);
622 if (hwif == NULL)
623 goto err;
624
625 ide_init_port_hw(hwif, &hw);
626
627 /* The IOC4 uses MMIO rather than Port IO. */
628 default_hwif_mmiops(hwif);
629
630 /* Initializing chipset IRQ Registers */ 638 /* Initializing chipset IRQ Registers */
631 writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); 639 writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4));
632 640
633 hwif->INB = &sgiioc4_INB; 641 host = ide_host_alloc(&d, hws);
634 642 if (host == NULL) {
635 idx[0] = hwif->index; 643 rc = -ENOMEM;
644 goto err;
645 }
636 646
637 if (ide_device_add(idx, &d)) 647 rc = ide_host_register(host, &d, hws);
638 return -EIO; 648 if (rc)
649 goto err_free;
639 650
640 return 0; 651 return 0;
652err_free:
653 ide_host_free(host);
641err: 654err:
642 release_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE); 655 release_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE);
643 iounmap(virt_base); 656 iounmap(virt_base);
644 return -ENOMEM; 657 return rc;
645} 658}
646 659
647static unsigned int __devinit 660static unsigned int __devinit
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c
index 6e9d7655d89c..5965a35d94ae 100644
--- a/drivers/ide/pci/siimage.c
+++ b/drivers/ide/pci/siimage.c
@@ -334,7 +334,7 @@ static int siimage_io_dma_test_irq(ide_drive_t *drive)
334 unsigned long addr = siimage_selreg(hwif, 1); 334 unsigned long addr = siimage_selreg(hwif, 1);
335 335
336 /* return 1 if INTR asserted */ 336 /* return 1 if INTR asserted */
337 if (hwif->INB(hwif->dma_status) & 4) 337 if (inb(hwif->dma_base + ATA_DMA_STATUS) & 4)
338 return 1; 338 return 1;
339 339
340 /* return 1 if Device INTR asserted */ 340 /* return 1 if Device INTR asserted */
@@ -382,7 +382,7 @@ static int siimage_mmio_dma_test_irq(ide_drive_t *drive)
382 } 382 }
383 383
384 /* return 1 if INTR asserted */ 384 /* return 1 if INTR asserted */
385 if (readb((void __iomem *)hwif->dma_status) & 0x04) 385 if (readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS)) & 4)
386 return 1; 386 return 1;
387 387
388 /* return 1 if Device INTR asserted */ 388 /* return 1 if Device INTR asserted */
@@ -601,7 +601,7 @@ static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif)
601 * Fill in the basic hwif bits 601 * Fill in the basic hwif bits
602 */ 602 */
603 hwif->host_flags |= IDE_HFLAG_MMIO; 603 hwif->host_flags |= IDE_HFLAG_MMIO;
604 default_hwif_mmiops(hwif); 604
605 hwif->hwif_data = addr; 605 hwif->hwif_data = addr;
606 606
607 /* 607 /*
diff --git a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c
index 6efbde297174..f82a6502c1b7 100644
--- a/drivers/ide/pci/sl82c105.c
+++ b/drivers/ide/pci/sl82c105.c
@@ -157,9 +157,9 @@ static void sl82c105_dma_lost_irq(ide_drive_t *drive)
157 * Was DMA enabled? If so, disable it - we're resetting the 157 * Was DMA enabled? If so, disable it - we're resetting the
158 * host. The IDE layer will be handling the drive for us. 158 * host. The IDE layer will be handling the drive for us.
159 */ 159 */
160 dma_cmd = inb(hwif->dma_command); 160 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
161 if (dma_cmd & 1) { 161 if (dma_cmd & 1) {
162 outb(dma_cmd & ~1, hwif->dma_command); 162 outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
163 printk("sl82c105: DMA was enabled\n"); 163 printk("sl82c105: DMA was enabled\n");
164 } 164 }
165 165
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c
index 9b4b27a4c711..477e19790102 100644
--- a/drivers/ide/pci/tc86c001.c
+++ b/drivers/ide/pci/tc86c001.c
@@ -63,7 +63,7 @@ static int tc86c001_timer_expiry(ide_drive_t *drive)
63 ide_hwif_t *hwif = HWIF(drive); 63 ide_hwif_t *hwif = HWIF(drive);
64 ide_expiry_t *expiry = ide_get_hwifdata(hwif); 64 ide_expiry_t *expiry = ide_get_hwifdata(hwif);
65 ide_hwgroup_t *hwgroup = HWGROUP(drive); 65 ide_hwgroup_t *hwgroup = HWGROUP(drive);
66 u8 dma_stat = inb(hwif->dma_status); 66 u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
67 67
68 /* Restore a higher level driver's expiry handler first. */ 68 /* Restore a higher level driver's expiry handler first. */
69 hwgroup->expiry = expiry; 69 hwgroup->expiry = expiry;
@@ -71,21 +71,24 @@ static int tc86c001_timer_expiry(ide_drive_t *drive)
71 if ((dma_stat & 5) == 1) { /* DMA active and no interrupt */ 71 if ((dma_stat & 5) == 1) { /* DMA active and no interrupt */
72 unsigned long sc_base = hwif->config_data; 72 unsigned long sc_base = hwif->config_data;
73 unsigned long twcr_port = sc_base + (drive->dn ? 0x06 : 0x04); 73 unsigned long twcr_port = sc_base + (drive->dn ? 0x06 : 0x04);
74 u8 dma_cmd = inb(hwif->dma_command); 74 u8 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
75 75
76 printk(KERN_WARNING "%s: DMA interrupt possibly stuck, " 76 printk(KERN_WARNING "%s: DMA interrupt possibly stuck, "
77 "attempting recovery...\n", drive->name); 77 "attempting recovery...\n", drive->name);
78 78
79 /* Stop DMA */ 79 /* Stop DMA */
80 outb(dma_cmd & ~0x01, hwif->dma_command); 80 outb(dma_cmd & ~0x01, hwif->dma_base + ATA_DMA_CMD);
81 81
82 /* Setup the dummy DMA transfer */ 82 /* Setup the dummy DMA transfer */
83 outw(0, sc_base + 0x0a); /* Sector Count */ 83 outw(0, sc_base + 0x0a); /* Sector Count */
84 outw(0, twcr_port); /* Transfer Word Count 1 or 2 */ 84 outw(0, twcr_port); /* Transfer Word Count 1 or 2 */
85 85
86 /* Start the dummy DMA transfer */ 86 /* Start the dummy DMA transfer */
87 outb(0x00, hwif->dma_command); /* clear R_OR_WCTR for write */ 87
88 outb(0x01, hwif->dma_command); /* set START_STOPBM */ 88 /* clear R_OR_WCTR for write */
89 outb(0x00, hwif->dma_base + ATA_DMA_CMD);
90 /* set START_STOPBM */
91 outb(0x01, hwif->dma_base + ATA_DMA_CMD);
89 92
90 /* 93 /*
91 * If an interrupt was pending, it should come thru shortly. 94 * If an interrupt was pending, it should come thru shortly.
@@ -203,8 +206,7 @@ static const struct ide_port_info tc86c001_chipset __devinitdata = {
203 .init_hwif = init_hwif_tc86c001, 206 .init_hwif = init_hwif_tc86c001,
204 .port_ops = &tc86c001_port_ops, 207 .port_ops = &tc86c001_port_ops,
205 .dma_ops = &tc86c001_dma_ops, 208 .dma_ops = &tc86c001_dma_ops,
206 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD | 209 .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD,
207 IDE_HFLAG_ABUSE_SET_DMA_MODE,
208 .pio_mask = ATA_PIO4, 210 .pio_mask = ATA_PIO4,
209 .mwdma_mask = ATA_MWDMA2, 211 .mwdma_mask = ATA_MWDMA2,
210 .udma_mask = ATA_UDMA4, 212 .udma_mask = ATA_UDMA4,
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c
index e47384c70c40..09dc4803ef9d 100644
--- a/drivers/ide/pci/via82cxxx.c
+++ b/drivers/ide/pci/via82cxxx.c
@@ -425,7 +425,6 @@ static const struct ide_port_info via82cxxx_chipset __devinitdata = {
425 .enablebits = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } }, 425 .enablebits = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } },
426 .port_ops = &via_port_ops, 426 .port_ops = &via_port_ops,
427 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST | 427 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST |
428 IDE_HFLAG_ABUSE_SET_DMA_MODE |
429 IDE_HFLAG_POST_SET_MODE | 428 IDE_HFLAG_POST_SET_MODE |
430 IDE_HFLAG_IO_32BIT, 429 IDE_HFLAG_IO_32BIT,
431 .pio_mask = ATA_PIO5, 430 .pio_mask = ATA_PIO5,
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c
index 93fb9067c043..c521bf6e1bf2 100644
--- a/drivers/ide/ppc/pmac.c
+++ b/drivers/ide/ppc/pmac.c
@@ -48,6 +48,8 @@
48#include <asm/mediabay.h> 48#include <asm/mediabay.h>
49#endif 49#endif
50 50
51#define DRV_NAME "ide-pmac"
52
51#undef IDE_PMAC_DEBUG 53#undef IDE_PMAC_DEBUG
52 54
53#define DMA_WAIT_TIMEOUT 50 55#define DMA_WAIT_TIMEOUT 50
@@ -424,7 +426,9 @@ static void pmac_ide_kauai_selectproc(ide_drive_t *drive);
424static void 426static void
425pmac_ide_selectproc(ide_drive_t *drive) 427pmac_ide_selectproc(ide_drive_t *drive)
426{ 428{
427 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 429 ide_hwif_t *hwif = drive->hwif;
430 pmac_ide_hwif_t *pmif =
431 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
428 432
429 if (pmif == NULL) 433 if (pmif == NULL)
430 return; 434 return;
@@ -444,7 +448,9 @@ pmac_ide_selectproc(ide_drive_t *drive)
444static void 448static void
445pmac_ide_kauai_selectproc(ide_drive_t *drive) 449pmac_ide_kauai_selectproc(ide_drive_t *drive)
446{ 450{
447 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 451 ide_hwif_t *hwif = drive->hwif;
452 pmac_ide_hwif_t *pmif =
453 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
448 454
449 if (pmif == NULL) 455 if (pmif == NULL)
450 return; 456 return;
@@ -465,7 +471,9 @@ pmac_ide_kauai_selectproc(ide_drive_t *drive)
465static void 471static void
466pmac_ide_do_update_timings(ide_drive_t *drive) 472pmac_ide_do_update_timings(ide_drive_t *drive)
467{ 473{
468 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 474 ide_hwif_t *hwif = drive->hwif;
475 pmac_ide_hwif_t *pmif =
476 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
469 477
470 if (pmif == NULL) 478 if (pmif == NULL)
471 return; 479 return;
@@ -478,12 +486,26 @@ pmac_ide_do_update_timings(ide_drive_t *drive)
478 pmac_ide_selectproc(drive); 486 pmac_ide_selectproc(drive);
479} 487}
480 488
481static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port) 489static void pmac_exec_command(ide_hwif_t *hwif, u8 cmd)
482{ 490{
483 u32 tmp; 491 writeb(cmd, (void __iomem *)hwif->io_ports.command_addr);
484 492 (void)readl((void __iomem *)(hwif->io_ports.data_addr
485 writeb(value, (void __iomem *) port); 493 + IDE_TIMING_CONFIG));
486 tmp = readl((void __iomem *)(hwif->io_ports.data_addr 494}
495
496static void pmac_set_irq(ide_hwif_t *hwif, int on)
497{
498 u8 ctl = ATA_DEVCTL_OBS;
499
500 if (on == 4) { /* hack for SRST */
501 ctl |= 4;
502 on &= ~4;
503 }
504
505 ctl |= on ? 0 : 2;
506
507 writeb(ctl, (void __iomem *)hwif->io_ports.ctl_addr);
508 (void)readl((void __iomem *)(hwif->io_ports.data_addr
487 + IDE_TIMING_CONFIG)); 509 + IDE_TIMING_CONFIG));
488} 510}
489 511
@@ -493,11 +515,13 @@ static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port)
493static void 515static void
494pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) 516pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio)
495{ 517{
518 ide_hwif_t *hwif = drive->hwif;
519 pmac_ide_hwif_t *pmif =
520 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
496 struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio); 521 struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio);
497 u32 *timings, t; 522 u32 *timings, t;
498 unsigned accessTicks, recTicks; 523 unsigned accessTicks, recTicks;
499 unsigned accessTime, recTime; 524 unsigned accessTime, recTime;
500 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data;
501 unsigned int cycle_time; 525 unsigned int cycle_time;
502 526
503 if (pmif == NULL) 527 if (pmif == NULL)
@@ -778,9 +802,11 @@ set_timings_mdma(ide_drive_t *drive, int intf_type, u32 *timings, u32 *timings2,
778 802
779static void pmac_ide_set_dma_mode(ide_drive_t *drive, const u8 speed) 803static void pmac_ide_set_dma_mode(ide_drive_t *drive, const u8 speed)
780{ 804{
805 ide_hwif_t *hwif = drive->hwif;
806 pmac_ide_hwif_t *pmif =
807 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
781 int unit = (drive->select.b.unit & 0x01); 808 int unit = (drive->select.b.unit & 0x01);
782 int ret = 0; 809 int ret = 0;
783 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data;
784 u32 *timings, *timings2, tl[2]; 810 u32 *timings, *timings2, tl[2];
785 811
786 timings = &pmif->timings[unit]; 812 timings = &pmif->timings[unit];
@@ -852,11 +878,8 @@ sanitize_timings(pmac_ide_hwif_t *pmif)
852/* Suspend call back, should be called after the child devices 878/* Suspend call back, should be called after the child devices
853 * have actually been suspended 879 * have actually been suspended
854 */ 880 */
855static int 881static int pmac_ide_do_suspend(pmac_ide_hwif_t *pmif)
856pmac_ide_do_suspend(ide_hwif_t *hwif)
857{ 882{
858 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data;
859
860 /* We clear the timings */ 883 /* We clear the timings */
861 pmif->timings[0] = 0; 884 pmif->timings[0] = 0;
862 pmif->timings[1] = 0; 885 pmif->timings[1] = 0;
@@ -884,11 +907,8 @@ pmac_ide_do_suspend(ide_hwif_t *hwif)
884/* Resume call back, should be called before the child devices 907/* Resume call back, should be called before the child devices
885 * are resumed 908 * are resumed
886 */ 909 */
887static int 910static int pmac_ide_do_resume(pmac_ide_hwif_t *pmif)
888pmac_ide_do_resume(ide_hwif_t *hwif)
889{ 911{
890 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data;
891
892 /* Hard reset & re-enable controller (do we really need to reset ? -BenH) */ 912 /* Hard reset & re-enable controller (do we really need to reset ? -BenH) */
893 if (!pmif->mediabay) { 913 if (!pmif->mediabay) {
894 ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1); 914 ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1);
@@ -916,7 +936,8 @@ pmac_ide_do_resume(ide_hwif_t *hwif)
916 936
917static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) 937static u8 pmac_ide_cable_detect(ide_hwif_t *hwif)
918{ 938{
919 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)ide_get_hwifdata(hwif); 939 pmac_ide_hwif_t *pmif =
940 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
920 struct device_node *np = pmif->node; 941 struct device_node *np = pmif->node;
921 const char *cable = of_get_property(np, "cable-type", NULL); 942 const char *cable = of_get_property(np, "cable-type", NULL);
922 943
@@ -936,7 +957,40 @@ static u8 pmac_ide_cable_detect(ide_hwif_t *hwif)
936 return ATA_CBL_PATA40; 957 return ATA_CBL_PATA40;
937} 958}
938 959
960static void pmac_ide_init_dev(ide_drive_t *drive)
961{
962 ide_hwif_t *hwif = drive->hwif;
963 pmac_ide_hwif_t *pmif =
964 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
965
966 if (pmif->mediabay) {
967#ifdef CONFIG_PMAC_MEDIABAY
968 if (check_media_bay_by_base(pmif->regbase, MB_CD) == 0) {
969 drive->noprobe = 0;
970 return;
971 }
972#endif
973 drive->noprobe = 1;
974 }
975}
976
977static const struct ide_tp_ops pmac_tp_ops = {
978 .exec_command = pmac_exec_command,
979 .read_status = ide_read_status,
980 .read_altstatus = ide_read_altstatus,
981 .read_sff_dma_status = ide_read_sff_dma_status,
982
983 .set_irq = pmac_set_irq,
984
985 .tf_load = ide_tf_load,
986 .tf_read = ide_tf_read,
987
988 .input_data = ide_input_data,
989 .output_data = ide_output_data,
990};
991
939static const struct ide_port_ops pmac_ide_ata6_port_ops = { 992static const struct ide_port_ops pmac_ide_ata6_port_ops = {
993 .init_dev = pmac_ide_init_dev,
940 .set_pio_mode = pmac_ide_set_pio_mode, 994 .set_pio_mode = pmac_ide_set_pio_mode,
941 .set_dma_mode = pmac_ide_set_dma_mode, 995 .set_dma_mode = pmac_ide_set_dma_mode,
942 .selectproc = pmac_ide_kauai_selectproc, 996 .selectproc = pmac_ide_kauai_selectproc,
@@ -944,6 +998,7 @@ static const struct ide_port_ops pmac_ide_ata6_port_ops = {
944}; 998};
945 999
946static const struct ide_port_ops pmac_ide_ata4_port_ops = { 1000static const struct ide_port_ops pmac_ide_ata4_port_ops = {
1001 .init_dev = pmac_ide_init_dev,
947 .set_pio_mode = pmac_ide_set_pio_mode, 1002 .set_pio_mode = pmac_ide_set_pio_mode,
948 .set_dma_mode = pmac_ide_set_dma_mode, 1003 .set_dma_mode = pmac_ide_set_dma_mode,
949 .selectproc = pmac_ide_selectproc, 1004 .selectproc = pmac_ide_selectproc,
@@ -951,6 +1006,7 @@ static const struct ide_port_ops pmac_ide_ata4_port_ops = {
951}; 1006};
952 1007
953static const struct ide_port_ops pmac_ide_port_ops = { 1008static const struct ide_port_ops pmac_ide_port_ops = {
1009 .init_dev = pmac_ide_init_dev,
954 .set_pio_mode = pmac_ide_set_pio_mode, 1010 .set_pio_mode = pmac_ide_set_pio_mode,
955 .set_dma_mode = pmac_ide_set_dma_mode, 1011 .set_dma_mode = pmac_ide_set_dma_mode,
956 .selectproc = pmac_ide_selectproc, 1012 .selectproc = pmac_ide_selectproc,
@@ -959,12 +1015,14 @@ static const struct ide_port_ops pmac_ide_port_ops = {
959static const struct ide_dma_ops pmac_dma_ops; 1015static const struct ide_dma_ops pmac_dma_ops;
960 1016
961static const struct ide_port_info pmac_port_info = { 1017static const struct ide_port_info pmac_port_info = {
1018 .name = DRV_NAME,
962 .init_dma = pmac_ide_init_dma, 1019 .init_dma = pmac_ide_init_dma,
963 .chipset = ide_pmac, 1020 .chipset = ide_pmac,
1021 .tp_ops = &pmac_tp_ops,
1022 .port_ops = &pmac_ide_port_ops,
964#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC 1023#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
965 .dma_ops = &pmac_dma_ops, 1024 .dma_ops = &pmac_dma_ops,
966#endif 1025#endif
967 .port_ops = &pmac_ide_port_ops,
968 .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA | 1026 .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA |
969 IDE_HFLAG_POST_SET_MODE | 1027 IDE_HFLAG_POST_SET_MODE |
970 IDE_HFLAG_MMIO | 1028 IDE_HFLAG_MMIO |
@@ -977,13 +1035,15 @@ static const struct ide_port_info pmac_port_info = {
977 * Setup, register & probe an IDE channel driven by this driver, this is 1035 * Setup, register & probe an IDE channel driven by this driver, this is
978 * called by one of the 2 probe functions (macio or PCI). 1036 * called by one of the 2 probe functions (macio or PCI).
979 */ 1037 */
980static int __devinit 1038static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw)
981pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
982{ 1039{
983 struct device_node *np = pmif->node; 1040 struct device_node *np = pmif->node;
984 const int *bidp; 1041 const int *bidp;
985 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 1042 struct ide_host *host;
1043 ide_hwif_t *hwif;
1044 hw_regs_t *hws[] = { hw, NULL, NULL, NULL };
986 struct ide_port_info d = pmac_port_info; 1045 struct ide_port_info d = pmac_port_info;
1046 int rc;
987 1047
988 pmif->broken_dma = pmif->broken_dma_warn = 0; 1048 pmif->broken_dma = pmif->broken_dma_warn = 0;
989 if (of_device_is_compatible(np, "shasta-ata")) { 1049 if (of_device_is_compatible(np, "shasta-ata")) {
@@ -1054,31 +1114,16 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
1054 msleep(jiffies_to_msecs(IDE_WAKEUP_DELAY)); 1114 msleep(jiffies_to_msecs(IDE_WAKEUP_DELAY));
1055 } 1115 }
1056 1116
1057 /* Setup MMIO ops */ 1117 printk(KERN_INFO DRV_NAME ": Found Apple %s controller (%s), "
1058 default_hwif_mmiops(hwif); 1118 "bus ID %d%s, irq %d\n", model_name[pmif->kind],
1059 hwif->OUTBSYNC = pmac_outbsync; 1119 pmif->mdev ? "macio" : "PCI", pmif->aapl_bus_id,
1120 pmif->mediabay ? " (mediabay)" : "", hw->irq);
1060 1121
1061 hwif->hwif_data = pmif; 1122 rc = ide_host_add(&d, hws, &host);
1062 ide_init_port_hw(hwif, hw); 1123 if (rc)
1124 return rc;
1063 1125
1064 printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", 1126 hwif = host->ports[0];
1065 hwif->index, model_name[pmif->kind], pmif->aapl_bus_id,
1066 pmif->mediabay ? " (mediabay)" : "", hwif->irq);
1067
1068 if (pmif->mediabay) {
1069#ifdef CONFIG_PMAC_MEDIABAY
1070 if (check_media_bay_by_base(pmif->regbase, MB_CD)) {
1071#else
1072 if (1) {
1073#endif
1074 hwif->drives[0].noprobe = 1;
1075 hwif->drives[1].noprobe = 1;
1076 }
1077 }
1078
1079 idx[0] = hwif->index;
1080
1081 ide_device_add(idx, &d);
1082 1127
1083 return 0; 1128 return 0;
1084} 1129}
@@ -1101,7 +1146,6 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
1101{ 1146{
1102 void __iomem *base; 1147 void __iomem *base;
1103 unsigned long regbase; 1148 unsigned long regbase;
1104 ide_hwif_t *hwif;
1105 pmac_ide_hwif_t *pmif; 1149 pmac_ide_hwif_t *pmif;
1106 int irq, rc; 1150 int irq, rc;
1107 hw_regs_t hw; 1151 hw_regs_t hw;
@@ -1110,14 +1154,6 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
1110 if (pmif == NULL) 1154 if (pmif == NULL)
1111 return -ENOMEM; 1155 return -ENOMEM;
1112 1156
1113 hwif = ide_find_port();
1114 if (hwif == NULL) {
1115 printk(KERN_ERR "ide-pmac: MacIO interface attach with no slot\n");
1116 printk(KERN_ERR " %s\n", mdev->ofdev.node->full_name);
1117 rc = -ENODEV;
1118 goto out_free_pmif;
1119 }
1120
1121 if (macio_resource_count(mdev) == 0) { 1157 if (macio_resource_count(mdev) == 0) {
1122 printk(KERN_WARNING "ide-pmac: no address for %s\n", 1158 printk(KERN_WARNING "ide-pmac: no address for %s\n",
1123 mdev->ofdev.node->full_name); 1159 mdev->ofdev.node->full_name);
@@ -1164,7 +1200,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
1164 } else 1200 } else
1165 pmif->dma_regs = NULL; 1201 pmif->dma_regs = NULL;
1166#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ 1202#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
1167 dev_set_drvdata(&mdev->ofdev.dev, hwif); 1203 dev_set_drvdata(&mdev->ofdev.dev, pmif);
1168 1204
1169 memset(&hw, 0, sizeof(hw)); 1205 memset(&hw, 0, sizeof(hw));
1170 pmac_ide_init_ports(&hw, pmif->regbase); 1206 pmac_ide_init_ports(&hw, pmif->regbase);
@@ -1172,7 +1208,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
1172 hw.dev = &mdev->bus->pdev->dev; 1208 hw.dev = &mdev->bus->pdev->dev;
1173 hw.parent = &mdev->ofdev.dev; 1209 hw.parent = &mdev->ofdev.dev;
1174 1210
1175 rc = pmac_ide_setup_device(pmif, hwif, &hw); 1211 rc = pmac_ide_setup_device(pmif, &hw);
1176 if (rc != 0) { 1212 if (rc != 0) {
1177 /* The inteface is released to the common IDE layer */ 1213 /* The inteface is released to the common IDE layer */
1178 dev_set_drvdata(&mdev->ofdev.dev, NULL); 1214 dev_set_drvdata(&mdev->ofdev.dev, NULL);
@@ -1195,12 +1231,13 @@ out_free_pmif:
1195static int 1231static int
1196pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) 1232pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg)
1197{ 1233{
1198 ide_hwif_t *hwif = (ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); 1234 pmac_ide_hwif_t *pmif =
1199 int rc = 0; 1235 (pmac_ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev);
1236 int rc = 0;
1200 1237
1201 if (mesg.event != mdev->ofdev.dev.power.power_state.event 1238 if (mesg.event != mdev->ofdev.dev.power.power_state.event
1202 && (mesg.event & PM_EVENT_SLEEP)) { 1239 && (mesg.event & PM_EVENT_SLEEP)) {
1203 rc = pmac_ide_do_suspend(hwif); 1240 rc = pmac_ide_do_suspend(pmif);
1204 if (rc == 0) 1241 if (rc == 0)
1205 mdev->ofdev.dev.power.power_state = mesg; 1242 mdev->ofdev.dev.power.power_state = mesg;
1206 } 1243 }
@@ -1211,11 +1248,12 @@ pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg)
1211static int 1248static int
1212pmac_ide_macio_resume(struct macio_dev *mdev) 1249pmac_ide_macio_resume(struct macio_dev *mdev)
1213{ 1250{
1214 ide_hwif_t *hwif = (ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); 1251 pmac_ide_hwif_t *pmif =
1215 int rc = 0; 1252 (pmac_ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev);
1216 1253 int rc = 0;
1254
1217 if (mdev->ofdev.dev.power.power_state.event != PM_EVENT_ON) { 1255 if (mdev->ofdev.dev.power.power_state.event != PM_EVENT_ON) {
1218 rc = pmac_ide_do_resume(hwif); 1256 rc = pmac_ide_do_resume(pmif);
1219 if (rc == 0) 1257 if (rc == 0)
1220 mdev->ofdev.dev.power.power_state = PMSG_ON; 1258 mdev->ofdev.dev.power.power_state = PMSG_ON;
1221 } 1259 }
@@ -1229,7 +1267,6 @@ pmac_ide_macio_resume(struct macio_dev *mdev)
1229static int __devinit 1267static int __devinit
1230pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) 1268pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id)
1231{ 1269{
1232 ide_hwif_t *hwif;
1233 struct device_node *np; 1270 struct device_node *np;
1234 pmac_ide_hwif_t *pmif; 1271 pmac_ide_hwif_t *pmif;
1235 void __iomem *base; 1272 void __iomem *base;
@@ -1247,14 +1284,6 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id)
1247 if (pmif == NULL) 1284 if (pmif == NULL)
1248 return -ENOMEM; 1285 return -ENOMEM;
1249 1286
1250 hwif = ide_find_port();
1251 if (hwif == NULL) {
1252 printk(KERN_ERR "ide-pmac: PCI interface attach with no slot\n");
1253 printk(KERN_ERR " %s\n", np->full_name);
1254 rc = -ENODEV;
1255 goto out_free_pmif;
1256 }
1257
1258 if (pci_enable_device(pdev)) { 1287 if (pci_enable_device(pdev)) {
1259 printk(KERN_WARNING "ide-pmac: Can't enable PCI device for " 1288 printk(KERN_WARNING "ide-pmac: Can't enable PCI device for "
1260 "%s\n", np->full_name); 1289 "%s\n", np->full_name);
@@ -1284,14 +1313,14 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id)
1284 pmif->kauai_fcr = base; 1313 pmif->kauai_fcr = base;
1285 pmif->irq = pdev->irq; 1314 pmif->irq = pdev->irq;
1286 1315
1287 pci_set_drvdata(pdev, hwif); 1316 pci_set_drvdata(pdev, pmif);
1288 1317
1289 memset(&hw, 0, sizeof(hw)); 1318 memset(&hw, 0, sizeof(hw));
1290 pmac_ide_init_ports(&hw, pmif->regbase); 1319 pmac_ide_init_ports(&hw, pmif->regbase);
1291 hw.irq = pdev->irq; 1320 hw.irq = pdev->irq;
1292 hw.dev = &pdev->dev; 1321 hw.dev = &pdev->dev;
1293 1322
1294 rc = pmac_ide_setup_device(pmif, hwif, &hw); 1323 rc = pmac_ide_setup_device(pmif, &hw);
1295 if (rc != 0) { 1324 if (rc != 0) {
1296 /* The inteface is released to the common IDE layer */ 1325 /* The inteface is released to the common IDE layer */
1297 pci_set_drvdata(pdev, NULL); 1326 pci_set_drvdata(pdev, NULL);
@@ -1310,12 +1339,12 @@ out_free_pmif:
1310static int 1339static int
1311pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) 1340pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
1312{ 1341{
1313 ide_hwif_t *hwif = (ide_hwif_t *)pci_get_drvdata(pdev); 1342 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)pci_get_drvdata(pdev);
1314 int rc = 0; 1343 int rc = 0;
1315 1344
1316 if (mesg.event != pdev->dev.power.power_state.event 1345 if (mesg.event != pdev->dev.power.power_state.event
1317 && (mesg.event & PM_EVENT_SLEEP)) { 1346 && (mesg.event & PM_EVENT_SLEEP)) {
1318 rc = pmac_ide_do_suspend(hwif); 1347 rc = pmac_ide_do_suspend(pmif);
1319 if (rc == 0) 1348 if (rc == 0)
1320 pdev->dev.power.power_state = mesg; 1349 pdev->dev.power.power_state = mesg;
1321 } 1350 }
@@ -1326,11 +1355,11 @@ pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
1326static int 1355static int
1327pmac_ide_pci_resume(struct pci_dev *pdev) 1356pmac_ide_pci_resume(struct pci_dev *pdev)
1328{ 1357{
1329 ide_hwif_t *hwif = (ide_hwif_t *)pci_get_drvdata(pdev); 1358 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)pci_get_drvdata(pdev);
1330 int rc = 0; 1359 int rc = 0;
1331 1360
1332 if (pdev->dev.power.power_state.event != PM_EVENT_ON) { 1361 if (pdev->dev.power.power_state.event != PM_EVENT_ON) {
1333 rc = pmac_ide_do_resume(hwif); 1362 rc = pmac_ide_do_resume(pmif);
1334 if (rc == 0) 1363 if (rc == 0)
1335 pdev->dev.power.power_state = PMSG_ON; 1364 pdev->dev.power.power_state = PMSG_ON;
1336 } 1365 }
@@ -1421,10 +1450,11 @@ out:
1421static int 1450static int
1422pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq) 1451pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq)
1423{ 1452{
1453 ide_hwif_t *hwif = drive->hwif;
1454 pmac_ide_hwif_t *pmif =
1455 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1424 struct dbdma_cmd *table; 1456 struct dbdma_cmd *table;
1425 int i, count = 0; 1457 int i, count = 0;
1426 ide_hwif_t *hwif = HWIF(drive);
1427 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)hwif->hwif_data;
1428 volatile struct dbdma_regs __iomem *dma = pmif->dma_regs; 1458 volatile struct dbdma_regs __iomem *dma = pmif->dma_regs;
1429 struct scatterlist *sg; 1459 struct scatterlist *sg;
1430 int wr = (rq_data_dir(rq) == WRITE); 1460 int wr = (rq_data_dir(rq) == WRITE);
@@ -1520,7 +1550,8 @@ static int
1520pmac_ide_dma_setup(ide_drive_t *drive) 1550pmac_ide_dma_setup(ide_drive_t *drive)
1521{ 1551{
1522 ide_hwif_t *hwif = HWIF(drive); 1552 ide_hwif_t *hwif = HWIF(drive);
1523 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)hwif->hwif_data; 1553 pmac_ide_hwif_t *pmif =
1554 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1524 struct request *rq = HWGROUP(drive)->rq; 1555 struct request *rq = HWGROUP(drive)->rq;
1525 u8 unit = (drive->select.b.unit & 0x01); 1556 u8 unit = (drive->select.b.unit & 0x01);
1526 u8 ata4; 1557 u8 ata4;
@@ -1560,7 +1591,9 @@ pmac_ide_dma_exec_cmd(ide_drive_t *drive, u8 command)
1560static void 1591static void
1561pmac_ide_dma_start(ide_drive_t *drive) 1592pmac_ide_dma_start(ide_drive_t *drive)
1562{ 1593{
1563 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 1594 ide_hwif_t *hwif = drive->hwif;
1595 pmac_ide_hwif_t *pmif =
1596 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1564 volatile struct dbdma_regs __iomem *dma; 1597 volatile struct dbdma_regs __iomem *dma;
1565 1598
1566 dma = pmif->dma_regs; 1599 dma = pmif->dma_regs;
@@ -1576,7 +1609,9 @@ pmac_ide_dma_start(ide_drive_t *drive)
1576static int 1609static int
1577pmac_ide_dma_end (ide_drive_t *drive) 1610pmac_ide_dma_end (ide_drive_t *drive)
1578{ 1611{
1579 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 1612 ide_hwif_t *hwif = drive->hwif;
1613 pmac_ide_hwif_t *pmif =
1614 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1580 volatile struct dbdma_regs __iomem *dma; 1615 volatile struct dbdma_regs __iomem *dma;
1581 u32 dstat; 1616 u32 dstat;
1582 1617
@@ -1604,7 +1639,9 @@ pmac_ide_dma_end (ide_drive_t *drive)
1604static int 1639static int
1605pmac_ide_dma_test_irq (ide_drive_t *drive) 1640pmac_ide_dma_test_irq (ide_drive_t *drive)
1606{ 1641{
1607 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 1642 ide_hwif_t *hwif = drive->hwif;
1643 pmac_ide_hwif_t *pmif =
1644 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1608 volatile struct dbdma_regs __iomem *dma; 1645 volatile struct dbdma_regs __iomem *dma;
1609 unsigned long status, timeout; 1646 unsigned long status, timeout;
1610 1647
@@ -1664,7 +1701,9 @@ static void pmac_ide_dma_host_set(ide_drive_t *drive, int on)
1664static void 1701static void
1665pmac_ide_dma_lost_irq (ide_drive_t *drive) 1702pmac_ide_dma_lost_irq (ide_drive_t *drive)
1666{ 1703{
1667 pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; 1704 ide_hwif_t *hwif = drive->hwif;
1705 pmac_ide_hwif_t *pmif =
1706 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1668 volatile struct dbdma_regs __iomem *dma; 1707 volatile struct dbdma_regs __iomem *dma;
1669 unsigned long status; 1708 unsigned long status;
1670 1709
@@ -1694,7 +1733,8 @@ static const struct ide_dma_ops pmac_dma_ops = {
1694static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif, 1733static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif,
1695 const struct ide_port_info *d) 1734 const struct ide_port_info *d)
1696{ 1735{
1697 pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data; 1736 pmac_ide_hwif_t *pmif =
1737 (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
1698 struct pci_dev *dev = to_pci_dev(hwif->dev); 1738 struct pci_dev *dev = to_pci_dev(hwif->dev);
1699 1739
1700 /* We won't need pci_dev if we switch to generic consistent 1740 /* We won't need pci_dev if we switch to generic consistent
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
index 65fc08b6b6d0..b15cad58dc81 100644
--- a/drivers/ide/setup-pci.c
+++ b/drivers/ide/setup-pci.c
@@ -73,15 +73,12 @@ static void ide_pci_clear_simplex(unsigned long dma_base, const char *name)
73 * @d: IDE port info 73 * @d: IDE port info
74 * 74 *
75 * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space. 75 * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space.
76 * Where a device has a partner that is already in DMA mode we check
77 * and enforce IDE simplex rules.
78 */ 76 */
79 77
80unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d) 78unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d)
81{ 79{
82 struct pci_dev *dev = to_pci_dev(hwif->dev); 80 struct pci_dev *dev = to_pci_dev(hwif->dev);
83 unsigned long dma_base = 0; 81 unsigned long dma_base = 0;
84 u8 dma_stat = 0;
85 82
86 if (hwif->host_flags & IDE_HFLAG_MMIO) 83 if (hwif->host_flags & IDE_HFLAG_MMIO)
87 return hwif->dma_base; 84 return hwif->dma_base;
@@ -102,11 +99,19 @@ unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d)
102 if (hwif->channel) 99 if (hwif->channel)
103 dma_base += 8; 100 dma_base += 8;
104 101
105 if (d->host_flags & IDE_HFLAG_CS5520) 102 return dma_base;
103}
104EXPORT_SYMBOL_GPL(ide_pci_dma_base);
105
106int ide_pci_check_simplex(ide_hwif_t *hwif, const struct ide_port_info *d)
107{
108 u8 dma_stat;
109
110 if (d->host_flags & (IDE_HFLAG_MMIO | IDE_HFLAG_CS5520))
106 goto out; 111 goto out;
107 112
108 if (d->host_flags & IDE_HFLAG_CLEAR_SIMPLEX) { 113 if (d->host_flags & IDE_HFLAG_CLEAR_SIMPLEX) {
109 ide_pci_clear_simplex(dma_base, d->name); 114 ide_pci_clear_simplex(hwif->dma_base, d->name);
110 goto out; 115 goto out;
111 } 116 }
112 117
@@ -120,15 +125,15 @@ unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d)
120 * we tune the drive then try to grab DMA ownership if we want to be 125 * we tune the drive then try to grab DMA ownership if we want to be
121 * the DMA end. This has to be become dynamic to handle hot-plug. 126 * the DMA end. This has to be become dynamic to handle hot-plug.
122 */ 127 */
123 dma_stat = hwif->INB(dma_base + 2); 128 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);
124 if ((dma_stat & 0x80) && hwif->mate && hwif->mate->dma_base) { 129 if ((dma_stat & 0x80) && hwif->mate && hwif->mate->dma_base) {
125 printk(KERN_INFO "%s: simplex device: DMA disabled\n", d->name); 130 printk(KERN_INFO "%s: simplex device: DMA disabled\n", d->name);
126 dma_base = 0; 131 return -1;
127 } 132 }
128out: 133out:
129 return dma_base; 134 return 0;
130} 135}
131EXPORT_SYMBOL_GPL(ide_pci_dma_base); 136EXPORT_SYMBOL_GPL(ide_pci_check_simplex);
132 137
133/* 138/*
134 * Set up BM-DMA capability (PnP BIOS should have done this) 139 * Set up BM-DMA capability (PnP BIOS should have done this)
@@ -284,33 +289,31 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
284} 289}
285 290
286/** 291/**
287 * ide_hwif_configure - configure an IDE interface 292 * ide_hw_configure - configure a hw_regs_t instance
288 * @dev: PCI device holding interface 293 * @dev: PCI device holding interface
289 * @d: IDE port info 294 * @d: IDE port info
290 * @port: port number 295 * @port: port number
291 * @irq: PCI IRQ 296 * @irq: PCI IRQ
297 * @hw: hw_regs_t instance corresponding to this port
292 * 298 *
293 * Perform the initial set up for the hardware interface structure. This 299 * Perform the initial set up for the hardware interface structure. This
294 * is done per interface port rather than per PCI device. There may be 300 * is done per interface port rather than per PCI device. There may be
295 * more than one port per device. 301 * more than one port per device.
296 * 302 *
297 * Returns the new hardware interface structure, or NULL on a failure 303 * Returns zero on success or an error code.
298 */ 304 */
299 305
300static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, 306static int ide_hw_configure(struct pci_dev *dev, const struct ide_port_info *d,
301 const struct ide_port_info *d, 307 unsigned int port, int irq, hw_regs_t *hw)
302 unsigned int port, int irq)
303{ 308{
304 unsigned long ctl = 0, base = 0; 309 unsigned long ctl = 0, base = 0;
305 ide_hwif_t *hwif;
306 struct hw_regs_s hw;
307 310
308 if ((d->host_flags & IDE_HFLAG_ISA_PORTS) == 0) { 311 if ((d->host_flags & IDE_HFLAG_ISA_PORTS) == 0) {
309 if (ide_pci_check_iomem(dev, d, 2 * port) || 312 if (ide_pci_check_iomem(dev, d, 2 * port) ||
310 ide_pci_check_iomem(dev, d, 2 * port + 1)) { 313 ide_pci_check_iomem(dev, d, 2 * port + 1)) {
311 printk(KERN_ERR "%s: I/O baseregs (BIOS) are reported " 314 printk(KERN_ERR "%s: I/O baseregs (BIOS) are reported "
312 "as MEM for port %d!\n", d->name, port); 315 "as MEM for port %d!\n", d->name, port);
313 return NULL; 316 return -EINVAL;
314 } 317 }
315 318
316 ctl = pci_resource_start(dev, 2*port+1); 319 ctl = pci_resource_start(dev, 2*port+1);
@@ -324,22 +327,16 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
324 if (!base || !ctl) { 327 if (!base || !ctl) {
325 printk(KERN_ERR "%s: bad PCI BARs for port %d, skipping\n", 328 printk(KERN_ERR "%s: bad PCI BARs for port %d, skipping\n",
326 d->name, port); 329 d->name, port);
327 return NULL; 330 return -EINVAL;
328 } 331 }
329 332
330 hwif = ide_find_port_slot(d); 333 memset(hw, 0, sizeof(*hw));
331 if (hwif == NULL) 334 hw->irq = irq;
332 return NULL; 335 hw->dev = &dev->dev;
333 336 hw->chipset = d->chipset ? d->chipset : ide_pci;
334 memset(&hw, 0, sizeof(hw)); 337 ide_std_init_ports(hw, base, ctl | 2);
335 hw.irq = irq;
336 hw.dev = &dev->dev;
337 hw.chipset = d->chipset ? d->chipset : ide_pci;
338 ide_std_init_ports(&hw, base, ctl | 2);
339
340 ide_init_port_hw(hwif, &hw);
341 338
342 return hwif; 339 return 0;
343} 340}
344 341
345#ifdef CONFIG_BLK_DEV_IDEDMA_PCI 342#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
@@ -362,7 +359,15 @@ int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
362 (dev->class & 0x80))) { 359 (dev->class & 0x80))) {
363 unsigned long base = ide_pci_dma_base(hwif, d); 360 unsigned long base = ide_pci_dma_base(hwif, d);
364 361
365 if (base == 0 || ide_pci_set_master(dev, d->name) < 0) 362 if (base == 0)
363 return -1;
364
365 hwif->dma_base = base;
366
367 if (ide_pci_check_simplex(hwif, d) < 0)
368 return -1;
369
370 if (ide_pci_set_master(dev, d->name) < 0)
366 return -1; 371 return -1;
367 372
368 if (hwif->host_flags & IDE_HFLAG_MMIO) 373 if (hwif->host_flags & IDE_HFLAG_MMIO)
@@ -376,7 +381,7 @@ int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
376 if (ide_allocate_dma_engine(hwif)) 381 if (ide_allocate_dma_engine(hwif))
377 return -1; 382 return -1;
378 383
379 ide_setup_dma(hwif, base); 384 hwif->dma_ops = &sff_dma_ops;
380 } 385 }
381 386
382 return 0; 387 return 0;
@@ -429,7 +434,8 @@ out:
429 * @dev: PCI device 434 * @dev: PCI device
430 * @d: IDE port info 435 * @d: IDE port info
431 * @pciirq: IRQ line 436 * @pciirq: IRQ line
432 * @idx: ATA index table to update 437 * @hw: hw_regs_t instances corresponding to this PCI IDE device
438 * @hws: hw_regs_t pointers table to update
433 * 439 *
434 * Scan the interfaces attached to this device and do any 440 * Scan the interfaces attached to this device and do any
435 * necessary per port setup. Attach the devices and ask the 441 * necessary per port setup. Attach the devices and ask the
@@ -440,10 +446,10 @@ out:
440 * where the chipset setup is not the default PCI IDE one. 446 * where the chipset setup is not the default PCI IDE one.
441 */ 447 */
442 448
443void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int pciirq, u8 *idx) 449void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d,
450 int pciirq, hw_regs_t *hw, hw_regs_t **hws)
444{ 451{
445 int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port; 452 int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port;
446 ide_hwif_t *hwif;
447 u8 tmp; 453 u8 tmp;
448 454
449 /* 455 /*
@@ -459,11 +465,10 @@ void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int
459 continue; /* port not enabled */ 465 continue; /* port not enabled */
460 } 466 }
461 467
462 hwif = ide_hwif_configure(dev, d, port, pciirq); 468 if (ide_hw_configure(dev, d, port, pciirq, hw + port))
463 if (hwif == NULL)
464 continue; 469 continue;
465 470
466 *(idx + port) = hwif->index; 471 *(hws + port) = hw + port;
467 } 472 }
468} 473}
469EXPORT_SYMBOL_GPL(ide_pci_setup_ports); 474EXPORT_SYMBOL_GPL(ide_pci_setup_ports);
@@ -480,7 +485,7 @@ EXPORT_SYMBOL_GPL(ide_pci_setup_ports);
480 */ 485 */
481static int do_ide_setup_pci_device(struct pci_dev *dev, 486static int do_ide_setup_pci_device(struct pci_dev *dev,
482 const struct ide_port_info *d, 487 const struct ide_port_info *d,
483 u8 *idx, u8 noisy) 488 u8 noisy)
484{ 489{
485 int tried_config = 0; 490 int tried_config = 0;
486 int pciirq, ret; 491 int pciirq, ret;
@@ -529,22 +534,24 @@ static int do_ide_setup_pci_device(struct pci_dev *dev,
529 d->name, pciirq); 534 d->name, pciirq);
530 } 535 }
531 536
532 /* FIXME: silent failure can happen */ 537 ret = pciirq;
533
534 ide_pci_setup_ports(dev, d, pciirq, idx);
535out: 538out:
536 return ret; 539 return ret;
537} 540}
538 541
539int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d) 542int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d)
540{ 543{
541 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 544 hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
542 int ret; 545 int ret;
543 546
544 ret = do_ide_setup_pci_device(dev, d, &idx[0], 1); 547 ret = do_ide_setup_pci_device(dev, d, 1);
548
549 if (ret >= 0) {
550 /* FIXME: silent failure can happen */
551 ide_pci_setup_ports(dev, d, ret, &hw[0], &hws[0]);
545 552
546 if (ret >= 0) 553 ret = ide_host_add(d, hws, NULL);
547 ide_device_add(idx, d); 554 }
548 555
549 return ret; 556 return ret;
550} 557}
@@ -555,19 +562,23 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2,
555{ 562{
556 struct pci_dev *pdev[] = { dev1, dev2 }; 563 struct pci_dev *pdev[] = { dev1, dev2 };
557 int ret, i; 564 int ret, i;
558 u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; 565 hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
559 566
560 for (i = 0; i < 2; i++) { 567 for (i = 0; i < 2; i++) {
561 ret = do_ide_setup_pci_device(pdev[i], d, &idx[i*2], !i); 568 ret = do_ide_setup_pci_device(pdev[i], d, !i);
569
562 /* 570 /*
563 * FIXME: Mom, mom, they stole me the helper function to undo 571 * FIXME: Mom, mom, they stole me the helper function to undo
564 * do_ide_setup_pci_device() on the first device! 572 * do_ide_setup_pci_device() on the first device!
565 */ 573 */
566 if (ret < 0) 574 if (ret < 0)
567 goto out; 575 goto out;
576
577 /* FIXME: silent failure can happen */
578 ide_pci_setup_ports(pdev[i], d, ret, &hw[i*2], &hws[i*2]);
568 } 579 }
569 580
570 ide_device_add(idx, d); 581 ret = ide_host_add(d, hws, NULL);
571out: 582out:
572 return ret; 583 return ret;
573} 584}
diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c
index 9d19aec5820a..b6eb2cf25914 100644
--- a/drivers/ieee1394/dv1394.c
+++ b/drivers/ieee1394/dv1394.c
@@ -2296,9 +2296,10 @@ static void dv1394_add_host(struct hpsb_host *host)
2296 2296
2297 ohci = (struct ti_ohci *)host->hostdata; 2297 ohci = (struct ti_ohci *)host->hostdata;
2298 2298
2299 device_create(hpsb_protocol_class, NULL, MKDEV( 2299 device_create_drvdata(hpsb_protocol_class, NULL,
2300 IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)), 2300 MKDEV(IEEE1394_MAJOR,
2301 "dv1394-%d", id); 2301 IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)), NULL,
2302 "dv1394-%d", id);
2302 2303
2303 dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE); 2304 dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE);
2304 dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT); 2305 dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT);
diff --git a/drivers/ieee1394/iso.c b/drivers/ieee1394/iso.c
index 07ca35c98f96..1cf6487b65ba 100644
--- a/drivers/ieee1394/iso.c
+++ b/drivers/ieee1394/iso.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/pci.h> 12#include <linux/pci.h>
13#include <linux/sched.h> 13#include <linux/sched.h>
14#include <linux/mm.h>
14#include <linux/slab.h> 15#include <linux/slab.h>
15 16
16#include "hosts.h" 17#include "hosts.h"
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
index 05710c7c1220..994a21e5a0aa 100644
--- a/drivers/ieee1394/nodemgr.c
+++ b/drivers/ieee1394/nodemgr.c
@@ -754,7 +754,8 @@ static void nodemgr_remove_uds(struct node_entry *ne)
754 */ 754 */
755 mutex_lock(&nodemgr_serialize_remove_uds); 755 mutex_lock(&nodemgr_serialize_remove_uds);
756 for (;;) { 756 for (;;) {
757 dev = class_find_device(&nodemgr_ud_class, ne, __match_ne); 757 dev = class_find_device(&nodemgr_ud_class, NULL, ne,
758 __match_ne);
758 if (!dev) 759 if (!dev)
759 break; 760 break;
760 ud = container_of(dev, struct unit_directory, unit_dev); 761 ud = container_of(dev, struct unit_directory, unit_dev);
@@ -901,7 +902,8 @@ static struct node_entry *find_entry_by_guid(u64 guid)
901 struct device *dev; 902 struct device *dev;
902 struct node_entry *ne; 903 struct node_entry *ne;
903 904
904 dev = class_find_device(&nodemgr_ne_class, &guid, __match_ne_guid); 905 dev = class_find_device(&nodemgr_ne_class, NULL, &guid,
906 __match_ne_guid);
905 if (!dev) 907 if (!dev)
906 return NULL; 908 return NULL;
907 ne = container_of(dev, struct node_entry, node_dev); 909 ne = container_of(dev, struct node_entry, node_dev);
@@ -940,7 +942,8 @@ static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host,
940 param.host = host; 942 param.host = host;
941 param.nodeid = nodeid; 943 param.nodeid = nodeid;
942 944
943 dev = class_find_device(&nodemgr_ne_class, &param, __match_ne_nodeid); 945 dev = class_find_device(&nodemgr_ne_class, NULL, &param,
946 __match_ne_nodeid);
944 if (!dev) 947 if (!dev)
945 return NULL; 948 return NULL;
946 ne = container_of(dev, struct node_entry, node_dev); 949 ne = container_of(dev, struct node_entry, node_dev);
@@ -1453,7 +1456,8 @@ static void nodemgr_suspend_ne(struct node_entry *ne)
1453 ne->in_limbo = 1; 1456 ne->in_limbo = 1;
1454 WARN_ON(device_create_file(&ne->device, &dev_attr_ne_in_limbo)); 1457 WARN_ON(device_create_file(&ne->device, &dev_attr_ne_in_limbo));
1455 1458
1456 class_for_each_device(&nodemgr_ud_class, ne, __nodemgr_driver_suspend); 1459 class_for_each_device(&nodemgr_ud_class, NULL, ne,
1460 __nodemgr_driver_suspend);
1457} 1461}
1458 1462
1459 1463
@@ -1462,7 +1466,8 @@ static void nodemgr_resume_ne(struct node_entry *ne)
1462 ne->in_limbo = 0; 1466 ne->in_limbo = 0;
1463 device_remove_file(&ne->device, &dev_attr_ne_in_limbo); 1467 device_remove_file(&ne->device, &dev_attr_ne_in_limbo);
1464 1468
1465 class_for_each_device(&nodemgr_ud_class, ne, __nodemgr_driver_resume); 1469 class_for_each_device(&nodemgr_ud_class, NULL, ne,
1470 __nodemgr_driver_resume);
1466 HPSB_DEBUG("Node resumed: ID:BUS[" NODE_BUS_FMT "] GUID[%016Lx]", 1471 HPSB_DEBUG("Node resumed: ID:BUS[" NODE_BUS_FMT "] GUID[%016Lx]",
1467 NODE_BUS_ARGS(ne->host, ne->nodeid), (unsigned long long)ne->guid); 1472 NODE_BUS_ARGS(ne->host, ne->nodeid), (unsigned long long)ne->guid);
1468} 1473}
@@ -1498,7 +1503,8 @@ static int __nodemgr_update_pdrv(struct device *dev, void *data)
1498 1503
1499static void nodemgr_update_pdrv(struct node_entry *ne) 1504static void nodemgr_update_pdrv(struct node_entry *ne)
1500{ 1505{
1501 class_for_each_device(&nodemgr_ud_class, ne, __nodemgr_update_pdrv); 1506 class_for_each_device(&nodemgr_ud_class, NULL, ne,
1507 __nodemgr_update_pdrv);
1502} 1508}
1503 1509
1504 1510
@@ -1591,7 +1597,8 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
1591 * while probes are time-consuming. (Well, those probes need some 1597 * while probes are time-consuming. (Well, those probes need some
1592 * improvement...) */ 1598 * improvement...) */
1593 1599
1594 class_for_each_device(&nodemgr_ne_class, &param, __nodemgr_node_probe); 1600 class_for_each_device(&nodemgr_ne_class, NULL, &param,
1601 __nodemgr_node_probe);
1595 1602
1596 /* If we had a bus reset while we were scanning the bus, it is 1603 /* If we had a bus reset while we were scanning the bus, it is
1597 * possible that we did not probe all nodes. In that case, we 1604 * possible that we did not probe all nodes. In that case, we
@@ -1826,7 +1833,7 @@ int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *))
1826 1833
1827 hip.cb = cb; 1834 hip.cb = cb;
1828 hip.data = data; 1835 hip.data = data;
1829 error = class_for_each_device(&hpsb_host_class, &hip, 1836 error = class_for_each_device(&hpsb_host_class, NULL, &hip,
1830 __nodemgr_for_each_host); 1837 __nodemgr_for_each_host);
1831 1838
1832 return error; 1839 return error;
diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c
index 96f2847b0405..6fa9e4a21840 100644
--- a/drivers/ieee1394/raw1394.c
+++ b/drivers/ieee1394/raw1394.c
@@ -3010,10 +3010,10 @@ static int __init init_raw1394(void)
3010 hpsb_register_highlevel(&raw1394_highlevel); 3010 hpsb_register_highlevel(&raw1394_highlevel);
3011 3011
3012 if (IS_ERR 3012 if (IS_ERR
3013 (device_create( 3013 (device_create_drvdata(
3014 hpsb_protocol_class, NULL, 3014 hpsb_protocol_class, NULL,
3015 MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16), 3015 MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16),
3016 RAW1394_DEVICE_NAME))) { 3016 NULL, RAW1394_DEVICE_NAME))) {
3017 ret = -EFAULT; 3017 ret = -EFAULT;
3018 goto out_unreg; 3018 goto out_unreg;
3019 } 3019 }
diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c
index 069b9f6bf16d..25db6e67fa4e 100644
--- a/drivers/ieee1394/video1394.c
+++ b/drivers/ieee1394/video1394.c
@@ -1341,9 +1341,9 @@ static void video1394_add_host (struct hpsb_host *host)
1341 hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id); 1341 hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id);
1342 1342
1343 minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id; 1343 minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id;
1344 device_create(hpsb_protocol_class, NULL, 1344 device_create_drvdata(hpsb_protocol_class, NULL,
1345 MKDEV(IEEE1394_MAJOR, minor), 1345 MKDEV(IEEE1394_MAJOR, minor), NULL,
1346 "%s-%d", VIDEO1394_DRIVER_NAME, ohci->host->id); 1346 "%s-%d", VIDEO1394_DRIVER_NAME, ohci->host->id);
1347} 1347}
1348 1348
1349 1349
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 55738eead3bf..922d35f4fc08 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -44,6 +44,7 @@
44#include <linux/spinlock.h> 44#include <linux/spinlock.h>
45#include <linux/sysfs.h> 45#include <linux/sysfs.h>
46#include <linux/workqueue.h> 46#include <linux/workqueue.h>
47#include <linux/kdev_t.h>
47 48
48#include <rdma/ib_cache.h> 49#include <rdma/ib_cache.h>
49#include <rdma/ib_cm.h> 50#include <rdma/ib_cm.h>
@@ -162,8 +163,8 @@ struct cm_port {
162 163
163struct cm_device { 164struct cm_device {
164 struct list_head list; 165 struct list_head list;
165 struct ib_device *device; 166 struct ib_device *ib_device;
166 struct kobject dev_obj; 167 struct device *device;
167 u8 ack_delay; 168 u8 ack_delay;
168 struct cm_port *port[0]; 169 struct cm_port *port[0];
169}; 170};
@@ -339,7 +340,7 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc,
339{ 340{
340 av->port = port; 341 av->port = port;
341 av->pkey_index = wc->pkey_index; 342 av->pkey_index = wc->pkey_index;
342 ib_init_ah_from_wc(port->cm_dev->device, port->port_num, wc, 343 ib_init_ah_from_wc(port->cm_dev->ib_device, port->port_num, wc,
343 grh, &av->ah_attr); 344 grh, &av->ah_attr);
344} 345}
345 346
@@ -353,7 +354,7 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
353 354
354 read_lock_irqsave(&cm.device_lock, flags); 355 read_lock_irqsave(&cm.device_lock, flags);
355 list_for_each_entry(cm_dev, &cm.device_list, list) { 356 list_for_each_entry(cm_dev, &cm.device_list, list) {
356 if (!ib_find_cached_gid(cm_dev->device, &path->sgid, 357 if (!ib_find_cached_gid(cm_dev->ib_device, &path->sgid,
357 &p, NULL)) { 358 &p, NULL)) {
358 port = cm_dev->port[p-1]; 359 port = cm_dev->port[p-1];
359 break; 360 break;
@@ -364,13 +365,13 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
364 if (!port) 365 if (!port)
365 return -EINVAL; 366 return -EINVAL;
366 367
367 ret = ib_find_cached_pkey(cm_dev->device, port->port_num, 368 ret = ib_find_cached_pkey(cm_dev->ib_device, port->port_num,
368 be16_to_cpu(path->pkey), &av->pkey_index); 369 be16_to_cpu(path->pkey), &av->pkey_index);
369 if (ret) 370 if (ret)
370 return ret; 371 return ret;
371 372
372 av->port = port; 373 av->port = port;
373 ib_init_ah_from_path(cm_dev->device, port->port_num, path, 374 ib_init_ah_from_path(cm_dev->ib_device, port->port_num, path,
374 &av->ah_attr); 375 &av->ah_attr);
375 av->timeout = path->packet_life_time + 1; 376 av->timeout = path->packet_life_time + 1;
376 return 0; 377 return 0;
@@ -1515,7 +1516,7 @@ static int cm_req_handler(struct cm_work *work)
1515 1516
1516 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; 1517 req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
1517 1518
1518 cm_id = ib_create_cm_id(work->port->cm_dev->device, NULL, NULL); 1519 cm_id = ib_create_cm_id(work->port->cm_dev->ib_device, NULL, NULL);
1519 if (IS_ERR(cm_id)) 1520 if (IS_ERR(cm_id))
1520 return PTR_ERR(cm_id); 1521 return PTR_ERR(cm_id);
1521 1522
@@ -1550,7 +1551,7 @@ static int cm_req_handler(struct cm_work *work)
1550 cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]); 1551 cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]);
1551 ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av); 1552 ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
1552 if (ret) { 1553 if (ret) {
1553 ib_get_cached_gid(work->port->cm_dev->device, 1554 ib_get_cached_gid(work->port->cm_dev->ib_device,
1554 work->port->port_num, 0, &work->path[0].sgid); 1555 work->port->port_num, 0, &work->path[0].sgid);
1555 ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_GID, 1556 ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_GID,
1556 &work->path[0].sgid, sizeof work->path[0].sgid, 1557 &work->path[0].sgid, sizeof work->path[0].sgid,
@@ -2950,7 +2951,7 @@ static int cm_sidr_req_handler(struct cm_work *work)
2950 struct cm_sidr_req_msg *sidr_req_msg; 2951 struct cm_sidr_req_msg *sidr_req_msg;
2951 struct ib_wc *wc; 2952 struct ib_wc *wc;
2952 2953
2953 cm_id = ib_create_cm_id(work->port->cm_dev->device, NULL, NULL); 2954 cm_id = ib_create_cm_id(work->port->cm_dev->ib_device, NULL, NULL);
2954 if (IS_ERR(cm_id)) 2955 if (IS_ERR(cm_id))
2955 return PTR_ERR(cm_id); 2956 return PTR_ERR(cm_id);
2956 cm_id_priv = container_of(cm_id, struct cm_id_private, id); 2957 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3578,7 +3579,7 @@ static void cm_get_ack_delay(struct cm_device *cm_dev)
3578{ 3579{
3579 struct ib_device_attr attr; 3580 struct ib_device_attr attr;
3580 3581
3581 if (ib_query_device(cm_dev->device, &attr)) 3582 if (ib_query_device(cm_dev->ib_device, &attr))
3582 cm_dev->ack_delay = 0; /* acks will rely on packet life time */ 3583 cm_dev->ack_delay = 0; /* acks will rely on packet life time */
3583 else 3584 else
3584 cm_dev->ack_delay = attr.local_ca_ack_delay; 3585 cm_dev->ack_delay = attr.local_ca_ack_delay;
@@ -3618,18 +3619,6 @@ static struct kobj_type cm_port_obj_type = {
3618 .release = cm_release_port_obj 3619 .release = cm_release_port_obj
3619}; 3620};
3620 3621
3621static void cm_release_dev_obj(struct kobject *obj)
3622{
3623 struct cm_device *cm_dev;
3624
3625 cm_dev = container_of(obj, struct cm_device, dev_obj);
3626 kfree(cm_dev);
3627}
3628
3629static struct kobj_type cm_dev_obj_type = {
3630 .release = cm_release_dev_obj
3631};
3632
3633struct class cm_class = { 3622struct class cm_class = {
3634 .name = "infiniband_cm", 3623 .name = "infiniband_cm",
3635}; 3624};
@@ -3640,7 +3629,7 @@ static int cm_create_port_fs(struct cm_port *port)
3640 int i, ret; 3629 int i, ret;
3641 3630
3642 ret = kobject_init_and_add(&port->port_obj, &cm_port_obj_type, 3631 ret = kobject_init_and_add(&port->port_obj, &cm_port_obj_type,
3643 &port->cm_dev->dev_obj, 3632 &port->cm_dev->device->kobj,
3644 "%d", port->port_num); 3633 "%d", port->port_num);
3645 if (ret) { 3634 if (ret) {
3646 kfree(port); 3635 kfree(port);
@@ -3676,7 +3665,7 @@ static void cm_remove_port_fs(struct cm_port *port)
3676 kobject_put(&port->port_obj); 3665 kobject_put(&port->port_obj);
3677} 3666}
3678 3667
3679static void cm_add_one(struct ib_device *device) 3668static void cm_add_one(struct ib_device *ib_device)
3680{ 3669{
3681 struct cm_device *cm_dev; 3670 struct cm_device *cm_dev;
3682 struct cm_port *port; 3671 struct cm_port *port;
@@ -3691,26 +3680,27 @@ static void cm_add_one(struct ib_device *device)
3691 int ret; 3680 int ret;
3692 u8 i; 3681 u8 i;
3693 3682
3694 if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB) 3683 if (rdma_node_get_transport(ib_device->node_type) != RDMA_TRANSPORT_IB)
3695 return; 3684 return;
3696 3685
3697 cm_dev = kzalloc(sizeof(*cm_dev) + sizeof(*port) * 3686 cm_dev = kzalloc(sizeof(*cm_dev) + sizeof(*port) *
3698 device->phys_port_cnt, GFP_KERNEL); 3687 ib_device->phys_port_cnt, GFP_KERNEL);
3699 if (!cm_dev) 3688 if (!cm_dev)
3700 return; 3689 return;
3701 3690
3702 cm_dev->device = device; 3691 cm_dev->ib_device = ib_device;
3703 cm_get_ack_delay(cm_dev); 3692 cm_get_ack_delay(cm_dev);
3704 3693
3705 ret = kobject_init_and_add(&cm_dev->dev_obj, &cm_dev_obj_type, 3694 cm_dev->device = device_create_drvdata(&cm_class, &ib_device->dev,
3706 &cm_class.subsys.kobj, "%s", device->name); 3695 MKDEV(0, 0), NULL,
3707 if (ret) { 3696 "%s", ib_device->name);
3697 if (!cm_dev->device) {
3708 kfree(cm_dev); 3698 kfree(cm_dev);
3709 return; 3699 return;
3710 } 3700 }
3711 3701
3712 set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask); 3702 set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask);
3713 for (i = 1; i <= device->phys_port_cnt; i++) { 3703 for (i = 1; i <= ib_device->phys_port_cnt; i++) {
3714 port = kzalloc(sizeof *port, GFP_KERNEL); 3704 port = kzalloc(sizeof *port, GFP_KERNEL);
3715 if (!port) 3705 if (!port)
3716 goto error1; 3706 goto error1;
@@ -3723,7 +3713,7 @@ static void cm_add_one(struct ib_device *device)
3723 if (ret) 3713 if (ret)
3724 goto error1; 3714 goto error1;
3725 3715
3726 port->mad_agent = ib_register_mad_agent(device, i, 3716 port->mad_agent = ib_register_mad_agent(ib_device, i,
3727 IB_QPT_GSI, 3717 IB_QPT_GSI,
3728 &reg_req, 3718 &reg_req,
3729 0, 3719 0,
@@ -3733,11 +3723,11 @@ static void cm_add_one(struct ib_device *device)
3733 if (IS_ERR(port->mad_agent)) 3723 if (IS_ERR(port->mad_agent))
3734 goto error2; 3724 goto error2;
3735 3725
3736 ret = ib_modify_port(device, i, 0, &port_modify); 3726 ret = ib_modify_port(ib_device, i, 0, &port_modify);
3737 if (ret) 3727 if (ret)
3738 goto error3; 3728 goto error3;
3739 } 3729 }
3740 ib_set_client_data(device, &cm_client, cm_dev); 3730 ib_set_client_data(ib_device, &cm_client, cm_dev);
3741 3731
3742 write_lock_irqsave(&cm.device_lock, flags); 3732 write_lock_irqsave(&cm.device_lock, flags);
3743 list_add_tail(&cm_dev->list, &cm.device_list); 3733 list_add_tail(&cm_dev->list, &cm.device_list);
@@ -3753,14 +3743,14 @@ error1:
3753 port_modify.clr_port_cap_mask = IB_PORT_CM_SUP; 3743 port_modify.clr_port_cap_mask = IB_PORT_CM_SUP;
3754 while (--i) { 3744 while (--i) {
3755 port = cm_dev->port[i-1]; 3745 port = cm_dev->port[i-1];
3756 ib_modify_port(device, port->port_num, 0, &port_modify); 3746 ib_modify_port(ib_device, port->port_num, 0, &port_modify);
3757 ib_unregister_mad_agent(port->mad_agent); 3747 ib_unregister_mad_agent(port->mad_agent);
3758 cm_remove_port_fs(port); 3748 cm_remove_port_fs(port);
3759 } 3749 }
3760 kobject_put(&cm_dev->dev_obj); 3750 device_unregister(cm_dev->device);
3761} 3751}
3762 3752
3763static void cm_remove_one(struct ib_device *device) 3753static void cm_remove_one(struct ib_device *ib_device)
3764{ 3754{
3765 struct cm_device *cm_dev; 3755 struct cm_device *cm_dev;
3766 struct cm_port *port; 3756 struct cm_port *port;
@@ -3770,7 +3760,7 @@ static void cm_remove_one(struct ib_device *device)
3770 unsigned long flags; 3760 unsigned long flags;
3771 int i; 3761 int i;
3772 3762
3773 cm_dev = ib_get_client_data(device, &cm_client); 3763 cm_dev = ib_get_client_data(ib_device, &cm_client);
3774 if (!cm_dev) 3764 if (!cm_dev)
3775 return; 3765 return;
3776 3766
@@ -3778,14 +3768,14 @@ static void cm_remove_one(struct ib_device *device)
3778 list_del(&cm_dev->list); 3768 list_del(&cm_dev->list);
3779 write_unlock_irqrestore(&cm.device_lock, flags); 3769 write_unlock_irqrestore(&cm.device_lock, flags);
3780 3770
3781 for (i = 1; i <= device->phys_port_cnt; i++) { 3771 for (i = 1; i <= ib_device->phys_port_cnt; i++) {
3782 port = cm_dev->port[i-1]; 3772 port = cm_dev->port[i-1];
3783 ib_modify_port(device, port->port_num, 0, &port_modify); 3773 ib_modify_port(ib_device, port->port_num, 0, &port_modify);
3784 ib_unregister_mad_agent(port->mad_agent); 3774 ib_unregister_mad_agent(port->mad_agent);
3785 flush_workqueue(cm.wq); 3775 flush_workqueue(cm.wq);
3786 cm_remove_port_fs(port); 3776 cm_remove_port_fs(port);
3787 } 3777 }
3788 kobject_put(&cm_dev->dev_obj); 3778 device_unregister(cm_dev->device);
3789} 3779}
3790 3780
3791static int __init ib_cm_init(void) 3781static int __init ib_cm_init(void)
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index ae11d5cc74d0..e980ff3335db 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -168,6 +168,12 @@ struct cma_work {
168 struct rdma_cm_event event; 168 struct rdma_cm_event event;
169}; 169};
170 170
171struct cma_ndev_work {
172 struct work_struct work;
173 struct rdma_id_private *id;
174 struct rdma_cm_event event;
175};
176
171union cma_ip_addr { 177union cma_ip_addr {
172 struct in6_addr ip6; 178 struct in6_addr ip6;
173 struct { 179 struct {
@@ -914,7 +920,10 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
914 struct rdma_cm_event event; 920 struct rdma_cm_event event;
915 int ret = 0; 921 int ret = 0;
916 922
917 if (cma_disable_callback(id_priv, CMA_CONNECT)) 923 if ((ib_event->event != IB_CM_TIMEWAIT_EXIT &&
924 cma_disable_callback(id_priv, CMA_CONNECT)) ||
925 (ib_event->event == IB_CM_TIMEWAIT_EXIT &&
926 cma_disable_callback(id_priv, CMA_DISCONNECT)))
918 return 0; 927 return 0;
919 928
920 memset(&event, 0, sizeof event); 929 memset(&event, 0, sizeof event);
@@ -950,6 +959,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
950 event.event = RDMA_CM_EVENT_DISCONNECTED; 959 event.event = RDMA_CM_EVENT_DISCONNECTED;
951 break; 960 break;
952 case IB_CM_TIMEWAIT_EXIT: 961 case IB_CM_TIMEWAIT_EXIT:
962 event.event = RDMA_CM_EVENT_TIMEWAIT_EXIT;
963 break;
953 case IB_CM_MRA_RECEIVED: 964 case IB_CM_MRA_RECEIVED:
954 /* ignore event */ 965 /* ignore event */
955 goto out; 966 goto out;
@@ -1598,6 +1609,30 @@ out:
1598 kfree(work); 1609 kfree(work);
1599} 1610}
1600 1611
1612static void cma_ndev_work_handler(struct work_struct *_work)
1613{
1614 struct cma_ndev_work *work = container_of(_work, struct cma_ndev_work, work);
1615 struct rdma_id_private *id_priv = work->id;
1616 int destroy = 0;
1617
1618 mutex_lock(&id_priv->handler_mutex);
1619 if (id_priv->state == CMA_DESTROYING ||
1620 id_priv->state == CMA_DEVICE_REMOVAL)
1621 goto out;
1622
1623 if (id_priv->id.event_handler(&id_priv->id, &work->event)) {
1624 cma_exch(id_priv, CMA_DESTROYING);
1625 destroy = 1;
1626 }
1627
1628out:
1629 mutex_unlock(&id_priv->handler_mutex);
1630 cma_deref_id(id_priv);
1631 if (destroy)
1632 rdma_destroy_id(&id_priv->id);
1633 kfree(work);
1634}
1635
1601static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms) 1636static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms)
1602{ 1637{
1603 struct rdma_route *route = &id_priv->id.route; 1638 struct rdma_route *route = &id_priv->id.route;
@@ -2723,6 +2758,65 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
2723} 2758}
2724EXPORT_SYMBOL(rdma_leave_multicast); 2759EXPORT_SYMBOL(rdma_leave_multicast);
2725 2760
2761static int cma_netdev_change(struct net_device *ndev, struct rdma_id_private *id_priv)
2762{
2763 struct rdma_dev_addr *dev_addr;
2764 struct cma_ndev_work *work;
2765
2766 dev_addr = &id_priv->id.route.addr.dev_addr;
2767
2768 if ((dev_addr->src_dev == ndev) &&
2769 memcmp(dev_addr->src_dev_addr, ndev->dev_addr, ndev->addr_len)) {
2770 printk(KERN_INFO "RDMA CM addr change for ndev %s used by id %p\n",
2771 ndev->name, &id_priv->id);
2772 work = kzalloc(sizeof *work, GFP_KERNEL);
2773 if (!work)
2774 return -ENOMEM;
2775
2776 INIT_WORK(&work->work, cma_ndev_work_handler);
2777 work->id = id_priv;
2778 work->event.event = RDMA_CM_EVENT_ADDR_CHANGE;
2779 atomic_inc(&id_priv->refcount);
2780 queue_work(cma_wq, &work->work);
2781 }
2782
2783 return 0;
2784}
2785
2786static int cma_netdev_callback(struct notifier_block *self, unsigned long event,
2787 void *ctx)
2788{
2789 struct net_device *ndev = (struct net_device *)ctx;
2790 struct cma_device *cma_dev;
2791 struct rdma_id_private *id_priv;
2792 int ret = NOTIFY_DONE;
2793
2794 if (dev_net(ndev) != &init_net)
2795 return NOTIFY_DONE;
2796
2797 if (event != NETDEV_BONDING_FAILOVER)
2798 return NOTIFY_DONE;
2799
2800 if (!(ndev->flags & IFF_MASTER) || !(ndev->priv_flags & IFF_BONDING))
2801 return NOTIFY_DONE;
2802
2803 mutex_lock(&lock);
2804 list_for_each_entry(cma_dev, &dev_list, list)
2805 list_for_each_entry(id_priv, &cma_dev->id_list, list) {
2806 ret = cma_netdev_change(ndev, id_priv);
2807 if (ret)
2808 goto out;
2809 }
2810
2811out:
2812 mutex_unlock(&lock);
2813 return ret;
2814}
2815
2816static struct notifier_block cma_nb = {
2817 .notifier_call = cma_netdev_callback
2818};
2819
2726static void cma_add_one(struct ib_device *device) 2820static void cma_add_one(struct ib_device *device)
2727{ 2821{
2728 struct cma_device *cma_dev; 2822 struct cma_device *cma_dev;
@@ -2831,6 +2925,7 @@ static int cma_init(void)
2831 2925
2832 ib_sa_register_client(&sa_client); 2926 ib_sa_register_client(&sa_client);
2833 rdma_addr_register_client(&addr_client); 2927 rdma_addr_register_client(&addr_client);
2928 register_netdevice_notifier(&cma_nb);
2834 2929
2835 ret = ib_register_client(&cma_client); 2930 ret = ib_register_client(&cma_client);
2836 if (ret) 2931 if (ret)
@@ -2838,6 +2933,7 @@ static int cma_init(void)
2838 return 0; 2933 return 0;
2839 2934
2840err: 2935err:
2936 unregister_netdevice_notifier(&cma_nb);
2841 rdma_addr_unregister_client(&addr_client); 2937 rdma_addr_unregister_client(&addr_client);
2842 ib_sa_unregister_client(&sa_client); 2938 ib_sa_unregister_client(&sa_client);
2843 destroy_workqueue(cma_wq); 2939 destroy_workqueue(cma_wq);
@@ -2847,6 +2943,7 @@ err:
2847static void cma_cleanup(void) 2943static void cma_cleanup(void)
2848{ 2944{
2849 ib_unregister_client(&cma_client); 2945 ib_unregister_client(&cma_client);
2946 unregister_netdevice_notifier(&cma_nb);
2850 rdma_addr_unregister_client(&addr_client); 2947 rdma_addr_unregister_client(&addr_client);
2851 ib_sa_unregister_client(&sa_client); 2948 ib_sa_unregister_client(&sa_client);
2852 destroy_workqueue(cma_wq); 2949 destroy_workqueue(cma_wq);
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index 81c9195b512a..8f9509e1ebf7 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -942,8 +942,7 @@ static int iwcm_init_qp_init_attr(struct iwcm_id_private *cm_id_priv,
942 case IW_CM_STATE_CONN_RECV: 942 case IW_CM_STATE_CONN_RECV:
943 case IW_CM_STATE_ESTABLISHED: 943 case IW_CM_STATE_ESTABLISHED:
944 *qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS; 944 *qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS;
945 qp_attr->qp_access_flags = IB_ACCESS_LOCAL_WRITE | 945 qp_attr->qp_access_flags = IB_ACCESS_REMOTE_WRITE|
946 IB_ACCESS_REMOTE_WRITE|
947 IB_ACCESS_REMOTE_READ; 946 IB_ACCESS_REMOTE_READ;
948 ret = 0; 947 ret = 0;
949 break; 948 break;
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c
index 1341de793e51..7863a50d56f2 100644
--- a/drivers/infiniband/core/sa_query.c
+++ b/drivers/infiniband/core/sa_query.c
@@ -1064,7 +1064,8 @@ static void ib_sa_remove_one(struct ib_device *device)
1064 1064
1065 for (i = 0; i <= sa_dev->end_port - sa_dev->start_port; ++i) { 1065 for (i = 0; i <= sa_dev->end_port - sa_dev->start_port; ++i) {
1066 ib_unregister_mad_agent(sa_dev->port[i].agent); 1066 ib_unregister_mad_agent(sa_dev->port[i].agent);
1067 kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah); 1067 if (sa_dev->port[i].sm_ah)
1068 kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah);
1068 } 1069 }
1069 1070
1070 kfree(sa_dev); 1071 kfree(sa_dev);
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
index 1e9e99a13933..0b0618edd645 100644
--- a/drivers/infiniband/hw/ehca/ehca_classes.h
+++ b/drivers/infiniband/hw/ehca/ehca_classes.h
@@ -194,6 +194,7 @@ struct ehca_qp {
194 u32 packet_count; 194 u32 packet_count;
195 atomic_t nr_events; /* events seen */ 195 atomic_t nr_events; /* events seen */
196 wait_queue_head_t wait_completion; 196 wait_queue_head_t wait_completion;
197 int mig_armed;
197}; 198};
198 199
199#define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ) 200#define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ)
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c
index bc3b37d2070f..46288220cfbb 100644
--- a/drivers/infiniband/hw/ehca/ehca_hca.c
+++ b/drivers/infiniband/hw/ehca/ehca_hca.c
@@ -114,7 +114,9 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
114 } 114 }
115 115
116 props->max_pkeys = 16; 116 props->max_pkeys = 16;
117 props->local_ca_ack_delay = min_t(u8, rblock->local_ca_ack_delay, 255); 117 /* Some FW versions say 0 here; insert sensible value in that case */
118 props->local_ca_ack_delay = rblock->local_ca_ack_delay ?
119 min_t(u8, rblock->local_ca_ack_delay, 255) : 12;
118 props->max_raw_ipv6_qp = limit_uint(rblock->max_raw_ipv6_qp); 120 props->max_raw_ipv6_qp = limit_uint(rblock->max_raw_ipv6_qp);
119 props->max_raw_ethy_qp = limit_uint(rblock->max_raw_ethy_qp); 121 props->max_raw_ethy_qp = limit_uint(rblock->max_raw_ethy_qp);
120 props->max_mcast_grp = limit_uint(rblock->max_mcast_grp); 122 props->max_mcast_grp = limit_uint(rblock->max_mcast_grp);
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c
index 0792d930c481..cb55be04442c 100644
--- a/drivers/infiniband/hw/ehca/ehca_irq.c
+++ b/drivers/infiniband/hw/ehca/ehca_irq.c
@@ -178,6 +178,10 @@ static void dispatch_qp_event(struct ehca_shca *shca, struct ehca_qp *qp,
178{ 178{
179 struct ib_event event; 179 struct ib_event event;
180 180
181 /* PATH_MIG without the QP ever having been armed is false alarm */
182 if (event_type == IB_EVENT_PATH_MIG && !qp->mig_armed)
183 return;
184
181 event.device = &shca->ib_device; 185 event.device = &shca->ib_device;
182 event.event = event_type; 186 event.event = event_type;
183 187
@@ -646,8 +650,8 @@ static inline int find_next_online_cpu(struct ehca_comp_pool *pool)
646 ehca_dmp(&cpu_online_map, sizeof(cpumask_t), ""); 650 ehca_dmp(&cpu_online_map, sizeof(cpumask_t), "");
647 651
648 spin_lock_irqsave(&pool->last_cpu_lock, flags); 652 spin_lock_irqsave(&pool->last_cpu_lock, flags);
649 cpu = next_cpu(pool->last_cpu, cpu_online_map); 653 cpu = next_cpu_nr(pool->last_cpu, cpu_online_map);
650 if (cpu == NR_CPUS) 654 if (cpu >= nr_cpu_ids)
651 cpu = first_cpu(cpu_online_map); 655 cpu = first_cpu(cpu_online_map);
652 pool->last_cpu = cpu; 656 pool->last_cpu = cpu;
653 spin_unlock_irqrestore(&pool->last_cpu_lock, flags); 657 spin_unlock_irqrestore(&pool->last_cpu_lock, flags);
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
index 3f59587338ea..ea13efddf175 100644
--- a/drivers/infiniband/hw/ehca/ehca_qp.c
+++ b/drivers/infiniband/hw/ehca/ehca_qp.c
@@ -1460,6 +1460,8 @@ static int internal_modify_qp(struct ib_qp *ibqp,
1460 goto modify_qp_exit2; 1460 goto modify_qp_exit2;
1461 } 1461 }
1462 mqpcb->path_migration_state = attr->path_mig_state + 1; 1462 mqpcb->path_migration_state = attr->path_mig_state + 1;
1463 if (attr->path_mig_state == IB_MIG_REARM)
1464 my_qp->mig_armed = 1;
1463 update_mask |= 1465 update_mask |=
1464 EHCA_BMASK_SET(MQPCB_MASK_PATH_MIGRATION_STATE, 1); 1466 EHCA_BMASK_SET(MQPCB_MASK_PATH_MIGRATION_STATE, 1);
1465 } 1467 }
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.c b/drivers/infiniband/hw/ehca/ipz_pt_fn.c
index 661f8db62706..c3a328465431 100644
--- a/drivers/infiniband/hw/ehca/ipz_pt_fn.c
+++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.c
@@ -163,6 +163,7 @@ static int alloc_small_queue_page(struct ipz_queue *queue, struct ehca_pd *pd)
163 163
164out: 164out:
165 ehca_err(pd->ib_pd.device, "failed to allocate small queue page"); 165 ehca_err(pd->ib_pd.device, "failed to allocate small queue page");
166 mutex_unlock(&pd->lock);
166 return 0; 167 return 0;
167} 168}
168 169
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c
index 35f301c88b57..56c0eda3c077 100644
--- a/drivers/infiniband/hw/ipath/ipath_file_ops.c
+++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c
@@ -2455,7 +2455,7 @@ static int init_cdev(int minor, char *name, const struct file_operations *fops,
2455 goto err_cdev; 2455 goto err_cdev;
2456 } 2456 }
2457 2457
2458 device = device_create(ipath_class, NULL, dev, name); 2458 device = device_create_drvdata(ipath_class, NULL, dev, NULL, name);
2459 2459
2460 if (IS_ERR(device)) { 2460 if (IS_ERR(device)) {
2461 ret = PTR_ERR(device); 2461 ret = PTR_ERR(device);
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 299f20832ab6..0b191a4842ce 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -637,6 +637,7 @@ repoll:
637 case MLX4_OPCODE_SEND_IMM: 637 case MLX4_OPCODE_SEND_IMM:
638 wc->wc_flags |= IB_WC_WITH_IMM; 638 wc->wc_flags |= IB_WC_WITH_IMM;
639 case MLX4_OPCODE_SEND: 639 case MLX4_OPCODE_SEND:
640 case MLX4_OPCODE_SEND_INVAL:
640 wc->opcode = IB_WC_SEND; 641 wc->opcode = IB_WC_SEND;
641 break; 642 break;
642 case MLX4_OPCODE_RDMA_READ: 643 case MLX4_OPCODE_RDMA_READ:
@@ -657,6 +658,12 @@ repoll:
657 case MLX4_OPCODE_LSO: 658 case MLX4_OPCODE_LSO:
658 wc->opcode = IB_WC_LSO; 659 wc->opcode = IB_WC_LSO;
659 break; 660 break;
661 case MLX4_OPCODE_FMR:
662 wc->opcode = IB_WC_FAST_REG_MR;
663 break;
664 case MLX4_OPCODE_LOCAL_INVAL:
665 wc->opcode = IB_WC_LOCAL_INV;
666 break;
660 } 667 }
661 } else { 668 } else {
662 wc->byte_len = be32_to_cpu(cqe->byte_cnt); 669 wc->byte_len = be32_to_cpu(cqe->byte_cnt);
@@ -667,6 +674,11 @@ repoll:
667 wc->wc_flags = IB_WC_WITH_IMM; 674 wc->wc_flags = IB_WC_WITH_IMM;
668 wc->ex.imm_data = cqe->immed_rss_invalid; 675 wc->ex.imm_data = cqe->immed_rss_invalid;
669 break; 676 break;
677 case MLX4_RECV_OPCODE_SEND_INVAL:
678 wc->opcode = IB_WC_RECV;
679 wc->wc_flags = IB_WC_WITH_INVALIDATE;
680 wc->ex.invalidate_rkey = be32_to_cpu(cqe->immed_rss_invalid);
681 break;
670 case MLX4_RECV_OPCODE_SEND: 682 case MLX4_RECV_OPCODE_SEND:
671 wc->opcode = IB_WC_RECV; 683 wc->opcode = IB_WC_RECV;
672 wc->wc_flags = 0; 684 wc->wc_flags = 0;
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index bcf50648fa18..38d6907ab521 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -104,6 +104,12 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
104 props->device_cap_flags |= IB_DEVICE_UD_IP_CSUM; 104 props->device_cap_flags |= IB_DEVICE_UD_IP_CSUM;
105 if (dev->dev->caps.max_gso_sz) 105 if (dev->dev->caps.max_gso_sz)
106 props->device_cap_flags |= IB_DEVICE_UD_TSO; 106 props->device_cap_flags |= IB_DEVICE_UD_TSO;
107 if (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_RESERVED_LKEY)
108 props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY;
109 if ((dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_LOCAL_INV) &&
110 (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_REMOTE_INV) &&
111 (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_FAST_REG_WR))
112 props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS;
107 113
108 props->vendor_id = be32_to_cpup((__be32 *) (out_mad->data + 36)) & 114 props->vendor_id = be32_to_cpup((__be32 *) (out_mad->data + 36)) &
109 0xffffff; 115 0xffffff;
@@ -127,6 +133,7 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
127 props->max_srq = dev->dev->caps.num_srqs - dev->dev->caps.reserved_srqs; 133 props->max_srq = dev->dev->caps.num_srqs - dev->dev->caps.reserved_srqs;
128 props->max_srq_wr = dev->dev->caps.max_srq_wqes - 1; 134 props->max_srq_wr = dev->dev->caps.max_srq_wqes - 1;
129 props->max_srq_sge = dev->dev->caps.max_srq_sge; 135 props->max_srq_sge = dev->dev->caps.max_srq_sge;
136 props->max_fast_reg_page_list_len = PAGE_SIZE / sizeof (u64);
130 props->local_ca_ack_delay = dev->dev->caps.local_ca_ack_delay; 137 props->local_ca_ack_delay = dev->dev->caps.local_ca_ack_delay;
131 props->atomic_cap = dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_ATOMIC ? 138 props->atomic_cap = dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_ATOMIC ?
132 IB_ATOMIC_HCA : IB_ATOMIC_NONE; 139 IB_ATOMIC_HCA : IB_ATOMIC_NONE;
@@ -565,6 +572,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
565 strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX); 572 strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX);
566 ibdev->ib_dev.owner = THIS_MODULE; 573 ibdev->ib_dev.owner = THIS_MODULE;
567 ibdev->ib_dev.node_type = RDMA_NODE_IB_CA; 574 ibdev->ib_dev.node_type = RDMA_NODE_IB_CA;
575 ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey;
568 ibdev->ib_dev.phys_port_cnt = dev->caps.num_ports; 576 ibdev->ib_dev.phys_port_cnt = dev->caps.num_ports;
569 ibdev->ib_dev.num_comp_vectors = 1; 577 ibdev->ib_dev.num_comp_vectors = 1;
570 ibdev->ib_dev.dma_device = &dev->pdev->dev; 578 ibdev->ib_dev.dma_device = &dev->pdev->dev;
@@ -627,6 +635,9 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
627 ibdev->ib_dev.get_dma_mr = mlx4_ib_get_dma_mr; 635 ibdev->ib_dev.get_dma_mr = mlx4_ib_get_dma_mr;
628 ibdev->ib_dev.reg_user_mr = mlx4_ib_reg_user_mr; 636 ibdev->ib_dev.reg_user_mr = mlx4_ib_reg_user_mr;
629 ibdev->ib_dev.dereg_mr = mlx4_ib_dereg_mr; 637 ibdev->ib_dev.dereg_mr = mlx4_ib_dereg_mr;
638 ibdev->ib_dev.alloc_fast_reg_mr = mlx4_ib_alloc_fast_reg_mr;
639 ibdev->ib_dev.alloc_fast_reg_page_list = mlx4_ib_alloc_fast_reg_page_list;
640 ibdev->ib_dev.free_fast_reg_page_list = mlx4_ib_free_fast_reg_page_list;
630 ibdev->ib_dev.attach_mcast = mlx4_ib_mcg_attach; 641 ibdev->ib_dev.attach_mcast = mlx4_ib_mcg_attach;
631 ibdev->ib_dev.detach_mcast = mlx4_ib_mcg_detach; 642 ibdev->ib_dev.detach_mcast = mlx4_ib_mcg_detach;
632 ibdev->ib_dev.process_mad = mlx4_ib_process_mad; 643 ibdev->ib_dev.process_mad = mlx4_ib_process_mad;
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h
index c4cf5b69eefa..d26a91317d4d 100644
--- a/drivers/infiniband/hw/mlx4/mlx4_ib.h
+++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h
@@ -83,6 +83,11 @@ struct mlx4_ib_mr {
83 struct ib_umem *umem; 83 struct ib_umem *umem;
84}; 84};
85 85
86struct mlx4_ib_fast_reg_page_list {
87 struct ib_fast_reg_page_list ibfrpl;
88 dma_addr_t map;
89};
90
86struct mlx4_ib_fmr { 91struct mlx4_ib_fmr {
87 struct ib_fmr ibfmr; 92 struct ib_fmr ibfmr;
88 struct mlx4_fmr mfmr; 93 struct mlx4_fmr mfmr;
@@ -199,6 +204,11 @@ static inline struct mlx4_ib_mr *to_mmr(struct ib_mr *ibmr)
199 return container_of(ibmr, struct mlx4_ib_mr, ibmr); 204 return container_of(ibmr, struct mlx4_ib_mr, ibmr);
200} 205}
201 206
207static inline struct mlx4_ib_fast_reg_page_list *to_mfrpl(struct ib_fast_reg_page_list *ibfrpl)
208{
209 return container_of(ibfrpl, struct mlx4_ib_fast_reg_page_list, ibfrpl);
210}
211
202static inline struct mlx4_ib_fmr *to_mfmr(struct ib_fmr *ibfmr) 212static inline struct mlx4_ib_fmr *to_mfmr(struct ib_fmr *ibfmr)
203{ 213{
204 return container_of(ibfmr, struct mlx4_ib_fmr, ibfmr); 214 return container_of(ibfmr, struct mlx4_ib_fmr, ibfmr);
@@ -239,6 +249,11 @@ struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
239 u64 virt_addr, int access_flags, 249 u64 virt_addr, int access_flags,
240 struct ib_udata *udata); 250 struct ib_udata *udata);
241int mlx4_ib_dereg_mr(struct ib_mr *mr); 251int mlx4_ib_dereg_mr(struct ib_mr *mr);
252struct ib_mr *mlx4_ib_alloc_fast_reg_mr(struct ib_pd *pd,
253 int max_page_list_len);
254struct ib_fast_reg_page_list *mlx4_ib_alloc_fast_reg_page_list(struct ib_device *ibdev,
255 int page_list_len);
256void mlx4_ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list);
242 257
243int mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period); 258int mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period);
244int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata); 259int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata);
diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c
index 68e92485fc76..db2086faa4ed 100644
--- a/drivers/infiniband/hw/mlx4/mr.c
+++ b/drivers/infiniband/hw/mlx4/mr.c
@@ -183,6 +183,76 @@ int mlx4_ib_dereg_mr(struct ib_mr *ibmr)
183 return 0; 183 return 0;
184} 184}
185 185
186struct ib_mr *mlx4_ib_alloc_fast_reg_mr(struct ib_pd *pd,
187 int max_page_list_len)
188{
189 struct mlx4_ib_dev *dev = to_mdev(pd->device);
190 struct mlx4_ib_mr *mr;
191 int err;
192
193 mr = kmalloc(sizeof *mr, GFP_KERNEL);
194 if (!mr)
195 return ERR_PTR(-ENOMEM);
196
197 err = mlx4_mr_alloc(dev->dev, to_mpd(pd)->pdn, 0, 0, 0,
198 max_page_list_len, 0, &mr->mmr);
199 if (err)
200 goto err_free;
201
202 err = mlx4_mr_enable(dev->dev, &mr->mmr);
203 if (err)
204 goto err_mr;
205
206 return &mr->ibmr;
207
208err_mr:
209 mlx4_mr_free(dev->dev, &mr->mmr);
210
211err_free:
212 kfree(mr);
213 return ERR_PTR(err);
214}
215
216struct ib_fast_reg_page_list *mlx4_ib_alloc_fast_reg_page_list(struct ib_device *ibdev,
217 int page_list_len)
218{
219 struct mlx4_ib_dev *dev = to_mdev(ibdev);
220 struct mlx4_ib_fast_reg_page_list *mfrpl;
221 int size = page_list_len * sizeof (u64);
222
223 if (size > PAGE_SIZE)
224 return ERR_PTR(-EINVAL);
225
226 mfrpl = kmalloc(sizeof *mfrpl, GFP_KERNEL);
227 if (!mfrpl)
228 return ERR_PTR(-ENOMEM);
229
230 mfrpl->ibfrpl.page_list = dma_alloc_coherent(&dev->dev->pdev->dev,
231 size, &mfrpl->map,
232 GFP_KERNEL);
233 if (!mfrpl->ibfrpl.page_list)
234 goto err_free;
235
236 WARN_ON(mfrpl->map & 0x3f);
237
238 return &mfrpl->ibfrpl;
239
240err_free:
241 kfree(mfrpl);
242 return ERR_PTR(-ENOMEM);
243}
244
245void mlx4_ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list)
246{
247 struct mlx4_ib_dev *dev = to_mdev(page_list->device);
248 struct mlx4_ib_fast_reg_page_list *mfrpl = to_mfrpl(page_list);
249 int size = page_list->max_page_list_len * sizeof (u64);
250
251 dma_free_coherent(&dev->dev->pdev->dev, size, page_list->page_list,
252 mfrpl->map);
253 kfree(mfrpl);
254}
255
186struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int acc, 256struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int acc,
187 struct ib_fmr_attr *fmr_attr) 257 struct ib_fmr_attr *fmr_attr)
188{ 258{
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 89eb6cbe592e..02a99bc4442e 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -78,6 +78,9 @@ static const __be32 mlx4_ib_opcode[] = {
78 [IB_WR_RDMA_READ] = __constant_cpu_to_be32(MLX4_OPCODE_RDMA_READ), 78 [IB_WR_RDMA_READ] = __constant_cpu_to_be32(MLX4_OPCODE_RDMA_READ),
79 [IB_WR_ATOMIC_CMP_AND_SWP] = __constant_cpu_to_be32(MLX4_OPCODE_ATOMIC_CS), 79 [IB_WR_ATOMIC_CMP_AND_SWP] = __constant_cpu_to_be32(MLX4_OPCODE_ATOMIC_CS),
80 [IB_WR_ATOMIC_FETCH_AND_ADD] = __constant_cpu_to_be32(MLX4_OPCODE_ATOMIC_FA), 80 [IB_WR_ATOMIC_FETCH_AND_ADD] = __constant_cpu_to_be32(MLX4_OPCODE_ATOMIC_FA),
81 [IB_WR_SEND_WITH_INV] = __constant_cpu_to_be32(MLX4_OPCODE_SEND_INVAL),
82 [IB_WR_LOCAL_INV] = __constant_cpu_to_be32(MLX4_OPCODE_LOCAL_INVAL),
83 [IB_WR_FAST_REG_MR] = __constant_cpu_to_be32(MLX4_OPCODE_FMR),
81}; 84};
82 85
83static struct mlx4_ib_sqp *to_msqp(struct mlx4_ib_qp *mqp) 86static struct mlx4_ib_sqp *to_msqp(struct mlx4_ib_qp *mqp)
@@ -976,6 +979,10 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
976 context->pd = cpu_to_be32(to_mpd(ibqp->pd)->pdn); 979 context->pd = cpu_to_be32(to_mpd(ibqp->pd)->pdn);
977 context->params1 = cpu_to_be32(MLX4_IB_ACK_REQ_FREQ << 28); 980 context->params1 = cpu_to_be32(MLX4_IB_ACK_REQ_FREQ << 28);
978 981
982 /* Set "fast registration enabled" for all kernel QPs */
983 if (!qp->ibqp.uobject)
984 context->params1 |= cpu_to_be32(1 << 11);
985
979 if (attr_mask & IB_QP_RNR_RETRY) { 986 if (attr_mask & IB_QP_RNR_RETRY) {
980 context->params1 |= cpu_to_be32(attr->rnr_retry << 13); 987 context->params1 |= cpu_to_be32(attr->rnr_retry << 13);
981 optpar |= MLX4_QP_OPTPAR_RNR_RETRY; 988 optpar |= MLX4_QP_OPTPAR_RNR_RETRY;
@@ -1322,6 +1329,38 @@ static int mlx4_wq_overflow(struct mlx4_ib_wq *wq, int nreq, struct ib_cq *ib_cq
1322 return cur + nreq >= wq->max_post; 1329 return cur + nreq >= wq->max_post;
1323} 1330}
1324 1331
1332static __be32 convert_access(int acc)
1333{
1334 return (acc & IB_ACCESS_REMOTE_ATOMIC ? cpu_to_be32(MLX4_WQE_FMR_PERM_ATOMIC) : 0) |
1335 (acc & IB_ACCESS_REMOTE_WRITE ? cpu_to_be32(MLX4_WQE_FMR_PERM_REMOTE_WRITE) : 0) |
1336 (acc & IB_ACCESS_REMOTE_READ ? cpu_to_be32(MLX4_WQE_FMR_PERM_REMOTE_READ) : 0) |
1337 (acc & IB_ACCESS_LOCAL_WRITE ? cpu_to_be32(MLX4_WQE_FMR_PERM_LOCAL_WRITE) : 0) |
1338 cpu_to_be32(MLX4_WQE_FMR_PERM_LOCAL_READ);
1339}
1340
1341static void set_fmr_seg(struct mlx4_wqe_fmr_seg *fseg, struct ib_send_wr *wr)
1342{
1343 struct mlx4_ib_fast_reg_page_list *mfrpl = to_mfrpl(wr->wr.fast_reg.page_list);
1344
1345 fseg->flags = convert_access(wr->wr.fast_reg.access_flags);
1346 fseg->mem_key = cpu_to_be32(wr->wr.fast_reg.rkey);
1347 fseg->buf_list = cpu_to_be64(mfrpl->map);
1348 fseg->start_addr = cpu_to_be64(wr->wr.fast_reg.iova_start);
1349 fseg->reg_len = cpu_to_be64(wr->wr.fast_reg.length);
1350 fseg->offset = 0; /* XXX -- is this just for ZBVA? */
1351 fseg->page_size = cpu_to_be32(wr->wr.fast_reg.page_shift);
1352 fseg->reserved[0] = 0;
1353 fseg->reserved[1] = 0;
1354}
1355
1356static void set_local_inv_seg(struct mlx4_wqe_local_inval_seg *iseg, u32 rkey)
1357{
1358 iseg->flags = 0;
1359 iseg->mem_key = cpu_to_be32(rkey);
1360 iseg->guest_id = 0;
1361 iseg->pa = 0;
1362}
1363
1325static __always_inline void set_raddr_seg(struct mlx4_wqe_raddr_seg *rseg, 1364static __always_inline void set_raddr_seg(struct mlx4_wqe_raddr_seg *rseg,
1326 u64 remote_addr, u32 rkey) 1365 u64 remote_addr, u32 rkey)
1327{ 1366{
@@ -1395,7 +1434,7 @@ static void __set_data_seg(struct mlx4_wqe_data_seg *dseg, struct ib_sge *sg)
1395 dseg->addr = cpu_to_be64(sg->addr); 1434 dseg->addr = cpu_to_be64(sg->addr);
1396} 1435}
1397 1436
1398static int build_lso_seg(struct mlx4_lso_seg *wqe, struct ib_send_wr *wr, 1437static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr,
1399 struct mlx4_ib_qp *qp, unsigned *lso_seg_len) 1438 struct mlx4_ib_qp *qp, unsigned *lso_seg_len)
1400{ 1439{
1401 unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); 1440 unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16);
@@ -1423,6 +1462,21 @@ static int build_lso_seg(struct mlx4_lso_seg *wqe, struct ib_send_wr *wr,
1423 return 0; 1462 return 0;
1424} 1463}
1425 1464
1465static __be32 send_ieth(struct ib_send_wr *wr)
1466{
1467 switch (wr->opcode) {
1468 case IB_WR_SEND_WITH_IMM:
1469 case IB_WR_RDMA_WRITE_WITH_IMM:
1470 return wr->ex.imm_data;
1471
1472 case IB_WR_SEND_WITH_INV:
1473 return cpu_to_be32(wr->ex.invalidate_rkey);
1474
1475 default:
1476 return 0;
1477 }
1478}
1479
1426int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, 1480int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
1427 struct ib_send_wr **bad_wr) 1481 struct ib_send_wr **bad_wr)
1428{ 1482{
@@ -1469,11 +1523,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
1469 MLX4_WQE_CTRL_TCP_UDP_CSUM) : 0) | 1523 MLX4_WQE_CTRL_TCP_UDP_CSUM) : 0) |
1470 qp->sq_signal_bits; 1524 qp->sq_signal_bits;
1471 1525
1472 if (wr->opcode == IB_WR_SEND_WITH_IMM || 1526 ctrl->imm = send_ieth(wr);
1473 wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM)
1474 ctrl->imm = wr->ex.imm_data;
1475 else
1476 ctrl->imm = 0;
1477 1527
1478 wqe += sizeof *ctrl; 1528 wqe += sizeof *ctrl;
1479 size = sizeof *ctrl / 16; 1529 size = sizeof *ctrl / 16;
@@ -1505,6 +1555,18 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
1505 size += sizeof (struct mlx4_wqe_raddr_seg) / 16; 1555 size += sizeof (struct mlx4_wqe_raddr_seg) / 16;
1506 break; 1556 break;
1507 1557
1558 case IB_WR_LOCAL_INV:
1559 set_local_inv_seg(wqe, wr->ex.invalidate_rkey);
1560 wqe += sizeof (struct mlx4_wqe_local_inval_seg);
1561 size += sizeof (struct mlx4_wqe_local_inval_seg) / 16;
1562 break;
1563
1564 case IB_WR_FAST_REG_MR:
1565 set_fmr_seg(wqe, wr);
1566 wqe += sizeof (struct mlx4_wqe_fmr_seg);
1567 size += sizeof (struct mlx4_wqe_fmr_seg) / 16;
1568 break;
1569
1508 default: 1570 default:
1509 /* No extra segments required for sends */ 1571 /* No extra segments required for sends */
1510 break; 1572 break;
diff --git a/drivers/infiniband/hw/mthca/mthca_dev.h b/drivers/infiniband/hw/mthca/mthca_dev.h
index ee4d073c889f..252590116df5 100644
--- a/drivers/infiniband/hw/mthca/mthca_dev.h
+++ b/drivers/infiniband/hw/mthca/mthca_dev.h
@@ -202,6 +202,7 @@ struct mthca_pd_table {
202 202
203struct mthca_buddy { 203struct mthca_buddy {
204 unsigned long **bits; 204 unsigned long **bits;
205 int *num_free;
205 int max_order; 206 int max_order;
206 spinlock_t lock; 207 spinlock_t lock;
207}; 208};
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index 8489b1e81c0f..882e6b735915 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -89,23 +89,26 @@ static u32 mthca_buddy_alloc(struct mthca_buddy *buddy, int order)
89 89
90 spin_lock(&buddy->lock); 90 spin_lock(&buddy->lock);
91 91
92 for (o = order; o <= buddy->max_order; ++o) { 92 for (o = order; o <= buddy->max_order; ++o)
93 m = 1 << (buddy->max_order - o); 93 if (buddy->num_free[o]) {
94 seg = find_first_bit(buddy->bits[o], m); 94 m = 1 << (buddy->max_order - o);
95 if (seg < m) 95 seg = find_first_bit(buddy->bits[o], m);
96 goto found; 96 if (seg < m)
97 } 97 goto found;
98 }
98 99
99 spin_unlock(&buddy->lock); 100 spin_unlock(&buddy->lock);
100 return -1; 101 return -1;
101 102
102 found: 103 found:
103 clear_bit(seg, buddy->bits[o]); 104 clear_bit(seg, buddy->bits[o]);
105 --buddy->num_free[o];
104 106
105 while (o > order) { 107 while (o > order) {
106 --o; 108 --o;
107 seg <<= 1; 109 seg <<= 1;
108 set_bit(seg ^ 1, buddy->bits[o]); 110 set_bit(seg ^ 1, buddy->bits[o]);
111 ++buddy->num_free[o];
109 } 112 }
110 113
111 spin_unlock(&buddy->lock); 114 spin_unlock(&buddy->lock);
@@ -123,11 +126,13 @@ static void mthca_buddy_free(struct mthca_buddy *buddy, u32 seg, int order)
123 126
124 while (test_bit(seg ^ 1, buddy->bits[order])) { 127 while (test_bit(seg ^ 1, buddy->bits[order])) {
125 clear_bit(seg ^ 1, buddy->bits[order]); 128 clear_bit(seg ^ 1, buddy->bits[order]);
129 --buddy->num_free[order];
126 seg >>= 1; 130 seg >>= 1;
127 ++order; 131 ++order;
128 } 132 }
129 133
130 set_bit(seg, buddy->bits[order]); 134 set_bit(seg, buddy->bits[order]);
135 ++buddy->num_free[order];
131 136
132 spin_unlock(&buddy->lock); 137 spin_unlock(&buddy->lock);
133} 138}
@@ -141,7 +146,9 @@ static int mthca_buddy_init(struct mthca_buddy *buddy, int max_order)
141 146
142 buddy->bits = kzalloc((buddy->max_order + 1) * sizeof (long *), 147 buddy->bits = kzalloc((buddy->max_order + 1) * sizeof (long *),
143 GFP_KERNEL); 148 GFP_KERNEL);
144 if (!buddy->bits) 149 buddy->num_free = kzalloc((buddy->max_order + 1) * sizeof (int *),
150 GFP_KERNEL);
151 if (!buddy->bits || !buddy->num_free)
145 goto err_out; 152 goto err_out;
146 153
147 for (i = 0; i <= buddy->max_order; ++i) { 154 for (i = 0; i <= buddy->max_order; ++i) {
@@ -154,6 +161,7 @@ static int mthca_buddy_init(struct mthca_buddy *buddy, int max_order)
154 } 161 }
155 162
156 set_bit(0, buddy->bits[buddy->max_order]); 163 set_bit(0, buddy->bits[buddy->max_order]);
164 buddy->num_free[buddy->max_order] = 1;
157 165
158 return 0; 166 return 0;
159 167
@@ -161,9 +169,10 @@ err_out_free:
161 for (i = 0; i <= buddy->max_order; ++i) 169 for (i = 0; i <= buddy->max_order; ++i)
162 kfree(buddy->bits[i]); 170 kfree(buddy->bits[i]);
163 171
172err_out:
164 kfree(buddy->bits); 173 kfree(buddy->bits);
174 kfree(buddy->num_free);
165 175
166err_out:
167 return -ENOMEM; 176 return -ENOMEM;
168} 177}
169 178
@@ -175,6 +184,7 @@ static void mthca_buddy_cleanup(struct mthca_buddy *buddy)
175 kfree(buddy->bits[i]); 184 kfree(buddy->bits[i]);
176 185
177 kfree(buddy->bits); 186 kfree(buddy->bits);
187 kfree(buddy->num_free);
178} 188}
179 189
180static u32 mthca_alloc_mtt_range(struct mthca_dev *dev, int order, 190static u32 mthca_alloc_mtt_range(struct mthca_dev *dev, int order,
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 8be9ea0436e6..f51201b17bfd 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -548,7 +548,7 @@ static int path_rec_start(struct net_device *dev,
548 path_rec_completion, 548 path_rec_completion,
549 path, &path->query); 549 path, &path->query);
550 if (path->query_id < 0) { 550 if (path->query_id < 0) {
551 ipoib_warn(priv, "ib_sa_path_rec_get failed\n"); 551 ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id);
552 path->query = NULL; 552 path->query = NULL;
553 return path->query_id; 553 return path->query_id;
554 } 554 }
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 3a917c1f796f..63462ecca147 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -483,6 +483,7 @@ static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *eve
483 break; 483 break;
484 case RDMA_CM_EVENT_DISCONNECTED: 484 case RDMA_CM_EVENT_DISCONNECTED:
485 case RDMA_CM_EVENT_DEVICE_REMOVAL: 485 case RDMA_CM_EVENT_DEVICE_REMOVAL:
486 case RDMA_CM_EVENT_ADDR_CHANGE:
486 iser_disconnected_handler(cma_id); 487 iser_disconnected_handler(cma_id);
487 break; 488 break;
488 default: 489 default:
diff --git a/drivers/input/evbug.c b/drivers/input/evbug.c
index c21f2f127234..0353601ac3b5 100644
--- a/drivers/input/evbug.c
+++ b/drivers/input/evbug.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: evbug.c,v 1.10 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
@@ -41,7 +39,7 @@ MODULE_LICENSE("GPL");
41static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) 39static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
42{ 40{
43 printk(KERN_DEBUG "evbug.c: Event. Dev: %s, Type: %d, Code: %d, Value: %d\n", 41 printk(KERN_DEBUG "evbug.c: Event. Dev: %s, Type: %d, Code: %d, Value: %d\n",
44 handle->dev->phys, type, code, value); 42 handle->dev->dev.bus_id, type, code, value);
45} 43}
46 44
47static int evbug_connect(struct input_handler *handler, struct input_dev *dev, 45static int evbug_connect(struct input_handler *handler, struct input_dev *dev,
@@ -66,7 +64,10 @@ static int evbug_connect(struct input_handler *handler, struct input_dev *dev,
66 if (error) 64 if (error)
67 goto err_unregister_handle; 65 goto err_unregister_handle;
68 66
69 printk(KERN_DEBUG "evbug.c: Connected device: \"%s\", %s\n", dev->name, dev->phys); 67 printk(KERN_DEBUG "evbug.c: Connected device: %s (%s at %s)\n",
68 dev->dev.bus_id,
69 dev->name ?: "unknown",
70 dev->phys ?: "unknown");
70 71
71 return 0; 72 return 0;
72 73
@@ -79,7 +80,8 @@ static int evbug_connect(struct input_handler *handler, struct input_dev *dev,
79 80
80static void evbug_disconnect(struct input_handle *handle) 81static void evbug_disconnect(struct input_handle *handle)
81{ 82{
82 printk(KERN_DEBUG "evbug.c: Disconnected device: %s\n", handle->dev->phys); 83 printk(KERN_DEBUG "evbug.c: Disconnected device: %s\n",
84 handle->dev->dev.bus_id);
83 85
84 input_close_device(handle); 86 input_close_device(handle);
85 input_unregister_handle(handle); 87 input_unregister_handle(handle);
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index b32984bc516f..2d65411f6763 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -300,6 +300,35 @@ struct input_event_compat {
300 __s32 value; 300 __s32 value;
301}; 301};
302 302
303struct ff_periodic_effect_compat {
304 __u16 waveform;
305 __u16 period;
306 __s16 magnitude;
307 __s16 offset;
308 __u16 phase;
309
310 struct ff_envelope envelope;
311
312 __u32 custom_len;
313 compat_uptr_t custom_data;
314};
315
316struct ff_effect_compat {
317 __u16 type;
318 __s16 id;
319 __u16 direction;
320 struct ff_trigger trigger;
321 struct ff_replay replay;
322
323 union {
324 struct ff_constant_effect constant;
325 struct ff_ramp_effect ramp;
326 struct ff_periodic_effect_compat periodic;
327 struct ff_condition_effect condition[2]; /* One for each axis */
328 struct ff_rumble_effect rumble;
329 } u;
330};
331
303/* Note to the author of this code: did it ever occur to 332/* Note to the author of this code: did it ever occur to
304 you why the ifdefs are needed? Think about it again. -AK */ 333 you why the ifdefs are needed? Think about it again. -AK */
305#ifdef CONFIG_X86_64 334#ifdef CONFIG_X86_64
@@ -368,6 +397,42 @@ static int evdev_event_to_user(char __user *buffer,
368 return 0; 397 return 0;
369} 398}
370 399
400static int evdev_ff_effect_from_user(const char __user *buffer, size_t size,
401 struct ff_effect *effect)
402{
403 if (COMPAT_TEST) {
404 struct ff_effect_compat *compat_effect;
405
406 if (size != sizeof(struct ff_effect_compat))
407 return -EINVAL;
408
409 /*
410 * It so happens that the pointer which needs to be changed
411 * is the last field in the structure, so we can copy the
412 * whole thing and replace just the pointer.
413 */
414
415 compat_effect = (struct ff_effect_compat *)effect;
416
417 if (copy_from_user(compat_effect, buffer,
418 sizeof(struct ff_effect_compat)))
419 return -EFAULT;
420
421 if (compat_effect->type == FF_PERIODIC &&
422 compat_effect->u.periodic.waveform == FF_CUSTOM)
423 effect->u.periodic.custom_data =
424 compat_ptr(compat_effect->u.periodic.custom_data);
425 } else {
426 if (size != sizeof(struct ff_effect))
427 return -EINVAL;
428
429 if (copy_from_user(effect, buffer, sizeof(struct ff_effect)))
430 return -EFAULT;
431 }
432
433 return 0;
434}
435
371#else 436#else
372 437
373static inline size_t evdev_event_size(void) 438static inline size_t evdev_event_size(void)
@@ -393,6 +458,18 @@ static int evdev_event_to_user(char __user *buffer,
393 return 0; 458 return 0;
394} 459}
395 460
461static int evdev_ff_effect_from_user(const char __user *buffer, size_t size,
462 struct ff_effect *effect)
463{
464 if (size != sizeof(struct ff_effect))
465 return -EINVAL;
466
467 if (copy_from_user(effect, buffer, sizeof(struct ff_effect)))
468 return -EFAULT;
469
470 return 0;
471}
472
396#endif /* CONFIG_COMPAT */ 473#endif /* CONFIG_COMPAT */
397 474
398static ssize_t evdev_write(struct file *file, const char __user *buffer, 475static ssize_t evdev_write(struct file *file, const char __user *buffer,
@@ -633,17 +710,6 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
633 710
634 return input_set_keycode(dev, t, v); 711 return input_set_keycode(dev, t, v);
635 712
636 case EVIOCSFF:
637 if (copy_from_user(&effect, p, sizeof(effect)))
638 return -EFAULT;
639
640 error = input_ff_upload(dev, &effect, file);
641
642 if (put_user(effect.id, &(((struct ff_effect __user *)p)->id)))
643 return -EFAULT;
644
645 return error;
646
647 case EVIOCRMFF: 713 case EVIOCRMFF:
648 return input_ff_erase(dev, (int)(unsigned long) p, file); 714 return input_ff_erase(dev, (int)(unsigned long) p, file);
649 715
@@ -733,6 +799,19 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
733 799
734 if (_IOC_DIR(cmd) == _IOC_WRITE) { 800 if (_IOC_DIR(cmd) == _IOC_WRITE) {
735 801
802 if (_IOC_NR(cmd) == _IOC_NR(EVIOCSFF)) {
803
804 if (evdev_ff_effect_from_user(p, _IOC_SIZE(cmd), &effect))
805 return -EFAULT;
806
807 error = input_ff_upload(dev, &effect, file);
808
809 if (put_user(effect.id, &(((struct ff_effect __user *)p)->id)))
810 return -EFAULT;
811
812 return error;
813 }
814
736 if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) { 815 if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {
737 816
738 t = _IOC_NR(cmd) & ABS_MAX; 817 t = _IOC_NR(cmd) & ABS_MAX;
diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c
index d226d935b0dc..6790e975a98c 100644
--- a/drivers/input/ff-memless.c
+++ b/drivers/input/ff-memless.c
@@ -247,9 +247,9 @@ static void ml_combine_effects(struct ff_effect *effect,
247 * in s8, this should be changed to something more generic 247 * in s8, this should be changed to something more generic
248 */ 248 */
249 effect->u.ramp.start_level = 249 effect->u.ramp.start_level =
250 max(min(effect->u.ramp.start_level + x, 0x7f), -0x80); 250 clamp_val(effect->u.ramp.start_level + x, -0x80, 0x7f);
251 effect->u.ramp.end_level = 251 effect->u.ramp.end_level =
252 max(min(effect->u.ramp.end_level + y, 0x7f), -0x80); 252 clamp_val(effect->u.ramp.end_level + y, -0x80, 0x7f);
253 break; 253 break;
254 254
255 case FF_RUMBLE: 255 case FF_RUMBLE:
diff --git a/drivers/input/gameport/emu10k1-gp.c b/drivers/input/gameport/emu10k1-gp.c
index 9793ac36d17f..b04930f7ea7d 100644
--- a/drivers/input/gameport/emu10k1-gp.c
+++ b/drivers/input/gameport/emu10k1-gp.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: emu10k1-gp.c,v 1.8 2002/01/22 20:40:46 vojtech Exp $
3 *
4 * Copyright (c) 2001 Vojtech Pavlik 2 * Copyright (c) 2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c
index c5600ac5feb3..078e4eed0894 100644
--- a/drivers/input/gameport/gameport.c
+++ b/drivers/input/gameport/gameport.c
@@ -36,7 +36,6 @@ EXPORT_SYMBOL(__gameport_register_driver);
36EXPORT_SYMBOL(gameport_unregister_driver); 36EXPORT_SYMBOL(gameport_unregister_driver);
37EXPORT_SYMBOL(gameport_open); 37EXPORT_SYMBOL(gameport_open);
38EXPORT_SYMBOL(gameport_close); 38EXPORT_SYMBOL(gameport_close);
39EXPORT_SYMBOL(gameport_rescan);
40EXPORT_SYMBOL(gameport_set_phys); 39EXPORT_SYMBOL(gameport_set_phys);
41EXPORT_SYMBOL(gameport_start_polling); 40EXPORT_SYMBOL(gameport_start_polling);
42EXPORT_SYMBOL(gameport_stop_polling); 41EXPORT_SYMBOL(gameport_stop_polling);
@@ -230,8 +229,6 @@ static void gameport_find_driver(struct gameport *gameport)
230 */ 229 */
231 230
232enum gameport_event_type { 231enum gameport_event_type {
233 GAMEPORT_RESCAN,
234 GAMEPORT_RECONNECT,
235 GAMEPORT_REGISTER_PORT, 232 GAMEPORT_REGISTER_PORT,
236 GAMEPORT_REGISTER_DRIVER, 233 GAMEPORT_REGISTER_DRIVER,
237}; 234};
@@ -365,15 +362,6 @@ static void gameport_handle_event(void)
365 gameport_add_port(event->object); 362 gameport_add_port(event->object);
366 break; 363 break;
367 364
368 case GAMEPORT_RECONNECT:
369 gameport_reconnect_port(event->object);
370 break;
371
372 case GAMEPORT_RESCAN:
373 gameport_disconnect_port(event->object);
374 gameport_find_driver(event->object);
375 break;
376
377 case GAMEPORT_REGISTER_DRIVER: 365 case GAMEPORT_REGISTER_DRIVER:
378 gameport_add_driver(event->object); 366 gameport_add_driver(event->object);
379 break; 367 break;
@@ -651,16 +639,6 @@ static void gameport_disconnect_port(struct gameport *gameport)
651 device_release_driver(&gameport->dev); 639 device_release_driver(&gameport->dev);
652} 640}
653 641
654void gameport_rescan(struct gameport *gameport)
655{
656 gameport_queue_event(gameport, NULL, GAMEPORT_RESCAN);
657}
658
659void gameport_reconnect(struct gameport *gameport)
660{
661 gameport_queue_event(gameport, NULL, GAMEPORT_RECONNECT);
662}
663
664/* 642/*
665 * Submits register request to kgameportd for subsequent execution. 643 * Submits register request to kgameportd for subsequent execution.
666 * Note that port registration is always asynchronous. 644 * Note that port registration is always asynchronous.
diff --git a/drivers/input/gameport/lightning.c b/drivers/input/gameport/lightning.c
index 6b4d4561d465..06ad36ed3483 100644
--- a/drivers/input/gameport/lightning.c
+++ b/drivers/input/gameport/lightning.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: lightning.c,v 1.20 2002/01/22 20:41:31 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/gameport/ns558.c b/drivers/input/gameport/ns558.c
index 7b7a546323cf..2b282cde4b89 100644
--- a/drivers/input/gameport/ns558.c
+++ b/drivers/input/gameport/ns558.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: ns558.c,v 1.43 2002/01/24 19:23:21 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 * Copyright (c) 1999 Brian Gerst 3 * Copyright (c) 1999 Brian Gerst
6 */ 4 */
diff --git a/drivers/input/input.c b/drivers/input/input.c
index 408df0bd6be5..c13ced3e0d3d 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -242,7 +242,7 @@ static void input_handle_event(struct input_dev *dev,
242 break; 242 break;
243 } 243 }
244 244
245 if (type != EV_SYN) 245 if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)
246 dev->sync = 0; 246 dev->sync = 0;
247 247
248 if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) 248 if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
diff --git a/drivers/input/joystick/a3d.c b/drivers/input/joystick/a3d.c
index 52ba16f487c7..92498d470b1f 100644
--- a/drivers/input/joystick/a3d.c
+++ b/drivers/input/joystick/a3d.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: a3d.c,v 1.21 2002/01/22 20:11:50 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/amijoy.c b/drivers/input/joystick/amijoy.c
index deb9f825f92c..05022f07ec77 100644
--- a/drivers/input/joystick/amijoy.c
+++ b/drivers/input/joystick/amijoy.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: amijoy.c,v 1.13 2002/01/22 20:26:32 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/cobra.c b/drivers/input/joystick/cobra.c
index 55646a6d89f5..639b975a8ed7 100644
--- a/drivers/input/joystick/cobra.c
+++ b/drivers/input/joystick/cobra.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: cobra.c,v 1.19 2002/01/22 20:26:52 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c
index 960e501c60c8..523959484753 100644
--- a/drivers/input/joystick/db9.c
+++ b/drivers/input/joystick/db9.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: db9.c,v 1.13 2002/04/07 20:13:37 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c
index 1f6302c0eb3f..cb6eef1f2d99 100644
--- a/drivers/input/joystick/gf2k.c
+++ b/drivers/input/joystick/gf2k.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: gf2k.c,v 1.19 2002/01/22 20:27:43 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c
index fd3853ab1aad..684e07cfccc8 100644
--- a/drivers/input/joystick/grip.c
+++ b/drivers/input/joystick/grip.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: grip.c,v 1.21 2002/01/22 20:27:57 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c
index c57e21d68c00..8279481b16e7 100644
--- a/drivers/input/joystick/grip_mp.c
+++ b/drivers/input/joystick/grip_mp.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: grip_mp.c,v 1.9 2002/07/20 19:28:45 bonnland Exp $
3 *
4 * Driver for the Gravis Grip Multiport, a gamepad "hub" that 2 * Driver for the Gravis Grip Multiport, a gamepad "hub" that
5 * connects up to four 9-pin digital gamepads/joysticks. 3 * connects up to four 9-pin digital gamepads/joysticks.
6 * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5. 4 * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5.
diff --git a/drivers/input/joystick/guillemot.c b/drivers/input/joystick/guillemot.c
index aa6bfb3fb8cd..25ec3fad9f27 100644
--- a/drivers/input/joystick/guillemot.c
+++ b/drivers/input/joystick/guillemot.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: guillemot.c,v 1.10 2002/01/22 20:28:12 vojtech Exp $
3 *
4 * Copyright (c) 2001 Vojtech Pavlik 2 * Copyright (c) 2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/iforce/iforce-ff.c b/drivers/input/joystick/iforce/iforce-ff.c
index f2a4381d0ab8..7839b7b6fa96 100644
--- a/drivers/input/joystick/iforce/iforce-ff.c
+++ b/drivers/input/joystick/iforce/iforce-ff.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: iforce-ff.c,v 1.9 2002/02/02 19:28:35 jdeneux Exp $
3 *
4 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> 2 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
5 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> 3 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
6 * 4 *
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c
index a2517fa72eb8..61ee6e38739d 100644
--- a/drivers/input/joystick/iforce/iforce-main.c
+++ b/drivers/input/joystick/iforce/iforce-main.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: iforce-main.c,v 1.19 2002/07/07 10:22:50 jdeneux Exp $
3 *
4 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> 2 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
5 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> 3 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
6 * 4 *
diff --git a/drivers/input/joystick/iforce/iforce-packets.c b/drivers/input/joystick/iforce/iforce-packets.c
index 45c4939ced75..015b50aa76fc 100644
--- a/drivers/input/joystick/iforce/iforce-packets.c
+++ b/drivers/input/joystick/iforce/iforce-packets.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: iforce-packets.c,v 1.16 2002/07/07 10:22:50 jdeneux Exp $
3 *
4 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> 2 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
5 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> 3 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
6 * 4 *
diff --git a/drivers/input/joystick/iforce/iforce-serio.c b/drivers/input/joystick/iforce/iforce-serio.c
index 7b4bc19cef27..46d5041d2d9d 100644
--- a/drivers/input/joystick/iforce/iforce-serio.c
+++ b/drivers/input/joystick/iforce/iforce-serio.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: iforce-serio.c,v 1.4 2002/01/28 22:45:00 jdeneux Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz> 2 * Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz>
5 * Copyright (c) 2001, 2007 Johann Deneux <johann.deneux@gmail.com> 3 * Copyright (c) 2001, 2007 Johann Deneux <johann.deneux@gmail.com>
6 * 4 *
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c
index 7fb3cf81cfbf..851cc4087c2f 100644
--- a/drivers/input/joystick/iforce/iforce-usb.c
+++ b/drivers/input/joystick/iforce/iforce-usb.c
@@ -1,6 +1,4 @@
1 /* 1 /*
2 * $Id: iforce-usb.c,v 1.16 2002/06/09 11:08:04 jdeneux Exp $
3 *
4 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> 2 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
5 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> 3 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
6 * 4 *
@@ -89,10 +87,10 @@ static void iforce_usb_irq(struct urb *urb)
89 case -ESHUTDOWN: 87 case -ESHUTDOWN:
90 /* this urb is terminated, clean up */ 88 /* this urb is terminated, clean up */
91 dbg("%s - urb shutting down with status: %d", 89 dbg("%s - urb shutting down with status: %d",
92 __FUNCTION__, urb->status); 90 __func__, urb->status);
93 return; 91 return;
94 default: 92 default:
95 dbg("%s - urb has status of: %d", __FUNCTION__, urb->status); 93 dbg("%s - urb has status of: %d", __func__, urb->status);
96 goto exit; 94 goto exit;
97 } 95 }
98 96
@@ -103,7 +101,7 @@ exit:
103 status = usb_submit_urb (urb, GFP_ATOMIC); 101 status = usb_submit_urb (urb, GFP_ATOMIC);
104 if (status) 102 if (status)
105 err ("%s - usb_submit_urb failed with result %d", 103 err ("%s - usb_submit_urb failed with result %d",
106 __FUNCTION__, status); 104 __func__, status);
107} 105}
108 106
109static void iforce_usb_out(struct urb *urb) 107static void iforce_usb_out(struct urb *urb)
diff --git a/drivers/input/joystick/iforce/iforce.h b/drivers/input/joystick/iforce/iforce.h
index a964a7cfd210..f2d91f4028ca 100644
--- a/drivers/input/joystick/iforce/iforce.h
+++ b/drivers/input/joystick/iforce/iforce.h
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: iforce.h,v 1.13 2002/07/07 10:22:50 jdeneux Exp $
3 *
4 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz> 2 * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
5 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com> 3 * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
6 * 4 *
diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c
index bc8ea95dfd0e..8c3290b68205 100644
--- a/drivers/input/joystick/interact.c
+++ b/drivers/input/joystick/interact.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: interact.c,v 1.16 2002/01/22 20:28:25 vojtech Exp $
3 *
4 * Copyright (c) 2001 Vojtech Pavlik 2 * Copyright (c) 2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/joystick/joydump.c b/drivers/input/joystick/joydump.c
index 88ec5a918f2e..2a1b82c8b31c 100644
--- a/drivers/input/joystick/joydump.c
+++ b/drivers/input/joystick/joydump.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: joydump.c,v 1.1 2002/01/23 06:56:16 jsimmons Exp $
3 *
4 * Copyright (c) 1996-2001 Vojtech Pavlik 2 * Copyright (c) 1996-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c
index 54e676948ebb..40e40780747d 100644
--- a/drivers/input/joystick/magellan.c
+++ b/drivers/input/joystick/magellan.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: magellan.c,v 1.16 2002/01/22 20:28:39 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c
index d4087fd49656..0cd9b29356a8 100644
--- a/drivers/input/joystick/spaceball.c
+++ b/drivers/input/joystick/spaceball.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: spaceball.c,v 1.17 2002/01/22 20:29:03 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/joystick/spaceorb.c b/drivers/input/joystick/spaceorb.c
index f7ce4004f4ba..a694bf8e557b 100644
--- a/drivers/input/joystick/spaceorb.c
+++ b/drivers/input/joystick/spaceorb.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: spaceorb.c,v 1.15 2002/01/22 20:29:19 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c
index baa10b2f7ba1..e0db9f5e4b41 100644
--- a/drivers/input/joystick/stinger.c
+++ b/drivers/input/joystick/stinger.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: stinger.c,v 1.10 2002/01/22 20:29:31 vojtech Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
5 * Copyright (c) 2000 Mark Fletcher 3 * Copyright (c) 2000 Mark Fletcher
6 */ 4 */
diff --git a/drivers/input/joystick/tmdc.c b/drivers/input/joystick/tmdc.c
index 0feeb8acb532..60c37bcb938d 100644
--- a/drivers/input/joystick/tmdc.c
+++ b/drivers/input/joystick/tmdc.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: tmdc.c,v 1.31 2002/01/22 20:29:52 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c
index 989483f53160..b6f859869540 100644
--- a/drivers/input/joystick/turbografx.c
+++ b/drivers/input/joystick/turbografx.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: turbografx.c,v 1.14 2002/01/22 20:30:39 vojtech Exp $
3 *
4 * Copyright (c) 1998-2001 Vojtech Pavlik 2 * Copyright (c) 1998-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/joystick/twidjoy.c b/drivers/input/joystick/twidjoy.c
index 1085c841fec4..3f4ec73c9553 100644
--- a/drivers/input/joystick/twidjoy.c
+++ b/drivers/input/joystick/twidjoy.c
@@ -1,8 +1,4 @@
1/* 1/*
2 * $Id: twidjoy.c,v 1.5 2002/01/22 20:31:53 vojtech Exp $
3 *
4 * derived from CVS-ID "stinger.c,v 1.5 2001/05/29 12:57:18 vojtech Exp"
5 *
6 * Copyright (c) 2001 Arndt Schoenewald 2 * Copyright (c) 2001 Arndt Schoenewald
7 * Copyright (c) 2000-2001 Vojtech Pavlik 3 * Copyright (c) 2000-2001 Vojtech Pavlik
8 * Copyright (c) 2000 Mark Fletcher 4 * Copyright (c) 2000 Mark Fletcher
diff --git a/drivers/input/joystick/warrior.c b/drivers/input/joystick/warrior.c
index e928b6e3724a..f72c83e15e60 100644
--- a/drivers/input/joystick/warrior.c
+++ b/drivers/input/joystick/warrior.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: warrior.c,v 1.14 2002/01/22 20:32:10 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index b29e3affb805..87d3e7eabffd 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -418,11 +418,11 @@ static void xpad_irq_in(struct urb *urb)
418 case -ESHUTDOWN: 418 case -ESHUTDOWN:
419 /* this urb is terminated, clean up */ 419 /* this urb is terminated, clean up */
420 dbg("%s - urb shutting down with status: %d", 420 dbg("%s - urb shutting down with status: %d",
421 __FUNCTION__, status); 421 __func__, status);
422 return; 422 return;
423 default: 423 default:
424 dbg("%s - nonzero urb status received: %d", 424 dbg("%s - nonzero urb status received: %d",
425 __FUNCTION__, status); 425 __func__, status);
426 goto exit; 426 goto exit;
427 } 427 }
428 428
@@ -441,7 +441,7 @@ exit:
441 retval = usb_submit_urb (urb, GFP_ATOMIC); 441 retval = usb_submit_urb (urb, GFP_ATOMIC);
442 if (retval) 442 if (retval)
443 err ("%s - usb_submit_urb failed with result %d", 443 err ("%s - usb_submit_urb failed with result %d",
444 __FUNCTION__, retval); 444 __func__, retval);
445} 445}
446 446
447static void xpad_bulk_out(struct urb *urb) 447static void xpad_bulk_out(struct urb *urb)
@@ -477,11 +477,11 @@ static void xpad_irq_out(struct urb *urb)
477 case -ESHUTDOWN: 477 case -ESHUTDOWN:
478 /* this urb is terminated, clean up */ 478 /* this urb is terminated, clean up */
479 dbg("%s - urb shutting down with status: %d", 479 dbg("%s - urb shutting down with status: %d",
480 __FUNCTION__, status); 480 __func__, status);
481 return; 481 return;
482 default: 482 default:
483 dbg("%s - nonzero urb status received: %d", 483 dbg("%s - nonzero urb status received: %d",
484 __FUNCTION__, status); 484 __func__, status);
485 goto exit; 485 goto exit;
486 } 486 }
487 487
@@ -489,7 +489,7 @@ exit:
489 retval = usb_submit_urb(urb, GFP_ATOMIC); 489 retval = usb_submit_urb(urb, GFP_ATOMIC);
490 if (retval) 490 if (retval)
491 err("%s - usb_submit_urb failed with result %d", 491 err("%s - usb_submit_urb failed with result %d",
492 __FUNCTION__, retval); 492 __func__, retval);
493} 493}
494 494
495static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) 495static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c
index 81bf7562aca0..35149ec455a9 100644
--- a/drivers/input/keyboard/amikbd.c
+++ b/drivers/input/keyboard/amikbd.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: amikbd.c,v 1.13 2002/02/01 16:02:24 vojtech Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index af58a6f1e898..b1ce10f50bcf 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -68,7 +68,7 @@ MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and
68 * are loadable via an userland utility. 68 * are loadable via an userland utility.
69 */ 69 */
70 70
71static unsigned char atkbd_set2_keycode[512] = { 71static const unsigned short atkbd_set2_keycode[512] = {
72 72
73#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES 73#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES
74 74
@@ -99,7 +99,7 @@ static unsigned char atkbd_set2_keycode[512] = {
99#endif 99#endif
100}; 100};
101 101
102static unsigned char atkbd_set3_keycode[512] = { 102static const unsigned short atkbd_set3_keycode[512] = {
103 103
104 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60, 104 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60,
105 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62, 105 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62,
@@ -115,7 +115,7 @@ static unsigned char atkbd_set3_keycode[512] = {
115 148,149,147,140 115 148,149,147,140
116}; 116};
117 117
118static unsigned char atkbd_unxlate_table[128] = { 118static const unsigned short atkbd_unxlate_table[128] = {
119 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13, 119 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
120 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27, 120 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
121 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42, 121 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
@@ -161,7 +161,7 @@ static unsigned char atkbd_unxlate_table[128] = {
161#define ATKBD_SCR_LEFT 249 161#define ATKBD_SCR_LEFT 249
162#define ATKBD_SCR_RIGHT 248 162#define ATKBD_SCR_RIGHT 248
163 163
164#define ATKBD_SPECIAL 248 164#define ATKBD_SPECIAL ATKBD_SCR_RIGHT
165 165
166#define ATKBD_LED_EVENT_BIT 0 166#define ATKBD_LED_EVENT_BIT 0
167#define ATKBD_REP_EVENT_BIT 1 167#define ATKBD_REP_EVENT_BIT 1
@@ -173,7 +173,7 @@ static unsigned char atkbd_unxlate_table[128] = {
173#define ATKBD_XL_HANGEUL 0x10 173#define ATKBD_XL_HANGEUL 0x10
174#define ATKBD_XL_HANJA 0x20 174#define ATKBD_XL_HANJA 0x20
175 175
176static struct { 176static const struct {
177 unsigned char keycode; 177 unsigned char keycode;
178 unsigned char set2; 178 unsigned char set2;
179} atkbd_scroll_keys[] = { 179} atkbd_scroll_keys[] = {
@@ -200,7 +200,7 @@ struct atkbd {
200 char phys[32]; 200 char phys[32];
201 201
202 unsigned short id; 202 unsigned short id;
203 unsigned char keycode[512]; 203 unsigned short keycode[512];
204 DECLARE_BITMAP(force_release_mask, 512); 204 DECLARE_BITMAP(force_release_mask, 512);
205 unsigned char set; 205 unsigned char set;
206 unsigned char translated; 206 unsigned char translated;
@@ -357,7 +357,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
357 unsigned int code = data; 357 unsigned int code = data;
358 int scroll = 0, hscroll = 0, click = -1; 358 int scroll = 0, hscroll = 0, click = -1;
359 int value; 359 int value;
360 unsigned char keycode; 360 unsigned short keycode;
361 361
362#ifdef ATKBD_DEBUG 362#ifdef ATKBD_DEBUG
363 printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); 363 printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags);
@@ -851,6 +851,23 @@ static void atkbd_latitude_keymap_fixup(struct atkbd *atkbd)
851} 851}
852 852
853/* 853/*
854 * Perform fixup for HP system that doesn't generate release
855 * for its video switch
856 */
857static void atkbd_hp_keymap_fixup(struct atkbd *atkbd)
858{
859 const unsigned int forced_release_keys[] = {
860 0x94,
861 };
862 int i;
863
864 if (atkbd->set == 2)
865 for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++)
866 __set_bit(forced_release_keys[i],
867 atkbd->force_release_mask);
868}
869
870/*
854 * atkbd_set_keycode_table() initializes keyboard's keycode table 871 * atkbd_set_keycode_table() initializes keyboard's keycode table
855 * according to the selected scancode set 872 * according to the selected scancode set
856 */ 873 */
@@ -961,16 +978,16 @@ static void atkbd_set_device_attrs(struct atkbd *atkbd)
961 input_dev->evbit[0] |= BIT_MASK(EV_REL); 978 input_dev->evbit[0] |= BIT_MASK(EV_REL);
962 input_dev->relbit[0] = BIT_MASK(REL_WHEEL) | 979 input_dev->relbit[0] = BIT_MASK(REL_WHEEL) |
963 BIT_MASK(REL_HWHEEL); 980 BIT_MASK(REL_HWHEEL);
964 set_bit(BTN_MIDDLE, input_dev->keybit); 981 __set_bit(BTN_MIDDLE, input_dev->keybit);
965 } 982 }
966 983
967 input_dev->keycode = atkbd->keycode; 984 input_dev->keycode = atkbd->keycode;
968 input_dev->keycodesize = sizeof(unsigned char); 985 input_dev->keycodesize = sizeof(unsigned short);
969 input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); 986 input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode);
970 987
971 for (i = 0; i < 512; i++) 988 for (i = 0; i < 512; i++)
972 if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL) 989 if (atkbd->keycode[i] && atkbd->keycode[i] < ATKBD_SPECIAL)
973 set_bit(atkbd->keycode[i], input_dev->keybit); 990 __set_bit(atkbd->keycode[i], input_dev->keybit);
974} 991}
975 992
976/* 993/*
@@ -1452,6 +1469,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
1452 .callback = atkbd_setup_fixup, 1469 .callback = atkbd_setup_fixup,
1453 .driver_data = atkbd_latitude_keymap_fixup, 1470 .driver_data = atkbd_latitude_keymap_fixup,
1454 }, 1471 },
1472 {
1473 .ident = "HP 2133",
1474 .matches = {
1475 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1476 DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"),
1477 },
1478 .callback = atkbd_setup_fixup,
1479 .driver_data = atkbd_hp_keymap_fixup,
1480 },
1455 { } 1481 { }
1456}; 1482};
1457 1483
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index bbd00c3fe98c..be58730e636a 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -26,23 +26,54 @@
26 26
27#include <asm/gpio.h> 27#include <asm/gpio.h>
28 28
29struct gpio_button_data {
30 struct gpio_keys_button *button;
31 struct input_dev *input;
32 struct timer_list timer;
33};
34
35struct gpio_keys_drvdata {
36 struct input_dev *input;
37 struct gpio_button_data data[0];
38};
39
40static void gpio_keys_report_event(struct gpio_keys_button *button,
41 struct input_dev *input)
42{
43 unsigned int type = button->type ?: EV_KEY;
44 int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low;
45
46 input_event(input, type, button->code, !!state);
47 input_sync(input);
48}
49
50static void gpio_check_button(unsigned long _data)
51{
52 struct gpio_button_data *data = (struct gpio_button_data *)_data;
53
54 gpio_keys_report_event(data->button, data->input);
55}
56
29static irqreturn_t gpio_keys_isr(int irq, void *dev_id) 57static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
30{ 58{
31 int i;
32 struct platform_device *pdev = dev_id; 59 struct platform_device *pdev = dev_id;
33 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; 60 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
34 struct input_dev *input = platform_get_drvdata(pdev); 61 struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
62 int i;
35 63
36 for (i = 0; i < pdata->nbuttons; i++) { 64 for (i = 0; i < pdata->nbuttons; i++) {
37 struct gpio_keys_button *button = &pdata->buttons[i]; 65 struct gpio_keys_button *button = &pdata->buttons[i];
38 int gpio = button->gpio;
39 66
40 if (irq == gpio_to_irq(gpio)) { 67 if (irq == gpio_to_irq(button->gpio)) {
41 unsigned int type = button->type ?: EV_KEY; 68 struct gpio_button_data *bdata = &ddata->data[i];
42 int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low; 69
70 if (button->debounce_interval)
71 mod_timer(&bdata->timer,
72 jiffies +
73 msecs_to_jiffies(button->debounce_interval));
74 else
75 gpio_keys_report_event(button, bdata->input);
43 76
44 input_event(input, type, button->code, !!state);
45 input_sync(input);
46 return IRQ_HANDLED; 77 return IRQ_HANDLED;
47 } 78 }
48 } 79 }
@@ -53,17 +84,21 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
53static int __devinit gpio_keys_probe(struct platform_device *pdev) 84static int __devinit gpio_keys_probe(struct platform_device *pdev)
54{ 85{
55 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; 86 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
87 struct gpio_keys_drvdata *ddata;
56 struct input_dev *input; 88 struct input_dev *input;
57 int i, error; 89 int i, error;
58 int wakeup = 0; 90 int wakeup = 0;
59 91
92 ddata = kzalloc(sizeof(struct gpio_keys_drvdata) +
93 pdata->nbuttons * sizeof(struct gpio_button_data),
94 GFP_KERNEL);
60 input = input_allocate_device(); 95 input = input_allocate_device();
61 if (!input) 96 if (!ddata || !input) {
62 return -ENOMEM; 97 error = -ENOMEM;
63 98 goto fail1;
64 platform_set_drvdata(pdev, input); 99 }
65 100
66 input->evbit[0] = BIT_MASK(EV_KEY); 101 platform_set_drvdata(pdev, ddata);
67 102
68 input->name = pdev->name; 103 input->name = pdev->name;
69 input->phys = "gpio-keys/input0"; 104 input->phys = "gpio-keys/input0";
@@ -74,16 +109,23 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
74 input->id.product = 0x0001; 109 input->id.product = 0x0001;
75 input->id.version = 0x0100; 110 input->id.version = 0x0100;
76 111
112 ddata->input = input;
113
77 for (i = 0; i < pdata->nbuttons; i++) { 114 for (i = 0; i < pdata->nbuttons; i++) {
78 struct gpio_keys_button *button = &pdata->buttons[i]; 115 struct gpio_keys_button *button = &pdata->buttons[i];
116 struct gpio_button_data *bdata = &ddata->data[i];
79 int irq; 117 int irq;
80 unsigned int type = button->type ?: EV_KEY; 118 unsigned int type = button->type ?: EV_KEY;
81 119
120 bdata->input = input;
121 setup_timer(&bdata->timer,
122 gpio_check_button, (unsigned long)bdata);
123
82 error = gpio_request(button->gpio, button->desc ?: "gpio_keys"); 124 error = gpio_request(button->gpio, button->desc ?: "gpio_keys");
83 if (error < 0) { 125 if (error < 0) {
84 pr_err("gpio-keys: failed to request GPIO %d," 126 pr_err("gpio-keys: failed to request GPIO %d,"
85 " error %d\n", button->gpio, error); 127 " error %d\n", button->gpio, error);
86 goto fail; 128 goto fail2;
87 } 129 }
88 130
89 error = gpio_direction_input(button->gpio); 131 error = gpio_direction_input(button->gpio);
@@ -92,7 +134,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
92 " direction for GPIO %d, error %d\n", 134 " direction for GPIO %d, error %d\n",
93 button->gpio, error); 135 button->gpio, error);
94 gpio_free(button->gpio); 136 gpio_free(button->gpio);
95 goto fail; 137 goto fail2;
96 } 138 }
97 139
98 irq = gpio_to_irq(button->gpio); 140 irq = gpio_to_irq(button->gpio);
@@ -102,7 +144,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
102 " for GPIO %d, error %d\n", 144 " for GPIO %d, error %d\n",
103 button->gpio, error); 145 button->gpio, error);
104 gpio_free(button->gpio); 146 gpio_free(button->gpio);
105 goto fail; 147 goto fail2;
106 } 148 }
107 149
108 error = request_irq(irq, gpio_keys_isr, 150 error = request_irq(irq, gpio_keys_isr,
@@ -114,7 +156,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
114 pr_err("gpio-keys: Unable to claim irq %d; error %d\n", 156 pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
115 irq, error); 157 irq, error);
116 gpio_free(button->gpio); 158 gpio_free(button->gpio);
117 goto fail; 159 goto fail2;
118 } 160 }
119 161
120 if (button->wakeup) 162 if (button->wakeup)
@@ -127,21 +169,25 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
127 if (error) { 169 if (error) {
128 pr_err("gpio-keys: Unable to register input device, " 170 pr_err("gpio-keys: Unable to register input device, "
129 "error: %d\n", error); 171 "error: %d\n", error);
130 goto fail; 172 goto fail2;
131 } 173 }
132 174
133 device_init_wakeup(&pdev->dev, wakeup); 175 device_init_wakeup(&pdev->dev, wakeup);
134 176
135 return 0; 177 return 0;
136 178
137 fail: 179 fail2:
138 while (--i >= 0) { 180 while (--i >= 0) {
139 free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev); 181 free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
182 if (pdata->buttons[i].debounce_interval)
183 del_timer_sync(&ddata->data[i].timer);
140 gpio_free(pdata->buttons[i].gpio); 184 gpio_free(pdata->buttons[i].gpio);
141 } 185 }
142 186
143 platform_set_drvdata(pdev, NULL); 187 platform_set_drvdata(pdev, NULL);
188 fail1:
144 input_free_device(input); 189 input_free_device(input);
190 kfree(ddata);
145 191
146 return error; 192 return error;
147} 193}
@@ -149,7 +195,8 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
149static int __devexit gpio_keys_remove(struct platform_device *pdev) 195static int __devexit gpio_keys_remove(struct platform_device *pdev)
150{ 196{
151 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; 197 struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
152 struct input_dev *input = platform_get_drvdata(pdev); 198 struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
199 struct input_dev *input = ddata->input;
153 int i; 200 int i;
154 201
155 device_init_wakeup(&pdev->dev, 0); 202 device_init_wakeup(&pdev->dev, 0);
@@ -157,6 +204,8 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
157 for (i = 0; i < pdata->nbuttons; i++) { 204 for (i = 0; i < pdata->nbuttons; i++) {
158 int irq = gpio_to_irq(pdata->buttons[i].gpio); 205 int irq = gpio_to_irq(pdata->buttons[i].gpio);
159 free_irq(irq, pdev); 206 free_irq(irq, pdev);
207 if (pdata->buttons[i].debounce_interval)
208 del_timer_sync(&ddata->data[i].timer);
160 gpio_free(pdata->buttons[i].gpio); 209 gpio_free(pdata->buttons[i].gpio);
161 } 210 }
162 211
diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c
index adbf29f0169d..71c1971abf80 100644
--- a/drivers/input/keyboard/hil_kbd.c
+++ b/drivers/input/keyboard/hil_kbd.c
@@ -37,6 +37,7 @@
37#include <linux/kernel.h> 37#include <linux/kernel.h>
38#include <linux/module.h> 38#include <linux/module.h>
39#include <linux/init.h> 39#include <linux/init.h>
40#include <linux/semaphore.h>
40#include <linux/slab.h> 41#include <linux/slab.h>
41#include <linux/pci_ids.h> 42#include <linux/pci_ids.h>
42 43
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c
index 32e2c2605d95..4730ef35c732 100644
--- a/drivers/input/keyboard/lkkbd.c
+++ b/drivers/input/keyboard/lkkbd.c
@@ -538,11 +538,11 @@ lkkbd_event (struct input_dev *dev, unsigned int type, unsigned int code,
538 switch (code) { 538 switch (code) {
539 case SND_CLICK: 539 case SND_CLICK:
540 if (value == 0) { 540 if (value == 0) {
541 DBG ("%s: Deactivating key clicks\n", __FUNCTION__); 541 DBG ("%s: Deactivating key clicks\n", __func__);
542 lk->serio->write (lk->serio, LK_CMD_DISABLE_KEYCLICK); 542 lk->serio->write (lk->serio, LK_CMD_DISABLE_KEYCLICK);
543 lk->serio->write (lk->serio, LK_CMD_DISABLE_CTRCLICK); 543 lk->serio->write (lk->serio, LK_CMD_DISABLE_CTRCLICK);
544 } else { 544 } else {
545 DBG ("%s: Activating key clicks\n", __FUNCTION__); 545 DBG ("%s: Activating key clicks\n", __func__);
546 lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); 546 lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK);
547 lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); 547 lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume));
548 lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); 548 lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK);
@@ -560,7 +560,7 @@ lkkbd_event (struct input_dev *dev, unsigned int type, unsigned int code,
560 560
561 default: 561 default:
562 printk (KERN_ERR "%s (): Got unknown type %d, code %d, value %d\n", 562 printk (KERN_ERR "%s (): Got unknown type %d, code %d, value %d\n",
563 __FUNCTION__, type, code, value); 563 __func__, type, code, value);
564 } 564 }
565 565
566 return -1; 566 return -1;
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c
index 45767e73f071..6f1516f50750 100644
--- a/drivers/input/keyboard/pxa27x_keypad.c
+++ b/drivers/input/keyboard/pxa27x_keypad.c
@@ -105,6 +105,8 @@ struct pxa27x_keypad {
105 struct input_dev *input_dev; 105 struct input_dev *input_dev;
106 void __iomem *mmio_base; 106 void __iomem *mmio_base;
107 107
108 int irq;
109
108 /* matrix key code map */ 110 /* matrix key code map */
109 unsigned int matrix_keycodes[MAX_MATRIX_KEY_NUM]; 111 unsigned int matrix_keycodes[MAX_MATRIX_KEY_NUM];
110 112
@@ -392,6 +394,10 @@ static int pxa27x_keypad_suspend(struct platform_device *pdev, pm_message_t stat
392 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); 394 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
393 395
394 clk_disable(keypad->clk); 396 clk_disable(keypad->clk);
397
398 if (device_may_wakeup(&pdev->dev))
399 enable_irq_wake(keypad->irq);
400
395 return 0; 401 return 0;
396} 402}
397 403
@@ -400,6 +406,9 @@ static int pxa27x_keypad_resume(struct platform_device *pdev)
400 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); 406 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
401 struct input_dev *input_dev = keypad->input_dev; 407 struct input_dev *input_dev = keypad->input_dev;
402 408
409 if (device_may_wakeup(&pdev->dev))
410 disable_irq_wake(keypad->irq);
411
403 mutex_lock(&input_dev->mutex); 412 mutex_lock(&input_dev->mutex);
404 413
405 if (input_dev->users) { 414 if (input_dev->users) {
@@ -509,6 +518,8 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev)
509 goto failed_free_dev; 518 goto failed_free_dev;
510 } 519 }
511 520
521 keypad->irq = irq;
522
512 /* Register the input device */ 523 /* Register the input device */
513 error = input_register_device(input_dev); 524 error = input_register_device(input_dev);
514 if (error) { 525 if (error) {
@@ -516,6 +527,8 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev)
516 goto failed_free_irq; 527 goto failed_free_irq;
517 } 528 }
518 529
530 device_init_wakeup(&pdev->dev, 1);
531
519 return 0; 532 return 0;
520 533
521failed_free_irq: 534failed_free_irq:
@@ -539,7 +552,7 @@ static int __devexit pxa27x_keypad_remove(struct platform_device *pdev)
539 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); 552 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
540 struct resource *res; 553 struct resource *res;
541 554
542 free_irq(platform_get_irq(pdev, 0), pdev); 555 free_irq(keypad->irq, pdev);
543 556
544 clk_disable(keypad->clk); 557 clk_disable(keypad->clk);
545 clk_put(keypad->clk); 558 clk_put(keypad->clk);
diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c
index be0f5d19d023..9fce6d1e29b2 100644
--- a/drivers/input/keyboard/sunkbd.c
+++ b/drivers/input/keyboard/sunkbd.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: sunkbd.c,v 1.14 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/keyboard/tosakbd.c b/drivers/input/keyboard/tosakbd.c
index 94e444b4ee15..b12b7ee4b6aa 100644
--- a/drivers/input/keyboard/tosakbd.c
+++ b/drivers/input/keyboard/tosakbd.c
@@ -215,8 +215,6 @@ static int tosakbd_suspend(struct platform_device *dev, pm_message_t state)
215 unsigned long flags; 215 unsigned long flags;
216 216
217 spin_lock_irqsave(&tosakbd->lock, flags); 217 spin_lock_irqsave(&tosakbd->lock, flags);
218 PGSR1 = (PGSR1 & ~TOSA_GPIO_LOW_STROBE_BIT);
219 PGSR2 = (PGSR2 & ~TOSA_GPIO_HIGH_STROBE_BIT);
220 tosakbd->suspended = 1; 218 tosakbd->suspended = 1;
221 spin_unlock_irqrestore(&tosakbd->lock, flags); 219 spin_unlock_irqrestore(&tosakbd->lock, flags);
222 220
diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c
index 152a2c070508..37b01d777a4a 100644
--- a/drivers/input/keyboard/xtkbd.c
+++ b/drivers/input/keyboard/xtkbd.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: xtkbd.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 432699d61c58..e99b7882f382 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -189,6 +189,16 @@ config INPUT_UINPUT
189 To compile this driver as a module, choose M here: the 189 To compile this driver as a module, choose M here: the
190 module will be called uinput. 190 module will be called uinput.
191 191
192config INPUT_SGI_BTNS
193 tristate "SGI Indy/O2 volume button interface"
194 depends on SGI_IP22 || SGI_IP32
195 select INPUT_POLLDEV
196 help
197 Say Y here if you want to support SGI Indy/O2 volume button interface.
198
199 To compile this driver as a module, choose M here: the
200 module will be called sgi_btns.
201
192config HP_SDC_RTC 202config HP_SDC_RTC
193 tristate "HP SDC Real Time Clock" 203 tristate "HP SDC Real Time Clock"
194 depends on GSC || HP300 204 depends on GSC || HP300
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index ebd39f291d25..f48009b52226 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -19,3 +19,4 @@ obj-$(CONFIG_INPUT_YEALINK) += yealink.o
19obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o 19obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
20obj-$(CONFIG_INPUT_UINPUT) += uinput.o 20obj-$(CONFIG_INPUT_UINPUT) += uinput.o
21obj-$(CONFIG_INPUT_APANEL) += apanel.o 21obj-$(CONFIG_INPUT_APANEL) += apanel.o
22obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o
diff --git a/drivers/input/misc/ati_remote.c b/drivers/input/misc/ati_remote.c
index f3b86c2b0797..debfc1af9d95 100644
--- a/drivers/input/misc/ati_remote.c
+++ b/drivers/input/misc/ati_remote.c
@@ -330,7 +330,7 @@ static int ati_remote_open(struct input_dev *inputdev)
330 ati_remote->irq_urb->dev = ati_remote->udev; 330 ati_remote->irq_urb->dev = ati_remote->udev;
331 if (usb_submit_urb(ati_remote->irq_urb, GFP_KERNEL)) { 331 if (usb_submit_urb(ati_remote->irq_urb, GFP_KERNEL)) {
332 dev_err(&ati_remote->interface->dev, 332 dev_err(&ati_remote->interface->dev,
333 "%s: usb_submit_urb failed!\n", __FUNCTION__); 333 "%s: usb_submit_urb failed!\n", __func__);
334 return -EIO; 334 return -EIO;
335 } 335 }
336 336
@@ -356,7 +356,7 @@ static void ati_remote_irq_out(struct urb *urb)
356 356
357 if (urb->status) { 357 if (urb->status) {
358 dev_dbg(&ati_remote->interface->dev, "%s: status %d\n", 358 dev_dbg(&ati_remote->interface->dev, "%s: status %d\n",
359 __FUNCTION__, urb->status); 359 __func__, urb->status);
360 return; 360 return;
361 } 361 }
362 362
@@ -601,17 +601,17 @@ static void ati_remote_irq_in(struct urb *urb)
601 case -ENOENT: 601 case -ENOENT:
602 case -ESHUTDOWN: 602 case -ESHUTDOWN:
603 dev_dbg(&ati_remote->interface->dev, "%s: urb error status, unlink? \n", 603 dev_dbg(&ati_remote->interface->dev, "%s: urb error status, unlink? \n",
604 __FUNCTION__); 604 __func__);
605 return; 605 return;
606 default: /* error */ 606 default: /* error */
607 dev_dbg(&ati_remote->interface->dev, "%s: Nonzero urb status %d\n", 607 dev_dbg(&ati_remote->interface->dev, "%s: Nonzero urb status %d\n",
608 __FUNCTION__, urb->status); 608 __func__, urb->status);
609 } 609 }
610 610
611 retval = usb_submit_urb(urb, GFP_ATOMIC); 611 retval = usb_submit_urb(urb, GFP_ATOMIC);
612 if (retval) 612 if (retval)
613 dev_err(&ati_remote->interface->dev, "%s: usb_submit_urb()=%d\n", 613 dev_err(&ati_remote->interface->dev, "%s: usb_submit_urb()=%d\n",
614 __FUNCTION__, retval); 614 __func__, retval);
615} 615}
616 616
617/* 617/*
@@ -734,7 +734,7 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de
734 int err = -ENOMEM; 734 int err = -ENOMEM;
735 735
736 if (iface_host->desc.bNumEndpoints != 2) { 736 if (iface_host->desc.bNumEndpoints != 2) {
737 err("%s: Unexpected desc.bNumEndpoints\n", __FUNCTION__); 737 err("%s: Unexpected desc.bNumEndpoints\n", __func__);
738 return -ENODEV; 738 return -ENODEV;
739 } 739 }
740 740
@@ -742,11 +742,11 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de
742 endpoint_out = &iface_host->endpoint[1].desc; 742 endpoint_out = &iface_host->endpoint[1].desc;
743 743
744 if (!usb_endpoint_is_int_in(endpoint_in)) { 744 if (!usb_endpoint_is_int_in(endpoint_in)) {
745 err("%s: Unexpected endpoint_in\n", __FUNCTION__); 745 err("%s: Unexpected endpoint_in\n", __func__);
746 return -ENODEV; 746 return -ENODEV;
747 } 747 }
748 if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) { 748 if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) {
749 err("%s: endpoint_in message size==0? \n", __FUNCTION__); 749 err("%s: endpoint_in message size==0? \n", __func__);
750 return -ENODEV; 750 return -ENODEV;
751 } 751 }
752 752
@@ -814,7 +814,7 @@ static void ati_remote_disconnect(struct usb_interface *interface)
814 ati_remote = usb_get_intfdata(interface); 814 ati_remote = usb_get_intfdata(interface);
815 usb_set_intfdata(interface, NULL); 815 usb_set_intfdata(interface, NULL);
816 if (!ati_remote) { 816 if (!ati_remote) {
817 warn("%s - null device?\n", __FUNCTION__); 817 warn("%s - null device?\n", __func__);
818 return; 818 return;
819 } 819 }
820 820
diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c
index f2709b82485c..a7fabafbd94c 100644
--- a/drivers/input/misc/ati_remote2.c
+++ b/drivers/input/misc/ati_remote2.c
@@ -137,14 +137,14 @@ static int ati_remote2_open(struct input_dev *idev)
137 r = usb_submit_urb(ar2->urb[0], GFP_KERNEL); 137 r = usb_submit_urb(ar2->urb[0], GFP_KERNEL);
138 if (r) { 138 if (r) {
139 dev_err(&ar2->intf[0]->dev, 139 dev_err(&ar2->intf[0]->dev,
140 "%s: usb_submit_urb() = %d\n", __FUNCTION__, r); 140 "%s: usb_submit_urb() = %d\n", __func__, r);
141 return r; 141 return r;
142 } 142 }
143 r = usb_submit_urb(ar2->urb[1], GFP_KERNEL); 143 r = usb_submit_urb(ar2->urb[1], GFP_KERNEL);
144 if (r) { 144 if (r) {
145 usb_kill_urb(ar2->urb[0]); 145 usb_kill_urb(ar2->urb[0]);
146 dev_err(&ar2->intf[1]->dev, 146 dev_err(&ar2->intf[1]->dev,
147 "%s: usb_submit_urb() = %d\n", __FUNCTION__, r); 147 "%s: usb_submit_urb() = %d\n", __func__, r);
148 return r; 148 return r;
149 } 149 }
150 150
@@ -294,17 +294,17 @@ static void ati_remote2_complete_mouse(struct urb *urb)
294 case -ECONNRESET: 294 case -ECONNRESET:
295 case -ESHUTDOWN: 295 case -ESHUTDOWN:
296 dev_dbg(&ar2->intf[0]->dev, 296 dev_dbg(&ar2->intf[0]->dev,
297 "%s(): urb status = %d\n", __FUNCTION__, urb->status); 297 "%s(): urb status = %d\n", __func__, urb->status);
298 return; 298 return;
299 default: 299 default:
300 dev_err(&ar2->intf[0]->dev, 300 dev_err(&ar2->intf[0]->dev,
301 "%s(): urb status = %d\n", __FUNCTION__, urb->status); 301 "%s(): urb status = %d\n", __func__, urb->status);
302 } 302 }
303 303
304 r = usb_submit_urb(urb, GFP_ATOMIC); 304 r = usb_submit_urb(urb, GFP_ATOMIC);
305 if (r) 305 if (r)
306 dev_err(&ar2->intf[0]->dev, 306 dev_err(&ar2->intf[0]->dev,
307 "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r); 307 "%s(): usb_submit_urb() = %d\n", __func__, r);
308} 308}
309 309
310static void ati_remote2_complete_key(struct urb *urb) 310static void ati_remote2_complete_key(struct urb *urb)
@@ -321,17 +321,17 @@ static void ati_remote2_complete_key(struct urb *urb)
321 case -ECONNRESET: 321 case -ECONNRESET:
322 case -ESHUTDOWN: 322 case -ESHUTDOWN:
323 dev_dbg(&ar2->intf[1]->dev, 323 dev_dbg(&ar2->intf[1]->dev,
324 "%s(): urb status = %d\n", __FUNCTION__, urb->status); 324 "%s(): urb status = %d\n", __func__, urb->status);
325 return; 325 return;
326 default: 326 default:
327 dev_err(&ar2->intf[1]->dev, 327 dev_err(&ar2->intf[1]->dev,
328 "%s(): urb status = %d\n", __FUNCTION__, urb->status); 328 "%s(): urb status = %d\n", __func__, urb->status);
329 } 329 }
330 330
331 r = usb_submit_urb(urb, GFP_ATOMIC); 331 r = usb_submit_urb(urb, GFP_ATOMIC);
332 if (r) 332 if (r)
333 dev_err(&ar2->intf[1]->dev, 333 dev_err(&ar2->intf[1]->dev,
334 "%s(): usb_submit_urb() = %d\n", __FUNCTION__, r); 334 "%s(): usb_submit_urb() = %d\n", __func__, r);
335} 335}
336 336
337static int ati_remote2_input_init(struct ati_remote2 *ar2) 337static int ati_remote2_input_init(struct ati_remote2 *ar2)
@@ -438,7 +438,7 @@ static int ati_remote2_setup(struct ati_remote2 *ar2)
438 channel, 0x0, NULL, 0, USB_CTRL_SET_TIMEOUT); 438 channel, 0x0, NULL, 0, USB_CTRL_SET_TIMEOUT);
439 if (r) { 439 if (r) {
440 dev_err(&ar2->udev->dev, "%s - failed to set channel due to error: %d\n", 440 dev_err(&ar2->udev->dev, "%s - failed to set channel due to error: %d\n",
441 __FUNCTION__, r); 441 __func__, r);
442 return r; 442 return r;
443 } 443 }
444 444
diff --git a/drivers/input/misc/hp_sdc_rtc.c b/drivers/input/misc/hp_sdc_rtc.c
index 49d8abfe38fe..daa9d4220331 100644
--- a/drivers/input/misc/hp_sdc_rtc.c
+++ b/drivers/input/misc/hp_sdc_rtc.c
@@ -44,6 +44,7 @@
44#include <linux/proc_fs.h> 44#include <linux/proc_fs.h>
45#include <linux/poll.h> 45#include <linux/poll.h>
46#include <linux/rtc.h> 46#include <linux/rtc.h>
47#include <linux/semaphore.h>
47 48
48MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>"); 49MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
49MODULE_DESCRIPTION("HP i8042 SDC + MSM-58321 RTC Driver"); 50MODULE_DESCRIPTION("HP i8042 SDC + MSM-58321 RTC Driver");
diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c
index 952938a8e991..86afdd1fdf9d 100644
--- a/drivers/input/misc/keyspan_remote.c
+++ b/drivers/input/misc/keyspan_remote.c
@@ -159,7 +159,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
159 if (dev->data.pos >= dev->data.len) { 159 if (dev->data.pos >= dev->data.len) {
160 dev_dbg(&dev->udev->dev, 160 dev_dbg(&dev->udev->dev,
161 "%s - Error ran out of data. pos: %d, len: %d\n", 161 "%s - Error ran out of data. pos: %d, len: %d\n",
162 __FUNCTION__, dev->data.pos, dev->data.len); 162 __func__, dev->data.pos, dev->data.len);
163 return -1; 163 return -1;
164 } 164 }
165 165
@@ -267,7 +267,7 @@ static void keyspan_check_data(struct usb_keyspan *remote)
267 remote->data.tester = remote->data.tester >> 6; 267 remote->data.tester = remote->data.tester >> 6;
268 remote->data.bits_left -= 6; 268 remote->data.bits_left -= 6;
269 } else { 269 } else {
270 err("%s - Unknown sequence found in system data.\n", __FUNCTION__); 270 err("%s - Unknown sequence found in system data.\n", __func__);
271 remote->stage = 0; 271 remote->stage = 0;
272 return; 272 return;
273 } 273 }
@@ -286,7 +286,7 @@ static void keyspan_check_data(struct usb_keyspan *remote)
286 remote->data.tester = remote->data.tester >> 6; 286 remote->data.tester = remote->data.tester >> 6;
287 remote->data.bits_left -= 6; 287 remote->data.bits_left -= 6;
288 } else { 288 } else {
289 err("%s - Unknown sequence found in button data.\n", __FUNCTION__); 289 err("%s - Unknown sequence found in button data.\n", __func__);
290 remote->stage = 0; 290 remote->stage = 0;
291 return; 291 return;
292 } 292 }
@@ -302,7 +302,7 @@ static void keyspan_check_data(struct usb_keyspan *remote)
302 remote->data.tester = remote->data.tester >> 6; 302 remote->data.tester = remote->data.tester >> 6;
303 remote->data.bits_left -= 6; 303 remote->data.bits_left -= 6;
304 } else { 304 } else {
305 err("%s - Error in message, invalid toggle.\n", __FUNCTION__); 305 err("%s - Error in message, invalid toggle.\n", __func__);
306 remote->stage = 0; 306 remote->stage = 0;
307 return; 307 return;
308 } 308 }
@@ -317,7 +317,7 @@ static void keyspan_check_data(struct usb_keyspan *remote)
317 317
318 dev_dbg(&remote->udev->dev, 318 dev_dbg(&remote->udev->dev,
319 "%s found valid message: system: %d, button: %d, toggle: %d\n", 319 "%s found valid message: system: %d, button: %d, toggle: %d\n",
320 __FUNCTION__, message.system, message.button, message.toggle); 320 __func__, message.system, message.button, message.toggle);
321 321
322 if (message.toggle != remote->toggle) { 322 if (message.toggle != remote->toggle) {
323 keyspan_report_button(remote, message.button, 1); 323 keyspan_report_button(remote, message.button, 1);
@@ -341,7 +341,7 @@ static int keyspan_setup(struct usb_device* dev)
341 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); 341 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0);
342 if (retval) { 342 if (retval) {
343 dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", 343 dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n",
344 __FUNCTION__, retval); 344 __func__, retval);
345 return(retval); 345 return(retval);
346 } 346 }
347 347
@@ -349,7 +349,7 @@ static int keyspan_setup(struct usb_device* dev)
349 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); 349 0x44, 0x40, 0x0, 0x0, NULL, 0, 0);
350 if (retval) { 350 if (retval) {
351 dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", 351 dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n",
352 __FUNCTION__, retval); 352 __func__, retval);
353 return(retval); 353 return(retval);
354 } 354 }
355 355
@@ -357,11 +357,11 @@ static int keyspan_setup(struct usb_device* dev)
357 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); 357 0x22, 0x40, 0x0, 0x0, NULL, 0, 0);
358 if (retval) { 358 if (retval) {
359 dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", 359 dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n",
360 __FUNCTION__, retval); 360 __func__, retval);
361 return(retval); 361 return(retval);
362 } 362 }
363 363
364 dev_dbg(&dev->dev, "%s - Setup complete.\n", __FUNCTION__); 364 dev_dbg(&dev->dev, "%s - Setup complete.\n", __func__);
365 return(retval); 365 return(retval);
366} 366}
367 367
@@ -397,7 +397,7 @@ static void keyspan_irq_recv(struct urb *urb)
397resubmit: 397resubmit:
398 retval = usb_submit_urb(urb, GFP_ATOMIC); 398 retval = usb_submit_urb(urb, GFP_ATOMIC);
399 if (retval) 399 if (retval)
400 err ("%s - usb_submit_urb failed with result: %d", __FUNCTION__, retval); 400 err ("%s - usb_submit_urb failed with result: %d", __func__, retval);
401} 401}
402 402
403static int keyspan_open(struct input_dev *dev) 403static int keyspan_open(struct input_dev *dev)
diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c
index 7a7b8c7b9633..a53c4885fbad 100644
--- a/drivers/input/misc/powermate.c
+++ b/drivers/input/misc/powermate.c
@@ -96,10 +96,10 @@ static void powermate_irq(struct urb *urb)
96 case -ENOENT: 96 case -ENOENT:
97 case -ESHUTDOWN: 97 case -ESHUTDOWN:
98 /* this urb is terminated, clean up */ 98 /* this urb is terminated, clean up */
99 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 99 dbg("%s - urb shutting down with status: %d", __func__, urb->status);
100 return; 100 return;
101 default: 101 default:
102 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); 102 dbg("%s - nonzero urb status received: %d", __func__, urb->status);
103 goto exit; 103 goto exit;
104 } 104 }
105 105
@@ -112,7 +112,7 @@ exit:
112 retval = usb_submit_urb (urb, GFP_ATOMIC); 112 retval = usb_submit_urb (urb, GFP_ATOMIC);
113 if (retval) 113 if (retval)
114 err ("%s - usb_submit_urb failed with result %d", 114 err ("%s - usb_submit_urb failed with result %d",
115 __FUNCTION__, retval); 115 __func__, retval);
116} 116}
117 117
118/* Decide if we need to issue a control message and do so. Must be called with pm->lock taken */ 118/* Decide if we need to issue a control message and do so. Must be called with pm->lock taken */
diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c
new file mode 100644
index 000000000000..ce238f59b3c8
--- /dev/null
+++ b/drivers/input/misc/sgi_btns.c
@@ -0,0 +1,178 @@
1/*
2 * SGI Volume Button interface driver
3 *
4 * Copyright (C) 2008 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20#include <linux/init.h>
21#include <linux/input-polldev.h>
22#include <linux/ioport.h>
23#include <linux/module.h>
24#include <linux/platform_device.h>
25
26#ifdef CONFIG_SGI_IP22
27#include <asm/sgi/ioc.h>
28
29static inline u8 button_status(void)
30{
31 u8 status;
32
33 status = readb(&sgioc->panel) ^ 0xa0;
34 return ((status & 0x80) >> 6) | ((status & 0x20) >> 5);
35}
36#endif
37
38#ifdef CONFIG_SGI_IP32
39#include <asm/ip32/mace.h>
40
41static inline u8 button_status(void)
42{
43 u64 status;
44
45 status = readq(&mace->perif.audio.control);
46 writeq(status & ~(3U << 23), &mace->perif.audio.control);
47
48 return (status >> 23) & 3;
49}
50#endif
51
52#define BUTTONS_POLL_INTERVAL 30 /* msec */
53#define BUTTONS_COUNT_THRESHOLD 3
54
55static const unsigned short sgi_map[] = {
56 KEY_VOLUMEDOWN,
57 KEY_VOLUMEUP
58};
59
60struct buttons_dev {
61 struct input_polled_dev *poll_dev;
62 unsigned short keymap[ARRAY_SIZE(sgi_map)];
63 int count[ARRAY_SIZE(sgi_map)];
64};
65
66static void handle_buttons(struct input_polled_dev *dev)
67{
68 struct buttons_dev *bdev = dev->private;
69 struct input_dev *input = dev->input;
70 u8 status;
71 int i;
72
73 status = button_status();
74
75 for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) {
76 if (status & (1U << i)) {
77 if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) {
78 input_event(input, EV_MSC, MSC_SCAN, i);
79 input_report_key(input, bdev->keymap[i], 1);
80 input_sync(input);
81 }
82 } else {
83 if (bdev->count[i] >= BUTTONS_COUNT_THRESHOLD) {
84 input_event(input, EV_MSC, MSC_SCAN, i);
85 input_report_key(input, bdev->keymap[i], 0);
86 input_sync(input);
87 }
88 bdev->count[i] = 0;
89 }
90 }
91}
92
93static int __devinit sgi_buttons_probe(struct platform_device *pdev)
94{
95 struct buttons_dev *bdev;
96 struct input_polled_dev *poll_dev;
97 struct input_dev *input;
98 int error, i;
99
100 bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL);
101 poll_dev = input_allocate_polled_device();
102 if (!bdev || !poll_dev) {
103 error = -ENOMEM;
104 goto err_free_mem;
105 }
106
107 memcpy(bdev->keymap, sgi_map, sizeof(bdev->keymap));
108
109 poll_dev->private = bdev;
110 poll_dev->poll = handle_buttons;
111 poll_dev->poll_interval = BUTTONS_POLL_INTERVAL;
112
113 input = poll_dev->input;
114 input->name = "SGI buttons";
115 input->phys = "sgi/input0";
116 input->id.bustype = BUS_HOST;
117 input->dev.parent = &pdev->dev;
118
119 input->keycode = bdev->keymap;
120 input->keycodemax = ARRAY_SIZE(bdev->keymap);
121 input->keycodesize = sizeof(unsigned short);
122
123 input_set_capability(input, EV_MSC, MSC_SCAN);
124 __set_bit(EV_KEY, input->evbit);
125 for (i = 0; i < ARRAY_SIZE(sgi_map); i++)
126 __set_bit(bdev->keymap[i], input->keybit);
127 __clear_bit(KEY_RESERVED, input->keybit);
128
129 bdev->poll_dev = poll_dev;
130 dev_set_drvdata(&pdev->dev, bdev);
131
132 error = input_register_polled_device(poll_dev);
133 if (error)
134 goto err_free_mem;
135
136 return 0;
137
138 err_free_mem:
139 input_free_polled_device(poll_dev);
140 kfree(bdev);
141 dev_set_drvdata(&pdev->dev, NULL);
142 return error;
143}
144
145static int __devexit sgi_buttons_remove(struct platform_device *pdev)
146{
147 struct device *dev = &pdev->dev;
148 struct buttons_dev *bdev = dev_get_drvdata(dev);
149
150 input_unregister_polled_device(bdev->poll_dev);
151 input_free_polled_device(bdev->poll_dev);
152 kfree(bdev);
153 dev_set_drvdata(dev, NULL);
154
155 return 0;
156}
157
158static struct platform_driver sgi_buttons_driver = {
159 .probe = sgi_buttons_probe,
160 .remove = __devexit_p(sgi_buttons_remove),
161 .driver = {
162 .name = "sgibtns",
163 .owner = THIS_MODULE,
164 },
165};
166
167static int __init sgi_buttons_init(void)
168{
169 return platform_driver_register(&sgi_buttons_driver);
170}
171
172static void __exit sgi_buttons_exit(void)
173{
174 platform_driver_unregister(&sgi_buttons_driver);
175}
176
177module_init(sgi_buttons_init);
178module_exit(sgi_buttons_exit);
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c
index 72176f3d49cb..fe268be3293b 100644
--- a/drivers/input/misc/wistron_btns.c
+++ b/drivers/input/misc/wistron_btns.c
@@ -1186,7 +1186,7 @@ static int wistron_setkeycode(struct input_dev *dev, int scancode, int keycode)
1186 1186
1187static int __devinit setup_input_dev(void) 1187static int __devinit setup_input_dev(void)
1188{ 1188{
1189 const struct key_entry *key; 1189 struct key_entry *key;
1190 struct input_dev *input_dev; 1190 struct input_dev *input_dev;
1191 int error; 1191 int error;
1192 1192
@@ -1219,6 +1219,23 @@ static int __devinit setup_input_dev(void)
1219 set_bit(key->sw.code, input_dev->swbit); 1219 set_bit(key->sw.code, input_dev->swbit);
1220 break; 1220 break;
1221 1221
1222 /* if wifi or bluetooth are not available, create normal keys */
1223 case KE_WIFI:
1224 if (!have_wifi) {
1225 key->type = KE_KEY;
1226 key->keycode = KEY_WLAN;
1227 key--;
1228 }
1229 break;
1230
1231 case KE_BLUETOOTH:
1232 if (!have_bluetooth) {
1233 key->type = KE_KEY;
1234 key->keycode = KEY_BLUETOOTH;
1235 key--;
1236 }
1237 break;
1238
1222 default: 1239 default:
1223 break; 1240 break;
1224 } 1241 }
diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c
index 46279ef2b649..facefd3dba29 100644
--- a/drivers/input/misc/yealink.c
+++ b/drivers/input/misc/yealink.c
@@ -119,6 +119,8 @@ struct yealink_dev {
119 u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */ 119 u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */
120 int key_code; /* last reported key */ 120 int key_code; /* last reported key */
121 121
122 unsigned int shutdown:1;
123
122 int stat_ix; 124 int stat_ix;
123 union { 125 union {
124 struct yld_status s; 126 struct yld_status s;
@@ -424,10 +426,10 @@ send_update:
424static void urb_irq_callback(struct urb *urb) 426static void urb_irq_callback(struct urb *urb)
425{ 427{
426 struct yealink_dev *yld = urb->context; 428 struct yealink_dev *yld = urb->context;
427 int ret; 429 int ret, status = urb->status;
428 430
429 if (urb->status) 431 if (status)
430 err("%s - urb status %d", __FUNCTION__, urb->status); 432 err("%s - urb status %d", __func__, status);
431 433
432 switch (yld->irq_data->cmd) { 434 switch (yld->irq_data->cmd) {
433 case CMD_KEYPRESS: 435 case CMD_KEYPRESS:
@@ -447,33 +449,38 @@ static void urb_irq_callback(struct urb *urb)
447 449
448 yealink_do_idle_tasks(yld); 450 yealink_do_idle_tasks(yld);
449 451
450 ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); 452 if (!yld->shutdown) {
451 if (ret) 453 ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC);
452 err("%s - usb_submit_urb failed %d", __FUNCTION__, ret); 454 if (ret && ret != -EPERM)
455 err("%s - usb_submit_urb failed %d", __func__, ret);
456 }
453} 457}
454 458
455static void urb_ctl_callback(struct urb *urb) 459static void urb_ctl_callback(struct urb *urb)
456{ 460{
457 struct yealink_dev *yld = urb->context; 461 struct yealink_dev *yld = urb->context;
458 int ret; 462 int ret = 0, status = urb->status;
459 463
460 if (urb->status) 464 if (status)
461 err("%s - urb status %d", __FUNCTION__, urb->status); 465 err("%s - urb status %d", __func__, status);
462 466
463 switch (yld->ctl_data->cmd) { 467 switch (yld->ctl_data->cmd) {
464 case CMD_KEYPRESS: 468 case CMD_KEYPRESS:
465 case CMD_SCANCODE: 469 case CMD_SCANCODE:
466 /* ask for a response */ 470 /* ask for a response */
467 ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC); 471 if (!yld->shutdown)
472 ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC);
468 break; 473 break;
469 default: 474 default:
470 /* send new command */ 475 /* send new command */
471 yealink_do_idle_tasks(yld); 476 yealink_do_idle_tasks(yld);
472 ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); 477 if (!yld->shutdown)
478 ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC);
479 break;
473 } 480 }
474 481
475 if (ret) 482 if (ret && ret != -EPERM)
476 err("%s - usb_submit_urb failed %d", __FUNCTION__, ret); 483 err("%s - usb_submit_urb failed %d", __func__, ret);
477} 484}
478 485
479/******************************************************************************* 486/*******************************************************************************
@@ -505,7 +512,7 @@ static int input_open(struct input_dev *dev)
505 struct yealink_dev *yld = input_get_drvdata(dev); 512 struct yealink_dev *yld = input_get_drvdata(dev);
506 int i, ret; 513 int i, ret;
507 514
508 dbg("%s", __FUNCTION__); 515 dbg("%s", __func__);
509 516
510 /* force updates to device */ 517 /* force updates to device */
511 for (i = 0; i<sizeof(yld->master); i++) 518 for (i = 0; i<sizeof(yld->master); i++)
@@ -521,7 +528,7 @@ static int input_open(struct input_dev *dev)
521 yld->ctl_data->sum = 0x100-CMD_INIT-10; 528 yld->ctl_data->sum = 0x100-CMD_INIT-10;
522 if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) { 529 if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) {
523 dbg("%s - usb_submit_urb failed with result %d", 530 dbg("%s - usb_submit_urb failed with result %d",
524 __FUNCTION__, ret); 531 __func__, ret);
525 return ret; 532 return ret;
526 } 533 }
527 return 0; 534 return 0;
@@ -531,8 +538,18 @@ static void input_close(struct input_dev *dev)
531{ 538{
532 struct yealink_dev *yld = input_get_drvdata(dev); 539 struct yealink_dev *yld = input_get_drvdata(dev);
533 540
541 yld->shutdown = 1;
542 /*
543 * Make sure the flag is seen by other CPUs before we start
544 * killing URBs so new URBs won't be submitted
545 */
546 smp_wmb();
547
534 usb_kill_urb(yld->urb_ctl); 548 usb_kill_urb(yld->urb_ctl);
535 usb_kill_urb(yld->urb_irq); 549 usb_kill_urb(yld->urb_irq);
550
551 yld->shutdown = 0;
552 smp_wmb();
536} 553}
537 554
538/******************************************************************************* 555/*******************************************************************************
@@ -809,9 +826,6 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
809 if (yld == NULL) 826 if (yld == NULL)
810 return err; 827 return err;
811 828
812 usb_kill_urb(yld->urb_irq); /* parameter validation in core/urb */
813 usb_kill_urb(yld->urb_ctl); /* parameter validation in core/urb */
814
815 if (yld->idev) { 829 if (yld->idev) {
816 if (err) 830 if (err)
817 input_free_device(yld->idev); 831 input_free_device(yld->idev);
diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c
index ce6fdec19e14..1f41ae94f26b 100644
--- a/drivers/input/mouse/appletouch.c
+++ b/drivers/input/mouse/appletouch.c
@@ -2,12 +2,13 @@
2 * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver 2 * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver
3 * 3 *
4 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) 4 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) 5 * Copyright (C) 2005-2008 Johannes Berg (johannes@sipsolutions.net)
6 * Copyright (C) 2005 Stelian Pop (stelian@popies.net) 6 * Copyright (C) 2005 Stelian Pop (stelian@popies.net)
7 * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) 7 * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de)
8 * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) 8 * Copyright (C) 2005 Peter Osterlund (petero2@telia.com)
9 * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) 9 * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch)
10 * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) 10 * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch)
11 * Copyright (C) 2007-2008 Sven Anders (anders@anduras.de)
11 * 12 *
12 * Thanks to Alex Harper <basilisk@foobox.net> for his inputs. 13 * Thanks to Alex Harper <basilisk@foobox.net> for his inputs.
13 * 14 *
@@ -34,77 +35,64 @@
34#include <linux/module.h> 35#include <linux/module.h>
35#include <linux/usb/input.h> 36#include <linux/usb/input.h>
36 37
37/* Apple has powerbooks which have the keyboard with different Product IDs */ 38/* Type of touchpad */
38#define APPLE_VENDOR_ID 0x05AC 39enum atp_touchpad_type {
39 40 ATP_FOUNTAIN,
40/* These names come from Info.plist in AppleUSBTrackpad.kext */ 41 ATP_GEYSER1,
41#define FOUNTAIN_ANSI_PRODUCT_ID 0x020E 42 ATP_GEYSER2,
42#define FOUNTAIN_ISO_PRODUCT_ID 0x020F 43 ATP_GEYSER3,
43 44 ATP_GEYSER4
44#define FOUNTAIN_TP_ONLY_PRODUCT_ID 0x030A 45};
45
46#define GEYSER1_TP_ONLY_PRODUCT_ID 0x030B
47
48#define GEYSER_ANSI_PRODUCT_ID 0x0214
49#define GEYSER_ISO_PRODUCT_ID 0x0215
50#define GEYSER_JIS_PRODUCT_ID 0x0216
51
52/* MacBook devices */
53#define GEYSER3_ANSI_PRODUCT_ID 0x0217
54#define GEYSER3_ISO_PRODUCT_ID 0x0218
55#define GEYSER3_JIS_PRODUCT_ID 0x0219
56
57/*
58 * Geyser IV: same as Geyser III according to Info.plist in AppleUSBTrackpad.kext
59 * -> same IOClass (AppleUSBGrIIITrackpad), same acceleration tables
60 */
61#define GEYSER4_ANSI_PRODUCT_ID 0x021A
62#define GEYSER4_ISO_PRODUCT_ID 0x021B
63#define GEYSER4_JIS_PRODUCT_ID 0x021C
64
65#define GEYSER4_HF_ANSI_PRODUCT_ID 0x0229
66#define GEYSER4_HF_ISO_PRODUCT_ID 0x022A
67#define GEYSER4_HF_JIS_PRODUCT_ID 0x022B
68 46
69#define ATP_DEVICE(prod) \ 47#define ATP_DEVICE(prod, type) \
48{ \
70 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ 49 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
71 USB_DEVICE_ID_MATCH_INT_CLASS | \ 50 USB_DEVICE_ID_MATCH_INT_CLASS | \
72 USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ 51 USB_DEVICE_ID_MATCH_INT_PROTOCOL, \
73 .idVendor = APPLE_VENDOR_ID, \ 52 .idVendor = 0x05ac, /* Apple */ \
74 .idProduct = (prod), \ 53 .idProduct = (prod), \
75 .bInterfaceClass = 0x03, \ 54 .bInterfaceClass = 0x03, \
76 .bInterfaceProtocol = 0x02 55 .bInterfaceProtocol = 0x02, \
56 .driver_info = ATP_ ## type, \
57}
58
59/*
60 * Table of devices (Product IDs) that work with this driver.
61 * (The names come from Info.plist in AppleUSBTrackpad.kext,
62 * According to Info.plist Geyser IV is the same as Geyser III.)
63 */
77 64
78/* table of devices that work with this driver */
79static struct usb_device_id atp_table [] = { 65static struct usb_device_id atp_table [] = {
80 { ATP_DEVICE(FOUNTAIN_ANSI_PRODUCT_ID) }, 66 /* PowerBooks Feb 2005, iBooks G4 */
81 { ATP_DEVICE(FOUNTAIN_ISO_PRODUCT_ID) }, 67 ATP_DEVICE(0x020e, FOUNTAIN), /* FOUNTAIN ANSI */
82 { ATP_DEVICE(FOUNTAIN_TP_ONLY_PRODUCT_ID) }, 68 ATP_DEVICE(0x020f, FOUNTAIN), /* FOUNTAIN ISO */
83 { ATP_DEVICE(GEYSER1_TP_ONLY_PRODUCT_ID) }, 69 ATP_DEVICE(0x030a, FOUNTAIN), /* FOUNTAIN TP ONLY */
70 ATP_DEVICE(0x030b, GEYSER1), /* GEYSER 1 TP ONLY */
84 71
85 /* PowerBooks Oct 2005 */ 72 /* PowerBooks Oct 2005 */
86 { ATP_DEVICE(GEYSER_ANSI_PRODUCT_ID) }, 73 ATP_DEVICE(0x0214, GEYSER2), /* GEYSER 2 ANSI */
87 { ATP_DEVICE(GEYSER_ISO_PRODUCT_ID) }, 74 ATP_DEVICE(0x0215, GEYSER2), /* GEYSER 2 ISO */
88 { ATP_DEVICE(GEYSER_JIS_PRODUCT_ID) }, 75 ATP_DEVICE(0x0216, GEYSER2), /* GEYSER 2 JIS */
89 76
90 /* Core Duo MacBook & MacBook Pro */ 77 /* Core Duo MacBook & MacBook Pro */
91 { ATP_DEVICE(GEYSER3_ANSI_PRODUCT_ID) }, 78 ATP_DEVICE(0x0217, GEYSER3), /* GEYSER 3 ANSI */
92 { ATP_DEVICE(GEYSER3_ISO_PRODUCT_ID) }, 79 ATP_DEVICE(0x0218, GEYSER3), /* GEYSER 3 ISO */
93 { ATP_DEVICE(GEYSER3_JIS_PRODUCT_ID) }, 80 ATP_DEVICE(0x0219, GEYSER3), /* GEYSER 3 JIS */
94 81
95 /* Core2 Duo MacBook & MacBook Pro */ 82 /* Core2 Duo MacBook & MacBook Pro */
96 { ATP_DEVICE(GEYSER4_ANSI_PRODUCT_ID) }, 83 ATP_DEVICE(0x021a, GEYSER4), /* GEYSER 4 ANSI */
97 { ATP_DEVICE(GEYSER4_ISO_PRODUCT_ID) }, 84 ATP_DEVICE(0x021b, GEYSER4), /* GEYSER 4 ISO */
98 { ATP_DEVICE(GEYSER4_JIS_PRODUCT_ID) }, 85 ATP_DEVICE(0x021c, GEYSER4), /* GEYSER 4 JIS */
99 86
100 { ATP_DEVICE(GEYSER4_HF_ANSI_PRODUCT_ID) }, 87 /* Core2 Duo MacBook3,1 */
101 { ATP_DEVICE(GEYSER4_HF_ISO_PRODUCT_ID) }, 88 ATP_DEVICE(0x0229, GEYSER4), /* GEYSER 4 HF ANSI */
102 { ATP_DEVICE(GEYSER4_HF_JIS_PRODUCT_ID) }, 89 ATP_DEVICE(0x022a, GEYSER4), /* GEYSER 4 HF ISO */
90 ATP_DEVICE(0x022b, GEYSER4), /* GEYSER 4 HF JIS */
103 91
104 /* Terminating entry */ 92 /* Terminating entry */
105 { } 93 { }
106}; 94};
107MODULE_DEVICE_TABLE (usb, atp_table); 95MODULE_DEVICE_TABLE(usb, atp_table);
108 96
109/* 97/*
110 * number of sensors. Note that only 16 instead of 26 X (horizontal) 98 * number of sensors. Note that only 16 instead of 26 X (horizontal)
@@ -124,9 +112,13 @@ MODULE_DEVICE_TABLE (usb, atp_table);
124 * We try to keep the touchpad aspect ratio while still doing only simple 112 * We try to keep the touchpad aspect ratio while still doing only simple
125 * arithmetics. 113 * arithmetics.
126 * The factors below give coordinates like: 114 * The factors below give coordinates like:
127 * 0 <= x < 960 on 12" and 15" Powerbooks 115 *
128 * 0 <= x < 1600 on 17" Powerbooks 116 * 0 <= x < 960 on 12" and 15" Powerbooks
129 * 0 <= y < 646 117 * 0 <= x < 1600 on 17" Powerbooks and 17" MacBook Pro
118 * 0 <= x < 1216 on MacBooks and 15" MacBook Pro
119 *
120 * 0 <= y < 646 on all Powerbooks
121 * 0 <= y < 774 on all MacBooks
130 */ 122 */
131#define ATP_XFACT 64 123#define ATP_XFACT 64
132#define ATP_YFACT 43 124#define ATP_YFACT 43
@@ -147,43 +139,46 @@ MODULE_DEVICE_TABLE (usb, atp_table);
147/* Structure to hold all of our device specific stuff */ 139/* Structure to hold all of our device specific stuff */
148struct atp { 140struct atp {
149 char phys[64]; 141 char phys[64];
150 struct usb_device * udev; /* usb device */ 142 struct usb_device *udev; /* usb device */
151 struct urb * urb; /* usb request block */ 143 struct urb *urb; /* usb request block */
152 signed char * data; /* transferred data */ 144 signed char *data; /* transferred data */
153 struct input_dev * input; /* input dev */ 145 struct input_dev *input; /* input dev */
154 unsigned char open; /* non-zero if opened */ 146 enum atp_touchpad_type type; /* type of touchpad */
155 unsigned char valid; /* are the sensors valid ? */ 147 bool open;
156 unsigned char size_detect_done; 148 bool valid; /* are the samples valid? */
157 unsigned char overflowwarn; /* overflow warning printed? */ 149 bool size_detect_done;
150 bool overflow_warned;
158 int x_old; /* last reported x/y, */ 151 int x_old; /* last reported x/y, */
159 int y_old; /* used for smoothing */ 152 int y_old; /* used for smoothing */
160 /* current value of the sensors */
161 signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; 153 signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS];
162 /* last value of the sensors */
163 signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; 154 signed char xy_old[ATP_XSENSORS + ATP_YSENSORS];
164 /* accumulated sensors */
165 int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; 155 int xy_acc[ATP_XSENSORS + ATP_YSENSORS];
166 int datalen; /* size of an USB urb transfer */ 156 int datalen; /* size of USB transfer */
167 int idlecount; /* number of empty packets */ 157 int idlecount; /* number of empty packets */
168 struct work_struct work; 158 struct work_struct work;
169}; 159};
170 160
171#define dbg_dump(msg, tab) \ 161#define dbg_dump(msg, tab) \
172 if (debug > 1) { \ 162 if (debug > 1) { \
173 int i; \ 163 int __i; \
174 printk("appletouch: %s %lld", msg, (long long)jiffies); \ 164 printk(KERN_DEBUG "appletouch: %s", msg); \
175 for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) \ 165 for (__i = 0; __i < ATP_XSENSORS + ATP_YSENSORS; __i++) \
176 printk(" %02x", tab[i]); \ 166 printk(" %02x", tab[__i]); \
177 printk("\n"); \ 167 printk("\n"); \
178 } 168 }
179 169
180#define dprintk(format, a...) \ 170#define dprintk(format, a...) \
181 do { \ 171 do { \
182 if (debug) printk(KERN_DEBUG format, ##a); \ 172 if (debug) \
173 printk(KERN_DEBUG format, ##a); \
183 } while (0) 174 } while (0)
184 175
185MODULE_AUTHOR("Johannes Berg, Stelian Pop, Frank Arnold, Michael Hanselmann"); 176MODULE_AUTHOR("Johannes Berg");
186MODULE_DESCRIPTION("Apple PowerBooks USB touchpad driver"); 177MODULE_AUTHOR("Stelian Pop");
178MODULE_AUTHOR("Frank Arnold");
179MODULE_AUTHOR("Michael Hanselmann");
180MODULE_AUTHOR("Sven Anders");
181MODULE_DESCRIPTION("Apple PowerBook and MacBook USB touchpad driver");
187MODULE_LICENSE("GPL"); 182MODULE_LICENSE("GPL");
188 183
189/* 184/*
@@ -191,46 +186,14 @@ MODULE_LICENSE("GPL");
191 */ 186 */
192static int threshold = ATP_THRESHOLD; 187static int threshold = ATP_THRESHOLD;
193module_param(threshold, int, 0644); 188module_param(threshold, int, 0644);
194MODULE_PARM_DESC(threshold, "Discards any change in data from a sensor (trackpad has hundreds of these sensors) less than this value"); 189MODULE_PARM_DESC(threshold, "Discard any change in data from a sensor"
190 " (the trackpad has many of these sensors)"
191 " less than this value.");
195 192
196static int debug = 1; 193static int debug;
197module_param(debug, int, 0644); 194module_param(debug, int, 0644);
198MODULE_PARM_DESC(debug, "Activate debugging output"); 195MODULE_PARM_DESC(debug, "Activate debugging output");
199 196
200static inline int atp_is_fountain(struct atp *dev)
201{
202 u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
203
204 return productId == FOUNTAIN_ANSI_PRODUCT_ID ||
205 productId == FOUNTAIN_ISO_PRODUCT_ID ||
206 productId == FOUNTAIN_TP_ONLY_PRODUCT_ID;
207}
208
209/* Checks if the device a Geyser 2 (ANSI, ISO, JIS) */
210static inline int atp_is_geyser_2(struct atp *dev)
211{
212 u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
213
214 return (productId == GEYSER_ANSI_PRODUCT_ID) ||
215 (productId == GEYSER_ISO_PRODUCT_ID) ||
216 (productId == GEYSER_JIS_PRODUCT_ID);
217}
218
219static inline int atp_is_geyser_3(struct atp *dev)
220{
221 u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
222
223 return (productId == GEYSER3_ANSI_PRODUCT_ID) ||
224 (productId == GEYSER3_ISO_PRODUCT_ID) ||
225 (productId == GEYSER3_JIS_PRODUCT_ID) ||
226 (productId == GEYSER4_ANSI_PRODUCT_ID) ||
227 (productId == GEYSER4_ISO_PRODUCT_ID) ||
228 (productId == GEYSER4_JIS_PRODUCT_ID) ||
229 (productId == GEYSER4_HF_ANSI_PRODUCT_ID) ||
230 (productId == GEYSER4_HF_ISO_PRODUCT_ID) ||
231 (productId == GEYSER4_HF_JIS_PRODUCT_ID);
232}
233
234/* 197/*
235 * By default newer Geyser devices send standard USB HID mouse 198 * By default newer Geyser devices send standard USB HID mouse
236 * packets (Report ID 2). This code changes device mode, so it 199 * packets (Report ID 2). This code changes device mode, so it
@@ -240,6 +203,7 @@ static int atp_geyser_init(struct usb_device *udev)
240{ 203{
241 char data[8]; 204 char data[8];
242 int size; 205 int size;
206 int i;
243 207
244 size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 208 size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
245 ATP_GEYSER_MODE_READ_REQUEST_ID, 209 ATP_GEYSER_MODE_READ_REQUEST_ID,
@@ -248,8 +212,11 @@ static int atp_geyser_init(struct usb_device *udev)
248 ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000); 212 ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
249 213
250 if (size != 8) { 214 if (size != 8) {
251 err("Could not do mode read request from device" 215 dprintk("atp_geyser_init: read error\n");
252 " (Geyser Raw mode)"); 216 for (i = 0; i < 8; i++)
217 dprintk("appletouch[%d]: %d\n", i, data[i]);
218
219 err("Failed to read mode from device.");
253 return -EIO; 220 return -EIO;
254 } 221 }
255 222
@@ -263,8 +230,11 @@ static int atp_geyser_init(struct usb_device *udev)
263 ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000); 230 ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
264 231
265 if (size != 8) { 232 if (size != 8) {
266 err("Could not do mode write request to device" 233 dprintk("atp_geyser_init: write error\n");
267 " (Geyser Raw mode)"); 234 for (i = 0; i < 8; i++)
235 dprintk("appletouch[%d]: %d\n", i, data[i]);
236
237 err("Failed to request geyser raw mode");
268 return -EIO; 238 return -EIO;
269 } 239 }
270 return 0; 240 return 0;
@@ -280,15 +250,15 @@ static void atp_reinit(struct work_struct *work)
280 struct usb_device *udev = dev->udev; 250 struct usb_device *udev = dev->udev;
281 int retval; 251 int retval;
282 252
253 dprintk("appletouch: putting appletouch to sleep (reinit)\n");
283 dev->idlecount = 0; 254 dev->idlecount = 0;
284 255
285 atp_geyser_init(udev); 256 atp_geyser_init(udev);
286 257
287 retval = usb_submit_urb(dev->urb, GFP_ATOMIC); 258 retval = usb_submit_urb(dev->urb, GFP_ATOMIC);
288 if (retval) { 259 if (retval)
289 err("%s - usb_submit_urb failed with result %d", 260 err("atp_reinit: usb_submit_urb failed with error %d",
290 __FUNCTION__, retval); 261 retval);
291 }
292} 262}
293 263
294static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, 264static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
@@ -323,7 +293,8 @@ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
323 * 293 *
324 * - Jason Parekh <jasonparekh@gmail.com> 294 * - Jason Parekh <jasonparekh@gmail.com>
325 */ 295 */
326 if (i < 1 || (!is_increasing && xy_sensors[i - 1] < xy_sensors[i])) { 296 if (i < 1 ||
297 (!is_increasing && xy_sensors[i - 1] < xy_sensors[i])) {
327 (*fingers)++; 298 (*fingers)++;
328 is_increasing = 1; 299 is_increasing = 1;
329 } else if (i > 0 && xy_sensors[i - 1] >= xy_sensors[i]) { 300 } else if (i > 0 && xy_sensors[i - 1] >= xy_sensors[i]) {
@@ -331,11 +302,11 @@ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
331 } 302 }
332 303
333 /* 304 /*
334 * Subtracts threshold so a high sensor that just passes the threshold 305 * Subtracts threshold so a high sensor that just passes the
335 * won't skew the calculated absolute coordinate. Fixes an issue 306 * threshold won't skew the calculated absolute coordinate.
336 * where slowly moving the mouse would occassionaly jump a number of 307 * Fixes an issue where slowly moving the mouse would
337 * pixels (let me restate--slowly moving the mouse makes this issue 308 * occasionally jump a number of pixels (slowly moving the
338 * most apparent). 309 * finger makes this issue most apparent.)
339 */ 310 */
340 pcum += (xy_sensors[i] - threshold) * i; 311 pcum += (xy_sensors[i] - threshold) * i;
341 psum += (xy_sensors[i] - threshold); 312 psum += (xy_sensors[i] - threshold);
@@ -356,7 +327,7 @@ static inline void atp_report_fingers(struct input_dev *input, int fingers)
356 input_report_key(input, BTN_TOOL_TRIPLETAP, fingers > 2); 327 input_report_key(input, BTN_TOOL_TRIPLETAP, fingers > 2);
357} 328}
358 329
359static void atp_complete(struct urb* urb) 330static void atp_complete(struct urb *urb)
360{ 331{
361 int x, y, x_z, y_z, x_f, y_f; 332 int x, y, x_z, y_z, x_f, y_f;
362 int retval, i, j; 333 int retval, i, j;
@@ -368,22 +339,22 @@ static void atp_complete(struct urb* urb)
368 /* success */ 339 /* success */
369 break; 340 break;
370 case -EOVERFLOW: 341 case -EOVERFLOW:
371 if(!dev->overflowwarn) { 342 if (!dev->overflow_warned) {
372 printk(KERN_WARNING "appletouch: OVERFLOW with data " 343 printk(KERN_WARNING "appletouch: OVERFLOW with data "
373 "length %d, actual length is %d\n", 344 "length %d, actual length is %d\n",
374 dev->datalen, dev->urb->actual_length); 345 dev->datalen, dev->urb->actual_length);
375 dev->overflowwarn = 1; 346 dev->overflow_warned = true;
376 } 347 }
377 case -ECONNRESET: 348 case -ECONNRESET:
378 case -ENOENT: 349 case -ENOENT:
379 case -ESHUTDOWN: 350 case -ESHUTDOWN:
380 /* This urb is terminated, clean up */ 351 /* This urb is terminated, clean up */
381 dbg("%s - urb shutting down with status: %d", 352 dbg("atp_complete: urb shutting down with status: %d",
382 __FUNCTION__, urb->status); 353 urb->status);
383 return; 354 return;
384 default: 355 default:
385 dbg("%s - nonzero urb status received: %d", 356 dbg("atp_complete: nonzero urb status received: %d",
386 __FUNCTION__, urb->status); 357 urb->status);
387 goto exit; 358 goto exit;
388 } 359 }
389 360
@@ -396,7 +367,7 @@ static void atp_complete(struct urb* urb)
396 } 367 }
397 368
398 /* reorder the sensors values */ 369 /* reorder the sensors values */
399 if (atp_is_geyser_3(dev)) { 370 if (dev->type == ATP_GEYSER3 || dev->type == ATP_GEYSER4) {
400 memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); 371 memset(dev->xy_cur, 0, sizeof(dev->xy_cur));
401 372
402 /* 373 /*
@@ -415,7 +386,7 @@ static void atp_complete(struct urb* urb)
415 dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1]; 386 dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1];
416 dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2]; 387 dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2];
417 } 388 }
418 } else if (atp_is_geyser_2(dev)) { 389 } else if (dev->type == ATP_GEYSER2) {
419 memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); 390 memset(dev->xy_cur, 0, sizeof(dev->xy_cur));
420 391
421 /* 392 /*
@@ -438,7 +409,7 @@ static void atp_complete(struct urb* urb)
438 } else { 409 } else {
439 for (i = 0; i < 8; i++) { 410 for (i = 0; i < 8; i++) {
440 /* X values */ 411 /* X values */
441 dev->xy_cur[i ] = dev->data[5 * i + 2]; 412 dev->xy_cur[i + 0] = dev->data[5 * i + 2];
442 dev->xy_cur[i + 8] = dev->data[5 * i + 4]; 413 dev->xy_cur[i + 8] = dev->data[5 * i + 4];
443 dev->xy_cur[i + 16] = dev->data[5 * i + 42]; 414 dev->xy_cur[i + 16] = dev->data[5 * i + 42];
444 if (i < 2) 415 if (i < 2)
@@ -454,21 +425,22 @@ static void atp_complete(struct urb* urb)
454 425
455 if (!dev->valid) { 426 if (!dev->valid) {
456 /* first sample */ 427 /* first sample */
457 dev->valid = 1; 428 dev->valid = true;
458 dev->x_old = dev->y_old = -1; 429 dev->x_old = dev->y_old = -1;
459 memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); 430 memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old));
460 431
461 if (dev->size_detect_done || 432 if (dev->size_detect_done ||
462 atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */ 433 dev->type == ATP_GEYSER3) /* No 17" Macbooks (yet) */
463 goto exit; 434 goto exit;
464 435
465 /* 17" Powerbooks have extra X sensors */ 436 /* 17" Powerbooks have extra X sensors */
466 for (i = (atp_is_geyser_2(dev) ? 15 : 16); i < ATP_XSENSORS; i++) { 437 for (i = (dev->type == ATP_GEYSER2 ? 15 : 16);
438 i < ATP_XSENSORS; i++) {
467 if (!dev->xy_cur[i]) 439 if (!dev->xy_cur[i])
468 continue; 440 continue;
469 441
470 printk(KERN_INFO "appletouch: 17\" model detected.\n"); 442 printk(KERN_INFO "appletouch: 17\" model detected.\n");
471 if (atp_is_geyser_2(dev)) 443 if (dev->type == ATP_GEYSER2)
472 input_set_abs_params(dev->input, ABS_X, 0, 444 input_set_abs_params(dev->input, ABS_X, 0,
473 (20 - 1) * 445 (20 - 1) *
474 ATP_XFACT - 1, 446 ATP_XFACT - 1,
@@ -548,11 +520,15 @@ static void atp_complete(struct urb* urb)
548 * several hundred times a second. Re-initialization does not 520 * several hundred times a second. Re-initialization does not
549 * work on Fountain touchpads. 521 * work on Fountain touchpads.
550 */ 522 */
551 if (!atp_is_fountain(dev)) { 523 if (dev->type != ATP_FOUNTAIN) {
524 /*
525 * Button must not be pressed when entering suspend,
526 * otherwise we will never release the button.
527 */
552 if (!x && !y && !key) { 528 if (!x && !y && !key) {
553 dev->idlecount++; 529 dev->idlecount++;
554 if (dev->idlecount == 10) { 530 if (dev->idlecount == 10) {
555 dev->valid = 0; 531 dev->valid = false;
556 schedule_work(&dev->work); 532 schedule_work(&dev->work);
557 /* Don't resubmit urb here, wait for reinit */ 533 /* Don't resubmit urb here, wait for reinit */
558 return; 534 return;
@@ -561,12 +537,11 @@ static void atp_complete(struct urb* urb)
561 dev->idlecount = 0; 537 dev->idlecount = 0;
562 } 538 }
563 539
564exit: 540 exit:
565 retval = usb_submit_urb(dev->urb, GFP_ATOMIC); 541 retval = usb_submit_urb(dev->urb, GFP_ATOMIC);
566 if (retval) { 542 if (retval)
567 err("%s - usb_submit_urb failed with result %d", 543 err("atp_complete: usb_submit_urb failed with result %d",
568 __FUNCTION__, retval); 544 retval);
569 }
570} 545}
571 546
572static int atp_open(struct input_dev *input) 547static int atp_open(struct input_dev *input)
@@ -593,7 +568,7 @@ static int atp_handle_geyser(struct atp *dev)
593{ 568{
594 struct usb_device *udev = dev->udev; 569 struct usb_device *udev = dev->udev;
595 570
596 if (!atp_is_fountain(dev)) { 571 if (dev->type != ATP_FOUNTAIN) {
597 /* switch to raw sensor mode */ 572 /* switch to raw sensor mode */
598 if (atp_geyser_init(udev)) 573 if (atp_geyser_init(udev))
599 return -EIO; 574 return -EIO;
@@ -604,7 +579,8 @@ static int atp_handle_geyser(struct atp *dev)
604 return 0; 579 return 0;
605} 580}
606 581
607static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) 582static int atp_probe(struct usb_interface *iface,
583 const struct usb_device_id *id)
608{ 584{
609 struct atp *dev; 585 struct atp *dev;
610 struct input_dev *input_dev; 586 struct input_dev *input_dev;
@@ -640,13 +616,12 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
640 616
641 dev->udev = udev; 617 dev->udev = udev;
642 dev->input = input_dev; 618 dev->input = input_dev;
643 dev->overflowwarn = 0; 619 dev->type = id->driver_info;
644 if (atp_is_geyser_3(dev)) 620 dev->overflow_warned = false;
645 dev->datalen = 64; 621 if (dev->type == ATP_FOUNTAIN || dev->type == ATP_GEYSER1)
646 else if (atp_is_geyser_2(dev))
647 dev->datalen = 64;
648 else
649 dev->datalen = 81; 622 dev->datalen = 81;
623 else
624 dev->datalen = 64;
650 625
651 dev->urb = usb_alloc_urb(0, GFP_KERNEL); 626 dev->urb = usb_alloc_urb(0, GFP_KERNEL);
652 if (!dev->urb) 627 if (!dev->urb)
@@ -680,7 +655,7 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
680 655
681 set_bit(EV_ABS, input_dev->evbit); 656 set_bit(EV_ABS, input_dev->evbit);
682 657
683 if (atp_is_geyser_3(dev)) { 658 if (dev->type == ATP_GEYSER3 || dev->type == ATP_GEYSER4) {
684 /* 659 /*
685 * MacBook have 20 X sensors, 10 Y sensors 660 * MacBook have 20 X sensors, 10 Y sensors
686 */ 661 */
@@ -688,7 +663,7 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
688 ((20 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0); 663 ((20 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0);
689 input_set_abs_params(input_dev, ABS_Y, 0, 664 input_set_abs_params(input_dev, ABS_Y, 0,
690 ((10 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0); 665 ((10 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0);
691 } else if (atp_is_geyser_2(dev)) { 666 } else if (dev->type == ATP_GEYSER2) {
692 /* 667 /*
693 * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected 668 * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected
694 * later. 669 * later.
@@ -703,9 +678,11 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
703 * 17" models are detected later. 678 * 17" models are detected later.
704 */ 679 */
705 input_set_abs_params(input_dev, ABS_X, 0, 680 input_set_abs_params(input_dev, ABS_X, 0,
706 (16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0); 681 (16 - 1) * ATP_XFACT - 1,
682 ATP_FUZZ, 0);
707 input_set_abs_params(input_dev, ABS_Y, 0, 683 input_set_abs_params(input_dev, ABS_Y, 0,
708 (ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0); 684 (ATP_YSENSORS - 1) * ATP_YFACT - 1,
685 ATP_FUZZ, 0);
709 } 686 }
710 input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); 687 input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0);
711 688
@@ -774,7 +751,7 @@ static int atp_suspend(struct usb_interface *iface, pm_message_t message)
774 struct atp *dev = usb_get_intfdata(iface); 751 struct atp *dev = usb_get_intfdata(iface);
775 752
776 usb_kill_urb(dev->urb); 753 usb_kill_urb(dev->urb);
777 dev->valid = 0; 754 dev->valid = false;
778 755
779 return 0; 756 return 0;
780} 757}
diff --git a/drivers/input/mouse/atarimouse.c b/drivers/input/mouse/atarimouse.c
index 98a3561d4b05..adf45b3040e9 100644
--- a/drivers/input/mouse/atarimouse.c
+++ b/drivers/input/mouse/atarimouse.c
@@ -57,15 +57,12 @@ MODULE_AUTHOR("Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>");
57MODULE_DESCRIPTION("Atari mouse driver"); 57MODULE_DESCRIPTION("Atari mouse driver");
58MODULE_LICENSE("GPL"); 58MODULE_LICENSE("GPL");
59 59
60static int mouse_threshold[2] = {2,2}; 60static int mouse_threshold[2] = {2, 2};
61module_param_array(mouse_threshold, int, NULL, 0);
61 62
62#ifdef __MODULE__
63MODULE_PARM(mouse_threshold, "2i");
64#endif
65#ifdef FIXED_ATARI_JOYSTICK 63#ifdef FIXED_ATARI_JOYSTICK
66extern int atari_mouse_buttons; 64extern int atari_mouse_buttons;
67#endif 65#endif
68static int atamouse_used = 0;
69 66
70static struct input_dev *atamouse_dev; 67static struct input_dev *atamouse_dev;
71 68
@@ -97,9 +94,6 @@ static void atamouse_interrupt(char *buf)
97 94
98static int atamouse_open(struct input_dev *dev) 95static int atamouse_open(struct input_dev *dev)
99{ 96{
100 if (atamouse_used++)
101 return 0;
102
103#ifdef FIXED_ATARI_JOYSTICK 97#ifdef FIXED_ATARI_JOYSTICK
104 atari_mouse_buttons = 0; 98 atari_mouse_buttons = 0;
105#endif 99#endif
@@ -107,23 +101,24 @@ static int atamouse_open(struct input_dev *dev)
107 ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]); 101 ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]);
108 ikbd_mouse_rel_pos(); 102 ikbd_mouse_rel_pos();
109 atari_input_mouse_interrupt_hook = atamouse_interrupt; 103 atari_input_mouse_interrupt_hook = atamouse_interrupt;
104
110 return 0; 105 return 0;
111} 106}
112 107
113static void atamouse_close(struct input_dev *dev) 108static void atamouse_close(struct input_dev *dev)
114{ 109{
115 if (!--atamouse_used) { 110 ikbd_mouse_disable();
116 ikbd_mouse_disable(); 111 atari_mouse_interrupt_hook = NULL;
117 atari_mouse_interrupt_hook = NULL;
118 }
119} 112}
120 113
121static int __init atamouse_init(void) 114static int __init atamouse_init(void)
122{ 115{
116 int error;
117
123 if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) 118 if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP))
124 return -ENODEV; 119 return -ENODEV;
125 120
126 if (!(atari_keyb_init())) 121 if (!atari_keyb_init())
127 return -ENODEV; 122 return -ENODEV;
128 123
129 atamouse_dev = input_allocate_device(); 124 atamouse_dev = input_allocate_device();
@@ -141,12 +136,14 @@ static int __init atamouse_init(void)
141 atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); 136 atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
142 atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | 137 atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) |
143 BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); 138 BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
139
144 atamouse_dev->open = atamouse_open; 140 atamouse_dev->open = atamouse_open;
145 atamouse_dev->close = atamouse_close; 141 atamouse_dev->close = atamouse_close;
146 142
147 if (input_register_device(atamouse_dev)) { 143 error = input_register_device(atamouse_dev);
144 if (error) {
148 input_free_device(atamouse_dev); 145 input_free_device(atamouse_dev);
149 return -ENOMEM; 146 return error;
150 } 147 }
151 148
152 return 0; 149 return 0;
diff --git a/drivers/input/mouse/hil_ptr.c b/drivers/input/mouse/hil_ptr.c
index 27f88fbb7136..e532c48410ea 100644
--- a/drivers/input/mouse/hil_ptr.c
+++ b/drivers/input/mouse/hil_ptr.c
@@ -247,19 +247,24 @@ static void hil_ptr_disconnect(struct serio *serio)
247 247
248static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) 248static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
249{ 249{
250 struct hil_ptr *ptr; 250 struct hil_ptr *ptr;
251 const char *txt; 251 const char *txt;
252 unsigned int i, naxsets, btntype; 252 unsigned int i, naxsets, btntype;
253 uint8_t did, *idd; 253 uint8_t did, *idd;
254 254 int error;
255 if (!(ptr = kzalloc(sizeof(struct hil_ptr), GFP_KERNEL))) 255
256 ptr = kzalloc(sizeof(struct hil_ptr), GFP_KERNEL);
257 if (!ptr)
256 return -ENOMEM; 258 return -ENOMEM;
257 259
258 ptr->dev = input_allocate_device(); 260 ptr->dev = input_allocate_device();
259 if (!ptr->dev) 261 if (!ptr->dev) {
262 error = -ENOMEM;
260 goto bail0; 263 goto bail0;
264 }
261 265
262 if (serio_open(serio, driver)) 266 error = serio_open(serio, driver);
267 if (error)
263 goto bail1; 268 goto bail1;
264 269
265 serio_set_drvdata(serio, ptr); 270 serio_set_drvdata(serio, ptr);
@@ -297,6 +302,7 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
297 did = ptr->idd[0]; 302 did = ptr->idd[0];
298 idd = ptr->idd + 1; 303 idd = ptr->idd + 1;
299 txt = "unknown"; 304 txt = "unknown";
305
300 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { 306 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) {
301 ptr->dev->evbit[0] = BIT_MASK(EV_REL); 307 ptr->dev->evbit[0] = BIT_MASK(EV_REL);
302 txt = "relative"; 308 txt = "relative";
@@ -306,8 +312,11 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
306 ptr->dev->evbit[0] = BIT_MASK(EV_ABS); 312 ptr->dev->evbit[0] = BIT_MASK(EV_ABS);
307 txt = "absolute"; 313 txt = "absolute";
308 } 314 }
309 if (!ptr->dev->evbit[0]) 315
316 if (!ptr->dev->evbit[0]) {
317 error = -ENODEV;
310 goto bail2; 318 goto bail2;
319 }
311 320
312 ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); 321 ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd);
313 if (ptr->nbtn) 322 if (ptr->nbtn)
@@ -380,13 +389,19 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
380 ptr->dev->id.version = 0x0100; /* TODO: get from ptr->rsc */ 389 ptr->dev->id.version = 0x0100; /* TODO: get from ptr->rsc */
381 ptr->dev->dev.parent = &serio->dev; 390 ptr->dev->dev.parent = &serio->dev;
382 391
383 input_register_device(ptr->dev); 392 error = input_register_device(ptr->dev);
393 if (error) {
394 printk(KERN_INFO PREFIX "Unable to register input device\n");
395 goto bail2;
396 }
397
384 printk(KERN_INFO "input: %s (%s), ID: %d\n", 398 printk(KERN_INFO "input: %s (%s), ID: %d\n",
385 ptr->dev->name, 399 ptr->dev->name,
386 (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad", 400 (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad",
387 did); 401 did);
388 402
389 return 0; 403 return 0;
404
390 bail2: 405 bail2:
391 serio_close(serio); 406 serio_close(serio);
392 bail1: 407 bail1:
@@ -394,7 +409,7 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
394 bail0: 409 bail0:
395 kfree(ptr); 410 kfree(ptr);
396 serio_set_drvdata(serio, NULL); 411 serio_set_drvdata(serio, NULL);
397 return -ENODEV; 412 return error;
398} 413}
399 414
400static struct serio_device_id hil_ptr_ids[] = { 415static struct serio_device_id hil_ptr_ids[] = {
diff --git a/drivers/input/mouse/inport.c b/drivers/input/mouse/inport.c
index 06c35fc553c0..3827a22362de 100644
--- a/drivers/input/mouse/inport.c
+++ b/drivers/input/mouse/inport.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: inport.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/mouse/logibm.c b/drivers/input/mouse/logibm.c
index 9ea895593b27..e2413113df22 100644
--- a/drivers/input/mouse/logibm.c
+++ b/drivers/input/mouse/logibm.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: logibm.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c
index 61cff8374e6c..fd09c8df81f2 100644
--- a/drivers/input/mouse/pc110pad.c
+++ b/drivers/input/mouse/pc110pad.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: pc110pad.c,v 1.12 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c
index ed917bfd086a..17ff137b9bd5 100644
--- a/drivers/input/mouse/sermouse.c
+++ b/drivers/input/mouse/sermouse.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: sermouse.c,v 1.17 2002/03/13 10:03:43 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig
index ec4b6610f730..27d70d326ff3 100644
--- a/drivers/input/serio/Kconfig
+++ b/drivers/input/serio/Kconfig
@@ -190,4 +190,14 @@ config SERIO_RAW
190 To compile this driver as a module, choose M here: the 190 To compile this driver as a module, choose M here: the
191 module will be called serio_raw. 191 module will be called serio_raw.
192 192
193config SERIO_XILINX_XPS_PS2
194 tristate "Xilinx XPS PS/2 Controller Support"
195 depends on PPC
196 help
197 This driver supports XPS PS/2 IP from the Xilinx EDK on
198 PowerPC platform.
199
200 To compile this driver as a module, choose M here: the
201 module will be called xilinx_ps2.
202
193endif 203endif
diff --git a/drivers/input/serio/Makefile b/drivers/input/serio/Makefile
index 38b886887cbc..9b6c8135955f 100644
--- a/drivers/input/serio/Makefile
+++ b/drivers/input/serio/Makefile
@@ -21,3 +21,4 @@ obj-$(CONFIG_SERIO_PCIPS2) += pcips2.o
21obj-$(CONFIG_SERIO_MACEPS2) += maceps2.o 21obj-$(CONFIG_SERIO_MACEPS2) += maceps2.o
22obj-$(CONFIG_SERIO_LIBPS2) += libps2.o 22obj-$(CONFIG_SERIO_LIBPS2) += libps2.o
23obj-$(CONFIG_SERIO_RAW) += serio_raw.o 23obj-$(CONFIG_SERIO_RAW) += serio_raw.o
24obj-$(CONFIG_SERIO_XILINX_XPS_PS2) += xilinx_ps2.o
diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c
index 0d35018c23a9..d1380fc72cc6 100644
--- a/drivers/input/serio/ct82c710.c
+++ b/drivers/input/serio/ct82c710.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: ct82c710.c,v 1.11 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 1999-2001 Vojtech Pavlik 2 * Copyright (c) 1999-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/serio/hil_mlc.c b/drivers/input/serio/hil_mlc.c
index 93a1a6ba216a..37586a68d345 100644
--- a/drivers/input/serio/hil_mlc.c
+++ b/drivers/input/serio/hil_mlc.c
@@ -76,7 +76,7 @@ static struct timer_list hil_mlcs_kicker;
76static int hil_mlcs_probe; 76static int hil_mlcs_probe;
77 77
78static void hil_mlcs_process(unsigned long unused); 78static void hil_mlcs_process(unsigned long unused);
79DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0); 79static DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0);
80 80
81 81
82/* #define HIL_MLC_DEBUG */ 82/* #define HIL_MLC_DEBUG */
@@ -459,7 +459,7 @@ static int hilse_operate(hil_mlc *mlc, int repoll)
459#define OUT_LAST(pack) \ 459#define OUT_LAST(pack) \
460{ HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, 460{ HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 },
461 461
462const struct hilse_node hil_mlc_se[HILSEN_END] = { 462static const struct hilse_node hil_mlc_se[HILSEN_END] = {
463 463
464 /* 0 HILSEN_START */ 464 /* 0 HILSEN_START */
465 FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) 465 FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0)
@@ -784,7 +784,7 @@ static void hil_mlcs_process(unsigned long unused)
784 784
785/************************* Keepalive timer task *********************/ 785/************************* Keepalive timer task *********************/
786 786
787void hil_mlcs_timer(unsigned long data) 787static void hil_mlcs_timer(unsigned long data)
788{ 788{
789 hil_mlcs_probe = 1; 789 hil_mlcs_probe = 1;
790 tasklet_schedule(&hil_mlcs_tasklet); 790 tasklet_schedule(&hil_mlcs_tasklet);
diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c
index edfedd9a166c..aad664d5259f 100644
--- a/drivers/input/serio/hp_sdc.c
+++ b/drivers/input/serio/hp_sdc.c
@@ -67,6 +67,7 @@
67#include <linux/module.h> 67#include <linux/module.h>
68#include <linux/ioport.h> 68#include <linux/ioport.h>
69#include <linux/time.h> 69#include <linux/time.h>
70#include <linux/semaphore.h>
70#include <linux/slab.h> 71#include <linux/slab.h>
71#include <linux/hil.h> 72#include <linux/hil.h>
72#include <linux/semaphore.h> 73#include <linux/semaphore.h>
@@ -105,6 +106,10 @@ EXPORT_SYMBOL(__hp_sdc_enqueue_transaction);
105EXPORT_SYMBOL(hp_sdc_enqueue_transaction); 106EXPORT_SYMBOL(hp_sdc_enqueue_transaction);
106EXPORT_SYMBOL(hp_sdc_dequeue_transaction); 107EXPORT_SYMBOL(hp_sdc_dequeue_transaction);
107 108
109static unsigned int hp_sdc_disabled;
110module_param_named(no_hpsdc, hp_sdc_disabled, bool, 0);
111MODULE_PARM_DESC(no_hpsdc, "Do not enable HP SDC driver.");
112
108static hp_i8042_sdc hp_sdc; /* All driver state is kept in here. */ 113static hp_i8042_sdc hp_sdc; /* All driver state is kept in here. */
109 114
110/*************** primitives for use in any context *********************/ 115/*************** primitives for use in any context *********************/
@@ -980,6 +985,11 @@ static int __init hp_sdc_register(void)
980 unsigned char i; 985 unsigned char i;
981#endif 986#endif
982 987
988 if (hp_sdc_disabled) {
989 printk(KERN_WARNING PREFIX "HP SDC driver disabled by no_hpsdc=1.\n");
990 return -ENODEV;
991 }
992
983 hp_sdc.dev = NULL; 993 hp_sdc.dev = NULL;
984 hp_sdc.dev_err = 0; 994 hp_sdc.dev_err = 0;
985#if defined(__hppa__) 995#if defined(__hppa__)
diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c
index 587398f5c9df..b587e2d576ac 100644
--- a/drivers/input/serio/hp_sdc_mlc.c
+++ b/drivers/input/serio/hp_sdc_mlc.c
@@ -50,7 +50,7 @@ MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
50MODULE_DESCRIPTION("Glue for onboard HIL MLC in HP-PARISC machines"); 50MODULE_DESCRIPTION("Glue for onboard HIL MLC in HP-PARISC machines");
51MODULE_LICENSE("Dual BSD/GPL"); 51MODULE_LICENSE("Dual BSD/GPL");
52 52
53struct hp_sdc_mlc_priv_s { 53static struct hp_sdc_mlc_priv_s {
54 int emtestmode; 54 int emtestmode;
55 hp_sdc_transaction trans; 55 hp_sdc_transaction trans;
56 u8 tseq[16]; 56 u8 tseq[16];
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index 78eb7841174c..fe732a574ec2 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -63,13 +63,22 @@ static inline void i8042_write_command(int val)
63 outb(val, I8042_COMMAND_REG); 63 outb(val, I8042_COMMAND_REG);
64} 64}
65 65
66#if defined(__i386__) || defined(__x86_64__) 66#ifdef CONFIG_X86
67 67
68#include <linux/dmi.h> 68#include <linux/dmi.h>
69 69
70static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { 70static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = {
71 { 71 {
72 /* AUX LOOP command does not raise AUX IRQ */ 72 /* AUX LOOP command does not raise AUX IRQ */
73 .ident = "Arima-Rioworks HDAMB",
74 .matches = {
75 DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
76 DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
77 DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
78 },
79 },
80 {
81 /* AUX LOOP command does not raise AUX IRQ */
73 .ident = "ASUS P65UP5", 82 .ident = "ASUS P65UP5",
74 .matches = { 83 .matches = {
75 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), 84 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
@@ -118,6 +127,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = {
118 DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), 127 DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
119 }, 128 },
120 }, 129 },
130 {
131 .ident = "Medion MAM 2070",
132 .matches = {
133 DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
134 DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
135 DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
136 },
137 },
121 { } 138 { }
122}; 139};
123 140
@@ -291,17 +308,36 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
291 DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), 308 DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
292 }, 309 },
293 }, 310 },
311 {
312 .ident = "Acer Aspire 1360",
313 .matches = {
314 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
315 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
316 },
317 },
318 {
319 .ident = "Gericom Bellagio",
320 .matches = {
321 DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
322 DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
323 },
324 },
294 { } 325 { }
295}; 326};
296 327
297 328#ifdef CONFIG_PNP
298 329static struct dmi_system_id __initdata i8042_dmi_nopnp_table[] = {
330 {
331 .ident = "Intel MBO Desktop D845PESV",
332 .matches = {
333 DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
334 DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
335 },
336 },
337 { }
338};
299#endif 339#endif
300 340
301#ifdef CONFIG_X86
302
303#include <linux/dmi.h>
304
305/* 341/*
306 * Some Wistron based laptops need us to explicitly enable the 'Dritek 342 * Some Wistron based laptops need us to explicitly enable the 'Dritek
307 * keyboard extension' to make their extra keys start generating scancodes. 343 * keyboard extension' to make their extra keys start generating scancodes.
@@ -331,6 +367,13 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = {
331 }, 367 },
332 }, 368 },
333 { 369 {
370 .ident = "Acer Aspire 5720",
371 .matches = {
372 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
373 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
374 },
375 },
376 {
334 .ident = "Acer Aspire 9110", 377 .ident = "Acer Aspire 9110",
335 .matches = { 378 .matches = {
336 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 379 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
@@ -356,7 +399,6 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = {
356 399
357#endif /* CONFIG_X86 */ 400#endif /* CONFIG_X86 */
358 401
359
360#ifdef CONFIG_PNP 402#ifdef CONFIG_PNP
361#include <linux/pnp.h> 403#include <linux/pnp.h>
362 404
@@ -466,6 +508,11 @@ static int __init i8042_pnp_init(void)
466 int pnp_data_busted = 0; 508 int pnp_data_busted = 0;
467 int err; 509 int err;
468 510
511#ifdef CONFIG_X86
512 if (dmi_check_system(i8042_dmi_nopnp_table))
513 i8042_nopnp = 1;
514#endif
515
469 if (i8042_nopnp) { 516 if (i8042_nopnp) {
470 printk(KERN_INFO "i8042: PNP detection disabled\n"); 517 printk(KERN_INFO "i8042: PNP detection disabled\n");
471 return 0; 518 return 0;
@@ -591,15 +638,13 @@ static int __init i8042_platform_init(void)
591 i8042_reset = 1; 638 i8042_reset = 1;
592#endif 639#endif
593 640
594#if defined(__i386__) || defined(__x86_64__) 641#ifdef CONFIG_X86
595 if (dmi_check_system(i8042_dmi_noloop_table)) 642 if (dmi_check_system(i8042_dmi_noloop_table))
596 i8042_noloop = 1; 643 i8042_noloop = 1;
597 644
598 if (dmi_check_system(i8042_dmi_nomux_table)) 645 if (dmi_check_system(i8042_dmi_nomux_table))
599 i8042_nomux = 1; 646 i8042_nomux = 1;
600#endif
601 647
602#ifdef CONFIG_X86
603 if (dmi_check_system(i8042_dmi_dritek_table)) 648 if (dmi_check_system(i8042_dmi_dritek_table))
604 i8042_dritek = 1; 649 i8042_dritek = 1;
605#endif /* CONFIG_X86 */ 650#endif /* CONFIG_X86 */
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c
index b819239d74dc..2b304c22c200 100644
--- a/drivers/input/serio/libps2.c
+++ b/drivers/input/serio/libps2.c
@@ -26,15 +26,6 @@ MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>");
26MODULE_DESCRIPTION("PS/2 driver library"); 26MODULE_DESCRIPTION("PS/2 driver library");
27MODULE_LICENSE("GPL"); 27MODULE_LICENSE("GPL");
28 28
29/* Work structure to schedule execution of a command */
30struct ps2work {
31 struct work_struct work;
32 struct ps2dev *ps2dev;
33 int command;
34 unsigned char param[0];
35};
36
37
38/* 29/*
39 * ps2_sendbyte() sends a byte to the device and waits for acknowledge. 30 * ps2_sendbyte() sends a byte to the device and waits for acknowledge.
40 * It doesn't handle retransmission, though it could - because if there 31 * It doesn't handle retransmission, though it could - because if there
@@ -246,49 +237,6 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
246EXPORT_SYMBOL(ps2_command); 237EXPORT_SYMBOL(ps2_command);
247 238
248/* 239/*
249 * ps2_execute_scheduled_command() sends a command, previously scheduled by
250 * ps2_schedule_command(), to a PS/2 device (keyboard, mouse, etc.)
251 */
252
253static void ps2_execute_scheduled_command(struct work_struct *work)
254{
255 struct ps2work *ps2work = container_of(work, struct ps2work, work);
256
257 ps2_command(ps2work->ps2dev, ps2work->param, ps2work->command);
258 kfree(ps2work);
259}
260
261/*
262 * ps2_schedule_command() allows to schedule delayed execution of a PS/2
263 * command and can be used to issue a command from an interrupt or softirq
264 * context.
265 */
266
267int ps2_schedule_command(struct ps2dev *ps2dev, unsigned char *param, int command)
268{
269 struct ps2work *ps2work;
270 int send = (command >> 12) & 0xf;
271 int receive = (command >> 8) & 0xf;
272
273 if (!(ps2work = kmalloc(sizeof(struct ps2work) + max(send, receive), GFP_ATOMIC)))
274 return -1;
275
276 memset(ps2work, 0, sizeof(struct ps2work));
277 ps2work->ps2dev = ps2dev;
278 ps2work->command = command;
279 memcpy(ps2work->param, param, send);
280 INIT_WORK(&ps2work->work, ps2_execute_scheduled_command);
281
282 if (!schedule_work(&ps2work->work)) {
283 kfree(ps2work);
284 return -1;
285 }
286
287 return 0;
288}
289EXPORT_SYMBOL(ps2_schedule_command);
290
291/*
292 * ps2_init() initializes ps2dev structure 240 * ps2_init() initializes ps2dev structure
293 */ 241 */
294 242
diff --git a/drivers/input/serio/q40kbd.c b/drivers/input/serio/q40kbd.c
index d962a8d78b14..e36a0901646c 100644
--- a/drivers/input/serio/q40kbd.c
+++ b/drivers/input/serio/q40kbd.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: q40kbd.c,v 1.12 2002/02/02 22:26:44 vojtech Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
5 * 3 *
6 * Based on the work of: 4 * Based on the work of:
@@ -49,7 +47,7 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
49MODULE_DESCRIPTION("Q40 PS/2 keyboard controller driver"); 47MODULE_DESCRIPTION("Q40 PS/2 keyboard controller driver");
50MODULE_LICENSE("GPL"); 48MODULE_LICENSE("GPL");
51 49
52DEFINE_SPINLOCK(q40kbd_lock); 50static DEFINE_SPINLOCK(q40kbd_lock);
53static struct serio *q40kbd_port; 51static struct serio *q40kbd_port;
54static struct platform_device *q40kbd_device; 52static struct platform_device *q40kbd_device;
55 53
diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c
index 34c59d9c6205..1567b7782478 100644
--- a/drivers/input/serio/rpckbd.c
+++ b/drivers/input/serio/rpckbd.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: rpckbd.c,v 1.7 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
5 * Copyright (c) 2002 Russell King 3 * Copyright (c) 2002 Russell King
6 */ 4 */
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
index 7f5293828fbf..78f2abb5c11b 100644
--- a/drivers/input/serio/serio.c
+++ b/drivers/input/serio/serio.c
@@ -331,9 +331,10 @@ static void serio_handle_event(void)
331} 331}
332 332
333/* 333/*
334 * Remove all events that have been submitted for a given serio port. 334 * Remove all events that have been submitted for a given
335 * object, be it serio port or driver.
335 */ 336 */
336static void serio_remove_pending_events(struct serio *serio) 337static void serio_remove_pending_events(void *object)
337{ 338{
338 struct list_head *node, *next; 339 struct list_head *node, *next;
339 struct serio_event *event; 340 struct serio_event *event;
@@ -343,7 +344,7 @@ static void serio_remove_pending_events(struct serio *serio)
343 344
344 list_for_each_safe(node, next, &serio_event_list) { 345 list_for_each_safe(node, next, &serio_event_list) {
345 event = list_entry(node, struct serio_event, node); 346 event = list_entry(node, struct serio_event, node);
346 if (event->object == serio) { 347 if (event->object == object) {
347 list_del_init(node); 348 list_del_init(node);
348 serio_free_event(event); 349 serio_free_event(event);
349 } 350 }
@@ -837,7 +838,9 @@ void serio_unregister_driver(struct serio_driver *drv)
837 struct serio *serio; 838 struct serio *serio;
838 839
839 mutex_lock(&serio_mutex); 840 mutex_lock(&serio_mutex);
841
840 drv->manual_bind = 1; /* so serio_find_driver ignores it */ 842 drv->manual_bind = 1; /* so serio_find_driver ignores it */
843 serio_remove_pending_events(drv);
841 844
842start_over: 845start_over:
843 list_for_each_entry(serio, &serio_list, node) { 846 list_for_each_entry(serio, &serio_list, node) {
diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c
new file mode 100644
index 000000000000..0ed044d5e685
--- /dev/null
+++ b/drivers/input/serio/xilinx_ps2.c
@@ -0,0 +1,380 @@
1/*
2 * Xilinx XPS PS/2 device driver
3 *
4 * (c) 2005 MontaVista Software, Inc.
5 * (c) 2008 Xilinx, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 *
12 * You should have received a copy of the GNU General Public License along
13 * with this program; if not, write to the Free Software Foundation, Inc.,
14 * 675 Mass Ave, Cambridge, MA 02139, USA.
15 */
16
17
18#include <linux/module.h>
19#include <linux/serio.h>
20#include <linux/interrupt.h>
21#include <linux/errno.h>
22#include <linux/init.h>
23#include <linux/list.h>
24#include <linux/io.h>
25
26#include <linux/of_device.h>
27#include <linux/of_platform.h>
28
29#define DRIVER_NAME "xilinx_ps2"
30
31/* Register offsets for the xps2 device */
32#define XPS2_SRST_OFFSET 0x00000000 /* Software Reset register */
33#define XPS2_STATUS_OFFSET 0x00000004 /* Status register */
34#define XPS2_RX_DATA_OFFSET 0x00000008 /* Receive Data register */
35#define XPS2_TX_DATA_OFFSET 0x0000000C /* Transmit Data register */
36#define XPS2_GIER_OFFSET 0x0000002C /* Global Interrupt Enable reg */
37#define XPS2_IPISR_OFFSET 0x00000030 /* Interrupt Status register */
38#define XPS2_IPIER_OFFSET 0x00000038 /* Interrupt Enable register */
39
40/* Reset Register Bit Definitions */
41#define XPS2_SRST_RESET 0x0000000A /* Software Reset */
42
43/* Status Register Bit Positions */
44#define XPS2_STATUS_RX_FULL 0x00000001 /* Receive Full */
45#define XPS2_STATUS_TX_FULL 0x00000002 /* Transmit Full */
46
47/* Bit definitions for ISR/IER registers. Both the registers have the same bit
48 * definitions and are only defined once. */
49#define XPS2_IPIXR_WDT_TOUT 0x00000001 /* Watchdog Timeout Interrupt */
50#define XPS2_IPIXR_TX_NOACK 0x00000002 /* Transmit No ACK Interrupt */
51#define XPS2_IPIXR_TX_ACK 0x00000004 /* Transmit ACK (Data) Interrupt */
52#define XPS2_IPIXR_RX_OVF 0x00000008 /* Receive Overflow Interrupt */
53#define XPS2_IPIXR_RX_ERR 0x00000010 /* Receive Error Interrupt */
54#define XPS2_IPIXR_RX_FULL 0x00000020 /* Receive Data Interrupt */
55
56/* Mask for all the Transmit Interrupts */
57#define XPS2_IPIXR_TX_ALL (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_TX_ACK)
58
59/* Mask for all the Receive Interrupts */
60#define XPS2_IPIXR_RX_ALL (XPS2_IPIXR_RX_OVF | XPS2_IPIXR_RX_ERR | \
61 XPS2_IPIXR_RX_FULL)
62
63/* Mask for all the Interrupts */
64#define XPS2_IPIXR_ALL (XPS2_IPIXR_TX_ALL | XPS2_IPIXR_RX_ALL | \
65 XPS2_IPIXR_WDT_TOUT)
66
67/* Global Interrupt Enable mask */
68#define XPS2_GIER_GIE_MASK 0x80000000
69
70struct xps2data {
71 int irq;
72 u32 phys_addr;
73 u32 remap_size;
74 spinlock_t lock;
75 u8 rxb; /* Rx buffer */
76 void __iomem *base_address; /* virt. address of control registers */
77 unsigned int dfl;
78 struct serio serio; /* serio */
79};
80
81/************************************/
82/* XPS PS/2 data transmission calls */
83/************************************/
84
85/*
86 * xps2_recv() will attempt to receive a byte of data from the PS/2 port.
87 */
88static int xps2_recv(struct xps2data *drvdata, u8 *byte)
89{
90 u32 sr;
91 int status = -1;
92
93 /* If there is data available in the PS/2 receiver, read it */
94 sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET);
95 if (sr & XPS2_STATUS_RX_FULL) {
96 *byte = in_be32(drvdata->base_address + XPS2_RX_DATA_OFFSET);
97 status = 0;
98 }
99
100 return status;
101}
102
103/*********************/
104/* Interrupt handler */
105/*********************/
106static irqreturn_t xps2_interrupt(int irq, void *dev_id)
107{
108 struct xps2data *drvdata = dev_id;
109 u32 intr_sr;
110 u8 c;
111 int status;
112
113 /* Get the PS/2 interrupts and clear them */
114 intr_sr = in_be32(drvdata->base_address + XPS2_IPISR_OFFSET);
115 out_be32(drvdata->base_address + XPS2_IPISR_OFFSET, intr_sr);
116
117 /* Check which interrupt is active */
118 if (intr_sr & XPS2_IPIXR_RX_OVF)
119 printk(KERN_WARNING "%s: receive overrun error\n",
120 drvdata->serio.name);
121
122 if (intr_sr & XPS2_IPIXR_RX_ERR)
123 drvdata->dfl |= SERIO_PARITY;
124
125 if (intr_sr & (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_WDT_TOUT))
126 drvdata->dfl |= SERIO_TIMEOUT;
127
128 if (intr_sr & XPS2_IPIXR_RX_FULL) {
129 status = xps2_recv(drvdata, &drvdata->rxb);
130
131 /* Error, if a byte is not received */
132 if (status) {
133 printk(KERN_ERR
134 "%s: wrong rcvd byte count (%d)\n",
135 drvdata->serio.name, status);
136 } else {
137 c = drvdata->rxb;
138 serio_interrupt(&drvdata->serio, c, drvdata->dfl);
139 drvdata->dfl = 0;
140 }
141 }
142
143 if (intr_sr & XPS2_IPIXR_TX_ACK)
144 drvdata->dfl = 0;
145
146 return IRQ_HANDLED;
147}
148
149/*******************/
150/* serio callbacks */
151/*******************/
152
153/*
154 * sxps2_write() sends a byte out through the PS/2 interface.
155 */
156static int sxps2_write(struct serio *pserio, unsigned char c)
157{
158 struct xps2data *drvdata = pserio->port_data;
159 unsigned long flags;
160 u32 sr;
161 int status = -1;
162
163 spin_lock_irqsave(&drvdata->lock, flags);
164
165 /* If the PS/2 transmitter is empty send a byte of data */
166 sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET);
167 if (!(sr & XPS2_STATUS_TX_FULL)) {
168 out_be32(drvdata->base_address + XPS2_TX_DATA_OFFSET, c);
169 status = 0;
170 }
171
172 spin_unlock_irqrestore(&drvdata->lock, flags);
173
174 return status;
175}
176
177/*
178 * sxps2_open() is called when a port is open by the higher layer.
179 */
180static int sxps2_open(struct serio *pserio)
181{
182 struct xps2data *drvdata = pserio->port_data;
183 int retval;
184
185 retval = request_irq(drvdata->irq, &xps2_interrupt, 0,
186 DRIVER_NAME, drvdata);
187 if (retval) {
188 printk(KERN_ERR
189 "%s: Couldn't allocate interrupt %d\n",
190 drvdata->serio.name, drvdata->irq);
191 return retval;
192 }
193
194 /* start reception by enabling the interrupts */
195 out_be32(drvdata->base_address + XPS2_GIER_OFFSET, XPS2_GIER_GIE_MASK);
196 out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, XPS2_IPIXR_RX_ALL);
197 (void)xps2_recv(drvdata, &drvdata->rxb);
198
199 return 0; /* success */
200}
201
202/*
203 * sxps2_close() frees the interrupt.
204 */
205static void sxps2_close(struct serio *pserio)
206{
207 struct xps2data *drvdata = pserio->port_data;
208
209 /* Disable the PS2 interrupts */
210 out_be32(drvdata->base_address + XPS2_GIER_OFFSET, 0x00);
211 out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, 0x00);
212 free_irq(drvdata->irq, drvdata);
213}
214
215/*********************/
216/* Device setup code */
217/*********************/
218
219static int xps2_setup(struct device *dev, struct resource *regs_res,
220 struct resource *irq_res)
221{
222 struct xps2data *drvdata;
223 struct serio *serio;
224 unsigned long remap_size;
225 int retval;
226
227 if (!dev)
228 return -EINVAL;
229
230 if (!regs_res || !irq_res) {
231 dev_err(dev, "IO resource(s) not found\n");
232 return -EINVAL;
233 }
234
235 drvdata = kzalloc(sizeof(struct xps2data), GFP_KERNEL);
236 if (!drvdata) {
237 dev_err(dev, "Couldn't allocate device private record\n");
238 return -ENOMEM;
239 }
240
241 dev_set_drvdata(dev, drvdata);
242
243 spin_lock_init(&drvdata->lock);
244 drvdata->irq = irq_res->start;
245
246 remap_size = regs_res->end - regs_res->start + 1;
247 if (!request_mem_region(regs_res->start, remap_size, DRIVER_NAME)) {
248 dev_err(dev, "Couldn't lock memory region at 0x%08X\n",
249 (unsigned int)regs_res->start);
250 retval = -EBUSY;
251 goto failed1;
252 }
253
254 /* Fill in configuration data and add them to the list */
255 drvdata->phys_addr = regs_res->start;
256 drvdata->remap_size = remap_size;
257 drvdata->base_address = ioremap(regs_res->start, remap_size);
258 if (drvdata->base_address == NULL) {
259 dev_err(dev, "Couldn't ioremap memory at 0x%08X\n",
260 (unsigned int)regs_res->start);
261 retval = -EFAULT;
262 goto failed2;
263 }
264
265 /* Disable all the interrupts, just in case */
266 out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, 0);
267
268 /* Reset the PS2 device and abort any current transaction, to make sure
269 * we have the PS2 in a good state */
270 out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET);
271
272 dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%08X, irq=%d\n",
273 drvdata->phys_addr, (u32)drvdata->base_address, drvdata->irq);
274
275 serio = &drvdata->serio;
276 serio->id.type = SERIO_8042;
277 serio->write = sxps2_write;
278 serio->open = sxps2_open;
279 serio->close = sxps2_close;
280 serio->port_data = drvdata;
281 serio->dev.parent = dev;
282 snprintf(serio->name, sizeof(serio->name),
283 "Xilinx XPS PS/2 at %08X", drvdata->phys_addr);
284 snprintf(serio->phys, sizeof(serio->phys),
285 "xilinxps2/serio at %08X", drvdata->phys_addr);
286 serio_register_port(serio);
287
288 return 0; /* success */
289
290failed2:
291 release_mem_region(regs_res->start, remap_size);
292failed1:
293 kfree(drvdata);
294 dev_set_drvdata(dev, NULL);
295
296 return retval;
297}
298
299/***************************/
300/* OF Platform Bus Support */
301/***************************/
302
303static int __devinit xps2_of_probe(struct of_device *ofdev, const struct
304 of_device_id * match)
305{
306 struct resource r_irq; /* Interrupt resources */
307 struct resource r_mem; /* IO mem resources */
308 int rc = 0;
309
310 printk(KERN_INFO "Device Tree Probing \'%s\'\n",
311 ofdev->node->name);
312
313 /* Get iospace for the device */
314 rc = of_address_to_resource(ofdev->node, 0, &r_mem);
315 if (rc) {
316 dev_err(&ofdev->dev, "invalid address\n");
317 return rc;
318 }
319
320 /* Get IRQ for the device */
321 rc = of_irq_to_resource(ofdev->node, 0, &r_irq);
322 if (rc == NO_IRQ) {
323 dev_err(&ofdev->dev, "no IRQ found\n");
324 return rc;
325 }
326
327 return xps2_setup(&ofdev->dev, &r_mem, &r_irq);
328}
329
330static int __devexit xps2_of_remove(struct of_device *of_dev)
331{
332 struct device *dev = &of_dev->dev;
333 struct xps2data *drvdata;
334
335 if (!dev)
336 return -EINVAL;
337
338 drvdata = dev_get_drvdata(dev);
339
340 serio_unregister_port(&drvdata->serio);
341 iounmap(drvdata->base_address);
342 release_mem_region(drvdata->phys_addr, drvdata->remap_size);
343 kfree(drvdata);
344
345 dev_set_drvdata(dev, NULL);
346
347 return 0; /* success */
348}
349
350/* Match table for of_platform binding */
351static struct of_device_id xps2_of_match[] __devinitdata = {
352 { .compatible = "xlnx,xps-ps2-1.00.a", },
353 { /* end of list */ },
354};
355MODULE_DEVICE_TABLE(of, xps2_of_match);
356
357static struct of_platform_driver xps2_of_driver = {
358 .name = DRIVER_NAME,
359 .match_table = xps2_of_match,
360 .probe = xps2_of_probe,
361 .remove = __devexit_p(xps2_of_remove),
362};
363
364static int __init xps2_init(void)
365{
366 return of_register_platform_driver(&xps2_of_driver);
367}
368
369static void __exit xps2_cleanup(void)
370{
371 of_unregister_platform_driver(&xps2_of_driver);
372}
373
374module_init(xps2_init);
375module_exit(xps2_cleanup);
376
377MODULE_AUTHOR("Xilinx, Inc.");
378MODULE_DESCRIPTION("Xilinx XPS PS/2 driver");
379MODULE_LICENSE("GPL");
380
diff --git a/drivers/input/tablet/acecad.c b/drivers/input/tablet/acecad.c
index b973d0ef6d16..570e0e83ac46 100644
--- a/drivers/input/tablet/acecad.c
+++ b/drivers/input/tablet/acecad.c
@@ -73,10 +73,10 @@ static void usb_acecad_irq(struct urb *urb)
73 case -ENOENT: 73 case -ENOENT:
74 case -ESHUTDOWN: 74 case -ESHUTDOWN:
75 /* this urb is terminated, clean up */ 75 /* this urb is terminated, clean up */
76 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 76 dbg("%s - urb shutting down with status: %d", __func__, urb->status);
77 return; 77 return;
78 default: 78 default:
79 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); 79 dbg("%s - nonzero urb status received: %d", __func__, urb->status);
80 goto resubmit; 80 goto resubmit;
81 } 81 }
82 82
diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c
index 55c1134d6137..8f037a1d44a6 100644
--- a/drivers/input/tablet/aiptek.c
+++ b/drivers/input/tablet/aiptek.c
@@ -449,12 +449,12 @@ static void aiptek_irq(struct urb *urb)
449 case -ESHUTDOWN: 449 case -ESHUTDOWN:
450 /* This urb is terminated, clean up */ 450 /* This urb is terminated, clean up */
451 dbg("%s - urb shutting down with status: %d", 451 dbg("%s - urb shutting down with status: %d",
452 __FUNCTION__, urb->status); 452 __func__, urb->status);
453 return; 453 return;
454 454
455 default: 455 default:
456 dbg("%s - nonzero urb status received: %d", 456 dbg("%s - nonzero urb status received: %d",
457 __FUNCTION__, urb->status); 457 __func__, urb->status);
458 goto exit; 458 goto exit;
459 } 459 }
460 460
@@ -813,7 +813,7 @@ exit:
813 retval = usb_submit_urb(urb, GFP_ATOMIC); 813 retval = usb_submit_urb(urb, GFP_ATOMIC);
814 if (retval != 0) { 814 if (retval != 0) {
815 err("%s - usb_submit_urb failed with result %d", 815 err("%s - usb_submit_urb failed with result %d",
816 __FUNCTION__, retval); 816 __func__, retval);
817 } 817 }
818} 818}
819 819
diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c
index 1e748e46d12e..b9b7a98bc5a5 100644
--- a/drivers/input/tablet/gtco.c
+++ b/drivers/input/tablet/gtco.c
@@ -863,7 +863,7 @@ static int gtco_probe(struct usb_interface *usbinterface,
863 gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL); 863 gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL);
864 if (!gtco->urbinfo) { 864 if (!gtco->urbinfo) {
865 err("Failed to allocate URB"); 865 err("Failed to allocate URB");
866 return -ENOMEM; 866 error = -ENOMEM;
867 goto err_free_buf; 867 goto err_free_buf;
868 } 868 }
869 869
diff --git a/drivers/input/tablet/kbtab.c b/drivers/input/tablet/kbtab.c
index f23f5a97fb38..d89112fa6e6b 100644
--- a/drivers/input/tablet/kbtab.c
+++ b/drivers/input/tablet/kbtab.c
@@ -56,10 +56,10 @@ static void kbtab_irq(struct urb *urb)
56 case -ENOENT: 56 case -ENOENT:
57 case -ESHUTDOWN: 57 case -ESHUTDOWN:
58 /* this urb is terminated, clean up */ 58 /* this urb is terminated, clean up */
59 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 59 dbg("%s - urb shutting down with status: %d", __func__, urb->status);
60 return; 60 return;
61 default: 61 default:
62 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); 62 dbg("%s - nonzero urb status received: %d", __func__, urb->status);
63 goto exit; 63 goto exit;
64 } 64 }
65 65
@@ -88,7 +88,7 @@ static void kbtab_irq(struct urb *urb)
88 retval = usb_submit_urb (urb, GFP_ATOMIC); 88 retval = usb_submit_urb (urb, GFP_ATOMIC);
89 if (retval) 89 if (retval)
90 err ("%s - usb_submit_urb failed with result %d", 90 err ("%s - usb_submit_urb failed with result %d",
91 __FUNCTION__, retval); 91 __func__, retval);
92} 92}
93 93
94static struct usb_device_id kbtab_ids[] = { 94static struct usb_device_id kbtab_ids[] = {
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
index 706619d06f71..ca62ec639f8f 100644
--- a/drivers/input/tablet/wacom.h
+++ b/drivers/input/tablet/wacom.h
@@ -105,7 +105,7 @@ struct wacom {
105 struct urb *irq; 105 struct urb *irq;
106 struct wacom_wac * wacom_wac; 106 struct wacom_wac * wacom_wac;
107 struct mutex lock; 107 struct mutex lock;
108 int open:1; 108 unsigned int open:1;
109 char phys[32]; 109 char phys[32];
110}; 110};
111 111
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index 71cc0c140790..5fbc463baf5a 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -56,10 +56,10 @@ static void wacom_sys_irq(struct urb *urb)
56 case -ENOENT: 56 case -ENOENT:
57 case -ESHUTDOWN: 57 case -ESHUTDOWN:
58 /* this urb is terminated, clean up */ 58 /* this urb is terminated, clean up */
59 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); 59 dbg("%s - urb shutting down with status: %d", __func__, urb->status);
60 return; 60 return;
61 default: 61 default:
62 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); 62 dbg("%s - nonzero urb status received: %d", __func__, urb->status);
63 goto exit; 63 goto exit;
64 } 64 }
65 65
@@ -74,7 +74,7 @@ static void wacom_sys_irq(struct urb *urb)
74 retval = usb_submit_urb (urb, GFP_ATOMIC); 74 retval = usb_submit_urb (urb, GFP_ATOMIC);
75 if (retval) 75 if (retval)
76 err ("%s - usb_submit_urb failed with result %d", 76 err ("%s - usb_submit_urb failed with result %d",
77 __FUNCTION__, retval); 77 __func__, retval);
78} 78}
79 79
80void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) 80void wacom_report_key(void *wcombo, unsigned int key_type, int key_data)
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 192513e1f04c..bf3d9a8b2c1b 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -56,7 +56,7 @@ static int wacom_penpartner_irq(struct wacom_wac *wacom, void *wcombo)
56static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo) 56static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo)
57{ 57{
58 unsigned char *data = wacom->data; 58 unsigned char *data = wacom->data;
59 int prox, id, pressure; 59 int prox, pressure;
60 60
61 if (data[0] != 2) { 61 if (data[0] != 2) {
62 dbg("wacom_pl_irq: received unknown report #%d", data[0]); 62 dbg("wacom_pl_irq: received unknown report #%d", data[0]);
@@ -65,7 +65,7 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo)
65 65
66 prox = data[1] & 0x40; 66 prox = data[1] & 0x40;
67 67
68 id = ERASER_DEVICE_ID; 68 wacom->id[0] = ERASER_DEVICE_ID;
69 if (prox) { 69 if (prox) {
70 70
71 pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); 71 pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
@@ -99,10 +99,10 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo)
99 if (wacom->tool[1] != BTN_TOOL_RUBBER) { 99 if (wacom->tool[1] != BTN_TOOL_RUBBER) {
100 /* Unknown tool selected default to pen tool */ 100 /* Unknown tool selected default to pen tool */
101 wacom->tool[1] = BTN_TOOL_PEN; 101 wacom->tool[1] = BTN_TOOL_PEN;
102 id = STYLUS_DEVICE_ID; 102 wacom->id[0] = STYLUS_DEVICE_ID;
103 } 103 }
104 wacom_report_key(wcombo, wacom->tool[1], prox); /* report in proximity for tool */ 104 wacom_report_key(wcombo, wacom->tool[1], prox); /* report in proximity for tool */
105 wacom_report_abs(wcombo, ABS_MISC, id); /* report tool id */ 105 wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */
106 wacom_report_abs(wcombo, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); 106 wacom_report_abs(wcombo, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
107 wacom_report_abs(wcombo, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); 107 wacom_report_abs(wcombo, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
108 wacom_report_abs(wcombo, ABS_PRESSURE, pressure); 108 wacom_report_abs(wcombo, ABS_PRESSURE, pressure);
@@ -127,7 +127,6 @@ static int wacom_pl_irq(struct wacom_wac *wacom, void *wcombo)
127static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo) 127static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo)
128{ 128{
129 unsigned char *data = wacom->data; 129 unsigned char *data = wacom->data;
130 int id;
131 130
132 if (data[0] != 2) { 131 if (data[0] != 2) {
133 printk(KERN_INFO "wacom_ptu_irq: received unknown report #%d\n", data[0]); 132 printk(KERN_INFO "wacom_ptu_irq: received unknown report #%d\n", data[0]);
@@ -137,13 +136,13 @@ static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo)
137 if (data[1] & 0x04) { 136 if (data[1] & 0x04) {
138 wacom_report_key(wcombo, BTN_TOOL_RUBBER, data[1] & 0x20); 137 wacom_report_key(wcombo, BTN_TOOL_RUBBER, data[1] & 0x20);
139 wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x08); 138 wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x08);
140 id = ERASER_DEVICE_ID; 139 wacom->id[0] = ERASER_DEVICE_ID;
141 } else { 140 } else {
142 wacom_report_key(wcombo, BTN_TOOL_PEN, data[1] & 0x20); 141 wacom_report_key(wcombo, BTN_TOOL_PEN, data[1] & 0x20);
143 wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01); 142 wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01);
144 id = STYLUS_DEVICE_ID; 143 wacom->id[0] = STYLUS_DEVICE_ID;
145 } 144 }
146 wacom_report_abs(wcombo, ABS_MISC, id); /* report tool id */ 145 wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */
147 wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); 146 wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2]));
148 wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); 147 wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4]));
149 wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6])); 148 wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6]));
@@ -155,27 +154,26 @@ static int wacom_ptu_irq(struct wacom_wac *wacom, void *wcombo)
155static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) 154static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
156{ 155{
157 unsigned char *data = wacom->data; 156 unsigned char *data = wacom->data;
158 int x, y, id, rw; 157 int x, y, rw;
159 158
160 if (data[0] != 2) { 159 if (data[0] != 2) {
161 dbg("wacom_graphire_irq: received unknown report #%d", data[0]); 160 dbg("wacom_graphire_irq: received unknown report #%d", data[0]);
162 return 0; 161 return 0;
163 } 162 }
164 163
165 id = STYLUS_DEVICE_ID; 164 if (data[1] & 0x80) {
166 if ((data[1] & 0x80) && ((data[1] & 0x07) || data[2] || data[3] || data[4]
167 || data[5] || data[6] || (data[7] & 0x07))) {
168 /* in prox and not a pad data */ 165 /* in prox and not a pad data */
169 166
170 switch ((data[1] >> 5) & 3) { 167 switch ((data[1] >> 5) & 3) {
171 168
172 case 0: /* Pen */ 169 case 0: /* Pen */
173 wacom->tool[0] = BTN_TOOL_PEN; 170 wacom->tool[0] = BTN_TOOL_PEN;
171 wacom->id[0] = STYLUS_DEVICE_ID;
174 break; 172 break;
175 173
176 case 1: /* Rubber */ 174 case 1: /* Rubber */
177 wacom->tool[0] = BTN_TOOL_RUBBER; 175 wacom->tool[0] = BTN_TOOL_RUBBER;
178 id = ERASER_DEVICE_ID; 176 wacom->id[0] = ERASER_DEVICE_ID;
179 break; 177 break;
180 178
181 case 2: /* Mouse with wheel */ 179 case 2: /* Mouse with wheel */
@@ -190,7 +188,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
190 188
191 case 3: /* Mouse without wheel */ 189 case 3: /* Mouse without wheel */
192 wacom->tool[0] = BTN_TOOL_MOUSE; 190 wacom->tool[0] = BTN_TOOL_MOUSE;
193 id = CURSOR_DEVICE_ID; 191 wacom->id[0] = CURSOR_DEVICE_ID;
194 wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); 192 wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01);
195 wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); 193 wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02);
196 if (wacom->features->type == WACOM_G4 || 194 if (wacom->features->type == WACOM_G4 ||
@@ -210,9 +208,9 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
210 wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); 208 wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02);
211 wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04); 209 wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04);
212 } 210 }
213 wacom_report_abs(wcombo, ABS_MISC, id); /* report tool id */ 211 wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */
214 wacom_report_key(wcombo, wacom->tool[0], 1); 212 wacom_report_key(wcombo, wacom->tool[0], 1);
215 } else if (!(data[1] & 0x90)) { 213 } else if (wacom->id[0]) {
216 wacom_report_abs(wcombo, ABS_X, 0); 214 wacom_report_abs(wcombo, ABS_X, 0);
217 wacom_report_abs(wcombo, ABS_Y, 0); 215 wacom_report_abs(wcombo, ABS_Y, 0);
218 if (wacom->tool[0] == BTN_TOOL_MOUSE) { 216 if (wacom->tool[0] == BTN_TOOL_MOUSE) {
@@ -225,6 +223,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
225 wacom_report_key(wcombo, BTN_STYLUS, 0); 223 wacom_report_key(wcombo, BTN_STYLUS, 0);
226 wacom_report_key(wcombo, BTN_STYLUS2, 0); 224 wacom_report_key(wcombo, BTN_STYLUS2, 0);
227 } 225 }
226 wacom->id[0] = 0;
228 wacom_report_abs(wcombo, ABS_MISC, 0); /* reset tool id */ 227 wacom_report_abs(wcombo, ABS_MISC, 0); /* reset tool id */
229 wacom_report_key(wcombo, wacom->tool[0], 0); 228 wacom_report_key(wcombo, wacom->tool[0], 0);
230 } 229 }
@@ -234,13 +233,13 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
234 case WACOM_G4: 233 case WACOM_G4:
235 if (data[7] & 0xf8) { 234 if (data[7] & 0xf8) {
236 wacom_input_sync(wcombo); /* sync last event */ 235 wacom_input_sync(wcombo); /* sync last event */
237 wacom->id[1] = 1; 236 wacom->id[1] = PAD_DEVICE_ID;
238 wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); 237 wacom_report_key(wcombo, BTN_0, (data[7] & 0x40));
239 wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); 238 wacom_report_key(wcombo, BTN_4, (data[7] & 0x80));
240 rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); 239 rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3);
241 wacom_report_rel(wcombo, REL_WHEEL, rw); 240 wacom_report_rel(wcombo, REL_WHEEL, rw);
242 wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); 241 wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0);
243 wacom_report_abs(wcombo, ABS_MISC, PAD_DEVICE_ID); 242 wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]);
244 wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); 243 wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0);
245 } else if (wacom->id[1]) { 244 } else if (wacom->id[1]) {
246 wacom_input_sync(wcombo); /* sync last event */ 245 wacom_input_sync(wcombo); /* sync last event */
@@ -255,14 +254,14 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
255 case WACOM_MO: 254 case WACOM_MO:
256 if ((data[7] & 0xf8) || (data[8] & 0xff)) { 255 if ((data[7] & 0xf8) || (data[8] & 0xff)) {
257 wacom_input_sync(wcombo); /* sync last event */ 256 wacom_input_sync(wcombo); /* sync last event */
258 wacom->id[1] = 1; 257 wacom->id[1] = PAD_DEVICE_ID;
259 wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); 258 wacom_report_key(wcombo, BTN_0, (data[7] & 0x08));
260 wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); 259 wacom_report_key(wcombo, BTN_1, (data[7] & 0x20));
261 wacom_report_key(wcombo, BTN_4, (data[7] & 0x10)); 260 wacom_report_key(wcombo, BTN_4, (data[7] & 0x10));
262 wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); 261 wacom_report_key(wcombo, BTN_5, (data[7] & 0x40));
263 wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); 262 wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f));
264 wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); 263 wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0);
265 wacom_report_abs(wcombo, ABS_MISC, PAD_DEVICE_ID); 264 wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]);
266 wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); 265 wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0);
267 } else if (wacom->id[1]) { 266 } else if (wacom->id[1]) {
268 wacom_input_sync(wcombo); /* sync last event */ 267 wacom_input_sync(wcombo); /* sync last event */
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 565ec711c2ee..e57366521572 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -103,6 +103,18 @@ config TOUCHSCREEN_MTOUCH
103 To compile this driver as a module, choose M here: the 103 To compile this driver as a module, choose M here: the
104 module will be called mtouch. 104 module will be called mtouch.
105 105
106config TOUCHSCREEN_INEXIO
107 tristate "iNexio serial touchscreens"
108 select SERIO
109 help
110 Say Y here if you have an iNexio serial touchscreen connected to
111 your system.
112
113 If unsure, say N.
114
115 To compile this driver as a module, choose M here: the
116 module will be called inexio.
117
106config TOUCHSCREEN_MK712 118config TOUCHSCREEN_MK712
107 tristate "ICS MicroClock MK712 touchscreen" 119 tristate "ICS MicroClock MK712 touchscreen"
108 help 120 help
@@ -134,6 +146,18 @@ config TOUCHSCREEN_HP7XX
134 To compile this driver as a module, choose M here: the 146 To compile this driver as a module, choose M here: the
135 module will be called jornada720_ts. 147 module will be called jornada720_ts.
136 148
149config TOUCHSCREEN_HTCPEN
150 tristate "HTC Shift X9500 touchscreen"
151 depends on ISA
152 help
153 Say Y here if you have an HTC Shift UMPC also known as HTC X9500
154 Clio / Shangrila and want to support the built-in touchscreen.
155
156 If unsure, say N.
157
158 To compile this driver as a module, choose M here: the
159 module will be called htcpen.
160
137config TOUCHSCREEN_PENMOUNT 161config TOUCHSCREEN_PENMOUNT
138 tristate "Penmount serial touchscreen" 162 tristate "Penmount serial touchscreen"
139 select SERIO 163 select SERIO
@@ -146,6 +170,17 @@ config TOUCHSCREEN_PENMOUNT
146 To compile this driver as a module, choose M here: the 170 To compile this driver as a module, choose M here: the
147 module will be called penmount. 171 module will be called penmount.
148 172
173config TOUCHSCREEN_MIGOR
174 tristate "Renesas MIGO-R touchscreen"
175 depends on SH_MIGOR && I2C
176 help
177 Say Y here to enable MIGO-R touchscreen support.
178
179 If unsure, say N.
180
181 To compile this driver as a module, choose M here: the
182 module will be called migor_ts.
183
149config TOUCHSCREEN_TOUCHRIGHT 184config TOUCHSCREEN_TOUCHRIGHT
150 tristate "Touchright serial touchscreen" 185 tristate "Touchright serial touchscreen"
151 select SERIO 186 select SERIO
@@ -316,4 +351,15 @@ config TOUCHSCREEN_USB_GOTOP
316 bool "GoTop Super_Q2/GogoPen/PenPower tablet device support" if EMBEDDED 351 bool "GoTop Super_Q2/GogoPen/PenPower tablet device support" if EMBEDDED
317 depends on TOUCHSCREEN_USB_COMPOSITE 352 depends on TOUCHSCREEN_USB_COMPOSITE
318 353
354config TOUCHSCREEN_TOUCHIT213
355 tristate "Sahara TouchIT-213 touchscreen"
356 select SERIO
357 help
358 Say Y here if you have a Sahara TouchIT-213 Tablet PC.
359
360 If unsure, say N.
361
362 To compile this driver as a module, choose M here: the
363 module will be called touchit213.
364
319endif 365endif
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 3c096d75651d..39a804cd80f1 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -12,12 +12,16 @@ obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o
12obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o 12obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o
13obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o 13obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o
14obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o 14obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o
15obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o
16obj-$(CONFIG_TOUCHSCREEN_MIGOR) += migor_ts.o
15obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o 17obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o
16obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o 18obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o
17obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o 19obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o
18obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o 20obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o
21obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o
19obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o 22obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o
20obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o 23obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o
24obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
21obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o 25obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
22obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o 26obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
23obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o 27obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o
diff --git a/drivers/input/touchscreen/gunze.c b/drivers/input/touchscreen/gunze.c
index a48a15868c4a..a54f90e02ab6 100644
--- a/drivers/input/touchscreen/gunze.c
+++ b/drivers/input/touchscreen/gunze.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: gunze.c,v 1.12 2001/09/25 10:12:07 vojtech Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
5 */ 3 */
6 4
diff --git a/drivers/input/touchscreen/h3600_ts_input.c b/drivers/input/touchscreen/h3600_ts_input.c
index 28ae15ed12c5..4f86081dc7fc 100644
--- a/drivers/input/touchscreen/h3600_ts_input.c
+++ b/drivers/input/touchscreen/h3600_ts_input.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * $Id: h3600_ts_input.c,v 1.4 2002/01/23 06:39:37 jsimmons Exp $
3 *
4 * Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com 2 * Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com
5 * 3 *
6 * Sponsored by Transvirtual Technology. 4 * Sponsored by Transvirtual Technology.
diff --git a/drivers/input/touchscreen/htcpen.c b/drivers/input/touchscreen/htcpen.c
new file mode 100644
index 000000000000..62811de6f18f
--- /dev/null
+++ b/drivers/input/touchscreen/htcpen.c
@@ -0,0 +1,255 @@
1/*
2 * HTC Shift touchscreen driver
3 *
4 * Copyright (C) 2008 Pau Oliva Fora <pof@eslack.org>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 */
10
11#include <linux/errno.h>
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/input.h>
15#include <linux/interrupt.h>
16#include <linux/io.h>
17#include <linux/init.h>
18#include <linux/irq.h>
19#include <linux/isa.h>
20#include <linux/ioport.h>
21#include <linux/dmi.h>
22
23MODULE_AUTHOR("Pau Oliva Fora <pau@eslack.org>");
24MODULE_DESCRIPTION("HTC Shift touchscreen driver");
25MODULE_LICENSE("GPL");
26
27#define HTCPEN_PORT_IRQ_CLEAR 0x068
28#define HTCPEN_PORT_INIT 0x06c
29#define HTCPEN_PORT_INDEX 0x0250
30#define HTCPEN_PORT_DATA 0x0251
31#define HTCPEN_IRQ 3
32
33#define DEVICE_ENABLE 0xa2
34#define DEVICE_DISABLE 0xa3
35
36#define X_INDEX 3
37#define Y_INDEX 5
38#define TOUCH_INDEX 0xb
39#define LSB_XY_INDEX 0xc
40#define X_AXIS_MAX 2040
41#define Y_AXIS_MAX 2040
42
43static int invert_x;
44module_param(invert_x, bool, 0644);
45MODULE_PARM_DESC(invert_x, "If set, X axis is inverted");
46static int invert_y;
47module_param(invert_y, bool, 0644);
48MODULE_PARM_DESC(invert_y, "If set, Y axis is inverted");
49
50static struct pnp_device_id pnp_ids[] = {
51 { .id = "PNP0cc0" },
52 { .id = "" }
53};
54MODULE_DEVICE_TABLE(pnp, pnp_ids);
55
56static irqreturn_t htcpen_interrupt(int irq, void *handle)
57{
58 struct input_dev *htcpen_dev = handle;
59 unsigned short x, y, xy;
60
61 /* 0 = press; 1 = release */
62 outb_p(TOUCH_INDEX, HTCPEN_PORT_INDEX);
63
64 if (inb_p(HTCPEN_PORT_DATA)) {
65 input_report_key(htcpen_dev, BTN_TOUCH, 0);
66 } else {
67 outb_p(X_INDEX, HTCPEN_PORT_INDEX);
68 x = inb_p(HTCPEN_PORT_DATA);
69
70 outb_p(Y_INDEX, HTCPEN_PORT_INDEX);
71 y = inb_p(HTCPEN_PORT_DATA);
72
73 outb_p(LSB_XY_INDEX, HTCPEN_PORT_INDEX);
74 xy = inb_p(HTCPEN_PORT_DATA);
75
76 /* get high resolution value of X and Y using LSB */
77 x = X_AXIS_MAX - ((x * 8) + ((xy >> 4) & 0xf));
78 y = (y * 8) + (xy & 0xf);
79 if (invert_x)
80 x = X_AXIS_MAX - x;
81 if (invert_y)
82 y = Y_AXIS_MAX - y;
83
84 if (x != X_AXIS_MAX && x != 0) {
85 input_report_key(htcpen_dev, BTN_TOUCH, 1);
86 input_report_abs(htcpen_dev, ABS_X, x);
87 input_report_abs(htcpen_dev, ABS_Y, y);
88 }
89 }
90
91 input_sync(htcpen_dev);
92
93 inb_p(HTCPEN_PORT_IRQ_CLEAR);
94
95 return IRQ_HANDLED;
96}
97
98static int htcpen_open(struct input_dev *dev)
99{
100 outb_p(DEVICE_ENABLE, HTCPEN_PORT_INIT);
101
102 return 0;
103}
104
105static void htcpen_close(struct input_dev *dev)
106{
107 outb_p(DEVICE_DISABLE, HTCPEN_PORT_INIT);
108 synchronize_irq(HTCPEN_IRQ);
109}
110
111static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id)
112{
113 struct input_dev *htcpen_dev;
114 int err = -EBUSY;
115
116 if (!request_region(HTCPEN_PORT_IRQ_CLEAR, 1, "htcpen")) {
117 printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n",
118 HTCPEN_PORT_IRQ_CLEAR);
119 goto request_region1_failed;
120 }
121
122 if (!request_region(HTCPEN_PORT_INIT, 1, "htcpen")) {
123 printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n",
124 HTCPEN_PORT_INIT);
125 goto request_region2_failed;
126 }
127
128 if (!request_region(HTCPEN_PORT_INDEX, 2, "htcpen")) {
129 printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n",
130 HTCPEN_PORT_INDEX);
131 goto request_region3_failed;
132 }
133
134 htcpen_dev = input_allocate_device();
135 if (!htcpen_dev) {
136 printk(KERN_ERR "htcpen: can't allocate device\n");
137 err = -ENOMEM;
138 goto input_alloc_failed;
139 }
140
141 htcpen_dev->name = "HTC Shift EC TouchScreen";
142 htcpen_dev->id.bustype = BUS_ISA;
143
144 htcpen_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY);
145 htcpen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
146 input_set_abs_params(htcpen_dev, ABS_X, 0, X_AXIS_MAX, 0, 0);
147 input_set_abs_params(htcpen_dev, ABS_Y, 0, Y_AXIS_MAX, 0, 0);
148
149 htcpen_dev->open = htcpen_open;
150 htcpen_dev->close = htcpen_close;
151
152 err = request_irq(HTCPEN_IRQ, htcpen_interrupt, 0, "htcpen",
153 htcpen_dev);
154 if (err) {
155 printk(KERN_ERR "htcpen: irq busy\n");
156 goto request_irq_failed;
157 }
158
159 inb_p(HTCPEN_PORT_IRQ_CLEAR);
160
161 err = input_register_device(htcpen_dev);
162 if (err)
163 goto input_register_failed;
164
165 dev_set_drvdata(dev, htcpen_dev);
166
167 return 0;
168
169 input_register_failed:
170 free_irq(HTCPEN_IRQ, htcpen_dev);
171 request_irq_failed:
172 input_free_device(htcpen_dev);
173 input_alloc_failed:
174 release_region(HTCPEN_PORT_INDEX, 2);
175 request_region3_failed:
176 release_region(HTCPEN_PORT_INIT, 1);
177 request_region2_failed:
178 release_region(HTCPEN_PORT_IRQ_CLEAR, 1);
179 request_region1_failed:
180 return err;
181}
182
183static int __devexit htcpen_isa_remove(struct device *dev, unsigned int id)
184{
185 struct input_dev *htcpen_dev = dev_get_drvdata(dev);
186
187 input_unregister_device(htcpen_dev);
188
189 free_irq(HTCPEN_IRQ, htcpen_dev);
190
191 release_region(HTCPEN_PORT_INDEX, 2);
192 release_region(HTCPEN_PORT_INIT, 1);
193 release_region(HTCPEN_PORT_IRQ_CLEAR, 1);
194
195 dev_set_drvdata(dev, NULL);
196
197 return 0;
198}
199
200#ifdef CONFIG_PM
201static int htcpen_isa_suspend(struct device *dev, unsigned int n,
202 pm_message_t state)
203{
204 outb_p(DEVICE_DISABLE, HTCPEN_PORT_INIT);
205
206 return 0;
207}
208
209static int htcpen_isa_resume(struct device *dev, unsigned int n)
210{
211 outb_p(DEVICE_ENABLE, HTCPEN_PORT_INIT);
212
213 return 0;
214}
215#endif
216
217static struct isa_driver htcpen_isa_driver = {
218 .probe = htcpen_isa_probe,
219 .remove = __devexit_p(htcpen_isa_remove),
220#ifdef CONFIG_PM
221 .suspend = htcpen_isa_suspend,
222 .resume = htcpen_isa_resume,
223#endif
224 .driver = {
225 .owner = THIS_MODULE,
226 .name = "htcpen",
227 }
228};
229
230static struct dmi_system_id __initdata htcshift_dmi_table[] = {
231 {
232 .ident = "Shift",
233 .matches = {
234 DMI_MATCH(DMI_SYS_VENDOR, "High Tech Computer Corp"),
235 DMI_MATCH(DMI_PRODUCT_NAME, "Shift"),
236 },
237 },
238 { }
239};
240
241static int __init htcpen_isa_init(void)
242{
243 if (!dmi_check_system(htcshift_dmi_table))
244 return -ENODEV;
245
246 return isa_register_driver(&htcpen_isa_driver, 1);
247}
248
249static void __exit htcpen_isa_exit(void)
250{
251 isa_unregister_driver(&htcpen_isa_driver);
252}
253
254module_init(htcpen_isa_init);
255module_exit(htcpen_isa_exit);
diff --git a/drivers/input/touchscreen/inexio.c b/drivers/input/touchscreen/inexio.c
new file mode 100644
index 000000000000..192ade0a0fb9
--- /dev/null
+++ b/drivers/input/touchscreen/inexio.c
@@ -0,0 +1,207 @@
1/*
2 * iNexio serial touchscreen driver
3 *
4 * Copyright (c) 2008 Richard Lemon
5 * Based on the mtouch driver (c) Vojtech Pavlik and Dan Streetman
6 *
7 */
8
9/*
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License version 2 as published by
12 * the Free Software Foundation.
13 */
14
15/*
16 * 2008/06/19 Richard Lemon <richard@codelemon.com>
17 * Copied mtouch.c and edited for iNexio protocol
18 */
19
20#include <linux/errno.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/slab.h>
24#include <linux/input.h>
25#include <linux/serio.h>
26#include <linux/init.h>
27
28#define DRIVER_DESC "iNexio serial touchscreen driver"
29
30MODULE_AUTHOR("Richard Lemon <richard@codelemon.com>");
31MODULE_DESCRIPTION(DRIVER_DESC);
32MODULE_LICENSE("GPL");
33
34/*
35 * Definitions & global arrays.
36 */
37
38#define INEXIO_FORMAT_TOUCH_BIT 0x01
39#define INEXIO_FORMAT_LENGTH 5
40#define INEXIO_RESPONSE_BEGIN_BYTE 0x80
41
42/* todo: check specs for max length of all responses */
43#define INEXIO_MAX_LENGTH 16
44
45#define INEXIO_MIN_XC 0
46#define INEXIO_MAX_XC 0x3fff
47#define INEXIO_MIN_YC 0
48#define INEXIO_MAX_YC 0x3fff
49
50#define INEXIO_GET_XC(data) (((data[1])<<7) | data[2])
51#define INEXIO_GET_YC(data) (((data[3])<<7) | data[4])
52#define INEXIO_GET_TOUCHED(data) (INEXIO_FORMAT_TOUCH_BIT & data[0])
53
54/*
55 * Per-touchscreen data.
56 */
57
58struct inexio {
59 struct input_dev *dev;
60 struct serio *serio;
61 int idx;
62 unsigned char data[INEXIO_MAX_LENGTH];
63 char phys[32];
64};
65
66static void inexio_process_data(struct inexio *pinexio)
67{
68 struct input_dev *dev = pinexio->dev;
69
70 if (INEXIO_FORMAT_LENGTH == ++pinexio->idx) {
71 input_report_abs(dev, ABS_X, INEXIO_GET_XC(pinexio->data));
72 input_report_abs(dev, ABS_Y, INEXIO_GET_YC(pinexio->data));
73 input_report_key(dev, BTN_TOUCH, INEXIO_GET_TOUCHED(pinexio->data));
74 input_sync(dev);
75
76 pinexio->idx = 0;
77 }
78}
79
80static irqreturn_t inexio_interrupt(struct serio *serio,
81 unsigned char data, unsigned int flags)
82{
83 struct inexio* pinexio = serio_get_drvdata(serio);
84
85 pinexio->data[pinexio->idx] = data;
86
87 if (INEXIO_RESPONSE_BEGIN_BYTE&pinexio->data[0])
88 inexio_process_data(pinexio);
89 else
90 printk(KERN_DEBUG "inexio.c: unknown/unsynchronized data from device, byte %x\n",pinexio->data[0]);
91
92 return IRQ_HANDLED;
93}
94
95/*
96 * inexio_disconnect() is the opposite of inexio_connect()
97 */
98
99static void inexio_disconnect(struct serio *serio)
100{
101 struct inexio* pinexio = serio_get_drvdata(serio);
102
103 input_get_device(pinexio->dev);
104 input_unregister_device(pinexio->dev);
105 serio_close(serio);
106 serio_set_drvdata(serio, NULL);
107 input_put_device(pinexio->dev);
108 kfree(pinexio);
109}
110
111/*
112 * inexio_connect() is the routine that is called when someone adds a
113 * new serio device that supports iNexio protocol and registers it as
114 * an input device. This is usually accomplished using inputattach.
115 */
116
117static int inexio_connect(struct serio *serio, struct serio_driver *drv)
118{
119 struct inexio *pinexio;
120 struct input_dev *input_dev;
121 int err;
122
123 pinexio = kzalloc(sizeof(struct inexio), GFP_KERNEL);
124 input_dev = input_allocate_device();
125 if (!pinexio || !input_dev) {
126 err = -ENOMEM;
127 goto fail1;
128 }
129
130 pinexio->serio = serio;
131 pinexio->dev = input_dev;
132 snprintf(pinexio->phys, sizeof(pinexio->phys), "%s/input0", serio->phys);
133
134 input_dev->name = "iNexio Serial TouchScreen";
135 input_dev->phys = pinexio->phys;
136 input_dev->id.bustype = BUS_RS232;
137 input_dev->id.vendor = SERIO_INEXIO;
138 input_dev->id.product = 0;
139 input_dev->id.version = 0x0001;
140 input_dev->dev.parent = &serio->dev;
141 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
142 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
143 input_set_abs_params(pinexio->dev, ABS_X, INEXIO_MIN_XC, INEXIO_MAX_XC, 0, 0);
144 input_set_abs_params(pinexio->dev, ABS_Y, INEXIO_MIN_YC, INEXIO_MAX_YC, 0, 0);
145
146 serio_set_drvdata(serio, pinexio);
147
148 err = serio_open(serio, drv);
149 if (err)
150 goto fail2;
151
152 err = input_register_device(pinexio->dev);
153 if (err)
154 goto fail3;
155
156 return 0;
157
158 fail3: serio_close(serio);
159 fail2: serio_set_drvdata(serio, NULL);
160 fail1: input_free_device(input_dev);
161 kfree(pinexio);
162 return err;
163}
164
165/*
166 * The serio driver structure.
167 */
168
169static struct serio_device_id inexio_serio_ids[] = {
170 {
171 .type = SERIO_RS232,
172 .proto = SERIO_INEXIO,
173 .id = SERIO_ANY,
174 .extra = SERIO_ANY,
175 },
176 { 0 }
177};
178
179MODULE_DEVICE_TABLE(serio, inexio_serio_ids);
180
181static struct serio_driver inexio_drv = {
182 .driver = {
183 .name = "inexio",
184 },
185 .description = DRIVER_DESC,
186 .id_table = inexio_serio_ids,
187 .interrupt = inexio_interrupt,
188 .connect = inexio_connect,
189 .disconnect = inexio_disconnect,
190};
191
192/*
193 * The functions for inserting/removing us as a module.
194 */
195
196static int __init inexio_init(void)
197{
198 return serio_register_driver(&inexio_drv);
199}
200
201static void __exit inexio_exit(void)
202{
203 serio_unregister_driver(&inexio_drv);
204}
205
206module_init(inexio_init);
207module_exit(inexio_exit);
diff --git a/drivers/input/touchscreen/migor_ts.c b/drivers/input/touchscreen/migor_ts.c
new file mode 100644
index 000000000000..c1cd99d58981
--- /dev/null
+++ b/drivers/input/touchscreen/migor_ts.c
@@ -0,0 +1,250 @@
1/*
2 * Touch Screen driver for Renesas MIGO-R Platform
3 *
4 * Copyright (c) 2008 Magnus Damm
5 * Copyright (c) 2007 Ujjwal Pande <ujjwal@kenati.com>,
6 * Kenati Technologies Pvt Ltd.
7 *
8 * This file is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This file is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22#include <linux/module.h>
23#include <linux/kernel.h>
24#include <linux/input.h>
25#include <linux/interrupt.h>
26#include <asm/io.h>
27#include <linux/i2c.h>
28#include <linux/timer.h>
29
30#define EVENT_PENDOWN 1
31#define EVENT_REPEAT 2
32#define EVENT_PENUP 3
33
34struct migor_ts_priv {
35 struct i2c_client *client;
36 struct input_dev *input;
37 struct delayed_work work;
38 int irq;
39};
40
41static const u_int8_t migor_ts_ena_seq[17] = { 0x33, 0x22, 0x11,
42 0x01, 0x06, 0x07, };
43static const u_int8_t migor_ts_dis_seq[17] = { };
44
45static void migor_ts_poscheck(struct work_struct *work)
46{
47 struct migor_ts_priv *priv = container_of(work,
48 struct migor_ts_priv,
49 work.work);
50 unsigned short xpos, ypos;
51 unsigned char event;
52 u_int8_t buf[16];
53
54 memset(buf, 0, sizeof(buf));
55
56 /* Set Index 0 */
57 buf[0] = 0;
58 if (i2c_master_send(priv->client, buf, 1) != 1) {
59 dev_err(&priv->client->dev, "Unable to write i2c index\n");
60 goto out;
61 }
62
63 /* Now do Page Read */
64 if (i2c_master_recv(priv->client, buf, sizeof(buf)) != sizeof(buf)) {
65 dev_err(&priv->client->dev, "Unable to read i2c page\n");
66 goto out;
67 }
68
69 ypos = ((buf[9] & 0x03) << 8 | buf[8]);
70 xpos = ((buf[11] & 0x03) << 8 | buf[10]);
71 event = buf[12];
72
73 if (event == EVENT_PENDOWN || event == EVENT_REPEAT) {
74 input_report_key(priv->input, BTN_TOUCH, 1);
75 input_report_abs(priv->input, ABS_X, ypos); /*X-Y swap*/
76 input_report_abs(priv->input, ABS_Y, xpos);
77 input_sync(priv->input);
78 } else if (event == EVENT_PENUP) {
79 input_report_key(priv->input, BTN_TOUCH, 0);
80 input_sync(priv->input);
81 }
82 out:
83 enable_irq(priv->irq);
84}
85
86static irqreturn_t migor_ts_isr(int irq, void *dev_id)
87{
88 struct migor_ts_priv *priv = dev_id;
89
90 /* the touch screen controller chip is hooked up to the cpu
91 * using i2c and a single interrupt line. the interrupt line
92 * is pulled low whenever someone taps the screen. to deassert
93 * the interrupt line we need to acknowledge the interrupt by
94 * communicating with the controller over the slow i2c bus.
95 *
96 * we can't acknowledge from interrupt context since the i2c
97 * bus controller may sleep, so we just disable the interrupt
98 * here and handle the acknowledge using delayed work.
99 */
100
101 disable_irq_nosync(irq);
102 schedule_delayed_work(&priv->work, HZ / 20);
103
104 return IRQ_HANDLED;
105}
106
107
108static int migor_ts_open(struct input_dev *dev)
109{
110 struct migor_ts_priv *priv = input_get_drvdata(dev);
111 struct i2c_client *client = priv->client;
112 int count;
113
114 /* enable controller */
115 count = i2c_master_send(client, migor_ts_ena_seq,
116 sizeof(migor_ts_ena_seq));
117 if (count != sizeof(migor_ts_ena_seq)) {
118 dev_err(&client->dev, "Unable to enable touchscreen.\n");
119 return -ENXIO;
120 }
121
122 return 0;
123}
124
125static void migor_ts_close(struct input_dev *dev)
126{
127 struct migor_ts_priv *priv = input_get_drvdata(dev);
128 struct i2c_client *client = priv->client;
129
130 disable_irq(priv->irq);
131
132 /* cancel pending work and wait for migor_ts_poscheck() to finish */
133 if (cancel_delayed_work_sync(&priv->work)) {
134 /*
135 * if migor_ts_poscheck was canceled we need to enable IRQ
136 * here to balance disable done in migor_ts_isr.
137 */
138 enable_irq(priv->irq);
139 }
140
141 /* disable controller */
142 i2c_master_send(client, migor_ts_dis_seq, sizeof(migor_ts_dis_seq));
143
144 enable_irq(priv->irq);
145}
146
147static int migor_ts_probe(struct i2c_client *client,
148 const struct i2c_device_id *idp)
149{
150 struct migor_ts_priv *priv;
151 struct input_dev *input;
152 int error;
153
154 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
155 if (!priv) {
156 dev_err(&client->dev, "failed to allocate driver data\n");
157 error = -ENOMEM;
158 goto err0;
159 }
160
161 dev_set_drvdata(&client->dev, priv);
162
163 input = input_allocate_device();
164 if (!input) {
165 dev_err(&client->dev, "Failed to allocate input device.\n");
166 error = -ENOMEM;
167 goto err1;
168 }
169
170 input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
171 input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
172
173 input_set_abs_params(input, ABS_X, 95, 955, 0, 0);
174 input_set_abs_params(input, ABS_Y, 85, 935, 0, 0);
175
176 input->name = client->driver_name;
177 input->id.bustype = BUS_I2C;
178 input->dev.parent = &client->dev;
179
180 input->open = migor_ts_open;
181 input->close = migor_ts_close;
182
183 input_set_drvdata(input, priv);
184
185 priv->client = client;
186 priv->input = input;
187 INIT_DELAYED_WORK(&priv->work, migor_ts_poscheck);
188 priv->irq = client->irq;
189
190 error = input_register_device(input);
191 if (error)
192 goto err1;
193
194 error = request_irq(priv->irq, migor_ts_isr, IRQF_TRIGGER_LOW,
195 client->driver_name, priv);
196 if (error) {
197 dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
198 goto err2;
199 }
200
201 return 0;
202
203 err2:
204 input_unregister_device(input);
205 input = NULL; /* so we dont try to free it below */
206 err1:
207 input_free_device(input);
208 kfree(priv);
209 err0:
210 dev_set_drvdata(&client->dev, NULL);
211 return error;
212}
213
214static int migor_ts_remove(struct i2c_client *client)
215{
216 struct migor_ts_priv *priv = dev_get_drvdata(&client->dev);
217
218 free_irq(priv->irq, priv);
219 input_unregister_device(priv->input);
220 kfree(priv);
221
222 dev_set_drvdata(&client->dev, NULL);
223
224 return 0;
225}
226
227static struct i2c_driver migor_ts_driver = {
228 .driver = {
229 .name = "migor_ts",
230 },
231 .probe = migor_ts_probe,
232 .remove = migor_ts_remove,
233};
234
235static int __init migor_ts_init(void)
236{
237 return i2c_add_driver(&migor_ts_driver);
238}
239
240static void __exit migor_ts_exit(void)
241{
242 i2c_del_driver(&migor_ts_driver);
243}
244
245MODULE_DESCRIPTION("MigoR Touchscreen driver");
246MODULE_AUTHOR("Magnus Damm <damm@opensource.se>");
247MODULE_LICENSE("GPL");
248
249module_init(migor_ts_init);
250module_exit(migor_ts_exit);
diff --git a/drivers/input/touchscreen/touchit213.c b/drivers/input/touchscreen/touchit213.c
new file mode 100644
index 000000000000..d1297ba19daf
--- /dev/null
+++ b/drivers/input/touchscreen/touchit213.c
@@ -0,0 +1,234 @@
1/*
2 * Sahara TouchIT-213 serial touchscreen driver
3 *
4 * Copyright (c) 2007-2008 Claudio Nieder <private@claudio.ch>
5 *
6 * Based on Touchright driver (drivers/input/touchscreen/touchright.c)
7 * Copyright (c) 2006 Rick Koch <n1gp@hotmail.com>
8 * Copyright (c) 2004 Vojtech Pavlik
9 * and Dan Streetman <ddstreet@ieee.org>
10 */
11
12/*
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU General Public License version 2 as published
15 * by the Free Software Foundation.
16 */
17
18#include <linux/errno.h>
19#include <linux/kernel.h>
20#include <linux/module.h>
21#include <linux/slab.h>
22#include <linux/input.h>
23#include <linux/serio.h>
24#include <linux/init.h>
25
26#define DRIVER_DESC "Sahara TouchIT-213 serial touchscreen driver"
27
28MODULE_AUTHOR("Claudio Nieder <private@claudio.ch>");
29MODULE_DESCRIPTION(DRIVER_DESC);
30MODULE_LICENSE("GPL");
31
32/*
33 * Definitions & global arrays.
34 */
35
36/*
37 * Data is received through COM1 at 9600bit/s,8bit,no parity in packets
38 * of 5 byte each.
39 *
40 * +--------+ +--------+ +--------+ +--------+ +--------+
41 * |1000000p| |0xxxxxxx| |0xxxxxxx| |0yyyyyyy| |0yyyyyyy|
42 * +--------+ +--------+ +--------+ +--------+ +--------+
43 * MSB LSB MSB LSB
44 *
45 * The value of p is 1 as long as the screen is touched and 0 when
46 * reporting the location where touching stopped, e.g. where the pen was
47 * lifted from the screen.
48 *
49 * When holding the screen in landscape mode as the BIOS text output is
50 * presented, x is the horizontal axis with values growing from left to
51 * right and y is the vertical axis with values growing from top to
52 * bottom.
53 *
54 * When holding the screen in portrait mode with the Sahara logo in its
55 * correct position, x ist the vertical axis with values growing from
56 * top to bottom and y is the horizontal axis with values growing from
57 * right to left.
58 */
59
60#define T213_FORMAT_TOUCH_BIT 0x01
61#define T213_FORMAT_STATUS_BYTE 0x80
62#define T213_FORMAT_STATUS_MASK ~T213_FORMAT_TOUCH_BIT
63
64/*
65 * On my Sahara Touch-IT 213 I have observed x values from 0 to 0x7f0
66 * and y values from 0x1d to 0x7e9, so the actual measurement is
67 * probably done with an 11 bit precision.
68 */
69#define T213_MIN_XC 0
70#define T213_MAX_XC 0x07ff
71#define T213_MIN_YC 0
72#define T213_MAX_YC 0x07ff
73
74/*
75 * Per-touchscreen data.
76 */
77
78struct touchit213 {
79 struct input_dev *dev;
80 struct serio *serio;
81 int idx;
82 unsigned char csum;
83 unsigned char data[5];
84 char phys[32];
85};
86
87static irqreturn_t touchit213_interrupt(struct serio *serio,
88 unsigned char data, unsigned int flags)
89{
90 struct touchit213 *touchit213 = serio_get_drvdata(serio);
91 struct input_dev *dev = touchit213->dev;
92
93 touchit213->data[touchit213->idx] = data;
94
95 switch (touchit213->idx++) {
96 case 0:
97 if ((touchit213->data[0] & T213_FORMAT_STATUS_MASK) !=
98 T213_FORMAT_STATUS_BYTE) {
99 pr_debug("unsynchronized data: 0x%02x\n", data);
100 touchit213->idx = 0;
101 }
102 break;
103
104 case 4:
105 touchit213->idx = 0;
106 input_report_abs(dev, ABS_X,
107 (touchit213->data[1] << 7) | touchit213->data[2]);
108 input_report_abs(dev, ABS_Y,
109 (touchit213->data[3] << 7) | touchit213->data[4]);
110 input_report_key(dev, BTN_TOUCH,
111 touchit213->data[0] & T213_FORMAT_TOUCH_BIT);
112 input_sync(dev);
113 break;
114 }
115
116 return IRQ_HANDLED;
117}
118
119/*
120 * touchit213_disconnect() is the opposite of touchit213_connect()
121 */
122
123static void touchit213_disconnect(struct serio *serio)
124{
125 struct touchit213 *touchit213 = serio_get_drvdata(serio);
126
127 input_get_device(touchit213->dev);
128 input_unregister_device(touchit213->dev);
129 serio_close(serio);
130 serio_set_drvdata(serio, NULL);
131 input_put_device(touchit213->dev);
132 kfree(touchit213);
133}
134
135/*
136 * touchit213_connect() is the routine that is called when someone adds a
137 * new serio device that supports the Touchright protocol and registers it as
138 * an input device.
139 */
140
141static int touchit213_connect(struct serio *serio, struct serio_driver *drv)
142{
143 struct touchit213 *touchit213;
144 struct input_dev *input_dev;
145 int err;
146
147 touchit213 = kzalloc(sizeof(struct touchit213), GFP_KERNEL);
148 input_dev = input_allocate_device();
149 if (!touchit213 || !input_dev) {
150 err = -ENOMEM;
151 goto fail1;
152 }
153
154 touchit213->serio = serio;
155 touchit213->dev = input_dev;
156 snprintf(touchit213->phys, sizeof(touchit213->phys),
157 "%s/input0", serio->phys);
158
159 input_dev->name = "Sahara Touch-iT213 Serial TouchScreen";
160 input_dev->phys = touchit213->phys;
161 input_dev->id.bustype = BUS_RS232;
162 input_dev->id.vendor = SERIO_TOUCHIT213;
163 input_dev->id.product = 0;
164 input_dev->id.version = 0x0100;
165 input_dev->dev.parent = &serio->dev;
166 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
167 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
168 input_set_abs_params(touchit213->dev, ABS_X,
169 T213_MIN_XC, T213_MAX_XC, 0, 0);
170 input_set_abs_params(touchit213->dev, ABS_Y,
171 T213_MIN_YC, T213_MAX_YC, 0, 0);
172
173 serio_set_drvdata(serio, touchit213);
174
175 err = serio_open(serio, drv);
176 if (err)
177 goto fail2;
178
179 err = input_register_device(touchit213->dev);
180 if (err)
181 goto fail3;
182
183 return 0;
184
185 fail3: serio_close(serio);
186 fail2: serio_set_drvdata(serio, NULL);
187 fail1: input_free_device(input_dev);
188 kfree(touchit213);
189 return err;
190}
191
192/*
193 * The serio driver structure.
194 */
195
196static struct serio_device_id touchit213_serio_ids[] = {
197 {
198 .type = SERIO_RS232,
199 .proto = SERIO_TOUCHIT213,
200 .id = SERIO_ANY,
201 .extra = SERIO_ANY,
202 },
203 { 0 }
204};
205
206MODULE_DEVICE_TABLE(serio, touchit213_serio_ids);
207
208static struct serio_driver touchit213_drv = {
209 .driver = {
210 .name = "touchit213",
211 },
212 .description = DRIVER_DESC,
213 .id_table = touchit213_serio_ids,
214 .interrupt = touchit213_interrupt,
215 .connect = touchit213_connect,
216 .disconnect = touchit213_disconnect,
217};
218
219/*
220 * The functions for inserting/removing us as a module.
221 */
222
223static int __init touchit213_init(void)
224{
225 return serio_register_driver(&touchit213_drv);
226}
227
228static void __exit touchit213_exit(void)
229{
230 serio_unregister_driver(&touchit213_drv);
231}
232
233module_init(touchit213_init);
234module_exit(touchit213_exit);
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
index 3a0a8ca57076..fdd645c214a2 100644
--- a/drivers/input/touchscreen/usbtouchscreen.c
+++ b/drivers/input/touchscreen/usbtouchscreen.c
@@ -49,6 +49,7 @@
49#include <linux/init.h> 49#include <linux/init.h>
50#include <linux/usb.h> 50#include <linux/usb.h>
51#include <linux/usb/input.h> 51#include <linux/usb/input.h>
52#include <linux/hid.h>
52 53
53 54
54#define DRIVER_VERSION "v0.6" 55#define DRIVER_VERSION "v0.6"
@@ -101,7 +102,7 @@ struct usbtouch_usb {
101 102
102/* device types */ 103/* device types */
103enum { 104enum {
104 DEVTPYE_DUMMY = -1, 105 DEVTYPE_IGNORE = -1,
105 DEVTYPE_EGALAX, 106 DEVTYPE_EGALAX,
106 DEVTYPE_PANJIT, 107 DEVTYPE_PANJIT,
107 DEVTYPE_3M, 108 DEVTYPE_3M,
@@ -115,8 +116,21 @@ enum {
115 DEVTYPE_GOTOP, 116 DEVTYPE_GOTOP,
116}; 117};
117 118
119#define USB_DEVICE_HID_CLASS(vend, prod) \
120 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \
121 | USB_DEVICE_ID_MATCH_DEVICE, \
122 .idVendor = (vend), \
123 .idProduct = (prod), \
124 .bInterfaceClass = USB_INTERFACE_CLASS_HID, \
125 .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE
126
118static struct usb_device_id usbtouch_devices[] = { 127static struct usb_device_id usbtouch_devices[] = {
119#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX 128#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX
129 /* ignore the HID capable devices, handled by usbhid */
130 {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE},
131 {USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE},
132
133 /* normal device IDs */
120 {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX}, 134 {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},
121 {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX}, 135 {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX},
122 {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX}, 136 {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX},
@@ -262,7 +276,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
262 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 276 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
263 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); 277 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
264 dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d", 278 dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d",
265 __FUNCTION__, ret); 279 __func__, ret);
266 if (ret < 0) 280 if (ret < 0)
267 return ret; 281 return ret;
268 msleep(150); 282 msleep(150);
@@ -273,7 +287,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
273 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 287 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
274 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); 288 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
275 dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", 289 dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d",
276 __FUNCTION__, ret); 290 __func__, ret);
277 if (ret >= 0) 291 if (ret >= 0)
278 break; 292 break;
279 if (ret != -EPIPE) 293 if (ret != -EPIPE)
@@ -793,18 +807,18 @@ static void usbtouch_irq(struct urb *urb)
793 case -ETIME: 807 case -ETIME:
794 /* this urb is timing out */ 808 /* this urb is timing out */
795 dbg("%s - urb timed out - was the device unplugged?", 809 dbg("%s - urb timed out - was the device unplugged?",
796 __FUNCTION__); 810 __func__);
797 return; 811 return;
798 case -ECONNRESET: 812 case -ECONNRESET:
799 case -ENOENT: 813 case -ENOENT:
800 case -ESHUTDOWN: 814 case -ESHUTDOWN:
801 /* this urb is terminated, clean up */ 815 /* this urb is terminated, clean up */
802 dbg("%s - urb shutting down with status: %d", 816 dbg("%s - urb shutting down with status: %d",
803 __FUNCTION__, urb->status); 817 __func__, urb->status);
804 return; 818 return;
805 default: 819 default:
806 dbg("%s - nonzero urb status received: %d", 820 dbg("%s - nonzero urb status received: %d",
807 __FUNCTION__, urb->status); 821 __func__, urb->status);
808 goto exit; 822 goto exit;
809 } 823 }
810 824
@@ -814,7 +828,7 @@ exit:
814 retval = usb_submit_urb(urb, GFP_ATOMIC); 828 retval = usb_submit_urb(urb, GFP_ATOMIC);
815 if (retval) 829 if (retval)
816 err("%s - usb_submit_urb failed with result: %d", 830 err("%s - usb_submit_urb failed with result: %d",
817 __FUNCTION__, retval); 831 __func__, retval);
818} 832}
819 833
820static int usbtouch_open(struct input_dev *input) 834static int usbtouch_open(struct input_dev *input)
@@ -857,6 +871,10 @@ static int usbtouch_probe(struct usb_interface *intf,
857 struct usbtouch_device_info *type; 871 struct usbtouch_device_info *type;
858 int err = -ENOMEM; 872 int err = -ENOMEM;
859 873
874 /* some devices are ignored */
875 if (id->driver_info == DEVTYPE_IGNORE)
876 return -ENODEV;
877
860 interface = intf->cur_altsetting; 878 interface = intf->cur_altsetting;
861 endpoint = &interface->endpoint[0].desc; 879 endpoint = &interface->endpoint[0].desc;
862 880
@@ -883,7 +901,7 @@ static int usbtouch_probe(struct usb_interface *intf,
883 901
884 usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); 902 usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL);
885 if (!usbtouch->irq) { 903 if (!usbtouch->irq) {
886 dbg("%s - usb_alloc_urb failed: usbtouch->irq", __FUNCTION__); 904 dbg("%s - usb_alloc_urb failed: usbtouch->irq", __func__);
887 goto out_free_buffers; 905 goto out_free_buffers;
888 } 906 }
889 907
@@ -939,14 +957,14 @@ static int usbtouch_probe(struct usb_interface *intf,
939 if (type->init) { 957 if (type->init) {
940 err = type->init(usbtouch); 958 err = type->init(usbtouch);
941 if (err) { 959 if (err) {
942 dbg("%s - type->init() failed, err: %d", __FUNCTION__, err); 960 dbg("%s - type->init() failed, err: %d", __func__, err);
943 goto out_free_buffers; 961 goto out_free_buffers;
944 } 962 }
945 } 963 }
946 964
947 err = input_register_device(usbtouch->input); 965 err = input_register_device(usbtouch->input);
948 if (err) { 966 if (err) {
949 dbg("%s - input_register_device failed, err: %d", __FUNCTION__, err); 967 dbg("%s - input_register_device failed, err: %d", __func__, err);
950 goto out_free_buffers; 968 goto out_free_buffers;
951 } 969 }
952 970
@@ -966,12 +984,12 @@ static void usbtouch_disconnect(struct usb_interface *intf)
966{ 984{
967 struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); 985 struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
968 986
969 dbg("%s - called", __FUNCTION__); 987 dbg("%s - called", __func__);
970 988
971 if (!usbtouch) 989 if (!usbtouch)
972 return; 990 return;
973 991
974 dbg("%s - usbtouch is initialized, cleaning up", __FUNCTION__); 992 dbg("%s - usbtouch is initialized, cleaning up", __func__);
975 usb_set_intfdata(intf, NULL); 993 usb_set_intfdata(intf, NULL);
976 usb_kill_urb(usbtouch->irq); 994 usb_kill_urb(usbtouch->irq);
977 input_unregister_device(usbtouch->input); 995 input_unregister_device(usbtouch->input);
diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c
index 0b6e4cfa6a21..4c5d85a249ae 100644
--- a/drivers/input/touchscreen/wm9712.c
+++ b/drivers/input/touchscreen/wm9712.c
@@ -168,6 +168,18 @@ static void wm9712_phy_init(struct wm97xx *wm)
168 64000 / rpu); 168 64000 / rpu);
169 } 169 }
170 170
171 /* WM9712 five wire */
172 if (five_wire) {
173 dig2 |= WM9712_45W;
174 dev_dbg(wm->dev, "setting 5-wire touchscreen mode.");
175
176 if (pil) {
177 dev_warn(wm->dev, "pressure measurement is not "
178 "supported in 5-wire mode\n");
179 pil = 0;
180 }
181 }
182
171 /* touchpanel pressure current*/ 183 /* touchpanel pressure current*/
172 if (pil == 2) { 184 if (pil == 2) {
173 dig2 |= WM9712_PIL; 185 dig2 |= WM9712_PIL;
@@ -179,12 +191,6 @@ static void wm9712_phy_init(struct wm97xx *wm)
179 if (!pil) 191 if (!pil)
180 pressure = 0; 192 pressure = 0;
181 193
182 /* WM9712 five wire */
183 if (five_wire) {
184 dig2 |= WM9712_45W;
185 dev_dbg(wm->dev, "setting 5-wire touchscreen mode.");
186 }
187
188 /* polling mode sample settling delay */ 194 /* polling mode sample settling delay */
189 if (delay < 0 || delay > 15) { 195 if (delay < 0 || delay > 15) {
190 dev_dbg(wm->dev, "supplied delay out of range."); 196 dev_dbg(wm->dev, "supplied delay out of range.");
diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c
index 8a35029caca0..871b0cbca5e4 100644
--- a/drivers/isdn/capi/capi.c
+++ b/drivers/isdn/capi/capi.c
@@ -1302,11 +1302,12 @@ static void capinc_tty_hangup(struct tty_struct *tty)
1302#endif 1302#endif
1303} 1303}
1304 1304
1305static void capinc_tty_break_ctl(struct tty_struct *tty, int state) 1305static int capinc_tty_break_ctl(struct tty_struct *tty, int state)
1306{ 1306{
1307#ifdef _DEBUG_TTYFUNCS 1307#ifdef _DEBUG_TTYFUNCS
1308 printk(KERN_DEBUG "capinc_tty_break_ctl(%d)\n", state); 1308 printk(KERN_DEBUG "capinc_tty_break_ctl(%d)\n", state);
1309#endif 1309#endif
1310 return 0;
1310} 1311}
1311 1312
1312static void capinc_tty_flush_buffer(struct tty_struct *tty) 1313static void capinc_tty_flush_buffer(struct tty_struct *tty)
@@ -1552,7 +1553,8 @@ static int __init capi_init(void)
1552 return PTR_ERR(capi_class); 1553 return PTR_ERR(capi_class);
1553 } 1554 }
1554 1555
1555 device_create(capi_class, NULL, MKDEV(capi_major, 0), "capi"); 1556 device_create_drvdata(capi_class, NULL, MKDEV(capi_major, 0), NULL,
1557 "capi");
1556 1558
1557#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE 1559#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1558 if (capinc_tty_init() < 0) { 1560 if (capinc_tty_init() < 0) {
diff --git a/drivers/isdn/gigaset/asyncdata.c b/drivers/isdn/gigaset/asyncdata.c
index 091deb9d1c47..c2bd97d29273 100644
--- a/drivers/isdn/gigaset/asyncdata.c
+++ b/drivers/isdn/gigaset/asyncdata.c
@@ -575,7 +575,8 @@ int gigaset_m10x_send_skb(struct bc_state *bcs, struct sk_buff *skb)
575 else 575 else
576 skb = iraw_encode(skb, HW_HDR_LEN, 0); 576 skb = iraw_encode(skb, HW_HDR_LEN, 0);
577 if (!skb) { 577 if (!skb) {
578 err("unable to allocate memory for encoding!\n"); 578 dev_err(bcs->cs->dev,
579 "unable to allocate memory for encoding!\n");
579 return -ENOMEM; 580 return -ENOMEM;
580 } 581 }
581 582
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c
index 5255b5e20e13..3f11910c7ccd 100644
--- a/drivers/isdn/gigaset/bas-gigaset.c
+++ b/drivers/isdn/gigaset/bas-gigaset.c
@@ -1050,10 +1050,9 @@ static int submit_iso_write_urb(struct isow_urbctx_t *ucx)
1050 } 1050 }
1051 1051
1052 /* retrieve block of data to send */ 1052 /* retrieve block of data to send */
1053 ifd->offset = gigaset_isowbuf_getbytes(ubc->isooutbuf, 1053 rc = gigaset_isowbuf_getbytes(ubc->isooutbuf, ifd->length);
1054 ifd->length); 1054 if (rc < 0) {
1055 if (ifd->offset < 0) { 1055 if (rc == -EBUSY) {
1056 if (ifd->offset == -EBUSY) {
1057 gig_dbg(DEBUG_ISO, 1056 gig_dbg(DEBUG_ISO,
1058 "%s: buffer busy at frame %d", 1057 "%s: buffer busy at frame %d",
1059 __func__, nframe); 1058 __func__, nframe);
@@ -1062,11 +1061,12 @@ static int submit_iso_write_urb(struct isow_urbctx_t *ucx)
1062 } else { 1061 } else {
1063 dev_err(ucx->bcs->cs->dev, 1062 dev_err(ucx->bcs->cs->dev,
1064 "%s: buffer error %d at frame %d\n", 1063 "%s: buffer error %d at frame %d\n",
1065 __func__, ifd->offset, nframe); 1064 __func__, rc, nframe);
1066 return ifd->offset; 1065 return rc;
1067 } 1066 }
1068 break; 1067 break;
1069 } 1068 }
1069 ifd->offset = rc;
1070 ucx->limit = ubc->isooutbuf->nextread; 1070 ucx->limit = ubc->isooutbuf->nextread;
1071 ifd->status = 0; 1071 ifd->status = 0;
1072 ifd->actual_length = 0; 1072 ifd->actual_length = 0;
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c
index 827c32c16795..9d3ce7718e58 100644
--- a/drivers/isdn/gigaset/common.c
+++ b/drivers/isdn/gigaset/common.c
@@ -287,7 +287,7 @@ struct event_t *gigaset_add_event(struct cardstate *cs,
287 tail = cs->ev_tail; 287 tail = cs->ev_tail;
288 next = (tail + 1) % MAX_EVENTS; 288 next = (tail + 1) % MAX_EVENTS;
289 if (unlikely(next == cs->ev_head)) 289 if (unlikely(next == cs->ev_head))
290 err("event queue full"); 290 dev_err(cs->dev, "event queue full\n");
291 else { 291 else {
292 event = cs->events + tail; 292 event = cs->events + tail;
293 event->type = type; 293 event->type = type;
diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h
index f365993161fc..003752954993 100644
--- a/drivers/isdn/gigaset/gigaset.h
+++ b/drivers/isdn/gigaset/gigaset.h
@@ -106,7 +106,6 @@ enum debuglevel {
106#undef err 106#undef err
107#undef info 107#undef info
108#undef warn 108#undef warn
109#undef notice
110 109
111#define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \ 110#define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \
112 format "\n" , ## arg) 111 format "\n" , ## arg)
@@ -114,8 +113,6 @@ enum debuglevel {
114 format "\n" , ## arg) 113 format "\n" , ## arg)
115#define warn(format, arg...) printk(KERN_WARNING KBUILD_MODNAME ": " \ 114#define warn(format, arg...) printk(KERN_WARNING KBUILD_MODNAME ": " \
116 format "\n" , ## arg) 115 format "\n" , ## arg)
117#define notice(format, arg...) printk(KERN_NOTICE KBUILD_MODNAME ": " \
118 format "\n" , ## arg)
119 116
120#ifdef CONFIG_GIGASET_DEBUG 117#ifdef CONFIG_GIGASET_DEBUG
121 118
diff --git a/drivers/isdn/gigaset/i4l.c b/drivers/isdn/gigaset/i4l.c
index 9e089f06a942..3c127a8cbaf2 100644
--- a/drivers/isdn/gigaset/i4l.c
+++ b/drivers/isdn/gigaset/i4l.c
@@ -46,7 +46,8 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
46 return -ENODEV; 46 return -ENODEV;
47 } 47 }
48 if (channel < 0 || channel >= cs->channels) { 48 if (channel < 0 || channel >= cs->channels) {
49 err("%s: invalid channel ID (%d)", __func__, channel); 49 dev_err(cs->dev, "%s: invalid channel ID (%d)\n",
50 __func__, channel);
50 return -ENODEV; 51 return -ENODEV;
51 } 52 }
52 bcs = &cs->bcs[channel]; 53 bcs = &cs->bcs[channel];
@@ -58,11 +59,13 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
58 59
59 if (!len) { 60 if (!len) {
60 if (ack) 61 if (ack)
61 notice("%s: not ACKing empty packet", __func__); 62 dev_notice(cs->dev, "%s: not ACKing empty packet\n",
63 __func__);
62 return 0; 64 return 0;
63 } 65 }
64 if (len > MAX_BUF_SIZE) { 66 if (len > MAX_BUF_SIZE) {
65 err("%s: packet too large (%d bytes)", __func__, len); 67 dev_err(cs->dev, "%s: packet too large (%d bytes)\n",
68 __func__, len);
66 return -EINVAL; 69 return -EINVAL;
67 } 70 }
68 71
@@ -116,8 +119,7 @@ static int command_from_LL(isdn_ctrl *cntrl)
116 gigaset_debugdrivers(); 119 gigaset_debugdrivers();
117 120
118 if (!cs) { 121 if (!cs) {
119 warn("LL tried to access unknown device with nr. %d", 122 err("%s: invalid driver ID (%d)", __func__, cntrl->driver);
120 cntrl->driver);
121 return -ENODEV; 123 return -ENODEV;
122 } 124 }
123 125
@@ -126,7 +128,7 @@ static int command_from_LL(isdn_ctrl *cntrl)
126 gig_dbg(DEBUG_ANY, "ISDN_CMD_IOCTL (driver: %d, arg: %ld)", 128 gig_dbg(DEBUG_ANY, "ISDN_CMD_IOCTL (driver: %d, arg: %ld)",
127 cntrl->driver, cntrl->arg); 129 cntrl->driver, cntrl->arg);
128 130
129 warn("ISDN_CMD_IOCTL is not supported."); 131 dev_warn(cs->dev, "ISDN_CMD_IOCTL not supported\n");
130 return -EINVAL; 132 return -EINVAL;
131 133
132 case ISDN_CMD_DIAL: 134 case ISDN_CMD_DIAL:
@@ -138,22 +140,23 @@ static int command_from_LL(isdn_ctrl *cntrl)
138 cntrl->parm.setup.si1, cntrl->parm.setup.si2); 140 cntrl->parm.setup.si1, cntrl->parm.setup.si2);
139 141
140 if (cntrl->arg >= cs->channels) { 142 if (cntrl->arg >= cs->channels) {
141 err("ISDN_CMD_DIAL: invalid channel (%d)", 143 dev_err(cs->dev,
142 (int) cntrl->arg); 144 "ISDN_CMD_DIAL: invalid channel (%d)\n",
145 (int) cntrl->arg);
143 return -EINVAL; 146 return -EINVAL;
144 } 147 }
145 148
146 bcs = cs->bcs + cntrl->arg; 149 bcs = cs->bcs + cntrl->arg;
147 150
148 if (!gigaset_get_channel(bcs)) { 151 if (!gigaset_get_channel(bcs)) {
149 err("ISDN_CMD_DIAL: channel not free"); 152 dev_err(cs->dev, "ISDN_CMD_DIAL: channel not free\n");
150 return -EBUSY; 153 return -EBUSY;
151 } 154 }
152 155
153 sp = kmalloc(sizeof *sp, GFP_ATOMIC); 156 sp = kmalloc(sizeof *sp, GFP_ATOMIC);
154 if (!sp) { 157 if (!sp) {
155 gigaset_free_channel(bcs); 158 gigaset_free_channel(bcs);
156 err("ISDN_CMD_DIAL: out of memory"); 159 dev_err(cs->dev, "ISDN_CMD_DIAL: out of memory\n");
157 return -ENOMEM; 160 return -ENOMEM;
158 } 161 }
159 *sp = cntrl->parm.setup; 162 *sp = cntrl->parm.setup;
@@ -173,8 +176,9 @@ static int command_from_LL(isdn_ctrl *cntrl)
173 gig_dbg(DEBUG_ANY, "ISDN_CMD_ACCEPTD"); 176 gig_dbg(DEBUG_ANY, "ISDN_CMD_ACCEPTD");
174 177
175 if (cntrl->arg >= cs->channels) { 178 if (cntrl->arg >= cs->channels) {
176 err("ISDN_CMD_ACCEPTD: invalid channel (%d)", 179 dev_err(cs->dev,
177 (int) cntrl->arg); 180 "ISDN_CMD_ACCEPTD: invalid channel (%d)\n",
181 (int) cntrl->arg);
178 return -EINVAL; 182 return -EINVAL;
179 } 183 }
180 184
@@ -196,8 +200,9 @@ static int command_from_LL(isdn_ctrl *cntrl)
196 (int) cntrl->arg); 200 (int) cntrl->arg);
197 201
198 if (cntrl->arg >= cs->channels) { 202 if (cntrl->arg >= cs->channels) {
199 err("ISDN_CMD_HANGUP: invalid channel (%u)", 203 dev_err(cs->dev,
200 (unsigned) cntrl->arg); 204 "ISDN_CMD_HANGUP: invalid channel (%d)\n",
205 (int) cntrl->arg);
201 return -EINVAL; 206 return -EINVAL;
202 } 207 }
203 208
@@ -224,8 +229,9 @@ static int command_from_LL(isdn_ctrl *cntrl)
224 cntrl->arg & 0xff, (cntrl->arg >> 8)); 229 cntrl->arg & 0xff, (cntrl->arg >> 8));
225 230
226 if ((cntrl->arg & 0xff) >= cs->channels) { 231 if ((cntrl->arg & 0xff) >= cs->channels) {
227 err("ISDN_CMD_SETL2: invalid channel (%u)", 232 dev_err(cs->dev,
228 (unsigned) cntrl->arg & 0xff); 233 "ISDN_CMD_SETL2: invalid channel (%d)\n",
234 (int) cntrl->arg & 0xff);
229 return -EINVAL; 235 return -EINVAL;
230 } 236 }
231 237
@@ -244,14 +250,16 @@ static int command_from_LL(isdn_ctrl *cntrl)
244 cntrl->arg & 0xff, (cntrl->arg >> 8)); 250 cntrl->arg & 0xff, (cntrl->arg >> 8));
245 251
246 if ((cntrl->arg & 0xff) >= cs->channels) { 252 if ((cntrl->arg & 0xff) >= cs->channels) {
247 err("ISDN_CMD_SETL3: invalid channel (%u)", 253 dev_err(cs->dev,
248 (unsigned) cntrl->arg & 0xff); 254 "ISDN_CMD_SETL3: invalid channel (%d)\n",
255 (int) cntrl->arg & 0xff);
249 return -EINVAL; 256 return -EINVAL;
250 } 257 }
251 258
252 if (cntrl->arg >> 8 != ISDN_PROTO_L3_TRANS) { 259 if (cntrl->arg >> 8 != ISDN_PROTO_L3_TRANS) {
253 err("ISDN_CMD_SETL3: invalid protocol %lu", 260 dev_err(cs->dev,
254 cntrl->arg >> 8); 261 "ISDN_CMD_SETL3: invalid protocol %lu\n",
262 cntrl->arg >> 8);
255 return -EINVAL; 263 return -EINVAL;
256 } 264 }
257 265
@@ -262,8 +270,9 @@ static int command_from_LL(isdn_ctrl *cntrl)
262 case ISDN_CMD_ALERT: 270 case ISDN_CMD_ALERT:
263 gig_dbg(DEBUG_ANY, "ISDN_CMD_ALERT"); //FIXME 271 gig_dbg(DEBUG_ANY, "ISDN_CMD_ALERT"); //FIXME
264 if (cntrl->arg >= cs->channels) { 272 if (cntrl->arg >= cs->channels) {
265 err("ISDN_CMD_ALERT: invalid channel (%d)", 273 dev_err(cs->dev,
266 (int) cntrl->arg); 274 "ISDN_CMD_ALERT: invalid channel (%d)\n",
275 (int) cntrl->arg);
267 return -EINVAL; 276 return -EINVAL;
268 } 277 }
269 //bcs = cs->bcs + cntrl->arg; 278 //bcs = cs->bcs + cntrl->arg;
@@ -295,7 +304,8 @@ static int command_from_LL(isdn_ctrl *cntrl)
295 gig_dbg(DEBUG_ANY, "ISDN_CMD_GETSIL"); 304 gig_dbg(DEBUG_ANY, "ISDN_CMD_GETSIL");
296 break; 305 break;
297 default: 306 default:
298 err("unknown command %d from LL", cntrl->command); 307 dev_err(cs->dev, "unknown command %d from LL\n",
308 cntrl->command);
299 return -EINVAL; 309 return -EINVAL;
300 } 310 }
301 311
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c
index af195b07c191..521951a898ec 100644
--- a/drivers/isdn/gigaset/interface.c
+++ b/drivers/isdn/gigaset/interface.c
@@ -197,7 +197,7 @@ static void if_close(struct tty_struct *tty, struct file *filp)
197 mutex_lock(&cs->mutex); 197 mutex_lock(&cs->mutex);
198 198
199 if (!cs->open_count) 199 if (!cs->open_count)
200 warn("%s: device not opened", __func__); 200 dev_warn(cs->dev, "%s: device not opened\n", __func__);
201 else { 201 else {
202 if (!--cs->open_count) { 202 if (!--cs->open_count) {
203 spin_lock_irqsave(&cs->lock, flags); 203 spin_lock_irqsave(&cs->lock, flags);
@@ -232,7 +232,7 @@ static int if_ioctl(struct tty_struct *tty, struct file *file,
232 return -ERESTARTSYS; // FIXME -EINTR? 232 return -ERESTARTSYS; // FIXME -EINTR?
233 233
234 if (!cs->open_count) 234 if (!cs->open_count)
235 warn("%s: device not opened", __func__); 235 dev_warn(cs->dev, "%s: device not opened\n", __func__);
236 else { 236 else {
237 retval = 0; 237 retval = 0;
238 switch (cmd) { 238 switch (cmd) {
@@ -364,9 +364,9 @@ static int if_write(struct tty_struct *tty, const unsigned char *buf, int count)
364 return -ERESTARTSYS; // FIXME -EINTR? 364 return -ERESTARTSYS; // FIXME -EINTR?
365 365
366 if (!cs->open_count) 366 if (!cs->open_count)
367 warn("%s: device not opened", __func__); 367 dev_warn(cs->dev, "%s: device not opened\n", __func__);
368 else if (cs->mstate != MS_LOCKED) { 368 else if (cs->mstate != MS_LOCKED) {
369 warn("can't write to unlocked device"); 369 dev_warn(cs->dev, "can't write to unlocked device\n");
370 retval = -EBUSY; 370 retval = -EBUSY;
371 } else if (!cs->connected) { 371 } else if (!cs->connected) {
372 gig_dbg(DEBUG_ANY, "can't write to unplugged device"); 372 gig_dbg(DEBUG_ANY, "can't write to unplugged device");
@@ -398,9 +398,9 @@ static int if_write_room(struct tty_struct *tty)
398 return -ERESTARTSYS; // FIXME -EINTR? 398 return -ERESTARTSYS; // FIXME -EINTR?
399 399
400 if (!cs->open_count) 400 if (!cs->open_count)
401 warn("%s: device not opened", __func__); 401 dev_warn(cs->dev, "%s: device not opened\n", __func__);
402 else if (cs->mstate != MS_LOCKED) { 402 else if (cs->mstate != MS_LOCKED) {
403 warn("can't write to unlocked device"); 403 dev_warn(cs->dev, "can't write to unlocked device\n");
404 retval = -EBUSY; 404 retval = -EBUSY;
405 } else if (!cs->connected) { 405 } else if (!cs->connected) {
406 gig_dbg(DEBUG_ANY, "can't write to unplugged device"); 406 gig_dbg(DEBUG_ANY, "can't write to unplugged device");
@@ -430,9 +430,9 @@ static int if_chars_in_buffer(struct tty_struct *tty)
430 return -ERESTARTSYS; // FIXME -EINTR? 430 return -ERESTARTSYS; // FIXME -EINTR?
431 431
432 if (!cs->open_count) 432 if (!cs->open_count)
433 warn("%s: device not opened", __func__); 433 dev_warn(cs->dev, "%s: device not opened\n", __func__);
434 else if (cs->mstate != MS_LOCKED) { 434 else if (cs->mstate != MS_LOCKED) {
435 warn("can't write to unlocked device"); 435 dev_warn(cs->dev, "can't write to unlocked device\n");
436 retval = -EBUSY; 436 retval = -EBUSY;
437 } else if (!cs->connected) { 437 } else if (!cs->connected) {
438 gig_dbg(DEBUG_ANY, "can't write to unplugged device"); 438 gig_dbg(DEBUG_ANY, "can't write to unplugged device");
@@ -460,7 +460,7 @@ static void if_throttle(struct tty_struct *tty)
460 mutex_lock(&cs->mutex); 460 mutex_lock(&cs->mutex);
461 461
462 if (!cs->open_count) 462 if (!cs->open_count)
463 warn("%s: device not opened", __func__); 463 dev_warn(cs->dev, "%s: device not opened\n", __func__);
464 else { 464 else {
465 //FIXME 465 //FIXME
466 } 466 }
@@ -483,7 +483,7 @@ static void if_unthrottle(struct tty_struct *tty)
483 mutex_lock(&cs->mutex); 483 mutex_lock(&cs->mutex);
484 484
485 if (!cs->open_count) 485 if (!cs->open_count)
486 warn("%s: device not opened", __func__); 486 dev_warn(cs->dev, "%s: device not opened\n", __func__);
487 else { 487 else {
488 //FIXME 488 //FIXME
489 } 489 }
@@ -510,7 +510,7 @@ static void if_set_termios(struct tty_struct *tty, struct ktermios *old)
510 mutex_lock(&cs->mutex); 510 mutex_lock(&cs->mutex);
511 511
512 if (!cs->open_count) { 512 if (!cs->open_count) {
513 warn("%s: device not opened", __func__); 513 dev_warn(cs->dev, "%s: device not opened\n", __func__);
514 goto out; 514 goto out;
515 } 515 }
516 516
@@ -623,7 +623,8 @@ void gigaset_if_init(struct cardstate *cs)
623 if (!IS_ERR(cs->tty_dev)) 623 if (!IS_ERR(cs->tty_dev))
624 dev_set_drvdata(cs->tty_dev, cs); 624 dev_set_drvdata(cs->tty_dev, cs);
625 else { 625 else {
626 warn("could not register device to the tty subsystem"); 626 dev_warn(cs->dev,
627 "could not register device to the tty subsystem\n");
627 cs->tty_dev = NULL; 628 cs->tty_dev = NULL;
628 } 629 }
629 mutex_unlock(&cs->mutex); 630 mutex_unlock(&cs->mutex);
diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c
index 77d20ab0cd4d..4661830a49db 100644
--- a/drivers/isdn/gigaset/usb-gigaset.c
+++ b/drivers/isdn/gigaset/usb-gigaset.c
@@ -498,8 +498,9 @@ static int send_cb(struct cardstate *cs, struct cmdbuf_t *cb)
498 498
499 if (status) { 499 if (status) {
500 ucs->busy = 0; 500 ucs->busy = 0;
501 err("could not submit urb (error %d)\n", 501 dev_err(cs->dev,
502 -status); 502 "could not submit urb (error %d)\n",
503 -status);
503 cb->len = 0; /* skip urb => remove cb+wakeup 504 cb->len = 0; /* skip urb => remove cb+wakeup
504 in next loop cycle */ 505 in next loop cycle */
505 } 506 }
@@ -670,7 +671,7 @@ static int write_modem(struct cardstate *cs)
670 spin_unlock_irqrestore(&cs->lock, flags); 671 spin_unlock_irqrestore(&cs->lock, flags);
671 672
672 if (ret) { 673 if (ret) {
673 err("could not submit urb (error %d)\n", -ret); 674 dev_err(cs->dev, "could not submit urb (error %d)\n", -ret);
674 ucs->busy = 0; 675 ucs->busy = 0;
675 } 676 }
676 677
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 86a369bc57d6..9556262dda5a 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -103,6 +103,14 @@ config LEDS_HP6XX
103 This option enables led support for the handheld 103 This option enables led support for the handheld
104 HP Jornada 620/660/680/690. 104 HP Jornada 620/660/680/690.
105 105
106config LEDS_PCA9532
107 tristate "LED driver for PCA9532 dimmer"
108 depends on LEDS_CLASS && I2C && INPUT && EXPERIMENTAL
109 help
110 This option enables support for NXP pca9532
111 led controller. It is generally only usefull
112 as a platform driver
113
106config LEDS_GPIO 114config LEDS_GPIO
107 tristate "LED Support for GPIO connected LEDs" 115 tristate "LED Support for GPIO connected LEDs"
108 depends on LEDS_CLASS && GENERIC_GPIO 116 depends on LEDS_CLASS && GENERIC_GPIO
@@ -147,6 +155,14 @@ config LEDS_CLEVO_MAIL
147 To compile this driver as a module, choose M here: the 155 To compile this driver as a module, choose M here: the
148 module will be called leds-clevo-mail. 156 module will be called leds-clevo-mail.
149 157
158config LEDS_PCA955X
159 tristate "LED Support for PCA955x I2C chips"
160 depends on LEDS_CLASS && I2C
161 help
162 This option enables support for LEDs connected to PCA955x
163 LED driver chips accessed via the I2C bus. Supported
164 devices include PCA9550, PCA9551, PCA9552, and PCA9553.
165
150comment "LED Triggers" 166comment "LED Triggers"
151 167
152config LEDS_TRIGGERS 168config LEDS_TRIGGERS
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 973d626f5f4a..ff7982b44565 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -16,11 +16,13 @@ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
16obj-$(CONFIG_LEDS_H1940) += leds-h1940.o 16obj-$(CONFIG_LEDS_H1940) += leds-h1940.o
17obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o 17obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o
18obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o 18obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o
19obj-$(CONFIG_LEDS_PCA9532) += leds-pca9532.o
19obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o 20obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o
20obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o 21obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o
21obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o 22obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o
22obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o 23obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
23obj-$(CONFIG_LEDS_FSG) += leds-fsg.o 24obj-$(CONFIG_LEDS_FSG) += leds-fsg.o
25obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o
24 26
25# LED Triggers 27# LED Triggers
26obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o 28obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o
diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
index 0f242b3f09b6..f910eaffe3a6 100644
--- a/drivers/leds/led-triggers.c
+++ b/drivers/leds/led-triggers.c
@@ -111,16 +111,17 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger)
111 flags); 111 flags);
112 if (led_cdev->trigger->deactivate) 112 if (led_cdev->trigger->deactivate)
113 led_cdev->trigger->deactivate(led_cdev); 113 led_cdev->trigger->deactivate(led_cdev);
114 led_cdev->trigger = NULL;
114 led_set_brightness(led_cdev, LED_OFF); 115 led_set_brightness(led_cdev, LED_OFF);
115 } 116 }
116 if (trigger) { 117 if (trigger) {
117 write_lock_irqsave(&trigger->leddev_list_lock, flags); 118 write_lock_irqsave(&trigger->leddev_list_lock, flags);
118 list_add_tail(&led_cdev->trig_list, &trigger->led_cdevs); 119 list_add_tail(&led_cdev->trig_list, &trigger->led_cdevs);
119 write_unlock_irqrestore(&trigger->leddev_list_lock, flags); 120 write_unlock_irqrestore(&trigger->leddev_list_lock, flags);
121 led_cdev->trigger = trigger;
120 if (trigger->activate) 122 if (trigger->activate)
121 trigger->activate(led_cdev); 123 trigger->activate(led_cdev);
122 } 124 }
123 led_cdev->trigger = trigger;
124} 125}
125EXPORT_SYMBOL_GPL(led_trigger_set); 126EXPORT_SYMBOL_GPL(led_trigger_set);
126 127
diff --git a/drivers/leds/leds-atmel-pwm.c b/drivers/leds/leds-atmel-pwm.c
index 28db6c1444ed..52297c3ab246 100644
--- a/drivers/leds/leds-atmel-pwm.c
+++ b/drivers/leds/leds-atmel-pwm.c
@@ -37,7 +37,7 @@ static int __init pwmled_probe(struct platform_device *pdev)
37{ 37{
38 const struct gpio_led_platform_data *pdata; 38 const struct gpio_led_platform_data *pdata;
39 struct pwmled *leds; 39 struct pwmled *leds;
40 unsigned i; 40 int i;
41 int status; 41 int status;
42 42
43 pdata = pdev->dev.platform_data; 43 pdata = pdev->dev.platform_data;
diff --git a/drivers/leds/leds-h1940.c b/drivers/leds/leds-h1940.c
index bcec42230389..73c705021686 100644
--- a/drivers/leds/leds-h1940.c
+++ b/drivers/leds/leds-h1940.c
@@ -23,7 +23,8 @@
23/* 23/*
24 * Green led. 24 * Green led.
25 */ 25 */
26void h1940_greenled_set(struct led_classdev *led_dev, enum led_brightness value) 26static void h1940_greenled_set(struct led_classdev *led_dev,
27 enum led_brightness value)
27{ 28{
28 switch (value) { 29 switch (value) {
29 case LED_HALF: 30 case LED_HALF:
@@ -52,7 +53,8 @@ static struct led_classdev h1940_greenled = {
52/* 53/*
53 * Red led. 54 * Red led.
54 */ 55 */
55void h1940_redled_set(struct led_classdev *led_dev, enum led_brightness value) 56static void h1940_redled_set(struct led_classdev *led_dev,
57 enum led_brightness value)
56{ 58{
57 switch (value) { 59 switch (value) {
58 case LED_HALF: 60 case LED_HALF:
@@ -82,7 +84,8 @@ static struct led_classdev h1940_redled = {
82 * Blue led. 84 * Blue led.
83 * (it can only be blue flashing led) 85 * (it can only be blue flashing led)
84 */ 86 */
85void h1940_blueled_set(struct led_classdev *led_dev, enum led_brightness value) 87static void h1940_blueled_set(struct led_classdev *led_dev,
88 enum led_brightness value)
86{ 89{
87 if (value) { 90 if (value) {
88 /* flashing Blue */ 91 /* flashing Blue */
diff --git a/drivers/leds/leds-pca9532.c b/drivers/leds/leds-pca9532.c
new file mode 100644
index 000000000000..4064d4f6b33b
--- /dev/null
+++ b/drivers/leds/leds-pca9532.c
@@ -0,0 +1,337 @@
1/*
2 * pca9532.c - 16-bit Led dimmer
3 *
4 * Copyright (C) 2008 Riku Voipio <riku.voipio@movial.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * Datasheet: http://www.nxp.com/acrobat/datasheets/PCA9532_3.pdf
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/i2c.h>
16#include <linux/leds.h>
17#include <linux/input.h>
18#include <linux/mutex.h>
19#include <linux/leds-pca9532.h>
20
21static const unsigned short normal_i2c[] = { /*0x60,*/ I2C_CLIENT_END};
22I2C_CLIENT_INSMOD_1(pca9532);
23
24#define PCA9532_REG_PSC(i) (0x2+(i)*2)
25#define PCA9532_REG_PWM(i) (0x3+(i)*2)
26#define PCA9532_REG_LS0 0x6
27#define LED_REG(led) ((led>>2)+PCA9532_REG_LS0)
28#define LED_NUM(led) (led & 0x3)
29
30#define ldev_to_led(c) container_of(c, struct pca9532_led, ldev)
31
32struct pca9532_data {
33 struct i2c_client *client;
34 struct pca9532_led leds[16];
35 struct mutex update_lock;
36 struct input_dev *idev;
37 u8 pwm[2];
38 u8 psc[2];
39};
40
41static int pca9532_probe(struct i2c_client *client,
42 const struct i2c_device_id *id);
43static int pca9532_remove(struct i2c_client *client);
44
45static const struct i2c_device_id pca9532_id[] = {
46 { "pca9532", 0 },
47 { }
48};
49
50MODULE_DEVICE_TABLE(i2c, pca9532_id);
51
52static struct i2c_driver pca9532_driver = {
53 .driver = {
54 .name = "pca9532",
55 },
56 .probe = pca9532_probe,
57 .remove = pca9532_remove,
58 .id_table = pca9532_id,
59};
60
61/* We have two pwm/blinkers, but 16 possible leds to drive. Additionaly,
62 * the clever Thecus people are using one pwm to drive the beeper. So,
63 * as a compromise we average one pwm to the values requested by all
64 * leds that are not ON/OFF.
65 * */
66static int pca9532_setpwm(struct i2c_client *client, int pwm, int blink,
67 enum led_brightness value)
68{
69 int a = 0, b = 0, i = 0;
70 struct pca9532_data *data = i2c_get_clientdata(client);
71 for (i = 0; i < 16; i++) {
72 if (data->leds[i].type == PCA9532_TYPE_LED &&
73 data->leds[i].state == PCA9532_PWM0+pwm) {
74 a++;
75 b += data->leds[i].ldev.brightness;
76 }
77 }
78 if (a == 0) {
79 dev_err(&client->dev,
80 "fear of division by zero %d/%d, wanted %d\n",
81 b, a, value);
82 return -EINVAL;
83 }
84 b = b/a;
85 if (b > 0xFF)
86 return -EINVAL;
87 mutex_lock(&data->update_lock);
88 data->pwm[pwm] = b;
89 i2c_smbus_write_byte_data(client, PCA9532_REG_PWM(pwm),
90 data->pwm[pwm]);
91 data->psc[pwm] = blink;
92 i2c_smbus_write_byte_data(client, PCA9532_REG_PSC(pwm),
93 data->psc[pwm]);
94 mutex_unlock(&data->update_lock);
95 return 0;
96}
97
98/* Set LED routing */
99static void pca9532_setled(struct pca9532_led *led)
100{
101 struct i2c_client *client = led->client;
102 struct pca9532_data *data = i2c_get_clientdata(client);
103 char reg;
104
105 mutex_lock(&data->update_lock);
106 reg = i2c_smbus_read_byte_data(client, LED_REG(led->id));
107 /* zero led bits */
108 reg = reg & ~(0x3<<LED_NUM(led->id)*2);
109 /* set the new value */
110 reg = reg | (led->state << LED_NUM(led->id)*2);
111 i2c_smbus_write_byte_data(client, LED_REG(led->id), reg);
112 mutex_unlock(&data->update_lock);
113}
114
115static void pca9532_set_brightness(struct led_classdev *led_cdev,
116 enum led_brightness value)
117{
118 int err = 0;
119 struct pca9532_led *led = ldev_to_led(led_cdev);
120
121 if (value == LED_OFF)
122 led->state = PCA9532_OFF;
123 else if (value == LED_FULL)
124 led->state = PCA9532_ON;
125 else {
126 led->state = PCA9532_PWM0; /* Thecus: hardcode one pwm */
127 err = pca9532_setpwm(led->client, 0, 0, value);
128 if (err)
129 return; /* XXX: led api doesn't allow error code? */
130 }
131 pca9532_setled(led);
132}
133
134static int pca9532_set_blink(struct led_classdev *led_cdev,
135 unsigned long *delay_on, unsigned long *delay_off)
136{
137 struct pca9532_led *led = ldev_to_led(led_cdev);
138 struct i2c_client *client = led->client;
139 int psc;
140
141 if (*delay_on == 0 && *delay_off == 0) {
142 /* led subsystem ask us for a blink rate */
143 *delay_on = 1000;
144 *delay_off = 1000;
145 }
146 if (*delay_on != *delay_off || *delay_on > 1690 || *delay_on < 6)
147 return -EINVAL;
148
149 /* Thecus specific: only use PSC/PWM 0 */
150 psc = (*delay_on * 152-1)/1000;
151 return pca9532_setpwm(client, 0, psc, led_cdev->brightness);
152}
153
154int pca9532_event(struct input_dev *dev, unsigned int type, unsigned int code,
155 int value)
156{
157 struct pca9532_data *data = input_get_drvdata(dev);
158
159 if (type != EV_SND && (code != SND_BELL || code != SND_TONE))
160 return -1;
161
162 /* XXX: allow different kind of beeps with psc/pwm modifications */
163 if (value > 1 && value < 32767)
164 data->pwm[1] = 127;
165 else
166 data->pwm[1] = 0;
167
168 dev_info(&dev->dev, "setting beep to %d \n", data->pwm[1]);
169 mutex_lock(&data->update_lock);
170 i2c_smbus_write_byte_data(data->client, PCA9532_REG_PWM(1),
171 data->pwm[1]);
172 mutex_unlock(&data->update_lock);
173
174 return 0;
175}
176
177static int pca9532_configure(struct i2c_client *client,
178 struct pca9532_data *data, struct pca9532_platform_data *pdata)
179{
180 int i, err = 0;
181
182 for (i = 0; i < 2; i++) {
183 data->pwm[i] = pdata->pwm[i];
184 data->psc[i] = pdata->psc[i];
185 i2c_smbus_write_byte_data(client, PCA9532_REG_PWM(i),
186 data->pwm[i]);
187 i2c_smbus_write_byte_data(client, PCA9532_REG_PSC(i),
188 data->psc[i]);
189 }
190
191 for (i = 0; i < 16; i++) {
192 struct pca9532_led *led = &data->leds[i];
193 struct pca9532_led *pled = &pdata->leds[i];
194 led->client = client;
195 led->id = i;
196 led->type = pled->type;
197 switch (led->type) {
198 case PCA9532_TYPE_NONE:
199 break;
200 case PCA9532_TYPE_LED:
201 led->state = pled->state;
202 led->name = pled->name;
203 led->ldev.name = led->name;
204 led->ldev.brightness = LED_OFF;
205 led->ldev.brightness_set = pca9532_set_brightness;
206 led->ldev.blink_set = pca9532_set_blink;
207 if (led_classdev_register(&client->dev,
208 &led->ldev) < 0) {
209 dev_err(&client->dev,
210 "couldn't register LED %s\n",
211 led->name);
212 goto exit;
213 }
214 pca9532_setled(led);
215 break;
216 case PCA9532_TYPE_N2100_BEEP:
217 BUG_ON(data->idev);
218 led->state = PCA9532_PWM1;
219 pca9532_setled(led);
220 data->idev = input_allocate_device();
221 if (data->idev == NULL) {
222 err = -ENOMEM;
223 goto exit;
224 }
225 data->idev->name = pled->name;
226 data->idev->phys = "i2c/pca9532";
227 data->idev->id.bustype = BUS_HOST;
228 data->idev->id.vendor = 0x001f;
229 data->idev->id.product = 0x0001;
230 data->idev->id.version = 0x0100;
231 data->idev->evbit[0] = BIT_MASK(EV_SND);
232 data->idev->sndbit[0] = BIT_MASK(SND_BELL) |
233 BIT_MASK(SND_TONE);
234 data->idev->event = pca9532_event;
235 input_set_drvdata(data->idev, data);
236 err = input_register_device(data->idev);
237 if (err) {
238 input_free_device(data->idev);
239 data->idev = NULL;
240 goto exit;
241 }
242 break;
243 }
244 }
245 return 0;
246
247exit:
248 if (i > 0)
249 for (i = i - 1; i >= 0; i--)
250 switch (data->leds[i].type) {
251 case PCA9532_TYPE_NONE:
252 break;
253 case PCA9532_TYPE_LED:
254 led_classdev_unregister(&data->leds[i].ldev);
255 break;
256 case PCA9532_TYPE_N2100_BEEP:
257 if (data->idev != NULL) {
258 input_unregister_device(data->idev);
259 input_free_device(data->idev);
260 data->idev = NULL;
261 }
262 break;
263 }
264
265 return err;
266
267}
268
269static int pca9532_probe(struct i2c_client *client,
270 const struct i2c_device_id *id)
271{
272 struct pca9532_data *data = i2c_get_clientdata(client);
273 struct pca9532_platform_data *pca9532_pdata = client->dev.platform_data;
274
275 if (!i2c_check_functionality(client->adapter,
276 I2C_FUNC_SMBUS_BYTE_DATA))
277 return -EIO;
278
279 data = kzalloc(sizeof(struct pca9532_data), GFP_KERNEL);
280 if (!data)
281 return -ENOMEM;
282
283 dev_info(&client->dev, "setting platform data\n");
284 i2c_set_clientdata(client, data);
285 data->client = client;
286 mutex_init(&data->update_lock);
287
288 if (pca9532_pdata == NULL)
289 return -EIO;
290
291 pca9532_configure(client, data, pca9532_pdata);
292 return 0;
293
294}
295
296static int pca9532_remove(struct i2c_client *client)
297{
298 struct pca9532_data *data = i2c_get_clientdata(client);
299 int i;
300 for (i = 0; i < 16; i++)
301 switch (data->leds[i].type) {
302 case PCA9532_TYPE_NONE:
303 break;
304 case PCA9532_TYPE_LED:
305 led_classdev_unregister(&data->leds[i].ldev);
306 break;
307 case PCA9532_TYPE_N2100_BEEP:
308 if (data->idev != NULL) {
309 input_unregister_device(data->idev);
310 input_free_device(data->idev);
311 data->idev = NULL;
312 }
313 break;
314 }
315
316 kfree(data);
317 i2c_set_clientdata(client, NULL);
318 return 0;
319}
320
321static int __init pca9532_init(void)
322{
323 return i2c_add_driver(&pca9532_driver);
324}
325
326static void __exit pca9532_exit(void)
327{
328 i2c_del_driver(&pca9532_driver);
329}
330
331MODULE_AUTHOR("Riku Voipio <riku.voipio@movial.fi>");
332MODULE_LICENSE("GPL");
333MODULE_DESCRIPTION("PCA 9532 LED dimmer");
334
335module_init(pca9532_init);
336module_exit(pca9532_exit);
337
diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c
new file mode 100644
index 000000000000..146c06972863
--- /dev/null
+++ b/drivers/leds/leds-pca955x.c
@@ -0,0 +1,384 @@
1/*
2 * Copyright 2007-2008 Extreme Engineering Solutions, Inc.
3 *
4 * Author: Nate Case <ncase@xes-inc.com>
5 *
6 * This file is subject to the terms and conditions of version 2 of
7 * the GNU General Public License. See the file COPYING in the main
8 * directory of this archive for more details.
9 *
10 * LED driver for various PCA955x I2C LED drivers
11 *
12 * Supported devices:
13 *
14 * Device Description 7-bit slave address
15 * ------ ----------- -------------------
16 * PCA9550 2-bit driver 0x60 .. 0x61
17 * PCA9551 8-bit driver 0x60 .. 0x67
18 * PCA9552 16-bit driver 0x60 .. 0x67
19 * PCA9553/01 4-bit driver 0x62
20 * PCA9553/02 4-bit driver 0x63
21 *
22 * Philips PCA955x LED driver chips follow a register map as shown below:
23 *
24 * Control Register Description
25 * ---------------- -----------
26 * 0x0 Input register 0
27 * ..
28 * NUM_INPUT_REGS - 1 Last Input register X
29 *
30 * NUM_INPUT_REGS Frequency prescaler 0
31 * NUM_INPUT_REGS + 1 PWM register 0
32 * NUM_INPUT_REGS + 2 Frequency prescaler 1
33 * NUM_INPUT_REGS + 3 PWM register 1
34 *
35 * NUM_INPUT_REGS + 4 LED selector 0
36 * NUM_INPUT_REGS + 4
37 * + NUM_LED_REGS - 1 Last LED selector
38 *
39 * where NUM_INPUT_REGS and NUM_LED_REGS vary depending on how many
40 * bits the chip supports.
41 */
42
43#include <linux/module.h>
44#include <linux/delay.h>
45#include <linux/string.h>
46#include <linux/ctype.h>
47#include <linux/leds.h>
48#include <linux/err.h>
49#include <linux/i2c.h>
50#include <linux/workqueue.h>
51
52/* LED select registers determine the source that drives LED outputs */
53#define PCA955X_LS_LED_ON 0x0 /* Output LOW */
54#define PCA955X_LS_LED_OFF 0x1 /* Output HI-Z */
55#define PCA955X_LS_BLINK0 0x2 /* Blink at PWM0 rate */
56#define PCA955X_LS_BLINK1 0x3 /* Blink at PWM1 rate */
57
58enum pca955x_type {
59 pca9550,
60 pca9551,
61 pca9552,
62 pca9553,
63};
64
65struct pca955x_chipdef {
66 int bits;
67 u8 slv_addr; /* 7-bit slave address mask */
68 int slv_addr_shift; /* Number of bits to ignore */
69};
70
71static struct pca955x_chipdef pca955x_chipdefs[] = {
72 [pca9550] = {
73 .bits = 2,
74 .slv_addr = /* 110000x */ 0x60,
75 .slv_addr_shift = 1,
76 },
77 [pca9551] = {
78 .bits = 8,
79 .slv_addr = /* 1100xxx */ 0x60,
80 .slv_addr_shift = 3,
81 },
82 [pca9552] = {
83 .bits = 16,
84 .slv_addr = /* 1100xxx */ 0x60,
85 .slv_addr_shift = 3,
86 },
87 [pca9553] = {
88 .bits = 4,
89 .slv_addr = /* 110001x */ 0x62,
90 .slv_addr_shift = 1,
91 },
92};
93
94static const struct i2c_device_id pca955x_id[] = {
95 { "pca9550", pca9550 },
96 { "pca9551", pca9551 },
97 { "pca9552", pca9552 },
98 { "pca9553", pca9553 },
99 { }
100};
101MODULE_DEVICE_TABLE(i2c, pca955x_id);
102
103struct pca955x_led {
104 struct pca955x_chipdef *chipdef;
105 struct i2c_client *client;
106 struct work_struct work;
107 spinlock_t lock;
108 enum led_brightness brightness;
109 struct led_classdev led_cdev;
110 int led_num; /* 0 .. 15 potentially */
111 char name[32];
112};
113
114/* 8 bits per input register */
115static inline int pca95xx_num_input_regs(int bits)
116{
117 return (bits + 7) / 8;
118}
119
120/* 4 bits per LED selector register */
121static inline int pca95xx_num_led_regs(int bits)
122{
123 return (bits + 3) / 4;
124}
125
126/*
127 * Return an LED selector register value based on an existing one, with
128 * the appropriate 2-bit state value set for the given LED number (0-3).
129 */
130static inline u8 pca955x_ledsel(u8 oldval, int led_num, int state)
131{
132 return (oldval & (~(0x3 << (led_num << 1)))) |
133 ((state & 0x3) << (led_num << 1));
134}
135
136/*
137 * Write to frequency prescaler register, used to program the
138 * period of the PWM output. period = (PSCx + 1) / 38
139 */
140static void pca955x_write_psc(struct i2c_client *client, int n, u8 val)
141{
142 struct pca955x_led *pca955x = i2c_get_clientdata(client);
143
144 i2c_smbus_write_byte_data(client,
145 pca95xx_num_input_regs(pca955x->chipdef->bits) + 2*n,
146 val);
147}
148
149/*
150 * Write to PWM register, which determines the duty cycle of the
151 * output. LED is OFF when the count is less than the value of this
152 * register, and ON when it is greater. If PWMx == 0, LED is always OFF.
153 *
154 * Duty cycle is (256 - PWMx) / 256
155 */
156static void pca955x_write_pwm(struct i2c_client *client, int n, u8 val)
157{
158 struct pca955x_led *pca955x = i2c_get_clientdata(client);
159
160 i2c_smbus_write_byte_data(client,
161 pca95xx_num_input_regs(pca955x->chipdef->bits) + 1 + 2*n,
162 val);
163}
164
165/*
166 * Write to LED selector register, which determines the source that
167 * drives the LED output.
168 */
169static void pca955x_write_ls(struct i2c_client *client, int n, u8 val)
170{
171 struct pca955x_led *pca955x = i2c_get_clientdata(client);
172
173 i2c_smbus_write_byte_data(client,
174 pca95xx_num_input_regs(pca955x->chipdef->bits) + 4 + n,
175 val);
176}
177
178/*
179 * Read the LED selector register, which determines the source that
180 * drives the LED output.
181 */
182static u8 pca955x_read_ls(struct i2c_client *client, int n)
183{
184 struct pca955x_led *pca955x = i2c_get_clientdata(client);
185
186 return (u8) i2c_smbus_read_byte_data(client,
187 pca95xx_num_input_regs(pca955x->chipdef->bits) + 4 + n);
188}
189
190static void pca955x_led_work(struct work_struct *work)
191{
192 struct pca955x_led *pca955x;
193 u8 ls;
194 int chip_ls; /* which LSx to use (0-3 potentially) */
195 int ls_led; /* which set of bits within LSx to use (0-3) */
196
197 pca955x = container_of(work, struct pca955x_led, work);
198 chip_ls = pca955x->led_num / 4;
199 ls_led = pca955x->led_num % 4;
200
201 ls = pca955x_read_ls(pca955x->client, chip_ls);
202
203 switch (pca955x->brightness) {
204 case LED_FULL:
205 ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_LED_ON);
206 break;
207 case LED_OFF:
208 ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_LED_OFF);
209 break;
210 case LED_HALF:
211 ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_BLINK0);
212 break;
213 default:
214 /*
215 * Use PWM1 for all other values. This has the unwanted
216 * side effect of making all LEDs on the chip share the
217 * same brightness level if set to a value other than
218 * OFF, HALF, or FULL. But, this is probably better than
219 * just turning off for all other values.
220 */
221 pca955x_write_pwm(pca955x->client, 1, 255-pca955x->brightness);
222 ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_BLINK1);
223 break;
224 }
225
226 pca955x_write_ls(pca955x->client, chip_ls, ls);
227}
228
229void pca955x_led_set(struct led_classdev *led_cdev, enum led_brightness value)
230{
231 struct pca955x_led *pca955x;
232
233 pca955x = container_of(led_cdev, struct pca955x_led, led_cdev);
234
235 spin_lock(&pca955x->lock);
236 pca955x->brightness = value;
237
238 /*
239 * Must use workqueue for the actual I/O since I2C operations
240 * can sleep.
241 */
242 schedule_work(&pca955x->work);
243
244 spin_unlock(&pca955x->lock);
245}
246
247static int __devinit pca955x_probe(struct i2c_client *client,
248 const struct i2c_device_id *id)
249{
250 struct pca955x_led *pca955x;
251 int i;
252 int err = -ENODEV;
253 struct pca955x_chipdef *chip;
254 struct i2c_adapter *adapter;
255 struct led_platform_data *pdata;
256
257 chip = &pca955x_chipdefs[id->driver_data];
258 adapter = to_i2c_adapter(client->dev.parent);
259 pdata = client->dev.platform_data;
260
261 /* Make sure the slave address / chip type combo given is possible */
262 if ((client->addr & ~((1 << chip->slv_addr_shift) - 1)) !=
263 chip->slv_addr) {
264 dev_err(&client->dev, "invalid slave address %02x\n",
265 client->addr);
266 return -ENODEV;
267 }
268
269 printk(KERN_INFO "leds-pca955x: Using %s %d-bit LED driver at "
270 "slave address 0x%02x\n",
271 id->name, chip->bits, client->addr);
272
273 if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
274 return -EIO;
275
276 if (pdata) {
277 if (pdata->num_leds != chip->bits) {
278 dev_err(&client->dev, "board info claims %d LEDs"
279 " on a %d-bit chip\n",
280 pdata->num_leds, chip->bits);
281 return -ENODEV;
282 }
283 }
284
285 for (i = 0; i < chip->bits; i++) {
286 pca955x = kzalloc(sizeof(struct pca955x_led), GFP_KERNEL);
287 if (!pca955x) {
288 err = -ENOMEM;
289 goto exit;
290 }
291
292 pca955x->chipdef = chip;
293 pca955x->client = client;
294 pca955x->led_num = i;
295 /* Platform data can specify LED names and default triggers */
296 if (pdata) {
297 if (pdata->leds[i].name)
298 snprintf(pca955x->name, 32, "pca955x:%s",
299 pdata->leds[i].name);
300 if (pdata->leds[i].default_trigger)
301 pca955x->led_cdev.default_trigger =
302 pdata->leds[i].default_trigger;
303 } else {
304 snprintf(pca955x->name, 32, "pca955x:%d", i);
305 }
306 spin_lock_init(&pca955x->lock);
307
308 pca955x->led_cdev.name = pca955x->name;
309 pca955x->led_cdev.brightness_set =
310 pca955x_led_set;
311
312 /*
313 * Client data is a pointer to the _first_ pca955x_led
314 * struct
315 */
316 if (i == 0)
317 i2c_set_clientdata(client, pca955x);
318
319 INIT_WORK(&(pca955x->work), pca955x_led_work);
320
321 led_classdev_register(&client->dev, &(pca955x->led_cdev));
322 }
323
324 /* Turn off LEDs */
325 for (i = 0; i < pca95xx_num_led_regs(chip->bits); i++)
326 pca955x_write_ls(client, i, 0x55);
327
328 /* PWM0 is used for half brightness or 50% duty cycle */
329 pca955x_write_pwm(client, 0, 255-LED_HALF);
330
331 /* PWM1 is used for variable brightness, default to OFF */
332 pca955x_write_pwm(client, 1, 0);
333
334 /* Set to fast frequency so we do not see flashing */
335 pca955x_write_psc(client, 0, 0);
336 pca955x_write_psc(client, 1, 0);
337
338 return 0;
339exit:
340 return err;
341}
342
343static int __devexit pca955x_remove(struct i2c_client *client)
344{
345 struct pca955x_led *pca955x = i2c_get_clientdata(client);
346 int leds = pca955x->chipdef->bits;
347 int i;
348
349 for (i = 0; i < leds; i++) {
350 led_classdev_unregister(&(pca955x->led_cdev));
351 cancel_work_sync(&(pca955x->work));
352 kfree(pca955x);
353 pca955x = pca955x + 1;
354 }
355
356 return 0;
357}
358
359static struct i2c_driver pca955x_driver = {
360 .driver = {
361 .name = "leds-pca955x",
362 .owner = THIS_MODULE,
363 },
364 .probe = pca955x_probe,
365 .remove = __devexit_p(pca955x_remove),
366 .id_table = pca955x_id,
367};
368
369static int __init pca955x_leds_init(void)
370{
371 return i2c_add_driver(&pca955x_driver);
372}
373
374static void __exit pca955x_leds_exit(void)
375{
376 i2c_del_driver(&pca955x_driver);
377}
378
379module_init(pca955x_leds_init);
380module_exit(pca955x_leds_exit);
381
382MODULE_AUTHOR("Nate Case <ncase@xes-inc.com>");
383MODULE_DESCRIPTION("PCA955x LED driver");
384MODULE_LICENSE("GPL v2");
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c
index e5d446804d32..cae52485208a 100644
--- a/drivers/macintosh/adb.c
+++ b/drivers/macintosh/adb.c
@@ -862,7 +862,8 @@ adbdev_init(void)
862 adb_dev_class = class_create(THIS_MODULE, "adb"); 862 adb_dev_class = class_create(THIS_MODULE, "adb");
863 if (IS_ERR(adb_dev_class)) 863 if (IS_ERR(adb_dev_class))
864 return; 864 return;
865 device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), "adb"); 865 device_create_drvdata(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL,
866 "adb");
866 867
867 platform_device_register(&adb_pfdev); 868 platform_device_register(&adb_pfdev);
868 platform_driver_probe(&adb_pfdrv, adb_dummy_probe); 869 platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c
index 59ea520a5d7a..5396c67ba0a4 100644
--- a/drivers/macintosh/adbhid.c
+++ b/drivers/macintosh/adbhid.c
@@ -219,11 +219,13 @@ struct adbhid {
219 int flags; 219 int flags;
220}; 220};
221 221
222#define FLAG_FN_KEY_PRESSED 0x00000001 222#define FLAG_FN_KEY_PRESSED 0x00000001
223#define FLAG_POWER_FROM_FN 0x00000002 223#define FLAG_POWER_FROM_FN 0x00000002
224#define FLAG_EMU_FWDEL_DOWN 0x00000004 224#define FLAG_EMU_FWDEL_DOWN 0x00000004
225#define FLAG_CAPSLOCK_TRANSLATE 0x00000008 225#define FLAG_CAPSLOCK_TRANSLATE 0x00000008
226#define FLAG_CAPSLOCK_DOWN 0x00000010 226#define FLAG_CAPSLOCK_DOWN 0x00000010
227#define FLAG_CAPSLOCK_IGNORE_NEXT 0x00000020
228#define FLAG_POWER_KEY_PRESSED 0x00000040
227 229
228static struct adbhid *adbhid[16]; 230static struct adbhid *adbhid[16];
229 231
@@ -291,11 +293,20 @@ adbhid_input_keycode(int id, int scancode, int repeat)
291 if (keycode == ADB_KEY_CAPSLOCK && !up_flag) { 293 if (keycode == ADB_KEY_CAPSLOCK && !up_flag) {
292 /* Key pressed, turning on the CapsLock LED. 294 /* Key pressed, turning on the CapsLock LED.
293 * The next 0xff will be interpreted as a release. */ 295 * The next 0xff will be interpreted as a release. */
294 ahid->flags |= FLAG_CAPSLOCK_TRANSLATE 296 if (ahid->flags & FLAG_CAPSLOCK_IGNORE_NEXT) {
297 /* Throw away this key event if it happens
298 * just after resume. */
299 ahid->flags &= ~FLAG_CAPSLOCK_IGNORE_NEXT;
300 return;
301 } else {
302 ahid->flags |= FLAG_CAPSLOCK_TRANSLATE
295 | FLAG_CAPSLOCK_DOWN; 303 | FLAG_CAPSLOCK_DOWN;
296 } else if (scancode == 0xff) { 304 }
305 } else if (scancode == 0xff &&
306 !(ahid->flags & FLAG_POWER_KEY_PRESSED)) {
297 /* Scancode 0xff usually signifies that the capslock 307 /* Scancode 0xff usually signifies that the capslock
298 * key was either pressed or released. */ 308 * key was either pressed or released, or that the
309 * power button was released. */
299 if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE) { 310 if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE) {
300 keycode = ADB_KEY_CAPSLOCK; 311 keycode = ADB_KEY_CAPSLOCK;
301 if (ahid->flags & FLAG_CAPSLOCK_DOWN) { 312 if (ahid->flags & FLAG_CAPSLOCK_DOWN) {
@@ -309,7 +320,7 @@ adbhid_input_keycode(int id, int scancode, int repeat)
309 } 320 }
310 } else { 321 } else {
311 printk(KERN_INFO "Spurious caps lock event " 322 printk(KERN_INFO "Spurious caps lock event "
312 "(scancode 0xff)."); 323 "(scancode 0xff).\n");
313 } 324 }
314 } 325 }
315 } 326 }
@@ -336,6 +347,12 @@ adbhid_input_keycode(int id, int scancode, int repeat)
336 } 347 }
337 break; 348 break;
338 case ADB_KEY_POWER: 349 case ADB_KEY_POWER:
350 /* Keep track of the power key state */
351 if (up_flag)
352 ahid->flags &= ~FLAG_POWER_KEY_PRESSED;
353 else
354 ahid->flags |= FLAG_POWER_KEY_PRESSED;
355
339 /* Fn + Command will produce a bogus "power" keycode */ 356 /* Fn + Command will produce a bogus "power" keycode */
340 if (ahid->flags & FLAG_FN_KEY_PRESSED) { 357 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
341 keycode = ADB_KEY_CMD; 358 keycode = ADB_KEY_CMD;
@@ -681,6 +698,21 @@ static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned i
681 return -1; 698 return -1;
682} 699}
683 700
701static void
702adbhid_kbd_capslock_remember(void)
703{
704 struct adbhid *ahid;
705 int i;
706
707 for (i = 1; i < 16; i++) {
708 ahid = adbhid[i];
709
710 if (ahid && ahid->id == ADB_KEYBOARD)
711 if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE)
712 ahid->flags |= FLAG_CAPSLOCK_IGNORE_NEXT;
713 }
714}
715
684static int 716static int
685adb_message_handler(struct notifier_block *this, unsigned long code, void *x) 717adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
686{ 718{
@@ -697,8 +729,17 @@ adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
697 } 729 }
698 730
699 /* Stop pending led requests */ 731 /* Stop pending led requests */
700 while(leds_req_pending) 732 while (leds_req_pending)
701 adb_poll(); 733 adb_poll();
734
735 /* After resume, and if the capslock LED is on, the PMU will
736 * send a "capslock down" key event. This confuses the
737 * restore_capslock_events logic. Remember if the capslock
738 * LED was on before suspend so the unwanted key event can
739 * be ignored after resume. */
740 if (restore_capslock_events)
741 adbhid_kbd_capslock_remember();
742
702 break; 743 break;
703 744
704 case ADB_MSG_POST_RESET: 745 case ADB_MSG_POST_RESET:
diff --git a/drivers/mca/mca-bus.c b/drivers/mca/mca-bus.c
index 67b8e9453b19..ef2dbfe74714 100644
--- a/drivers/mca/mca-bus.c
+++ b/drivers/mca/mca-bus.c
@@ -40,7 +40,7 @@ static struct mca_bus *mca_root_busses[MAX_MCA_BUSSES];
40 40
41struct mca_device_info { 41struct mca_device_info {
42 short pos_id; /* the 2 byte pos id for this card */ 42 short pos_id; /* the 2 byte pos id for this card */
43 char name[DEVICE_NAME_SIZE]; 43 char name[50];
44}; 44};
45 45
46static int mca_bus_match (struct device *dev, struct device_driver *drv) 46static int mca_bus_match (struct device *dev, struct device_driver *drv)
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index b26927ce889c..621a272a2c74 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -225,7 +225,7 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde
225 || test_bit(Faulty, &rdev->flags)) 225 || test_bit(Faulty, &rdev->flags))
226 continue; 226 continue;
227 227
228 target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512); 228 target = rdev->sb_start + offset + index * (PAGE_SIZE/512);
229 229
230 if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) { 230 if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) {
231 page->index = index; 231 page->index = index;
@@ -241,10 +241,10 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde
241static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait) 241static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
242{ 242{
243 mdk_rdev_t *rdev; 243 mdk_rdev_t *rdev;
244 struct list_head *tmp;
245 mddev_t *mddev = bitmap->mddev; 244 mddev_t *mddev = bitmap->mddev;
246 245
247 rdev_for_each(rdev, tmp, mddev) 246 rcu_read_lock();
247 rdev_for_each_rcu(rdev, mddev)
248 if (test_bit(In_sync, &rdev->flags) 248 if (test_bit(In_sync, &rdev->flags)
249 && !test_bit(Faulty, &rdev->flags)) { 249 && !test_bit(Faulty, &rdev->flags)) {
250 int size = PAGE_SIZE; 250 int size = PAGE_SIZE;
@@ -260,32 +260,37 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
260 + (long)(page->index * (PAGE_SIZE/512)) 260 + (long)(page->index * (PAGE_SIZE/512))
261 + size/512 > 0) 261 + size/512 > 0)
262 /* bitmap runs in to metadata */ 262 /* bitmap runs in to metadata */
263 return -EINVAL; 263 goto bad_alignment;
264 if (rdev->data_offset + mddev->size*2 264 if (rdev->data_offset + mddev->size*2
265 > rdev->sb_offset*2 + bitmap->offset) 265 > rdev->sb_start + bitmap->offset)
266 /* data runs in to bitmap */ 266 /* data runs in to bitmap */
267 return -EINVAL; 267 goto bad_alignment;
268 } else if (rdev->sb_offset*2 < rdev->data_offset) { 268 } else if (rdev->sb_start < rdev->data_offset) {
269 /* METADATA BITMAP DATA */ 269 /* METADATA BITMAP DATA */
270 if (rdev->sb_offset*2 270 if (rdev->sb_start
271 + bitmap->offset 271 + bitmap->offset
272 + page->index*(PAGE_SIZE/512) + size/512 272 + page->index*(PAGE_SIZE/512) + size/512
273 > rdev->data_offset) 273 > rdev->data_offset)
274 /* bitmap runs in to data */ 274 /* bitmap runs in to data */
275 return -EINVAL; 275 goto bad_alignment;
276 } else { 276 } else {
277 /* DATA METADATA BITMAP - no problems */ 277 /* DATA METADATA BITMAP - no problems */
278 } 278 }
279 md_super_write(mddev, rdev, 279 md_super_write(mddev, rdev,
280 (rdev->sb_offset<<1) + bitmap->offset 280 rdev->sb_start + bitmap->offset
281 + page->index * (PAGE_SIZE/512), 281 + page->index * (PAGE_SIZE/512),
282 size, 282 size,
283 page); 283 page);
284 } 284 }
285 rcu_read_unlock();
285 286
286 if (wait) 287 if (wait)
287 md_super_wait(mddev); 288 md_super_wait(mddev);
288 return 0; 289 return 0;
290
291 bad_alignment:
292 rcu_read_unlock();
293 return -EINVAL;
289} 294}
290 295
291static void bitmap_file_kick(struct bitmap *bitmap); 296static void bitmap_file_kick(struct bitmap *bitmap);
@@ -454,8 +459,11 @@ void bitmap_update_sb(struct bitmap *bitmap)
454 spin_unlock_irqrestore(&bitmap->lock, flags); 459 spin_unlock_irqrestore(&bitmap->lock, flags);
455 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); 460 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0);
456 sb->events = cpu_to_le64(bitmap->mddev->events); 461 sb->events = cpu_to_le64(bitmap->mddev->events);
457 if (!bitmap->mddev->degraded) 462 if (bitmap->mddev->events < bitmap->events_cleared) {
458 sb->events_cleared = cpu_to_le64(bitmap->mddev->events); 463 /* rocking back to read-only */
464 bitmap->events_cleared = bitmap->mddev->events;
465 sb->events_cleared = cpu_to_le64(bitmap->events_cleared);
466 }
459 kunmap_atomic(sb, KM_USER0); 467 kunmap_atomic(sb, KM_USER0);
460 write_page(bitmap, bitmap->sb_page, 1); 468 write_page(bitmap, bitmap->sb_page, 1);
461} 469}
@@ -1085,9 +1093,19 @@ void bitmap_daemon_work(struct bitmap *bitmap)
1085 } else 1093 } else
1086 spin_unlock_irqrestore(&bitmap->lock, flags); 1094 spin_unlock_irqrestore(&bitmap->lock, flags);
1087 lastpage = page; 1095 lastpage = page;
1088/* 1096
1089 printk("bitmap clean at page %lu\n", j); 1097 /* We are possibly going to clear some bits, so make
1090*/ 1098 * sure that events_cleared is up-to-date.
1099 */
1100 if (bitmap->need_sync) {
1101 bitmap_super_t *sb;
1102 bitmap->need_sync = 0;
1103 sb = kmap_atomic(bitmap->sb_page, KM_USER0);
1104 sb->events_cleared =
1105 cpu_to_le64(bitmap->events_cleared);
1106 kunmap_atomic(sb, KM_USER0);
1107 write_page(bitmap, bitmap->sb_page, 1);
1108 }
1091 spin_lock_irqsave(&bitmap->lock, flags); 1109 spin_lock_irqsave(&bitmap->lock, flags);
1092 clear_page_attr(bitmap, page, BITMAP_PAGE_CLEAN); 1110 clear_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
1093 } 1111 }
@@ -1257,6 +1275,12 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
1257 return; 1275 return;
1258 } 1276 }
1259 1277
1278 if (success &&
1279 bitmap->events_cleared < bitmap->mddev->events) {
1280 bitmap->events_cleared = bitmap->mddev->events;
1281 bitmap->need_sync = 1;
1282 }
1283
1260 if (!success && ! (*bmc & NEEDED_MASK)) 1284 if (!success && ! (*bmc & NEEDED_MASK))
1261 *bmc |= NEEDED_MASK; 1285 *bmc |= NEEDED_MASK;
1262 1286
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index ab6a61db63ce..13956437bc81 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -1216,9 +1216,24 @@ error:
1216 return -EINVAL; 1216 return -EINVAL;
1217} 1217}
1218 1218
1219static int crypt_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
1220 struct bio_vec *biovec, int max_size)
1221{
1222 struct crypt_config *cc = ti->private;
1223 struct request_queue *q = bdev_get_queue(cc->dev->bdev);
1224
1225 if (!q->merge_bvec_fn)
1226 return max_size;
1227
1228 bvm->bi_bdev = cc->dev->bdev;
1229 bvm->bi_sector = cc->start + bvm->bi_sector - ti->begin;
1230
1231 return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
1232}
1233
1219static struct target_type crypt_target = { 1234static struct target_type crypt_target = {
1220 .name = "crypt", 1235 .name = "crypt",
1221 .version= {1, 5, 0}, 1236 .version= {1, 6, 0},
1222 .module = THIS_MODULE, 1237 .module = THIS_MODULE,
1223 .ctr = crypt_ctr, 1238 .ctr = crypt_ctr,
1224 .dtr = crypt_dtr, 1239 .dtr = crypt_dtr,
@@ -1228,6 +1243,7 @@ static struct target_type crypt_target = {
1228 .preresume = crypt_preresume, 1243 .preresume = crypt_preresume,
1229 .resume = crypt_resume, 1244 .resume = crypt_resume,
1230 .message = crypt_message, 1245 .message = crypt_message,
1246 .merge = crypt_merge,
1231}; 1247};
1232 1248
1233static int __init dm_crypt_init(void) 1249static int __init dm_crypt_init(void)
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index 17753d80ad22..6449bcdf84ca 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -69,13 +69,25 @@ static void linear_dtr(struct dm_target *ti)
69 kfree(lc); 69 kfree(lc);
70} 70}
71 71
72static int linear_map(struct dm_target *ti, struct bio *bio, 72static sector_t linear_map_sector(struct dm_target *ti, sector_t bi_sector)
73 union map_info *map_context)
74{ 73{
75 struct linear_c *lc = (struct linear_c *) ti->private; 74 struct linear_c *lc = ti->private;
75
76 return lc->start + (bi_sector - ti->begin);
77}
78
79static void linear_map_bio(struct dm_target *ti, struct bio *bio)
80{
81 struct linear_c *lc = ti->private;
76 82
77 bio->bi_bdev = lc->dev->bdev; 83 bio->bi_bdev = lc->dev->bdev;
78 bio->bi_sector = lc->start + (bio->bi_sector - ti->begin); 84 bio->bi_sector = linear_map_sector(ti, bio->bi_sector);
85}
86
87static int linear_map(struct dm_target *ti, struct bio *bio,
88 union map_info *map_context)
89{
90 linear_map_bio(ti, bio);
79 91
80 return DM_MAPIO_REMAPPED; 92 return DM_MAPIO_REMAPPED;
81} 93}
@@ -114,15 +126,31 @@ static int linear_ioctl(struct dm_target *ti, struct inode *inode,
114 return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg); 126 return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg);
115} 127}
116 128
129static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
130 struct bio_vec *biovec, int max_size)
131{
132 struct linear_c *lc = ti->private;
133 struct request_queue *q = bdev_get_queue(lc->dev->bdev);
134
135 if (!q->merge_bvec_fn)
136 return max_size;
137
138 bvm->bi_bdev = lc->dev->bdev;
139 bvm->bi_sector = linear_map_sector(ti, bvm->bi_sector);
140
141 return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
142}
143
117static struct target_type linear_target = { 144static struct target_type linear_target = {
118 .name = "linear", 145 .name = "linear",
119 .version= {1, 0, 2}, 146 .version= {1, 0, 3},
120 .module = THIS_MODULE, 147 .module = THIS_MODULE,
121 .ctr = linear_ctr, 148 .ctr = linear_ctr,
122 .dtr = linear_dtr, 149 .dtr = linear_dtr,
123 .map = linear_map, 150 .map = linear_map,
124 .status = linear_status, 151 .status = linear_status,
125 .ioctl = linear_ioctl, 152 .ioctl = linear_ioctl,
153 .merge = linear_merge,
126}; 154};
127 155
128int __init dm_linear_init(void) 156int __init dm_linear_init(void)
diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c
index 67a6f31b7fc3..5b48478c79f5 100644
--- a/drivers/md/dm-log.c
+++ b/drivers/md/dm-log.c
@@ -831,7 +831,7 @@ static struct dm_dirty_log_type _disk_type = {
831 .status = disk_status, 831 .status = disk_status,
832}; 832};
833 833
834int __init dm_dirty_log_init(void) 834static int __init dm_dirty_log_init(void)
835{ 835{
836 int r; 836 int r;
837 837
@@ -848,7 +848,7 @@ int __init dm_dirty_log_init(void)
848 return r; 848 return r;
849} 849}
850 850
851void __exit dm_dirty_log_exit(void) 851static void __exit dm_dirty_log_exit(void)
852{ 852{
853 dm_dirty_log_type_unregister(&_disk_type); 853 dm_dirty_log_type_unregister(&_disk_type);
854 dm_dirty_log_type_unregister(&_core_type); 854 dm_dirty_log_type_unregister(&_core_type);
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 9f7302d4878d..fea966d66f98 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -525,8 +525,10 @@ static int parse_path_selector(struct arg_set *as, struct priority_group *pg,
525 } 525 }
526 526
527 r = read_param(_params, shift(as), &ps_argc, &ti->error); 527 r = read_param(_params, shift(as), &ps_argc, &ti->error);
528 if (r) 528 if (r) {
529 dm_put_path_selector(pst);
529 return -EINVAL; 530 return -EINVAL;
531 }
530 532
531 r = pst->create(&pg->ps, ps_argc, as->argv); 533 r = pst->create(&pg->ps, ps_argc, as->argv);
532 if (r) { 534 if (r) {
@@ -623,8 +625,10 @@ static struct priority_group *parse_priority_group(struct arg_set *as,
623 struct pgpath *pgpath; 625 struct pgpath *pgpath;
624 struct arg_set path_args; 626 struct arg_set path_args;
625 627
626 if (as->argc < nr_params) 628 if (as->argc < nr_params) {
629 ti->error = "not enough path parameters";
627 goto bad; 630 goto bad;
631 }
628 632
629 path_args.argc = nr_params; 633 path_args.argc = nr_params;
630 path_args.argv = as->argv; 634 path_args.argv = as->argv;
@@ -867,7 +871,7 @@ static int reinstate_path(struct pgpath *pgpath)
867 if (pgpath->path.is_active) 871 if (pgpath->path.is_active)
868 goto out; 872 goto out;
869 873
870 if (!pgpath->pg->ps.type) { 874 if (!pgpath->pg->ps.type->reinstate_path) {
871 DMWARN("Reinstate path not supported by path selector %s", 875 DMWARN("Reinstate path not supported by path selector %s",
872 pgpath->pg->ps.type->name); 876 pgpath->pg->ps.type->name);
873 r = -EINVAL; 877 r = -EINVAL;
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
index 1ba8a47d61b1..6e5528aecc98 100644
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -40,6 +40,11 @@
40 */ 40 */
41#define SNAPSHOT_PAGES (((1UL << 20) >> PAGE_SHIFT) ? : 1) 41#define SNAPSHOT_PAGES (((1UL << 20) >> PAGE_SHIFT) ? : 1)
42 42
43/*
44 * The size of the mempool used to track chunks in use.
45 */
46#define MIN_IOS 256
47
43static struct workqueue_struct *ksnapd; 48static struct workqueue_struct *ksnapd;
44static void flush_queued_bios(struct work_struct *work); 49static void flush_queued_bios(struct work_struct *work);
45 50
@@ -91,7 +96,63 @@ struct dm_snap_pending_exception {
91 */ 96 */
92static struct kmem_cache *exception_cache; 97static struct kmem_cache *exception_cache;
93static struct kmem_cache *pending_cache; 98static struct kmem_cache *pending_cache;
94static mempool_t *pending_pool; 99
100struct dm_snap_tracked_chunk {
101 struct hlist_node node;
102 chunk_t chunk;
103};
104
105static struct kmem_cache *tracked_chunk_cache;
106
107static struct dm_snap_tracked_chunk *track_chunk(struct dm_snapshot *s,
108 chunk_t chunk)
109{
110 struct dm_snap_tracked_chunk *c = mempool_alloc(s->tracked_chunk_pool,
111 GFP_NOIO);
112 unsigned long flags;
113
114 c->chunk = chunk;
115
116 spin_lock_irqsave(&s->tracked_chunk_lock, flags);
117 hlist_add_head(&c->node,
118 &s->tracked_chunk_hash[DM_TRACKED_CHUNK_HASH(chunk)]);
119 spin_unlock_irqrestore(&s->tracked_chunk_lock, flags);
120
121 return c;
122}
123
124static void stop_tracking_chunk(struct dm_snapshot *s,
125 struct dm_snap_tracked_chunk *c)
126{
127 unsigned long flags;
128
129 spin_lock_irqsave(&s->tracked_chunk_lock, flags);
130 hlist_del(&c->node);
131 spin_unlock_irqrestore(&s->tracked_chunk_lock, flags);
132
133 mempool_free(c, s->tracked_chunk_pool);
134}
135
136static int __chunk_is_tracked(struct dm_snapshot *s, chunk_t chunk)
137{
138 struct dm_snap_tracked_chunk *c;
139 struct hlist_node *hn;
140 int found = 0;
141
142 spin_lock_irq(&s->tracked_chunk_lock);
143
144 hlist_for_each_entry(c, hn,
145 &s->tracked_chunk_hash[DM_TRACKED_CHUNK_HASH(chunk)], node) {
146 if (c->chunk == chunk) {
147 found = 1;
148 break;
149 }
150 }
151
152 spin_unlock_irq(&s->tracked_chunk_lock);
153
154 return found;
155}
95 156
96/* 157/*
97 * One of these per registered origin, held in the snapshot_origins hash 158 * One of these per registered origin, held in the snapshot_origins hash
@@ -302,14 +363,19 @@ static void free_exception(struct dm_snap_exception *e)
302 kmem_cache_free(exception_cache, e); 363 kmem_cache_free(exception_cache, e);
303} 364}
304 365
305static struct dm_snap_pending_exception *alloc_pending_exception(void) 366static struct dm_snap_pending_exception *alloc_pending_exception(struct dm_snapshot *s)
306{ 367{
307 return mempool_alloc(pending_pool, GFP_NOIO); 368 struct dm_snap_pending_exception *pe = mempool_alloc(s->pending_pool,
369 GFP_NOIO);
370
371 pe->snap = s;
372
373 return pe;
308} 374}
309 375
310static void free_pending_exception(struct dm_snap_pending_exception *pe) 376static void free_pending_exception(struct dm_snap_pending_exception *pe)
311{ 377{
312 mempool_free(pe, pending_pool); 378 mempool_free(pe, pe->snap->pending_pool);
313} 379}
314 380
315static void insert_completed_exception(struct dm_snapshot *s, 381static void insert_completed_exception(struct dm_snapshot *s,
@@ -482,6 +548,7 @@ static int set_chunk_size(struct dm_snapshot *s, const char *chunk_size_arg,
482static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) 548static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
483{ 549{
484 struct dm_snapshot *s; 550 struct dm_snapshot *s;
551 int i;
485 int r = -EINVAL; 552 int r = -EINVAL;
486 char persistent; 553 char persistent;
487 char *origin_path; 554 char *origin_path;
@@ -564,11 +631,30 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
564 goto bad5; 631 goto bad5;
565 } 632 }
566 633
634 s->pending_pool = mempool_create_slab_pool(MIN_IOS, pending_cache);
635 if (!s->pending_pool) {
636 ti->error = "Could not allocate mempool for pending exceptions";
637 goto bad6;
638 }
639
640 s->tracked_chunk_pool = mempool_create_slab_pool(MIN_IOS,
641 tracked_chunk_cache);
642 if (!s->tracked_chunk_pool) {
643 ti->error = "Could not allocate tracked_chunk mempool for "
644 "tracking reads";
645 goto bad_tracked_chunk_pool;
646 }
647
648 for (i = 0; i < DM_TRACKED_CHUNK_HASH_SIZE; i++)
649 INIT_HLIST_HEAD(&s->tracked_chunk_hash[i]);
650
651 spin_lock_init(&s->tracked_chunk_lock);
652
567 /* Metadata must only be loaded into one table at once */ 653 /* Metadata must only be loaded into one table at once */
568 r = s->store.read_metadata(&s->store); 654 r = s->store.read_metadata(&s->store);
569 if (r < 0) { 655 if (r < 0) {
570 ti->error = "Failed to read snapshot metadata"; 656 ti->error = "Failed to read snapshot metadata";
571 goto bad6; 657 goto bad_load_and_register;
572 } else if (r > 0) { 658 } else if (r > 0) {
573 s->valid = 0; 659 s->valid = 0;
574 DMWARN("Snapshot is marked invalid."); 660 DMWARN("Snapshot is marked invalid.");
@@ -582,7 +668,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
582 if (register_snapshot(s)) { 668 if (register_snapshot(s)) {
583 r = -EINVAL; 669 r = -EINVAL;
584 ti->error = "Cannot register snapshot origin"; 670 ti->error = "Cannot register snapshot origin";
585 goto bad6; 671 goto bad_load_and_register;
586 } 672 }
587 673
588 ti->private = s; 674 ti->private = s;
@@ -590,6 +676,12 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
590 676
591 return 0; 677 return 0;
592 678
679 bad_load_and_register:
680 mempool_destroy(s->tracked_chunk_pool);
681
682 bad_tracked_chunk_pool:
683 mempool_destroy(s->pending_pool);
684
593 bad6: 685 bad6:
594 dm_kcopyd_client_destroy(s->kcopyd_client); 686 dm_kcopyd_client_destroy(s->kcopyd_client);
595 687
@@ -624,6 +716,9 @@ static void __free_exceptions(struct dm_snapshot *s)
624 716
625static void snapshot_dtr(struct dm_target *ti) 717static void snapshot_dtr(struct dm_target *ti)
626{ 718{
719#ifdef CONFIG_DM_DEBUG
720 int i;
721#endif
627 struct dm_snapshot *s = ti->private; 722 struct dm_snapshot *s = ti->private;
628 723
629 flush_workqueue(ksnapd); 724 flush_workqueue(ksnapd);
@@ -632,8 +727,17 @@ static void snapshot_dtr(struct dm_target *ti)
632 /* After this returns there can be no new kcopyd jobs. */ 727 /* After this returns there can be no new kcopyd jobs. */
633 unregister_snapshot(s); 728 unregister_snapshot(s);
634 729
730#ifdef CONFIG_DM_DEBUG
731 for (i = 0; i < DM_TRACKED_CHUNK_HASH_SIZE; i++)
732 BUG_ON(!hlist_empty(&s->tracked_chunk_hash[i]));
733#endif
734
735 mempool_destroy(s->tracked_chunk_pool);
736
635 __free_exceptions(s); 737 __free_exceptions(s);
636 738
739 mempool_destroy(s->pending_pool);
740
637 dm_put_device(ti, s->origin); 741 dm_put_device(ti, s->origin);
638 dm_put_device(ti, s->cow); 742 dm_put_device(ti, s->cow);
639 743
@@ -772,6 +876,13 @@ static void pending_complete(struct dm_snap_pending_exception *pe, int success)
772 } 876 }
773 877
774 /* 878 /*
879 * Check for conflicting reads. This is extremely improbable,
880 * so yield() is sufficient and there is no need for a wait queue.
881 */
882 while (__chunk_is_tracked(s, pe->e.old_chunk))
883 yield();
884
885 /*
775 * Add a proper exception, and remove the 886 * Add a proper exception, and remove the
776 * in-flight exception from the list. 887 * in-flight exception from the list.
777 */ 888 */
@@ -873,7 +984,7 @@ __find_pending_exception(struct dm_snapshot *s, struct bio *bio)
873 * to hold the lock while we do this. 984 * to hold the lock while we do this.
874 */ 985 */
875 up_write(&s->lock); 986 up_write(&s->lock);
876 pe = alloc_pending_exception(); 987 pe = alloc_pending_exception(s);
877 down_write(&s->lock); 988 down_write(&s->lock);
878 989
879 if (!s->valid) { 990 if (!s->valid) {
@@ -893,7 +1004,6 @@ __find_pending_exception(struct dm_snapshot *s, struct bio *bio)
893 bio_list_init(&pe->snapshot_bios); 1004 bio_list_init(&pe->snapshot_bios);
894 pe->primary_pe = NULL; 1005 pe->primary_pe = NULL;
895 atomic_set(&pe->ref_count, 0); 1006 atomic_set(&pe->ref_count, 0);
896 pe->snap = s;
897 pe->started = 0; 1007 pe->started = 0;
898 1008
899 if (s->store.prepare_exception(&s->store, &pe->e)) { 1009 if (s->store.prepare_exception(&s->store, &pe->e)) {
@@ -974,14 +1084,10 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio,
974 start_copy(pe); 1084 start_copy(pe);
975 goto out; 1085 goto out;
976 } 1086 }
977 } else 1087 } else {
978 /*
979 * FIXME: this read path scares me because we
980 * always use the origin when we have a pending
981 * exception. However I can't think of a
982 * situation where this is wrong - ejt.
983 */
984 bio->bi_bdev = s->origin->bdev; 1088 bio->bi_bdev = s->origin->bdev;
1089 map_context->ptr = track_chunk(s, chunk);
1090 }
985 1091
986 out_unlock: 1092 out_unlock:
987 up_write(&s->lock); 1093 up_write(&s->lock);
@@ -989,6 +1095,18 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio,
989 return r; 1095 return r;
990} 1096}
991 1097
1098static int snapshot_end_io(struct dm_target *ti, struct bio *bio,
1099 int error, union map_info *map_context)
1100{
1101 struct dm_snapshot *s = ti->private;
1102 struct dm_snap_tracked_chunk *c = map_context->ptr;
1103
1104 if (c)
1105 stop_tracking_chunk(s, c);
1106
1107 return 0;
1108}
1109
992static void snapshot_resume(struct dm_target *ti) 1110static void snapshot_resume(struct dm_target *ti)
993{ 1111{
994 struct dm_snapshot *s = ti->private; 1112 struct dm_snapshot *s = ti->private;
@@ -1266,6 +1384,7 @@ static struct target_type snapshot_target = {
1266 .ctr = snapshot_ctr, 1384 .ctr = snapshot_ctr,
1267 .dtr = snapshot_dtr, 1385 .dtr = snapshot_dtr,
1268 .map = snapshot_map, 1386 .map = snapshot_map,
1387 .end_io = snapshot_end_io,
1269 .resume = snapshot_resume, 1388 .resume = snapshot_resume,
1270 .status = snapshot_status, 1389 .status = snapshot_status,
1271}; 1390};
@@ -1306,9 +1425,9 @@ static int __init dm_snapshot_init(void)
1306 goto bad4; 1425 goto bad4;
1307 } 1426 }
1308 1427
1309 pending_pool = mempool_create_slab_pool(128, pending_cache); 1428 tracked_chunk_cache = KMEM_CACHE(dm_snap_tracked_chunk, 0);
1310 if (!pending_pool) { 1429 if (!tracked_chunk_cache) {
1311 DMERR("Couldn't create pending pool."); 1430 DMERR("Couldn't create cache to track chunks in use.");
1312 r = -ENOMEM; 1431 r = -ENOMEM;
1313 goto bad5; 1432 goto bad5;
1314 } 1433 }
@@ -1317,13 +1436,13 @@ static int __init dm_snapshot_init(void)
1317 if (!ksnapd) { 1436 if (!ksnapd) {
1318 DMERR("Failed to create ksnapd workqueue."); 1437 DMERR("Failed to create ksnapd workqueue.");
1319 r = -ENOMEM; 1438 r = -ENOMEM;
1320 goto bad6; 1439 goto bad_pending_pool;
1321 } 1440 }
1322 1441
1323 return 0; 1442 return 0;
1324 1443
1325 bad6: 1444 bad_pending_pool:
1326 mempool_destroy(pending_pool); 1445 kmem_cache_destroy(tracked_chunk_cache);
1327 bad5: 1446 bad5:
1328 kmem_cache_destroy(pending_cache); 1447 kmem_cache_destroy(pending_cache);
1329 bad4: 1448 bad4:
@@ -1352,9 +1471,9 @@ static void __exit dm_snapshot_exit(void)
1352 DMERR("origin unregister failed %d", r); 1471 DMERR("origin unregister failed %d", r);
1353 1472
1354 exit_origin_hash(); 1473 exit_origin_hash();
1355 mempool_destroy(pending_pool);
1356 kmem_cache_destroy(pending_cache); 1474 kmem_cache_destroy(pending_cache);
1357 kmem_cache_destroy(exception_cache); 1475 kmem_cache_destroy(exception_cache);
1476 kmem_cache_destroy(tracked_chunk_cache);
1358} 1477}
1359 1478
1360/* Module hooks */ 1479/* Module hooks */
diff --git a/drivers/md/dm-snap.h b/drivers/md/dm-snap.h
index 24f9fb73b982..292c15609ae3 100644
--- a/drivers/md/dm-snap.h
+++ b/drivers/md/dm-snap.h
@@ -130,6 +130,10 @@ struct exception_store {
130 void *context; 130 void *context;
131}; 131};
132 132
133#define DM_TRACKED_CHUNK_HASH_SIZE 16
134#define DM_TRACKED_CHUNK_HASH(x) ((unsigned long)(x) & \
135 (DM_TRACKED_CHUNK_HASH_SIZE - 1))
136
133struct dm_snapshot { 137struct dm_snapshot {
134 struct rw_semaphore lock; 138 struct rw_semaphore lock;
135 struct dm_target *ti; 139 struct dm_target *ti;
@@ -157,6 +161,8 @@ struct dm_snapshot {
157 /* The last percentage we notified */ 161 /* The last percentage we notified */
158 int last_percent; 162 int last_percent;
159 163
164 mempool_t *pending_pool;
165
160 struct exception_table pending; 166 struct exception_table pending;
161 struct exception_table complete; 167 struct exception_table complete;
162 168
@@ -174,6 +180,11 @@ struct dm_snapshot {
174 /* Queue of snapshot writes for ksnapd to flush */ 180 /* Queue of snapshot writes for ksnapd to flush */
175 struct bio_list queued_bios; 181 struct bio_list queued_bios;
176 struct work_struct queued_bios_work; 182 struct work_struct queued_bios_work;
183
184 /* Chunks with outstanding reads */
185 mempool_t *tracked_chunk_pool;
186 spinlock_t tracked_chunk_lock;
187 struct hlist_head tracked_chunk_hash[DM_TRACKED_CHUNK_HASH_SIZE];
177}; 188};
178 189
179/* 190/*
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 94116eaf4709..798e468103b8 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -506,14 +506,13 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev)
506 rs->max_sectors = 506 rs->max_sectors =
507 min_not_zero(rs->max_sectors, q->max_sectors); 507 min_not_zero(rs->max_sectors, q->max_sectors);
508 508
509 /* FIXME: Device-Mapper on top of RAID-0 breaks because DM 509 /*
510 * currently doesn't honor MD's merge_bvec_fn routine. 510 * Check if merge fn is supported.
511 * In this case, we'll force DM to use PAGE_SIZE or 511 * If not we'll force DM to use PAGE_SIZE or
512 * smaller I/O, just to be safe. A better fix is in the 512 * smaller I/O, just to be safe.
513 * works, but add this for the time being so it will at
514 * least operate correctly.
515 */ 513 */
516 if (q->merge_bvec_fn) 514
515 if (q->merge_bvec_fn && !ti->type->merge)
517 rs->max_sectors = 516 rs->max_sectors =
518 min_not_zero(rs->max_sectors, 517 min_not_zero(rs->max_sectors,
519 (unsigned int) (PAGE_SIZE >> 9)); 518 (unsigned int) (PAGE_SIZE >> 9));
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 372369b1cc20..bca448e11878 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -37,8 +37,8 @@ static DEFINE_SPINLOCK(_minor_lock);
37struct dm_io { 37struct dm_io {
38 struct mapped_device *md; 38 struct mapped_device *md;
39 int error; 39 int error;
40 struct bio *bio;
41 atomic_t io_count; 40 atomic_t io_count;
41 struct bio *bio;
42 unsigned long start_time; 42 unsigned long start_time;
43}; 43};
44 44
@@ -829,6 +829,49 @@ static int __split_bio(struct mapped_device *md, struct bio *bio)
829 * CRUD END 829 * CRUD END
830 *---------------------------------------------------------------*/ 830 *---------------------------------------------------------------*/
831 831
832static int dm_merge_bvec(struct request_queue *q,
833 struct bvec_merge_data *bvm,
834 struct bio_vec *biovec)
835{
836 struct mapped_device *md = q->queuedata;
837 struct dm_table *map = dm_get_table(md);
838 struct dm_target *ti;
839 sector_t max_sectors;
840 int max_size;
841
842 if (unlikely(!map))
843 return 0;
844
845 ti = dm_table_find_target(map, bvm->bi_sector);
846
847 /*
848 * Find maximum amount of I/O that won't need splitting
849 */
850 max_sectors = min(max_io_len(md, bvm->bi_sector, ti),
851 (sector_t) BIO_MAX_SECTORS);
852 max_size = (max_sectors << SECTOR_SHIFT) - bvm->bi_size;
853 if (max_size < 0)
854 max_size = 0;
855
856 /*
857 * merge_bvec_fn() returns number of bytes
858 * it can accept at this offset
859 * max is precomputed maximal io size
860 */
861 if (max_size && ti->type->merge)
862 max_size = ti->type->merge(ti, bvm, biovec, max_size);
863
864 /*
865 * Always allow an entire first page
866 */
867 if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT))
868 max_size = biovec->bv_len;
869
870 dm_table_put(map);
871
872 return max_size;
873}
874
832/* 875/*
833 * The request function that just remaps the bio built up by 876 * The request function that just remaps the bio built up by
834 * dm_merge_bvec. 877 * dm_merge_bvec.
@@ -1032,6 +1075,7 @@ static struct mapped_device *alloc_dev(int minor)
1032 blk_queue_make_request(md->queue, dm_request); 1075 blk_queue_make_request(md->queue, dm_request);
1033 blk_queue_bounce_limit(md->queue, BLK_BOUNCE_ANY); 1076 blk_queue_bounce_limit(md->queue, BLK_BOUNCE_ANY);
1034 md->queue->unplug_fn = dm_unplug_all; 1077 md->queue->unplug_fn = dm_unplug_all;
1078 blk_queue_merge_bvec(md->queue, dm_merge_bvec);
1035 1079
1036 md->io_pool = mempool_create_slab_pool(MIN_IOS, _io_cache); 1080 md->io_pool = mempool_create_slab_pool(MIN_IOS, _io_cache);
1037 if (!md->io_pool) 1081 if (!md->io_pool)
diff --git a/drivers/md/dm.h b/drivers/md/dm.h
index 8c03b634e62e..1e59a0b0a78a 100644
--- a/drivers/md/dm.h
+++ b/drivers/md/dm.h
@@ -100,12 +100,6 @@ int dm_lock_for_deletion(struct mapped_device *md);
100 100
101void dm_kobject_uevent(struct mapped_device *md); 101void dm_kobject_uevent(struct mapped_device *md);
102 102
103/*
104 * Dirty log
105 */
106int dm_dirty_log_init(void);
107void dm_dirty_log_exit(void);
108
109int dm_kcopyd_init(void); 103int dm_kcopyd_init(void);
110void dm_kcopyd_exit(void); 104void dm_kcopyd_exit(void);
111 105
diff --git a/drivers/md/faulty.c b/drivers/md/faulty.c
index d107ddceefcd..268547dbfbd3 100644
--- a/drivers/md/faulty.c
+++ b/drivers/md/faulty.c
@@ -297,7 +297,7 @@ static int run(mddev_t *mddev)
297 rdev_for_each(rdev, tmp, mddev) 297 rdev_for_each(rdev, tmp, mddev)
298 conf->rdev = rdev; 298 conf->rdev = rdev;
299 299
300 mddev->array_size = mddev->size; 300 mddev->array_sectors = mddev->size * 2;
301 mddev->private = conf; 301 mddev->private = conf;
302 302
303 reconfig(mddev, mddev->layout, -1); 303 reconfig(mddev, mddev->layout, -1);
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index 6a866d7c8ae5..b1eebf88c209 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -122,13 +122,13 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
122 return NULL; 122 return NULL;
123 123
124 cnt = 0; 124 cnt = 0;
125 conf->array_size = 0; 125 conf->array_sectors = 0;
126 126
127 rdev_for_each(rdev, tmp, mddev) { 127 rdev_for_each(rdev, tmp, mddev) {
128 int j = rdev->raid_disk; 128 int j = rdev->raid_disk;
129 dev_info_t *disk = conf->disks + j; 129 dev_info_t *disk = conf->disks + j;
130 130
131 if (j < 0 || j > raid_disks || disk->rdev) { 131 if (j < 0 || j >= raid_disks || disk->rdev) {
132 printk("linear: disk numbering problem. Aborting!\n"); 132 printk("linear: disk numbering problem. Aborting!\n");
133 goto out; 133 goto out;
134 } 134 }
@@ -146,7 +146,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
146 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); 146 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);
147 147
148 disk->size = rdev->size; 148 disk->size = rdev->size;
149 conf->array_size += rdev->size; 149 conf->array_sectors += rdev->size * 2;
150 150
151 cnt++; 151 cnt++;
152 } 152 }
@@ -155,7 +155,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
155 goto out; 155 goto out;
156 } 156 }
157 157
158 min_spacing = conf->array_size; 158 min_spacing = conf->array_sectors / 2;
159 sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *)); 159 sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *));
160 160
161 /* min_spacing is the minimum spacing that will fit the hash 161 /* min_spacing is the minimum spacing that will fit the hash
@@ -164,7 +164,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
164 * that is larger than min_spacing as use the size of that as 164 * that is larger than min_spacing as use the size of that as
165 * the actual spacing 165 * the actual spacing
166 */ 166 */
167 conf->hash_spacing = conf->array_size; 167 conf->hash_spacing = conf->array_sectors / 2;
168 for (i=0; i < cnt-1 ; i++) { 168 for (i=0; i < cnt-1 ; i++) {
169 sector_t sz = 0; 169 sector_t sz = 0;
170 int j; 170 int j;
@@ -194,7 +194,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
194 unsigned round; 194 unsigned round;
195 unsigned long base; 195 unsigned long base;
196 196
197 sz = conf->array_size >> conf->preshift; 197 sz = conf->array_sectors >> (conf->preshift + 1);
198 sz += 1; /* force round-up */ 198 sz += 1; /* force round-up */
199 base = conf->hash_spacing >> conf->preshift; 199 base = conf->hash_spacing >> conf->preshift;
200 round = sector_div(sz, base); 200 round = sector_div(sz, base);
@@ -221,7 +221,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
221 curr_offset = 0; 221 curr_offset = 0;
222 i = 0; 222 i = 0;
223 for (curr_offset = 0; 223 for (curr_offset = 0;
224 curr_offset < conf->array_size; 224 curr_offset < conf->array_sectors / 2;
225 curr_offset += conf->hash_spacing) { 225 curr_offset += conf->hash_spacing) {
226 226
227 while (i < raid_disks-1 && 227 while (i < raid_disks-1 &&
@@ -258,7 +258,7 @@ static int linear_run (mddev_t *mddev)
258 if (!conf) 258 if (!conf)
259 return 1; 259 return 1;
260 mddev->private = conf; 260 mddev->private = conf;
261 mddev->array_size = conf->array_size; 261 mddev->array_sectors = conf->array_sectors;
262 262
263 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec); 263 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);
264 mddev->queue->unplug_fn = linear_unplug; 264 mddev->queue->unplug_fn = linear_unplug;
@@ -292,8 +292,8 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
292 newconf->prev = mddev_to_conf(mddev); 292 newconf->prev = mddev_to_conf(mddev);
293 mddev->private = newconf; 293 mddev->private = newconf;
294 mddev->raid_disks++; 294 mddev->raid_disks++;
295 mddev->array_size = newconf->array_size; 295 mddev->array_sectors = newconf->array_sectors;
296 set_capacity(mddev->gendisk, mddev->array_size << 1); 296 set_capacity(mddev->gendisk, mddev->array_sectors);
297 return 0; 297 return 0;
298} 298}
299 299
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 2580ac1b9b0f..c2ff77ccec50 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -169,7 +169,6 @@ void md_new_event(mddev_t *mddev)
169{ 169{
170 atomic_inc(&md_event_count); 170 atomic_inc(&md_event_count);
171 wake_up(&md_event_waiters); 171 wake_up(&md_event_waiters);
172 sysfs_notify(&mddev->kobj, NULL, "sync_action");
173} 172}
174EXPORT_SYMBOL_GPL(md_new_event); 173EXPORT_SYMBOL_GPL(md_new_event);
175 174
@@ -274,10 +273,12 @@ static mddev_t * mddev_find(dev_t unit)
274 INIT_LIST_HEAD(&new->all_mddevs); 273 INIT_LIST_HEAD(&new->all_mddevs);
275 init_timer(&new->safemode_timer); 274 init_timer(&new->safemode_timer);
276 atomic_set(&new->active, 1); 275 atomic_set(&new->active, 1);
276 atomic_set(&new->openers, 0);
277 spin_lock_init(&new->write_lock); 277 spin_lock_init(&new->write_lock);
278 init_waitqueue_head(&new->sb_wait); 278 init_waitqueue_head(&new->sb_wait);
279 init_waitqueue_head(&new->recovery_wait); 279 init_waitqueue_head(&new->recovery_wait);
280 new->reshape_position = MaxSector; 280 new->reshape_position = MaxSector;
281 new->resync_min = 0;
281 new->resync_max = MaxSector; 282 new->resync_max = MaxSector;
282 new->level = LEVEL_NONE; 283 new->level = LEVEL_NONE;
283 284
@@ -347,21 +348,20 @@ static struct mdk_personality *find_pers(int level, char *clevel)
347 return NULL; 348 return NULL;
348} 349}
349 350
351/* return the offset of the super block in 512byte sectors */
350static inline sector_t calc_dev_sboffset(struct block_device *bdev) 352static inline sector_t calc_dev_sboffset(struct block_device *bdev)
351{ 353{
352 sector_t size = bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; 354 sector_t num_sectors = bdev->bd_inode->i_size / 512;
353 return MD_NEW_SIZE_BLOCKS(size); 355 return MD_NEW_SIZE_SECTORS(num_sectors);
354} 356}
355 357
356static sector_t calc_dev_size(mdk_rdev_t *rdev, unsigned chunk_size) 358static sector_t calc_num_sectors(mdk_rdev_t *rdev, unsigned chunk_size)
357{ 359{
358 sector_t size; 360 sector_t num_sectors = rdev->sb_start;
359
360 size = rdev->sb_offset;
361 361
362 if (chunk_size) 362 if (chunk_size)
363 size &= ~((sector_t)chunk_size/1024 - 1); 363 num_sectors &= ~((sector_t)chunk_size/512 - 1);
364 return size; 364 return num_sectors;
365} 365}
366 366
367static int alloc_disk_sb(mdk_rdev_t * rdev) 367static int alloc_disk_sb(mdk_rdev_t * rdev)
@@ -372,7 +372,7 @@ static int alloc_disk_sb(mdk_rdev_t * rdev)
372 rdev->sb_page = alloc_page(GFP_KERNEL); 372 rdev->sb_page = alloc_page(GFP_KERNEL);
373 if (!rdev->sb_page) { 373 if (!rdev->sb_page) {
374 printk(KERN_ALERT "md: out of memory.\n"); 374 printk(KERN_ALERT "md: out of memory.\n");
375 return -EINVAL; 375 return -ENOMEM;
376 } 376 }
377 377
378 return 0; 378 return 0;
@@ -384,7 +384,7 @@ static void free_disk_sb(mdk_rdev_t * rdev)
384 put_page(rdev->sb_page); 384 put_page(rdev->sb_page);
385 rdev->sb_loaded = 0; 385 rdev->sb_loaded = 0;
386 rdev->sb_page = NULL; 386 rdev->sb_page = NULL;
387 rdev->sb_offset = 0; 387 rdev->sb_start = 0;
388 rdev->size = 0; 388 rdev->size = 0;
389 } 389 }
390} 390}
@@ -530,7 +530,7 @@ static int read_disk_sb(mdk_rdev_t * rdev, int size)
530 return 0; 530 return 0;
531 531
532 532
533 if (!sync_page_io(rdev->bdev, rdev->sb_offset<<1, size, rdev->sb_page, READ)) 533 if (!sync_page_io(rdev->bdev, rdev->sb_start, size, rdev->sb_page, READ))
534 goto fail; 534 goto fail;
535 rdev->sb_loaded = 1; 535 rdev->sb_loaded = 1;
536 return 0; 536 return 0;
@@ -543,17 +543,12 @@ fail:
543 543
544static int uuid_equal(mdp_super_t *sb1, mdp_super_t *sb2) 544static int uuid_equal(mdp_super_t *sb1, mdp_super_t *sb2)
545{ 545{
546 if ( (sb1->set_uuid0 == sb2->set_uuid0) && 546 return sb1->set_uuid0 == sb2->set_uuid0 &&
547 (sb1->set_uuid1 == sb2->set_uuid1) && 547 sb1->set_uuid1 == sb2->set_uuid1 &&
548 (sb1->set_uuid2 == sb2->set_uuid2) && 548 sb1->set_uuid2 == sb2->set_uuid2 &&
549 (sb1->set_uuid3 == sb2->set_uuid3)) 549 sb1->set_uuid3 == sb2->set_uuid3;
550
551 return 1;
552
553 return 0;
554} 550}
555 551
556
557static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2) 552static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2)
558{ 553{
559 int ret; 554 int ret;
@@ -564,7 +559,7 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2)
564 559
565 if (!tmp1 || !tmp2) { 560 if (!tmp1 || !tmp2) {
566 ret = 0; 561 ret = 0;
567 printk(KERN_INFO "md.c: sb1 is not equal to sb2!\n"); 562 printk(KERN_INFO "md.c sb_equal(): failed to allocate memory!\n");
568 goto abort; 563 goto abort;
569 } 564 }
570 565
@@ -577,11 +572,7 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2)
577 tmp1->nr_disks = 0; 572 tmp1->nr_disks = 0;
578 tmp2->nr_disks = 0; 573 tmp2->nr_disks = 0;
579 574
580 if (memcmp(tmp1, tmp2, MD_SB_GENERIC_CONSTANT_WORDS * 4)) 575 ret = (memcmp(tmp1, tmp2, MD_SB_GENERIC_CONSTANT_WORDS * 4) == 0);
581 ret = 0;
582 else
583 ret = 1;
584
585abort: 576abort:
586 kfree(tmp1); 577 kfree(tmp1);
587 kfree(tmp2); 578 kfree(tmp2);
@@ -658,11 +649,14 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
658 */ 649 */
659 650
660struct super_type { 651struct super_type {
661 char *name; 652 char *name;
662 struct module *owner; 653 struct module *owner;
663 int (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version); 654 int (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev,
664 int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev); 655 int minor_version);
665 void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev); 656 int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev);
657 void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
658 unsigned long long (*rdev_size_change)(mdk_rdev_t *rdev,
659 sector_t num_sectors);
666}; 660};
667 661
668/* 662/*
@@ -673,16 +667,14 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version
673 char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; 667 char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
674 mdp_super_t *sb; 668 mdp_super_t *sb;
675 int ret; 669 int ret;
676 sector_t sb_offset;
677 670
678 /* 671 /*
679 * Calculate the position of the superblock, 672 * Calculate the position of the superblock (512byte sectors),
680 * it's at the end of the disk. 673 * it's at the end of the disk.
681 * 674 *
682 * It also happens to be a multiple of 4Kb. 675 * It also happens to be a multiple of 4Kb.
683 */ 676 */
684 sb_offset = calc_dev_sboffset(rdev->bdev); 677 rdev->sb_start = calc_dev_sboffset(rdev->bdev);
685 rdev->sb_offset = sb_offset;
686 678
687 ret = read_disk_sb(rdev, MD_SB_BYTES); 679 ret = read_disk_sb(rdev, MD_SB_BYTES);
688 if (ret) return ret; 680 if (ret) return ret;
@@ -759,7 +751,7 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version
759 else 751 else
760 ret = 0; 752 ret = 0;
761 } 753 }
762 rdev->size = calc_dev_size(rdev, sb->chunk_size); 754 rdev->size = calc_num_sectors(rdev, sb->chunk_size) / 2;
763 755
764 if (rdev->size < sb->size && sb->level > 1) 756 if (rdev->size < sb->size && sb->level > 1)
765 /* "this cannot possibly happen" ... */ 757 /* "this cannot possibly happen" ... */
@@ -1004,6 +996,26 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
1004} 996}
1005 997
1006/* 998/*
999 * rdev_size_change for 0.90.0
1000 */
1001static unsigned long long
1002super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
1003{
1004 if (num_sectors && num_sectors < rdev->mddev->size * 2)
1005 return 0; /* component must fit device */
1006 if (rdev->mddev->bitmap_offset)
1007 return 0; /* can't move bitmap */
1008 rdev->sb_start = calc_dev_sboffset(rdev->bdev);
1009 if (!num_sectors || num_sectors > rdev->sb_start)
1010 num_sectors = rdev->sb_start;
1011 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
1012 rdev->sb_page);
1013 md_super_wait(rdev->mddev);
1014 return num_sectors / 2; /* kB for sysfs */
1015}
1016
1017
1018/*
1007 * version 1 superblock 1019 * version 1 superblock
1008 */ 1020 */
1009 1021
@@ -1034,12 +1046,12 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
1034{ 1046{
1035 struct mdp_superblock_1 *sb; 1047 struct mdp_superblock_1 *sb;
1036 int ret; 1048 int ret;
1037 sector_t sb_offset; 1049 sector_t sb_start;
1038 char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; 1050 char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
1039 int bmask; 1051 int bmask;
1040 1052
1041 /* 1053 /*
1042 * Calculate the position of the superblock. 1054 * Calculate the position of the superblock in 512byte sectors.
1043 * It is always aligned to a 4K boundary and 1055 * It is always aligned to a 4K boundary and
1044 * depeding on minor_version, it can be: 1056 * depeding on minor_version, it can be:
1045 * 0: At least 8K, but less than 12K, from end of device 1057 * 0: At least 8K, but less than 12K, from end of device
@@ -1048,22 +1060,20 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
1048 */ 1060 */
1049 switch(minor_version) { 1061 switch(minor_version) {
1050 case 0: 1062 case 0:
1051 sb_offset = rdev->bdev->bd_inode->i_size >> 9; 1063 sb_start = rdev->bdev->bd_inode->i_size >> 9;
1052 sb_offset -= 8*2; 1064 sb_start -= 8*2;
1053 sb_offset &= ~(sector_t)(4*2-1); 1065 sb_start &= ~(sector_t)(4*2-1);
1054 /* convert from sectors to K */
1055 sb_offset /= 2;
1056 break; 1066 break;
1057 case 1: 1067 case 1:
1058 sb_offset = 0; 1068 sb_start = 0;
1059 break; 1069 break;
1060 case 2: 1070 case 2:
1061 sb_offset = 4; 1071 sb_start = 8;
1062 break; 1072 break;
1063 default: 1073 default:
1064 return -EINVAL; 1074 return -EINVAL;
1065 } 1075 }
1066 rdev->sb_offset = sb_offset; 1076 rdev->sb_start = sb_start;
1067 1077
1068 /* superblock is rarely larger than 1K, but it can be larger, 1078 /* superblock is rarely larger than 1K, but it can be larger,
1069 * and it is safe to read 4k, so we do that 1079 * and it is safe to read 4k, so we do that
@@ -1077,7 +1087,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
1077 if (sb->magic != cpu_to_le32(MD_SB_MAGIC) || 1087 if (sb->magic != cpu_to_le32(MD_SB_MAGIC) ||
1078 sb->major_version != cpu_to_le32(1) || 1088 sb->major_version != cpu_to_le32(1) ||
1079 le32_to_cpu(sb->max_dev) > (4096-256)/2 || 1089 le32_to_cpu(sb->max_dev) > (4096-256)/2 ||
1080 le64_to_cpu(sb->super_offset) != (rdev->sb_offset<<1) || 1090 le64_to_cpu(sb->super_offset) != rdev->sb_start ||
1081 (le32_to_cpu(sb->feature_map) & ~MD_FEATURE_ALL) != 0) 1091 (le32_to_cpu(sb->feature_map) & ~MD_FEATURE_ALL) != 0)
1082 return -EINVAL; 1092 return -EINVAL;
1083 1093
@@ -1113,7 +1123,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
1113 rdev->sb_size = (rdev->sb_size | bmask) + 1; 1123 rdev->sb_size = (rdev->sb_size | bmask) + 1;
1114 1124
1115 if (minor_version 1125 if (minor_version
1116 && rdev->data_offset < sb_offset + (rdev->sb_size/512)) 1126 && rdev->data_offset < sb_start + (rdev->sb_size/512))
1117 return -EINVAL; 1127 return -EINVAL;
1118 1128
1119 if (sb->level == cpu_to_le32(LEVEL_MULTIPATH)) 1129 if (sb->level == cpu_to_le32(LEVEL_MULTIPATH))
@@ -1149,7 +1159,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
1149 if (minor_version) 1159 if (minor_version)
1150 rdev->size = ((rdev->bdev->bd_inode->i_size>>9) - le64_to_cpu(sb->data_offset)) / 2; 1160 rdev->size = ((rdev->bdev->bd_inode->i_size>>9) - le64_to_cpu(sb->data_offset)) / 2;
1151 else 1161 else
1152 rdev->size = rdev->sb_offset; 1162 rdev->size = rdev->sb_start / 2;
1153 if (rdev->size < le64_to_cpu(sb->data_size)/2) 1163 if (rdev->size < le64_to_cpu(sb->data_size)/2)
1154 return -EINVAL; 1164 return -EINVAL;
1155 rdev->size = le64_to_cpu(sb->data_size)/2; 1165 rdev->size = le64_to_cpu(sb->data_size)/2;
@@ -1328,35 +1338,74 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
1328 sb->sb_csum = calc_sb_1_csum(sb); 1338 sb->sb_csum = calc_sb_1_csum(sb);
1329} 1339}
1330 1340
1341static unsigned long long
1342super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
1343{
1344 struct mdp_superblock_1 *sb;
1345 sector_t max_sectors;
1346 if (num_sectors && num_sectors < rdev->mddev->size * 2)
1347 return 0; /* component must fit device */
1348 if (rdev->sb_start < rdev->data_offset) {
1349 /* minor versions 1 and 2; superblock before data */
1350 max_sectors = rdev->bdev->bd_inode->i_size >> 9;
1351 max_sectors -= rdev->data_offset;
1352 if (!num_sectors || num_sectors > max_sectors)
1353 num_sectors = max_sectors;
1354 } else if (rdev->mddev->bitmap_offset) {
1355 /* minor version 0 with bitmap we can't move */
1356 return 0;
1357 } else {
1358 /* minor version 0; superblock after data */
1359 sector_t sb_start;
1360 sb_start = (rdev->bdev->bd_inode->i_size >> 9) - 8*2;
1361 sb_start &= ~(sector_t)(4*2 - 1);
1362 max_sectors = rdev->size * 2 + sb_start - rdev->sb_start;
1363 if (!num_sectors || num_sectors > max_sectors)
1364 num_sectors = max_sectors;
1365 rdev->sb_start = sb_start;
1366 }
1367 sb = (struct mdp_superblock_1 *) page_address(rdev->sb_page);
1368 sb->data_size = cpu_to_le64(num_sectors);
1369 sb->super_offset = rdev->sb_start;
1370 sb->sb_csum = calc_sb_1_csum(sb);
1371 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
1372 rdev->sb_page);
1373 md_super_wait(rdev->mddev);
1374 return num_sectors / 2; /* kB for sysfs */
1375}
1331 1376
1332static struct super_type super_types[] = { 1377static struct super_type super_types[] = {
1333 [0] = { 1378 [0] = {
1334 .name = "0.90.0", 1379 .name = "0.90.0",
1335 .owner = THIS_MODULE, 1380 .owner = THIS_MODULE,
1336 .load_super = super_90_load, 1381 .load_super = super_90_load,
1337 .validate_super = super_90_validate, 1382 .validate_super = super_90_validate,
1338 .sync_super = super_90_sync, 1383 .sync_super = super_90_sync,
1384 .rdev_size_change = super_90_rdev_size_change,
1339 }, 1385 },
1340 [1] = { 1386 [1] = {
1341 .name = "md-1", 1387 .name = "md-1",
1342 .owner = THIS_MODULE, 1388 .owner = THIS_MODULE,
1343 .load_super = super_1_load, 1389 .load_super = super_1_load,
1344 .validate_super = super_1_validate, 1390 .validate_super = super_1_validate,
1345 .sync_super = super_1_sync, 1391 .sync_super = super_1_sync,
1392 .rdev_size_change = super_1_rdev_size_change,
1346 }, 1393 },
1347}; 1394};
1348 1395
1349static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2) 1396static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2)
1350{ 1397{
1351 struct list_head *tmp, *tmp2;
1352 mdk_rdev_t *rdev, *rdev2; 1398 mdk_rdev_t *rdev, *rdev2;
1353 1399
1354 rdev_for_each(rdev, tmp, mddev1) 1400 rcu_read_lock();
1355 rdev_for_each(rdev2, tmp2, mddev2) 1401 rdev_for_each_rcu(rdev, mddev1)
1402 rdev_for_each_rcu(rdev2, mddev2)
1356 if (rdev->bdev->bd_contains == 1403 if (rdev->bdev->bd_contains ==
1357 rdev2->bdev->bd_contains) 1404 rdev2->bdev->bd_contains) {
1405 rcu_read_unlock();
1358 return 1; 1406 return 1;
1359 1407 }
1408 rcu_read_unlock();
1360 return 0; 1409 return 0;
1361} 1410}
1362 1411
@@ -1423,7 +1472,7 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
1423 kobject_del(&rdev->kobj); 1472 kobject_del(&rdev->kobj);
1424 goto fail; 1473 goto fail;
1425 } 1474 }
1426 list_add(&rdev->same_set, &mddev->disks); 1475 list_add_rcu(&rdev->same_set, &mddev->disks);
1427 bd_claim_by_disk(rdev->bdev, rdev->bdev->bd_holder, mddev->gendisk); 1476 bd_claim_by_disk(rdev->bdev, rdev->bdev->bd_holder, mddev->gendisk);
1428 return 0; 1477 return 0;
1429 1478
@@ -1448,14 +1497,16 @@ static void unbind_rdev_from_array(mdk_rdev_t * rdev)
1448 return; 1497 return;
1449 } 1498 }
1450 bd_release_from_disk(rdev->bdev, rdev->mddev->gendisk); 1499 bd_release_from_disk(rdev->bdev, rdev->mddev->gendisk);
1451 list_del_init(&rdev->same_set); 1500 list_del_rcu(&rdev->same_set);
1452 printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); 1501 printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b));
1453 rdev->mddev = NULL; 1502 rdev->mddev = NULL;
1454 sysfs_remove_link(&rdev->kobj, "block"); 1503 sysfs_remove_link(&rdev->kobj, "block");
1455 1504
1456 /* We need to delay this, otherwise we can deadlock when 1505 /* We need to delay this, otherwise we can deadlock when
1457 * writing to 'remove' to "dev/state" 1506 * writing to 'remove' to "dev/state". We also need
1507 * to delay it due to rcu usage.
1458 */ 1508 */
1509 synchronize_rcu();
1459 INIT_WORK(&rdev->del_work, md_delayed_delete); 1510 INIT_WORK(&rdev->del_work, md_delayed_delete);
1460 kobject_get(&rdev->kobj); 1511 kobject_get(&rdev->kobj);
1461 schedule_work(&rdev->del_work); 1512 schedule_work(&rdev->del_work);
@@ -1511,7 +1562,6 @@ static void export_rdev(mdk_rdev_t * rdev)
1511 if (rdev->mddev) 1562 if (rdev->mddev)
1512 MD_BUG(); 1563 MD_BUG();
1513 free_disk_sb(rdev); 1564 free_disk_sb(rdev);
1514 list_del_init(&rdev->same_set);
1515#ifndef MODULE 1565#ifndef MODULE
1516 if (test_bit(AutoDetected, &rdev->flags)) 1566 if (test_bit(AutoDetected, &rdev->flags))
1517 md_autodetect_dev(rdev->bdev->bd_dev); 1567 md_autodetect_dev(rdev->bdev->bd_dev);
@@ -1758,11 +1808,11 @@ repeat:
1758 dprintk("%s ", bdevname(rdev->bdev,b)); 1808 dprintk("%s ", bdevname(rdev->bdev,b));
1759 if (!test_bit(Faulty, &rdev->flags)) { 1809 if (!test_bit(Faulty, &rdev->flags)) {
1760 md_super_write(mddev,rdev, 1810 md_super_write(mddev,rdev,
1761 rdev->sb_offset<<1, rdev->sb_size, 1811 rdev->sb_start, rdev->sb_size,
1762 rdev->sb_page); 1812 rdev->sb_page);
1763 dprintk(KERN_INFO "(write) %s's sb offset: %llu\n", 1813 dprintk(KERN_INFO "(write) %s's sb offset: %llu\n",
1764 bdevname(rdev->bdev,b), 1814 bdevname(rdev->bdev,b),
1765 (unsigned long long)rdev->sb_offset); 1815 (unsigned long long)rdev->sb_start);
1766 rdev->sb_events = mddev->events; 1816 rdev->sb_events = mddev->events;
1767 1817
1768 } else 1818 } else
@@ -1787,7 +1837,7 @@ repeat:
1787 1837
1788} 1838}
1789 1839
1790/* words written to sysfs files may, or my not, be \n terminated. 1840/* words written to sysfs files may, or may not, be \n terminated.
1791 * We want to accept with case. For this we use cmd_match. 1841 * We want to accept with case. For this we use cmd_match.
1792 */ 1842 */
1793static int cmd_match(const char *cmd, const char *str) 1843static int cmd_match(const char *cmd, const char *str)
@@ -1886,6 +1936,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1886 1936
1887 err = 0; 1937 err = 0;
1888 } 1938 }
1939 if (!err)
1940 sysfs_notify(&rdev->kobj, NULL, "state");
1889 return err ? err : len; 1941 return err ? err : len;
1890} 1942}
1891static struct rdev_sysfs_entry rdev_state = 1943static struct rdev_sysfs_entry rdev_state =
@@ -1931,7 +1983,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1931 slot = -1; 1983 slot = -1;
1932 else if (e==buf || (*e && *e!= '\n')) 1984 else if (e==buf || (*e && *e!= '\n'))
1933 return -EINVAL; 1985 return -EINVAL;
1934 if (rdev->mddev->pers) { 1986 if (rdev->mddev->pers && slot == -1) {
1935 /* Setting 'slot' on an active array requires also 1987 /* Setting 'slot' on an active array requires also
1936 * updating the 'rd%d' link, and communicating 1988 * updating the 'rd%d' link, and communicating
1937 * with the personality with ->hot_*_disk. 1989 * with the personality with ->hot_*_disk.
@@ -1939,8 +1991,6 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1939 * failed/spare devices. This normally happens automatically, 1991 * failed/spare devices. This normally happens automatically,
1940 * but not when the metadata is externally managed. 1992 * but not when the metadata is externally managed.
1941 */ 1993 */
1942 if (slot != -1)
1943 return -EBUSY;
1944 if (rdev->raid_disk == -1) 1994 if (rdev->raid_disk == -1)
1945 return -EEXIST; 1995 return -EEXIST;
1946 /* personality does all needed checks */ 1996 /* personality does all needed checks */
@@ -1954,6 +2004,43 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1954 sysfs_remove_link(&rdev->mddev->kobj, nm); 2004 sysfs_remove_link(&rdev->mddev->kobj, nm);
1955 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); 2005 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
1956 md_wakeup_thread(rdev->mddev->thread); 2006 md_wakeup_thread(rdev->mddev->thread);
2007 } else if (rdev->mddev->pers) {
2008 mdk_rdev_t *rdev2;
2009 struct list_head *tmp;
2010 /* Activating a spare .. or possibly reactivating
2011 * if we every get bitmaps working here.
2012 */
2013
2014 if (rdev->raid_disk != -1)
2015 return -EBUSY;
2016
2017 if (rdev->mddev->pers->hot_add_disk == NULL)
2018 return -EINVAL;
2019
2020 rdev_for_each(rdev2, tmp, rdev->mddev)
2021 if (rdev2->raid_disk == slot)
2022 return -EEXIST;
2023
2024 rdev->raid_disk = slot;
2025 if (test_bit(In_sync, &rdev->flags))
2026 rdev->saved_raid_disk = slot;
2027 else
2028 rdev->saved_raid_disk = -1;
2029 err = rdev->mddev->pers->
2030 hot_add_disk(rdev->mddev, rdev);
2031 if (err) {
2032 rdev->raid_disk = -1;
2033 return err;
2034 } else
2035 sysfs_notify(&rdev->kobj, NULL, "state");
2036 sprintf(nm, "rd%d", rdev->raid_disk);
2037 if (sysfs_create_link(&rdev->mddev->kobj, &rdev->kobj, nm))
2038 printk(KERN_WARNING
2039 "md: cannot register "
2040 "%s for %s\n",
2041 nm, mdname(rdev->mddev));
2042
2043 /* don't wakeup anyone, leave that to userspace. */
1957 } else { 2044 } else {
1958 if (slot >= rdev->mddev->raid_disks) 2045 if (slot >= rdev->mddev->raid_disks)
1959 return -ENOSPC; 2046 return -ENOSPC;
@@ -1962,6 +2049,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1962 clear_bit(Faulty, &rdev->flags); 2049 clear_bit(Faulty, &rdev->flags);
1963 clear_bit(WriteMostly, &rdev->flags); 2050 clear_bit(WriteMostly, &rdev->flags);
1964 set_bit(In_sync, &rdev->flags); 2051 set_bit(In_sync, &rdev->flags);
2052 sysfs_notify(&rdev->kobj, NULL, "state");
1965 } 2053 }
1966 return len; 2054 return len;
1967} 2055}
@@ -1983,7 +2071,7 @@ offset_store(mdk_rdev_t *rdev, const char *buf, size_t len)
1983 unsigned long long offset = simple_strtoull(buf, &e, 10); 2071 unsigned long long offset = simple_strtoull(buf, &e, 10);
1984 if (e==buf || (*e && *e != '\n')) 2072 if (e==buf || (*e && *e != '\n'))
1985 return -EINVAL; 2073 return -EINVAL;
1986 if (rdev->mddev->pers) 2074 if (rdev->mddev->pers && rdev->raid_disk >= 0)
1987 return -EBUSY; 2075 return -EBUSY;
1988 if (rdev->size && rdev->mddev->external) 2076 if (rdev->size && rdev->mddev->external)
1989 /* Must set offset before size, so overlap checks 2077 /* Must set offset before size, so overlap checks
@@ -2015,17 +2103,30 @@ static int overlaps(sector_t s1, sector_t l1, sector_t s2, sector_t l2)
2015static ssize_t 2103static ssize_t
2016rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) 2104rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2017{ 2105{
2018 char *e; 2106 unsigned long long size;
2019 unsigned long long size = simple_strtoull(buf, &e, 10);
2020 unsigned long long oldsize = rdev->size; 2107 unsigned long long oldsize = rdev->size;
2021 mddev_t *my_mddev = rdev->mddev; 2108 mddev_t *my_mddev = rdev->mddev;
2022 2109
2023 if (e==buf || (*e && *e != '\n')) 2110 if (strict_strtoull(buf, 10, &size) < 0)
2024 return -EINVAL; 2111 return -EINVAL;
2025 if (my_mddev->pers) 2112 if (size < my_mddev->size)
2026 return -EBUSY; 2113 return -EINVAL;
2114 if (my_mddev->pers && rdev->raid_disk >= 0) {
2115 if (my_mddev->persistent) {
2116 size = super_types[my_mddev->major_version].
2117 rdev_size_change(rdev, size * 2);
2118 if (!size)
2119 return -EBUSY;
2120 } else if (!size) {
2121 size = (rdev->bdev->bd_inode->i_size >> 10);
2122 size -= rdev->data_offset/2;
2123 }
2124 if (size < my_mddev->size)
2125 return -EINVAL; /* component must fit device */
2126 }
2127
2027 rdev->size = size; 2128 rdev->size = size;
2028 if (size > oldsize && rdev->mddev->external) { 2129 if (size > oldsize && my_mddev->external) {
2029 /* need to check that all other rdevs with the same ->bdev 2130 /* need to check that all other rdevs with the same ->bdev
2030 * do not overlap. We need to unlock the mddev to avoid 2131 * do not overlap. We need to unlock the mddev to avoid
2031 * a deadlock. We have already changed rdev->size, and if 2132 * a deadlock. We have already changed rdev->size, and if
@@ -2044,8 +2145,9 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2044 if (test_bit(AllReserved, &rdev2->flags) || 2145 if (test_bit(AllReserved, &rdev2->flags) ||
2045 (rdev->bdev == rdev2->bdev && 2146 (rdev->bdev == rdev2->bdev &&
2046 rdev != rdev2 && 2147 rdev != rdev2 &&
2047 overlaps(rdev->data_offset, rdev->size, 2148 overlaps(rdev->data_offset, rdev->size * 2,
2048 rdev2->data_offset, rdev2->size))) { 2149 rdev2->data_offset,
2150 rdev2->size * 2))) {
2049 overlap = 1; 2151 overlap = 1;
2050 break; 2152 break;
2051 } 2153 }
@@ -2067,8 +2169,6 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2067 return -EBUSY; 2169 return -EBUSY;
2068 } 2170 }
2069 } 2171 }
2070 if (size < my_mddev->size || my_mddev->size == 0)
2071 my_mddev->size = size;
2072 return len; 2172 return len;
2073} 2173}
2074 2174
@@ -2512,7 +2612,7 @@ __ATTR(resync_start, S_IRUGO|S_IWUSR, resync_start_show, resync_start_store);
2512 * When written, doesn't tear down array, but just stops it 2612 * When written, doesn't tear down array, but just stops it
2513 * suspended (not supported yet) 2613 * suspended (not supported yet)
2514 * All IO requests will block. The array can be reconfigured. 2614 * All IO requests will block. The array can be reconfigured.
2515 * Writing this, if accepted, will block until array is quiessent 2615 * Writing this, if accepted, will block until array is quiescent
2516 * readonly 2616 * readonly
2517 * no resync can happen. no superblocks get written. 2617 * no resync can happen. no superblocks get written.
2518 * write requests fail 2618 * write requests fail
@@ -2585,7 +2685,7 @@ array_state_show(mddev_t *mddev, char *page)
2585 return sprintf(page, "%s\n", array_states[st]); 2685 return sprintf(page, "%s\n", array_states[st]);
2586} 2686}
2587 2687
2588static int do_md_stop(mddev_t * mddev, int ro); 2688static int do_md_stop(mddev_t * mddev, int ro, int is_open);
2589static int do_md_run(mddev_t * mddev); 2689static int do_md_run(mddev_t * mddev);
2590static int restart_array(mddev_t *mddev); 2690static int restart_array(mddev_t *mddev);
2591 2691
@@ -2599,16 +2699,16 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
2599 break; 2699 break;
2600 case clear: 2700 case clear:
2601 /* stopping an active array */ 2701 /* stopping an active array */
2602 if (atomic_read(&mddev->active) > 1) 2702 if (atomic_read(&mddev->openers) > 0)
2603 return -EBUSY; 2703 return -EBUSY;
2604 err = do_md_stop(mddev, 0); 2704 err = do_md_stop(mddev, 0, 0);
2605 break; 2705 break;
2606 case inactive: 2706 case inactive:
2607 /* stopping an active array */ 2707 /* stopping an active array */
2608 if (mddev->pers) { 2708 if (mddev->pers) {
2609 if (atomic_read(&mddev->active) > 1) 2709 if (atomic_read(&mddev->openers) > 0)
2610 return -EBUSY; 2710 return -EBUSY;
2611 err = do_md_stop(mddev, 2); 2711 err = do_md_stop(mddev, 2, 0);
2612 } else 2712 } else
2613 err = 0; /* already inactive */ 2713 err = 0; /* already inactive */
2614 break; 2714 break;
@@ -2616,7 +2716,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
2616 break; /* not supported yet */ 2716 break; /* not supported yet */
2617 case readonly: 2717 case readonly:
2618 if (mddev->pers) 2718 if (mddev->pers)
2619 err = do_md_stop(mddev, 1); 2719 err = do_md_stop(mddev, 1, 0);
2620 else { 2720 else {
2621 mddev->ro = 1; 2721 mddev->ro = 1;
2622 set_disk_ro(mddev->gendisk, 1); 2722 set_disk_ro(mddev->gendisk, 1);
@@ -2626,7 +2726,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
2626 case read_auto: 2726 case read_auto:
2627 if (mddev->pers) { 2727 if (mddev->pers) {
2628 if (mddev->ro != 1) 2728 if (mddev->ro != 1)
2629 err = do_md_stop(mddev, 1); 2729 err = do_md_stop(mddev, 1, 0);
2630 else 2730 else
2631 err = restart_array(mddev); 2731 err = restart_array(mddev);
2632 if (err == 0) { 2732 if (err == 0) {
@@ -2681,8 +2781,10 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
2681 } 2781 }
2682 if (err) 2782 if (err)
2683 return err; 2783 return err;
2684 else 2784 else {
2785 sysfs_notify(&mddev->kobj, NULL, "array_state");
2685 return len; 2786 return len;
2787 }
2686} 2788}
2687static struct md_sysfs_entry md_array_state = 2789static struct md_sysfs_entry md_array_state =
2688__ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store); 2790__ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store);
@@ -2785,7 +2887,7 @@ size_show(mddev_t *mddev, char *page)
2785 return sprintf(page, "%llu\n", (unsigned long long)mddev->size); 2887 return sprintf(page, "%llu\n", (unsigned long long)mddev->size);
2786} 2888}
2787 2889
2788static int update_size(mddev_t *mddev, unsigned long size); 2890static int update_size(mddev_t *mddev, sector_t num_sectors);
2789 2891
2790static ssize_t 2892static ssize_t
2791size_store(mddev_t *mddev, const char *buf, size_t len) 2893size_store(mddev_t *mddev, const char *buf, size_t len)
@@ -2802,7 +2904,7 @@ size_store(mddev_t *mddev, const char *buf, size_t len)
2802 return -EINVAL; 2904 return -EINVAL;
2803 2905
2804 if (mddev->pers) { 2906 if (mddev->pers) {
2805 err = update_size(mddev, size); 2907 err = update_size(mddev, size * 2);
2806 md_update_sb(mddev, 1); 2908 md_update_sb(mddev, 1);
2807 } else { 2909 } else {
2808 if (mddev->size == 0 || 2910 if (mddev->size == 0 ||
@@ -2899,7 +3001,7 @@ action_show(mddev_t *mddev, char *page)
2899 type = "check"; 3001 type = "check";
2900 else 3002 else
2901 type = "repair"; 3003 type = "repair";
2902 } else 3004 } else if (test_bit(MD_RECOVERY_RECOVER, &mddev->recovery))
2903 type = "recover"; 3005 type = "recover";
2904 } 3006 }
2905 return sprintf(page, "%s\n", type); 3007 return sprintf(page, "%s\n", type);
@@ -2921,15 +3023,19 @@ action_store(mddev_t *mddev, const char *page, size_t len)
2921 } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 3023 } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
2922 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) 3024 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
2923 return -EBUSY; 3025 return -EBUSY;
2924 else if (cmd_match(page, "resync") || cmd_match(page, "recover")) 3026 else if (cmd_match(page, "resync"))
3027 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
3028 else if (cmd_match(page, "recover")) {
3029 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
2925 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 3030 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
2926 else if (cmd_match(page, "reshape")) { 3031 } else if (cmd_match(page, "reshape")) {
2927 int err; 3032 int err;
2928 if (mddev->pers->start_reshape == NULL) 3033 if (mddev->pers->start_reshape == NULL)
2929 return -EINVAL; 3034 return -EINVAL;
2930 err = mddev->pers->start_reshape(mddev); 3035 err = mddev->pers->start_reshape(mddev);
2931 if (err) 3036 if (err)
2932 return err; 3037 return err;
3038 sysfs_notify(&mddev->kobj, NULL, "degraded");
2933 } else { 3039 } else {
2934 if (cmd_match(page, "check")) 3040 if (cmd_match(page, "check"))
2935 set_bit(MD_RECOVERY_CHECK, &mddev->recovery); 3041 set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
@@ -2940,6 +3046,7 @@ action_store(mddev_t *mddev, const char *page, size_t len)
2940 } 3046 }
2941 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 3047 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
2942 md_wakeup_thread(mddev->thread); 3048 md_wakeup_thread(mddev->thread);
3049 sysfs_notify(&mddev->kobj, NULL, "sync_action");
2943 return len; 3050 return len;
2944} 3051}
2945 3052
@@ -3049,11 +3156,11 @@ static ssize_t
3049sync_speed_show(mddev_t *mddev, char *page) 3156sync_speed_show(mddev_t *mddev, char *page)
3050{ 3157{
3051 unsigned long resync, dt, db; 3158 unsigned long resync, dt, db;
3052 resync = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)); 3159 resync = mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active);
3053 dt = ((jiffies - mddev->resync_mark) / HZ); 3160 dt = (jiffies - mddev->resync_mark) / HZ;
3054 if (!dt) dt++; 3161 if (!dt) dt++;
3055 db = resync - (mddev->resync_mark_cnt); 3162 db = resync - mddev->resync_mark_cnt;
3056 return sprintf(page, "%ld\n", db/dt/2); /* K/sec */ 3163 return sprintf(page, "%lu\n", db/dt/2); /* K/sec */
3057} 3164}
3058 3165
3059static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed); 3166static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed);
@@ -3075,6 +3182,36 @@ sync_completed_show(mddev_t *mddev, char *page)
3075static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed); 3182static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed);
3076 3183
3077static ssize_t 3184static ssize_t
3185min_sync_show(mddev_t *mddev, char *page)
3186{
3187 return sprintf(page, "%llu\n",
3188 (unsigned long long)mddev->resync_min);
3189}
3190static ssize_t
3191min_sync_store(mddev_t *mddev, const char *buf, size_t len)
3192{
3193 unsigned long long min;
3194 if (strict_strtoull(buf, 10, &min))
3195 return -EINVAL;
3196 if (min > mddev->resync_max)
3197 return -EINVAL;
3198 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
3199 return -EBUSY;
3200
3201 /* Must be a multiple of chunk_size */
3202 if (mddev->chunk_size) {
3203 if (min & (sector_t)((mddev->chunk_size>>9)-1))
3204 return -EINVAL;
3205 }
3206 mddev->resync_min = min;
3207
3208 return len;
3209}
3210
3211static struct md_sysfs_entry md_min_sync =
3212__ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store);
3213
3214static ssize_t
3078max_sync_show(mddev_t *mddev, char *page) 3215max_sync_show(mddev_t *mddev, char *page)
3079{ 3216{
3080 if (mddev->resync_max == MaxSector) 3217 if (mddev->resync_max == MaxSector)
@@ -3089,9 +3226,10 @@ max_sync_store(mddev_t *mddev, const char *buf, size_t len)
3089 if (strncmp(buf, "max", 3) == 0) 3226 if (strncmp(buf, "max", 3) == 0)
3090 mddev->resync_max = MaxSector; 3227 mddev->resync_max = MaxSector;
3091 else { 3228 else {
3092 char *ep; 3229 unsigned long long max;
3093 unsigned long long max = simple_strtoull(buf, &ep, 10); 3230 if (strict_strtoull(buf, 10, &max))
3094 if (ep == buf || (*ep != 0 && *ep != '\n')) 3231 return -EINVAL;
3232 if (max < mddev->resync_min)
3095 return -EINVAL; 3233 return -EINVAL;
3096 if (max < mddev->resync_max && 3234 if (max < mddev->resync_max &&
3097 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) 3235 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
@@ -3222,6 +3360,7 @@ static struct attribute *md_redundancy_attrs[] = {
3222 &md_sync_speed.attr, 3360 &md_sync_speed.attr,
3223 &md_sync_force_parallel.attr, 3361 &md_sync_force_parallel.attr,
3224 &md_sync_completed.attr, 3362 &md_sync_completed.attr,
3363 &md_min_sync.attr,
3225 &md_max_sync.attr, 3364 &md_max_sync.attr,
3226 &md_suspend_lo.attr, 3365 &md_suspend_lo.attr,
3227 &md_suspend_hi.attr, 3366 &md_suspend_hi.attr,
@@ -3326,9 +3465,9 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data)
3326 disk->queue = mddev->queue; 3465 disk->queue = mddev->queue;
3327 add_disk(disk); 3466 add_disk(disk);
3328 mddev->gendisk = disk; 3467 mddev->gendisk = disk;
3329 mutex_unlock(&disks_mutex);
3330 error = kobject_init_and_add(&mddev->kobj, &md_ktype, &disk->dev.kobj, 3468 error = kobject_init_and_add(&mddev->kobj, &md_ktype, &disk->dev.kobj,
3331 "%s", "md"); 3469 "%s", "md");
3470 mutex_unlock(&disks_mutex);
3332 if (error) 3471 if (error)
3333 printk(KERN_WARNING "md: cannot register %s/md - name in use\n", 3472 printk(KERN_WARNING "md: cannot register %s/md - name in use\n",
3334 disk->disk_name); 3473 disk->disk_name);
@@ -3341,7 +3480,11 @@ static void md_safemode_timeout(unsigned long data)
3341{ 3480{
3342 mddev_t *mddev = (mddev_t *) data; 3481 mddev_t *mddev = (mddev_t *) data;
3343 3482
3344 mddev->safemode = 1; 3483 if (!atomic_read(&mddev->writes_pending)) {
3484 mddev->safemode = 1;
3485 if (mddev->external)
3486 sysfs_notify(&mddev->kobj, NULL, "array_state");
3487 }
3345 md_wakeup_thread(mddev->thread); 3488 md_wakeup_thread(mddev->thread);
3346} 3489}
3347 3490
@@ -3432,22 +3575,23 @@ static int do_md_run(mddev_t * mddev)
3432 * We don't want the data to overlap the metadata, 3575 * We don't want the data to overlap the metadata,
3433 * Internal Bitmap issues has handled elsewhere. 3576 * Internal Bitmap issues has handled elsewhere.
3434 */ 3577 */
3435 if (rdev->data_offset < rdev->sb_offset) { 3578 if (rdev->data_offset < rdev->sb_start) {
3436 if (mddev->size && 3579 if (mddev->size &&
3437 rdev->data_offset + mddev->size*2 3580 rdev->data_offset + mddev->size*2
3438 > rdev->sb_offset*2) { 3581 > rdev->sb_start) {
3439 printk("md: %s: data overlaps metadata\n", 3582 printk("md: %s: data overlaps metadata\n",
3440 mdname(mddev)); 3583 mdname(mddev));
3441 return -EINVAL; 3584 return -EINVAL;
3442 } 3585 }
3443 } else { 3586 } else {
3444 if (rdev->sb_offset*2 + rdev->sb_size/512 3587 if (rdev->sb_start + rdev->sb_size/512
3445 > rdev->data_offset) { 3588 > rdev->data_offset) {
3446 printk("md: %s: metadata overlaps data\n", 3589 printk("md: %s: metadata overlaps data\n",
3447 mdname(mddev)); 3590 mdname(mddev));
3448 return -EINVAL; 3591 return -EINVAL;
3449 } 3592 }
3450 } 3593 }
3594 sysfs_notify(&rdev->kobj, NULL, "state");
3451 } 3595 }
3452 3596
3453 md_probe(mddev->unit, NULL, NULL); 3597 md_probe(mddev->unit, NULL, NULL);
@@ -3519,7 +3663,9 @@ static int do_md_run(mddev_t * mddev)
3519 mddev->ro = 2; /* read-only, but switch on first write */ 3663 mddev->ro = 2; /* read-only, but switch on first write */
3520 3664
3521 err = mddev->pers->run(mddev); 3665 err = mddev->pers->run(mddev);
3522 if (!err && mddev->pers->sync_request) { 3666 if (err)
3667 printk(KERN_ERR "md: pers->run() failed ...\n");
3668 else if (mddev->pers->sync_request) {
3523 err = bitmap_create(mddev); 3669 err = bitmap_create(mddev);
3524 if (err) { 3670 if (err) {
3525 printk(KERN_ERR "%s: failed to create bitmap (%d)\n", 3671 printk(KERN_ERR "%s: failed to create bitmap (%d)\n",
@@ -3528,7 +3674,6 @@ static int do_md_run(mddev_t * mddev)
3528 } 3674 }
3529 } 3675 }
3530 if (err) { 3676 if (err) {
3531 printk(KERN_ERR "md: pers->run() failed ...\n");
3532 module_put(mddev->pers->owner); 3677 module_put(mddev->pers->owner);
3533 mddev->pers = NULL; 3678 mddev->pers = NULL;
3534 bitmap_destroy(mddev); 3679 bitmap_destroy(mddev);
@@ -3563,7 +3708,7 @@ static int do_md_run(mddev_t * mddev)
3563 if (mddev->flags) 3708 if (mddev->flags)
3564 md_update_sb(mddev, 0); 3709 md_update_sb(mddev, 0);
3565 3710
3566 set_capacity(disk, mddev->array_size<<1); 3711 set_capacity(disk, mddev->array_sectors);
3567 3712
3568 /* If we call blk_queue_make_request here, it will 3713 /* If we call blk_queue_make_request here, it will
3569 * re-initialise max_sectors etc which may have been 3714 * re-initialise max_sectors etc which may have been
@@ -3608,6 +3753,9 @@ static int do_md_run(mddev_t * mddev)
3608 3753
3609 mddev->changed = 1; 3754 mddev->changed = 1;
3610 md_new_event(mddev); 3755 md_new_event(mddev);
3756 sysfs_notify(&mddev->kobj, NULL, "array_state");
3757 sysfs_notify(&mddev->kobj, NULL, "sync_action");
3758 sysfs_notify(&mddev->kobj, NULL, "degraded");
3611 kobject_uevent(&mddev->gendisk->dev.kobj, KOBJ_CHANGE); 3759 kobject_uevent(&mddev->gendisk->dev.kobj, KOBJ_CHANGE);
3612 return 0; 3760 return 0;
3613} 3761}
@@ -3615,38 +3763,25 @@ static int do_md_run(mddev_t * mddev)
3615static int restart_array(mddev_t *mddev) 3763static int restart_array(mddev_t *mddev)
3616{ 3764{
3617 struct gendisk *disk = mddev->gendisk; 3765 struct gendisk *disk = mddev->gendisk;
3618 int err;
3619 3766
3620 /* 3767 /* Complain if it has no devices */
3621 * Complain if it has no devices
3622 */
3623 err = -ENXIO;
3624 if (list_empty(&mddev->disks)) 3768 if (list_empty(&mddev->disks))
3625 goto out; 3769 return -ENXIO;
3626 3770 if (!mddev->pers)
3627 if (mddev->pers) { 3771 return -EINVAL;
3628 err = -EBUSY; 3772 if (!mddev->ro)
3629 if (!mddev->ro) 3773 return -EBUSY;
3630 goto out; 3774 mddev->safemode = 0;
3631 3775 mddev->ro = 0;
3632 mddev->safemode = 0; 3776 set_disk_ro(disk, 0);
3633 mddev->ro = 0; 3777 printk(KERN_INFO "md: %s switched to read-write mode.\n",
3634 set_disk_ro(disk, 0); 3778 mdname(mddev));
3635 3779 /* Kick recovery or resync if necessary */
3636 printk(KERN_INFO "md: %s switched to read-write mode.\n", 3780 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
3637 mdname(mddev)); 3781 md_wakeup_thread(mddev->thread);
3638 /* 3782 md_wakeup_thread(mddev->sync_thread);
3639 * Kick recovery or resync if necessary 3783 sysfs_notify(&mddev->kobj, NULL, "array_state");
3640 */ 3784 return 0;
3641 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
3642 md_wakeup_thread(mddev->thread);
3643 md_wakeup_thread(mddev->sync_thread);
3644 err = 0;
3645 } else
3646 err = -EINVAL;
3647
3648out:
3649 return err;
3650} 3785}
3651 3786
3652/* similar to deny_write_access, but accounts for our holding a reference 3787/* similar to deny_write_access, but accounts for our holding a reference
@@ -3680,16 +3815,17 @@ static void restore_bitmap_write_access(struct file *file)
3680 * 1 - switch to readonly 3815 * 1 - switch to readonly
3681 * 2 - stop but do not disassemble array 3816 * 2 - stop but do not disassemble array
3682 */ 3817 */
3683static int do_md_stop(mddev_t * mddev, int mode) 3818static int do_md_stop(mddev_t * mddev, int mode, int is_open)
3684{ 3819{
3685 int err = 0; 3820 int err = 0;
3686 struct gendisk *disk = mddev->gendisk; 3821 struct gendisk *disk = mddev->gendisk;
3687 3822
3823 if (atomic_read(&mddev->openers) > is_open) {
3824 printk("md: %s still in use.\n",mdname(mddev));
3825 return -EBUSY;
3826 }
3827
3688 if (mddev->pers) { 3828 if (mddev->pers) {
3689 if (atomic_read(&mddev->active)>2) {
3690 printk("md: %s still in use.\n",mdname(mddev));
3691 return -EBUSY;
3692 }
3693 3829
3694 if (mddev->sync_thread) { 3830 if (mddev->sync_thread) {
3695 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 3831 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
@@ -3773,10 +3909,11 @@ static int do_md_stop(mddev_t * mddev, int mode)
3773 3909
3774 export_array(mddev); 3910 export_array(mddev);
3775 3911
3776 mddev->array_size = 0; 3912 mddev->array_sectors = 0;
3777 mddev->size = 0; 3913 mddev->size = 0;
3778 mddev->raid_disks = 0; 3914 mddev->raid_disks = 0;
3779 mddev->recovery_cp = 0; 3915 mddev->recovery_cp = 0;
3916 mddev->resync_min = 0;
3780 mddev->resync_max = MaxSector; 3917 mddev->resync_max = MaxSector;
3781 mddev->reshape_position = MaxSector; 3918 mddev->reshape_position = MaxSector;
3782 mddev->external = 0; 3919 mddev->external = 0;
@@ -3811,6 +3948,7 @@ static int do_md_stop(mddev_t * mddev, int mode)
3811 mdname(mddev)); 3948 mdname(mddev));
3812 err = 0; 3949 err = 0;
3813 md_new_event(mddev); 3950 md_new_event(mddev);
3951 sysfs_notify(&mddev->kobj, NULL, "array_state");
3814out: 3952out:
3815 return err; 3953 return err;
3816} 3954}
@@ -3836,7 +3974,7 @@ static void autorun_array(mddev_t *mddev)
3836 err = do_md_run (mddev); 3974 err = do_md_run (mddev);
3837 if (err) { 3975 if (err) {
3838 printk(KERN_WARNING "md: do_md_run() returned %d\n", err); 3976 printk(KERN_WARNING "md: do_md_run() returned %d\n", err);
3839 do_md_stop (mddev, 0); 3977 do_md_stop (mddev, 0, 0);
3840 } 3978 }
3841} 3979}
3842 3980
@@ -3927,8 +4065,10 @@ static void autorun_devices(int part)
3927 /* on success, candidates will be empty, on error 4065 /* on success, candidates will be empty, on error
3928 * it won't... 4066 * it won't...
3929 */ 4067 */
3930 rdev_for_each_list(rdev, tmp, candidates) 4068 rdev_for_each_list(rdev, tmp, candidates) {
4069 list_del_init(&rdev->same_set);
3931 export_rdev(rdev); 4070 export_rdev(rdev);
4071 }
3932 mddev_put(mddev); 4072 mddev_put(mddev);
3933 } 4073 }
3934 printk(KERN_INFO "md: ... autorun DONE.\n"); 4074 printk(KERN_INFO "md: ... autorun DONE.\n");
@@ -4009,9 +4149,11 @@ static int get_bitmap_file(mddev_t * mddev, void __user * arg)
4009 char *ptr, *buf = NULL; 4149 char *ptr, *buf = NULL;
4010 int err = -ENOMEM; 4150 int err = -ENOMEM;
4011 4151
4012 md_allow_write(mddev); 4152 if (md_allow_write(mddev))
4153 file = kmalloc(sizeof(*file), GFP_NOIO);
4154 else
4155 file = kmalloc(sizeof(*file), GFP_KERNEL);
4013 4156
4014 file = kmalloc(sizeof(*file), GFP_KERNEL);
4015 if (!file) 4157 if (!file)
4016 goto out; 4158 goto out;
4017 4159
@@ -4044,15 +4186,12 @@ out:
4044static int get_disk_info(mddev_t * mddev, void __user * arg) 4186static int get_disk_info(mddev_t * mddev, void __user * arg)
4045{ 4187{
4046 mdu_disk_info_t info; 4188 mdu_disk_info_t info;
4047 unsigned int nr;
4048 mdk_rdev_t *rdev; 4189 mdk_rdev_t *rdev;
4049 4190
4050 if (copy_from_user(&info, arg, sizeof(info))) 4191 if (copy_from_user(&info, arg, sizeof(info)))
4051 return -EFAULT; 4192 return -EFAULT;
4052 4193
4053 nr = info.number; 4194 rdev = find_rdev_nr(mddev, info.number);
4054
4055 rdev = find_rdev_nr(mddev, nr);
4056 if (rdev) { 4195 if (rdev) {
4057 info.major = MAJOR(rdev->bdev->bd_dev); 4196 info.major = MAJOR(rdev->bdev->bd_dev);
4058 info.minor = MINOR(rdev->bdev->bd_dev); 4197 info.minor = MINOR(rdev->bdev->bd_dev);
@@ -4172,8 +4311,12 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
4172 } 4311 }
4173 if (err) 4312 if (err)
4174 export_rdev(rdev); 4313 export_rdev(rdev);
4314 else
4315 sysfs_notify(&rdev->kobj, NULL, "state");
4175 4316
4176 md_update_sb(mddev, 1); 4317 md_update_sb(mddev, 1);
4318 if (mddev->degraded)
4319 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
4177 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4320 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
4178 md_wakeup_thread(mddev->thread); 4321 md_wakeup_thread(mddev->thread);
4179 return err; 4322 return err;
@@ -4212,10 +4355,10 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
4212 4355
4213 if (!mddev->persistent) { 4356 if (!mddev->persistent) {
4214 printk(KERN_INFO "md: nonpersistent superblock ...\n"); 4357 printk(KERN_INFO "md: nonpersistent superblock ...\n");
4215 rdev->sb_offset = rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; 4358 rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;
4216 } else 4359 } else
4217 rdev->sb_offset = calc_dev_sboffset(rdev->bdev); 4360 rdev->sb_start = calc_dev_sboffset(rdev->bdev);
4218 rdev->size = calc_dev_size(rdev, mddev->chunk_size); 4361 rdev->size = calc_num_sectors(rdev, mddev->chunk_size) / 2;
4219 4362
4220 err = bind_rdev_to_array(rdev, mddev); 4363 err = bind_rdev_to_array(rdev, mddev);
4221 if (err) { 4364 if (err) {
@@ -4232,9 +4375,6 @@ static int hot_remove_disk(mddev_t * mddev, dev_t dev)
4232 char b[BDEVNAME_SIZE]; 4375 char b[BDEVNAME_SIZE];
4233 mdk_rdev_t *rdev; 4376 mdk_rdev_t *rdev;
4234 4377
4235 if (!mddev->pers)
4236 return -ENODEV;
4237
4238 rdev = find_rdev(mddev, dev); 4378 rdev = find_rdev(mddev, dev);
4239 if (!rdev) 4379 if (!rdev)
4240 return -ENXIO; 4380 return -ENXIO;
@@ -4257,7 +4397,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
4257{ 4397{
4258 char b[BDEVNAME_SIZE]; 4398 char b[BDEVNAME_SIZE];
4259 int err; 4399 int err;
4260 unsigned int size;
4261 mdk_rdev_t *rdev; 4400 mdk_rdev_t *rdev;
4262 4401
4263 if (!mddev->pers) 4402 if (!mddev->pers)
@@ -4285,13 +4424,11 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
4285 } 4424 }
4286 4425
4287 if (mddev->persistent) 4426 if (mddev->persistent)
4288 rdev->sb_offset = calc_dev_sboffset(rdev->bdev); 4427 rdev->sb_start = calc_dev_sboffset(rdev->bdev);
4289 else 4428 else
4290 rdev->sb_offset = 4429 rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;
4291 rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS;
4292 4430
4293 size = calc_dev_size(rdev, mddev->chunk_size); 4431 rdev->size = calc_num_sectors(rdev, mddev->chunk_size) / 2;
4294 rdev->size = size;
4295 4432
4296 if (test_bit(Faulty, &rdev->flags)) { 4433 if (test_bit(Faulty, &rdev->flags)) {
4297 printk(KERN_WARNING 4434 printk(KERN_WARNING
@@ -4476,24 +4613,24 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
4476 return 0; 4613 return 0;
4477} 4614}
4478 4615
4479static int update_size(mddev_t *mddev, unsigned long size) 4616static int update_size(mddev_t *mddev, sector_t num_sectors)
4480{ 4617{
4481 mdk_rdev_t * rdev; 4618 mdk_rdev_t * rdev;
4482 int rv; 4619 int rv;
4483 struct list_head *tmp; 4620 struct list_head *tmp;
4484 int fit = (size == 0); 4621 int fit = (num_sectors == 0);
4485 4622
4486 if (mddev->pers->resize == NULL) 4623 if (mddev->pers->resize == NULL)
4487 return -EINVAL; 4624 return -EINVAL;
4488 /* The "size" is the amount of each device that is used. 4625 /* The "num_sectors" is the number of sectors of each device that
4489 * This can only make sense for arrays with redundancy. 4626 * is used. This can only make sense for arrays with redundancy.
4490 * linear and raid0 always use whatever space is available 4627 * linear and raid0 always use whatever space is available. We can only
4491 * We can only consider changing the size if no resync 4628 * consider changing this number if no resync or reconstruction is
4492 * or reconstruction is happening, and if the new size 4629 * happening, and if the new size is acceptable. It must fit before the
4493 * is acceptable. It must fit before the sb_offset or, 4630 * sb_start or, if that is <data_offset, it must fit before the size
4494 * if that is <data_offset, it must fit before the 4631 * of each device. If num_sectors is zero, we find the largest size
4495 * size of each device. 4632 * that fits.
4496 * If size is zero, we find the largest size that fits. 4633
4497 */ 4634 */
4498 if (mddev->sync_thread) 4635 if (mddev->sync_thread)
4499 return -EBUSY; 4636 return -EBUSY;
@@ -4501,19 +4638,20 @@ static int update_size(mddev_t *mddev, unsigned long size)
4501 sector_t avail; 4638 sector_t avail;
4502 avail = rdev->size * 2; 4639 avail = rdev->size * 2;
4503 4640
4504 if (fit && (size == 0 || size > avail/2)) 4641 if (fit && (num_sectors == 0 || num_sectors > avail))
4505 size = avail/2; 4642 num_sectors = avail;
4506 if (avail < ((sector_t)size << 1)) 4643 if (avail < num_sectors)
4507 return -ENOSPC; 4644 return -ENOSPC;
4508 } 4645 }
4509 rv = mddev->pers->resize(mddev, (sector_t)size *2); 4646 rv = mddev->pers->resize(mddev, num_sectors);
4510 if (!rv) { 4647 if (!rv) {
4511 struct block_device *bdev; 4648 struct block_device *bdev;
4512 4649
4513 bdev = bdget_disk(mddev->gendisk, 0); 4650 bdev = bdget_disk(mddev->gendisk, 0);
4514 if (bdev) { 4651 if (bdev) {
4515 mutex_lock(&bdev->bd_inode->i_mutex); 4652 mutex_lock(&bdev->bd_inode->i_mutex);
4516 i_size_write(bdev->bd_inode, (loff_t)mddev->array_size << 10); 4653 i_size_write(bdev->bd_inode,
4654 (loff_t)mddev->array_sectors << 9);
4517 mutex_unlock(&bdev->bd_inode->i_mutex); 4655 mutex_unlock(&bdev->bd_inode->i_mutex);
4518 bdput(bdev); 4656 bdput(bdev);
4519 } 4657 }
@@ -4588,7 +4726,7 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info)
4588 return mddev->pers->reconfig(mddev, info->layout, -1); 4726 return mddev->pers->reconfig(mddev, info->layout, -1);
4589 } 4727 }
4590 if (info->size >= 0 && mddev->size != info->size) 4728 if (info->size >= 0 && mddev->size != info->size)
4591 rv = update_size(mddev, info->size); 4729 rv = update_size(mddev, (sector_t)info->size * 2);
4592 4730
4593 if (mddev->raid_disks != info->raid_disks) 4731 if (mddev->raid_disks != info->raid_disks)
4594 rv = update_raid_disks(mddev, info->raid_disks); 4732 rv = update_raid_disks(mddev, info->raid_disks);
@@ -4641,6 +4779,12 @@ static int set_disk_faulty(mddev_t *mddev, dev_t dev)
4641 return 0; 4779 return 0;
4642} 4780}
4643 4781
4782/*
4783 * We have a problem here : there is no easy way to give a CHS
4784 * virtual geometry. We currently pretend that we have a 2 heads
4785 * 4 sectors (with a BIG number of cylinders...). This drives
4786 * dosfs just mad... ;-)
4787 */
4644static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo) 4788static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo)
4645{ 4789{
4646 mddev_t *mddev = bdev->bd_disk->private_data; 4790 mddev_t *mddev = bdev->bd_disk->private_data;
@@ -4785,19 +4929,13 @@ static int md_ioctl(struct inode *inode, struct file *file,
4785 goto done_unlock; 4929 goto done_unlock;
4786 4930
4787 case STOP_ARRAY: 4931 case STOP_ARRAY:
4788 err = do_md_stop (mddev, 0); 4932 err = do_md_stop (mddev, 0, 1);
4789 goto done_unlock; 4933 goto done_unlock;
4790 4934
4791 case STOP_ARRAY_RO: 4935 case STOP_ARRAY_RO:
4792 err = do_md_stop (mddev, 1); 4936 err = do_md_stop (mddev, 1, 1);
4793 goto done_unlock; 4937 goto done_unlock;
4794 4938
4795 /*
4796 * We have a problem here : there is no easy way to give a CHS
4797 * virtual geometry. We currently pretend that we have a 2 heads
4798 * 4 sectors (with a BIG number of cylinders...). This drives
4799 * dosfs just mad... ;-)
4800 */
4801 } 4939 }
4802 4940
4803 /* 4941 /*
@@ -4807,13 +4945,12 @@ static int md_ioctl(struct inode *inode, struct file *file,
4807 * here and hit the 'default' below, so only disallow 4945 * here and hit the 'default' below, so only disallow
4808 * 'md' ioctls, and switch to rw mode if started auto-readonly. 4946 * 'md' ioctls, and switch to rw mode if started auto-readonly.
4809 */ 4947 */
4810 if (_IOC_TYPE(cmd) == MD_MAJOR && 4948 if (_IOC_TYPE(cmd) == MD_MAJOR && mddev->ro && mddev->pers) {
4811 mddev->ro && mddev->pers) {
4812 if (mddev->ro == 2) { 4949 if (mddev->ro == 2) {
4813 mddev->ro = 0; 4950 mddev->ro = 0;
4814 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4951 sysfs_notify(&mddev->kobj, NULL, "array_state");
4815 md_wakeup_thread(mddev->thread); 4952 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
4816 4953 md_wakeup_thread(mddev->thread);
4817 } else { 4954 } else {
4818 err = -EROFS; 4955 err = -EROFS;
4819 goto abort_unlock; 4956 goto abort_unlock;
@@ -4883,6 +5020,7 @@ static int md_open(struct inode *inode, struct file *file)
4883 5020
4884 err = 0; 5021 err = 0;
4885 mddev_get(mddev); 5022 mddev_get(mddev);
5023 atomic_inc(&mddev->openers);
4886 mddev_unlock(mddev); 5024 mddev_unlock(mddev);
4887 5025
4888 check_disk_change(inode->i_bdev); 5026 check_disk_change(inode->i_bdev);
@@ -4895,6 +5033,7 @@ static int md_release(struct inode *inode, struct file * file)
4895 mddev_t *mddev = inode->i_bdev->bd_disk->private_data; 5033 mddev_t *mddev = inode->i_bdev->bd_disk->private_data;
4896 5034
4897 BUG_ON(!mddev); 5035 BUG_ON(!mddev);
5036 atomic_dec(&mddev->openers);
4898 mddev_put(mddev); 5037 mddev_put(mddev);
4899 5038
4900 return 0; 5039 return 0;
@@ -5029,6 +5168,9 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev)
5029 if (!mddev->pers->error_handler) 5168 if (!mddev->pers->error_handler)
5030 return; 5169 return;
5031 mddev->pers->error_handler(mddev,rdev); 5170 mddev->pers->error_handler(mddev,rdev);
5171 if (mddev->degraded)
5172 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
5173 set_bit(StateChanged, &rdev->flags);
5032 set_bit(MD_RECOVERY_INTR, &mddev->recovery); 5174 set_bit(MD_RECOVERY_INTR, &mddev->recovery);
5033 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 5175 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
5034 md_wakeup_thread(mddev->thread); 5176 md_wakeup_thread(mddev->thread);
@@ -5258,10 +5400,11 @@ static int md_seq_show(struct seq_file *seq, void *v)
5258 if (!list_empty(&mddev->disks)) { 5400 if (!list_empty(&mddev->disks)) {
5259 if (mddev->pers) 5401 if (mddev->pers)
5260 seq_printf(seq, "\n %llu blocks", 5402 seq_printf(seq, "\n %llu blocks",
5261 (unsigned long long)mddev->array_size); 5403 (unsigned long long)
5404 mddev->array_sectors / 2);
5262 else 5405 else
5263 seq_printf(seq, "\n %llu blocks", 5406 seq_printf(seq, "\n %llu blocks",
5264 (unsigned long long)size); 5407 (unsigned long long)size);
5265 } 5408 }
5266 if (mddev->persistent) { 5409 if (mddev->persistent) {
5267 if (mddev->major_version != 0 || 5410 if (mddev->major_version != 0 ||
@@ -5391,12 +5534,12 @@ int unregister_md_personality(struct mdk_personality *p)
5391static int is_mddev_idle(mddev_t *mddev) 5534static int is_mddev_idle(mddev_t *mddev)
5392{ 5535{
5393 mdk_rdev_t * rdev; 5536 mdk_rdev_t * rdev;
5394 struct list_head *tmp;
5395 int idle; 5537 int idle;
5396 long curr_events; 5538 long curr_events;
5397 5539
5398 idle = 1; 5540 idle = 1;
5399 rdev_for_each(rdev, tmp, mddev) { 5541 rcu_read_lock();
5542 rdev_for_each_rcu(rdev, mddev) {
5400 struct gendisk *disk = rdev->bdev->bd_contains->bd_disk; 5543 struct gendisk *disk = rdev->bdev->bd_contains->bd_disk;
5401 curr_events = disk_stat_read(disk, sectors[0]) + 5544 curr_events = disk_stat_read(disk, sectors[0]) +
5402 disk_stat_read(disk, sectors[1]) - 5545 disk_stat_read(disk, sectors[1]) -
@@ -5428,6 +5571,7 @@ static int is_mddev_idle(mddev_t *mddev)
5428 idle = 0; 5571 idle = 0;
5429 } 5572 }
5430 } 5573 }
5574 rcu_read_unlock();
5431 return idle; 5575 return idle;
5432} 5576}
5433 5577
@@ -5451,6 +5595,7 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)
5451 */ 5595 */
5452void md_write_start(mddev_t *mddev, struct bio *bi) 5596void md_write_start(mddev_t *mddev, struct bio *bi)
5453{ 5597{
5598 int did_change = 0;
5454 if (bio_data_dir(bi) != WRITE) 5599 if (bio_data_dir(bi) != WRITE)
5455 return; 5600 return;
5456 5601
@@ -5461,6 +5606,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
5461 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 5606 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
5462 md_wakeup_thread(mddev->thread); 5607 md_wakeup_thread(mddev->thread);
5463 md_wakeup_thread(mddev->sync_thread); 5608 md_wakeup_thread(mddev->sync_thread);
5609 did_change = 1;
5464 } 5610 }
5465 atomic_inc(&mddev->writes_pending); 5611 atomic_inc(&mddev->writes_pending);
5466 if (mddev->safemode == 1) 5612 if (mddev->safemode == 1)
@@ -5471,10 +5617,12 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
5471 mddev->in_sync = 0; 5617 mddev->in_sync = 0;
5472 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 5618 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
5473 md_wakeup_thread(mddev->thread); 5619 md_wakeup_thread(mddev->thread);
5620 did_change = 1;
5474 } 5621 }
5475 spin_unlock_irq(&mddev->write_lock); 5622 spin_unlock_irq(&mddev->write_lock);
5476 sysfs_notify(&mddev->kobj, NULL, "array_state");
5477 } 5623 }
5624 if (did_change)
5625 sysfs_notify(&mddev->kobj, NULL, "array_state");
5478 wait_event(mddev->sb_wait, 5626 wait_event(mddev->sb_wait,
5479 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && 5627 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
5480 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); 5628 !test_bit(MD_CHANGE_PENDING, &mddev->flags));
@@ -5495,13 +5643,18 @@ void md_write_end(mddev_t *mddev)
5495 * may proceed without blocking. It is important to call this before 5643 * may proceed without blocking. It is important to call this before
5496 * attempting a GFP_KERNEL allocation while holding the mddev lock. 5644 * attempting a GFP_KERNEL allocation while holding the mddev lock.
5497 * Must be called with mddev_lock held. 5645 * Must be called with mddev_lock held.
5646 *
5647 * In the ->external case MD_CHANGE_CLEAN can not be cleared until mddev->lock
5648 * is dropped, so return -EAGAIN after notifying userspace.
5498 */ 5649 */
5499void md_allow_write(mddev_t *mddev) 5650int md_allow_write(mddev_t *mddev)
5500{ 5651{
5501 if (!mddev->pers) 5652 if (!mddev->pers)
5502 return; 5653 return 0;
5503 if (mddev->ro) 5654 if (mddev->ro)
5504 return; 5655 return 0;
5656 if (!mddev->pers->sync_request)
5657 return 0;
5505 5658
5506 spin_lock_irq(&mddev->write_lock); 5659 spin_lock_irq(&mddev->write_lock);
5507 if (mddev->in_sync) { 5660 if (mddev->in_sync) {
@@ -5512,14 +5665,14 @@ void md_allow_write(mddev_t *mddev)
5512 mddev->safemode = 1; 5665 mddev->safemode = 1;
5513 spin_unlock_irq(&mddev->write_lock); 5666 spin_unlock_irq(&mddev->write_lock);
5514 md_update_sb(mddev, 0); 5667 md_update_sb(mddev, 0);
5515
5516 sysfs_notify(&mddev->kobj, NULL, "array_state"); 5668 sysfs_notify(&mddev->kobj, NULL, "array_state");
5517 /* wait for the dirty state to be recorded in the metadata */
5518 wait_event(mddev->sb_wait,
5519 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
5520 !test_bit(MD_CHANGE_PENDING, &mddev->flags));
5521 } else 5669 } else
5522 spin_unlock_irq(&mddev->write_lock); 5670 spin_unlock_irq(&mddev->write_lock);
5671
5672 if (test_bit(MD_CHANGE_CLEAN, &mddev->flags))
5673 return -EAGAIN;
5674 else
5675 return 0;
5523} 5676}
5524EXPORT_SYMBOL_GPL(md_allow_write); 5677EXPORT_SYMBOL_GPL(md_allow_write);
5525 5678
@@ -5625,9 +5778,11 @@ void md_do_sync(mddev_t *mddev)
5625 max_sectors = mddev->resync_max_sectors; 5778 max_sectors = mddev->resync_max_sectors;
5626 mddev->resync_mismatches = 0; 5779 mddev->resync_mismatches = 0;
5627 /* we don't use the checkpoint if there's a bitmap */ 5780 /* we don't use the checkpoint if there's a bitmap */
5628 if (!mddev->bitmap && 5781 if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
5629 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) 5782 j = mddev->resync_min;
5783 else if (!mddev->bitmap)
5630 j = mddev->recovery_cp; 5784 j = mddev->recovery_cp;
5785
5631 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) 5786 } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
5632 max_sectors = mddev->size << 1; 5787 max_sectors = mddev->size << 1;
5633 else { 5788 else {
@@ -5796,6 +5951,7 @@ void md_do_sync(mddev_t *mddev)
5796 5951
5797 skip: 5952 skip:
5798 mddev->curr_resync = 0; 5953 mddev->curr_resync = 0;
5954 mddev->resync_min = 0;
5799 mddev->resync_max = MaxSector; 5955 mddev->resync_max = MaxSector;
5800 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); 5956 sysfs_notify(&mddev->kobj, NULL, "sync_completed");
5801 wake_up(&resync_wait); 5957 wake_up(&resync_wait);
@@ -5845,7 +6001,8 @@ static int remove_and_add_spares(mddev_t *mddev)
5845 if (rdev->raid_disk < 0 6001 if (rdev->raid_disk < 0
5846 && !test_bit(Faulty, &rdev->flags)) { 6002 && !test_bit(Faulty, &rdev->flags)) {
5847 rdev->recovery_offset = 0; 6003 rdev->recovery_offset = 0;
5848 if (mddev->pers->hot_add_disk(mddev,rdev)) { 6004 if (mddev->pers->
6005 hot_add_disk(mddev, rdev) == 0) {
5849 char nm[20]; 6006 char nm[20];
5850 sprintf(nm, "rd%d", rdev->raid_disk); 6007 sprintf(nm, "rd%d", rdev->raid_disk);
5851 if (sysfs_create_link(&mddev->kobj, 6008 if (sysfs_create_link(&mddev->kobj,
@@ -5920,23 +6077,31 @@ void md_check_recovery(mddev_t *mddev)
5920 int spares = 0; 6077 int spares = 0;
5921 6078
5922 if (!mddev->external) { 6079 if (!mddev->external) {
6080 int did_change = 0;
5923 spin_lock_irq(&mddev->write_lock); 6081 spin_lock_irq(&mddev->write_lock);
5924 if (mddev->safemode && 6082 if (mddev->safemode &&
5925 !atomic_read(&mddev->writes_pending) && 6083 !atomic_read(&mddev->writes_pending) &&
5926 !mddev->in_sync && 6084 !mddev->in_sync &&
5927 mddev->recovery_cp == MaxSector) { 6085 mddev->recovery_cp == MaxSector) {
5928 mddev->in_sync = 1; 6086 mddev->in_sync = 1;
6087 did_change = 1;
5929 if (mddev->persistent) 6088 if (mddev->persistent)
5930 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6089 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
5931 } 6090 }
5932 if (mddev->safemode == 1) 6091 if (mddev->safemode == 1)
5933 mddev->safemode = 0; 6092 mddev->safemode = 0;
5934 spin_unlock_irq(&mddev->write_lock); 6093 spin_unlock_irq(&mddev->write_lock);
6094 if (did_change)
6095 sysfs_notify(&mddev->kobj, NULL, "array_state");
5935 } 6096 }
5936 6097
5937 if (mddev->flags) 6098 if (mddev->flags)
5938 md_update_sb(mddev, 0); 6099 md_update_sb(mddev, 0);
5939 6100
6101 rdev_for_each(rdev, rtmp, mddev)
6102 if (test_and_clear_bit(StateChanged, &rdev->flags))
6103 sysfs_notify(&rdev->kobj, NULL, "state");
6104
5940 6105
5941 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && 6106 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
5942 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) { 6107 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
@@ -5951,7 +6116,9 @@ void md_check_recovery(mddev_t *mddev)
5951 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { 6116 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
5952 /* success...*/ 6117 /* success...*/
5953 /* activate any spares */ 6118 /* activate any spares */
5954 mddev->pers->spare_active(mddev); 6119 if (mddev->pers->spare_active(mddev))
6120 sysfs_notify(&mddev->kobj, NULL,
6121 "degraded");
5955 } 6122 }
5956 md_update_sb(mddev, 1); 6123 md_update_sb(mddev, 1);
5957 6124
@@ -5965,13 +6132,18 @@ void md_check_recovery(mddev_t *mddev)
5965 mddev->recovery = 0; 6132 mddev->recovery = 0;
5966 /* flag recovery needed just to double check */ 6133 /* flag recovery needed just to double check */
5967 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 6134 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
6135 sysfs_notify(&mddev->kobj, NULL, "sync_action");
5968 md_new_event(mddev); 6136 md_new_event(mddev);
5969 goto unlock; 6137 goto unlock;
5970 } 6138 }
6139 /* Set RUNNING before clearing NEEDED to avoid
6140 * any transients in the value of "sync_action".
6141 */
6142 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
6143 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
5971 /* Clear some bits that don't mean anything, but 6144 /* Clear some bits that don't mean anything, but
5972 * might be left set 6145 * might be left set
5973 */ 6146 */
5974 clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
5975 clear_bit(MD_RECOVERY_INTR, &mddev->recovery); 6147 clear_bit(MD_RECOVERY_INTR, &mddev->recovery);
5976 clear_bit(MD_RECOVERY_DONE, &mddev->recovery); 6148 clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
5977 6149
@@ -5989,17 +6161,19 @@ void md_check_recovery(mddev_t *mddev)
5989 /* Cannot proceed */ 6161 /* Cannot proceed */
5990 goto unlock; 6162 goto unlock;
5991 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); 6163 set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
6164 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
5992 } else if ((spares = remove_and_add_spares(mddev))) { 6165 } else if ((spares = remove_and_add_spares(mddev))) {
5993 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); 6166 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
5994 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); 6167 clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
6168 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
5995 } else if (mddev->recovery_cp < MaxSector) { 6169 } else if (mddev->recovery_cp < MaxSector) {
5996 set_bit(MD_RECOVERY_SYNC, &mddev->recovery); 6170 set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
6171 clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
5997 } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) 6172 } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
5998 /* nothing to be done ... */ 6173 /* nothing to be done ... */
5999 goto unlock; 6174 goto unlock;
6000 6175
6001 if (mddev->pers->sync_request) { 6176 if (mddev->pers->sync_request) {
6002 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
6003 if (spares && mddev->bitmap && ! mddev->bitmap->file) { 6177 if (spares && mddev->bitmap && ! mddev->bitmap->file) {
6004 /* We are adding a device or devices to an array 6178 /* We are adding a device or devices to an array
6005 * which has the bitmap stored on all devices. 6179 * which has the bitmap stored on all devices.
@@ -6018,9 +6192,16 @@ void md_check_recovery(mddev_t *mddev)
6018 mddev->recovery = 0; 6192 mddev->recovery = 0;
6019 } else 6193 } else
6020 md_wakeup_thread(mddev->sync_thread); 6194 md_wakeup_thread(mddev->sync_thread);
6195 sysfs_notify(&mddev->kobj, NULL, "sync_action");
6021 md_new_event(mddev); 6196 md_new_event(mddev);
6022 } 6197 }
6023 unlock: 6198 unlock:
6199 if (!mddev->sync_thread) {
6200 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
6201 if (test_and_clear_bit(MD_RECOVERY_RECOVER,
6202 &mddev->recovery))
6203 sysfs_notify(&mddev->kobj, NULL, "sync_action");
6204 }
6024 mddev_unlock(mddev); 6205 mddev_unlock(mddev);
6025 } 6206 }
6026} 6207}
@@ -6047,7 +6228,7 @@ static int md_notify_reboot(struct notifier_block *this,
6047 6228
6048 for_each_mddev(mddev, tmp) 6229 for_each_mddev(mddev, tmp)
6049 if (mddev_trylock(mddev)) { 6230 if (mddev_trylock(mddev)) {
6050 do_md_stop (mddev, 1); 6231 do_md_stop (mddev, 1, 0);
6051 mddev_unlock(mddev); 6232 mddev_unlock(mddev);
6052 } 6233 }
6053 /* 6234 /*
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
index e968116e0de9..c4779ccba1c3 100644
--- a/drivers/md/multipath.c
+++ b/drivers/md/multipath.c
@@ -281,13 +281,18 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
281{ 281{
282 multipath_conf_t *conf = mddev->private; 282 multipath_conf_t *conf = mddev->private;
283 struct request_queue *q; 283 struct request_queue *q;
284 int found = 0; 284 int err = -EEXIST;
285 int path; 285 int path;
286 struct multipath_info *p; 286 struct multipath_info *p;
287 int first = 0;
288 int last = mddev->raid_disks - 1;
289
290 if (rdev->raid_disk >= 0)
291 first = last = rdev->raid_disk;
287 292
288 print_multipath_conf(conf); 293 print_multipath_conf(conf);
289 294
290 for (path=0; path<mddev->raid_disks; path++) 295 for (path = first; path <= last; path++)
291 if ((p=conf->multipaths+path)->rdev == NULL) { 296 if ((p=conf->multipaths+path)->rdev == NULL) {
292 q = rdev->bdev->bd_disk->queue; 297 q = rdev->bdev->bd_disk->queue;
293 blk_queue_stack_limits(mddev->queue, q); 298 blk_queue_stack_limits(mddev->queue, q);
@@ -307,11 +312,13 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
307 rdev->raid_disk = path; 312 rdev->raid_disk = path;
308 set_bit(In_sync, &rdev->flags); 313 set_bit(In_sync, &rdev->flags);
309 rcu_assign_pointer(p->rdev, rdev); 314 rcu_assign_pointer(p->rdev, rdev);
310 found = 1; 315 err = 0;
316 break;
311 } 317 }
312 318
313 print_multipath_conf(conf); 319 print_multipath_conf(conf);
314 return found; 320
321 return err;
315} 322}
316 323
317static int multipath_remove_disk(mddev_t *mddev, int number) 324static int multipath_remove_disk(mddev_t *mddev, int number)
@@ -497,7 +504,7 @@ static int multipath_run (mddev_t *mddev)
497 /* 504 /*
498 * Ok, everything is just fine now 505 * Ok, everything is just fine now
499 */ 506 */
500 mddev->array_size = mddev->size; 507 mddev->array_sectors = mddev->size * 2;
501 508
502 mddev->queue->unplug_fn = multipath_unplug; 509 mddev->queue->unplug_fn = multipath_unplug;
503 mddev->queue->backing_dev_info.congested_fn = multipath_congested; 510 mddev->queue->backing_dev_info.congested_fn = multipath_congested;
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index bcbb82594a19..183610635661 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -295,16 +295,16 @@ static int raid0_run (mddev_t *mddev)
295 goto out_free_conf; 295 goto out_free_conf;
296 296
297 /* calculate array device size */ 297 /* calculate array device size */
298 mddev->array_size = 0; 298 mddev->array_sectors = 0;
299 rdev_for_each(rdev, tmp, mddev) 299 rdev_for_each(rdev, tmp, mddev)
300 mddev->array_size += rdev->size; 300 mddev->array_sectors += rdev->size * 2;
301 301
302 printk("raid0 : md_size is %llu blocks.\n", 302 printk("raid0 : md_size is %llu blocks.\n",
303 (unsigned long long)mddev->array_size); 303 (unsigned long long)mddev->array_sectors / 2);
304 printk("raid0 : conf->hash_spacing is %llu blocks.\n", 304 printk("raid0 : conf->hash_spacing is %llu blocks.\n",
305 (unsigned long long)conf->hash_spacing); 305 (unsigned long long)conf->hash_spacing);
306 { 306 {
307 sector_t s = mddev->array_size; 307 sector_t s = mddev->array_sectors / 2;
308 sector_t space = conf->hash_spacing; 308 sector_t space = conf->hash_spacing;
309 int round; 309 int round;
310 conf->preshift = 0; 310 conf->preshift = 0;
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index c610b947218a..03a5ab705c20 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1100,11 +1100,16 @@ static int raid1_spare_active(mddev_t *mddev)
1100static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) 1100static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
1101{ 1101{
1102 conf_t *conf = mddev->private; 1102 conf_t *conf = mddev->private;
1103 int found = 0; 1103 int err = -EEXIST;
1104 int mirror = 0; 1104 int mirror = 0;
1105 mirror_info_t *p; 1105 mirror_info_t *p;
1106 int first = 0;
1107 int last = mddev->raid_disks - 1;
1106 1108
1107 for (mirror=0; mirror < mddev->raid_disks; mirror++) 1109 if (rdev->raid_disk >= 0)
1110 first = last = rdev->raid_disk;
1111
1112 for (mirror = first; mirror <= last; mirror++)
1108 if ( !(p=conf->mirrors+mirror)->rdev) { 1113 if ( !(p=conf->mirrors+mirror)->rdev) {
1109 1114
1110 blk_queue_stack_limits(mddev->queue, 1115 blk_queue_stack_limits(mddev->queue,
@@ -1119,7 +1124,7 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
1119 1124
1120 p->head_position = 0; 1125 p->head_position = 0;
1121 rdev->raid_disk = mirror; 1126 rdev->raid_disk = mirror;
1122 found = 1; 1127 err = 0;
1123 /* As all devices are equivalent, we don't need a full recovery 1128 /* As all devices are equivalent, we don't need a full recovery
1124 * if this was recently any drive of the array 1129 * if this was recently any drive of the array
1125 */ 1130 */
@@ -1130,7 +1135,7 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
1130 } 1135 }
1131 1136
1132 print_conf(conf); 1137 print_conf(conf);
1133 return found; 1138 return err;
1134} 1139}
1135 1140
1136static int raid1_remove_disk(mddev_t *mddev, int number) 1141static int raid1_remove_disk(mddev_t *mddev, int number)
@@ -2038,7 +2043,7 @@ static int run(mddev_t *mddev)
2038 /* 2043 /*
2039 * Ok, everything is just fine now 2044 * Ok, everything is just fine now
2040 */ 2045 */
2041 mddev->array_size = mddev->size; 2046 mddev->array_sectors = mddev->size * 2;
2042 2047
2043 mddev->queue->unplug_fn = raid1_unplug; 2048 mddev->queue->unplug_fn = raid1_unplug;
2044 mddev->queue->backing_dev_info.congested_fn = raid1_congested; 2049 mddev->queue->backing_dev_info.congested_fn = raid1_congested;
@@ -2100,14 +2105,15 @@ static int raid1_resize(mddev_t *mddev, sector_t sectors)
2100 * any io in the removed space completes, but it hardly seems 2105 * any io in the removed space completes, but it hardly seems
2101 * worth it. 2106 * worth it.
2102 */ 2107 */
2103 mddev->array_size = sectors>>1; 2108 mddev->array_sectors = sectors;
2104 set_capacity(mddev->gendisk, mddev->array_size << 1); 2109 set_capacity(mddev->gendisk, mddev->array_sectors);
2105 mddev->changed = 1; 2110 mddev->changed = 1;
2106 if (mddev->array_size > mddev->size && mddev->recovery_cp == MaxSector) { 2111 if (mddev->array_sectors / 2 > mddev->size &&
2112 mddev->recovery_cp == MaxSector) {
2107 mddev->recovery_cp = mddev->size << 1; 2113 mddev->recovery_cp = mddev->size << 1;
2108 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 2114 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
2109 } 2115 }
2110 mddev->size = mddev->array_size; 2116 mddev->size = mddev->array_sectors / 2;
2111 mddev->resync_max_sectors = sectors; 2117 mddev->resync_max_sectors = sectors;
2112 return 0; 2118 return 0;
2113} 2119}
@@ -2131,7 +2137,7 @@ static int raid1_reshape(mddev_t *mddev)
2131 conf_t *conf = mddev_to_conf(mddev); 2137 conf_t *conf = mddev_to_conf(mddev);
2132 int cnt, raid_disks; 2138 int cnt, raid_disks;
2133 unsigned long flags; 2139 unsigned long flags;
2134 int d, d2; 2140 int d, d2, err;
2135 2141
2136 /* Cannot change chunk_size, layout, or level */ 2142 /* Cannot change chunk_size, layout, or level */
2137 if (mddev->chunk_size != mddev->new_chunk || 2143 if (mddev->chunk_size != mddev->new_chunk ||
@@ -2143,7 +2149,9 @@ static int raid1_reshape(mddev_t *mddev)
2143 return -EINVAL; 2149 return -EINVAL;
2144 } 2150 }
2145 2151
2146 md_allow_write(mddev); 2152 err = md_allow_write(mddev);
2153 if (err)
2154 return err;
2147 2155
2148 raid_disks = mddev->raid_disks + mddev->delta_disks; 2156 raid_disks = mddev->raid_disks + mddev->delta_disks;
2149 2157
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 22bb2b1b886d..159535d73567 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1114,24 +1114,30 @@ static int raid10_spare_active(mddev_t *mddev)
1114static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) 1114static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
1115{ 1115{
1116 conf_t *conf = mddev->private; 1116 conf_t *conf = mddev->private;
1117 int found = 0; 1117 int err = -EEXIST;
1118 int mirror; 1118 int mirror;
1119 mirror_info_t *p; 1119 mirror_info_t *p;
1120 int first = 0;
1121 int last = mddev->raid_disks - 1;
1120 1122
1121 if (mddev->recovery_cp < MaxSector) 1123 if (mddev->recovery_cp < MaxSector)
1122 /* only hot-add to in-sync arrays, as recovery is 1124 /* only hot-add to in-sync arrays, as recovery is
1123 * very different from resync 1125 * very different from resync
1124 */ 1126 */
1125 return 0; 1127 return -EBUSY;
1126 if (!enough(conf)) 1128 if (!enough(conf))
1127 return 0; 1129 return -EINVAL;
1130
1131 if (rdev->raid_disk)
1132 first = last = rdev->raid_disk;
1128 1133
1129 if (rdev->saved_raid_disk >= 0 && 1134 if (rdev->saved_raid_disk >= 0 &&
1135 rdev->saved_raid_disk >= first &&
1130 conf->mirrors[rdev->saved_raid_disk].rdev == NULL) 1136 conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
1131 mirror = rdev->saved_raid_disk; 1137 mirror = rdev->saved_raid_disk;
1132 else 1138 else
1133 mirror = 0; 1139 mirror = first;
1134 for ( ; mirror < mddev->raid_disks; mirror++) 1140 for ( ; mirror <= last ; mirror++)
1135 if ( !(p=conf->mirrors+mirror)->rdev) { 1141 if ( !(p=conf->mirrors+mirror)->rdev) {
1136 1142
1137 blk_queue_stack_limits(mddev->queue, 1143 blk_queue_stack_limits(mddev->queue,
@@ -1146,7 +1152,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
1146 1152
1147 p->head_position = 0; 1153 p->head_position = 0;
1148 rdev->raid_disk = mirror; 1154 rdev->raid_disk = mirror;
1149 found = 1; 1155 err = 0;
1150 if (rdev->saved_raid_disk != mirror) 1156 if (rdev->saved_raid_disk != mirror)
1151 conf->fullsync = 1; 1157 conf->fullsync = 1;
1152 rcu_assign_pointer(p->rdev, rdev); 1158 rcu_assign_pointer(p->rdev, rdev);
@@ -1154,7 +1160,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
1154 } 1160 }
1155 1161
1156 print_conf(conf); 1162 print_conf(conf);
1157 return found; 1163 return err;
1158} 1164}
1159 1165
1160static int raid10_remove_disk(mddev_t *mddev, int number) 1166static int raid10_remove_disk(mddev_t *mddev, int number)
@@ -2159,7 +2165,7 @@ static int run(mddev_t *mddev)
2159 /* 2165 /*
2160 * Ok, everything is just fine now 2166 * Ok, everything is just fine now
2161 */ 2167 */
2162 mddev->array_size = size << (conf->chunk_shift-1); 2168 mddev->array_sectors = size << conf->chunk_shift;
2163 mddev->resync_max_sectors = size << conf->chunk_shift; 2169 mddev->resync_max_sectors = size << conf->chunk_shift;
2164 2170
2165 mddev->queue->unplug_fn = raid10_unplug; 2171 mddev->queue->unplug_fn = raid10_unplug;
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 9ce7154845c6..55e7c56045a0 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -115,15 +115,20 @@ static void return_io(struct bio *return_bi)
115 return_bi = bi->bi_next; 115 return_bi = bi->bi_next;
116 bi->bi_next = NULL; 116 bi->bi_next = NULL;
117 bi->bi_size = 0; 117 bi->bi_size = 0;
118 bi->bi_end_io(bi, 118 bio_endio(bi, 0);
119 test_bit(BIO_UPTODATE, &bi->bi_flags)
120 ? 0 : -EIO);
121 bi = return_bi; 119 bi = return_bi;
122 } 120 }
123} 121}
124 122
125static void print_raid5_conf (raid5_conf_t *conf); 123static void print_raid5_conf (raid5_conf_t *conf);
126 124
125static int stripe_operations_active(struct stripe_head *sh)
126{
127 return sh->check_state || sh->reconstruct_state ||
128 test_bit(STRIPE_BIOFILL_RUN, &sh->state) ||
129 test_bit(STRIPE_COMPUTE_RUN, &sh->state);
130}
131
127static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh) 132static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
128{ 133{
129 if (atomic_dec_and_test(&sh->count)) { 134 if (atomic_dec_and_test(&sh->count)) {
@@ -143,7 +148,7 @@ static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
143 } 148 }
144 md_wakeup_thread(conf->mddev->thread); 149 md_wakeup_thread(conf->mddev->thread);
145 } else { 150 } else {
146 BUG_ON(sh->ops.pending); 151 BUG_ON(stripe_operations_active(sh));
147 if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) { 152 if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) {
148 atomic_dec(&conf->preread_active_stripes); 153 atomic_dec(&conf->preread_active_stripes);
149 if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) 154 if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD)
@@ -245,7 +250,7 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int pd_idx, int
245 250
246 BUG_ON(atomic_read(&sh->count) != 0); 251 BUG_ON(atomic_read(&sh->count) != 0);
247 BUG_ON(test_bit(STRIPE_HANDLE, &sh->state)); 252 BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
248 BUG_ON(sh->ops.pending || sh->ops.ack || sh->ops.complete); 253 BUG_ON(stripe_operations_active(sh));
249 254
250 CHECK_DEVLOCK(); 255 CHECK_DEVLOCK();
251 pr_debug("init_stripe called, stripe %llu\n", 256 pr_debug("init_stripe called, stripe %llu\n",
@@ -346,62 +351,18 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector
346 return sh; 351 return sh;
347} 352}
348 353
349/* test_and_ack_op() ensures that we only dequeue an operation once */
350#define test_and_ack_op(op, pend) \
351do { \
352 if (test_bit(op, &sh->ops.pending) && \
353 !test_bit(op, &sh->ops.complete)) { \
354 if (test_and_set_bit(op, &sh->ops.ack)) \
355 clear_bit(op, &pend); \
356 else \
357 ack++; \
358 } else \
359 clear_bit(op, &pend); \
360} while (0)
361
362/* find new work to run, do not resubmit work that is already
363 * in flight
364 */
365static unsigned long get_stripe_work(struct stripe_head *sh)
366{
367 unsigned long pending;
368 int ack = 0;
369
370 pending = sh->ops.pending;
371
372 test_and_ack_op(STRIPE_OP_BIOFILL, pending);
373 test_and_ack_op(STRIPE_OP_COMPUTE_BLK, pending);
374 test_and_ack_op(STRIPE_OP_PREXOR, pending);
375 test_and_ack_op(STRIPE_OP_BIODRAIN, pending);
376 test_and_ack_op(STRIPE_OP_POSTXOR, pending);
377 test_and_ack_op(STRIPE_OP_CHECK, pending);
378 if (test_and_clear_bit(STRIPE_OP_IO, &sh->ops.pending))
379 ack++;
380
381 sh->ops.count -= ack;
382 if (unlikely(sh->ops.count < 0)) {
383 printk(KERN_ERR "pending: %#lx ops.pending: %#lx ops.ack: %#lx "
384 "ops.complete: %#lx\n", pending, sh->ops.pending,
385 sh->ops.ack, sh->ops.complete);
386 BUG();
387 }
388
389 return pending;
390}
391
392static void 354static void
393raid5_end_read_request(struct bio *bi, int error); 355raid5_end_read_request(struct bio *bi, int error);
394static void 356static void
395raid5_end_write_request(struct bio *bi, int error); 357raid5_end_write_request(struct bio *bi, int error);
396 358
397static void ops_run_io(struct stripe_head *sh) 359static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
398{ 360{
399 raid5_conf_t *conf = sh->raid_conf; 361 raid5_conf_t *conf = sh->raid_conf;
400 int i, disks = sh->disks; 362 int i, disks = sh->disks;
401 363
402 might_sleep(); 364 might_sleep();
403 365
404 set_bit(STRIPE_IO_STARTED, &sh->state);
405 for (i = disks; i--; ) { 366 for (i = disks; i--; ) {
406 int rw; 367 int rw;
407 struct bio *bi; 368 struct bio *bi;
@@ -430,11 +391,11 @@ static void ops_run_io(struct stripe_head *sh)
430 rcu_read_unlock(); 391 rcu_read_unlock();
431 392
432 if (rdev) { 393 if (rdev) {
433 if (test_bit(STRIPE_SYNCING, &sh->state) || 394 if (s->syncing || s->expanding || s->expanded)
434 test_bit(STRIPE_EXPAND_SOURCE, &sh->state) ||
435 test_bit(STRIPE_EXPAND_READY, &sh->state))
436 md_sync_acct(rdev->bdev, STRIPE_SECTORS); 395 md_sync_acct(rdev->bdev, STRIPE_SECTORS);
437 396
397 set_bit(STRIPE_IO_STARTED, &sh->state);
398
438 bi->bi_bdev = rdev->bdev; 399 bi->bi_bdev = rdev->bdev;
439 pr_debug("%s: for %llu schedule op %ld on disc %d\n", 400 pr_debug("%s: for %llu schedule op %ld on disc %d\n",
440 __func__, (unsigned long long)sh->sector, 401 __func__, (unsigned long long)sh->sector,
@@ -528,38 +489,34 @@ static void ops_complete_biofill(void *stripe_head_ref)
528 (unsigned long long)sh->sector); 489 (unsigned long long)sh->sector);
529 490
530 /* clear completed biofills */ 491 /* clear completed biofills */
492 spin_lock_irq(&conf->device_lock);
531 for (i = sh->disks; i--; ) { 493 for (i = sh->disks; i--; ) {
532 struct r5dev *dev = &sh->dev[i]; 494 struct r5dev *dev = &sh->dev[i];
533 495
534 /* acknowledge completion of a biofill operation */ 496 /* acknowledge completion of a biofill operation */
535 /* and check if we need to reply to a read request, 497 /* and check if we need to reply to a read request,
536 * new R5_Wantfill requests are held off until 498 * new R5_Wantfill requests are held off until
537 * !test_bit(STRIPE_OP_BIOFILL, &sh->ops.pending) 499 * !STRIPE_BIOFILL_RUN
538 */ 500 */
539 if (test_and_clear_bit(R5_Wantfill, &dev->flags)) { 501 if (test_and_clear_bit(R5_Wantfill, &dev->flags)) {
540 struct bio *rbi, *rbi2; 502 struct bio *rbi, *rbi2;
541 503
542 /* The access to dev->read is outside of the
543 * spin_lock_irq(&conf->device_lock), but is protected
544 * by the STRIPE_OP_BIOFILL pending bit
545 */
546 BUG_ON(!dev->read); 504 BUG_ON(!dev->read);
547 rbi = dev->read; 505 rbi = dev->read;
548 dev->read = NULL; 506 dev->read = NULL;
549 while (rbi && rbi->bi_sector < 507 while (rbi && rbi->bi_sector <
550 dev->sector + STRIPE_SECTORS) { 508 dev->sector + STRIPE_SECTORS) {
551 rbi2 = r5_next_bio(rbi, dev->sector); 509 rbi2 = r5_next_bio(rbi, dev->sector);
552 spin_lock_irq(&conf->device_lock);
553 if (--rbi->bi_phys_segments == 0) { 510 if (--rbi->bi_phys_segments == 0) {
554 rbi->bi_next = return_bi; 511 rbi->bi_next = return_bi;
555 return_bi = rbi; 512 return_bi = rbi;
556 } 513 }
557 spin_unlock_irq(&conf->device_lock);
558 rbi = rbi2; 514 rbi = rbi2;
559 } 515 }
560 } 516 }
561 } 517 }
562 set_bit(STRIPE_OP_BIOFILL, &sh->ops.complete); 518 spin_unlock_irq(&conf->device_lock);
519 clear_bit(STRIPE_BIOFILL_RUN, &sh->state);
563 520
564 return_io(return_bi); 521 return_io(return_bi);
565 522
@@ -610,13 +567,14 @@ static void ops_complete_compute5(void *stripe_head_ref)
610 set_bit(R5_UPTODATE, &tgt->flags); 567 set_bit(R5_UPTODATE, &tgt->flags);
611 BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); 568 BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags));
612 clear_bit(R5_Wantcompute, &tgt->flags); 569 clear_bit(R5_Wantcompute, &tgt->flags);
613 set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete); 570 clear_bit(STRIPE_COMPUTE_RUN, &sh->state);
571 if (sh->check_state == check_state_compute_run)
572 sh->check_state = check_state_compute_result;
614 set_bit(STRIPE_HANDLE, &sh->state); 573 set_bit(STRIPE_HANDLE, &sh->state);
615 release_stripe(sh); 574 release_stripe(sh);
616} 575}
617 576
618static struct dma_async_tx_descriptor * 577static struct dma_async_tx_descriptor *ops_run_compute5(struct stripe_head *sh)
619ops_run_compute5(struct stripe_head *sh, unsigned long pending)
620{ 578{
621 /* kernel stack size limits the total number of disks */ 579 /* kernel stack size limits the total number of disks */
622 int disks = sh->disks; 580 int disks = sh->disks;
@@ -646,10 +604,6 @@ ops_run_compute5(struct stripe_head *sh, unsigned long pending)
646 ASYNC_TX_XOR_ZERO_DST, NULL, 604 ASYNC_TX_XOR_ZERO_DST, NULL,
647 ops_complete_compute5, sh); 605 ops_complete_compute5, sh);
648 606
649 /* ack now if postxor is not set to be run */
650 if (tx && !test_bit(STRIPE_OP_POSTXOR, &pending))
651 async_tx_ack(tx);
652
653 return tx; 607 return tx;
654} 608}
655 609
@@ -659,8 +613,6 @@ static void ops_complete_prexor(void *stripe_head_ref)
659 613
660 pr_debug("%s: stripe %llu\n", __func__, 614 pr_debug("%s: stripe %llu\n", __func__,
661 (unsigned long long)sh->sector); 615 (unsigned long long)sh->sector);
662
663 set_bit(STRIPE_OP_PREXOR, &sh->ops.complete);
664} 616}
665 617
666static struct dma_async_tx_descriptor * 618static struct dma_async_tx_descriptor *
@@ -680,7 +632,7 @@ ops_run_prexor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx)
680 for (i = disks; i--; ) { 632 for (i = disks; i--; ) {
681 struct r5dev *dev = &sh->dev[i]; 633 struct r5dev *dev = &sh->dev[i];
682 /* Only process blocks that are known to be uptodate */ 634 /* Only process blocks that are known to be uptodate */
683 if (dev->towrite && test_bit(R5_Wantprexor, &dev->flags)) 635 if (test_bit(R5_Wantdrain, &dev->flags))
684 xor_srcs[count++] = dev->page; 636 xor_srcs[count++] = dev->page;
685 } 637 }
686 638
@@ -692,16 +644,10 @@ ops_run_prexor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx)
692} 644}
693 645
694static struct dma_async_tx_descriptor * 646static struct dma_async_tx_descriptor *
695ops_run_biodrain(struct stripe_head *sh, struct dma_async_tx_descriptor *tx, 647ops_run_biodrain(struct stripe_head *sh, struct dma_async_tx_descriptor *tx)
696 unsigned long pending)
697{ 648{
698 int disks = sh->disks; 649 int disks = sh->disks;
699 int pd_idx = sh->pd_idx, i; 650 int i;
700
701 /* check if prexor is active which means only process blocks
702 * that are part of a read-modify-write (Wantprexor)
703 */
704 int prexor = test_bit(STRIPE_OP_PREXOR, &pending);
705 651
706 pr_debug("%s: stripe %llu\n", __func__, 652 pr_debug("%s: stripe %llu\n", __func__,
707 (unsigned long long)sh->sector); 653 (unsigned long long)sh->sector);
@@ -709,20 +655,8 @@ ops_run_biodrain(struct stripe_head *sh, struct dma_async_tx_descriptor *tx,
709 for (i = disks; i--; ) { 655 for (i = disks; i--; ) {
710 struct r5dev *dev = &sh->dev[i]; 656 struct r5dev *dev = &sh->dev[i];
711 struct bio *chosen; 657 struct bio *chosen;
712 int towrite;
713
714 towrite = 0;
715 if (prexor) { /* rmw */
716 if (dev->towrite &&
717 test_bit(R5_Wantprexor, &dev->flags))
718 towrite = 1;
719 } else { /* rcw */
720 if (i != pd_idx && dev->towrite &&
721 test_bit(R5_LOCKED, &dev->flags))
722 towrite = 1;
723 }
724 658
725 if (towrite) { 659 if (test_and_clear_bit(R5_Wantdrain, &dev->flags)) {
726 struct bio *wbi; 660 struct bio *wbi;
727 661
728 spin_lock(&sh->lock); 662 spin_lock(&sh->lock);
@@ -747,18 +681,6 @@ ops_run_biodrain(struct stripe_head *sh, struct dma_async_tx_descriptor *tx,
747static void ops_complete_postxor(void *stripe_head_ref) 681static void ops_complete_postxor(void *stripe_head_ref)
748{ 682{
749 struct stripe_head *sh = stripe_head_ref; 683 struct stripe_head *sh = stripe_head_ref;
750
751 pr_debug("%s: stripe %llu\n", __func__,
752 (unsigned long long)sh->sector);
753
754 set_bit(STRIPE_OP_POSTXOR, &sh->ops.complete);
755 set_bit(STRIPE_HANDLE, &sh->state);
756 release_stripe(sh);
757}
758
759static void ops_complete_write(void *stripe_head_ref)
760{
761 struct stripe_head *sh = stripe_head_ref;
762 int disks = sh->disks, i, pd_idx = sh->pd_idx; 684 int disks = sh->disks, i, pd_idx = sh->pd_idx;
763 685
764 pr_debug("%s: stripe %llu\n", __func__, 686 pr_debug("%s: stripe %llu\n", __func__,
@@ -770,16 +692,21 @@ static void ops_complete_write(void *stripe_head_ref)
770 set_bit(R5_UPTODATE, &dev->flags); 692 set_bit(R5_UPTODATE, &dev->flags);
771 } 693 }
772 694
773 set_bit(STRIPE_OP_BIODRAIN, &sh->ops.complete); 695 if (sh->reconstruct_state == reconstruct_state_drain_run)
774 set_bit(STRIPE_OP_POSTXOR, &sh->ops.complete); 696 sh->reconstruct_state = reconstruct_state_drain_result;
697 else if (sh->reconstruct_state == reconstruct_state_prexor_drain_run)
698 sh->reconstruct_state = reconstruct_state_prexor_drain_result;
699 else {
700 BUG_ON(sh->reconstruct_state != reconstruct_state_run);
701 sh->reconstruct_state = reconstruct_state_result;
702 }
775 703
776 set_bit(STRIPE_HANDLE, &sh->state); 704 set_bit(STRIPE_HANDLE, &sh->state);
777 release_stripe(sh); 705 release_stripe(sh);
778} 706}
779 707
780static void 708static void
781ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx, 709ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx)
782 unsigned long pending)
783{ 710{
784 /* kernel stack size limits the total number of disks */ 711 /* kernel stack size limits the total number of disks */
785 int disks = sh->disks; 712 int disks = sh->disks;
@@ -787,9 +714,8 @@ ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx,
787 714
788 int count = 0, pd_idx = sh->pd_idx, i; 715 int count = 0, pd_idx = sh->pd_idx, i;
789 struct page *xor_dest; 716 struct page *xor_dest;
790 int prexor = test_bit(STRIPE_OP_PREXOR, &pending); 717 int prexor = 0;
791 unsigned long flags; 718 unsigned long flags;
792 dma_async_tx_callback callback;
793 719
794 pr_debug("%s: stripe %llu\n", __func__, 720 pr_debug("%s: stripe %llu\n", __func__,
795 (unsigned long long)sh->sector); 721 (unsigned long long)sh->sector);
@@ -797,7 +723,8 @@ ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx,
797 /* check if prexor is active which means only process blocks 723 /* check if prexor is active which means only process blocks
798 * that are part of a read-modify-write (written) 724 * that are part of a read-modify-write (written)
799 */ 725 */
800 if (prexor) { 726 if (sh->reconstruct_state == reconstruct_state_prexor_drain_run) {
727 prexor = 1;
801 xor_dest = xor_srcs[count++] = sh->dev[pd_idx].page; 728 xor_dest = xor_srcs[count++] = sh->dev[pd_idx].page;
802 for (i = disks; i--; ) { 729 for (i = disks; i--; ) {
803 struct r5dev *dev = &sh->dev[i]; 730 struct r5dev *dev = &sh->dev[i];
@@ -813,10 +740,6 @@ ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx,
813 } 740 }
814 } 741 }
815 742
816 /* check whether this postxor is part of a write */
817 callback = test_bit(STRIPE_OP_BIODRAIN, &pending) ?
818 ops_complete_write : ops_complete_postxor;
819
820 /* 1/ if we prexor'd then the dest is reused as a source 743 /* 1/ if we prexor'd then the dest is reused as a source
821 * 2/ if we did not prexor then we are redoing the parity 744 * 2/ if we did not prexor then we are redoing the parity
822 * set ASYNC_TX_XOR_DROP_DST and ASYNC_TX_XOR_ZERO_DST 745 * set ASYNC_TX_XOR_DROP_DST and ASYNC_TX_XOR_ZERO_DST
@@ -830,25 +753,20 @@ ops_run_postxor(struct stripe_head *sh, struct dma_async_tx_descriptor *tx,
830 if (unlikely(count == 1)) { 753 if (unlikely(count == 1)) {
831 flags &= ~(ASYNC_TX_XOR_DROP_DST | ASYNC_TX_XOR_ZERO_DST); 754 flags &= ~(ASYNC_TX_XOR_DROP_DST | ASYNC_TX_XOR_ZERO_DST);
832 tx = async_memcpy(xor_dest, xor_srcs[0], 0, 0, STRIPE_SIZE, 755 tx = async_memcpy(xor_dest, xor_srcs[0], 0, 0, STRIPE_SIZE,
833 flags, tx, callback, sh); 756 flags, tx, ops_complete_postxor, sh);
834 } else 757 } else
835 tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 758 tx = async_xor(xor_dest, xor_srcs, 0, count, STRIPE_SIZE,
836 flags, tx, callback, sh); 759 flags, tx, ops_complete_postxor, sh);
837} 760}
838 761
839static void ops_complete_check(void *stripe_head_ref) 762static void ops_complete_check(void *stripe_head_ref)
840{ 763{
841 struct stripe_head *sh = stripe_head_ref; 764 struct stripe_head *sh = stripe_head_ref;
842 int pd_idx = sh->pd_idx;
843 765
844 pr_debug("%s: stripe %llu\n", __func__, 766 pr_debug("%s: stripe %llu\n", __func__,
845 (unsigned long long)sh->sector); 767 (unsigned long long)sh->sector);
846 768
847 if (test_and_clear_bit(STRIPE_OP_MOD_DMA_CHECK, &sh->ops.pending) && 769 sh->check_state = check_state_check_result;
848 sh->ops.zero_sum_result == 0)
849 set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags);
850
851 set_bit(STRIPE_OP_CHECK, &sh->ops.complete);
852 set_bit(STRIPE_HANDLE, &sh->state); 770 set_bit(STRIPE_HANDLE, &sh->state);
853 release_stripe(sh); 771 release_stripe(sh);
854} 772}
@@ -875,46 +793,42 @@ static void ops_run_check(struct stripe_head *sh)
875 tx = async_xor_zero_sum(xor_dest, xor_srcs, 0, count, STRIPE_SIZE, 793 tx = async_xor_zero_sum(xor_dest, xor_srcs, 0, count, STRIPE_SIZE,
876 &sh->ops.zero_sum_result, 0, NULL, NULL, NULL); 794 &sh->ops.zero_sum_result, 0, NULL, NULL, NULL);
877 795
878 if (tx)
879 set_bit(STRIPE_OP_MOD_DMA_CHECK, &sh->ops.pending);
880 else
881 clear_bit(STRIPE_OP_MOD_DMA_CHECK, &sh->ops.pending);
882
883 atomic_inc(&sh->count); 796 atomic_inc(&sh->count);
884 tx = async_trigger_callback(ASYNC_TX_DEP_ACK | ASYNC_TX_ACK, tx, 797 tx = async_trigger_callback(ASYNC_TX_DEP_ACK | ASYNC_TX_ACK, tx,
885 ops_complete_check, sh); 798 ops_complete_check, sh);
886} 799}
887 800
888static void raid5_run_ops(struct stripe_head *sh, unsigned long pending) 801static void raid5_run_ops(struct stripe_head *sh, unsigned long ops_request)
889{ 802{
890 int overlap_clear = 0, i, disks = sh->disks; 803 int overlap_clear = 0, i, disks = sh->disks;
891 struct dma_async_tx_descriptor *tx = NULL; 804 struct dma_async_tx_descriptor *tx = NULL;
892 805
893 if (test_bit(STRIPE_OP_BIOFILL, &pending)) { 806 if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
894 ops_run_biofill(sh); 807 ops_run_biofill(sh);
895 overlap_clear++; 808 overlap_clear++;
896 } 809 }
897 810
898 if (test_bit(STRIPE_OP_COMPUTE_BLK, &pending)) 811 if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request)) {
899 tx = ops_run_compute5(sh, pending); 812 tx = ops_run_compute5(sh);
813 /* terminate the chain if postxor is not set to be run */
814 if (tx && !test_bit(STRIPE_OP_POSTXOR, &ops_request))
815 async_tx_ack(tx);
816 }
900 817
901 if (test_bit(STRIPE_OP_PREXOR, &pending)) 818 if (test_bit(STRIPE_OP_PREXOR, &ops_request))
902 tx = ops_run_prexor(sh, tx); 819 tx = ops_run_prexor(sh, tx);
903 820
904 if (test_bit(STRIPE_OP_BIODRAIN, &pending)) { 821 if (test_bit(STRIPE_OP_BIODRAIN, &ops_request)) {
905 tx = ops_run_biodrain(sh, tx, pending); 822 tx = ops_run_biodrain(sh, tx);
906 overlap_clear++; 823 overlap_clear++;
907 } 824 }
908 825
909 if (test_bit(STRIPE_OP_POSTXOR, &pending)) 826 if (test_bit(STRIPE_OP_POSTXOR, &ops_request))
910 ops_run_postxor(sh, tx, pending); 827 ops_run_postxor(sh, tx);
911 828
912 if (test_bit(STRIPE_OP_CHECK, &pending)) 829 if (test_bit(STRIPE_OP_CHECK, &ops_request))
913 ops_run_check(sh); 830 ops_run_check(sh);
914 831
915 if (test_bit(STRIPE_OP_IO, &pending))
916 ops_run_io(sh);
917
918 if (overlap_clear) 832 if (overlap_clear)
919 for (i = disks; i--; ) { 833 for (i = disks; i--; ) {
920 struct r5dev *dev = &sh->dev[i]; 834 struct r5dev *dev = &sh->dev[i];
@@ -997,14 +911,16 @@ static int resize_stripes(raid5_conf_t *conf, int newsize)
997 struct stripe_head *osh, *nsh; 911 struct stripe_head *osh, *nsh;
998 LIST_HEAD(newstripes); 912 LIST_HEAD(newstripes);
999 struct disk_info *ndisks; 913 struct disk_info *ndisks;
1000 int err = 0; 914 int err;
1001 struct kmem_cache *sc; 915 struct kmem_cache *sc;
1002 int i; 916 int i;
1003 917
1004 if (newsize <= conf->pool_size) 918 if (newsize <= conf->pool_size)
1005 return 0; /* never bother to shrink */ 919 return 0; /* never bother to shrink */
1006 920
1007 md_allow_write(conf->mddev); 921 err = md_allow_write(conf->mddev);
922 if (err)
923 return err;
1008 924
1009 /* Step 1 */ 925 /* Step 1 */
1010 sc = kmem_cache_create(conf->cache_name[1-conf->active_name], 926 sc = kmem_cache_create(conf->cache_name[1-conf->active_name],
@@ -1703,11 +1619,11 @@ static void compute_block_2(struct stripe_head *sh, int dd_idx1, int dd_idx2)
1703 } 1619 }
1704} 1620}
1705 1621
1706static int 1622static void
1707handle_write_operations5(struct stripe_head *sh, int rcw, int expand) 1623schedule_reconstruction5(struct stripe_head *sh, struct stripe_head_state *s,
1624 int rcw, int expand)
1708{ 1625{
1709 int i, pd_idx = sh->pd_idx, disks = sh->disks; 1626 int i, pd_idx = sh->pd_idx, disks = sh->disks;
1710 int locked = 0;
1711 1627
1712 if (rcw) { 1628 if (rcw) {
1713 /* if we are not expanding this is a proper write request, and 1629 /* if we are not expanding this is a proper write request, and
@@ -1715,53 +1631,48 @@ handle_write_operations5(struct stripe_head *sh, int rcw, int expand)
1715 * stripe cache 1631 * stripe cache
1716 */ 1632 */
1717 if (!expand) { 1633 if (!expand) {
1718 set_bit(STRIPE_OP_BIODRAIN, &sh->ops.pending); 1634 sh->reconstruct_state = reconstruct_state_drain_run;
1719 sh->ops.count++; 1635 set_bit(STRIPE_OP_BIODRAIN, &s->ops_request);
1720 } 1636 } else
1637 sh->reconstruct_state = reconstruct_state_run;
1721 1638
1722 set_bit(STRIPE_OP_POSTXOR, &sh->ops.pending); 1639 set_bit(STRIPE_OP_POSTXOR, &s->ops_request);
1723 sh->ops.count++;
1724 1640
1725 for (i = disks; i--; ) { 1641 for (i = disks; i--; ) {
1726 struct r5dev *dev = &sh->dev[i]; 1642 struct r5dev *dev = &sh->dev[i];
1727 1643
1728 if (dev->towrite) { 1644 if (dev->towrite) {
1729 set_bit(R5_LOCKED, &dev->flags); 1645 set_bit(R5_LOCKED, &dev->flags);
1646 set_bit(R5_Wantdrain, &dev->flags);
1730 if (!expand) 1647 if (!expand)
1731 clear_bit(R5_UPTODATE, &dev->flags); 1648 clear_bit(R5_UPTODATE, &dev->flags);
1732 locked++; 1649 s->locked++;
1733 } 1650 }
1734 } 1651 }
1735 if (locked + 1 == disks) 1652 if (s->locked + 1 == disks)
1736 if (!test_and_set_bit(STRIPE_FULL_WRITE, &sh->state)) 1653 if (!test_and_set_bit(STRIPE_FULL_WRITE, &sh->state))
1737 atomic_inc(&sh->raid_conf->pending_full_writes); 1654 atomic_inc(&sh->raid_conf->pending_full_writes);
1738 } else { 1655 } else {
1739 BUG_ON(!(test_bit(R5_UPTODATE, &sh->dev[pd_idx].flags) || 1656 BUG_ON(!(test_bit(R5_UPTODATE, &sh->dev[pd_idx].flags) ||
1740 test_bit(R5_Wantcompute, &sh->dev[pd_idx].flags))); 1657 test_bit(R5_Wantcompute, &sh->dev[pd_idx].flags)));
1741 1658
1742 set_bit(STRIPE_OP_PREXOR, &sh->ops.pending); 1659 sh->reconstruct_state = reconstruct_state_prexor_drain_run;
1743 set_bit(STRIPE_OP_BIODRAIN, &sh->ops.pending); 1660 set_bit(STRIPE_OP_PREXOR, &s->ops_request);
1744 set_bit(STRIPE_OP_POSTXOR, &sh->ops.pending); 1661 set_bit(STRIPE_OP_BIODRAIN, &s->ops_request);
1745 1662 set_bit(STRIPE_OP_POSTXOR, &s->ops_request);
1746 sh->ops.count += 3;
1747 1663
1748 for (i = disks; i--; ) { 1664 for (i = disks; i--; ) {
1749 struct r5dev *dev = &sh->dev[i]; 1665 struct r5dev *dev = &sh->dev[i];
1750 if (i == pd_idx) 1666 if (i == pd_idx)
1751 continue; 1667 continue;
1752 1668
1753 /* For a read-modify write there may be blocks that are
1754 * locked for reading while others are ready to be
1755 * written so we distinguish these blocks by the
1756 * R5_Wantprexor bit
1757 */
1758 if (dev->towrite && 1669 if (dev->towrite &&
1759 (test_bit(R5_UPTODATE, &dev->flags) || 1670 (test_bit(R5_UPTODATE, &dev->flags) ||
1760 test_bit(R5_Wantcompute, &dev->flags))) { 1671 test_bit(R5_Wantcompute, &dev->flags))) {
1761 set_bit(R5_Wantprexor, &dev->flags); 1672 set_bit(R5_Wantdrain, &dev->flags);
1762 set_bit(R5_LOCKED, &dev->flags); 1673 set_bit(R5_LOCKED, &dev->flags);
1763 clear_bit(R5_UPTODATE, &dev->flags); 1674 clear_bit(R5_UPTODATE, &dev->flags);
1764 locked++; 1675 s->locked++;
1765 } 1676 }
1766 } 1677 }
1767 } 1678 }
@@ -1771,13 +1682,11 @@ handle_write_operations5(struct stripe_head *sh, int rcw, int expand)
1771 */ 1682 */
1772 set_bit(R5_LOCKED, &sh->dev[pd_idx].flags); 1683 set_bit(R5_LOCKED, &sh->dev[pd_idx].flags);
1773 clear_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); 1684 clear_bit(R5_UPTODATE, &sh->dev[pd_idx].flags);
1774 locked++; 1685 s->locked++;
1775 1686
1776 pr_debug("%s: stripe %llu locked: %d pending: %lx\n", 1687 pr_debug("%s: stripe %llu locked: %d ops_request: %lx\n",
1777 __func__, (unsigned long long)sh->sector, 1688 __func__, (unsigned long long)sh->sector,
1778 locked, sh->ops.pending); 1689 s->locked, s->ops_request);
1779
1780 return locked;
1781} 1690}
1782 1691
1783/* 1692/*
@@ -1876,7 +1785,7 @@ static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int disks)
1876} 1785}
1877 1786
1878static void 1787static void
1879handle_requests_to_failed_array(raid5_conf_t *conf, struct stripe_head *sh, 1788handle_failed_stripe(raid5_conf_t *conf, struct stripe_head *sh,
1880 struct stripe_head_state *s, int disks, 1789 struct stripe_head_state *s, int disks,
1881 struct bio **return_bi) 1790 struct bio **return_bi)
1882{ 1791{
@@ -1967,48 +1876,38 @@ handle_requests_to_failed_array(raid5_conf_t *conf, struct stripe_head *sh,
1967 md_wakeup_thread(conf->mddev->thread); 1876 md_wakeup_thread(conf->mddev->thread);
1968} 1877}
1969 1878
1970/* __handle_issuing_new_read_requests5 - returns 0 if there are no more disks 1879/* fetch_block5 - checks the given member device to see if its data needs
1971 * to process 1880 * to be read or computed to satisfy a request.
1881 *
1882 * Returns 1 when no more member devices need to be checked, otherwise returns
1883 * 0 to tell the loop in handle_stripe_fill5 to continue
1972 */ 1884 */
1973static int __handle_issuing_new_read_requests5(struct stripe_head *sh, 1885static int fetch_block5(struct stripe_head *sh, struct stripe_head_state *s,
1974 struct stripe_head_state *s, int disk_idx, int disks) 1886 int disk_idx, int disks)
1975{ 1887{
1976 struct r5dev *dev = &sh->dev[disk_idx]; 1888 struct r5dev *dev = &sh->dev[disk_idx];
1977 struct r5dev *failed_dev = &sh->dev[s->failed_num]; 1889 struct r5dev *failed_dev = &sh->dev[s->failed_num];
1978 1890
1979 /* don't schedule compute operations or reads on the parity block while
1980 * a check is in flight
1981 */
1982 if ((disk_idx == sh->pd_idx) &&
1983 test_bit(STRIPE_OP_CHECK, &sh->ops.pending))
1984 return ~0;
1985
1986 /* is the data in this block needed, and can we get it? */ 1891 /* is the data in this block needed, and can we get it? */
1987 if (!test_bit(R5_LOCKED, &dev->flags) && 1892 if (!test_bit(R5_LOCKED, &dev->flags) &&
1988 !test_bit(R5_UPTODATE, &dev->flags) && (dev->toread || 1893 !test_bit(R5_UPTODATE, &dev->flags) &&
1989 (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) || 1894 (dev->toread ||
1990 s->syncing || s->expanding || (s->failed && 1895 (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags)) ||
1991 (failed_dev->toread || (failed_dev->towrite && 1896 s->syncing || s->expanding ||
1992 !test_bit(R5_OVERWRITE, &failed_dev->flags) 1897 (s->failed &&
1993 ))))) { 1898 (failed_dev->toread ||
1994 /* 1/ We would like to get this block, possibly by computing it, 1899 (failed_dev->towrite &&
1995 * but we might not be able to. 1900 !test_bit(R5_OVERWRITE, &failed_dev->flags)))))) {
1996 * 1901 /* We would like to get this block, possibly by computing it,
1997 * 2/ Since parity check operations potentially make the parity 1902 * otherwise read it if the backing disk is insync
1998 * block !uptodate it will need to be refreshed before any
1999 * compute operations on data disks are scheduled.
2000 *
2001 * 3/ We hold off parity block re-reads until check operations
2002 * have quiesced.
2003 */ 1903 */
2004 if ((s->uptodate == disks - 1) && 1904 if ((s->uptodate == disks - 1) &&
2005 (s->failed && disk_idx == s->failed_num) && 1905 (s->failed && disk_idx == s->failed_num)) {
2006 !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) { 1906 set_bit(STRIPE_COMPUTE_RUN, &sh->state);
2007 set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); 1907 set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request);
2008 set_bit(R5_Wantcompute, &dev->flags); 1908 set_bit(R5_Wantcompute, &dev->flags);
2009 sh->ops.target = disk_idx; 1909 sh->ops.target = disk_idx;
2010 s->req_compute = 1; 1910 s->req_compute = 1;
2011 sh->ops.count++;
2012 /* Careful: from this point on 'uptodate' is in the eye 1911 /* Careful: from this point on 'uptodate' is in the eye
2013 * of raid5_run_ops which services 'compute' operations 1912 * of raid5_run_ops which services 'compute' operations
2014 * before writes. R5_Wantcompute flags a block that will 1913 * before writes. R5_Wantcompute flags a block that will
@@ -2016,53 +1915,40 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh,
2016 * subsequent operation. 1915 * subsequent operation.
2017 */ 1916 */
2018 s->uptodate++; 1917 s->uptodate++;
2019 return 0; /* uptodate + compute == disks */ 1918 return 1; /* uptodate + compute == disks */
2020 } else if (test_bit(R5_Insync, &dev->flags)) { 1919 } else if (test_bit(R5_Insync, &dev->flags)) {
2021 set_bit(R5_LOCKED, &dev->flags); 1920 set_bit(R5_LOCKED, &dev->flags);
2022 set_bit(R5_Wantread, &dev->flags); 1921 set_bit(R5_Wantread, &dev->flags);
2023 if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
2024 sh->ops.count++;
2025 s->locked++; 1922 s->locked++;
2026 pr_debug("Reading block %d (sync=%d)\n", disk_idx, 1923 pr_debug("Reading block %d (sync=%d)\n", disk_idx,
2027 s->syncing); 1924 s->syncing);
2028 } 1925 }
2029 } 1926 }
2030 1927
2031 return ~0; 1928 return 0;
2032} 1929}
2033 1930
2034static void handle_issuing_new_read_requests5(struct stripe_head *sh, 1931/**
1932 * handle_stripe_fill5 - read or compute data to satisfy pending requests.
1933 */
1934static void handle_stripe_fill5(struct stripe_head *sh,
2035 struct stripe_head_state *s, int disks) 1935 struct stripe_head_state *s, int disks)
2036{ 1936{
2037 int i; 1937 int i;
2038 1938
2039 /* Clear completed compute operations. Parity recovery
2040 * (STRIPE_OP_MOD_REPAIR_PD) implies a write-back which is handled
2041 * later on in this routine
2042 */
2043 if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) &&
2044 !test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
2045 clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete);
2046 clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack);
2047 clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
2048 }
2049
2050 /* look for blocks to read/compute, skip this if a compute 1939 /* look for blocks to read/compute, skip this if a compute
2051 * is already in flight, or if the stripe contents are in the 1940 * is already in flight, or if the stripe contents are in the
2052 * midst of changing due to a write 1941 * midst of changing due to a write
2053 */ 1942 */
2054 if (!test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending) && 1943 if (!test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !sh->check_state &&
2055 !test_bit(STRIPE_OP_PREXOR, &sh->ops.pending) && 1944 !sh->reconstruct_state)
2056 !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) {
2057 for (i = disks; i--; ) 1945 for (i = disks; i--; )
2058 if (__handle_issuing_new_read_requests5( 1946 if (fetch_block5(sh, s, i, disks))
2059 sh, s, i, disks) == 0)
2060 break; 1947 break;
2061 }
2062 set_bit(STRIPE_HANDLE, &sh->state); 1948 set_bit(STRIPE_HANDLE, &sh->state);
2063} 1949}
2064 1950
2065static void handle_issuing_new_read_requests6(struct stripe_head *sh, 1951static void handle_stripe_fill6(struct stripe_head *sh,
2066 struct stripe_head_state *s, struct r6_state *r6s, 1952 struct stripe_head_state *s, struct r6_state *r6s,
2067 int disks) 1953 int disks)
2068{ 1954{
@@ -2121,12 +2007,12 @@ static void handle_issuing_new_read_requests6(struct stripe_head *sh,
2121} 2007}
2122 2008
2123 2009
2124/* handle_completed_write_requests 2010/* handle_stripe_clean_event
2125 * any written block on an uptodate or failed drive can be returned. 2011 * any written block on an uptodate or failed drive can be returned.
2126 * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but 2012 * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but
2127 * never LOCKED, so we don't need to test 'failed' directly. 2013 * never LOCKED, so we don't need to test 'failed' directly.
2128 */ 2014 */
2129static void handle_completed_write_requests(raid5_conf_t *conf, 2015static void handle_stripe_clean_event(raid5_conf_t *conf,
2130 struct stripe_head *sh, int disks, struct bio **return_bi) 2016 struct stripe_head *sh, int disks, struct bio **return_bi)
2131{ 2017{
2132 int i; 2018 int i;
@@ -2171,7 +2057,7 @@ static void handle_completed_write_requests(raid5_conf_t *conf,
2171 md_wakeup_thread(conf->mddev->thread); 2057 md_wakeup_thread(conf->mddev->thread);
2172} 2058}
2173 2059
2174static void handle_issuing_new_write_requests5(raid5_conf_t *conf, 2060static void handle_stripe_dirtying5(raid5_conf_t *conf,
2175 struct stripe_head *sh, struct stripe_head_state *s, int disks) 2061 struct stripe_head *sh, struct stripe_head_state *s, int disks)
2176{ 2062{
2177 int rmw = 0, rcw = 0, i; 2063 int rmw = 0, rcw = 0, i;
@@ -2215,9 +2101,6 @@ static void handle_issuing_new_write_requests5(raid5_conf_t *conf,
2215 "%d for r-m-w\n", i); 2101 "%d for r-m-w\n", i);
2216 set_bit(R5_LOCKED, &dev->flags); 2102 set_bit(R5_LOCKED, &dev->flags);
2217 set_bit(R5_Wantread, &dev->flags); 2103 set_bit(R5_Wantread, &dev->flags);
2218 if (!test_and_set_bit(
2219 STRIPE_OP_IO, &sh->ops.pending))
2220 sh->ops.count++;
2221 s->locked++; 2104 s->locked++;
2222 } else { 2105 } else {
2223 set_bit(STRIPE_DELAYED, &sh->state); 2106 set_bit(STRIPE_DELAYED, &sh->state);
@@ -2241,9 +2124,6 @@ static void handle_issuing_new_write_requests5(raid5_conf_t *conf,
2241 "%d for Reconstruct\n", i); 2124 "%d for Reconstruct\n", i);
2242 set_bit(R5_LOCKED, &dev->flags); 2125 set_bit(R5_LOCKED, &dev->flags);
2243 set_bit(R5_Wantread, &dev->flags); 2126 set_bit(R5_Wantread, &dev->flags);
2244 if (!test_and_set_bit(
2245 STRIPE_OP_IO, &sh->ops.pending))
2246 sh->ops.count++;
2247 s->locked++; 2127 s->locked++;
2248 } else { 2128 } else {
2249 set_bit(STRIPE_DELAYED, &sh->state); 2129 set_bit(STRIPE_DELAYED, &sh->state);
@@ -2261,14 +2141,13 @@ static void handle_issuing_new_write_requests5(raid5_conf_t *conf,
2261 * simultaneously. If this is not the case then new writes need to be 2141 * simultaneously. If this is not the case then new writes need to be
2262 * held off until the compute completes. 2142 * held off until the compute completes.
2263 */ 2143 */
2264 if ((s->req_compute || 2144 if ((s->req_compute || !test_bit(STRIPE_COMPUTE_RUN, &sh->state)) &&
2265 !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) && 2145 (s->locked == 0 && (rcw == 0 || rmw == 0) &&
2266 (s->locked == 0 && (rcw == 0 || rmw == 0) && 2146 !test_bit(STRIPE_BIT_DELAY, &sh->state)))
2267 !test_bit(STRIPE_BIT_DELAY, &sh->state))) 2147 schedule_reconstruction5(sh, s, rcw == 0, 0);
2268 s->locked += handle_write_operations5(sh, rcw == 0, 0);
2269} 2148}
2270 2149
2271static void handle_issuing_new_write_requests6(raid5_conf_t *conf, 2150static void handle_stripe_dirtying6(raid5_conf_t *conf,
2272 struct stripe_head *sh, struct stripe_head_state *s, 2151 struct stripe_head *sh, struct stripe_head_state *s,
2273 struct r6_state *r6s, int disks) 2152 struct r6_state *r6s, int disks)
2274{ 2153{
@@ -2371,92 +2250,86 @@ static void handle_issuing_new_write_requests6(raid5_conf_t *conf,
2371static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh, 2250static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
2372 struct stripe_head_state *s, int disks) 2251 struct stripe_head_state *s, int disks)
2373{ 2252{
2374 int canceled_check = 0; 2253 struct r5dev *dev = NULL;
2375 2254
2376 set_bit(STRIPE_HANDLE, &sh->state); 2255 set_bit(STRIPE_HANDLE, &sh->state);
2377 2256
2378 /* complete a check operation */ 2257 switch (sh->check_state) {
2379 if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) { 2258 case check_state_idle:
2380 clear_bit(STRIPE_OP_CHECK, &sh->ops.ack); 2259 /* start a new check operation if there are no failures */
2381 clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
2382 if (s->failed == 0) { 2260 if (s->failed == 0) {
2383 if (sh->ops.zero_sum_result == 0)
2384 /* parity is correct (on disc,
2385 * not in buffer any more)
2386 */
2387 set_bit(STRIPE_INSYNC, &sh->state);
2388 else {
2389 conf->mddev->resync_mismatches +=
2390 STRIPE_SECTORS;
2391 if (test_bit(
2392 MD_RECOVERY_CHECK, &conf->mddev->recovery))
2393 /* don't try to repair!! */
2394 set_bit(STRIPE_INSYNC, &sh->state);
2395 else {
2396 set_bit(STRIPE_OP_COMPUTE_BLK,
2397 &sh->ops.pending);
2398 set_bit(STRIPE_OP_MOD_REPAIR_PD,
2399 &sh->ops.pending);
2400 set_bit(R5_Wantcompute,
2401 &sh->dev[sh->pd_idx].flags);
2402 sh->ops.target = sh->pd_idx;
2403 sh->ops.count++;
2404 s->uptodate++;
2405 }
2406 }
2407 } else
2408 canceled_check = 1; /* STRIPE_INSYNC is not set */
2409 }
2410
2411 /* start a new check operation if there are no failures, the stripe is
2412 * not insync, and a repair is not in flight
2413 */
2414 if (s->failed == 0 &&
2415 !test_bit(STRIPE_INSYNC, &sh->state) &&
2416 !test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
2417 if (!test_and_set_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
2418 BUG_ON(s->uptodate != disks); 2261 BUG_ON(s->uptodate != disks);
2262 sh->check_state = check_state_run;
2263 set_bit(STRIPE_OP_CHECK, &s->ops_request);
2419 clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags); 2264 clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags);
2420 sh->ops.count++;
2421 s->uptodate--; 2265 s->uptodate--;
2266 break;
2422 } 2267 }
2423 } 2268 dev = &sh->dev[s->failed_num];
2424 2269 /* fall through */
2425 /* check if we can clear a parity disk reconstruct */ 2270 case check_state_compute_result:
2426 if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) && 2271 sh->check_state = check_state_idle;
2427 test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) { 2272 if (!dev)
2428 2273 dev = &sh->dev[sh->pd_idx];
2429 clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending); 2274
2430 clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete); 2275 /* check that a write has not made the stripe insync */
2431 clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack); 2276 if (test_bit(STRIPE_INSYNC, &sh->state))
2432 clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); 2277 break;
2433 }
2434
2435 2278
2436 /* Wait for check parity and compute block operations to complete
2437 * before write-back. If a failure occurred while the check operation
2438 * was in flight we need to cycle this stripe through handle_stripe
2439 * since the parity block may not be uptodate
2440 */
2441 if (!canceled_check && !test_bit(STRIPE_INSYNC, &sh->state) &&
2442 !test_bit(STRIPE_OP_CHECK, &sh->ops.pending) &&
2443 !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) {
2444 struct r5dev *dev;
2445 /* either failed parity check, or recovery is happening */ 2279 /* either failed parity check, or recovery is happening */
2446 if (s->failed == 0)
2447 s->failed_num = sh->pd_idx;
2448 dev = &sh->dev[s->failed_num];
2449 BUG_ON(!test_bit(R5_UPTODATE, &dev->flags)); 2280 BUG_ON(!test_bit(R5_UPTODATE, &dev->flags));
2450 BUG_ON(s->uptodate != disks); 2281 BUG_ON(s->uptodate != disks);
2451 2282
2452 set_bit(R5_LOCKED, &dev->flags); 2283 set_bit(R5_LOCKED, &dev->flags);
2284 s->locked++;
2453 set_bit(R5_Wantwrite, &dev->flags); 2285 set_bit(R5_Wantwrite, &dev->flags);
2454 if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
2455 sh->ops.count++;
2456 2286
2457 clear_bit(STRIPE_DEGRADED, &sh->state); 2287 clear_bit(STRIPE_DEGRADED, &sh->state);
2458 s->locked++;
2459 set_bit(STRIPE_INSYNC, &sh->state); 2288 set_bit(STRIPE_INSYNC, &sh->state);
2289 break;
2290 case check_state_run:
2291 break; /* we will be called again upon completion */
2292 case check_state_check_result:
2293 sh->check_state = check_state_idle;
2294
2295 /* if a failure occurred during the check operation, leave
2296 * STRIPE_INSYNC not set and let the stripe be handled again
2297 */
2298 if (s->failed)
2299 break;
2300
2301 /* handle a successful check operation, if parity is correct
2302 * we are done. Otherwise update the mismatch count and repair
2303 * parity if !MD_RECOVERY_CHECK
2304 */
2305 if (sh->ops.zero_sum_result == 0)
2306 /* parity is correct (on disc,
2307 * not in buffer any more)
2308 */
2309 set_bit(STRIPE_INSYNC, &sh->state);
2310 else {
2311 conf->mddev->resync_mismatches += STRIPE_SECTORS;
2312 if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery))
2313 /* don't try to repair!! */
2314 set_bit(STRIPE_INSYNC, &sh->state);
2315 else {
2316 sh->check_state = check_state_compute_run;
2317 set_bit(STRIPE_COMPUTE_RUN, &sh->state);
2318 set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request);
2319 set_bit(R5_Wantcompute,
2320 &sh->dev[sh->pd_idx].flags);
2321 sh->ops.target = sh->pd_idx;
2322 s->uptodate++;
2323 }
2324 }
2325 break;
2326 case check_state_compute_run:
2327 break;
2328 default:
2329 printk(KERN_ERR "%s: unknown check_state: %d sector: %llu\n",
2330 __func__, sh->check_state,
2331 (unsigned long long) sh->sector);
2332 BUG();
2460 } 2333 }
2461} 2334}
2462 2335
@@ -2641,15 +2514,14 @@ static void handle_stripe5(struct stripe_head *sh)
2641 struct bio *return_bi = NULL; 2514 struct bio *return_bi = NULL;
2642 struct stripe_head_state s; 2515 struct stripe_head_state s;
2643 struct r5dev *dev; 2516 struct r5dev *dev;
2644 unsigned long pending = 0;
2645 mdk_rdev_t *blocked_rdev = NULL; 2517 mdk_rdev_t *blocked_rdev = NULL;
2646 int prexor; 2518 int prexor;
2647 2519
2648 memset(&s, 0, sizeof(s)); 2520 memset(&s, 0, sizeof(s));
2649 pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d " 2521 pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d check:%d "
2650 "ops=%lx:%lx:%lx\n", (unsigned long long)sh->sector, sh->state, 2522 "reconstruct:%d\n", (unsigned long long)sh->sector, sh->state,
2651 atomic_read(&sh->count), sh->pd_idx, 2523 atomic_read(&sh->count), sh->pd_idx, sh->check_state,
2652 sh->ops.pending, sh->ops.ack, sh->ops.complete); 2524 sh->reconstruct_state);
2653 2525
2654 spin_lock(&sh->lock); 2526 spin_lock(&sh->lock);
2655 clear_bit(STRIPE_HANDLE, &sh->state); 2527 clear_bit(STRIPE_HANDLE, &sh->state);
@@ -2658,15 +2530,8 @@ static void handle_stripe5(struct stripe_head *sh)
2658 s.syncing = test_bit(STRIPE_SYNCING, &sh->state); 2530 s.syncing = test_bit(STRIPE_SYNCING, &sh->state);
2659 s.expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state); 2531 s.expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state);
2660 s.expanded = test_bit(STRIPE_EXPAND_READY, &sh->state); 2532 s.expanded = test_bit(STRIPE_EXPAND_READY, &sh->state);
2661 /* Now to look around and see what can be done */
2662
2663 /* clean-up completed biofill operations */
2664 if (test_bit(STRIPE_OP_BIOFILL, &sh->ops.complete)) {
2665 clear_bit(STRIPE_OP_BIOFILL, &sh->ops.pending);
2666 clear_bit(STRIPE_OP_BIOFILL, &sh->ops.ack);
2667 clear_bit(STRIPE_OP_BIOFILL, &sh->ops.complete);
2668 }
2669 2533
2534 /* Now to look around and see what can be done */
2670 rcu_read_lock(); 2535 rcu_read_lock();
2671 for (i=disks; i--; ) { 2536 for (i=disks; i--; ) {
2672 mdk_rdev_t *rdev; 2537 mdk_rdev_t *rdev;
@@ -2680,10 +2545,10 @@ static void handle_stripe5(struct stripe_head *sh)
2680 /* maybe we can request a biofill operation 2545 /* maybe we can request a biofill operation
2681 * 2546 *
2682 * new wantfill requests are only permitted while 2547 * new wantfill requests are only permitted while
2683 * STRIPE_OP_BIOFILL is clear 2548 * ops_complete_biofill is guaranteed to be inactive
2684 */ 2549 */
2685 if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread && 2550 if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread &&
2686 !test_bit(STRIPE_OP_BIOFILL, &sh->ops.pending)) 2551 !test_bit(STRIPE_BIOFILL_RUN, &sh->state))
2687 set_bit(R5_Wantfill, &dev->flags); 2552 set_bit(R5_Wantfill, &dev->flags);
2688 2553
2689 /* now count some things */ 2554 /* now count some things */
@@ -2727,8 +2592,10 @@ static void handle_stripe5(struct stripe_head *sh)
2727 goto unlock; 2592 goto unlock;
2728 } 2593 }
2729 2594
2730 if (s.to_fill && !test_and_set_bit(STRIPE_OP_BIOFILL, &sh->ops.pending)) 2595 if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) {
2731 sh->ops.count++; 2596 set_bit(STRIPE_OP_BIOFILL, &s.ops_request);
2597 set_bit(STRIPE_BIOFILL_RUN, &sh->state);
2598 }
2732 2599
2733 pr_debug("locked=%d uptodate=%d to_read=%d" 2600 pr_debug("locked=%d uptodate=%d to_read=%d"
2734 " to_write=%d failed=%d failed_num=%d\n", 2601 " to_write=%d failed=%d failed_num=%d\n",
@@ -2738,8 +2605,7 @@ static void handle_stripe5(struct stripe_head *sh)
2738 * need to be failed 2605 * need to be failed
2739 */ 2606 */
2740 if (s.failed > 1 && s.to_read+s.to_write+s.written) 2607 if (s.failed > 1 && s.to_read+s.to_write+s.written)
2741 handle_requests_to_failed_array(conf, sh, &s, disks, 2608 handle_failed_stripe(conf, sh, &s, disks, &return_bi);
2742 &return_bi);
2743 if (s.failed > 1 && s.syncing) { 2609 if (s.failed > 1 && s.syncing) {
2744 md_done_sync(conf->mddev, STRIPE_SECTORS,0); 2610 md_done_sync(conf->mddev, STRIPE_SECTORS,0);
2745 clear_bit(STRIPE_SYNCING, &sh->state); 2611 clear_bit(STRIPE_SYNCING, &sh->state);
@@ -2755,48 +2621,25 @@ static void handle_stripe5(struct stripe_head *sh)
2755 !test_bit(R5_LOCKED, &dev->flags) && 2621 !test_bit(R5_LOCKED, &dev->flags) &&
2756 test_bit(R5_UPTODATE, &dev->flags)) || 2622 test_bit(R5_UPTODATE, &dev->flags)) ||
2757 (s.failed == 1 && s.failed_num == sh->pd_idx))) 2623 (s.failed == 1 && s.failed_num == sh->pd_idx)))
2758 handle_completed_write_requests(conf, sh, disks, &return_bi); 2624 handle_stripe_clean_event(conf, sh, disks, &return_bi);
2759 2625
2760 /* Now we might consider reading some blocks, either to check/generate 2626 /* Now we might consider reading some blocks, either to check/generate
2761 * parity, or to satisfy requests 2627 * parity, or to satisfy requests
2762 * or to load a block that is being partially written. 2628 * or to load a block that is being partially written.
2763 */ 2629 */
2764 if (s.to_read || s.non_overwrite || 2630 if (s.to_read || s.non_overwrite ||
2765 (s.syncing && (s.uptodate + s.compute < disks)) || s.expanding || 2631 (s.syncing && (s.uptodate + s.compute < disks)) || s.expanding)
2766 test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) 2632 handle_stripe_fill5(sh, &s, disks);
2767 handle_issuing_new_read_requests5(sh, &s, disks);
2768 2633
2769 /* Now we check to see if any write operations have recently 2634 /* Now we check to see if any write operations have recently
2770 * completed 2635 * completed
2771 */ 2636 */
2772
2773 /* leave prexor set until postxor is done, allows us to distinguish
2774 * a rmw from a rcw during biodrain
2775 */
2776 prexor = 0; 2637 prexor = 0;
2777 if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) && 2638 if (sh->reconstruct_state == reconstruct_state_prexor_drain_result)
2778 test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) {
2779
2780 prexor = 1; 2639 prexor = 1;
2781 clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete); 2640 if (sh->reconstruct_state == reconstruct_state_drain_result ||
2782 clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack); 2641 sh->reconstruct_state == reconstruct_state_prexor_drain_result) {
2783 clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending); 2642 sh->reconstruct_state = reconstruct_state_idle;
2784
2785 for (i = disks; i--; )
2786 clear_bit(R5_Wantprexor, &sh->dev[i].flags);
2787 }
2788
2789 /* if only POSTXOR is set then this is an 'expand' postxor */
2790 if (test_bit(STRIPE_OP_BIODRAIN, &sh->ops.complete) &&
2791 test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) {
2792
2793 clear_bit(STRIPE_OP_BIODRAIN, &sh->ops.complete);
2794 clear_bit(STRIPE_OP_BIODRAIN, &sh->ops.ack);
2795 clear_bit(STRIPE_OP_BIODRAIN, &sh->ops.pending);
2796
2797 clear_bit(STRIPE_OP_POSTXOR, &sh->ops.complete);
2798 clear_bit(STRIPE_OP_POSTXOR, &sh->ops.ack);
2799 clear_bit(STRIPE_OP_POSTXOR, &sh->ops.pending);
2800 2643
2801 /* All the 'written' buffers and the parity block are ready to 2644 /* All the 'written' buffers and the parity block are ready to
2802 * be written back to disk 2645 * be written back to disk
@@ -2808,9 +2651,6 @@ static void handle_stripe5(struct stripe_head *sh)
2808 (i == sh->pd_idx || dev->written)) { 2651 (i == sh->pd_idx || dev->written)) {
2809 pr_debug("Writing block %d\n", i); 2652 pr_debug("Writing block %d\n", i);
2810 set_bit(R5_Wantwrite, &dev->flags); 2653 set_bit(R5_Wantwrite, &dev->flags);
2811 if (!test_and_set_bit(
2812 STRIPE_OP_IO, &sh->ops.pending))
2813 sh->ops.count++;
2814 if (prexor) 2654 if (prexor)
2815 continue; 2655 continue;
2816 if (!test_bit(R5_Insync, &dev->flags) || 2656 if (!test_bit(R5_Insync, &dev->flags) ||
@@ -2832,20 +2672,18 @@ static void handle_stripe5(struct stripe_head *sh)
2832 * 2/ A 'check' operation is in flight, as it may clobber the parity 2672 * 2/ A 'check' operation is in flight, as it may clobber the parity
2833 * block. 2673 * block.
2834 */ 2674 */
2835 if (s.to_write && !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending) && 2675 if (s.to_write && !sh->reconstruct_state && !sh->check_state)
2836 !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) 2676 handle_stripe_dirtying5(conf, sh, &s, disks);
2837 handle_issuing_new_write_requests5(conf, sh, &s, disks);
2838 2677
2839 /* maybe we need to check and possibly fix the parity for this stripe 2678 /* maybe we need to check and possibly fix the parity for this stripe
2840 * Any reads will already have been scheduled, so we just see if enough 2679 * Any reads will already have been scheduled, so we just see if enough
2841 * data is available. The parity check is held off while parity 2680 * data is available. The parity check is held off while parity
2842 * dependent operations are in flight. 2681 * dependent operations are in flight.
2843 */ 2682 */
2844 if ((s.syncing && s.locked == 0 && 2683 if (sh->check_state ||
2845 !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending) && 2684 (s.syncing && s.locked == 0 &&
2846 !test_bit(STRIPE_INSYNC, &sh->state)) || 2685 !test_bit(STRIPE_COMPUTE_RUN, &sh->state) &&
2847 test_bit(STRIPE_OP_CHECK, &sh->ops.pending) || 2686 !test_bit(STRIPE_INSYNC, &sh->state)))
2848 test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending))
2849 handle_parity_checks5(conf, sh, &s, disks); 2687 handle_parity_checks5(conf, sh, &s, disks);
2850 2688
2851 if (s.syncing && s.locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) { 2689 if (s.syncing && s.locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) {
@@ -2864,52 +2702,35 @@ static void handle_stripe5(struct stripe_head *sh)
2864 dev = &sh->dev[s.failed_num]; 2702 dev = &sh->dev[s.failed_num];
2865 if (!test_bit(R5_ReWrite, &dev->flags)) { 2703 if (!test_bit(R5_ReWrite, &dev->flags)) {
2866 set_bit(R5_Wantwrite, &dev->flags); 2704 set_bit(R5_Wantwrite, &dev->flags);
2867 if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
2868 sh->ops.count++;
2869 set_bit(R5_ReWrite, &dev->flags); 2705 set_bit(R5_ReWrite, &dev->flags);
2870 set_bit(R5_LOCKED, &dev->flags); 2706 set_bit(R5_LOCKED, &dev->flags);
2871 s.locked++; 2707 s.locked++;
2872 } else { 2708 } else {
2873 /* let's read it back */ 2709 /* let's read it back */
2874 set_bit(R5_Wantread, &dev->flags); 2710 set_bit(R5_Wantread, &dev->flags);
2875 if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
2876 sh->ops.count++;
2877 set_bit(R5_LOCKED, &dev->flags); 2711 set_bit(R5_LOCKED, &dev->flags);
2878 s.locked++; 2712 s.locked++;
2879 } 2713 }
2880 } 2714 }
2881 2715
2882 /* Finish postxor operations initiated by the expansion 2716 /* Finish reconstruct operations initiated by the expansion process */
2883 * process 2717 if (sh->reconstruct_state == reconstruct_state_result) {
2884 */ 2718 sh->reconstruct_state = reconstruct_state_idle;
2885 if (test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete) &&
2886 !test_bit(STRIPE_OP_BIODRAIN, &sh->ops.pending)) {
2887
2888 clear_bit(STRIPE_EXPANDING, &sh->state); 2719 clear_bit(STRIPE_EXPANDING, &sh->state);
2889 2720 for (i = conf->raid_disks; i--; )
2890 clear_bit(STRIPE_OP_POSTXOR, &sh->ops.pending);
2891 clear_bit(STRIPE_OP_POSTXOR, &sh->ops.ack);
2892 clear_bit(STRIPE_OP_POSTXOR, &sh->ops.complete);
2893
2894 for (i = conf->raid_disks; i--; ) {
2895 set_bit(R5_Wantwrite, &sh->dev[i].flags); 2721 set_bit(R5_Wantwrite, &sh->dev[i].flags);
2896 set_bit(R5_LOCKED, &dev->flags); 2722 set_bit(R5_LOCKED, &dev->flags);
2897 s.locked++; 2723 s.locked++;
2898 if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
2899 sh->ops.count++;
2900 }
2901 } 2724 }
2902 2725
2903 if (s.expanded && test_bit(STRIPE_EXPANDING, &sh->state) && 2726 if (s.expanded && test_bit(STRIPE_EXPANDING, &sh->state) &&
2904 !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { 2727 !sh->reconstruct_state) {
2905 /* Need to write out all blocks after computing parity */ 2728 /* Need to write out all blocks after computing parity */
2906 sh->disks = conf->raid_disks; 2729 sh->disks = conf->raid_disks;
2907 sh->pd_idx = stripe_to_pdidx(sh->sector, conf, 2730 sh->pd_idx = stripe_to_pdidx(sh->sector, conf,
2908 conf->raid_disks); 2731 conf->raid_disks);
2909 s.locked += handle_write_operations5(sh, 1, 1); 2732 schedule_reconstruction5(sh, &s, 1, 1);
2910 } else if (s.expanded && 2733 } else if (s.expanded && !sh->reconstruct_state && s.locked == 0) {
2911 s.locked == 0 &&
2912 !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) {
2913 clear_bit(STRIPE_EXPAND_READY, &sh->state); 2734 clear_bit(STRIPE_EXPAND_READY, &sh->state);
2914 atomic_dec(&conf->reshape_stripes); 2735 atomic_dec(&conf->reshape_stripes);
2915 wake_up(&conf->wait_for_overlap); 2736 wake_up(&conf->wait_for_overlap);
@@ -2917,12 +2738,9 @@ static void handle_stripe5(struct stripe_head *sh)
2917 } 2738 }
2918 2739
2919 if (s.expanding && s.locked == 0 && 2740 if (s.expanding && s.locked == 0 &&
2920 !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) 2741 !test_bit(STRIPE_COMPUTE_RUN, &sh->state))
2921 handle_stripe_expansion(conf, sh, NULL); 2742 handle_stripe_expansion(conf, sh, NULL);
2922 2743
2923 if (sh->ops.count)
2924 pending = get_stripe_work(sh);
2925
2926 unlock: 2744 unlock:
2927 spin_unlock(&sh->lock); 2745 spin_unlock(&sh->lock);
2928 2746
@@ -2930,11 +2748,12 @@ static void handle_stripe5(struct stripe_head *sh)
2930 if (unlikely(blocked_rdev)) 2748 if (unlikely(blocked_rdev))
2931 md_wait_for_blocked_rdev(blocked_rdev, conf->mddev); 2749 md_wait_for_blocked_rdev(blocked_rdev, conf->mddev);
2932 2750
2933 if (pending) 2751 if (s.ops_request)
2934 raid5_run_ops(sh, pending); 2752 raid5_run_ops(sh, s.ops_request);
2935 2753
2936 return_io(return_bi); 2754 ops_run_io(sh, &s);
2937 2755
2756 return_io(return_bi);
2938} 2757}
2939 2758
2940static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page) 2759static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
@@ -3042,8 +2861,7 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
3042 * might need to be failed 2861 * might need to be failed
3043 */ 2862 */
3044 if (s.failed > 2 && s.to_read+s.to_write+s.written) 2863 if (s.failed > 2 && s.to_read+s.to_write+s.written)
3045 handle_requests_to_failed_array(conf, sh, &s, disks, 2864 handle_failed_stripe(conf, sh, &s, disks, &return_bi);
3046 &return_bi);
3047 if (s.failed > 2 && s.syncing) { 2865 if (s.failed > 2 && s.syncing) {
3048 md_done_sync(conf->mddev, STRIPE_SECTORS,0); 2866 md_done_sync(conf->mddev, STRIPE_SECTORS,0);
3049 clear_bit(STRIPE_SYNCING, &sh->state); 2867 clear_bit(STRIPE_SYNCING, &sh->state);
@@ -3068,7 +2886,7 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
3068 ( r6s.q_failed || ((test_bit(R5_Insync, &qdev->flags) 2886 ( r6s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
3069 && !test_bit(R5_LOCKED, &qdev->flags) 2887 && !test_bit(R5_LOCKED, &qdev->flags)
3070 && test_bit(R5_UPTODATE, &qdev->flags))))) 2888 && test_bit(R5_UPTODATE, &qdev->flags)))))
3071 handle_completed_write_requests(conf, sh, disks, &return_bi); 2889 handle_stripe_clean_event(conf, sh, disks, &return_bi);
3072 2890
3073 /* Now we might consider reading some blocks, either to check/generate 2891 /* Now we might consider reading some blocks, either to check/generate
3074 * parity, or to satisfy requests 2892 * parity, or to satisfy requests
@@ -3076,11 +2894,11 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
3076 */ 2894 */
3077 if (s.to_read || s.non_overwrite || (s.to_write && s.failed) || 2895 if (s.to_read || s.non_overwrite || (s.to_write && s.failed) ||
3078 (s.syncing && (s.uptodate < disks)) || s.expanding) 2896 (s.syncing && (s.uptodate < disks)) || s.expanding)
3079 handle_issuing_new_read_requests6(sh, &s, &r6s, disks); 2897 handle_stripe_fill6(sh, &s, &r6s, disks);
3080 2898
3081 /* now to consider writing and what else, if anything should be read */ 2899 /* now to consider writing and what else, if anything should be read */
3082 if (s.to_write) 2900 if (s.to_write)
3083 handle_issuing_new_write_requests6(conf, sh, &s, &r6s, disks); 2901 handle_stripe_dirtying6(conf, sh, &s, &r6s, disks);
3084 2902
3085 /* maybe we need to check and possibly fix the parity for this stripe 2903 /* maybe we need to check and possibly fix the parity for this stripe
3086 * Any reads will already have been scheduled, so we just see if enough 2904 * Any reads will already have been scheduled, so we just see if enough
@@ -3136,7 +2954,7 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
3136 } 2954 }
3137 2955
3138 if (s.expanding && s.locked == 0 && 2956 if (s.expanding && s.locked == 0 &&
3139 !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) 2957 !test_bit(STRIPE_COMPUTE_RUN, &sh->state))
3140 handle_stripe_expansion(conf, sh, &r6s); 2958 handle_stripe_expansion(conf, sh, &r6s);
3141 2959
3142 unlock: 2960 unlock:
@@ -3146,68 +2964,9 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
3146 if (unlikely(blocked_rdev)) 2964 if (unlikely(blocked_rdev))
3147 md_wait_for_blocked_rdev(blocked_rdev, conf->mddev); 2965 md_wait_for_blocked_rdev(blocked_rdev, conf->mddev);
3148 2966
3149 return_io(return_bi); 2967 ops_run_io(sh, &s);
3150
3151 for (i=disks; i-- ;) {
3152 int rw;
3153 struct bio *bi;
3154 mdk_rdev_t *rdev;
3155 if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags))
3156 rw = WRITE;
3157 else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags))
3158 rw = READ;
3159 else
3160 continue;
3161
3162 set_bit(STRIPE_IO_STARTED, &sh->state);
3163
3164 bi = &sh->dev[i].req;
3165
3166 bi->bi_rw = rw;
3167 if (rw == WRITE)
3168 bi->bi_end_io = raid5_end_write_request;
3169 else
3170 bi->bi_end_io = raid5_end_read_request;
3171
3172 rcu_read_lock();
3173 rdev = rcu_dereference(conf->disks[i].rdev);
3174 if (rdev && test_bit(Faulty, &rdev->flags))
3175 rdev = NULL;
3176 if (rdev)
3177 atomic_inc(&rdev->nr_pending);
3178 rcu_read_unlock();
3179 2968
3180 if (rdev) { 2969 return_io(return_bi);
3181 if (s.syncing || s.expanding || s.expanded)
3182 md_sync_acct(rdev->bdev, STRIPE_SECTORS);
3183
3184 bi->bi_bdev = rdev->bdev;
3185 pr_debug("for %llu schedule op %ld on disc %d\n",
3186 (unsigned long long)sh->sector, bi->bi_rw, i);
3187 atomic_inc(&sh->count);
3188 bi->bi_sector = sh->sector + rdev->data_offset;
3189 bi->bi_flags = 1 << BIO_UPTODATE;
3190 bi->bi_vcnt = 1;
3191 bi->bi_max_vecs = 1;
3192 bi->bi_idx = 0;
3193 bi->bi_io_vec = &sh->dev[i].vec;
3194 bi->bi_io_vec[0].bv_len = STRIPE_SIZE;
3195 bi->bi_io_vec[0].bv_offset = 0;
3196 bi->bi_size = STRIPE_SIZE;
3197 bi->bi_next = NULL;
3198 if (rw == WRITE &&
3199 test_bit(R5_ReWrite, &sh->dev[i].flags))
3200 atomic_add(STRIPE_SECTORS, &rdev->corrected_errors);
3201 generic_make_request(bi);
3202 } else {
3203 if (rw == WRITE)
3204 set_bit(STRIPE_DEGRADED, &sh->state);
3205 pr_debug("skip op %ld on disc %d for sector %llu\n",
3206 bi->bi_rw, i, (unsigned long long)sh->sector);
3207 clear_bit(R5_LOCKED, &sh->dev[i].flags);
3208 set_bit(STRIPE_HANDLE, &sh->state);
3209 }
3210 }
3211} 2970}
3212 2971
3213static void handle_stripe(struct stripe_head *sh, struct page *tmp_page) 2972static void handle_stripe(struct stripe_head *sh, struct page *tmp_page)
@@ -3697,9 +3456,7 @@ static int make_request(struct request_queue *q, struct bio * bi)
3697 if ( rw == WRITE ) 3456 if ( rw == WRITE )
3698 md_write_end(mddev); 3457 md_write_end(mddev);
3699 3458
3700 bi->bi_end_io(bi, 3459 bio_endio(bi, 0);
3701 test_bit(BIO_UPTODATE, &bi->bi_flags)
3702 ? 0 : -EIO);
3703 } 3460 }
3704 return 0; 3461 return 0;
3705} 3462}
@@ -3785,7 +3542,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
3785 j == raid6_next_disk(sh->pd_idx, sh->disks)) 3542 j == raid6_next_disk(sh->pd_idx, sh->disks))
3786 continue; 3543 continue;
3787 s = compute_blocknr(sh, j); 3544 s = compute_blocknr(sh, j);
3788 if (s < (mddev->array_size<<1)) { 3545 if (s < mddev->array_sectors) {
3789 skipped = 1; 3546 skipped = 1;
3790 continue; 3547 continue;
3791 } 3548 }
@@ -4002,12 +3759,8 @@ static int retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio)
4002 spin_lock_irq(&conf->device_lock); 3759 spin_lock_irq(&conf->device_lock);
4003 remaining = --raid_bio->bi_phys_segments; 3760 remaining = --raid_bio->bi_phys_segments;
4004 spin_unlock_irq(&conf->device_lock); 3761 spin_unlock_irq(&conf->device_lock);
4005 if (remaining == 0) { 3762 if (remaining == 0)
4006 3763 bio_endio(raid_bio, 0);
4007 raid_bio->bi_end_io(raid_bio,
4008 test_bit(BIO_UPTODATE, &raid_bio->bi_flags)
4009 ? 0 : -EIO);
4010 }
4011 if (atomic_dec_and_test(&conf->active_aligned_reads)) 3764 if (atomic_dec_and_test(&conf->active_aligned_reads))
4012 wake_up(&conf->wait_for_stripe); 3765 wake_up(&conf->wait_for_stripe);
4013 return handled; 3766 return handled;
@@ -4094,6 +3847,8 @@ raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
4094{ 3847{
4095 raid5_conf_t *conf = mddev_to_conf(mddev); 3848 raid5_conf_t *conf = mddev_to_conf(mddev);
4096 unsigned long new; 3849 unsigned long new;
3850 int err;
3851
4097 if (len >= PAGE_SIZE) 3852 if (len >= PAGE_SIZE)
4098 return -EINVAL; 3853 return -EINVAL;
4099 if (!conf) 3854 if (!conf)
@@ -4109,7 +3864,9 @@ raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
4109 else 3864 else
4110 break; 3865 break;
4111 } 3866 }
4112 md_allow_write(mddev); 3867 err = md_allow_write(mddev);
3868 if (err)
3869 return err;
4113 while (new > conf->max_nr_stripes) { 3870 while (new > conf->max_nr_stripes) {
4114 if (grow_one_stripe(conf)) 3871 if (grow_one_stripe(conf))
4115 conf->max_nr_stripes++; 3872 conf->max_nr_stripes++;
@@ -4434,7 +4191,7 @@ static int run(mddev_t *mddev)
4434 mddev->queue->backing_dev_info.congested_data = mddev; 4191 mddev->queue->backing_dev_info.congested_data = mddev;
4435 mddev->queue->backing_dev_info.congested_fn = raid5_congested; 4192 mddev->queue->backing_dev_info.congested_fn = raid5_congested;
4436 4193
4437 mddev->array_size = mddev->size * (conf->previous_raid_disks - 4194 mddev->array_sectors = 2 * mddev->size * (conf->previous_raid_disks -
4438 conf->max_degraded); 4195 conf->max_degraded);
4439 4196
4440 blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec); 4197 blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec);
@@ -4609,35 +4366,41 @@ abort:
4609static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) 4366static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
4610{ 4367{
4611 raid5_conf_t *conf = mddev->private; 4368 raid5_conf_t *conf = mddev->private;
4612 int found = 0; 4369 int err = -EEXIST;
4613 int disk; 4370 int disk;
4614 struct disk_info *p; 4371 struct disk_info *p;
4372 int first = 0;
4373 int last = conf->raid_disks - 1;
4615 4374
4616 if (mddev->degraded > conf->max_degraded) 4375 if (mddev->degraded > conf->max_degraded)
4617 /* no point adding a device */ 4376 /* no point adding a device */
4618 return 0; 4377 return -EINVAL;
4378
4379 if (rdev->raid_disk >= 0)
4380 first = last = rdev->raid_disk;
4619 4381
4620 /* 4382 /*
4621 * find the disk ... but prefer rdev->saved_raid_disk 4383 * find the disk ... but prefer rdev->saved_raid_disk
4622 * if possible. 4384 * if possible.
4623 */ 4385 */
4624 if (rdev->saved_raid_disk >= 0 && 4386 if (rdev->saved_raid_disk >= 0 &&
4387 rdev->saved_raid_disk >= first &&
4625 conf->disks[rdev->saved_raid_disk].rdev == NULL) 4388 conf->disks[rdev->saved_raid_disk].rdev == NULL)
4626 disk = rdev->saved_raid_disk; 4389 disk = rdev->saved_raid_disk;
4627 else 4390 else
4628 disk = 0; 4391 disk = first;
4629 for ( ; disk < conf->raid_disks; disk++) 4392 for ( ; disk <= last ; disk++)
4630 if ((p=conf->disks + disk)->rdev == NULL) { 4393 if ((p=conf->disks + disk)->rdev == NULL) {
4631 clear_bit(In_sync, &rdev->flags); 4394 clear_bit(In_sync, &rdev->flags);
4632 rdev->raid_disk = disk; 4395 rdev->raid_disk = disk;
4633 found = 1; 4396 err = 0;
4634 if (rdev->saved_raid_disk != disk) 4397 if (rdev->saved_raid_disk != disk)
4635 conf->fullsync = 1; 4398 conf->fullsync = 1;
4636 rcu_assign_pointer(p->rdev, rdev); 4399 rcu_assign_pointer(p->rdev, rdev);
4637 break; 4400 break;
4638 } 4401 }
4639 print_raid5_conf(conf); 4402 print_raid5_conf(conf);
4640 return found; 4403 return err;
4641} 4404}
4642 4405
4643static int raid5_resize(mddev_t *mddev, sector_t sectors) 4406static int raid5_resize(mddev_t *mddev, sector_t sectors)
@@ -4652,8 +4415,9 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors)
4652 raid5_conf_t *conf = mddev_to_conf(mddev); 4415 raid5_conf_t *conf = mddev_to_conf(mddev);
4653 4416
4654 sectors &= ~((sector_t)mddev->chunk_size/512 - 1); 4417 sectors &= ~((sector_t)mddev->chunk_size/512 - 1);
4655 mddev->array_size = (sectors * (mddev->raid_disks-conf->max_degraded))>>1; 4418 mddev->array_sectors = sectors * (mddev->raid_disks
4656 set_capacity(mddev->gendisk, mddev->array_size << 1); 4419 - conf->max_degraded);
4420 set_capacity(mddev->gendisk, mddev->array_sectors);
4657 mddev->changed = 1; 4421 mddev->changed = 1;
4658 if (sectors/2 > mddev->size && mddev->recovery_cp == MaxSector) { 4422 if (sectors/2 > mddev->size && mddev->recovery_cp == MaxSector) {
4659 mddev->recovery_cp = mddev->size << 1; 4423 mddev->recovery_cp = mddev->size << 1;
@@ -4738,7 +4502,7 @@ static int raid5_start_reshape(mddev_t *mddev)
4738 rdev_for_each(rdev, rtmp, mddev) 4502 rdev_for_each(rdev, rtmp, mddev)
4739 if (rdev->raid_disk < 0 && 4503 if (rdev->raid_disk < 0 &&
4740 !test_bit(Faulty, &rdev->flags)) { 4504 !test_bit(Faulty, &rdev->flags)) {
4741 if (raid5_add_disk(mddev, rdev)) { 4505 if (raid5_add_disk(mddev, rdev) == 0) {
4742 char nm[20]; 4506 char nm[20];
4743 set_bit(In_sync, &rdev->flags); 4507 set_bit(In_sync, &rdev->flags);
4744 added_devices++; 4508 added_devices++;
@@ -4786,15 +4550,16 @@ static void end_reshape(raid5_conf_t *conf)
4786 struct block_device *bdev; 4550 struct block_device *bdev;
4787 4551
4788 if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) { 4552 if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
4789 conf->mddev->array_size = conf->mddev->size * 4553 conf->mddev->array_sectors = 2 * conf->mddev->size *
4790 (conf->raid_disks - conf->max_degraded); 4554 (conf->raid_disks - conf->max_degraded);
4791 set_capacity(conf->mddev->gendisk, conf->mddev->array_size << 1); 4555 set_capacity(conf->mddev->gendisk, conf->mddev->array_sectors);
4792 conf->mddev->changed = 1; 4556 conf->mddev->changed = 1;
4793 4557
4794 bdev = bdget_disk(conf->mddev->gendisk, 0); 4558 bdev = bdget_disk(conf->mddev->gendisk, 0);
4795 if (bdev) { 4559 if (bdev) {
4796 mutex_lock(&bdev->bd_inode->i_mutex); 4560 mutex_lock(&bdev->bd_inode->i_mutex);
4797 i_size_write(bdev->bd_inode, (loff_t)conf->mddev->array_size << 10); 4561 i_size_write(bdev->bd_inode,
4562 (loff_t)conf->mddev->array_sectors << 9);
4798 mutex_unlock(&bdev->bd_inode->i_mutex); 4563 mutex_unlock(&bdev->bd_inode->i_mutex);
4799 bdput(bdev); 4564 bdput(bdev);
4800 } 4565 }
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c
index e208a60c048a..e7132770a3bf 100644
--- a/drivers/media/dvb/dvb-core/dvbdev.c
+++ b/drivers/media/dvb/dvb-core/dvbdev.c
@@ -233,9 +233,9 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
233 233
234 mutex_unlock(&dvbdev_register_lock); 234 mutex_unlock(&dvbdev_register_lock);
235 235
236 clsdev = device_create(dvb_class, adap->device, 236 clsdev = device_create_drvdata(dvb_class, adap->device,
237 MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), 237 MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
238 "dvb%d.%s%d", adap->num, dnames[type], id); 238 NULL, "dvb%d.%s%d", adap->num, dnames[type], id);
239 if (IS_ERR(clsdev)) { 239 if (IS_ERR(clsdev)) {
240 printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n", 240 printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n",
241 __func__, adap->num, dnames[type], id, PTR_ERR(clsdev)); 241 __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
diff --git a/drivers/media/video/pvrusb2/pvrusb2-dvb.c b/drivers/media/video/pvrusb2/pvrusb2-dvb.c
index 6ec4bf81fc7f..77b3c3385066 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-dvb.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-dvb.c
@@ -20,6 +20,7 @@
20 20
21#include <linux/kthread.h> 21#include <linux/kthread.h>
22#include <linux/freezer.h> 22#include <linux/freezer.h>
23#include <linux/mm.h>
23#include "dvbdev.h" 24#include "dvbdev.h"
24#include "pvrusb2-debug.h" 25#include "pvrusb2-debug.h"
25#include "pvrusb2-hdw-internal.h" 26#include "pvrusb2-hdw-internal.h"
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ioread.c b/drivers/media/video/pvrusb2/pvrusb2-ioread.c
index 05a1376405e7..b4824782d858 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-ioread.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-ioread.c
@@ -22,6 +22,7 @@
22#include "pvrusb2-debug.h" 22#include "pvrusb2-debug.h"
23#include <linux/errno.h> 23#include <linux/errno.h>
24#include <linux/string.h> 24#include <linux/string.h>
25#include <linux/mm.h>
25#include <linux/slab.h> 26#include <linux/slab.h>
26#include <linux/mutex.h> 27#include <linux/mutex.h>
27#include <asm/uaccess.h> 28#include <asm/uaccess.h>
diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c
index 7388d0cee3d4..5646a6a32939 100644
--- a/drivers/media/video/uvc/uvc_queue.c
+++ b/drivers/media/video/uvc/uvc_queue.c
@@ -13,6 +13,7 @@
13 13
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/version.h> 15#include <linux/version.h>
16#include <linux/mm.h>
16#include <linux/list.h> 17#include <linux/list.h>
17#include <linux/module.h> 18#include <linux/module.h>
18#include <linux/usb.h> 19#include <linux/usb.h>
diff --git a/drivers/media/video/videobuf-core.c b/drivers/media/video/videobuf-core.c
index 0a88c44ace00..b7b05842cf28 100644
--- a/drivers/media/video/videobuf-core.c
+++ b/drivers/media/video/videobuf-core.c
@@ -16,6 +16,7 @@
16#include <linux/init.h> 16#include <linux/init.h>
17#include <linux/module.h> 17#include <linux/module.h>
18#include <linux/moduleparam.h> 18#include <linux/moduleparam.h>
19#include <linux/mm.h>
19#include <linux/slab.h> 20#include <linux/slab.h>
20#include <linux/interrupt.h> 21#include <linux/interrupt.h>
21 22
diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c
index a054668eda16..4e3bfbcdf155 100644
--- a/drivers/memstick/host/jmb38x_ms.c
+++ b/drivers/memstick/host/jmb38x_ms.c
@@ -51,7 +51,7 @@ struct jmb38x_ms_host {
51 void __iomem *addr; 51 void __iomem *addr;
52 spinlock_t lock; 52 spinlock_t lock;
53 int id; 53 int id;
54 char host_id[DEVICE_ID_SIZE]; 54 char host_id[32];
55 int irq; 55 int irq;
56 unsigned int block_pos; 56 unsigned int block_pos;
57 unsigned long timeout_jiffies; 57 unsigned long timeout_jiffies;
@@ -781,7 +781,7 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt)
781 781
782 spin_lock_init(&host->lock); 782 spin_lock_init(&host->lock);
783 host->id = cnt; 783 host->id = cnt;
784 snprintf(host->host_id, DEVICE_ID_SIZE, DRIVER_NAME ":slot%d", 784 snprintf(host->host_id, sizeof(host->host_id), DRIVER_NAME ":slot%d",
785 host->id); 785 host->id);
786 host->irq = jm->pdev->irq; 786 host->irq = jm->pdev->irq;
787 host->timeout_jiffies = msecs_to_jiffies(1000); 787 host->timeout_jiffies = msecs_to_jiffies(1000);
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c
index 75e599b85b64..34402c47027e 100644
--- a/drivers/message/fusion/mptbase.c
+++ b/drivers/message/fusion/mptbase.c
@@ -1670,7 +1670,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
1670 INIT_DELAYED_WORK(&ioc->fault_reset_work, mpt_fault_reset_work); 1670 INIT_DELAYED_WORK(&ioc->fault_reset_work, mpt_fault_reset_work);
1671 spin_lock_init(&ioc->fault_reset_work_lock); 1671 spin_lock_init(&ioc->fault_reset_work_lock);
1672 1672
1673 snprintf(ioc->reset_work_q_name, KOBJ_NAME_LEN, "mpt_poll_%d", ioc->id); 1673 snprintf(ioc->reset_work_q_name, sizeof(ioc->reset_work_q_name),
1674 "mpt_poll_%d", ioc->id);
1674 ioc->reset_work_q = 1675 ioc->reset_work_q =
1675 create_singlethread_workqueue(ioc->reset_work_q_name); 1676 create_singlethread_workqueue(ioc->reset_work_q_name);
1676 if (!ioc->reset_work_q) { 1677 if (!ioc->reset_work_q) {
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h
index 6adab648dbb9..dff048cfa101 100644
--- a/drivers/message/fusion/mptbase.h
+++ b/drivers/message/fusion/mptbase.h
@@ -707,12 +707,12 @@ typedef struct _MPT_ADAPTER
707 u8 fc_link_speed[2]; 707 u8 fc_link_speed[2];
708 spinlock_t fc_rescan_work_lock; 708 spinlock_t fc_rescan_work_lock;
709 struct work_struct fc_rescan_work; 709 struct work_struct fc_rescan_work;
710 char fc_rescan_work_q_name[KOBJ_NAME_LEN]; 710 char fc_rescan_work_q_name[20];
711 struct workqueue_struct *fc_rescan_work_q; 711 struct workqueue_struct *fc_rescan_work_q;
712 struct scsi_cmnd **ScsiLookup; 712 struct scsi_cmnd **ScsiLookup;
713 spinlock_t scsi_lookup_lock; 713 spinlock_t scsi_lookup_lock;
714 714
715 char reset_work_q_name[KOBJ_NAME_LEN]; 715 char reset_work_q_name[20];
716 struct workqueue_struct *reset_work_q; 716 struct workqueue_struct *reset_work_q;
717 struct delayed_work fault_reset_work; 717 struct delayed_work fault_reset_work;
718 spinlock_t fault_reset_work_lock; 718 spinlock_t fault_reset_work_lock;
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c
index fc31ca6829d8..b36cae9ec6db 100644
--- a/drivers/message/fusion/mptfc.c
+++ b/drivers/message/fusion/mptfc.c
@@ -1326,8 +1326,8 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1326 1326
1327 /* initialize workqueue */ 1327 /* initialize workqueue */
1328 1328
1329 snprintf(ioc->fc_rescan_work_q_name, KOBJ_NAME_LEN, "mptfc_wq_%d", 1329 snprintf(ioc->fc_rescan_work_q_name, sizeof(ioc->fc_rescan_work_q_name),
1330 sh->host_no); 1330 "mptfc_wq_%d", sh->host_no);
1331 ioc->fc_rescan_work_q = 1331 ioc->fc_rescan_work_q =
1332 create_singlethread_workqueue(ioc->fc_rescan_work_q_name); 1332 create_singlethread_workqueue(ioc->fc_rescan_work_q_name);
1333 if (!ioc->fc_rescan_work_q) 1333 if (!ioc->fc_rescan_work_q)
diff --git a/drivers/message/i2o/device.c b/drivers/message/i2o/device.c
index 489d7c5c4965..8774c670e668 100644
--- a/drivers/message/i2o/device.c
+++ b/drivers/message/i2o/device.c
@@ -243,29 +243,41 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry)
243 243
244 /* create user entries for this device */ 244 /* create user entries for this device */
245 tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); 245 tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid);
246 if (tmp && (tmp != i2o_dev)) 246 if (tmp && (tmp != i2o_dev)) {
247 sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, 247 rc = sysfs_create_link(&i2o_dev->device.kobj,
248 "user"); 248 &tmp->device.kobj, "user");
249 if (rc)
250 goto unreg_dev;
251 }
249 252
250 /* create user entries refering to this device */ 253 /* create user entries refering to this device */
251 list_for_each_entry(tmp, &c->devices, list) 254 list_for_each_entry(tmp, &c->devices, list)
252 if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid) 255 if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid)
253 && (tmp != i2o_dev)) 256 && (tmp != i2o_dev)) {
254 sysfs_create_link(&tmp->device.kobj, 257 rc = sysfs_create_link(&tmp->device.kobj,
255 &i2o_dev->device.kobj, "user"); 258 &i2o_dev->device.kobj, "user");
259 if (rc)
260 goto rmlink1;
261 }
256 262
257 /* create parent entries for this device */ 263 /* create parent entries for this device */
258 tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); 264 tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid);
259 if (tmp && (tmp != i2o_dev)) 265 if (tmp && (tmp != i2o_dev)) {
260 sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, 266 rc = sysfs_create_link(&i2o_dev->device.kobj,
261 "parent"); 267 &tmp->device.kobj, "parent");
268 if (rc)
269 goto rmlink1;
270 }
262 271
263 /* create parent entries refering to this device */ 272 /* create parent entries refering to this device */
264 list_for_each_entry(tmp, &c->devices, list) 273 list_for_each_entry(tmp, &c->devices, list)
265 if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) 274 if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid)
266 && (tmp != i2o_dev)) 275 && (tmp != i2o_dev)) {
267 sysfs_create_link(&tmp->device.kobj, 276 rc = sysfs_create_link(&tmp->device.kobj,
268 &i2o_dev->device.kobj, "parent"); 277 &i2o_dev->device.kobj, "parent");
278 if (rc)
279 goto rmlink2;
280 }
269 281
270 i2o_driver_notify_device_add_all(i2o_dev); 282 i2o_driver_notify_device_add_all(i2o_dev);
271 283
@@ -273,6 +285,24 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry)
273 285
274 return 0; 286 return 0;
275 287
288rmlink2:
289 /* If link creating failed halfway, we loop whole list to cleanup.
290 * And we don't care wrong removing of link, because sysfs_remove_link
291 * will take care of it.
292 */
293 list_for_each_entry(tmp, &c->devices, list) {
294 if (tmp->lct_data.parent_tid == i2o_dev->lct_data.tid)
295 sysfs_remove_link(&tmp->device.kobj, "parent");
296 }
297 sysfs_remove_link(&i2o_dev->device.kobj, "parent");
298rmlink1:
299 list_for_each_entry(tmp, &c->devices, list)
300 if (tmp->lct_data.user_tid == i2o_dev->lct_data.tid)
301 sysfs_remove_link(&tmp->device.kobj, "user");
302 sysfs_remove_link(&i2o_dev->device.kobj, "user");
303unreg_dev:
304 list_del(&i2o_dev->list);
305 device_unregister(&i2o_dev->device);
276err: 306err:
277 kfree(i2o_dev); 307 kfree(i2o_dev);
278 return rc; 308 return rc;
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 260bade0a5ec..9f93c29fed35 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -5,6 +5,10 @@
5menu "Multifunction device drivers" 5menu "Multifunction device drivers"
6 depends on HAS_IOMEM 6 depends on HAS_IOMEM
7 7
8config MFD_CORE
9 tristate
10 default n
11
8config MFD_SM501 12config MFD_SM501
9 tristate "Support for Silicon Motion SM501" 13 tristate "Support for Silicon Motion SM501"
10 ---help--- 14 ---help---
@@ -38,6 +42,13 @@ config HTC_PASIC3
38 HTC Magician devices, respectively. Actual functionality is 42 HTC Magician devices, respectively. Actual functionality is
39 handled by the leds-pasic3 and ds1wm drivers. 43 handled by the leds-pasic3 and ds1wm drivers.
40 44
45config MFD_TC6393XB
46 bool "Support Toshiba TC6393XB"
47 depends on HAVE_GPIO_LIB
48 select MFD_CORE
49 help
50 Support for Toshiba Mobile IO Controller TC6393XB
51
41endmenu 52endmenu
42 53
43menu "Multimedia Capabilities Port drivers" 54menu "Multimedia Capabilities Port drivers"
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index eef4e26807df..33daa2f45dd8 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -8,6 +8,10 @@ obj-$(CONFIG_MFD_ASIC3) += asic3.o
8obj-$(CONFIG_HTC_EGPIO) += htc-egpio.o 8obj-$(CONFIG_HTC_EGPIO) += htc-egpio.o
9obj-$(CONFIG_HTC_PASIC3) += htc-pasic3.o 9obj-$(CONFIG_HTC_PASIC3) += htc-pasic3.o
10 10
11obj-$(CONFIG_MFD_TC6393XB) += tc6393xb.o
12
13obj-$(CONFIG_MFD_CORE) += mfd-core.o
14
11obj-$(CONFIG_MCP) += mcp-core.o 15obj-$(CONFIG_MCP) += mcp-core.o
12obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o 16obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o
13obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o 17obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
new file mode 100644
index 000000000000..d7d88ce053a6
--- /dev/null
+++ b/drivers/mfd/mfd-core.c
@@ -0,0 +1,114 @@
1/*
2 * drivers/mfd/mfd-core.c
3 *
4 * core MFD support
5 * Copyright (c) 2006 Ian Molton
6 * Copyright (c) 2007,2008 Dmitry Baryshkov
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#include <linux/kernel.h>
15#include <linux/platform_device.h>
16#include <linux/mfd/core.h>
17
18static int mfd_add_device(struct platform_device *parent,
19 const struct mfd_cell *cell,
20 struct resource *mem_base,
21 int irq_base)
22{
23 struct resource res[cell->num_resources];
24 struct platform_device *pdev;
25 int ret = -ENOMEM;
26 int r;
27
28 pdev = platform_device_alloc(cell->name, parent->id);
29 if (!pdev)
30 goto fail_alloc;
31
32 pdev->dev.parent = &parent->dev;
33
34 ret = platform_device_add_data(pdev,
35 cell, sizeof(struct mfd_cell));
36 if (ret)
37 goto fail_device;
38
39 memzero(res, sizeof(res));
40 for (r = 0; r < cell->num_resources; r++) {
41 res[r].name = cell->resources[r].name;
42 res[r].flags = cell->resources[r].flags;
43
44 /* Find out base to use */
45 if (cell->resources[r].flags & IORESOURCE_MEM) {
46 res[r].parent = mem_base;
47 res[r].start = mem_base->start +
48 cell->resources[r].start;
49 res[r].end = mem_base->start +
50 cell->resources[r].end;
51 } else if (cell->resources[r].flags & IORESOURCE_IRQ) {
52 res[r].start = irq_base +
53 cell->resources[r].start;
54 res[r].end = irq_base +
55 cell->resources[r].end;
56 } else {
57 res[r].parent = cell->resources[r].parent;
58 res[r].start = cell->resources[r].start;
59 res[r].end = cell->resources[r].end;
60 }
61 }
62
63 platform_device_add_resources(pdev, res, cell->num_resources);
64
65 ret = platform_device_add(pdev);
66 if (ret)
67 goto fail_device;
68
69 return 0;
70
71/* platform_device_del(pdev); */
72fail_device:
73 platform_device_put(pdev);
74fail_alloc:
75 return ret;
76}
77
78int mfd_add_devices(
79 struct platform_device *parent,
80 const struct mfd_cell *cells, int n_devs,
81 struct resource *mem_base,
82 int irq_base)
83{
84 int i;
85 int ret = 0;
86
87 for (i = 0; i < n_devs; i++) {
88 ret = mfd_add_device(parent, cells + i, mem_base, irq_base);
89 if (ret)
90 break;
91 }
92
93 if (ret)
94 mfd_remove_devices(parent);
95
96 return ret;
97}
98EXPORT_SYMBOL(mfd_add_devices);
99
100static int mfd_remove_devices_fn(struct device *dev, void *unused)
101{
102 platform_device_unregister(
103 container_of(dev, struct platform_device, dev));
104 return 0;
105}
106
107void mfd_remove_devices(struct platform_device *parent)
108{
109 device_for_each_child(&parent->dev, NULL, mfd_remove_devices_fn);
110}
111EXPORT_SYMBOL(mfd_remove_devices);
112
113MODULE_LICENSE("GPL");
114MODULE_AUTHOR("Ian Molton, Dmitry Baryshkov");
diff --git a/drivers/mfd/tc6393xb.c b/drivers/mfd/tc6393xb.c
new file mode 100644
index 000000000000..2d87501b6fd4
--- /dev/null
+++ b/drivers/mfd/tc6393xb.c
@@ -0,0 +1,600 @@
1/*
2 * Toshiba TC6393XB SoC support
3 *
4 * Copyright(c) 2005-2006 Chris Humbert
5 * Copyright(c) 2005 Dirk Opfer
6 * Copyright(c) 2005 Ian Molton <spyro@f2s.com>
7 * Copyright(c) 2007 Dmitry Baryshkov
8 *
9 * Based on code written by Sharp/Lineo for 2.4 kernels
10 * Based on locomo.c
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 */
16
17#include <linux/kernel.h>
18#include <linux/module.h>
19#include <linux/io.h>
20#include <linux/irq.h>
21#include <linux/platform_device.h>
22#include <linux/fb.h>
23#include <linux/clk.h>
24#include <linux/mfd/core.h>
25#include <linux/mfd/tmio.h>
26#include <linux/mfd/tc6393xb.h>
27#include <linux/gpio.h>
28
29#define SCR_REVID 0x08 /* b Revision ID */
30#define SCR_ISR 0x50 /* b Interrupt Status */
31#define SCR_IMR 0x52 /* b Interrupt Mask */
32#define SCR_IRR 0x54 /* b Interrupt Routing */
33#define SCR_GPER 0x60 /* w GP Enable */
34#define SCR_GPI_SR(i) (0x64 + (i)) /* b3 GPI Status */
35#define SCR_GPI_IMR(i) (0x68 + (i)) /* b3 GPI INT Mask */
36#define SCR_GPI_EDER(i) (0x6c + (i)) /* b3 GPI Edge Detect Enable */
37#define SCR_GPI_LIR(i) (0x70 + (i)) /* b3 GPI Level Invert */
38#define SCR_GPO_DSR(i) (0x78 + (i)) /* b3 GPO Data Set */
39#define SCR_GPO_DOECR(i) (0x7c + (i)) /* b3 GPO Data OE Control */
40#define SCR_GP_IARCR(i) (0x80 + (i)) /* b3 GP Internal Active Register Control */
41#define SCR_GP_IARLCR(i) (0x84 + (i)) /* b3 GP INTERNAL Active Register Level Control */
42#define SCR_GPI_BCR(i) (0x88 + (i)) /* b3 GPI Buffer Control */
43#define SCR_GPA_IARCR 0x8c /* w GPa Internal Active Register Control */
44#define SCR_GPA_IARLCR 0x90 /* w GPa Internal Active Register Level Control */
45#define SCR_GPA_BCR 0x94 /* w GPa Buffer Control */
46#define SCR_CCR 0x98 /* w Clock Control */
47#define SCR_PLL2CR 0x9a /* w PLL2 Control */
48#define SCR_PLL1CR 0x9c /* l PLL1 Control */
49#define SCR_DIARCR 0xa0 /* b Device Internal Active Register Control */
50#define SCR_DBOCR 0xa1 /* b Device Buffer Off Control */
51#define SCR_FER 0xe0 /* b Function Enable */
52#define SCR_MCR 0xe4 /* w Mode Control */
53#define SCR_CONFIG 0xfc /* b Configuration Control */
54#define SCR_DEBUG 0xff /* b Debug */
55
56#define SCR_CCR_CK32K BIT(0)
57#define SCR_CCR_USBCK BIT(1)
58#define SCR_CCR_UNK1 BIT(4)
59#define SCR_CCR_MCLK_MASK (7 << 8)
60#define SCR_CCR_MCLK_OFF (0 << 8)
61#define SCR_CCR_MCLK_12 (1 << 8)
62#define SCR_CCR_MCLK_24 (2 << 8)
63#define SCR_CCR_MCLK_48 (3 << 8)
64#define SCR_CCR_HCLK_MASK (3 << 12)
65#define SCR_CCR_HCLK_24 (0 << 12)
66#define SCR_CCR_HCLK_48 (1 << 12)
67
68#define SCR_FER_USBEN BIT(0) /* USB host enable */
69#define SCR_FER_LCDCVEN BIT(1) /* polysilicon TFT enable */
70#define SCR_FER_SLCDEN BIT(2) /* SLCD enable */
71
72#define SCR_MCR_RDY_MASK (3 << 0)
73#define SCR_MCR_RDY_OPENDRAIN (0 << 0)
74#define SCR_MCR_RDY_TRISTATE (1 << 0)
75#define SCR_MCR_RDY_PUSHPULL (2 << 0)
76#define SCR_MCR_RDY_UNK BIT(2)
77#define SCR_MCR_RDY_EN BIT(3)
78#define SCR_MCR_INT_MASK (3 << 4)
79#define SCR_MCR_INT_OPENDRAIN (0 << 4)
80#define SCR_MCR_INT_TRISTATE (1 << 4)
81#define SCR_MCR_INT_PUSHPULL (2 << 4)
82#define SCR_MCR_INT_UNK BIT(6)
83#define SCR_MCR_INT_EN BIT(7)
84/* bits 8 - 16 are unknown */
85
86#define TC_GPIO_BIT(i) (1 << (i & 0x7))
87
88/*--------------------------------------------------------------------------*/
89
90struct tc6393xb {
91 void __iomem *scr;
92
93 struct gpio_chip gpio;
94
95 struct clk *clk; /* 3,6 Mhz */
96
97 spinlock_t lock; /* protects RMW cycles */
98
99 struct {
100 u8 fer;
101 u16 ccr;
102 u8 gpi_bcr[3];
103 u8 gpo_dsr[3];
104 u8 gpo_doecr[3];
105 } suspend_state;
106
107 struct resource rscr;
108 struct resource *iomem;
109 int irq;
110 int irq_base;
111};
112
113enum {
114 TC6393XB_CELL_NAND,
115};
116
117/*--------------------------------------------------------------------------*/
118
119static int tc6393xb_nand_enable(struct platform_device *nand)
120{
121 struct platform_device *dev = to_platform_device(nand->dev.parent);
122 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
123 unsigned long flags;
124
125 spin_lock_irqsave(&tc6393xb->lock, flags);
126
127 /* SMD buffer on */
128 dev_dbg(&dev->dev, "SMD buffer on\n");
129 iowrite8(0xff, tc6393xb->scr + SCR_GPI_BCR(1));
130
131 spin_unlock_irqrestore(&tc6393xb->lock, flags);
132
133 return 0;
134}
135
136static struct resource __devinitdata tc6393xb_nand_resources[] = {
137 {
138 .name = TMIO_NAND_CONFIG,
139 .start = 0x0100,
140 .end = 0x01ff,
141 .flags = IORESOURCE_MEM,
142 },
143 {
144 .name = TMIO_NAND_CONTROL,
145 .start = 0x1000,
146 .end = 0x1007,
147 .flags = IORESOURCE_MEM,
148 },
149 {
150 .name = TMIO_NAND_IRQ,
151 .start = IRQ_TC6393_NAND,
152 .end = IRQ_TC6393_NAND,
153 .flags = IORESOURCE_IRQ,
154 },
155};
156
157static struct mfd_cell __devinitdata tc6393xb_cells[] = {
158 [TC6393XB_CELL_NAND] = {
159 .name = "tmio-nand",
160 .enable = tc6393xb_nand_enable,
161 .num_resources = ARRAY_SIZE(tc6393xb_nand_resources),
162 .resources = tc6393xb_nand_resources,
163 },
164};
165
166/*--------------------------------------------------------------------------*/
167
168static int tc6393xb_gpio_get(struct gpio_chip *chip,
169 unsigned offset)
170{
171 struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio);
172
173 /* XXX: does dsr also represent inputs? */
174 return ioread8(tc6393xb->scr + SCR_GPO_DSR(offset / 8))
175 & TC_GPIO_BIT(offset);
176}
177
178static void __tc6393xb_gpio_set(struct gpio_chip *chip,
179 unsigned offset, int value)
180{
181 struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio);
182 u8 dsr;
183
184 dsr = ioread8(tc6393xb->scr + SCR_GPO_DSR(offset / 8));
185 if (value)
186 dsr |= TC_GPIO_BIT(offset);
187 else
188 dsr &= ~TC_GPIO_BIT(offset);
189
190 iowrite8(dsr, tc6393xb->scr + SCR_GPO_DSR(offset / 8));
191}
192
193static void tc6393xb_gpio_set(struct gpio_chip *chip,
194 unsigned offset, int value)
195{
196 struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio);
197 unsigned long flags;
198
199 spin_lock_irqsave(&tc6393xb->lock, flags);
200
201 __tc6393xb_gpio_set(chip, offset, value);
202
203 spin_unlock_irqrestore(&tc6393xb->lock, flags);
204}
205
206static int tc6393xb_gpio_direction_input(struct gpio_chip *chip,
207 unsigned offset)
208{
209 struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio);
210 unsigned long flags;
211 u8 doecr;
212
213 spin_lock_irqsave(&tc6393xb->lock, flags);
214
215 doecr = ioread8(tc6393xb->scr + SCR_GPO_DOECR(offset / 8));
216 doecr &= ~TC_GPIO_BIT(offset);
217 iowrite8(doecr, tc6393xb->scr + SCR_GPO_DOECR(offset / 8));
218
219 spin_unlock_irqrestore(&tc6393xb->lock, flags);
220
221 return 0;
222}
223
224static int tc6393xb_gpio_direction_output(struct gpio_chip *chip,
225 unsigned offset, int value)
226{
227 struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio);
228 unsigned long flags;
229 u8 doecr;
230
231 spin_lock_irqsave(&tc6393xb->lock, flags);
232
233 __tc6393xb_gpio_set(chip, offset, value);
234
235 doecr = ioread8(tc6393xb->scr + SCR_GPO_DOECR(offset / 8));
236 doecr |= TC_GPIO_BIT(offset);
237 iowrite8(doecr, tc6393xb->scr + SCR_GPO_DOECR(offset / 8));
238
239 spin_unlock_irqrestore(&tc6393xb->lock, flags);
240
241 return 0;
242}
243
244static int tc6393xb_register_gpio(struct tc6393xb *tc6393xb, int gpio_base)
245{
246 tc6393xb->gpio.label = "tc6393xb";
247 tc6393xb->gpio.base = gpio_base;
248 tc6393xb->gpio.ngpio = 16;
249 tc6393xb->gpio.set = tc6393xb_gpio_set;
250 tc6393xb->gpio.get = tc6393xb_gpio_get;
251 tc6393xb->gpio.direction_input = tc6393xb_gpio_direction_input;
252 tc6393xb->gpio.direction_output = tc6393xb_gpio_direction_output;
253
254 return gpiochip_add(&tc6393xb->gpio);
255}
256
257/*--------------------------------------------------------------------------*/
258
259static void
260tc6393xb_irq(unsigned int irq, struct irq_desc *desc)
261{
262 struct tc6393xb *tc6393xb = get_irq_data(irq);
263 unsigned int isr;
264 unsigned int i, irq_base;
265
266 irq_base = tc6393xb->irq_base;
267
268 while ((isr = ioread8(tc6393xb->scr + SCR_ISR) &
269 ~ioread8(tc6393xb->scr + SCR_IMR)))
270 for (i = 0; i < TC6393XB_NR_IRQS; i++) {
271 if (isr & (1 << i))
272 generic_handle_irq(irq_base + i);
273 }
274}
275
276static void tc6393xb_irq_ack(unsigned int irq)
277{
278}
279
280static void tc6393xb_irq_mask(unsigned int irq)
281{
282 struct tc6393xb *tc6393xb = get_irq_chip_data(irq);
283 unsigned long flags;
284 u8 imr;
285
286 spin_lock_irqsave(&tc6393xb->lock, flags);
287 imr = ioread8(tc6393xb->scr + SCR_IMR);
288 imr |= 1 << (irq - tc6393xb->irq_base);
289 iowrite8(imr, tc6393xb->scr + SCR_IMR);
290 spin_unlock_irqrestore(&tc6393xb->lock, flags);
291}
292
293static void tc6393xb_irq_unmask(unsigned int irq)
294{
295 struct tc6393xb *tc6393xb = get_irq_chip_data(irq);
296 unsigned long flags;
297 u8 imr;
298
299 spin_lock_irqsave(&tc6393xb->lock, flags);
300 imr = ioread8(tc6393xb->scr + SCR_IMR);
301 imr &= ~(1 << (irq - tc6393xb->irq_base));
302 iowrite8(imr, tc6393xb->scr + SCR_IMR);
303 spin_unlock_irqrestore(&tc6393xb->lock, flags);
304}
305
306static struct irq_chip tc6393xb_chip = {
307 .name = "tc6393xb",
308 .ack = tc6393xb_irq_ack,
309 .mask = tc6393xb_irq_mask,
310 .unmask = tc6393xb_irq_unmask,
311};
312
313static void tc6393xb_attach_irq(struct platform_device *dev)
314{
315 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
316 unsigned int irq, irq_base;
317
318 irq_base = tc6393xb->irq_base;
319
320 for (irq = irq_base; irq < irq_base + TC6393XB_NR_IRQS; irq++) {
321 set_irq_chip(irq, &tc6393xb_chip);
322 set_irq_chip_data(irq, tc6393xb);
323 set_irq_handler(irq, handle_edge_irq);
324 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
325 }
326
327 set_irq_type(tc6393xb->irq, IRQT_FALLING);
328 set_irq_data(tc6393xb->irq, tc6393xb);
329 set_irq_chained_handler(tc6393xb->irq, tc6393xb_irq);
330}
331
332static void tc6393xb_detach_irq(struct platform_device *dev)
333{
334 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
335 unsigned int irq, irq_base;
336
337 set_irq_chained_handler(tc6393xb->irq, NULL);
338 set_irq_data(tc6393xb->irq, NULL);
339
340 irq_base = tc6393xb->irq_base;
341
342 for (irq = irq_base; irq < irq_base + TC6393XB_NR_IRQS; irq++) {
343 set_irq_flags(irq, 0);
344 set_irq_chip(irq, NULL);
345 set_irq_chip_data(irq, NULL);
346 }
347}
348
349/*--------------------------------------------------------------------------*/
350
351static int tc6393xb_hw_init(struct platform_device *dev)
352{
353 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
354 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
355 int i;
356
357 iowrite8(tc6393xb->suspend_state.fer, tc6393xb->scr + SCR_FER);
358 iowrite16(tcpd->scr_pll2cr, tc6393xb->scr + SCR_PLL2CR);
359 iowrite16(tc6393xb->suspend_state.ccr, tc6393xb->scr + SCR_CCR);
360 iowrite16(SCR_MCR_RDY_OPENDRAIN | SCR_MCR_RDY_UNK | SCR_MCR_RDY_EN |
361 SCR_MCR_INT_OPENDRAIN | SCR_MCR_INT_UNK | SCR_MCR_INT_EN |
362 BIT(15), tc6393xb->scr + SCR_MCR);
363 iowrite16(tcpd->scr_gper, tc6393xb->scr + SCR_GPER);
364 iowrite8(0, tc6393xb->scr + SCR_IRR);
365 iowrite8(0xbf, tc6393xb->scr + SCR_IMR);
366
367 for (i = 0; i < 3; i++) {
368 iowrite8(tc6393xb->suspend_state.gpo_dsr[i],
369 tc6393xb->scr + SCR_GPO_DSR(i));
370 iowrite8(tc6393xb->suspend_state.gpo_doecr[i],
371 tc6393xb->scr + SCR_GPO_DOECR(i));
372 iowrite8(tc6393xb->suspend_state.gpi_bcr[i],
373 tc6393xb->scr + SCR_GPI_BCR(i));
374 }
375
376 return 0;
377}
378
379static int __devinit tc6393xb_probe(struct platform_device *dev)
380{
381 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
382 struct tc6393xb *tc6393xb;
383 struct resource *iomem;
384 struct resource *rscr;
385 int retval, temp;
386 int i;
387
388 iomem = platform_get_resource(dev, IORESOURCE_MEM, 0);
389 if (!iomem)
390 return -EINVAL;
391
392 tc6393xb = kzalloc(sizeof *tc6393xb, GFP_KERNEL);
393 if (!tc6393xb) {
394 retval = -ENOMEM;
395 goto err_kzalloc;
396 }
397
398 spin_lock_init(&tc6393xb->lock);
399
400 platform_set_drvdata(dev, tc6393xb);
401 tc6393xb->iomem = iomem;
402 tc6393xb->irq = platform_get_irq(dev, 0);
403 tc6393xb->irq_base = tcpd->irq_base;
404
405 tc6393xb->clk = clk_get(&dev->dev, "GPIO27_CLK" /* "CK3P6MI" */);
406 if (IS_ERR(tc6393xb->clk)) {
407 retval = PTR_ERR(tc6393xb->clk);
408 goto err_clk_get;
409 }
410
411 rscr = &tc6393xb->rscr;
412 rscr->name = "tc6393xb-core";
413 rscr->start = iomem->start;
414 rscr->end = iomem->start + 0xff;
415 rscr->flags = IORESOURCE_MEM;
416
417 retval = request_resource(iomem, rscr);
418 if (retval)
419 goto err_request_scr;
420
421 tc6393xb->scr = ioremap(rscr->start, rscr->end - rscr->start + 1);
422 if (!tc6393xb->scr) {
423 retval = -ENOMEM;
424 goto err_ioremap;
425 }
426
427 retval = clk_enable(tc6393xb->clk);
428 if (retval)
429 goto err_clk_enable;
430
431 retval = tcpd->enable(dev);
432 if (retval)
433 goto err_enable;
434
435 tc6393xb->suspend_state.fer = 0;
436 for (i = 0; i < 3; i++) {
437 tc6393xb->suspend_state.gpo_dsr[i] =
438 (tcpd->scr_gpo_dsr >> (8 * i)) & 0xff;
439 tc6393xb->suspend_state.gpo_doecr[i] =
440 (tcpd->scr_gpo_doecr >> (8 * i)) & 0xff;
441 }
442 /*
443 * It may be necessary to change this back to
444 * platform-dependant code
445 */
446 tc6393xb->suspend_state.ccr = SCR_CCR_UNK1 |
447 SCR_CCR_HCLK_48;
448
449 retval = tc6393xb_hw_init(dev);
450 if (retval)
451 goto err_hw_init;
452
453 printk(KERN_INFO "Toshiba tc6393xb revision %d at 0x%08lx, irq %d\n",
454 ioread8(tc6393xb->scr + SCR_REVID),
455 (unsigned long) iomem->start, tc6393xb->irq);
456
457 tc6393xb->gpio.base = -1;
458
459 if (tcpd->gpio_base >= 0) {
460 retval = tc6393xb_register_gpio(tc6393xb, tcpd->gpio_base);
461 if (retval)
462 goto err_gpio_add;
463 }
464
465 if (tc6393xb->irq)
466 tc6393xb_attach_irq(dev);
467
468 tc6393xb_cells[TC6393XB_CELL_NAND].driver_data = tcpd->nand_data;
469
470 retval = mfd_add_devices(dev,
471 tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
472 iomem, tcpd->irq_base);
473
474 return 0;
475
476 if (tc6393xb->irq)
477 tc6393xb_detach_irq(dev);
478
479err_gpio_add:
480 if (tc6393xb->gpio.base != -1)
481 temp = gpiochip_remove(&tc6393xb->gpio);
482err_hw_init:
483 tcpd->disable(dev);
484err_clk_enable:
485 clk_disable(tc6393xb->clk);
486err_enable:
487 iounmap(tc6393xb->scr);
488err_ioremap:
489 release_resource(&tc6393xb->rscr);
490err_request_scr:
491 clk_put(tc6393xb->clk);
492err_clk_get:
493 kfree(tc6393xb);
494err_kzalloc:
495 return retval;
496}
497
498static int __devexit tc6393xb_remove(struct platform_device *dev)
499{
500 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
501 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
502 int ret;
503
504 mfd_remove_devices(dev);
505
506 if (tc6393xb->irq)
507 tc6393xb_detach_irq(dev);
508
509 if (tc6393xb->gpio.base != -1) {
510 ret = gpiochip_remove(&tc6393xb->gpio);
511 if (ret) {
512 dev_err(&dev->dev, "Can't remove gpio chip: %d\n", ret);
513 return ret;
514 }
515 }
516
517 ret = tcpd->disable(dev);
518
519 clk_disable(tc6393xb->clk);
520
521 iounmap(tc6393xb->scr);
522
523 release_resource(&tc6393xb->rscr);
524
525 platform_set_drvdata(dev, NULL);
526
527 clk_put(tc6393xb->clk);
528
529 kfree(tc6393xb);
530
531 return ret;
532}
533
534#ifdef CONFIG_PM
535static int tc6393xb_suspend(struct platform_device *dev, pm_message_t state)
536{
537 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
538 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
539 int i;
540
541
542 tc6393xb->suspend_state.ccr = ioread16(tc6393xb->scr + SCR_CCR);
543 tc6393xb->suspend_state.fer = ioread8(tc6393xb->scr + SCR_FER);
544
545 for (i = 0; i < 3; i++) {
546 tc6393xb->suspend_state.gpo_dsr[i] =
547 ioread8(tc6393xb->scr + SCR_GPO_DSR(i));
548 tc6393xb->suspend_state.gpo_doecr[i] =
549 ioread8(tc6393xb->scr + SCR_GPO_DOECR(i));
550 tc6393xb->suspend_state.gpi_bcr[i] =
551 ioread8(tc6393xb->scr + SCR_GPI_BCR(i));
552 }
553
554 return tcpd->suspend(dev);
555}
556
557static int tc6393xb_resume(struct platform_device *dev)
558{
559 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
560 int ret = tcpd->resume(dev);
561
562 if (ret)
563 return ret;
564
565 return tc6393xb_hw_init(dev);
566}
567#else
568#define tc6393xb_suspend NULL
569#define tc6393xb_resume NULL
570#endif
571
572static struct platform_driver tc6393xb_driver = {
573 .probe = tc6393xb_probe,
574 .remove = __devexit_p(tc6393xb_remove),
575 .suspend = tc6393xb_suspend,
576 .resume = tc6393xb_resume,
577
578 .driver = {
579 .name = "tc6393xb",
580 .owner = THIS_MODULE,
581 },
582};
583
584static int __init tc6393xb_init(void)
585{
586 return platform_driver_register(&tc6393xb_driver);
587}
588
589static void __exit tc6393xb_exit(void)
590{
591 platform_driver_unregister(&tc6393xb_driver);
592}
593
594subsys_initcall(tc6393xb_init);
595module_exit(tc6393xb_exit);
596
597MODULE_LICENSE("GPL");
598MODULE_AUTHOR("Ian Molton, Dmitry Baryshkov and Dirk Opfer");
599MODULE_DESCRIPTION("tc6393xb Toshiba Mobile IO Controller");
600MODULE_ALIAS("platform:tc6393xb");
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index b27ca91fd15e..d5bc288b1b0d 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -422,4 +422,17 @@ config SGI_XP
422 this feature will allow for direct communication between SSIs 422 this feature will allow for direct communication between SSIs
423 based on a network adapter and DMA messaging. 423 based on a network adapter and DMA messaging.
424 424
425config HP_ILO
426 tristate "Channel interface driver for HP iLO/iLO2 processor"
427 default n
428 help
429 The channel interface driver allows applications to communicate
430 with iLO/iLO2 management processors present on HP ProLiant
431 servers. Upon loading, the driver creates /dev/hpilo/dXccbN files,
432 which can be used to gather data from the management processor,
433 via read and write system calls.
434
435 To compile this driver as a module, choose M here: the
436 module will be called hpilo.
437
425endif # MISC_DEVICES 438endif # MISC_DEVICES
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index a6dac6a2e7e5..688fe76135e0 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -27,3 +27,4 @@ obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o
27obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o 27obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o
28obj-$(CONFIG_KGDB_TESTS) += kgdbts.o 28obj-$(CONFIG_KGDB_TESTS) += kgdbts.o
29obj-$(CONFIG_SGI_XP) += sgi-xp/ 29obj-$(CONFIG_SGI_XP) += sgi-xp/
30obj-$(CONFIG_HP_ILO) += hpilo.o
diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c
index 5b5a14dab3d3..6aa5294dfec4 100644
--- a/drivers/misc/atmel_pwm.c
+++ b/drivers/misc/atmel_pwm.c
@@ -211,8 +211,7 @@ int pwm_clk_alloc(unsigned prescale, unsigned div)
211 if ((mr & 0xffff) == 0) { 211 if ((mr & 0xffff) == 0) {
212 mr |= val; 212 mr |= val;
213 ret = PWM_CPR_CLKA; 213 ret = PWM_CPR_CLKA;
214 } 214 } else if ((mr & (0xffff << 16)) == 0) {
215 if ((mr & (0xffff << 16)) == 0) {
216 mr |= val << 16; 215 mr |= val << 16;
217 ret = PWM_CPR_CLKB; 216 ret = PWM_CPR_CLKB;
218 } 217 }
diff --git a/drivers/misc/hpilo.c b/drivers/misc/hpilo.c
new file mode 100644
index 000000000000..05e298289238
--- /dev/null
+++ b/drivers/misc/hpilo.c
@@ -0,0 +1,768 @@
1/*
2 * Driver for HP iLO/iLO2 management processor.
3 *
4 * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
5 * David Altobelli <david.altobelli@hp.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/kernel.h>
12#include <linux/types.h>
13#include <linux/module.h>
14#include <linux/fs.h>
15#include <linux/pci.h>
16#include <linux/ioport.h>
17#include <linux/device.h>
18#include <linux/file.h>
19#include <linux/cdev.h>
20#include <linux/spinlock.h>
21#include <linux/delay.h>
22#include <linux/uaccess.h>
23#include <linux/io.h>
24#include "hpilo.h"
25
26static struct class *ilo_class;
27static unsigned int ilo_major;
28static char ilo_hwdev[MAX_ILO_DEV];
29
30static inline int get_entry_id(int entry)
31{
32 return (entry & ENTRY_MASK_DESCRIPTOR) >> ENTRY_BITPOS_DESCRIPTOR;
33}
34
35static inline int get_entry_len(int entry)
36{
37 return ((entry & ENTRY_MASK_QWORDS) >> ENTRY_BITPOS_QWORDS) << 3;
38}
39
40static inline int mk_entry(int id, int len)
41{
42 int qlen = len & 7 ? (len >> 3) + 1 : len >> 3;
43 return id << ENTRY_BITPOS_DESCRIPTOR | qlen << ENTRY_BITPOS_QWORDS;
44}
45
46static inline int desc_mem_sz(int nr_entry)
47{
48 return nr_entry << L2_QENTRY_SZ;
49}
50
51/*
52 * FIFO queues, shared with hardware.
53 *
54 * If a queue has empty slots, an entry is added to the queue tail,
55 * and that entry is marked as occupied.
56 * Entries can be dequeued from the head of the list, when the device
57 * has marked the entry as consumed.
58 *
59 * Returns true on successful queue/dequeue, false on failure.
60 */
61static int fifo_enqueue(struct ilo_hwinfo *hw, char *fifobar, int entry)
62{
63 struct fifo *fifo_q = FIFOBARTOHANDLE(fifobar);
64 int ret = 0;
65
66 spin_lock(&hw->fifo_lock);
67 if (!(fifo_q->fifobar[(fifo_q->tail + 1) & fifo_q->imask]
68 & ENTRY_MASK_O)) {
69 fifo_q->fifobar[fifo_q->tail & fifo_q->imask] |=
70 (entry & ENTRY_MASK_NOSTATE) | fifo_q->merge;
71 fifo_q->tail += 1;
72 ret = 1;
73 }
74 spin_unlock(&hw->fifo_lock);
75
76 return ret;
77}
78
79static int fifo_dequeue(struct ilo_hwinfo *hw, char *fifobar, int *entry)
80{
81 struct fifo *fifo_q = FIFOBARTOHANDLE(fifobar);
82 int ret = 0;
83 u64 c;
84
85 spin_lock(&hw->fifo_lock);
86 c = fifo_q->fifobar[fifo_q->head & fifo_q->imask];
87 if (c & ENTRY_MASK_C) {
88 if (entry)
89 *entry = c & ENTRY_MASK_NOSTATE;
90
91 fifo_q->fifobar[fifo_q->head & fifo_q->imask] =
92 (c | ENTRY_MASK) + 1;
93 fifo_q->head += 1;
94 ret = 1;
95 }
96 spin_unlock(&hw->fifo_lock);
97
98 return ret;
99}
100
101static int ilo_pkt_enqueue(struct ilo_hwinfo *hw, struct ccb *ccb,
102 int dir, int id, int len)
103{
104 char *fifobar;
105 int entry;
106
107 if (dir == SENDQ)
108 fifobar = ccb->ccb_u1.send_fifobar;
109 else
110 fifobar = ccb->ccb_u3.recv_fifobar;
111
112 entry = mk_entry(id, len);
113 return fifo_enqueue(hw, fifobar, entry);
114}
115
116static int ilo_pkt_dequeue(struct ilo_hwinfo *hw, struct ccb *ccb,
117 int dir, int *id, int *len, void **pkt)
118{
119 char *fifobar, *desc;
120 int entry = 0, pkt_id = 0;
121 int ret;
122
123 if (dir == SENDQ) {
124 fifobar = ccb->ccb_u1.send_fifobar;
125 desc = ccb->ccb_u2.send_desc;
126 } else {
127 fifobar = ccb->ccb_u3.recv_fifobar;
128 desc = ccb->ccb_u4.recv_desc;
129 }
130
131 ret = fifo_dequeue(hw, fifobar, &entry);
132 if (ret) {
133 pkt_id = get_entry_id(entry);
134 if (id)
135 *id = pkt_id;
136 if (len)
137 *len = get_entry_len(entry);
138 if (pkt)
139 *pkt = (void *)(desc + desc_mem_sz(pkt_id));
140 }
141
142 return ret;
143}
144
145static inline void doorbell_set(struct ccb *ccb)
146{
147 iowrite8(1, ccb->ccb_u5.db_base);
148}
149
150static inline void doorbell_clr(struct ccb *ccb)
151{
152 iowrite8(2, ccb->ccb_u5.db_base);
153}
154static inline int ctrl_set(int l2sz, int idxmask, int desclim)
155{
156 int active = 0, go = 1;
157 return l2sz << CTRL_BITPOS_L2SZ |
158 idxmask << CTRL_BITPOS_FIFOINDEXMASK |
159 desclim << CTRL_BITPOS_DESCLIMIT |
160 active << CTRL_BITPOS_A |
161 go << CTRL_BITPOS_G;
162}
163static void ctrl_setup(struct ccb *ccb, int nr_desc, int l2desc_sz)
164{
165 /* for simplicity, use the same parameters for send and recv ctrls */
166 ccb->send_ctrl = ctrl_set(l2desc_sz, nr_desc-1, nr_desc-1);
167 ccb->recv_ctrl = ctrl_set(l2desc_sz, nr_desc-1, nr_desc-1);
168}
169
170static inline int fifo_sz(int nr_entry)
171{
172 /* size of a fifo is determined by the number of entries it contains */
173 return (nr_entry * sizeof(u64)) + FIFOHANDLESIZE;
174}
175
176static void fifo_setup(void *base_addr, int nr_entry)
177{
178 struct fifo *fifo_q = base_addr;
179 int i;
180
181 /* set up an empty fifo */
182 fifo_q->head = 0;
183 fifo_q->tail = 0;
184 fifo_q->reset = 0;
185 fifo_q->nrents = nr_entry;
186 fifo_q->imask = nr_entry - 1;
187 fifo_q->merge = ENTRY_MASK_O;
188
189 for (i = 0; i < nr_entry; i++)
190 fifo_q->fifobar[i] = 0;
191}
192
193static void ilo_ccb_close(struct pci_dev *pdev, struct ccb_data *data)
194{
195 struct ccb *driver_ccb;
196 struct ccb __iomem *device_ccb;
197 int retries;
198
199 driver_ccb = &data->driver_ccb;
200 device_ccb = data->mapped_ccb;
201
202 /* complicated dance to tell the hw we are stopping */
203 doorbell_clr(driver_ccb);
204 iowrite32(ioread32(&device_ccb->send_ctrl) & ~(1 << CTRL_BITPOS_G),
205 &device_ccb->send_ctrl);
206 iowrite32(ioread32(&device_ccb->recv_ctrl) & ~(1 << CTRL_BITPOS_G),
207 &device_ccb->recv_ctrl);
208
209 /* give iLO some time to process stop request */
210 for (retries = 1000; retries > 0; retries--) {
211 doorbell_set(driver_ccb);
212 udelay(1);
213 if (!(ioread32(&device_ccb->send_ctrl) & (1 << CTRL_BITPOS_A))
214 &&
215 !(ioread32(&device_ccb->recv_ctrl) & (1 << CTRL_BITPOS_A)))
216 break;
217 }
218 if (retries == 0)
219 dev_err(&pdev->dev, "Closing, but controller still active\n");
220
221 /* clear the hw ccb */
222 memset_io(device_ccb, 0, sizeof(struct ccb));
223
224 /* free resources used to back send/recv queues */
225 pci_free_consistent(pdev, data->dma_size, data->dma_va, data->dma_pa);
226}
227
228static int ilo_ccb_open(struct ilo_hwinfo *hw, struct ccb_data *data, int slot)
229{
230 char *dma_va, *dma_pa;
231 int pkt_id, pkt_sz, i, error;
232 struct ccb *driver_ccb, *ilo_ccb;
233 struct pci_dev *pdev;
234
235 driver_ccb = &data->driver_ccb;
236 ilo_ccb = &data->ilo_ccb;
237 pdev = hw->ilo_dev;
238
239 data->dma_size = 2 * fifo_sz(NR_QENTRY) +
240 2 * desc_mem_sz(NR_QENTRY) +
241 ILO_START_ALIGN + ILO_CACHE_SZ;
242
243 error = -ENOMEM;
244 data->dma_va = pci_alloc_consistent(pdev, data->dma_size,
245 &data->dma_pa);
246 if (!data->dma_va)
247 goto out;
248
249 dma_va = (char *)data->dma_va;
250 dma_pa = (char *)data->dma_pa;
251
252 memset(dma_va, 0, data->dma_size);
253
254 dma_va = (char *)roundup((unsigned long)dma_va, ILO_START_ALIGN);
255 dma_pa = (char *)roundup((unsigned long)dma_pa, ILO_START_ALIGN);
256
257 /*
258 * Create two ccb's, one with virt addrs, one with phys addrs.
259 * Copy the phys addr ccb to device shared mem.
260 */
261 ctrl_setup(driver_ccb, NR_QENTRY, L2_QENTRY_SZ);
262 ctrl_setup(ilo_ccb, NR_QENTRY, L2_QENTRY_SZ);
263
264 fifo_setup(dma_va, NR_QENTRY);
265 driver_ccb->ccb_u1.send_fifobar = dma_va + FIFOHANDLESIZE;
266 ilo_ccb->ccb_u1.send_fifobar = dma_pa + FIFOHANDLESIZE;
267 dma_va += fifo_sz(NR_QENTRY);
268 dma_pa += fifo_sz(NR_QENTRY);
269
270 dma_va = (char *)roundup((unsigned long)dma_va, ILO_CACHE_SZ);
271 dma_pa = (char *)roundup((unsigned long)dma_pa, ILO_CACHE_SZ);
272
273 fifo_setup(dma_va, NR_QENTRY);
274 driver_ccb->ccb_u3.recv_fifobar = dma_va + FIFOHANDLESIZE;
275 ilo_ccb->ccb_u3.recv_fifobar = dma_pa + FIFOHANDLESIZE;
276 dma_va += fifo_sz(NR_QENTRY);
277 dma_pa += fifo_sz(NR_QENTRY);
278
279 driver_ccb->ccb_u2.send_desc = dma_va;
280 ilo_ccb->ccb_u2.send_desc = dma_pa;
281 dma_pa += desc_mem_sz(NR_QENTRY);
282 dma_va += desc_mem_sz(NR_QENTRY);
283
284 driver_ccb->ccb_u4.recv_desc = dma_va;
285 ilo_ccb->ccb_u4.recv_desc = dma_pa;
286
287 driver_ccb->channel = slot;
288 ilo_ccb->channel = slot;
289
290 driver_ccb->ccb_u5.db_base = hw->db_vaddr + (slot << L2_DB_SIZE);
291 ilo_ccb->ccb_u5.db_base = NULL; /* hw ccb's doorbell is not used */
292
293 /* copy the ccb with physical addrs to device memory */
294 data->mapped_ccb = (struct ccb __iomem *)
295 (hw->ram_vaddr + (slot * ILOHW_CCB_SZ));
296 memcpy_toio(data->mapped_ccb, ilo_ccb, sizeof(struct ccb));
297
298 /* put packets on the send and receive queues */
299 pkt_sz = 0;
300 for (pkt_id = 0; pkt_id < NR_QENTRY; pkt_id++) {
301 ilo_pkt_enqueue(hw, driver_ccb, SENDQ, pkt_id, pkt_sz);
302 doorbell_set(driver_ccb);
303 }
304
305 pkt_sz = desc_mem_sz(1);
306 for (pkt_id = 0; pkt_id < NR_QENTRY; pkt_id++)
307 ilo_pkt_enqueue(hw, driver_ccb, RECVQ, pkt_id, pkt_sz);
308
309 doorbell_clr(driver_ccb);
310
311 /* make sure iLO is really handling requests */
312 for (i = 1000; i > 0; i--) {
313 if (ilo_pkt_dequeue(hw, driver_ccb, SENDQ, &pkt_id, NULL, NULL))
314 break;
315 udelay(1);
316 }
317
318 if (i) {
319 ilo_pkt_enqueue(hw, driver_ccb, SENDQ, pkt_id, 0);
320 doorbell_set(driver_ccb);
321 } else {
322 dev_err(&pdev->dev, "Open could not dequeue a packet\n");
323 error = -EBUSY;
324 goto free;
325 }
326
327 return 0;
328free:
329 pci_free_consistent(pdev, data->dma_size, data->dma_va, data->dma_pa);
330out:
331 return error;
332}
333
334static inline int is_channel_reset(struct ccb *ccb)
335{
336 /* check for this particular channel needing a reset */
337 return FIFOBARTOHANDLE(ccb->ccb_u1.send_fifobar)->reset;
338}
339
340static inline void set_channel_reset(struct ccb *ccb)
341{
342 /* set a flag indicating this channel needs a reset */
343 FIFOBARTOHANDLE(ccb->ccb_u1.send_fifobar)->reset = 1;
344}
345
346static inline int is_device_reset(struct ilo_hwinfo *hw)
347{
348 /* check for global reset condition */
349 return ioread32(&hw->mmio_vaddr[DB_OUT]) & (1 << DB_RESET);
350}
351
352static inline void clear_device(struct ilo_hwinfo *hw)
353{
354 /* clear the device (reset bits, pending channel entries) */
355 iowrite32(-1, &hw->mmio_vaddr[DB_OUT]);
356}
357
358static void ilo_locked_reset(struct ilo_hwinfo *hw)
359{
360 int slot;
361
362 /*
363 * Mapped memory is zeroed on ilo reset, so set a per ccb flag
364 * to indicate that this ccb needs to be closed and reopened.
365 */
366 for (slot = 0; slot < MAX_CCB; slot++) {
367 if (!hw->ccb_alloc[slot])
368 continue;
369 set_channel_reset(&hw->ccb_alloc[slot]->driver_ccb);
370 }
371
372 clear_device(hw);
373}
374
375static void ilo_reset(struct ilo_hwinfo *hw)
376{
377 spin_lock(&hw->alloc_lock);
378
379 /* reset might have been handled after lock was taken */
380 if (is_device_reset(hw))
381 ilo_locked_reset(hw);
382
383 spin_unlock(&hw->alloc_lock);
384}
385
386static ssize_t ilo_read(struct file *fp, char __user *buf,
387 size_t len, loff_t *off)
388{
389 int err, found, cnt, pkt_id, pkt_len;
390 struct ccb_data *data;
391 struct ccb *driver_ccb;
392 struct ilo_hwinfo *hw;
393 void *pkt;
394
395 data = fp->private_data;
396 driver_ccb = &data->driver_ccb;
397 hw = data->ilo_hw;
398
399 if (is_device_reset(hw) || is_channel_reset(driver_ccb)) {
400 /*
401 * If the device has been reset, applications
402 * need to close and reopen all ccbs.
403 */
404 ilo_reset(hw);
405 return -ENODEV;
406 }
407
408 /*
409 * This function is to be called when data is expected
410 * in the channel, and will return an error if no packet is found
411 * during the loop below. The sleep/retry logic is to allow
412 * applications to call read() immediately post write(),
413 * and give iLO some time to process the sent packet.
414 */
415 cnt = 20;
416 do {
417 /* look for a received packet */
418 found = ilo_pkt_dequeue(hw, driver_ccb, RECVQ, &pkt_id,
419 &pkt_len, &pkt);
420 if (found)
421 break;
422 cnt--;
423 msleep(100);
424 } while (!found && cnt);
425
426 if (!found)
427 return -EAGAIN;
428
429 /* only copy the length of the received packet */
430 if (pkt_len < len)
431 len = pkt_len;
432
433 err = copy_to_user(buf, pkt, len);
434
435 /* return the received packet to the queue */
436 ilo_pkt_enqueue(hw, driver_ccb, RECVQ, pkt_id, desc_mem_sz(1));
437
438 return err ? -EFAULT : len;
439}
440
441static ssize_t ilo_write(struct file *fp, const char __user *buf,
442 size_t len, loff_t *off)
443{
444 int err, pkt_id, pkt_len;
445 struct ccb_data *data;
446 struct ccb *driver_ccb;
447 struct ilo_hwinfo *hw;
448 void *pkt;
449
450 data = fp->private_data;
451 driver_ccb = &data->driver_ccb;
452 hw = data->ilo_hw;
453
454 if (is_device_reset(hw) || is_channel_reset(driver_ccb)) {
455 /*
456 * If the device has been reset, applications
457 * need to close and reopen all ccbs.
458 */
459 ilo_reset(hw);
460 return -ENODEV;
461 }
462
463 /* get a packet to send the user command */
464 if (!ilo_pkt_dequeue(hw, driver_ccb, SENDQ, &pkt_id, &pkt_len, &pkt))
465 return -EBUSY;
466
467 /* limit the length to the length of the packet */
468 if (pkt_len < len)
469 len = pkt_len;
470
471 /* on failure, set the len to 0 to return empty packet to the device */
472 err = copy_from_user(pkt, buf, len);
473 if (err)
474 len = 0;
475
476 /* send the packet */
477 ilo_pkt_enqueue(hw, driver_ccb, SENDQ, pkt_id, len);
478 doorbell_set(driver_ccb);
479
480 return err ? -EFAULT : len;
481}
482
483static int ilo_close(struct inode *ip, struct file *fp)
484{
485 int slot;
486 struct ccb_data *data;
487 struct ilo_hwinfo *hw;
488
489 slot = iminor(ip) % MAX_CCB;
490 hw = container_of(ip->i_cdev, struct ilo_hwinfo, cdev);
491
492 spin_lock(&hw->alloc_lock);
493
494 if (is_device_reset(hw))
495 ilo_locked_reset(hw);
496
497 if (hw->ccb_alloc[slot]->ccb_cnt == 1) {
498
499 data = fp->private_data;
500
501 ilo_ccb_close(hw->ilo_dev, data);
502
503 kfree(data);
504 hw->ccb_alloc[slot] = NULL;
505 } else
506 hw->ccb_alloc[slot]->ccb_cnt--;
507
508 spin_unlock(&hw->alloc_lock);
509
510 return 0;
511}
512
513static int ilo_open(struct inode *ip, struct file *fp)
514{
515 int slot, error;
516 struct ccb_data *data;
517 struct ilo_hwinfo *hw;
518
519 slot = iminor(ip) % MAX_CCB;
520 hw = container_of(ip->i_cdev, struct ilo_hwinfo, cdev);
521
522 /* new ccb allocation */
523 data = kzalloc(sizeof(*data), GFP_KERNEL);
524 if (!data)
525 return -ENOMEM;
526
527 spin_lock(&hw->alloc_lock);
528
529 if (is_device_reset(hw))
530 ilo_locked_reset(hw);
531
532 /* each fd private_data holds sw/hw view of ccb */
533 if (hw->ccb_alloc[slot] == NULL) {
534 /* create a channel control block for this minor */
535 error = ilo_ccb_open(hw, data, slot);
536 if (!error) {
537 hw->ccb_alloc[slot] = data;
538 hw->ccb_alloc[slot]->ccb_cnt = 1;
539 hw->ccb_alloc[slot]->ccb_excl = fp->f_flags & O_EXCL;
540 hw->ccb_alloc[slot]->ilo_hw = hw;
541 } else
542 kfree(data);
543 } else {
544 kfree(data);
545 if (fp->f_flags & O_EXCL || hw->ccb_alloc[slot]->ccb_excl) {
546 /*
547 * The channel exists, and either this open
548 * or a previous open of this channel wants
549 * exclusive access.
550 */
551 error = -EBUSY;
552 } else {
553 hw->ccb_alloc[slot]->ccb_cnt++;
554 error = 0;
555 }
556 }
557 spin_unlock(&hw->alloc_lock);
558
559 if (!error)
560 fp->private_data = hw->ccb_alloc[slot];
561
562 return error;
563}
564
565static const struct file_operations ilo_fops = {
566 .owner = THIS_MODULE,
567 .read = ilo_read,
568 .write = ilo_write,
569 .open = ilo_open,
570 .release = ilo_close,
571};
572
573static void ilo_unmap_device(struct pci_dev *pdev, struct ilo_hwinfo *hw)
574{
575 pci_iounmap(pdev, hw->db_vaddr);
576 pci_iounmap(pdev, hw->ram_vaddr);
577 pci_iounmap(pdev, hw->mmio_vaddr);
578}
579
580static int __devinit ilo_map_device(struct pci_dev *pdev, struct ilo_hwinfo *hw)
581{
582 int error = -ENOMEM;
583
584 /* map the memory mapped i/o registers */
585 hw->mmio_vaddr = pci_iomap(pdev, 1, 0);
586 if (hw->mmio_vaddr == NULL) {
587 dev_err(&pdev->dev, "Error mapping mmio\n");
588 goto out;
589 }
590
591 /* map the adapter shared memory region */
592 hw->ram_vaddr = pci_iomap(pdev, 2, MAX_CCB * ILOHW_CCB_SZ);
593 if (hw->ram_vaddr == NULL) {
594 dev_err(&pdev->dev, "Error mapping shared mem\n");
595 goto mmio_free;
596 }
597
598 /* map the doorbell aperture */
599 hw->db_vaddr = pci_iomap(pdev, 3, MAX_CCB * ONE_DB_SIZE);
600 if (hw->db_vaddr == NULL) {
601 dev_err(&pdev->dev, "Error mapping doorbell\n");
602 goto ram_free;
603 }
604
605 return 0;
606ram_free:
607 pci_iounmap(pdev, hw->ram_vaddr);
608mmio_free:
609 pci_iounmap(pdev, hw->mmio_vaddr);
610out:
611 return error;
612}
613
614static void ilo_remove(struct pci_dev *pdev)
615{
616 int i, minor;
617 struct ilo_hwinfo *ilo_hw = pci_get_drvdata(pdev);
618
619 clear_device(ilo_hw);
620
621 minor = MINOR(ilo_hw->cdev.dev);
622 for (i = minor; i < minor + MAX_CCB; i++)
623 device_destroy(ilo_class, MKDEV(ilo_major, i));
624
625 cdev_del(&ilo_hw->cdev);
626 ilo_unmap_device(pdev, ilo_hw);
627 pci_release_regions(pdev);
628 pci_disable_device(pdev);
629 kfree(ilo_hw);
630 ilo_hwdev[(minor / MAX_CCB)] = 0;
631}
632
633static int __devinit ilo_probe(struct pci_dev *pdev,
634 const struct pci_device_id *ent)
635{
636 int devnum, minor, start, error;
637 struct ilo_hwinfo *ilo_hw;
638
639 /* find a free range for device files */
640 for (devnum = 0; devnum < MAX_ILO_DEV; devnum++) {
641 if (ilo_hwdev[devnum] == 0) {
642 ilo_hwdev[devnum] = 1;
643 break;
644 }
645 }
646
647 if (devnum == MAX_ILO_DEV) {
648 dev_err(&pdev->dev, "Error finding free device\n");
649 return -ENODEV;
650 }
651
652 /* track global allocations for this device */
653 error = -ENOMEM;
654 ilo_hw = kzalloc(sizeof(*ilo_hw), GFP_KERNEL);
655 if (!ilo_hw)
656 goto out;
657
658 ilo_hw->ilo_dev = pdev;
659 spin_lock_init(&ilo_hw->alloc_lock);
660 spin_lock_init(&ilo_hw->fifo_lock);
661
662 error = pci_enable_device(pdev);
663 if (error)
664 goto free;
665
666 pci_set_master(pdev);
667
668 error = pci_request_regions(pdev, ILO_NAME);
669 if (error)
670 goto disable;
671
672 error = ilo_map_device(pdev, ilo_hw);
673 if (error)
674 goto free_regions;
675
676 pci_set_drvdata(pdev, ilo_hw);
677 clear_device(ilo_hw);
678
679 cdev_init(&ilo_hw->cdev, &ilo_fops);
680 ilo_hw->cdev.owner = THIS_MODULE;
681 start = devnum * MAX_CCB;
682 error = cdev_add(&ilo_hw->cdev, MKDEV(ilo_major, start), MAX_CCB);
683 if (error) {
684 dev_err(&pdev->dev, "Could not add cdev\n");
685 goto unmap;
686 }
687
688 for (minor = 0 ; minor < MAX_CCB; minor++) {
689 struct device *dev;
690 dev = device_create(ilo_class, &pdev->dev,
691 MKDEV(ilo_major, minor), NULL,
692 "hpilo!d%dccb%d", devnum, minor);
693 if (IS_ERR(dev))
694 dev_err(&pdev->dev, "Could not create files\n");
695 }
696
697 return 0;
698unmap:
699 ilo_unmap_device(pdev, ilo_hw);
700free_regions:
701 pci_release_regions(pdev);
702disable:
703 pci_disable_device(pdev);
704free:
705 kfree(ilo_hw);
706out:
707 ilo_hwdev[devnum] = 0;
708 return error;
709}
710
711static struct pci_device_id ilo_devices[] = {
712 { PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xB204) },
713 { }
714};
715MODULE_DEVICE_TABLE(pci, ilo_devices);
716
717static struct pci_driver ilo_driver = {
718 .name = ILO_NAME,
719 .id_table = ilo_devices,
720 .probe = ilo_probe,
721 .remove = __devexit_p(ilo_remove),
722};
723
724static int __init ilo_init(void)
725{
726 int error;
727 dev_t dev;
728
729 ilo_class = class_create(THIS_MODULE, "iLO");
730 if (IS_ERR(ilo_class)) {
731 error = PTR_ERR(ilo_class);
732 goto out;
733 }
734
735 error = alloc_chrdev_region(&dev, 0, MAX_OPEN, ILO_NAME);
736 if (error)
737 goto class_destroy;
738
739 ilo_major = MAJOR(dev);
740
741 error = pci_register_driver(&ilo_driver);
742 if (error)
743 goto chr_remove;
744
745 return 0;
746chr_remove:
747 unregister_chrdev_region(dev, MAX_OPEN);
748class_destroy:
749 class_destroy(ilo_class);
750out:
751 return error;
752}
753
754static void __exit ilo_exit(void)
755{
756 pci_unregister_driver(&ilo_driver);
757 unregister_chrdev_region(MKDEV(ilo_major, 0), MAX_OPEN);
758 class_destroy(ilo_class);
759}
760
761MODULE_VERSION("0.05");
762MODULE_ALIAS(ILO_NAME);
763MODULE_DESCRIPTION(ILO_NAME);
764MODULE_AUTHOR("David Altobelli <david.altobelli@hp.com>");
765MODULE_LICENSE("GPL v2");
766
767module_init(ilo_init);
768module_exit(ilo_exit);
diff --git a/drivers/misc/hpilo.h b/drivers/misc/hpilo.h
new file mode 100644
index 000000000000..a281207696c1
--- /dev/null
+++ b/drivers/misc/hpilo.h
@@ -0,0 +1,189 @@
1/*
2 * linux/drivers/char/hpilo.h
3 *
4 * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
5 * David Altobelli <david.altobelli@hp.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#ifndef __HPILO_H
12#define __HPILO_H
13
14#define ILO_NAME "hpilo"
15
16/* max number of open channel control blocks per device, hw limited to 32 */
17#define MAX_CCB 8
18/* max number of supported devices */
19#define MAX_ILO_DEV 1
20/* max number of files */
21#define MAX_OPEN (MAX_CCB * MAX_ILO_DEV)
22
23/*
24 * Per device, used to track global memory allocations.
25 */
26struct ilo_hwinfo {
27 /* mmio registers on device */
28 char __iomem *mmio_vaddr;
29
30 /* doorbell registers on device */
31 char __iomem *db_vaddr;
32
33 /* shared memory on device used for channel control blocks */
34 char __iomem *ram_vaddr;
35
36 /* files corresponding to this device */
37 struct ccb_data *ccb_alloc[MAX_CCB];
38
39 struct pci_dev *ilo_dev;
40
41 spinlock_t alloc_lock;
42 spinlock_t fifo_lock;
43
44 struct cdev cdev;
45};
46
47/* offset from mmio_vaddr */
48#define DB_OUT 0xD4
49/* DB_OUT reset bit */
50#define DB_RESET 26
51
52/*
53 * Channel control block. Used to manage hardware queues.
54 * The format must match hw's version. The hw ccb is 128 bytes,
55 * but the context area shouldn't be touched by the driver.
56 */
57#define ILOSW_CCB_SZ 64
58#define ILOHW_CCB_SZ 128
59struct ccb {
60 union {
61 char *send_fifobar;
62 u64 padding1;
63 } ccb_u1;
64 union {
65 char *send_desc;
66 u64 padding2;
67 } ccb_u2;
68 u64 send_ctrl;
69
70 union {
71 char *recv_fifobar;
72 u64 padding3;
73 } ccb_u3;
74 union {
75 char *recv_desc;
76 u64 padding4;
77 } ccb_u4;
78 u64 recv_ctrl;
79
80 union {
81 char __iomem *db_base;
82 u64 padding5;
83 } ccb_u5;
84
85 u64 channel;
86
87 /* unused context area (64 bytes) */
88};
89
90/* ccb queue parameters */
91#define SENDQ 1
92#define RECVQ 2
93#define NR_QENTRY 4
94#define L2_QENTRY_SZ 12
95
96/* ccb ctrl bitfields */
97#define CTRL_BITPOS_L2SZ 0
98#define CTRL_BITPOS_FIFOINDEXMASK 4
99#define CTRL_BITPOS_DESCLIMIT 18
100#define CTRL_BITPOS_A 30
101#define CTRL_BITPOS_G 31
102
103/* ccb doorbell macros */
104#define L2_DB_SIZE 14
105#define ONE_DB_SIZE (1 << L2_DB_SIZE)
106
107/*
108 * Per fd structure used to track the ccb allocated to that dev file.
109 */
110struct ccb_data {
111 /* software version of ccb, using virtual addrs */
112 struct ccb driver_ccb;
113
114 /* hardware version of ccb, using physical addrs */
115 struct ccb ilo_ccb;
116
117 /* hardware ccb is written to this shared mapped device memory */
118 struct ccb __iomem *mapped_ccb;
119
120 /* dma'able memory used for send/recv queues */
121 void *dma_va;
122 dma_addr_t dma_pa;
123 size_t dma_size;
124
125 /* pointer to hardware device info */
126 struct ilo_hwinfo *ilo_hw;
127
128 /* usage count, to allow for shared ccb's */
129 int ccb_cnt;
130
131 /* open wanted exclusive access to this ccb */
132 int ccb_excl;
133};
134
135/*
136 * FIFO queue structure, shared with hw.
137 */
138#define ILO_START_ALIGN 4096
139#define ILO_CACHE_SZ 128
140struct fifo {
141 u64 nrents; /* user requested number of fifo entries */
142 u64 imask; /* mask to extract valid fifo index */
143 u64 merge; /* O/C bits to merge in during enqueue operation */
144 u64 reset; /* set to non-zero when the target device resets */
145 u8 pad_0[ILO_CACHE_SZ - (sizeof(u64) * 4)];
146
147 u64 head;
148 u8 pad_1[ILO_CACHE_SZ - (sizeof(u64))];
149
150 u64 tail;
151 u8 pad_2[ILO_CACHE_SZ - (sizeof(u64))];
152
153 u64 fifobar[1];
154};
155
156/* convert between struct fifo, and the fifobar, which is saved in the ccb */
157#define FIFOHANDLESIZE (sizeof(struct fifo) - sizeof(u64))
158#define FIFOBARTOHANDLE(_fifo) \
159 ((struct fifo *)(((char *)(_fifo)) - FIFOHANDLESIZE))
160
161/* the number of qwords to consume from the entry descriptor */
162#define ENTRY_BITPOS_QWORDS 0
163/* descriptor index number (within a specified queue) */
164#define ENTRY_BITPOS_DESCRIPTOR 10
165/* state bit, fifo entry consumed by consumer */
166#define ENTRY_BITPOS_C 22
167/* state bit, fifo entry is occupied */
168#define ENTRY_BITPOS_O 23
169
170#define ENTRY_BITS_QWORDS 10
171#define ENTRY_BITS_DESCRIPTOR 12
172#define ENTRY_BITS_C 1
173#define ENTRY_BITS_O 1
174#define ENTRY_BITS_TOTAL \
175 (ENTRY_BITS_C + ENTRY_BITS_O + \
176 ENTRY_BITS_QWORDS + ENTRY_BITS_DESCRIPTOR)
177
178/* extract various entry fields */
179#define ENTRY_MASK ((1 << ENTRY_BITS_TOTAL) - 1)
180#define ENTRY_MASK_C (((1 << ENTRY_BITS_C) - 1) << ENTRY_BITPOS_C)
181#define ENTRY_MASK_O (((1 << ENTRY_BITS_O) - 1) << ENTRY_BITPOS_O)
182#define ENTRY_MASK_QWORDS \
183 (((1 << ENTRY_BITS_QWORDS) - 1) << ENTRY_BITPOS_QWORDS)
184#define ENTRY_MASK_DESCRIPTOR \
185 (((1 << ENTRY_BITS_DESCRIPTOR) - 1) << ENTRY_BITPOS_DESCRIPTOR)
186
187#define ENTRY_MASK_NOSTATE (ENTRY_MASK >> (ENTRY_BITS_C + ENTRY_BITS_O))
188
189#endif /* __HPILO_H */
diff --git a/drivers/misc/phantom.c b/drivers/misc/phantom.c
index 186162470090..4ce3bdc2f959 100644
--- a/drivers/misc/phantom.c
+++ b/drivers/misc/phantom.c
@@ -399,8 +399,9 @@ static int __devinit phantom_probe(struct pci_dev *pdev,
399 goto err_irq; 399 goto err_irq;
400 } 400 }
401 401
402 if (IS_ERR(device_create(phantom_class, &pdev->dev, MKDEV(phantom_major, 402 if (IS_ERR(device_create_drvdata(phantom_class, &pdev->dev,
403 minor), "phantom%u", minor))) 403 MKDEV(phantom_major, minor),
404 NULL, "phantom%u", minor)))
404 dev_err(&pdev->dev, "can't create device\n"); 405 dev_err(&pdev->dev, "can't create device\n");
405 406
406 pci_set_drvdata(pdev, pht); 407 pci_set_drvdata(pdev, pht);
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c
index 08256ed0d9a6..579b01ff82d4 100644
--- a/drivers/misc/sgi-xp/xpc_main.c
+++ b/drivers/misc/sgi-xp/xpc_main.c
@@ -229,10 +229,11 @@ xpc_hb_checker(void *ignore)
229 int last_IRQ_count = 0; 229 int last_IRQ_count = 0;
230 int new_IRQ_count; 230 int new_IRQ_count;
231 int force_IRQ = 0; 231 int force_IRQ = 0;
232 cpumask_of_cpu_ptr(cpumask, XPC_HB_CHECK_CPU);
232 233
233 /* this thread was marked active by xpc_hb_init() */ 234 /* this thread was marked active by xpc_hb_init() */
234 235
235 set_cpus_allowed(current, cpumask_of_cpu(XPC_HB_CHECK_CPU)); 236 set_cpus_allowed_ptr(current, cpumask);
236 237
237 /* set our heartbeating to other partitions into motion */ 238 /* set our heartbeating to other partitions into motion */
238 xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); 239 xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ);
diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
index d6b9b486417c..a067fe436301 100644
--- a/drivers/mmc/card/mmc_test.c
+++ b/drivers/mmc/card/mmc_test.c
@@ -21,13 +21,17 @@
21#define RESULT_UNSUP_HOST 2 21#define RESULT_UNSUP_HOST 2
22#define RESULT_UNSUP_CARD 3 22#define RESULT_UNSUP_CARD 3
23 23
24#define BUFFER_SIZE (PAGE_SIZE * 4) 24#define BUFFER_ORDER 2
25#define BUFFER_SIZE (PAGE_SIZE << BUFFER_ORDER)
25 26
26struct mmc_test_card { 27struct mmc_test_card {
27 struct mmc_card *card; 28 struct mmc_card *card;
28 29
29 u8 scratch[BUFFER_SIZE]; 30 u8 scratch[BUFFER_SIZE];
30 u8 *buffer; 31 u8 *buffer;
32#ifdef CONFIG_HIGHMEM
33 struct page *highmem;
34#endif
31}; 35};
32 36
33/*******************************************************************/ 37/*******************************************************************/
@@ -384,14 +388,16 @@ static int mmc_test_transfer(struct mmc_test_card *test,
384 int ret, i; 388 int ret, i;
385 unsigned long flags; 389 unsigned long flags;
386 390
391 BUG_ON(blocks * blksz > BUFFER_SIZE);
392
387 if (write) { 393 if (write) {
388 for (i = 0;i < blocks * blksz;i++) 394 for (i = 0;i < blocks * blksz;i++)
389 test->scratch[i] = i; 395 test->scratch[i] = i;
390 } else { 396 } else {
391 memset(test->scratch, 0, BUFFER_SIZE); 397 memset(test->scratch, 0, blocks * blksz);
392 } 398 }
393 local_irq_save(flags); 399 local_irq_save(flags);
394 sg_copy_from_buffer(sg, sg_len, test->scratch, BUFFER_SIZE); 400 sg_copy_from_buffer(sg, sg_len, test->scratch, blocks * blksz);
395 local_irq_restore(flags); 401 local_irq_restore(flags);
396 402
397 ret = mmc_test_set_blksize(test, blksz); 403 ret = mmc_test_set_blksize(test, blksz);
@@ -438,7 +444,7 @@ static int mmc_test_transfer(struct mmc_test_card *test,
438 } 444 }
439 } else { 445 } else {
440 local_irq_save(flags); 446 local_irq_save(flags);
441 sg_copy_to_buffer(sg, sg_len, test->scratch, BUFFER_SIZE); 447 sg_copy_to_buffer(sg, sg_len, test->scratch, blocks * blksz);
442 local_irq_restore(flags); 448 local_irq_restore(flags);
443 for (i = 0;i < blocks * blksz;i++) { 449 for (i = 0;i < blocks * blksz;i++) {
444 if (test->scratch[i] != (u8)i) 450 if (test->scratch[i] != (u8)i)
@@ -799,6 +805,157 @@ static int mmc_test_multi_xfersize_read(struct mmc_test_card *test)
799 return 0; 805 return 0;
800} 806}
801 807
808static int mmc_test_bigsg_write(struct mmc_test_card *test)
809{
810 int ret;
811 unsigned int size;
812 struct scatterlist sg;
813
814 if (test->card->host->max_blk_count == 1)
815 return RESULT_UNSUP_HOST;
816
817 size = PAGE_SIZE * 2;
818 size = min(size, test->card->host->max_req_size);
819 size = min(size, test->card->host->max_seg_size);
820 size = min(size, test->card->host->max_blk_count * 512);
821
822 memset(test->buffer, 0, BUFFER_SIZE);
823
824 if (size < 1024)
825 return RESULT_UNSUP_HOST;
826
827 sg_init_table(&sg, 1);
828 sg_init_one(&sg, test->buffer, BUFFER_SIZE);
829
830 ret = mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 1);
831 if (ret)
832 return ret;
833
834 return 0;
835}
836
837static int mmc_test_bigsg_read(struct mmc_test_card *test)
838{
839 int ret, i;
840 unsigned int size;
841 struct scatterlist sg;
842
843 if (test->card->host->max_blk_count == 1)
844 return RESULT_UNSUP_HOST;
845
846 size = PAGE_SIZE * 2;
847 size = min(size, test->card->host->max_req_size);
848 size = min(size, test->card->host->max_seg_size);
849 size = min(size, test->card->host->max_blk_count * 512);
850
851 if (size < 1024)
852 return RESULT_UNSUP_HOST;
853
854 memset(test->buffer, 0xCD, BUFFER_SIZE);
855
856 sg_init_table(&sg, 1);
857 sg_init_one(&sg, test->buffer, BUFFER_SIZE);
858 ret = mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 0);
859 if (ret)
860 return ret;
861
862 /* mmc_test_transfer() doesn't check for read overflows */
863 for (i = size;i < BUFFER_SIZE;i++) {
864 if (test->buffer[i] != 0xCD)
865 return RESULT_FAIL;
866 }
867
868 return 0;
869}
870
871#ifdef CONFIG_HIGHMEM
872
873static int mmc_test_write_high(struct mmc_test_card *test)
874{
875 int ret;
876 struct scatterlist sg;
877
878 sg_init_table(&sg, 1);
879 sg_set_page(&sg, test->highmem, 512, 0);
880
881 ret = mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
882 if (ret)
883 return ret;
884
885 return 0;
886}
887
888static int mmc_test_read_high(struct mmc_test_card *test)
889{
890 int ret;
891 struct scatterlist sg;
892
893 sg_init_table(&sg, 1);
894 sg_set_page(&sg, test->highmem, 512, 0);
895
896 ret = mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
897 if (ret)
898 return ret;
899
900 return 0;
901}
902
903static int mmc_test_multi_write_high(struct mmc_test_card *test)
904{
905 int ret;
906 unsigned int size;
907 struct scatterlist sg;
908
909 if (test->card->host->max_blk_count == 1)
910 return RESULT_UNSUP_HOST;
911
912 size = PAGE_SIZE * 2;
913 size = min(size, test->card->host->max_req_size);
914 size = min(size, test->card->host->max_seg_size);
915 size = min(size, test->card->host->max_blk_count * 512);
916
917 if (size < 1024)
918 return RESULT_UNSUP_HOST;
919
920 sg_init_table(&sg, 1);
921 sg_set_page(&sg, test->highmem, size, 0);
922
923 ret = mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 1);
924 if (ret)
925 return ret;
926
927 return 0;
928}
929
930static int mmc_test_multi_read_high(struct mmc_test_card *test)
931{
932 int ret;
933 unsigned int size;
934 struct scatterlist sg;
935
936 if (test->card->host->max_blk_count == 1)
937 return RESULT_UNSUP_HOST;
938
939 size = PAGE_SIZE * 2;
940 size = min(size, test->card->host->max_req_size);
941 size = min(size, test->card->host->max_seg_size);
942 size = min(size, test->card->host->max_blk_count * 512);
943
944 if (size < 1024)
945 return RESULT_UNSUP_HOST;
946
947 sg_init_table(&sg, 1);
948 sg_set_page(&sg, test->highmem, size, 0);
949
950 ret = mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 0);
951 if (ret)
952 return ret;
953
954 return 0;
955}
956
957#endif /* CONFIG_HIGHMEM */
958
802static const struct mmc_test_case mmc_test_cases[] = { 959static const struct mmc_test_case mmc_test_cases[] = {
803 { 960 {
804 .name = "Basic write (no data verification)", 961 .name = "Basic write (no data verification)",
@@ -913,6 +1070,53 @@ static const struct mmc_test_case mmc_test_cases[] = {
913 .name = "Correct xfer_size at read (midway failure)", 1070 .name = "Correct xfer_size at read (midway failure)",
914 .run = mmc_test_multi_xfersize_read, 1071 .run = mmc_test_multi_xfersize_read,
915 }, 1072 },
1073
1074 {
1075 .name = "Over-sized SG list write",
1076 .prepare = mmc_test_prepare_write,
1077 .run = mmc_test_bigsg_write,
1078 .cleanup = mmc_test_cleanup,
1079 },
1080
1081 {
1082 .name = "Over-sized SG list read",
1083 .prepare = mmc_test_prepare_read,
1084 .run = mmc_test_bigsg_read,
1085 .cleanup = mmc_test_cleanup,
1086 },
1087
1088#ifdef CONFIG_HIGHMEM
1089
1090 {
1091 .name = "Highmem write",
1092 .prepare = mmc_test_prepare_write,
1093 .run = mmc_test_write_high,
1094 .cleanup = mmc_test_cleanup,
1095 },
1096
1097 {
1098 .name = "Highmem read",
1099 .prepare = mmc_test_prepare_read,
1100 .run = mmc_test_read_high,
1101 .cleanup = mmc_test_cleanup,
1102 },
1103
1104 {
1105 .name = "Multi-block highmem write",
1106 .prepare = mmc_test_prepare_write,
1107 .run = mmc_test_multi_write_high,
1108 .cleanup = mmc_test_cleanup,
1109 },
1110
1111 {
1112 .name = "Multi-block highmem read",
1113 .prepare = mmc_test_prepare_read,
1114 .run = mmc_test_multi_read_high,
1115 .cleanup = mmc_test_cleanup,
1116 },
1117
1118#endif /* CONFIG_HIGHMEM */
1119
916}; 1120};
917 1121
918static struct mutex mmc_test_lock; 1122static struct mutex mmc_test_lock;
@@ -1014,12 +1218,23 @@ static ssize_t mmc_test_store(struct device *dev,
1014 test->card = card; 1218 test->card = card;
1015 1219
1016 test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL); 1220 test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
1221#ifdef CONFIG_HIGHMEM
1222 test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER);
1223#endif
1224
1225#ifdef CONFIG_HIGHMEM
1226 if (test->buffer && test->highmem) {
1227#else
1017 if (test->buffer) { 1228 if (test->buffer) {
1229#endif
1018 mutex_lock(&mmc_test_lock); 1230 mutex_lock(&mmc_test_lock);
1019 mmc_test_run(test, testcase); 1231 mmc_test_run(test, testcase);
1020 mutex_unlock(&mmc_test_lock); 1232 mutex_unlock(&mmc_test_lock);
1021 } 1233 }
1022 1234
1235#ifdef CONFIG_HIGHMEM
1236 __free_pages(test->highmem, BUFFER_ORDER);
1237#endif
1023 kfree(test->buffer); 1238 kfree(test->buffer);
1024 kfree(test); 1239 kfree(test);
1025 1240
@@ -1041,6 +1256,8 @@ static int mmc_test_probe(struct mmc_card *card)
1041 if (ret) 1256 if (ret)
1042 return ret; 1257 return ret;
1043 1258
1259 dev_info(&card->dev, "Card claimed for testing.\n");
1260
1044 return 0; 1261 return 0;
1045} 1262}
1046 1263
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
index 7731ddefdc1b..3dee97e7d165 100644
--- a/drivers/mmc/card/queue.c
+++ b/drivers/mmc/card/queue.c
@@ -148,7 +148,7 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
148 printk(KERN_WARNING "%s: unable to allocate " 148 printk(KERN_WARNING "%s: unable to allocate "
149 "bounce buffer\n", mmc_card_name(card)); 149 "bounce buffer\n", mmc_card_name(card));
150 } else { 150 } else {
151 blk_queue_bounce_limit(mq->queue, BLK_BOUNCE_HIGH); 151 blk_queue_bounce_limit(mq->queue, BLK_BOUNCE_ANY);
152 blk_queue_max_sectors(mq->queue, bouncesz / 512); 152 blk_queue_max_sectors(mq->queue, bouncesz / 512);
153 blk_queue_max_phys_segments(mq->queue, bouncesz / 512); 153 blk_queue_max_phys_segments(mq->queue, bouncesz / 512);
154 blk_queue_max_hw_segments(mq->queue, bouncesz / 512); 154 blk_queue_max_hw_segments(mq->queue, bouncesz / 512);
@@ -290,55 +290,15 @@ void mmc_queue_resume(struct mmc_queue *mq)
290 } 290 }
291} 291}
292 292
293static void copy_sg(struct scatterlist *dst, unsigned int dst_len, 293/*
294 struct scatterlist *src, unsigned int src_len) 294 * Prepare the sg list(s) to be handed of to the host driver
295{ 295 */
296 unsigned int chunk;
297 char *dst_buf, *src_buf;
298 unsigned int dst_size, src_size;
299
300 dst_buf = NULL;
301 src_buf = NULL;
302 dst_size = 0;
303 src_size = 0;
304
305 while (src_len) {
306 BUG_ON(dst_len == 0);
307
308 if (dst_size == 0) {
309 dst_buf = sg_virt(dst);
310 dst_size = dst->length;
311 }
312
313 if (src_size == 0) {
314 src_buf = sg_virt(src);
315 src_size = src->length;
316 }
317
318 chunk = min(dst_size, src_size);
319
320 memcpy(dst_buf, src_buf, chunk);
321
322 dst_buf += chunk;
323 src_buf += chunk;
324 dst_size -= chunk;
325 src_size -= chunk;
326
327 if (dst_size == 0) {
328 dst++;
329 dst_len--;
330 }
331
332 if (src_size == 0) {
333 src++;
334 src_len--;
335 }
336 }
337}
338
339unsigned int mmc_queue_map_sg(struct mmc_queue *mq) 296unsigned int mmc_queue_map_sg(struct mmc_queue *mq)
340{ 297{
341 unsigned int sg_len; 298 unsigned int sg_len;
299 size_t buflen;
300 struct scatterlist *sg;
301 int i;
342 302
343 if (!mq->bounce_buf) 303 if (!mq->bounce_buf)
344 return blk_rq_map_sg(mq->queue, mq->req, mq->sg); 304 return blk_rq_map_sg(mq->queue, mq->req, mq->sg);
@@ -349,47 +309,52 @@ unsigned int mmc_queue_map_sg(struct mmc_queue *mq)
349 309
350 mq->bounce_sg_len = sg_len; 310 mq->bounce_sg_len = sg_len;
351 311
352 /* 312 buflen = 0;
353 * Shortcut in the event we only get a single entry. 313 for_each_sg(mq->bounce_sg, sg, sg_len, i)
354 */ 314 buflen += sg->length;
355 if (sg_len == 1) {
356 memcpy(mq->sg, mq->bounce_sg, sizeof(struct scatterlist));
357 return 1;
358 }
359 315
360 sg_init_one(mq->sg, mq->bounce_buf, 0); 316 sg_init_one(mq->sg, mq->bounce_buf, buflen);
361
362 while (sg_len) {
363 mq->sg[0].length += mq->bounce_sg[sg_len - 1].length;
364 sg_len--;
365 }
366 317
367 return 1; 318 return 1;
368} 319}
369 320
321/*
322 * If writing, bounce the data to the buffer before the request
323 * is sent to the host driver
324 */
370void mmc_queue_bounce_pre(struct mmc_queue *mq) 325void mmc_queue_bounce_pre(struct mmc_queue *mq)
371{ 326{
327 unsigned long flags;
328
372 if (!mq->bounce_buf) 329 if (!mq->bounce_buf)
373 return; 330 return;
374 331
375 if (mq->bounce_sg_len == 1)
376 return;
377 if (rq_data_dir(mq->req) != WRITE) 332 if (rq_data_dir(mq->req) != WRITE)
378 return; 333 return;
379 334
380 copy_sg(mq->sg, 1, mq->bounce_sg, mq->bounce_sg_len); 335 local_irq_save(flags);
336 sg_copy_to_buffer(mq->bounce_sg, mq->bounce_sg_len,
337 mq->bounce_buf, mq->sg[0].length);
338 local_irq_restore(flags);
381} 339}
382 340
341/*
342 * If reading, bounce the data from the buffer after the request
343 * has been handled by the host driver
344 */
383void mmc_queue_bounce_post(struct mmc_queue *mq) 345void mmc_queue_bounce_post(struct mmc_queue *mq)
384{ 346{
347 unsigned long flags;
348
385 if (!mq->bounce_buf) 349 if (!mq->bounce_buf)
386 return; 350 return;
387 351
388 if (mq->bounce_sg_len == 1)
389 return;
390 if (rq_data_dir(mq->req) != READ) 352 if (rq_data_dir(mq->req) != READ)
391 return; 353 return;
392 354
393 copy_sg(mq->bounce_sg, mq->bounce_sg_len, mq->sg, 1); 355 local_irq_save(flags);
356 sg_copy_from_buffer(mq->bounce_sg, mq->bounce_sg_len,
357 mq->bounce_buf, mq->sg[0].length);
358 local_irq_restore(flags);
394} 359}
395 360
diff --git a/drivers/mmc/host/au1xmmc.c b/drivers/mmc/host/au1xmmc.c
index 3f15eb204895..99b20917cc0f 100644
--- a/drivers/mmc/host/au1xmmc.c
+++ b/drivers/mmc/host/au1xmmc.c
@@ -1043,7 +1043,7 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)
1043 goto out6; 1043 goto out6;
1044 } 1044 }
1045 1045
1046 platform_set_drvdata(pdev, mmc); 1046 platform_set_drvdata(pdev, host);
1047 1047
1048 printk(KERN_INFO DRIVER_NAME ": MMC Controller %d set up at %8.8X" 1048 printk(KERN_INFO DRIVER_NAME ": MMC Controller %d set up at %8.8X"
1049 " (mode=%s)\n", pdev->id, host->iobase, 1049 " (mode=%s)\n", pdev->id, host->iobase,
@@ -1087,13 +1087,10 @@ out0:
1087 1087
1088static int __devexit au1xmmc_remove(struct platform_device *pdev) 1088static int __devexit au1xmmc_remove(struct platform_device *pdev)
1089{ 1089{
1090 struct mmc_host *mmc = platform_get_drvdata(pdev); 1090 struct au1xmmc_host *host = platform_get_drvdata(pdev);
1091 struct au1xmmc_host *host;
1092
1093 if (mmc) {
1094 host = mmc_priv(mmc);
1095 1091
1096 mmc_remove_host(mmc); 1092 if (host) {
1093 mmc_remove_host(host->mmc);
1097 1094
1098#ifdef CONFIG_LEDS_CLASS 1095#ifdef CONFIG_LEDS_CLASS
1099 if (host->platdata && host->platdata->led) 1096 if (host->platdata && host->platdata->led)
@@ -1101,8 +1098,8 @@ static int __devexit au1xmmc_remove(struct platform_device *pdev)
1101#endif 1098#endif
1102 1099
1103 if (host->platdata && host->platdata->cd_setup && 1100 if (host->platdata && host->platdata->cd_setup &&
1104 !(mmc->caps & MMC_CAP_NEEDS_POLL)) 1101 !(host->mmc->caps & MMC_CAP_NEEDS_POLL))
1105 host->platdata->cd_setup(mmc, 0); 1102 host->platdata->cd_setup(host->mmc, 0);
1106 1103
1107 au_writel(0, HOST_ENABLE(host)); 1104 au_writel(0, HOST_ENABLE(host));
1108 au_writel(0, HOST_CONFIG(host)); 1105 au_writel(0, HOST_CONFIG(host));
@@ -1122,16 +1119,49 @@ static int __devexit au1xmmc_remove(struct platform_device *pdev)
1122 release_resource(host->ioarea); 1119 release_resource(host->ioarea);
1123 kfree(host->ioarea); 1120 kfree(host->ioarea);
1124 1121
1125 mmc_free_host(mmc); 1122 mmc_free_host(host->mmc);
1123 platform_set_drvdata(pdev, NULL);
1126 } 1124 }
1127 return 0; 1125 return 0;
1128} 1126}
1129 1127
1128#ifdef CONFIG_PM
1129static int au1xmmc_suspend(struct platform_device *pdev, pm_message_t state)
1130{
1131 struct au1xmmc_host *host = platform_get_drvdata(pdev);
1132 int ret;
1133
1134 ret = mmc_suspend_host(host->mmc, state);
1135 if (ret)
1136 return ret;
1137
1138 au_writel(0, HOST_CONFIG2(host));
1139 au_writel(0, HOST_CONFIG(host));
1140 au_writel(0xffffffff, HOST_STATUS(host));
1141 au_writel(0, HOST_ENABLE(host));
1142 au_sync();
1143
1144 return 0;
1145}
1146
1147static int au1xmmc_resume(struct platform_device *pdev)
1148{
1149 struct au1xmmc_host *host = platform_get_drvdata(pdev);
1150
1151 au1xmmc_reset_controller(host);
1152
1153 return mmc_resume_host(host->mmc);
1154}
1155#else
1156#define au1xmmc_suspend NULL
1157#define au1xmmc_resume NULL
1158#endif
1159
1130static struct platform_driver au1xmmc_driver = { 1160static struct platform_driver au1xmmc_driver = {
1131 .probe = au1xmmc_probe, 1161 .probe = au1xmmc_probe,
1132 .remove = au1xmmc_remove, 1162 .remove = au1xmmc_remove,
1133 .suspend = NULL, 1163 .suspend = au1xmmc_suspend,
1134 .resume = NULL, 1164 .resume = au1xmmc_resume,
1135 .driver = { 1165 .driver = {
1136 .name = DRIVER_NAME, 1166 .name = DRIVER_NAME,
1137 .owner = THIS_MODULE, 1167 .owner = THIS_MODULE,
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
index d39f59738866..a8e18fe53077 100644
--- a/drivers/mmc/host/pxamci.c
+++ b/drivers/mmc/host/pxamci.c
@@ -177,7 +177,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
177 if (dalgn) 177 if (dalgn)
178 DALGN |= (1 << host->dma); 178 DALGN |= (1 << host->dma);
179 else 179 else
180 DALGN &= (1 << host->dma); 180 DALGN &= ~(1 << host->dma);
181 DDADR(host->dma) = host->sg_dma; 181 DDADR(host->dma) = host->sg_dma;
182 DCSR(host->dma) = DCSR_RUN; 182 DCSR(host->dma) = DCSR_RUN;
183} 183}
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c
index 6a1e4994b724..be550c26da68 100644
--- a/drivers/mmc/host/s3cmci.c
+++ b/drivers/mmc/host/s3cmci.c
@@ -1331,21 +1331,30 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440)
1331 return ret; 1331 return ret;
1332} 1332}
1333 1333
1334static void s3cmci_shutdown(struct platform_device *pdev)
1335{
1336 struct mmc_host *mmc = platform_get_drvdata(pdev);
1337 struct s3cmci_host *host = mmc_priv(mmc);
1338
1339 if (host->irq_cd >= 0)
1340 free_irq(host->irq_cd, host);
1341
1342 mmc_remove_host(mmc);
1343 clk_disable(host->clk);
1344}
1345
1334static int __devexit s3cmci_remove(struct platform_device *pdev) 1346static int __devexit s3cmci_remove(struct platform_device *pdev)
1335{ 1347{
1336 struct mmc_host *mmc = platform_get_drvdata(pdev); 1348 struct mmc_host *mmc = platform_get_drvdata(pdev);
1337 struct s3cmci_host *host = mmc_priv(mmc); 1349 struct s3cmci_host *host = mmc_priv(mmc);
1338 1350
1339 mmc_remove_host(mmc); 1351 s3cmci_shutdown(pdev);
1340 1352
1341 clk_disable(host->clk);
1342 clk_put(host->clk); 1353 clk_put(host->clk);
1343 1354
1344 tasklet_disable(&host->pio_tasklet); 1355 tasklet_disable(&host->pio_tasklet);
1345 s3c2410_dma_free(S3CMCI_DMA, &s3cmci_dma_client); 1356 s3c2410_dma_free(S3CMCI_DMA, &s3cmci_dma_client);
1346 1357
1347 if (host->irq_cd >= 0)
1348 free_irq(host->irq_cd, host);
1349 free_irq(host->irq, host); 1358 free_irq(host->irq, host);
1350 1359
1351 iounmap(host->base); 1360 iounmap(host->base);
@@ -1355,17 +1364,17 @@ static int __devexit s3cmci_remove(struct platform_device *pdev)
1355 return 0; 1364 return 0;
1356} 1365}
1357 1366
1358static int __devinit s3cmci_probe_2410(struct platform_device *dev) 1367static int __devinit s3cmci_2410_probe(struct platform_device *dev)
1359{ 1368{
1360 return s3cmci_probe(dev, 0); 1369 return s3cmci_probe(dev, 0);
1361} 1370}
1362 1371
1363static int __devinit s3cmci_probe_2412(struct platform_device *dev) 1372static int __devinit s3cmci_2412_probe(struct platform_device *dev)
1364{ 1373{
1365 return s3cmci_probe(dev, 1); 1374 return s3cmci_probe(dev, 1);
1366} 1375}
1367 1376
1368static int __devinit s3cmci_probe_2440(struct platform_device *dev) 1377static int __devinit s3cmci_2440_probe(struct platform_device *dev)
1369{ 1378{
1370 return s3cmci_probe(dev, 1); 1379 return s3cmci_probe(dev, 1);
1371} 1380}
@@ -1392,29 +1401,32 @@ static int s3cmci_resume(struct platform_device *dev)
1392#endif /* CONFIG_PM */ 1401#endif /* CONFIG_PM */
1393 1402
1394 1403
1395static struct platform_driver s3cmci_driver_2410 = { 1404static struct platform_driver s3cmci_2410_driver = {
1396 .driver.name = "s3c2410-sdi", 1405 .driver.name = "s3c2410-sdi",
1397 .driver.owner = THIS_MODULE, 1406 .driver.owner = THIS_MODULE,
1398 .probe = s3cmci_probe_2410, 1407 .probe = s3cmci_2410_probe,
1399 .remove = __devexit_p(s3cmci_remove), 1408 .remove = __devexit_p(s3cmci_remove),
1409 .shutdown = s3cmci_shutdown,
1400 .suspend = s3cmci_suspend, 1410 .suspend = s3cmci_suspend,
1401 .resume = s3cmci_resume, 1411 .resume = s3cmci_resume,
1402}; 1412};
1403 1413
1404static struct platform_driver s3cmci_driver_2412 = { 1414static struct platform_driver s3cmci_2412_driver = {
1405 .driver.name = "s3c2412-sdi", 1415 .driver.name = "s3c2412-sdi",
1406 .driver.owner = THIS_MODULE, 1416 .driver.owner = THIS_MODULE,
1407 .probe = s3cmci_probe_2412, 1417 .probe = s3cmci_2412_probe,
1408 .remove = __devexit_p(s3cmci_remove), 1418 .remove = __devexit_p(s3cmci_remove),
1419 .shutdown = s3cmci_shutdown,
1409 .suspend = s3cmci_suspend, 1420 .suspend = s3cmci_suspend,
1410 .resume = s3cmci_resume, 1421 .resume = s3cmci_resume,
1411}; 1422};
1412 1423
1413static struct platform_driver s3cmci_driver_2440 = { 1424static struct platform_driver s3cmci_2440_driver = {
1414 .driver.name = "s3c2440-sdi", 1425 .driver.name = "s3c2440-sdi",
1415 .driver.owner = THIS_MODULE, 1426 .driver.owner = THIS_MODULE,
1416 .probe = s3cmci_probe_2440, 1427 .probe = s3cmci_2440_probe,
1417 .remove = __devexit_p(s3cmci_remove), 1428 .remove = __devexit_p(s3cmci_remove),
1429 .shutdown = s3cmci_shutdown,
1418 .suspend = s3cmci_suspend, 1430 .suspend = s3cmci_suspend,
1419 .resume = s3cmci_resume, 1431 .resume = s3cmci_resume,
1420}; 1432};
@@ -1422,17 +1434,17 @@ static struct platform_driver s3cmci_driver_2440 = {
1422 1434
1423static int __init s3cmci_init(void) 1435static int __init s3cmci_init(void)
1424{ 1436{
1425 platform_driver_register(&s3cmci_driver_2410); 1437 platform_driver_register(&s3cmci_2410_driver);
1426 platform_driver_register(&s3cmci_driver_2412); 1438 platform_driver_register(&s3cmci_2412_driver);
1427 platform_driver_register(&s3cmci_driver_2440); 1439 platform_driver_register(&s3cmci_2440_driver);
1428 return 0; 1440 return 0;
1429} 1441}
1430 1442
1431static void __exit s3cmci_exit(void) 1443static void __exit s3cmci_exit(void)
1432{ 1444{
1433 platform_driver_unregister(&s3cmci_driver_2410); 1445 platform_driver_unregister(&s3cmci_2410_driver);
1434 platform_driver_unregister(&s3cmci_driver_2412); 1446 platform_driver_unregister(&s3cmci_2412_driver);
1435 platform_driver_unregister(&s3cmci_driver_2440); 1447 platform_driver_unregister(&s3cmci_2440_driver);
1436} 1448}
1437 1449
1438module_init(s3cmci_init); 1450module_init(s3cmci_init);
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 17701c3da733..c3a5db72ddd7 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -173,119 +173,95 @@ static void sdhci_led_control(struct led_classdev *led,
173 * * 173 * *
174\*****************************************************************************/ 174\*****************************************************************************/
175 175
176static inline char* sdhci_sg_to_buffer(struct sdhci_host* host)
177{
178 return sg_virt(host->cur_sg);
179}
180
181static inline int sdhci_next_sg(struct sdhci_host* host)
182{
183 /*
184 * Skip to next SG entry.
185 */
186 host->cur_sg++;
187 host->num_sg--;
188
189 /*
190 * Any entries left?
191 */
192 if (host->num_sg > 0) {
193 host->offset = 0;
194 host->remain = host->cur_sg->length;
195 }
196
197 return host->num_sg;
198}
199
200static void sdhci_read_block_pio(struct sdhci_host *host) 176static void sdhci_read_block_pio(struct sdhci_host *host)
201{ 177{
202 int blksize, chunk_remain; 178 unsigned long flags;
203 u32 data; 179 size_t blksize, len, chunk;
204 char *buffer; 180 u32 scratch;
205 int size; 181 u8 *buf;
206 182
207 DBG("PIO reading\n"); 183 DBG("PIO reading\n");
208 184
209 blksize = host->data->blksz; 185 blksize = host->data->blksz;
210 chunk_remain = 0; 186 chunk = 0;
211 data = 0;
212 187
213 buffer = sdhci_sg_to_buffer(host) + host->offset; 188 local_irq_save(flags);
214 189
215 while (blksize) { 190 while (blksize) {
216 if (chunk_remain == 0) { 191 if (!sg_miter_next(&host->sg_miter))
217 data = readl(host->ioaddr + SDHCI_BUFFER); 192 BUG();
218 chunk_remain = min(blksize, 4);
219 }
220 193
221 size = min(host->remain, chunk_remain); 194 len = min(host->sg_miter.length, blksize);
222 195
223 chunk_remain -= size; 196 blksize -= len;
224 blksize -= size; 197 host->sg_miter.consumed = len;
225 host->offset += size;
226 host->remain -= size;
227 198
228 while (size) { 199 buf = host->sg_miter.addr;
229 *buffer = data & 0xFF;
230 buffer++;
231 data >>= 8;
232 size--;
233 }
234 200
235 if (host->remain == 0) { 201 while (len) {
236 if (sdhci_next_sg(host) == 0) { 202 if (chunk == 0) {
237 BUG_ON(blksize != 0); 203 scratch = readl(host->ioaddr + SDHCI_BUFFER);
238 return; 204 chunk = 4;
239 } 205 }
240 buffer = sdhci_sg_to_buffer(host); 206
207 *buf = scratch & 0xFF;
208
209 buf++;
210 scratch >>= 8;
211 chunk--;
212 len--;
241 } 213 }
242 } 214 }
215
216 sg_miter_stop(&host->sg_miter);
217
218 local_irq_restore(flags);
243} 219}
244 220
245static void sdhci_write_block_pio(struct sdhci_host *host) 221static void sdhci_write_block_pio(struct sdhci_host *host)
246{ 222{
247 int blksize, chunk_remain; 223 unsigned long flags;
248 u32 data; 224 size_t blksize, len, chunk;
249 char *buffer; 225 u32 scratch;
250 int bytes, size; 226 u8 *buf;
251 227
252 DBG("PIO writing\n"); 228 DBG("PIO writing\n");
253 229
254 blksize = host->data->blksz; 230 blksize = host->data->blksz;
255 chunk_remain = 4; 231 chunk = 0;
256 data = 0; 232 scratch = 0;
257 233
258 bytes = 0; 234 local_irq_save(flags);
259 buffer = sdhci_sg_to_buffer(host) + host->offset;
260 235
261 while (blksize) { 236 while (blksize) {
262 size = min(host->remain, chunk_remain); 237 if (!sg_miter_next(&host->sg_miter))
263 238 BUG();
264 chunk_remain -= size;
265 blksize -= size;
266 host->offset += size;
267 host->remain -= size;
268
269 while (size) {
270 data >>= 8;
271 data |= (u32)*buffer << 24;
272 buffer++;
273 size--;
274 }
275 239
276 if (chunk_remain == 0) { 240 len = min(host->sg_miter.length, blksize);
277 writel(data, host->ioaddr + SDHCI_BUFFER); 241
278 chunk_remain = min(blksize, 4); 242 blksize -= len;
279 } 243 host->sg_miter.consumed = len;
244
245 buf = host->sg_miter.addr;
280 246
281 if (host->remain == 0) { 247 while (len) {
282 if (sdhci_next_sg(host) == 0) { 248 scratch |= (u32)*buf << (chunk * 8);
283 BUG_ON(blksize != 0); 249
284 return; 250 buf++;
251 chunk++;
252 len--;
253
254 if ((chunk == 4) || ((len == 0) && (blksize == 0))) {
255 writel(scratch, host->ioaddr + SDHCI_BUFFER);
256 chunk = 0;
257 scratch = 0;
285 } 258 }
286 buffer = sdhci_sg_to_buffer(host);
287 } 259 }
288 } 260 }
261
262 sg_miter_stop(&host->sg_miter);
263
264 local_irq_restore(flags);
289} 265}
290 266
291static void sdhci_transfer_pio(struct sdhci_host *host) 267static void sdhci_transfer_pio(struct sdhci_host *host)
@@ -294,7 +270,7 @@ static void sdhci_transfer_pio(struct sdhci_host *host)
294 270
295 BUG_ON(!host->data); 271 BUG_ON(!host->data);
296 272
297 if (host->num_sg == 0) 273 if (host->blocks == 0)
298 return; 274 return;
299 275
300 if (host->data->flags & MMC_DATA_READ) 276 if (host->data->flags & MMC_DATA_READ)
@@ -308,7 +284,8 @@ static void sdhci_transfer_pio(struct sdhci_host *host)
308 else 284 else
309 sdhci_write_block_pio(host); 285 sdhci_write_block_pio(host);
310 286
311 if (host->num_sg == 0) 287 host->blocks--;
288 if (host->blocks == 0)
312 break; 289 break;
313 } 290 }
314 291
@@ -389,6 +366,7 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
389 if (offset) { 366 if (offset) {
390 if (data->flags & MMC_DATA_WRITE) { 367 if (data->flags & MMC_DATA_WRITE) {
391 buffer = sdhci_kmap_atomic(sg, &flags); 368 buffer = sdhci_kmap_atomic(sg, &flags);
369 WARN_ON(((long)buffer & PAGE_MASK) > (PAGE_SIZE - 3));
392 memcpy(align, buffer, offset); 370 memcpy(align, buffer, offset);
393 sdhci_kunmap_atomic(buffer, &flags); 371 sdhci_kunmap_atomic(buffer, &flags);
394 } 372 }
@@ -510,6 +488,7 @@ static void sdhci_adma_table_post(struct sdhci_host *host,
510 size = 4 - (sg_dma_address(sg) & 0x3); 488 size = 4 - (sg_dma_address(sg) & 0x3);
511 489
512 buffer = sdhci_kmap_atomic(sg, &flags); 490 buffer = sdhci_kmap_atomic(sg, &flags);
491 WARN_ON(((long)buffer & PAGE_MASK) > (PAGE_SIZE - 3));
513 memcpy(buffer, align, size); 492 memcpy(buffer, align, size);
514 sdhci_kunmap_atomic(buffer, &flags); 493 sdhci_kunmap_atomic(buffer, &flags);
515 494
@@ -687,7 +666,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
687 WARN_ON(1); 666 WARN_ON(1);
688 host->flags &= ~SDHCI_USE_DMA; 667 host->flags &= ~SDHCI_USE_DMA;
689 } else { 668 } else {
690 WARN_ON(count != 1); 669 WARN_ON(sg_cnt != 1);
691 writel(sg_dma_address(data->sg), 670 writel(sg_dma_address(data->sg),
692 host->ioaddr + SDHCI_DMA_ADDRESS); 671 host->ioaddr + SDHCI_DMA_ADDRESS);
693 } 672 }
@@ -711,11 +690,9 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
711 } 690 }
712 691
713 if (!(host->flags & SDHCI_REQ_USE_DMA)) { 692 if (!(host->flags & SDHCI_REQ_USE_DMA)) {
714 host->cur_sg = data->sg; 693 sg_miter_start(&host->sg_miter,
715 host->num_sg = data->sg_len; 694 data->sg, data->sg_len, SG_MITER_ATOMIC);
716 695 host->blocks = data->blocks;
717 host->offset = 0;
718 host->remain = host->cur_sg->length;
719 } 696 }
720 697
721 /* We do not handle DMA boundaries, so set it to max (512 KiB) */ 698 /* We do not handle DMA boundaries, so set it to max (512 KiB) */
@@ -1581,9 +1558,15 @@ int sdhci_add_host(struct sdhci_host *host)
1581 } 1558 }
1582 } 1559 }
1583 1560
1584 /* XXX: Hack to get MMC layer to avoid highmem */ 1561 /*
1585 if (!(host->flags & SDHCI_USE_DMA)) 1562 * If we use DMA, then it's up to the caller to set the DMA
1586 mmc_dev(host->mmc)->dma_mask = NULL; 1563 * mask, but PIO does not need the hw shim so we set a new
1564 * mask here in that case.
1565 */
1566 if (!(host->flags & SDHCI_USE_DMA)) {
1567 host->dma_mask = DMA_BIT_MASK(64);
1568 mmc_dev(host->mmc)->dma_mask = &host->dma_mask;
1569 }
1587 1570
1588 host->max_clk = 1571 host->max_clk =
1589 (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; 1572 (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 5bb355281765..a06bf8b89343 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -212,6 +212,7 @@ struct sdhci_host {
212 212
213 /* Internal data */ 213 /* Internal data */
214 struct mmc_host *mmc; /* MMC structure */ 214 struct mmc_host *mmc; /* MMC structure */
215 u64 dma_mask; /* custom DMA mask */
215 216
216#ifdef CONFIG_LEDS_CLASS 217#ifdef CONFIG_LEDS_CLASS
217 struct led_classdev led; /* LED control */ 218 struct led_classdev led; /* LED control */
@@ -238,10 +239,8 @@ struct sdhci_host {
238 struct mmc_data *data; /* Current data request */ 239 struct mmc_data *data; /* Current data request */
239 unsigned int data_early:1; /* Data finished before cmd */ 240 unsigned int data_early:1; /* Data finished before cmd */
240 241
241 struct scatterlist *cur_sg; /* We're working on this */ 242 struct sg_mapping_iter sg_miter; /* SG state for PIO */
242 int num_sg; /* Entries left */ 243 unsigned int blocks; /* remaining PIO blocks */
243 int offset; /* Offset into current sg */
244 int remain; /* Bytes left in current */
245 244
246 int sg_count; /* Mapped sg entries */ 245 int sg_count; /* Mapped sg entries */
247 246
diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
index 519d942e7940..7b72a1b36115 100644
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
@@ -241,6 +241,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
241{ 241{
242 struct block_device *bdev; 242 struct block_device *bdev;
243 struct block2mtd_dev *dev; 243 struct block2mtd_dev *dev;
244 char *name;
244 245
245 if (!devname) 246 if (!devname)
246 return NULL; 247 return NULL;
@@ -279,12 +280,13 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
279 280
280 /* Setup the MTD structure */ 281 /* Setup the MTD structure */
281 /* make the name contain the block device in */ 282 /* make the name contain the block device in */
282 dev->mtd.name = kmalloc(sizeof("block2mtd: ") + strlen(devname), 283 name = kmalloc(sizeof("block2mtd: ") + strlen(devname) + 1,
283 GFP_KERNEL); 284 GFP_KERNEL);
284 if (!dev->mtd.name) 285 if (!name)
285 goto devinit_err; 286 goto devinit_err;
286 287
287 sprintf(dev->mtd.name, "block2mtd: %s", devname); 288 sprintf(name, "block2mtd: %s", devname);
289 dev->mtd.name = name;
288 290
289 dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK; 291 dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
290 dev->mtd.erasesize = erase_size; 292 dev->mtd.erasesize = erase_size;
diff --git a/drivers/mtd/maps/uclinux.c b/drivers/mtd/maps/uclinux.c
index c42f4b83f686..3fcf92130aa4 100644
--- a/drivers/mtd/maps/uclinux.c
+++ b/drivers/mtd/maps/uclinux.c
@@ -15,6 +15,7 @@
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/fs.h> 17#include <linux/fs.h>
18#include <linux/mm.h>
18#include <linux/major.h> 19#include <linux/major.h>
19#include <linux/mtd/mtd.h> 20#include <linux/mtd/mtd.h>
20#include <linux/mtd/map.h> 21#include <linux/mtd/map.h>
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
index 129d429cd2da..aef9f4b687c9 100644
--- a/drivers/mtd/mtdchar.c
+++ b/drivers/mtd/mtdchar.c
@@ -28,10 +28,13 @@ static void mtd_notify_add(struct mtd_info* mtd)
28 if (!mtd) 28 if (!mtd)
29 return; 29 return;
30 30
31 device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2), "mtd%d", mtd->index); 31 device_create_drvdata(mtd_class, NULL,
32 MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
33 NULL, "mtd%d", mtd->index);
32 34
33 device_create(mtd_class, NULL, 35 device_create_drvdata(mtd_class, NULL,
34 MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1), "mtd%dro", mtd->index); 36 MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
37 NULL, "mtd%dro", mtd->index);
35} 38}
36 39
37static void mtd_notify_remove(struct mtd_info* mtd) 40static void mtd_notify_remove(struct mtd_info* mtd)
diff --git a/drivers/mtd/nand/cmx270_nand.c b/drivers/mtd/nand/cmx270_nand.c
index cb663ef245d5..fc8529bedfdf 100644
--- a/drivers/mtd/nand/cmx270_nand.c
+++ b/drivers/mtd/nand/cmx270_nand.c
@@ -20,9 +20,11 @@
20 20
21#include <linux/mtd/nand.h> 21#include <linux/mtd/nand.h>
22#include <linux/mtd/partitions.h> 22#include <linux/mtd/partitions.h>
23#include <linux/gpio.h>
23 24
24#include <asm/io.h> 25#include <asm/io.h>
25#include <asm/irq.h> 26#include <asm/irq.h>
27#include <asm/mach-types.h>
26 28
27#include <asm/arch/hardware.h> 29#include <asm/arch/hardware.h>
28#include <asm/arch/pxa-regs.h> 30#include <asm/arch/pxa-regs.h>
@@ -30,20 +32,6 @@
30#define GPIO_NAND_CS (11) 32#define GPIO_NAND_CS (11)
31#define GPIO_NAND_RB (89) 33#define GPIO_NAND_RB (89)
32 34
33/* This macro needed to ensure in-order operation of GPIO and local
34 * bus. Without both asm command and dummy uncached read there're
35 * states when NAND access is broken. I've looked for such macro(s) in
36 * include/asm-arm but found nothing approptiate.
37 * dmac_clean_range is close, but is makes cache invalidation
38 * unnecessary here and it cannot be used in module
39 */
40#define DRAIN_WB() \
41 do { \
42 unsigned char dummy; \
43 asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); \
44 dummy=*((unsigned char*)UNCACHED_ADDR); \
45 } while(0)
46
47/* MTD structure for CM-X270 board */ 35/* MTD structure for CM-X270 board */
48static struct mtd_info *cmx270_nand_mtd; 36static struct mtd_info *cmx270_nand_mtd;
49 37
@@ -103,14 +91,14 @@ static int cmx270_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
103 91
104static inline void nand_cs_on(void) 92static inline void nand_cs_on(void)
105{ 93{
106 GPCR(GPIO_NAND_CS) = GPIO_bit(GPIO_NAND_CS); 94 gpio_set_value(GPIO_NAND_CS, 0);
107} 95}
108 96
109static void nand_cs_off(void) 97static void nand_cs_off(void)
110{ 98{
111 DRAIN_WB(); 99 dsb();
112 100
113 GPSR(GPIO_NAND_CS) = GPIO_bit(GPIO_NAND_CS); 101 gpio_set_value(GPIO_NAND_CS, 1);
114} 102}
115 103
116/* 104/*
@@ -122,7 +110,7 @@ static void cmx270_hwcontrol(struct mtd_info *mtd, int dat,
122 struct nand_chip* this = mtd->priv; 110 struct nand_chip* this = mtd->priv;
123 unsigned int nandaddr = (unsigned int)this->IO_ADDR_W; 111 unsigned int nandaddr = (unsigned int)this->IO_ADDR_W;
124 112
125 DRAIN_WB(); 113 dsb();
126 114
127 if (ctrl & NAND_CTRL_CHANGE) { 115 if (ctrl & NAND_CTRL_CHANGE) {
128 if ( ctrl & NAND_ALE ) 116 if ( ctrl & NAND_ALE )
@@ -139,12 +127,12 @@ static void cmx270_hwcontrol(struct mtd_info *mtd, int dat,
139 nand_cs_off(); 127 nand_cs_off();
140 } 128 }
141 129
142 DRAIN_WB(); 130 dsb();
143 this->IO_ADDR_W = (void __iomem*)nandaddr; 131 this->IO_ADDR_W = (void __iomem*)nandaddr;
144 if (dat != NAND_CMD_NONE) 132 if (dat != NAND_CMD_NONE)
145 writel((dat << 16), this->IO_ADDR_W); 133 writel((dat << 16), this->IO_ADDR_W);
146 134
147 DRAIN_WB(); 135 dsb();
148} 136}
149 137
150/* 138/*
@@ -152,9 +140,9 @@ static void cmx270_hwcontrol(struct mtd_info *mtd, int dat,
152 */ 140 */
153static int cmx270_device_ready(struct mtd_info *mtd) 141static int cmx270_device_ready(struct mtd_info *mtd)
154{ 142{
155 DRAIN_WB(); 143 dsb();
156 144
157 return (GPLR(GPIO_NAND_RB) & GPIO_bit(GPIO_NAND_RB)); 145 return (gpio_get_value(GPIO_NAND_RB));
158} 146}
159 147
160/* 148/*
@@ -168,20 +156,40 @@ static int cmx270_init(void)
168 int mtd_parts_nb = 0; 156 int mtd_parts_nb = 0;
169 int ret; 157 int ret;
170 158
159 if (!machine_is_armcore())
160 return -ENODEV;
161
162 ret = gpio_request(GPIO_NAND_CS, "NAND CS");
163 if (ret) {
164 pr_warning("CM-X270: failed to request NAND CS gpio\n");
165 return ret;
166 }
167
168 gpio_direction_output(GPIO_NAND_CS, 1);
169
170 ret = gpio_request(GPIO_NAND_RB, "NAND R/B");
171 if (ret) {
172 pr_warning("CM-X270: failed to request NAND R/B gpio\n");
173 goto err_gpio_request;
174 }
175
176 gpio_direction_input(GPIO_NAND_RB);
177
171 /* Allocate memory for MTD device structure and private data */ 178 /* Allocate memory for MTD device structure and private data */
172 cmx270_nand_mtd = kzalloc(sizeof(struct mtd_info) + 179 cmx270_nand_mtd = kzalloc(sizeof(struct mtd_info) +
173 sizeof(struct nand_chip), 180 sizeof(struct nand_chip),
174 GFP_KERNEL); 181 GFP_KERNEL);
175 if (!cmx270_nand_mtd) { 182 if (!cmx270_nand_mtd) {
176 printk("Unable to allocate CM-X270 NAND MTD device structure.\n"); 183 pr_debug("Unable to allocate CM-X270 NAND MTD device structure.\n");
177 return -ENOMEM; 184 ret = -ENOMEM;
185 goto err_kzalloc;
178 } 186 }
179 187
180 cmx270_nand_io = ioremap(PXA_CS1_PHYS, 12); 188 cmx270_nand_io = ioremap(PXA_CS1_PHYS, 12);
181 if (!cmx270_nand_io) { 189 if (!cmx270_nand_io) {
182 printk("Unable to ioremap NAND device\n"); 190 pr_debug("Unable to ioremap NAND device\n");
183 ret = -EINVAL; 191 ret = -EINVAL;
184 goto err1; 192 goto err_ioremap;
185 } 193 }
186 194
187 /* Get pointer to private data */ 195 /* Get pointer to private data */
@@ -209,9 +217,9 @@ static int cmx270_init(void)
209 217
210 /* Scan to find existence of the device */ 218 /* Scan to find existence of the device */
211 if (nand_scan (cmx270_nand_mtd, 1)) { 219 if (nand_scan (cmx270_nand_mtd, 1)) {
212 printk(KERN_NOTICE "No NAND device\n"); 220 pr_notice("No NAND device\n");
213 ret = -ENXIO; 221 ret = -ENXIO;
214 goto err2; 222 goto err_scan;
215 } 223 }
216 224
217#ifdef CONFIG_MTD_CMDLINE_PARTS 225#ifdef CONFIG_MTD_CMDLINE_PARTS
@@ -229,18 +237,22 @@ static int cmx270_init(void)
229 } 237 }
230 238
231 /* Register the partitions */ 239 /* Register the partitions */
232 printk(KERN_NOTICE "Using %s partition definition\n", part_type); 240 pr_notice("Using %s partition definition\n", part_type);
233 ret = add_mtd_partitions(cmx270_nand_mtd, mtd_parts, mtd_parts_nb); 241 ret = add_mtd_partitions(cmx270_nand_mtd, mtd_parts, mtd_parts_nb);
234 if (ret) 242 if (ret)
235 goto err2; 243 goto err_scan;
236 244
237 /* Return happy */ 245 /* Return happy */
238 return 0; 246 return 0;
239 247
240err2: 248err_scan:
241 iounmap(cmx270_nand_io); 249 iounmap(cmx270_nand_io);
242err1: 250err_ioremap:
243 kfree(cmx270_nand_mtd); 251 kfree(cmx270_nand_mtd);
252err_kzalloc:
253 gpio_free(GPIO_NAND_RB);
254err_gpio_request:
255 gpio_free(GPIO_NAND_CS);
244 256
245 return ret; 257 return ret;
246 258
@@ -255,6 +267,9 @@ static void cmx270_cleanup(void)
255 /* Release resources, unregister device */ 267 /* Release resources, unregister device */
256 nand_release(cmx270_nand_mtd); 268 nand_release(cmx270_nand_mtd);
257 269
270 gpio_free(GPIO_NAND_RB);
271 gpio_free(GPIO_NAND_CS);
272
258 iounmap(cmx270_nand_io); 273 iounmap(cmx270_nand_io);
259 274
260 /* Free the MTD device structure */ 275 /* Free the MTD device structure */
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c
index aabad8ce7458..8db4e6b89482 100644
--- a/drivers/net/3c59x.c
+++ b/drivers/net/3c59x.c
@@ -1010,7 +1010,7 @@ static int __devinit vortex_probe1(struct device *gendev,
1010 static int printed_version; 1010 static int printed_version;
1011 int retval, print_info; 1011 int retval, print_info;
1012 struct vortex_chip_info * const vci = &vortex_info_tbl[chip_idx]; 1012 struct vortex_chip_info * const vci = &vortex_info_tbl[chip_idx];
1013 char *print_name = "3c59x"; 1013 const char *print_name = "3c59x";
1014 struct pci_dev *pdev = NULL; 1014 struct pci_dev *pdev = NULL;
1015 struct eisa_device *edev = NULL; 1015 struct eisa_device *edev = NULL;
1016 DECLARE_MAC_BUF(mac); 1016 DECLARE_MAC_BUF(mac);
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c
index 75317a14ad1c..8a5b0d293f75 100644
--- a/drivers/net/8139too.c
+++ b/drivers/net/8139too.c
@@ -98,7 +98,6 @@
98#include <linux/compiler.h> 98#include <linux/compiler.h>
99#include <linux/pci.h> 99#include <linux/pci.h>
100#include <linux/init.h> 100#include <linux/init.h>
101#include <linux/ioport.h>
102#include <linux/netdevice.h> 101#include <linux/netdevice.h>
103#include <linux/etherdevice.h> 102#include <linux/etherdevice.h>
104#include <linux/rtnetlink.h> 103#include <linux/rtnetlink.h>
@@ -120,11 +119,6 @@
120 NETIF_MSG_LINK) 119 NETIF_MSG_LINK)
121 120
122 121
123/* enable PIO instead of MMIO, if CONFIG_8139TOO_PIO is selected */
124#ifdef CONFIG_8139TOO_PIO
125#define USE_IO_OPS 1
126#endif
127
128/* define to 1, 2 or 3 to enable copious debugging info */ 122/* define to 1, 2 or 3 to enable copious debugging info */
129#define RTL8139_DEBUG 0 123#define RTL8139_DEBUG 0
130 124
@@ -156,6 +150,13 @@
156static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; 150static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
157static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; 151static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
158 152
153/* Whether to use MMIO or PIO. Default to MMIO. */
154#ifdef CONFIG_8139TOO_PIO
155static int use_io = 1;
156#else
157static int use_io = 0;
158#endif
159
159/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). 160/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
160 The RTL chips use a 64 element hash table based on the Ethernet CRC. */ 161 The RTL chips use a 64 element hash table based on the Ethernet CRC. */
161static int multicast_filter_limit = 32; 162static int multicast_filter_limit = 32;
@@ -614,6 +615,8 @@ MODULE_DESCRIPTION ("RealTek RTL-8139 Fast Ethernet driver");
614MODULE_LICENSE("GPL"); 615MODULE_LICENSE("GPL");
615MODULE_VERSION(DRV_VERSION); 616MODULE_VERSION(DRV_VERSION);
616 617
618module_param(use_io, int, 0);
619MODULE_PARM_DESC(use_io, "Force use of I/O access mode. 0=MMIO 1=PIO");
617module_param(multicast_filter_limit, int, 0); 620module_param(multicast_filter_limit, int, 0);
618module_param_array(media, int, NULL, 0); 621module_param_array(media, int, NULL, 0);
619module_param_array(full_duplex, int, NULL, 0); 622module_param_array(full_duplex, int, NULL, 0);
@@ -709,13 +712,8 @@ static void __rtl8139_cleanup_dev (struct net_device *dev)
709 assert (tp->pci_dev != NULL); 712 assert (tp->pci_dev != NULL);
710 pdev = tp->pci_dev; 713 pdev = tp->pci_dev;
711 714
712#ifdef USE_IO_OPS
713 if (tp->mmio_addr)
714 ioport_unmap (tp->mmio_addr);
715#else
716 if (tp->mmio_addr) 715 if (tp->mmio_addr)
717 pci_iounmap (pdev, tp->mmio_addr); 716 pci_iounmap (pdev, tp->mmio_addr);
718#endif /* USE_IO_OPS */
719 717
720 /* it's ok to call this even if we have no regions to free */ 718 /* it's ok to call this even if we have no regions to free */
721 pci_release_regions (pdev); 719 pci_release_regions (pdev);
@@ -790,32 +788,33 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev,
790 DPRINTK("PIO region size == 0x%02X\n", pio_len); 788 DPRINTK("PIO region size == 0x%02X\n", pio_len);
791 DPRINTK("MMIO region size == 0x%02lX\n", mmio_len); 789 DPRINTK("MMIO region size == 0x%02lX\n", mmio_len);
792 790
793#ifdef USE_IO_OPS 791retry:
794 /* make sure PCI base addr 0 is PIO */ 792 if (use_io) {
795 if (!(pio_flags & IORESOURCE_IO)) { 793 /* make sure PCI base addr 0 is PIO */
796 dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); 794 if (!(pio_flags & IORESOURCE_IO)) {
797 rc = -ENODEV; 795 dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n");
798 goto err_out; 796 rc = -ENODEV;
799 } 797 goto err_out;
800 /* check for weird/broken PCI region reporting */ 798 }
801 if (pio_len < RTL_MIN_IO_SIZE) { 799 /* check for weird/broken PCI region reporting */
802 dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n"); 800 if (pio_len < RTL_MIN_IO_SIZE) {
803 rc = -ENODEV; 801 dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n");
804 goto err_out; 802 rc = -ENODEV;
805 } 803 goto err_out;
806#else 804 }
807 /* make sure PCI base addr 1 is MMIO */ 805 } else {
808 if (!(mmio_flags & IORESOURCE_MEM)) { 806 /* make sure PCI base addr 1 is MMIO */
809 dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); 807 if (!(mmio_flags & IORESOURCE_MEM)) {
810 rc = -ENODEV; 808 dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n");
811 goto err_out; 809 rc = -ENODEV;
812 } 810 goto err_out;
813 if (mmio_len < RTL_MIN_IO_SIZE) { 811 }
814 dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n"); 812 if (mmio_len < RTL_MIN_IO_SIZE) {
815 rc = -ENODEV; 813 dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n");
816 goto err_out; 814 rc = -ENODEV;
815 goto err_out;
816 }
817 } 817 }
818#endif
819 818
820 rc = pci_request_regions (pdev, DRV_NAME); 819 rc = pci_request_regions (pdev, DRV_NAME);
821 if (rc) 820 if (rc)
@@ -825,28 +824,28 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev,
825 /* enable PCI bus-mastering */ 824 /* enable PCI bus-mastering */
826 pci_set_master (pdev); 825 pci_set_master (pdev);
827 826
828#ifdef USE_IO_OPS 827 if (use_io) {
829 ioaddr = ioport_map(pio_start, pio_len); 828 ioaddr = pci_iomap(pdev, 0, 0);
830 if (!ioaddr) { 829 if (!ioaddr) {
831 dev_err(&pdev->dev, "cannot map PIO, aborting\n"); 830 dev_err(&pdev->dev, "cannot map PIO, aborting\n");
832 rc = -EIO; 831 rc = -EIO;
833 goto err_out; 832 goto err_out;
834 } 833 }
835 dev->base_addr = pio_start; 834 dev->base_addr = pio_start;
836 tp->mmio_addr = ioaddr; 835 tp->regs_len = pio_len;
837 tp->regs_len = pio_len; 836 } else {
838#else 837 /* ioremap MMIO region */
839 /* ioremap MMIO region */ 838 ioaddr = pci_iomap(pdev, 1, 0);
840 ioaddr = pci_iomap(pdev, 1, 0); 839 if (ioaddr == NULL) {
841 if (ioaddr == NULL) { 840 dev_err(&pdev->dev, "cannot remap MMIO, trying PIO\n");
842 dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 841 pci_release_regions(pdev);
843 rc = -EIO; 842 use_io = 1;
844 goto err_out; 843 goto retry;
844 }
845 dev->base_addr = (long) ioaddr;
846 tp->regs_len = mmio_len;
845 } 847 }
846 dev->base_addr = (long) ioaddr;
847 tp->mmio_addr = ioaddr; 848 tp->mmio_addr = ioaddr;
848 tp->regs_len = mmio_len;
849#endif /* USE_IO_OPS */
850 849
851 /* Bring old chips out of low-power mode. */ 850 /* Bring old chips out of low-power mode. */
852 RTL_W8 (HltClk, 'R'); 851 RTL_W8 (HltClk, 'R');
@@ -952,6 +951,14 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
952 "Use the \"8139cp\" driver for improved performance and stability.\n"); 951 "Use the \"8139cp\" driver for improved performance and stability.\n");
953 } 952 }
954 953
954 if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
955 pdev->device == PCI_DEVICE_ID_REALTEK_8139 &&
956 pdev->subsystem_vendor == PCI_VENDOR_ID_ATHEROS &&
957 pdev->subsystem_device == PCI_DEVICE_ID_REALTEK_8139) {
958 printk(KERN_INFO "8139too: OQO Model 2 detected. Forcing PIO\n");
959 use_io = 1;
960 }
961
955 i = rtl8139_init_board (pdev, &dev); 962 i = rtl8139_init_board (pdev, &dev);
956 if (i < 0) 963 if (i < 0)
957 return i; 964 return i;
@@ -2381,20 +2388,24 @@ static void rtl8139_set_msglevel(struct net_device *dev, u32 datum)
2381 np->msg_enable = datum; 2388 np->msg_enable = datum;
2382} 2389}
2383 2390
2384/* TODO: we are too slack to do reg dumping for pio, for now */
2385#ifdef CONFIG_8139TOO_PIO
2386#define rtl8139_get_regs_len NULL
2387#define rtl8139_get_regs NULL
2388#else
2389static int rtl8139_get_regs_len(struct net_device *dev) 2391static int rtl8139_get_regs_len(struct net_device *dev)
2390{ 2392{
2391 struct rtl8139_private *np = netdev_priv(dev); 2393 struct rtl8139_private *np;
2394 /* TODO: we are too slack to do reg dumping for pio, for now */
2395 if (use_io)
2396 return 0;
2397 np = netdev_priv(dev);
2392 return np->regs_len; 2398 return np->regs_len;
2393} 2399}
2394 2400
2395static void rtl8139_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *regbuf) 2401static void rtl8139_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *regbuf)
2396{ 2402{
2397 struct rtl8139_private *np = netdev_priv(dev); 2403 struct rtl8139_private *np;
2404
2405 /* TODO: we are too slack to do reg dumping for pio, for now */
2406 if (use_io)
2407 return;
2408 np = netdev_priv(dev);
2398 2409
2399 regs->version = RTL_REGS_VER; 2410 regs->version = RTL_REGS_VER;
2400 2411
@@ -2402,7 +2413,6 @@ static void rtl8139_get_regs(struct net_device *dev, struct ethtool_regs *regs,
2402 memcpy_fromio(regbuf, np->mmio_addr, regs->len); 2413 memcpy_fromio(regbuf, np->mmio_addr, regs->len);
2403 spin_unlock_irq(&np->lock); 2414 spin_unlock_irq(&np->lock);
2404} 2415}
2405#endif /* CONFIG_8139TOO_MMIO */
2406 2416
2407static int rtl8139_get_sset_count(struct net_device *dev, int sset) 2417static int rtl8139_get_sset_count(struct net_device *dev, int sset)
2408{ 2418{
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 3e5e64c33e18..fa533c27052a 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -1926,20 +1926,6 @@ config E1000
1926 To compile this driver as a module, choose M here. The module 1926 To compile this driver as a module, choose M here. The module
1927 will be called e1000. 1927 will be called e1000.
1928 1928
1929config E1000_NAPI
1930 bool "Use Rx Polling (NAPI)"
1931 depends on E1000
1932 help
1933 NAPI is a new driver API designed to reduce CPU and interrupt load
1934 when the driver is receiving lots of packets from the card. It is
1935 still somewhat experimental and thus not yet enabled by default.
1936
1937 If your estimated Rx load is 10kpps or more, or if the card will be
1938 deployed on potentially unfriendly networks (e.g. in a firewall),
1939 then say Y here.
1940
1941 If in doubt, say N.
1942
1943config E1000_DISABLE_PACKET_SPLIT 1929config E1000_DISABLE_PACKET_SPLIT
1944 bool "Disable Packet Split for PCI express adapters" 1930 bool "Disable Packet Split for PCI express adapters"
1945 depends on E1000 1931 depends on E1000
@@ -2304,6 +2290,17 @@ config ATL1
2304 To compile this driver as a module, choose M here. The module 2290 To compile this driver as a module, choose M here. The module
2305 will be called atl1. 2291 will be called atl1.
2306 2292
2293config ATL1E
2294 tristate "Atheros L1E Gigabit Ethernet support (EXPERIMENTAL)"
2295 depends on PCI && EXPERIMENTAL
2296 select CRC32
2297 select MII
2298 help
2299 This driver supports the Atheros L1E gigabit ethernet adapter.
2300
2301 To compile this driver as a module, choose M here. The module
2302 will be called atl1e.
2303
2307endif # NETDEV_1000 2304endif # NETDEV_1000
2308 2305
2309# 2306#
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 4b17a9ab7861..7629c9017215 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_EHEA) += ehea/
15obj-$(CONFIG_CAN) += can/ 15obj-$(CONFIG_CAN) += can/
16obj-$(CONFIG_BONDING) += bonding/ 16obj-$(CONFIG_BONDING) += bonding/
17obj-$(CONFIG_ATL1) += atlx/ 17obj-$(CONFIG_ATL1) += atlx/
18obj-$(CONFIG_ATL1E) += atl1e/
18obj-$(CONFIG_GIANFAR) += gianfar_driver.o 19obj-$(CONFIG_GIANFAR) += gianfar_driver.o
19obj-$(CONFIG_TEHUTI) += tehuti.o 20obj-$(CONFIG_TEHUTI) += tehuti.o
20 21
diff --git a/drivers/net/arm/at91_ether.c b/drivers/net/arm/at91_ether.c
index 1e39e78f1778..ffae266e2d7f 100644
--- a/drivers/net/arm/at91_ether.c
+++ b/drivers/net/arm/at91_ether.c
@@ -677,7 +677,7 @@ static void at91ether_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo
677{ 677{
678 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); 678 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
679 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 679 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
680 strlcpy(info->bus_info, dev->dev.parent->bus_id, sizeof(info->bus_info)); 680 strlcpy(info->bus_info, dev_name(dev->dev.parent), sizeof(info->bus_info));
681} 681}
682 682
683static const struct ethtool_ops at91ether_ethtool_ops = { 683static const struct ethtool_ops at91ether_ethtool_ops = {
@@ -820,7 +820,7 @@ static int at91ether_tx(struct sk_buff *skb, struct net_device *dev)
820 lp->skb = skb; 820 lp->skb = skb;
821 lp->skb_length = skb->len; 821 lp->skb_length = skb->len;
822 lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE); 822 lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE);
823 lp->stats.tx_bytes += skb->len; 823 dev->stats.tx_bytes += skb->len;
824 824
825 /* Set address of the data in the Transmit Address register */ 825 /* Set address of the data in the Transmit Address register */
826 at91_emac_write(AT91_EMAC_TAR, lp->skb_physaddr); 826 at91_emac_write(AT91_EMAC_TAR, lp->skb_physaddr);
@@ -843,34 +843,33 @@ static int at91ether_tx(struct sk_buff *skb, struct net_device *dev)
843 */ 843 */
844static struct net_device_stats *at91ether_stats(struct net_device *dev) 844static struct net_device_stats *at91ether_stats(struct net_device *dev)
845{ 845{
846 struct at91_private *lp = netdev_priv(dev);
847 int ale, lenerr, seqe, lcol, ecol; 846 int ale, lenerr, seqe, lcol, ecol;
848 847
849 if (netif_running(dev)) { 848 if (netif_running(dev)) {
850 lp->stats.rx_packets += at91_emac_read(AT91_EMAC_OK); /* Good frames received */ 849 dev->stats.rx_packets += at91_emac_read(AT91_EMAC_OK); /* Good frames received */
851 ale = at91_emac_read(AT91_EMAC_ALE); 850 ale = at91_emac_read(AT91_EMAC_ALE);
852 lp->stats.rx_frame_errors += ale; /* Alignment errors */ 851 dev->stats.rx_frame_errors += ale; /* Alignment errors */
853 lenerr = at91_emac_read(AT91_EMAC_ELR) + at91_emac_read(AT91_EMAC_USF); 852 lenerr = at91_emac_read(AT91_EMAC_ELR) + at91_emac_read(AT91_EMAC_USF);
854 lp->stats.rx_length_errors += lenerr; /* Excessive Length or Undersize Frame error */ 853 dev->stats.rx_length_errors += lenerr; /* Excessive Length or Undersize Frame error */
855 seqe = at91_emac_read(AT91_EMAC_SEQE); 854 seqe = at91_emac_read(AT91_EMAC_SEQE);
856 lp->stats.rx_crc_errors += seqe; /* CRC error */ 855 dev->stats.rx_crc_errors += seqe; /* CRC error */
857 lp->stats.rx_fifo_errors += at91_emac_read(AT91_EMAC_DRFC); /* Receive buffer not available */ 856 dev->stats.rx_fifo_errors += at91_emac_read(AT91_EMAC_DRFC); /* Receive buffer not available */
858 lp->stats.rx_errors += (ale + lenerr + seqe 857 dev->stats.rx_errors += (ale + lenerr + seqe
859 + at91_emac_read(AT91_EMAC_CDE) + at91_emac_read(AT91_EMAC_RJB)); 858 + at91_emac_read(AT91_EMAC_CDE) + at91_emac_read(AT91_EMAC_RJB));
860 859
861 lp->stats.tx_packets += at91_emac_read(AT91_EMAC_FRA); /* Frames successfully transmitted */ 860 dev->stats.tx_packets += at91_emac_read(AT91_EMAC_FRA); /* Frames successfully transmitted */
862 lp->stats.tx_fifo_errors += at91_emac_read(AT91_EMAC_TUE); /* Transmit FIFO underruns */ 861 dev->stats.tx_fifo_errors += at91_emac_read(AT91_EMAC_TUE); /* Transmit FIFO underruns */
863 lp->stats.tx_carrier_errors += at91_emac_read(AT91_EMAC_CSE); /* Carrier Sense errors */ 862 dev->stats.tx_carrier_errors += at91_emac_read(AT91_EMAC_CSE); /* Carrier Sense errors */
864 lp->stats.tx_heartbeat_errors += at91_emac_read(AT91_EMAC_SQEE);/* Heartbeat error */ 863 dev->stats.tx_heartbeat_errors += at91_emac_read(AT91_EMAC_SQEE);/* Heartbeat error */
865 864
866 lcol = at91_emac_read(AT91_EMAC_LCOL); 865 lcol = at91_emac_read(AT91_EMAC_LCOL);
867 ecol = at91_emac_read(AT91_EMAC_ECOL); 866 ecol = at91_emac_read(AT91_EMAC_ECOL);
868 lp->stats.tx_window_errors += lcol; /* Late collisions */ 867 dev->stats.tx_window_errors += lcol; /* Late collisions */
869 lp->stats.tx_aborted_errors += ecol; /* 16 collisions */ 868 dev->stats.tx_aborted_errors += ecol; /* 16 collisions */
870 869
871 lp->stats.collisions += (at91_emac_read(AT91_EMAC_SCOL) + at91_emac_read(AT91_EMAC_MCOL) + lcol + ecol); 870 dev->stats.collisions += (at91_emac_read(AT91_EMAC_SCOL) + at91_emac_read(AT91_EMAC_MCOL) + lcol + ecol);
872 } 871 }
873 return &lp->stats; 872 return &dev->stats;
874} 873}
875 874
876/* 875/*
@@ -896,16 +895,16 @@ static void at91ether_rx(struct net_device *dev)
896 895
897 skb->protocol = eth_type_trans(skb, dev); 896 skb->protocol = eth_type_trans(skb, dev);
898 dev->last_rx = jiffies; 897 dev->last_rx = jiffies;
899 lp->stats.rx_bytes += pktlen; 898 dev->stats.rx_bytes += pktlen;
900 netif_rx(skb); 899 netif_rx(skb);
901 } 900 }
902 else { 901 else {
903 lp->stats.rx_dropped += 1; 902 dev->stats.rx_dropped += 1;
904 printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name); 903 printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
905 } 904 }
906 905
907 if (dlist->descriptors[lp->rxBuffIndex].size & EMAC_MULTICAST) 906 if (dlist->descriptors[lp->rxBuffIndex].size & EMAC_MULTICAST)
908 lp->stats.multicast++; 907 dev->stats.multicast++;
909 908
910 dlist->descriptors[lp->rxBuffIndex].addr &= ~EMAC_DESC_DONE; /* reset ownership bit */ 909 dlist->descriptors[lp->rxBuffIndex].addr &= ~EMAC_DESC_DONE; /* reset ownership bit */
911 if (lp->rxBuffIndex == MAX_RX_DESCR-1) /* wrap after last buffer */ 910 if (lp->rxBuffIndex == MAX_RX_DESCR-1) /* wrap after last buffer */
@@ -934,7 +933,7 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
934 if (intstatus & AT91_EMAC_TCOM) { /* Transmit complete */ 933 if (intstatus & AT91_EMAC_TCOM) { /* Transmit complete */
935 /* The TCOM bit is set even if the transmission failed. */ 934 /* The TCOM bit is set even if the transmission failed. */
936 if (intstatus & (AT91_EMAC_TUND | AT91_EMAC_RTRY)) 935 if (intstatus & (AT91_EMAC_TUND | AT91_EMAC_RTRY))
937 lp->stats.tx_errors += 1; 936 dev->stats.tx_errors += 1;
938 937
939 if (lp->skb) { 938 if (lp->skb) {
940 dev_kfree_skb_irq(lp->skb); 939 dev_kfree_skb_irq(lp->skb);
diff --git a/drivers/net/arm/at91_ether.h b/drivers/net/arm/at91_ether.h
index a38fd2d053a6..353f4dab62be 100644
--- a/drivers/net/arm/at91_ether.h
+++ b/drivers/net/arm/at91_ether.h
@@ -84,7 +84,6 @@ struct recv_desc_bufs
84 84
85struct at91_private 85struct at91_private
86{ 86{
87 struct net_device_stats stats;
88 struct mii_if_info mii; /* ethtool support */ 87 struct mii_if_info mii; /* ethtool support */
89 struct at91_eth_data board_data; /* board-specific configuration */ 88 struct at91_eth_data board_data; /* board-specific configuration */
90 struct clk *ether_clk; /* clock */ 89 struct clk *ether_clk; /* clock */
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c
index ecd8fc6146e9..7a14980f3472 100644
--- a/drivers/net/arm/ep93xx_eth.c
+++ b/drivers/net/arm/ep93xx_eth.c
@@ -848,7 +848,7 @@ static int ep93xx_eth_probe(struct platform_device *pdev)
848 848
849 ep->res = request_mem_region(pdev->resource[0].start, 849 ep->res = request_mem_region(pdev->resource[0].start,
850 pdev->resource[0].end - pdev->resource[0].start + 1, 850 pdev->resource[0].end - pdev->resource[0].start + 1,
851 pdev->dev.bus_id); 851 dev_name(&pdev->dev));
852 if (ep->res == NULL) { 852 if (ep->res == NULL) {
853 dev_err(&pdev->dev, "Could not reserve memory region\n"); 853 dev_err(&pdev->dev, "Could not reserve memory region\n");
854 err = -ENOMEM; 854 err = -ENOMEM;
diff --git a/drivers/net/arm/etherh.c b/drivers/net/arm/etherh.c
index e9d15eccad08..5c5f1e470d3c 100644
--- a/drivers/net/arm/etherh.c
+++ b/drivers/net/arm/etherh.c
@@ -535,7 +535,7 @@ static int __init etherh_addr(char *addr, struct expansion_card *ec)
535 535
536 if (!ecard_readchunk(&cd, ec, 0xf5, 0)) { 536 if (!ecard_readchunk(&cd, ec, 0xf5, 0)) {
537 printk(KERN_ERR "%s: unable to read podule description string\n", 537 printk(KERN_ERR "%s: unable to read podule description string\n",
538 ec->dev.bus_id); 538 dev_name(&ec->dev));
539 goto no_addr; 539 goto no_addr;
540 } 540 }
541 541
@@ -554,7 +554,7 @@ static int __init etherh_addr(char *addr, struct expansion_card *ec)
554 } 554 }
555 555
556 printk(KERN_ERR "%s: unable to parse MAC address: %s\n", 556 printk(KERN_ERR "%s: unable to parse MAC address: %s\n",
557 ec->dev.bus_id, cd.d.string); 557 dev_name(&ec->dev), cd.d.string);
558 558
559 no_addr: 559 no_addr:
560 return -ENODEV; 560 return -ENODEV;
@@ -585,7 +585,7 @@ static void etherh_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *i
585{ 585{
586 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); 586 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
587 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 587 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
588 strlcpy(info->bus_info, dev->dev.parent->bus_id, 588 strlcpy(info->bus_info, dev_name(dev->dev.parent),
589 sizeof(info->bus_info)); 589 sizeof(info->bus_info));
590} 590}
591 591
diff --git a/drivers/net/atl1e/Makefile b/drivers/net/atl1e/Makefile
new file mode 100644
index 000000000000..bc11be824e76
--- /dev/null
+++ b/drivers/net/atl1e/Makefile
@@ -0,0 +1,2 @@
1obj-$(CONFIG_ATL1E) += atl1e.o
2atl1e-objs += atl1e_main.o atl1e_hw.o atl1e_ethtool.o atl1e_param.o
diff --git a/drivers/net/atl1e/atl1e.h b/drivers/net/atl1e/atl1e.h
new file mode 100644
index 000000000000..b645fa0f3f64
--- /dev/null
+++ b/drivers/net/atl1e/atl1e.h
@@ -0,0 +1,503 @@
1/*
2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
3 * Copyright(c) 2007 xiong huang <xiong.huang@atheros.com>
4 *
5 * Derived from Intel e1000 driver
6 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * this program; if not, write to the Free Software Foundation, Inc., 59
20 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 */
22
23#ifndef _ATL1E_H_
24#define _ATL1E_H_
25
26#include <linux/version.h>
27#include <linux/init.h>
28#include <linux/types.h>
29#include <linux/errno.h>
30#include <linux/module.h>
31#include <linux/pci.h>
32#include <linux/netdevice.h>
33#include <linux/etherdevice.h>
34#include <linux/skbuff.h>
35#include <linux/ioport.h>
36#include <linux/slab.h>
37#include <linux/list.h>
38#include <linux/delay.h>
39#include <linux/sched.h>
40#include <linux/in.h>
41#include <linux/ip.h>
42#include <linux/ipv6.h>
43#include <linux/udp.h>
44#include <linux/mii.h>
45#include <linux/io.h>
46#include <linux/vmalloc.h>
47#include <linux/pagemap.h>
48#include <linux/tcp.h>
49#include <linux/mii.h>
50#include <linux/ethtool.h>
51#include <linux/if_vlan.h>
52#include <linux/workqueue.h>
53#include <net/checksum.h>
54#include <net/ip6_checksum.h>
55
56#include "atl1e_hw.h"
57
58#define PCI_REG_COMMAND 0x04 /* PCI Command Register */
59#define CMD_IO_SPACE 0x0001
60#define CMD_MEMORY_SPACE 0x0002
61#define CMD_BUS_MASTER 0x0004
62
63#define BAR_0 0
64#define BAR_1 1
65#define BAR_5 5
66
67/* Wake Up Filter Control */
68#define AT_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */
69#define AT_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */
70#define AT_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */
71#define AT_WUFC_MC 0x00000008 /* Multicast Wakeup Enable */
72#define AT_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */
73
74#define SPEED_0 0xffff
75#define HALF_DUPLEX 1
76#define FULL_DUPLEX 2
77
78/* Error Codes */
79#define AT_ERR_EEPROM 1
80#define AT_ERR_PHY 2
81#define AT_ERR_CONFIG 3
82#define AT_ERR_PARAM 4
83#define AT_ERR_MAC_TYPE 5
84#define AT_ERR_PHY_TYPE 6
85#define AT_ERR_PHY_SPEED 7
86#define AT_ERR_PHY_RES 8
87#define AT_ERR_TIMEOUT 9
88
89#define MAX_JUMBO_FRAME_SIZE 0x2000
90
91#define AT_VLAN_TAG_TO_TPD_TAG(_vlan, _tpd) \
92 _tpd = (((_vlan) << (4)) | (((_vlan) >> 13) & 7) |\
93 (((_vlan) >> 9) & 8))
94
95#define AT_TPD_TAG_TO_VLAN_TAG(_tpd, _vlan) \
96 _vlan = (((_tpd) >> 8) | (((_tpd) & 0x77) << 9) |\
97 (((_tdp) & 0x88) << 5))
98
99#define AT_MAX_RECEIVE_QUEUE 4
100#define AT_PAGE_NUM_PER_QUEUE 2
101
102#define AT_DMA_HI_ADDR_MASK 0xffffffff00000000ULL
103#define AT_DMA_LO_ADDR_MASK 0x00000000ffffffffULL
104
105#define AT_TX_WATCHDOG (5 * HZ)
106#define AT_MAX_INT_WORK 10
107#define AT_TWSI_EEPROM_TIMEOUT 100
108#define AT_HW_MAX_IDLE_DELAY 10
109#define AT_SUSPEND_LINK_TIMEOUT 28
110
111#define AT_REGS_LEN 75
112#define AT_EEPROM_LEN 512
113#define AT_ADV_MASK (ADVERTISE_10_HALF |\
114 ADVERTISE_10_FULL |\
115 ADVERTISE_100_HALF |\
116 ADVERTISE_100_FULL |\
117 ADVERTISE_1000_FULL)
118
119/* tpd word 2 */
120#define TPD_BUFLEN_MASK 0x3FFF
121#define TPD_BUFLEN_SHIFT 0
122#define TPD_DMAINT_MASK 0x0001
123#define TPD_DMAINT_SHIFT 14
124#define TPD_PKTNT_MASK 0x0001
125#define TPD_PKTINT_SHIFT 15
126#define TPD_VLANTAG_MASK 0xFFFF
127#define TPD_VLAN_SHIFT 16
128
129/* tpd word 3 bits 0:4 */
130#define TPD_EOP_MASK 0x0001
131#define TPD_EOP_SHIFT 0
132#define TPD_IP_VERSION_MASK 0x0001
133#define TPD_IP_VERSION_SHIFT 1 /* 0 : IPV4, 1 : IPV6 */
134#define TPD_INS_VL_TAG_MASK 0x0001
135#define TPD_INS_VL_TAG_SHIFT 2
136#define TPD_CC_SEGMENT_EN_MASK 0x0001
137#define TPD_CC_SEGMENT_EN_SHIFT 3
138#define TPD_SEGMENT_EN_MASK 0x0001
139#define TPD_SEGMENT_EN_SHIFT 4
140
141/* tdp word 3 bits 5:7 if ip version is 0 */
142#define TPD_IP_CSUM_MASK 0x0001
143#define TPD_IP_CSUM_SHIFT 5
144#define TPD_TCP_CSUM_MASK 0x0001
145#define TPD_TCP_CSUM_SHIFT 6
146#define TPD_UDP_CSUM_MASK 0x0001
147#define TPD_UDP_CSUM_SHIFT 7
148
149/* tdp word 3 bits 5:7 if ip version is 1 */
150#define TPD_V6_IPHLLO_MASK 0x0007
151#define TPD_V6_IPHLLO_SHIFT 7
152
153/* tpd word 3 bits 8:9 bit */
154#define TPD_VL_TAGGED_MASK 0x0001
155#define TPD_VL_TAGGED_SHIFT 8
156#define TPD_ETHTYPE_MASK 0x0001
157#define TPD_ETHTYPE_SHIFT 9
158
159/* tdp word 3 bits 10:13 if ip version is 0 */
160#define TDP_V4_IPHL_MASK 0x000F
161#define TPD_V4_IPHL_SHIFT 10
162
163/* tdp word 3 bits 10:13 if ip version is 1 */
164#define TPD_V6_IPHLHI_MASK 0x000F
165#define TPD_V6_IPHLHI_SHIFT 10
166
167/* tpd word 3 bit 14:31 if segment enabled */
168#define TPD_TCPHDRLEN_MASK 0x000F
169#define TPD_TCPHDRLEN_SHIFT 14
170#define TPD_HDRFLAG_MASK 0x0001
171#define TPD_HDRFLAG_SHIFT 18
172#define TPD_MSS_MASK 0x1FFF
173#define TPD_MSS_SHIFT 19
174
175/* tdp word 3 bit 16:31 if custom csum enabled */
176#define TPD_PLOADOFFSET_MASK 0x00FF
177#define TPD_PLOADOFFSET_SHIFT 16
178#define TPD_CCSUMOFFSET_MASK 0x00FF
179#define TPD_CCSUMOFFSET_SHIFT 24
180
181struct atl1e_tpd_desc {
182 __le64 buffer_addr;
183 __le32 word2;
184 __le32 word3;
185};
186
187/* how about 0x2000 */
188#define MAX_TX_BUF_LEN 0x2000
189#define MAX_TX_BUF_SHIFT 13
190/*#define MAX_TX_BUF_LEN 0x3000 */
191
192/* rrs word 1 bit 0:31 */
193#define RRS_RX_CSUM_MASK 0xFFFF
194#define RRS_RX_CSUM_SHIFT 0
195#define RRS_PKT_SIZE_MASK 0x3FFF
196#define RRS_PKT_SIZE_SHIFT 16
197#define RRS_CPU_NUM_MASK 0x0003
198#define RRS_CPU_NUM_SHIFT 30
199
200#define RRS_IS_RSS_IPV4 0x0001
201#define RRS_IS_RSS_IPV4_TCP 0x0002
202#define RRS_IS_RSS_IPV6 0x0004
203#define RRS_IS_RSS_IPV6_TCP 0x0008
204#define RRS_IS_IPV6 0x0010
205#define RRS_IS_IP_FRAG 0x0020
206#define RRS_IS_IP_DF 0x0040
207#define RRS_IS_802_3 0x0080
208#define RRS_IS_VLAN_TAG 0x0100
209#define RRS_IS_ERR_FRAME 0x0200
210#define RRS_IS_IPV4 0x0400
211#define RRS_IS_UDP 0x0800
212#define RRS_IS_TCP 0x1000
213#define RRS_IS_BCAST 0x2000
214#define RRS_IS_MCAST 0x4000
215#define RRS_IS_PAUSE 0x8000
216
217#define RRS_ERR_BAD_CRC 0x0001
218#define RRS_ERR_CODE 0x0002
219#define RRS_ERR_DRIBBLE 0x0004
220#define RRS_ERR_RUNT 0x0008
221#define RRS_ERR_RX_OVERFLOW 0x0010
222#define RRS_ERR_TRUNC 0x0020
223#define RRS_ERR_IP_CSUM 0x0040
224#define RRS_ERR_L4_CSUM 0x0080
225#define RRS_ERR_LENGTH 0x0100
226#define RRS_ERR_DES_ADDR 0x0200
227
228struct atl1e_recv_ret_status {
229 u16 seq_num;
230 u16 hash_lo;
231 __le32 word1;
232 u16 pkt_flag;
233 u16 err_flag;
234 u16 hash_hi;
235 u16 vtag;
236};
237
238enum atl1e_dma_req_block {
239 atl1e_dma_req_128 = 0,
240 atl1e_dma_req_256 = 1,
241 atl1e_dma_req_512 = 2,
242 atl1e_dma_req_1024 = 3,
243 atl1e_dma_req_2048 = 4,
244 atl1e_dma_req_4096 = 5
245};
246
247enum atl1e_rrs_type {
248 atl1e_rrs_disable = 0,
249 atl1e_rrs_ipv4 = 1,
250 atl1e_rrs_ipv4_tcp = 2,
251 atl1e_rrs_ipv6 = 4,
252 atl1e_rrs_ipv6_tcp = 8
253};
254
255enum atl1e_nic_type {
256 athr_l1e = 0,
257 athr_l2e_revA = 1,
258 athr_l2e_revB = 2
259};
260
261struct atl1e_hw_stats {
262 /* rx */
263 unsigned long rx_ok; /* The number of good packet received. */
264 unsigned long rx_bcast; /* The number of good broadcast packet received. */
265 unsigned long rx_mcast; /* The number of good multicast packet received. */
266 unsigned long rx_pause; /* The number of Pause packet received. */
267 unsigned long rx_ctrl; /* The number of Control packet received other than Pause frame. */
268 unsigned long rx_fcs_err; /* The number of packets with bad FCS. */
269 unsigned long rx_len_err; /* The number of packets with mismatch of length field and actual size. */
270 unsigned long rx_byte_cnt; /* The number of bytes of good packet received. FCS is NOT included. */
271 unsigned long rx_runt; /* The number of packets received that are less than 64 byte long and with good FCS. */
272 unsigned long rx_frag; /* The number of packets received that are less than 64 byte long and with bad FCS. */
273 unsigned long rx_sz_64; /* The number of good and bad packets received that are 64 byte long. */
274 unsigned long rx_sz_65_127; /* The number of good and bad packets received that are between 65 and 127-byte long. */
275 unsigned long rx_sz_128_255; /* The number of good and bad packets received that are between 128 and 255-byte long. */
276 unsigned long rx_sz_256_511; /* The number of good and bad packets received that are between 256 and 511-byte long. */
277 unsigned long rx_sz_512_1023; /* The number of good and bad packets received that are between 512 and 1023-byte long. */
278 unsigned long rx_sz_1024_1518; /* The number of good and bad packets received that are between 1024 and 1518-byte long. */
279 unsigned long rx_sz_1519_max; /* The number of good and bad packets received that are between 1519-byte and MTU. */
280 unsigned long rx_sz_ov; /* The number of good and bad packets received that are more than MTU size truncated by Selene. */
281 unsigned long rx_rxf_ov; /* The number of frame dropped due to occurrence of RX FIFO overflow. */
282 unsigned long rx_rrd_ov; /* The number of frame dropped due to occurrence of RRD overflow. */
283 unsigned long rx_align_err; /* Alignment Error */
284 unsigned long rx_bcast_byte_cnt; /* The byte count of broadcast packet received, excluding FCS. */
285 unsigned long rx_mcast_byte_cnt; /* The byte count of multicast packet received, excluding FCS. */
286 unsigned long rx_err_addr; /* The number of packets dropped due to address filtering. */
287
288 /* tx */
289 unsigned long tx_ok; /* The number of good packet transmitted. */
290 unsigned long tx_bcast; /* The number of good broadcast packet transmitted. */
291 unsigned long tx_mcast; /* The number of good multicast packet transmitted. */
292 unsigned long tx_pause; /* The number of Pause packet transmitted. */
293 unsigned long tx_exc_defer; /* The number of packets transmitted with excessive deferral. */
294 unsigned long tx_ctrl; /* The number of packets transmitted is a control frame, excluding Pause frame. */
295 unsigned long tx_defer; /* The number of packets transmitted that is deferred. */
296 unsigned long tx_byte_cnt; /* The number of bytes of data transmitted. FCS is NOT included. */
297 unsigned long tx_sz_64; /* The number of good and bad packets transmitted that are 64 byte long. */
298 unsigned long tx_sz_65_127; /* The number of good and bad packets transmitted that are between 65 and 127-byte long. */
299 unsigned long tx_sz_128_255; /* The number of good and bad packets transmitted that are between 128 and 255-byte long. */
300 unsigned long tx_sz_256_511; /* The number of good and bad packets transmitted that are between 256 and 511-byte long. */
301 unsigned long tx_sz_512_1023; /* The number of good and bad packets transmitted that are between 512 and 1023-byte long. */
302 unsigned long tx_sz_1024_1518; /* The number of good and bad packets transmitted that are between 1024 and 1518-byte long. */
303 unsigned long tx_sz_1519_max; /* The number of good and bad packets transmitted that are between 1519-byte and MTU. */
304 unsigned long tx_1_col; /* The number of packets subsequently transmitted successfully with a single prior collision. */
305 unsigned long tx_2_col; /* The number of packets subsequently transmitted successfully with multiple prior collisions. */
306 unsigned long tx_late_col; /* The number of packets transmitted with late collisions. */
307 unsigned long tx_abort_col; /* The number of transmit packets aborted due to excessive collisions. */
308 unsigned long tx_underrun; /* The number of transmit packets aborted due to transmit FIFO underrun, or TRD FIFO underrun */
309 unsigned long tx_rd_eop; /* The number of times that read beyond the EOP into the next frame area when TRD was not written timely */
310 unsigned long tx_len_err; /* The number of transmit packets with length field does NOT match the actual frame size. */
311 unsigned long tx_trunc; /* The number of transmit packets truncated due to size exceeding MTU. */
312 unsigned long tx_bcast_byte; /* The byte count of broadcast packet transmitted, excluding FCS. */
313 unsigned long tx_mcast_byte; /* The byte count of multicast packet transmitted, excluding FCS. */
314};
315
316struct atl1e_hw {
317 u8 __iomem *hw_addr; /* inner register address */
318 resource_size_t mem_rang;
319 struct atl1e_adapter *adapter;
320 enum atl1e_nic_type nic_type;
321 u16 device_id;
322 u16 vendor_id;
323 u16 subsystem_id;
324 u16 subsystem_vendor_id;
325 u8 revision_id;
326 u16 pci_cmd_word;
327 u8 mac_addr[ETH_ALEN];
328 u8 perm_mac_addr[ETH_ALEN];
329 u8 preamble_len;
330 u16 max_frame_size;
331 u16 rx_jumbo_th;
332 u16 tx_jumbo_th;
333
334 u16 media_type;
335#define MEDIA_TYPE_AUTO_SENSOR 0
336#define MEDIA_TYPE_100M_FULL 1
337#define MEDIA_TYPE_100M_HALF 2
338#define MEDIA_TYPE_10M_FULL 3
339#define MEDIA_TYPE_10M_HALF 4
340
341 u16 autoneg_advertised;
342#define ADVERTISE_10_HALF 0x0001
343#define ADVERTISE_10_FULL 0x0002
344#define ADVERTISE_100_HALF 0x0004
345#define ADVERTISE_100_FULL 0x0008
346#define ADVERTISE_1000_HALF 0x0010 /* Not used, just FYI */
347#define ADVERTISE_1000_FULL 0x0020
348 u16 mii_autoneg_adv_reg;
349 u16 mii_1000t_ctrl_reg;
350
351 u16 imt; /* Interrupt Moderator timer ( 2us resolution) */
352 u16 ict; /* Interrupt Clear timer (2us resolution) */
353 u32 smb_timer;
354 u16 rrd_thresh; /* Threshold of number of RRD produced to trigger
355 interrupt request */
356 u16 tpd_thresh;
357 u16 rx_count_down; /* 2us resolution */
358 u16 tx_count_down;
359
360 u8 tpd_burst; /* Number of TPD to prefetch in cache-aligned burst. */
361 enum atl1e_rrs_type rrs_type;
362 u32 base_cpu;
363 u32 indirect_tab;
364
365 enum atl1e_dma_req_block dmar_block;
366 enum atl1e_dma_req_block dmaw_block;
367 u8 dmaw_dly_cnt;
368 u8 dmar_dly_cnt;
369
370 bool phy_configured;
371 bool re_autoneg;
372 bool emi_ca;
373};
374
375/*
376 * wrapper around a pointer to a socket buffer,
377 * so a DMA handle can be stored along with the buffer
378 */
379struct atl1e_tx_buffer {
380 struct sk_buff *skb;
381 u16 length;
382 dma_addr_t dma;
383};
384
385struct atl1e_rx_page {
386 dma_addr_t dma; /* receive rage DMA address */
387 u8 *addr; /* receive rage virtual address */
388 dma_addr_t write_offset_dma; /* the DMA address which contain the
389 receive data offset in the page */
390 u32 *write_offset_addr; /* the virtaul address which contain
391 the receive data offset in the page */
392 u32 read_offset; /* the offset where we have read */
393};
394
395struct atl1e_rx_page_desc {
396 struct atl1e_rx_page rx_page[AT_PAGE_NUM_PER_QUEUE];
397 u8 rx_using;
398 u16 rx_nxseq;
399};
400
401/* transmit packet descriptor (tpd) ring */
402struct atl1e_tx_ring {
403 struct atl1e_tpd_desc *desc; /* descriptor ring virtual address */
404 dma_addr_t dma; /* descriptor ring physical address */
405 u16 count; /* the count of transmit rings */
406 rwlock_t tx_lock;
407 u16 next_to_use;
408 atomic_t next_to_clean;
409 struct atl1e_tx_buffer *tx_buffer;
410 dma_addr_t cmb_dma;
411 u32 *cmb;
412};
413
414/* receive packet descriptor ring */
415struct atl1e_rx_ring {
416 void *desc;
417 dma_addr_t dma;
418 int size;
419 u32 page_size; /* bytes length of rxf page */
420 u32 real_page_size; /* real_page_size = page_size + jumbo + aliagn */
421 struct atl1e_rx_page_desc rx_page_desc[AT_MAX_RECEIVE_QUEUE];
422};
423
424/* board specific private data structure */
425struct atl1e_adapter {
426 struct net_device *netdev;
427 struct pci_dev *pdev;
428 struct vlan_group *vlgrp;
429 struct napi_struct napi;
430 struct mii_if_info mii; /* MII interface info */
431 struct atl1e_hw hw;
432 struct atl1e_hw_stats hw_stats;
433 struct net_device_stats net_stats;
434
435 bool have_msi;
436 u32 wol;
437 u16 link_speed;
438 u16 link_duplex;
439
440 spinlock_t mdio_lock;
441 spinlock_t tx_lock;
442 atomic_t irq_sem;
443
444 struct work_struct reset_task;
445 struct work_struct link_chg_task;
446 struct timer_list watchdog_timer;
447 struct timer_list phy_config_timer;
448
449 /* All Descriptor memory */
450 dma_addr_t ring_dma;
451 void *ring_vir_addr;
452 int ring_size;
453
454 struct atl1e_tx_ring tx_ring;
455 struct atl1e_rx_ring rx_ring;
456 int num_rx_queues;
457 unsigned long flags;
458#define __AT_TESTING 0x0001
459#define __AT_RESETTING 0x0002
460#define __AT_DOWN 0x0003
461
462 u32 bd_number; /* board number;*/
463 u32 pci_state[16];
464 u32 *config_space;
465};
466
467#define AT_WRITE_REG(a, reg, value) ( \
468 writel((value), ((a)->hw_addr + reg)))
469
470#define AT_WRITE_FLUSH(a) (\
471 readl((a)->hw_addr))
472
473#define AT_READ_REG(a, reg) ( \
474 readl((a)->hw_addr + reg))
475
476#define AT_WRITE_REGB(a, reg, value) (\
477 writeb((value), ((a)->hw_addr + reg)))
478
479#define AT_READ_REGB(a, reg) (\
480 readb((a)->hw_addr + reg))
481
482#define AT_WRITE_REGW(a, reg, value) (\
483 writew((value), ((a)->hw_addr + reg)))
484
485#define AT_READ_REGW(a, reg) (\
486 readw((a)->hw_addr + reg))
487
488#define AT_WRITE_REG_ARRAY(a, reg, offset, value) ( \
489 writel((value), (((a)->hw_addr + reg) + ((offset) << 2))))
490
491#define AT_READ_REG_ARRAY(a, reg, offset) ( \
492 readl(((a)->hw_addr + reg) + ((offset) << 2)))
493
494extern char atl1e_driver_name[];
495extern char atl1e_driver_version[];
496
497extern void atl1e_check_options(struct atl1e_adapter *adapter);
498extern int atl1e_up(struct atl1e_adapter *adapter);
499extern void atl1e_down(struct atl1e_adapter *adapter);
500extern void atl1e_reinit_locked(struct atl1e_adapter *adapter);
501extern s32 atl1e_reset_hw(struct atl1e_hw *hw);
502extern void atl1e_set_ethtool_ops(struct net_device *netdev);
503#endif /* _ATL1_E_H_ */
diff --git a/drivers/net/atl1e/atl1e_ethtool.c b/drivers/net/atl1e/atl1e_ethtool.c
new file mode 100644
index 000000000000..cdc3b85b10b9
--- /dev/null
+++ b/drivers/net/atl1e/atl1e_ethtool.c
@@ -0,0 +1,405 @@
1/*
2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
3 *
4 * Derived from Intel e1000 driver
5 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 *
21 */
22
23#include <linux/netdevice.h>
24#include <linux/ethtool.h>
25
26#include "atl1e.h"
27
28static int atl1e_get_settings(struct net_device *netdev,
29 struct ethtool_cmd *ecmd)
30{
31 struct atl1e_adapter *adapter = netdev_priv(netdev);
32 struct atl1e_hw *hw = &adapter->hw;
33
34 ecmd->supported = (SUPPORTED_10baseT_Half |
35 SUPPORTED_10baseT_Full |
36 SUPPORTED_100baseT_Half |
37 SUPPORTED_100baseT_Full |
38 SUPPORTED_Autoneg |
39 SUPPORTED_TP);
40 if (hw->nic_type == athr_l1e)
41 ecmd->supported |= SUPPORTED_1000baseT_Full;
42
43 ecmd->advertising = ADVERTISED_TP;
44
45 ecmd->advertising |= ADVERTISED_Autoneg;
46 ecmd->advertising |= hw->autoneg_advertised;
47
48 ecmd->port = PORT_TP;
49 ecmd->phy_address = 0;
50 ecmd->transceiver = XCVR_INTERNAL;
51
52 if (adapter->link_speed != SPEED_0) {
53 ecmd->speed = adapter->link_speed;
54 if (adapter->link_duplex == FULL_DUPLEX)
55 ecmd->duplex = DUPLEX_FULL;
56 else
57 ecmd->duplex = DUPLEX_HALF;
58 } else {
59 ecmd->speed = -1;
60 ecmd->duplex = -1;
61 }
62
63 ecmd->autoneg = AUTONEG_ENABLE;
64 return 0;
65}
66
67static int atl1e_set_settings(struct net_device *netdev,
68 struct ethtool_cmd *ecmd)
69{
70 struct atl1e_adapter *adapter = netdev_priv(netdev);
71 struct atl1e_hw *hw = &adapter->hw;
72
73 while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
74 msleep(1);
75
76 if (ecmd->autoneg == AUTONEG_ENABLE) {
77 u16 adv4, adv9;
78
79 if ((ecmd->advertising&ADVERTISE_1000_FULL)) {
80 if (hw->nic_type == athr_l1e) {
81 hw->autoneg_advertised =
82 ecmd->advertising & AT_ADV_MASK;
83 } else {
84 clear_bit(__AT_RESETTING, &adapter->flags);
85 return -EINVAL;
86 }
87 } else if (ecmd->advertising&ADVERTISE_1000_HALF) {
88 clear_bit(__AT_RESETTING, &adapter->flags);
89 return -EINVAL;
90 } else {
91 hw->autoneg_advertised =
92 ecmd->advertising & AT_ADV_MASK;
93 }
94 ecmd->advertising = hw->autoneg_advertised |
95 ADVERTISED_TP | ADVERTISED_Autoneg;
96
97 adv4 = hw->mii_autoneg_adv_reg & ~MII_AR_SPEED_MASK;
98 adv9 = hw->mii_1000t_ctrl_reg & ~MII_AT001_CR_1000T_SPEED_MASK;
99 if (hw->autoneg_advertised & ADVERTISE_10_HALF)
100 adv4 |= MII_AR_10T_HD_CAPS;
101 if (hw->autoneg_advertised & ADVERTISE_10_FULL)
102 adv4 |= MII_AR_10T_FD_CAPS;
103 if (hw->autoneg_advertised & ADVERTISE_100_HALF)
104 adv4 |= MII_AR_100TX_HD_CAPS;
105 if (hw->autoneg_advertised & ADVERTISE_100_FULL)
106 adv4 |= MII_AR_100TX_FD_CAPS;
107 if (hw->autoneg_advertised & ADVERTISE_1000_FULL)
108 adv9 |= MII_AT001_CR_1000T_FD_CAPS;
109
110 if (adv4 != hw->mii_autoneg_adv_reg ||
111 adv9 != hw->mii_1000t_ctrl_reg) {
112 hw->mii_autoneg_adv_reg = adv4;
113 hw->mii_1000t_ctrl_reg = adv9;
114 hw->re_autoneg = true;
115 }
116
117 } else {
118 clear_bit(__AT_RESETTING, &adapter->flags);
119 return -EINVAL;
120 }
121
122 /* reset the link */
123
124 if (netif_running(adapter->netdev)) {
125 atl1e_down(adapter);
126 atl1e_up(adapter);
127 } else
128 atl1e_reset_hw(&adapter->hw);
129
130 clear_bit(__AT_RESETTING, &adapter->flags);
131 return 0;
132}
133
134static u32 atl1e_get_tx_csum(struct net_device *netdev)
135{
136 return (netdev->features & NETIF_F_HW_CSUM) != 0;
137}
138
139static u32 atl1e_get_msglevel(struct net_device *netdev)
140{
141#ifdef DBG
142 return 1;
143#else
144 return 0;
145#endif
146}
147
148static void atl1e_set_msglevel(struct net_device *netdev, u32 data)
149{
150}
151
152static int atl1e_get_regs_len(struct net_device *netdev)
153{
154 return AT_REGS_LEN * sizeof(u32);
155}
156
157static void atl1e_get_regs(struct net_device *netdev,
158 struct ethtool_regs *regs, void *p)
159{
160 struct atl1e_adapter *adapter = netdev_priv(netdev);
161 struct atl1e_hw *hw = &adapter->hw;
162 u32 *regs_buff = p;
163 u16 phy_data;
164
165 memset(p, 0, AT_REGS_LEN * sizeof(u32));
166
167 regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id;
168
169 regs_buff[0] = AT_READ_REG(hw, REG_VPD_CAP);
170 regs_buff[1] = AT_READ_REG(hw, REG_SPI_FLASH_CTRL);
171 regs_buff[2] = AT_READ_REG(hw, REG_SPI_FLASH_CONFIG);
172 regs_buff[3] = AT_READ_REG(hw, REG_TWSI_CTRL);
173 regs_buff[4] = AT_READ_REG(hw, REG_PCIE_DEV_MISC_CTRL);
174 regs_buff[5] = AT_READ_REG(hw, REG_MASTER_CTRL);
175 regs_buff[6] = AT_READ_REG(hw, REG_MANUAL_TIMER_INIT);
176 regs_buff[7] = AT_READ_REG(hw, REG_IRQ_MODU_TIMER_INIT);
177 regs_buff[8] = AT_READ_REG(hw, REG_GPHY_CTRL);
178 regs_buff[9] = AT_READ_REG(hw, REG_CMBDISDMA_TIMER);
179 regs_buff[10] = AT_READ_REG(hw, REG_IDLE_STATUS);
180 regs_buff[11] = AT_READ_REG(hw, REG_MDIO_CTRL);
181 regs_buff[12] = AT_READ_REG(hw, REG_SERDES_LOCK);
182 regs_buff[13] = AT_READ_REG(hw, REG_MAC_CTRL);
183 regs_buff[14] = AT_READ_REG(hw, REG_MAC_IPG_IFG);
184 regs_buff[15] = AT_READ_REG(hw, REG_MAC_STA_ADDR);
185 regs_buff[16] = AT_READ_REG(hw, REG_MAC_STA_ADDR+4);
186 regs_buff[17] = AT_READ_REG(hw, REG_RX_HASH_TABLE);
187 regs_buff[18] = AT_READ_REG(hw, REG_RX_HASH_TABLE+4);
188 regs_buff[19] = AT_READ_REG(hw, REG_MAC_HALF_DUPLX_CTRL);
189 regs_buff[20] = AT_READ_REG(hw, REG_MTU);
190 regs_buff[21] = AT_READ_REG(hw, REG_WOL_CTRL);
191 regs_buff[22] = AT_READ_REG(hw, REG_SRAM_TRD_ADDR);
192 regs_buff[23] = AT_READ_REG(hw, REG_SRAM_TRD_LEN);
193 regs_buff[24] = AT_READ_REG(hw, REG_SRAM_RXF_ADDR);
194 regs_buff[25] = AT_READ_REG(hw, REG_SRAM_RXF_LEN);
195 regs_buff[26] = AT_READ_REG(hw, REG_SRAM_TXF_ADDR);
196 regs_buff[27] = AT_READ_REG(hw, REG_SRAM_TXF_LEN);
197 regs_buff[28] = AT_READ_REG(hw, REG_SRAM_TCPH_ADDR);
198 regs_buff[29] = AT_READ_REG(hw, REG_SRAM_PKTH_ADDR);
199
200 atl1e_read_phy_reg(hw, MII_BMCR, &phy_data);
201 regs_buff[73] = (u32)phy_data;
202 atl1e_read_phy_reg(hw, MII_BMSR, &phy_data);
203 regs_buff[74] = (u32)phy_data;
204}
205
206static int atl1e_get_eeprom_len(struct net_device *netdev)
207{
208 struct atl1e_adapter *adapter = netdev_priv(netdev);
209
210 if (!atl1e_check_eeprom_exist(&adapter->hw))
211 return AT_EEPROM_LEN;
212 else
213 return 0;
214}
215
216static int atl1e_get_eeprom(struct net_device *netdev,
217 struct ethtool_eeprom *eeprom, u8 *bytes)
218{
219 struct atl1e_adapter *adapter = netdev_priv(netdev);
220 struct atl1e_hw *hw = &adapter->hw;
221 u32 *eeprom_buff;
222 int first_dword, last_dword;
223 int ret_val = 0;
224 int i;
225
226 if (eeprom->len == 0)
227 return -EINVAL;
228
229 if (atl1e_check_eeprom_exist(hw)) /* not exist */
230 return -EINVAL;
231
232 eeprom->magic = hw->vendor_id | (hw->device_id << 16);
233
234 first_dword = eeprom->offset >> 2;
235 last_dword = (eeprom->offset + eeprom->len - 1) >> 2;
236
237 eeprom_buff = kmalloc(sizeof(u32) *
238 (last_dword - first_dword + 1), GFP_KERNEL);
239 if (eeprom_buff == NULL)
240 return -ENOMEM;
241
242 for (i = first_dword; i < last_dword; i++) {
243 if (!atl1e_read_eeprom(hw, i * 4, &(eeprom_buff[i-first_dword]))) {
244 kfree(eeprom_buff);
245 return -EIO;
246 }
247 }
248
249 memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 3),
250 eeprom->len);
251 kfree(eeprom_buff);
252
253 return ret_val;
254}
255
256static int atl1e_set_eeprom(struct net_device *netdev,
257 struct ethtool_eeprom *eeprom, u8 *bytes)
258{
259 struct atl1e_adapter *adapter = netdev_priv(netdev);
260 struct atl1e_hw *hw = &adapter->hw;
261 u32 *eeprom_buff;
262 u32 *ptr;
263 int first_dword, last_dword;
264 int ret_val = 0;
265 int i;
266
267 if (eeprom->len == 0)
268 return -EOPNOTSUPP;
269
270 if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))
271 return -EINVAL;
272
273 first_dword = eeprom->offset >> 2;
274 last_dword = (eeprom->offset + eeprom->len - 1) >> 2;
275 eeprom_buff = kmalloc(AT_EEPROM_LEN, GFP_KERNEL);
276 if (eeprom_buff == NULL)
277 return -ENOMEM;
278
279 ptr = (u32 *)eeprom_buff;
280
281 if (eeprom->offset & 3) {
282 /* need read/modify/write of first changed EEPROM word */
283 /* only the second byte of the word is being modified */
284 if (!atl1e_read_eeprom(hw, first_dword * 4, &(eeprom_buff[0]))) {
285 ret_val = -EIO;
286 goto out;
287 }
288 ptr++;
289 }
290 if (((eeprom->offset + eeprom->len) & 3)) {
291 /* need read/modify/write of last changed EEPROM word */
292 /* only the first byte of the word is being modified */
293
294 if (!atl1e_read_eeprom(hw, last_dword * 4,
295 &(eeprom_buff[last_dword - first_dword]))) {
296 ret_val = -EIO;
297 goto out;
298 }
299 }
300
301 /* Device's eeprom is always little-endian, word addressable */
302 memcpy(ptr, bytes, eeprom->len);
303
304 for (i = 0; i < last_dword - first_dword + 1; i++) {
305 if (!atl1e_write_eeprom(hw, ((first_dword + i) * 4),
306 eeprom_buff[i])) {
307 ret_val = -EIO;
308 goto out;
309 }
310 }
311out:
312 kfree(eeprom_buff);
313 return ret_val;
314}
315
316static void atl1e_get_drvinfo(struct net_device *netdev,
317 struct ethtool_drvinfo *drvinfo)
318{
319 struct atl1e_adapter *adapter = netdev_priv(netdev);
320
321 strncpy(drvinfo->driver, atl1e_driver_name, 32);
322 strncpy(drvinfo->version, atl1e_driver_version, 32);
323 strncpy(drvinfo->fw_version, "L1e", 32);
324 strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
325 drvinfo->n_stats = 0;
326 drvinfo->testinfo_len = 0;
327 drvinfo->regdump_len = atl1e_get_regs_len(netdev);
328 drvinfo->eedump_len = atl1e_get_eeprom_len(netdev);
329}
330
331static void atl1e_get_wol(struct net_device *netdev,
332 struct ethtool_wolinfo *wol)
333{
334 struct atl1e_adapter *adapter = netdev_priv(netdev);
335
336 wol->supported = WAKE_MAGIC | WAKE_PHY;
337 wol->wolopts = 0;
338
339 if (adapter->wol & AT_WUFC_EX)
340 wol->wolopts |= WAKE_UCAST;
341 if (adapter->wol & AT_WUFC_MC)
342 wol->wolopts |= WAKE_MCAST;
343 if (adapter->wol & AT_WUFC_BC)
344 wol->wolopts |= WAKE_BCAST;
345 if (adapter->wol & AT_WUFC_MAG)
346 wol->wolopts |= WAKE_MAGIC;
347 if (adapter->wol & AT_WUFC_LNKC)
348 wol->wolopts |= WAKE_PHY;
349
350 return;
351}
352
353static int atl1e_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
354{
355 struct atl1e_adapter *adapter = netdev_priv(netdev);
356
357 if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE |
358 WAKE_MCAST | WAKE_BCAST | WAKE_MCAST))
359 return -EOPNOTSUPP;
360 /* these settings will always override what we currently have */
361 adapter->wol = 0;
362
363 if (wol->wolopts & WAKE_MAGIC)
364 adapter->wol |= AT_WUFC_MAG;
365 if (wol->wolopts & WAKE_PHY)
366 adapter->wol |= AT_WUFC_LNKC;
367
368 return 0;
369}
370
371static int atl1e_nway_reset(struct net_device *netdev)
372{
373 struct atl1e_adapter *adapter = netdev_priv(netdev);
374 if (netif_running(netdev))
375 atl1e_reinit_locked(adapter);
376 return 0;
377}
378
379static struct ethtool_ops atl1e_ethtool_ops = {
380 .get_settings = atl1e_get_settings,
381 .set_settings = atl1e_set_settings,
382 .get_drvinfo = atl1e_get_drvinfo,
383 .get_regs_len = atl1e_get_regs_len,
384 .get_regs = atl1e_get_regs,
385 .get_wol = atl1e_get_wol,
386 .set_wol = atl1e_set_wol,
387 .get_msglevel = atl1e_get_msglevel,
388 .set_msglevel = atl1e_set_msglevel,
389 .nway_reset = atl1e_nway_reset,
390 .get_link = ethtool_op_get_link,
391 .get_eeprom_len = atl1e_get_eeprom_len,
392 .get_eeprom = atl1e_get_eeprom,
393 .set_eeprom = atl1e_set_eeprom,
394 .get_tx_csum = atl1e_get_tx_csum,
395 .get_sg = ethtool_op_get_sg,
396 .set_sg = ethtool_op_set_sg,
397#ifdef NETIF_F_TSO
398 .get_tso = ethtool_op_get_tso,
399#endif
400};
401
402void atl1e_set_ethtool_ops(struct net_device *netdev)
403{
404 SET_ETHTOOL_OPS(netdev, &atl1e_ethtool_ops);
405}
diff --git a/drivers/net/atl1e/atl1e_hw.c b/drivers/net/atl1e/atl1e_hw.c
new file mode 100644
index 000000000000..949e75358bf0
--- /dev/null
+++ b/drivers/net/atl1e/atl1e_hw.c
@@ -0,0 +1,664 @@
1/*
2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
3 *
4 * Derived from Intel e1000 driver
5 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21#include <linux/pci.h>
22#include <linux/delay.h>
23#include <linux/mii.h>
24#include <linux/crc32.h>
25
26#include "atl1e.h"
27
28/*
29 * check_eeprom_exist
30 * return 0 if eeprom exist
31 */
32int atl1e_check_eeprom_exist(struct atl1e_hw *hw)
33{
34 u32 value;
35
36 value = AT_READ_REG(hw, REG_SPI_FLASH_CTRL);
37 if (value & SPI_FLASH_CTRL_EN_VPD) {
38 value &= ~SPI_FLASH_CTRL_EN_VPD;
39 AT_WRITE_REG(hw, REG_SPI_FLASH_CTRL, value);
40 }
41 value = AT_READ_REGW(hw, REG_PCIE_CAP_LIST);
42 return ((value & 0xFF00) == 0x6C00) ? 0 : 1;
43}
44
45void atl1e_hw_set_mac_addr(struct atl1e_hw *hw)
46{
47 u32 value;
48 /*
49 * 00-0B-6A-F6-00-DC
50 * 0: 6AF600DC 1: 000B
51 * low dword
52 */
53 value = (((u32)hw->mac_addr[2]) << 24) |
54 (((u32)hw->mac_addr[3]) << 16) |
55 (((u32)hw->mac_addr[4]) << 8) |
56 (((u32)hw->mac_addr[5])) ;
57 AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 0, value);
58 /* hight dword */
59 value = (((u32)hw->mac_addr[0]) << 8) |
60 (((u32)hw->mac_addr[1])) ;
61 AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 1, value);
62}
63
64/*
65 * atl1e_get_permanent_address
66 * return 0 if get valid mac address,
67 */
68static int atl1e_get_permanent_address(struct atl1e_hw *hw)
69{
70 u32 addr[2];
71 u32 i;
72 u32 twsi_ctrl_data;
73 u8 eth_addr[ETH_ALEN];
74
75 if (is_valid_ether_addr(hw->perm_mac_addr))
76 return 0;
77
78 /* init */
79 addr[0] = addr[1] = 0;
80
81 if (!atl1e_check_eeprom_exist(hw)) {
82 /* eeprom exist */
83 twsi_ctrl_data = AT_READ_REG(hw, REG_TWSI_CTRL);
84 twsi_ctrl_data |= TWSI_CTRL_SW_LDSTART;
85 AT_WRITE_REG(hw, REG_TWSI_CTRL, twsi_ctrl_data);
86 for (i = 0; i < AT_TWSI_EEPROM_TIMEOUT; i++) {
87 msleep(10);
88 twsi_ctrl_data = AT_READ_REG(hw, REG_TWSI_CTRL);
89 if ((twsi_ctrl_data & TWSI_CTRL_SW_LDSTART) == 0)
90 break;
91 }
92 if (i >= AT_TWSI_EEPROM_TIMEOUT)
93 return AT_ERR_TIMEOUT;
94 }
95
96 /* maybe MAC-address is from BIOS */
97 addr[0] = AT_READ_REG(hw, REG_MAC_STA_ADDR);
98 addr[1] = AT_READ_REG(hw, REG_MAC_STA_ADDR + 4);
99 *(u32 *) &eth_addr[2] = swab32(addr[0]);
100 *(u16 *) &eth_addr[0] = swab16(*(u16 *)&addr[1]);
101
102 if (is_valid_ether_addr(eth_addr)) {
103 memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
104 return 0;
105 }
106
107 return AT_ERR_EEPROM;
108}
109
110bool atl1e_write_eeprom(struct atl1e_hw *hw, u32 offset, u32 value)
111{
112 return true;
113}
114
115bool atl1e_read_eeprom(struct atl1e_hw *hw, u32 offset, u32 *p_value)
116{
117 int i;
118 u32 control;
119
120 if (offset & 3)
121 return false; /* address do not align */
122
123 AT_WRITE_REG(hw, REG_VPD_DATA, 0);
124 control = (offset & VPD_CAP_VPD_ADDR_MASK) << VPD_CAP_VPD_ADDR_SHIFT;
125 AT_WRITE_REG(hw, REG_VPD_CAP, control);
126
127 for (i = 0; i < 10; i++) {
128 msleep(2);
129 control = AT_READ_REG(hw, REG_VPD_CAP);
130 if (control & VPD_CAP_VPD_FLAG)
131 break;
132 }
133 if (control & VPD_CAP_VPD_FLAG) {
134 *p_value = AT_READ_REG(hw, REG_VPD_DATA);
135 return true;
136 }
137 return false; /* timeout */
138}
139
140void atl1e_force_ps(struct atl1e_hw *hw)
141{
142 AT_WRITE_REGW(hw, REG_GPHY_CTRL,
143 GPHY_CTRL_PW_WOL_DIS | GPHY_CTRL_EXT_RESET);
144}
145
146/*
147 * Reads the adapter's MAC address from the EEPROM
148 *
149 * hw - Struct containing variables accessed by shared code
150 */
151int atl1e_read_mac_addr(struct atl1e_hw *hw)
152{
153 int err = 0;
154
155 err = atl1e_get_permanent_address(hw);
156 if (err)
157 return AT_ERR_EEPROM;
158 memcpy(hw->mac_addr, hw->perm_mac_addr, sizeof(hw->perm_mac_addr));
159 return 0;
160}
161
162/*
163 * atl1e_hash_mc_addr
164 * purpose
165 * set hash value for a multicast address
166 * hash calcu processing :
167 * 1. calcu 32bit CRC for multicast address
168 * 2. reverse crc with MSB to LSB
169 */
170u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr)
171{
172 u32 crc32;
173 u32 value = 0;
174 int i;
175
176 crc32 = ether_crc_le(6, mc_addr);
177 crc32 = ~crc32;
178 for (i = 0; i < 32; i++)
179 value |= (((crc32 >> i) & 1) << (31 - i));
180
181 return value;
182}
183
184/*
185 * Sets the bit in the multicast table corresponding to the hash value.
186 * hw - Struct containing variables accessed by shared code
187 * hash_value - Multicast address hash value
188 */
189void atl1e_hash_set(struct atl1e_hw *hw, u32 hash_value)
190{
191 u32 hash_bit, hash_reg;
192 u32 mta;
193
194 /*
195 * The HASH Table is a register array of 2 32-bit registers.
196 * It is treated like an array of 64 bits. We want to set
197 * bit BitArray[hash_value]. So we figure out what register
198 * the bit is in, read it, OR in the new bit, then write
199 * back the new value. The register is determined by the
200 * upper 7 bits of the hash value and the bit within that
201 * register are determined by the lower 5 bits of the value.
202 */
203 hash_reg = (hash_value >> 31) & 0x1;
204 hash_bit = (hash_value >> 26) & 0x1F;
205
206 mta = AT_READ_REG_ARRAY(hw, REG_RX_HASH_TABLE, hash_reg);
207
208 mta |= (1 << hash_bit);
209
210 AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, hash_reg, mta);
211}
212/*
213 * Reads the value from a PHY register
214 * hw - Struct containing variables accessed by shared code
215 * reg_addr - address of the PHY register to read
216 */
217int atl1e_read_phy_reg(struct atl1e_hw *hw, u16 reg_addr, u16 *phy_data)
218{
219 u32 val;
220 int i;
221
222 val = ((u32)(reg_addr & MDIO_REG_ADDR_MASK)) << MDIO_REG_ADDR_SHIFT |
223 MDIO_START | MDIO_SUP_PREAMBLE | MDIO_RW |
224 MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
225
226 AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
227
228 wmb();
229
230 for (i = 0; i < MDIO_WAIT_TIMES; i++) {
231 udelay(2);
232 val = AT_READ_REG(hw, REG_MDIO_CTRL);
233 if (!(val & (MDIO_START | MDIO_BUSY)))
234 break;
235 wmb();
236 }
237 if (!(val & (MDIO_START | MDIO_BUSY))) {
238 *phy_data = (u16)val;
239 return 0;
240 }
241
242 return AT_ERR_PHY;
243}
244
245/*
246 * Writes a value to a PHY register
247 * hw - Struct containing variables accessed by shared code
248 * reg_addr - address of the PHY register to write
249 * data - data to write to the PHY
250 */
251int atl1e_write_phy_reg(struct atl1e_hw *hw, u32 reg_addr, u16 phy_data)
252{
253 int i;
254 u32 val;
255
256 val = ((u32)(phy_data & MDIO_DATA_MASK)) << MDIO_DATA_SHIFT |
257 (reg_addr&MDIO_REG_ADDR_MASK) << MDIO_REG_ADDR_SHIFT |
258 MDIO_SUP_PREAMBLE |
259 MDIO_START |
260 MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
261
262 AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
263 wmb();
264
265 for (i = 0; i < MDIO_WAIT_TIMES; i++) {
266 udelay(2);
267 val = AT_READ_REG(hw, REG_MDIO_CTRL);
268 if (!(val & (MDIO_START | MDIO_BUSY)))
269 break;
270 wmb();
271 }
272
273 if (!(val & (MDIO_START | MDIO_BUSY)))
274 return 0;
275
276 return AT_ERR_PHY;
277}
278
279/*
280 * atl1e_init_pcie - init PCIE module
281 */
282static void atl1e_init_pcie(struct atl1e_hw *hw)
283{
284 u32 value;
285 /* comment 2lines below to save more power when sususpend
286 value = LTSSM_TEST_MODE_DEF;
287 AT_WRITE_REG(hw, REG_LTSSM_TEST_MODE, value);
288 */
289
290 /* pcie flow control mode change */
291 value = AT_READ_REG(hw, 0x1008);
292 value |= 0x8000;
293 AT_WRITE_REG(hw, 0x1008, value);
294}
295/*
296 * Configures PHY autoneg and flow control advertisement settings
297 *
298 * hw - Struct containing variables accessed by shared code
299 */
300static int atl1e_phy_setup_autoneg_adv(struct atl1e_hw *hw)
301{
302 s32 ret_val;
303 u16 mii_autoneg_adv_reg;
304 u16 mii_1000t_ctrl_reg;
305
306 if (0 != hw->mii_autoneg_adv_reg)
307 return 0;
308 /* Read the MII Auto-Neg Advertisement Register (Address 4/9). */
309 mii_autoneg_adv_reg = MII_AR_DEFAULT_CAP_MASK;
310 mii_1000t_ctrl_reg = MII_AT001_CR_1000T_DEFAULT_CAP_MASK;
311
312 /*
313 * Need to parse autoneg_advertised and set up
314 * the appropriate PHY registers. First we will parse for
315 * autoneg_advertised software override. Since we can advertise
316 * a plethora of combinations, we need to check each bit
317 * individually.
318 */
319
320 /*
321 * First we clear all the 10/100 mb speed bits in the Auto-Neg
322 * Advertisement Register (Address 4) and the 1000 mb speed bits in
323 * the 1000Base-T control Register (Address 9).
324 */
325 mii_autoneg_adv_reg &= ~MII_AR_SPEED_MASK;
326 mii_1000t_ctrl_reg &= ~MII_AT001_CR_1000T_SPEED_MASK;
327
328 /*
329 * Need to parse MediaType and setup the
330 * appropriate PHY registers.
331 */
332 switch (hw->media_type) {
333 case MEDIA_TYPE_AUTO_SENSOR:
334 mii_autoneg_adv_reg |= (MII_AR_10T_HD_CAPS |
335 MII_AR_10T_FD_CAPS |
336 MII_AR_100TX_HD_CAPS |
337 MII_AR_100TX_FD_CAPS);
338 hw->autoneg_advertised = ADVERTISE_10_HALF |
339 ADVERTISE_10_FULL |
340 ADVERTISE_100_HALF |
341 ADVERTISE_100_FULL;
342 if (hw->nic_type == athr_l1e) {
343 mii_1000t_ctrl_reg |=
344 MII_AT001_CR_1000T_FD_CAPS;
345 hw->autoneg_advertised |= ADVERTISE_1000_FULL;
346 }
347 break;
348
349 case MEDIA_TYPE_100M_FULL:
350 mii_autoneg_adv_reg |= MII_AR_100TX_FD_CAPS;
351 hw->autoneg_advertised = ADVERTISE_100_FULL;
352 break;
353
354 case MEDIA_TYPE_100M_HALF:
355 mii_autoneg_adv_reg |= MII_AR_100TX_HD_CAPS;
356 hw->autoneg_advertised = ADVERTISE_100_HALF;
357 break;
358
359 case MEDIA_TYPE_10M_FULL:
360 mii_autoneg_adv_reg |= MII_AR_10T_FD_CAPS;
361 hw->autoneg_advertised = ADVERTISE_10_FULL;
362 break;
363
364 default:
365 mii_autoneg_adv_reg |= MII_AR_10T_HD_CAPS;
366 hw->autoneg_advertised = ADVERTISE_10_HALF;
367 break;
368 }
369
370 /* flow control fixed to enable all */
371 mii_autoneg_adv_reg |= (MII_AR_ASM_DIR | MII_AR_PAUSE);
372
373 hw->mii_autoneg_adv_reg = mii_autoneg_adv_reg;
374 hw->mii_1000t_ctrl_reg = mii_1000t_ctrl_reg;
375
376 ret_val = atl1e_write_phy_reg(hw, MII_ADVERTISE, mii_autoneg_adv_reg);
377 if (ret_val)
378 return ret_val;
379
380 if (hw->nic_type == athr_l1e || hw->nic_type == athr_l2e_revA) {
381 ret_val = atl1e_write_phy_reg(hw, MII_AT001_CR,
382 mii_1000t_ctrl_reg);
383 if (ret_val)
384 return ret_val;
385 }
386
387 return 0;
388}
389
390
391/*
392 * Resets the PHY and make all config validate
393 *
394 * hw - Struct containing variables accessed by shared code
395 *
396 * Sets bit 15 and 12 of the MII control regiser (for F001 bug)
397 */
398int atl1e_phy_commit(struct atl1e_hw *hw)
399{
400 struct atl1e_adapter *adapter = (struct atl1e_adapter *)hw->adapter;
401 struct pci_dev *pdev = adapter->pdev;
402 int ret_val;
403 u16 phy_data;
404
405 phy_data = MII_CR_RESET | MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG;
406
407 ret_val = atl1e_write_phy_reg(hw, MII_BMCR, phy_data);
408 if (ret_val) {
409 u32 val;
410 int i;
411 /**************************************
412 * pcie serdes link may be down !
413 **************************************/
414 for (i = 0; i < 25; i++) {
415 msleep(1);
416 val = AT_READ_REG(hw, REG_MDIO_CTRL);
417 if (!(val & (MDIO_START | MDIO_BUSY)))
418 break;
419 }
420
421 if (0 != (val & (MDIO_START | MDIO_BUSY))) {
422 dev_err(&pdev->dev,
423 "pcie linkdown at least for 25ms\n");
424 return ret_val;
425 }
426
427 dev_err(&pdev->dev, "pcie linkup after %d ms\n", i);
428 }
429 return 0;
430}
431
432int atl1e_phy_init(struct atl1e_hw *hw)
433{
434 struct atl1e_adapter *adapter = (struct atl1e_adapter *)hw->adapter;
435 struct pci_dev *pdev = adapter->pdev;
436 s32 ret_val;
437 u16 phy_val;
438
439 if (hw->phy_configured) {
440 if (hw->re_autoneg) {
441 hw->re_autoneg = false;
442 return atl1e_restart_autoneg(hw);
443 }
444 return 0;
445 }
446
447 /* RESET GPHY Core */
448 AT_WRITE_REGW(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT);
449 msleep(2);
450 AT_WRITE_REGW(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT |
451 GPHY_CTRL_EXT_RESET);
452 msleep(2);
453
454 /* patches */
455 /* p1. eable hibernation mode */
456 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0xB);
457 if (ret_val)
458 return ret_val;
459 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0xBC00);
460 if (ret_val)
461 return ret_val;
462 /* p2. set Class A/B for all modes */
463 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0);
464 if (ret_val)
465 return ret_val;
466 phy_val = 0x02ef;
467 /* remove Class AB */
468 /* phy_val = hw->emi_ca ? 0x02ef : 0x02df; */
469 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, phy_val);
470 if (ret_val)
471 return ret_val;
472 /* p3. 10B ??? */
473 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0x12);
474 if (ret_val)
475 return ret_val;
476 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0x4C04);
477 if (ret_val)
478 return ret_val;
479 /* p4. 1000T power */
480 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0x4);
481 if (ret_val)
482 return ret_val;
483 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0x8BBB);
484 if (ret_val)
485 return ret_val;
486
487 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0x5);
488 if (ret_val)
489 return ret_val;
490 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0x2C46);
491 if (ret_val)
492 return ret_val;
493
494 msleep(1);
495
496 /*Enable PHY LinkChange Interrupt */
497 ret_val = atl1e_write_phy_reg(hw, MII_INT_CTRL, 0xC00);
498 if (ret_val) {
499 dev_err(&pdev->dev, "Error enable PHY linkChange Interrupt\n");
500 return ret_val;
501 }
502 /* setup AutoNeg parameters */
503 ret_val = atl1e_phy_setup_autoneg_adv(hw);
504 if (ret_val) {
505 dev_err(&pdev->dev, "Error Setting up Auto-Negotiation\n");
506 return ret_val;
507 }
508 /* SW.Reset & En-Auto-Neg to restart Auto-Neg*/
509 dev_dbg(&pdev->dev, "Restarting Auto-Neg");
510 ret_val = atl1e_phy_commit(hw);
511 if (ret_val) {
512 dev_err(&pdev->dev, "Error Resetting the phy");
513 return ret_val;
514 }
515
516 hw->phy_configured = true;
517
518 return 0;
519}
520
521/*
522 * Reset the transmit and receive units; mask and clear all interrupts.
523 * hw - Struct containing variables accessed by shared code
524 * return : 0 or idle status (if error)
525 */
526int atl1e_reset_hw(struct atl1e_hw *hw)
527{
528 struct atl1e_adapter *adapter = (struct atl1e_adapter *)hw->adapter;
529 struct pci_dev *pdev = adapter->pdev;
530
531 u32 idle_status_data = 0;
532 u16 pci_cfg_cmd_word = 0;
533 int timeout = 0;
534
535 /* Workaround for PCI problem when BIOS sets MMRBC incorrectly. */
536 pci_read_config_word(pdev, PCI_REG_COMMAND, &pci_cfg_cmd_word);
537 if ((pci_cfg_cmd_word & (CMD_IO_SPACE |
538 CMD_MEMORY_SPACE | CMD_BUS_MASTER))
539 != (CMD_IO_SPACE | CMD_MEMORY_SPACE | CMD_BUS_MASTER)) {
540 pci_cfg_cmd_word |= (CMD_IO_SPACE |
541 CMD_MEMORY_SPACE | CMD_BUS_MASTER);
542 pci_write_config_word(pdev, PCI_REG_COMMAND, pci_cfg_cmd_word);
543 }
544
545 /*
546 * Issue Soft Reset to the MAC. This will reset the chip's
547 * transmit, receive, DMA. It will not effect
548 * the current PCI configuration. The global reset bit is self-
549 * clearing, and should clear within a microsecond.
550 */
551 AT_WRITE_REG(hw, REG_MASTER_CTRL,
552 MASTER_CTRL_LED_MODE | MASTER_CTRL_SOFT_RST);
553 wmb();
554 msleep(1);
555
556 /* Wait at least 10ms for All module to be Idle */
557 for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
558 idle_status_data = AT_READ_REG(hw, REG_IDLE_STATUS);
559 if (idle_status_data == 0)
560 break;
561 msleep(1);
562 cpu_relax();
563 }
564
565 if (timeout >= AT_HW_MAX_IDLE_DELAY) {
566 dev_err(&pdev->dev,
567 "MAC state machine cann't be idle since"
568 " disabled for 10ms second\n");
569 return AT_ERR_TIMEOUT;
570 }
571
572 return 0;
573}
574
575
576/*
577 * Performs basic configuration of the adapter.
578 *
579 * hw - Struct containing variables accessed by shared code
580 * Assumes that the controller has previously been reset and is in a
581 * post-reset uninitialized state. Initializes multicast table,
582 * and Calls routines to setup link
583 * Leaves the transmit and receive units disabled and uninitialized.
584 */
585int atl1e_init_hw(struct atl1e_hw *hw)
586{
587 s32 ret_val = 0;
588
589 atl1e_init_pcie(hw);
590
591 /* Zero out the Multicast HASH table */
592 /* clear the old settings from the multicast hash table */
593 AT_WRITE_REG(hw, REG_RX_HASH_TABLE, 0);
594 AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, 1, 0);
595
596 ret_val = atl1e_phy_init(hw);
597
598 return ret_val;
599}
600
601/*
602 * Detects the current speed and duplex settings of the hardware.
603 *
604 * hw - Struct containing variables accessed by shared code
605 * speed - Speed of the connection
606 * duplex - Duplex setting of the connection
607 */
608int atl1e_get_speed_and_duplex(struct atl1e_hw *hw, u16 *speed, u16 *duplex)
609{
610 int err;
611 u16 phy_data;
612
613 /* Read PHY Specific Status Register (17) */
614 err = atl1e_read_phy_reg(hw, MII_AT001_PSSR, &phy_data);
615 if (err)
616 return err;
617
618 if (!(phy_data & MII_AT001_PSSR_SPD_DPLX_RESOLVED))
619 return AT_ERR_PHY_RES;
620
621 switch (phy_data & MII_AT001_PSSR_SPEED) {
622 case MII_AT001_PSSR_1000MBS:
623 *speed = SPEED_1000;
624 break;
625 case MII_AT001_PSSR_100MBS:
626 *speed = SPEED_100;
627 break;
628 case MII_AT001_PSSR_10MBS:
629 *speed = SPEED_10;
630 break;
631 default:
632 return AT_ERR_PHY_SPEED;
633 break;
634 }
635
636 if (phy_data & MII_AT001_PSSR_DPLX)
637 *duplex = FULL_DUPLEX;
638 else
639 *duplex = HALF_DUPLEX;
640
641 return 0;
642}
643
644int atl1e_restart_autoneg(struct atl1e_hw *hw)
645{
646 int err = 0;
647
648 err = atl1e_write_phy_reg(hw, MII_ADVERTISE, hw->mii_autoneg_adv_reg);
649 if (err)
650 return err;
651
652 if (hw->nic_type == athr_l1e || hw->nic_type == athr_l2e_revA) {
653 err = atl1e_write_phy_reg(hw, MII_AT001_CR,
654 hw->mii_1000t_ctrl_reg);
655 if (err)
656 return err;
657 }
658
659 err = atl1e_write_phy_reg(hw, MII_BMCR,
660 MII_CR_RESET | MII_CR_AUTO_NEG_EN |
661 MII_CR_RESTART_AUTO_NEG);
662 return err;
663}
664
diff --git a/drivers/net/atl1e/atl1e_hw.h b/drivers/net/atl1e/atl1e_hw.h
new file mode 100644
index 000000000000..5ea2f4d86cfa
--- /dev/null
+++ b/drivers/net/atl1e/atl1e_hw.h
@@ -0,0 +1,793 @@
1/*
2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
3 *
4 * Derived from Intel e1000 driver
5 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21
22#ifndef _ATHL1E_HW_H_
23#define _ATHL1E_HW_H_
24
25#include <linux/types.h>
26#include <linux/mii.h>
27
28struct atl1e_adapter;
29struct atl1e_hw;
30
31/* function prototype */
32s32 atl1e_reset_hw(struct atl1e_hw *hw);
33s32 atl1e_read_mac_addr(struct atl1e_hw *hw);
34s32 atl1e_init_hw(struct atl1e_hw *hw);
35s32 atl1e_phy_commit(struct atl1e_hw *hw);
36s32 atl1e_get_speed_and_duplex(struct atl1e_hw *hw, u16 *speed, u16 *duplex);
37u32 atl1e_auto_get_fc(struct atl1e_adapter *adapter, u16 duplex);
38u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr);
39void atl1e_hash_set(struct atl1e_hw *hw, u32 hash_value);
40s32 atl1e_read_phy_reg(struct atl1e_hw *hw, u16 reg_addr, u16 *phy_data);
41s32 atl1e_write_phy_reg(struct atl1e_hw *hw, u32 reg_addr, u16 phy_data);
42s32 atl1e_validate_mdi_setting(struct atl1e_hw *hw);
43void atl1e_hw_set_mac_addr(struct atl1e_hw *hw);
44bool atl1e_read_eeprom(struct atl1e_hw *hw, u32 offset, u32 *p_value);
45bool atl1e_write_eeprom(struct atl1e_hw *hw, u32 offset, u32 value);
46s32 atl1e_phy_enter_power_saving(struct atl1e_hw *hw);
47s32 atl1e_phy_leave_power_saving(struct atl1e_hw *hw);
48s32 atl1e_phy_init(struct atl1e_hw *hw);
49int atl1e_check_eeprom_exist(struct atl1e_hw *hw);
50void atl1e_force_ps(struct atl1e_hw *hw);
51s32 atl1e_restart_autoneg(struct atl1e_hw *hw);
52
53/* register definition */
54#define REG_PM_CTRLSTAT 0x44
55
56#define REG_PCIE_CAP_LIST 0x58
57
58#define REG_DEVICE_CAP 0x5C
59#define DEVICE_CAP_MAX_PAYLOAD_MASK 0x7
60#define DEVICE_CAP_MAX_PAYLOAD_SHIFT 0
61
62#define REG_DEVICE_CTRL 0x60
63#define DEVICE_CTRL_MAX_PAYLOAD_MASK 0x7
64#define DEVICE_CTRL_MAX_PAYLOAD_SHIFT 5
65#define DEVICE_CTRL_MAX_RREQ_SZ_MASK 0x7
66#define DEVICE_CTRL_MAX_RREQ_SZ_SHIFT 12
67
68#define REG_VPD_CAP 0x6C
69#define VPD_CAP_ID_MASK 0xff
70#define VPD_CAP_ID_SHIFT 0
71#define VPD_CAP_NEXT_PTR_MASK 0xFF
72#define VPD_CAP_NEXT_PTR_SHIFT 8
73#define VPD_CAP_VPD_ADDR_MASK 0x7FFF
74#define VPD_CAP_VPD_ADDR_SHIFT 16
75#define VPD_CAP_VPD_FLAG 0x80000000
76
77#define REG_VPD_DATA 0x70
78
79#define REG_SPI_FLASH_CTRL 0x200
80#define SPI_FLASH_CTRL_STS_NON_RDY 0x1
81#define SPI_FLASH_CTRL_STS_WEN 0x2
82#define SPI_FLASH_CTRL_STS_WPEN 0x80
83#define SPI_FLASH_CTRL_DEV_STS_MASK 0xFF
84#define SPI_FLASH_CTRL_DEV_STS_SHIFT 0
85#define SPI_FLASH_CTRL_INS_MASK 0x7
86#define SPI_FLASH_CTRL_INS_SHIFT 8
87#define SPI_FLASH_CTRL_START 0x800
88#define SPI_FLASH_CTRL_EN_VPD 0x2000
89#define SPI_FLASH_CTRL_LDSTART 0x8000
90#define SPI_FLASH_CTRL_CS_HI_MASK 0x3
91#define SPI_FLASH_CTRL_CS_HI_SHIFT 16
92#define SPI_FLASH_CTRL_CS_HOLD_MASK 0x3
93#define SPI_FLASH_CTRL_CS_HOLD_SHIFT 18
94#define SPI_FLASH_CTRL_CLK_LO_MASK 0x3
95#define SPI_FLASH_CTRL_CLK_LO_SHIFT 20
96#define SPI_FLASH_CTRL_CLK_HI_MASK 0x3
97#define SPI_FLASH_CTRL_CLK_HI_SHIFT 22
98#define SPI_FLASH_CTRL_CS_SETUP_MASK 0x3
99#define SPI_FLASH_CTRL_CS_SETUP_SHIFT 24
100#define SPI_FLASH_CTRL_EROM_PGSZ_MASK 0x3
101#define SPI_FLASH_CTRL_EROM_PGSZ_SHIFT 26
102#define SPI_FLASH_CTRL_WAIT_READY 0x10000000
103
104#define REG_SPI_ADDR 0x204
105
106#define REG_SPI_DATA 0x208
107
108#define REG_SPI_FLASH_CONFIG 0x20C
109#define SPI_FLASH_CONFIG_LD_ADDR_MASK 0xFFFFFF
110#define SPI_FLASH_CONFIG_LD_ADDR_SHIFT 0
111#define SPI_FLASH_CONFIG_VPD_ADDR_MASK 0x3
112#define SPI_FLASH_CONFIG_VPD_ADDR_SHIFT 24
113#define SPI_FLASH_CONFIG_LD_EXIST 0x4000000
114
115
116#define REG_SPI_FLASH_OP_PROGRAM 0x210
117#define REG_SPI_FLASH_OP_SC_ERASE 0x211
118#define REG_SPI_FLASH_OP_CHIP_ERASE 0x212
119#define REG_SPI_FLASH_OP_RDID 0x213
120#define REG_SPI_FLASH_OP_WREN 0x214
121#define REG_SPI_FLASH_OP_RDSR 0x215
122#define REG_SPI_FLASH_OP_WRSR 0x216
123#define REG_SPI_FLASH_OP_READ 0x217
124
125#define REG_TWSI_CTRL 0x218
126#define TWSI_CTRL_LD_OFFSET_MASK 0xFF
127#define TWSI_CTRL_LD_OFFSET_SHIFT 0
128#define TWSI_CTRL_LD_SLV_ADDR_MASK 0x7
129#define TWSI_CTRL_LD_SLV_ADDR_SHIFT 8
130#define TWSI_CTRL_SW_LDSTART 0x800
131#define TWSI_CTRL_HW_LDSTART 0x1000
132#define TWSI_CTRL_SMB_SLV_ADDR_MASK 0x0x7F
133#define TWSI_CTRL_SMB_SLV_ADDR_SHIFT 15
134#define TWSI_CTRL_LD_EXIST 0x400000
135#define TWSI_CTRL_READ_FREQ_SEL_MASK 0x3
136#define TWSI_CTRL_READ_FREQ_SEL_SHIFT 23
137#define TWSI_CTRL_FREQ_SEL_100K 0
138#define TWSI_CTRL_FREQ_SEL_200K 1
139#define TWSI_CTRL_FREQ_SEL_300K 2
140#define TWSI_CTRL_FREQ_SEL_400K 3
141#define TWSI_CTRL_SMB_SLV_ADDR
142#define TWSI_CTRL_WRITE_FREQ_SEL_MASK 0x3
143#define TWSI_CTRL_WRITE_FREQ_SEL_SHIFT 24
144
145
146#define REG_PCIE_DEV_MISC_CTRL 0x21C
147#define PCIE_DEV_MISC_CTRL_EXT_PIPE 0x2
148#define PCIE_DEV_MISC_CTRL_RETRY_BUFDIS 0x1
149#define PCIE_DEV_MISC_CTRL_SPIROM_EXIST 0x4
150#define PCIE_DEV_MISC_CTRL_SERDES_ENDIAN 0x8
151#define PCIE_DEV_MISC_CTRL_SERDES_SEL_DIN 0x10
152
153#define REG_PCIE_PHYMISC 0x1000
154#define PCIE_PHYMISC_FORCE_RCV_DET 0x4
155
156#define REG_LTSSM_TEST_MODE 0x12FC
157#define LTSSM_TEST_MODE_DEF 0xE000
158
159/* Selene Master Control Register */
160#define REG_MASTER_CTRL 0x1400
161#define MASTER_CTRL_SOFT_RST 0x1
162#define MASTER_CTRL_MTIMER_EN 0x2
163#define MASTER_CTRL_ITIMER_EN 0x4
164#define MASTER_CTRL_MANUAL_INT 0x8
165#define MASTER_CTRL_ITIMER2_EN 0x20
166#define MASTER_CTRL_INT_RDCLR 0x40
167#define MASTER_CTRL_LED_MODE 0x200
168#define MASTER_CTRL_REV_NUM_SHIFT 16
169#define MASTER_CTRL_REV_NUM_MASK 0xff
170#define MASTER_CTRL_DEV_ID_SHIFT 24
171#define MASTER_CTRL_DEV_ID_MASK 0xff
172
173/* Timer Initial Value Register */
174#define REG_MANUAL_TIMER_INIT 0x1404
175
176
177/* IRQ ModeratorTimer Initial Value Register */
178#define REG_IRQ_MODU_TIMER_INIT 0x1408 /* w */
179#define REG_IRQ_MODU_TIMER2_INIT 0x140A /* w */
180
181
182#define REG_GPHY_CTRL 0x140C
183#define GPHY_CTRL_EXT_RESET 1
184#define GPHY_CTRL_PIPE_MOD 2
185#define GPHY_CTRL_TEST_MODE_MASK 3
186#define GPHY_CTRL_TEST_MODE_SHIFT 2
187#define GPHY_CTRL_BERT_START 0x10
188#define GPHY_CTRL_GATE_25M_EN 0x20
189#define GPHY_CTRL_LPW_EXIT 0x40
190#define GPHY_CTRL_PHY_IDDQ 0x80
191#define GPHY_CTRL_PHY_IDDQ_DIS 0x100
192#define GPHY_CTRL_PCLK_SEL_DIS 0x200
193#define GPHY_CTRL_HIB_EN 0x400
194#define GPHY_CTRL_HIB_PULSE 0x800
195#define GPHY_CTRL_SEL_ANA_RST 0x1000
196#define GPHY_CTRL_PHY_PLL_ON 0x2000
197#define GPHY_CTRL_PWDOWN_HW 0x4000
198#define GPHY_CTRL_DEFAULT (\
199 GPHY_CTRL_PHY_PLL_ON |\
200 GPHY_CTRL_SEL_ANA_RST |\
201 GPHY_CTRL_HIB_PULSE |\
202 GPHY_CTRL_HIB_EN)
203
204#define GPHY_CTRL_PW_WOL_DIS (\
205 GPHY_CTRL_PHY_PLL_ON |\
206 GPHY_CTRL_SEL_ANA_RST |\
207 GPHY_CTRL_HIB_PULSE |\
208 GPHY_CTRL_HIB_EN |\
209 GPHY_CTRL_PWDOWN_HW |\
210 GPHY_CTRL_PCLK_SEL_DIS |\
211 GPHY_CTRL_PHY_IDDQ)
212
213/* IRQ Anti-Lost Timer Initial Value Register */
214#define REG_CMBDISDMA_TIMER 0x140E
215
216
217/* Block IDLE Status Register */
218#define REG_IDLE_STATUS 0x1410
219#define IDLE_STATUS_RXMAC 1 /* 1: RXMAC state machine is in non-IDLE state. 0: RXMAC is idling */
220#define IDLE_STATUS_TXMAC 2 /* 1: TXMAC state machine is in non-IDLE state. 0: TXMAC is idling */
221#define IDLE_STATUS_RXQ 4 /* 1: RXQ state machine is in non-IDLE state. 0: RXQ is idling */
222#define IDLE_STATUS_TXQ 8 /* 1: TXQ state machine is in non-IDLE state. 0: TXQ is idling */
223#define IDLE_STATUS_DMAR 0x10 /* 1: DMAR state machine is in non-IDLE state. 0: DMAR is idling */
224#define IDLE_STATUS_DMAW 0x20 /* 1: DMAW state machine is in non-IDLE state. 0: DMAW is idling */
225#define IDLE_STATUS_SMB 0x40 /* 1: SMB state machine is in non-IDLE state. 0: SMB is idling */
226#define IDLE_STATUS_CMB 0x80 /* 1: CMB state machine is in non-IDLE state. 0: CMB is idling */
227
228/* MDIO Control Register */
229#define REG_MDIO_CTRL 0x1414
230#define MDIO_DATA_MASK 0xffff /* On MDIO write, the 16-bit control data to write to PHY MII management register */
231#define MDIO_DATA_SHIFT 0 /* On MDIO read, the 16-bit status data that was read from the PHY MII management register*/
232#define MDIO_REG_ADDR_MASK 0x1f /* MDIO register address */
233#define MDIO_REG_ADDR_SHIFT 16
234#define MDIO_RW 0x200000 /* 1: read, 0: write */
235#define MDIO_SUP_PREAMBLE 0x400000 /* Suppress preamble */
236#define MDIO_START 0x800000 /* Write 1 to initiate the MDIO master. And this bit is self cleared after one cycle*/
237#define MDIO_CLK_SEL_SHIFT 24
238#define MDIO_CLK_25_4 0
239#define MDIO_CLK_25_6 2
240#define MDIO_CLK_25_8 3
241#define MDIO_CLK_25_10 4
242#define MDIO_CLK_25_14 5
243#define MDIO_CLK_25_20 6
244#define MDIO_CLK_25_28 7
245#define MDIO_BUSY 0x8000000
246#define MDIO_AP_EN 0x10000000
247#define MDIO_WAIT_TIMES 10
248
249/* MII PHY Status Register */
250#define REG_PHY_STATUS 0x1418
251#define PHY_STATUS_100M 0x20000
252#define PHY_STATUS_EMI_CA 0x40000
253
254/* BIST Control and Status Register0 (for the Packet Memory) */
255#define REG_BIST0_CTRL 0x141c
256#define BIST0_NOW 0x1 /* 1: To trigger BIST0 logic. This bit stays high during the */
257/* BIST process and reset to zero when BIST is done */
258#define BIST0_SRAM_FAIL 0x2 /* 1: The SRAM failure is un-repairable because it has address */
259/* decoder failure or more than 1 cell stuck-to-x failure */
260#define BIST0_FUSE_FLAG 0x4 /* 1: Indicating one cell has been fixed */
261
262/* BIST Control and Status Register1(for the retry buffer of PCI Express) */
263#define REG_BIST1_CTRL 0x1420
264#define BIST1_NOW 0x1 /* 1: To trigger BIST0 logic. This bit stays high during the */
265/* BIST process and reset to zero when BIST is done */
266#define BIST1_SRAM_FAIL 0x2 /* 1: The SRAM failure is un-repairable because it has address */
267/* decoder failure or more than 1 cell stuck-to-x failure.*/
268#define BIST1_FUSE_FLAG 0x4
269
270/* SerDes Lock Detect Control and Status Register */
271#define REG_SERDES_LOCK 0x1424
272#define SERDES_LOCK_DETECT 1 /* 1: SerDes lock detected . This signal comes from Analog SerDes */
273#define SERDES_LOCK_DETECT_EN 2 /* 1: Enable SerDes Lock detect function */
274
275/* MAC Control Register */
276#define REG_MAC_CTRL 0x1480
277#define MAC_CTRL_TX_EN 1 /* 1: Transmit Enable */
278#define MAC_CTRL_RX_EN 2 /* 1: Receive Enable */
279#define MAC_CTRL_TX_FLOW 4 /* 1: Transmit Flow Control Enable */
280#define MAC_CTRL_RX_FLOW 8 /* 1: Receive Flow Control Enable */
281#define MAC_CTRL_LOOPBACK 0x10 /* 1: Loop back at G/MII Interface */
282#define MAC_CTRL_DUPLX 0x20 /* 1: Full-duplex mode 0: Half-duplex mode */
283#define MAC_CTRL_ADD_CRC 0x40 /* 1: Instruct MAC to attach CRC on all egress Ethernet frames */
284#define MAC_CTRL_PAD 0x80 /* 1: Instruct MAC to pad short frames to 60-bytes, and then attach CRC. This bit has higher priority over CRC_EN */
285#define MAC_CTRL_LENCHK 0x100 /* 1: Instruct MAC to check if length field matches the real packet length */
286#define MAC_CTRL_HUGE_EN 0x200 /* 1: receive Jumbo frame enable */
287#define MAC_CTRL_PRMLEN_SHIFT 10 /* Preamble length */
288#define MAC_CTRL_PRMLEN_MASK 0xf
289#define MAC_CTRL_RMV_VLAN 0x4000 /* 1: to remove VLAN Tag automatically from all receive packets */
290#define MAC_CTRL_PROMIS_EN 0x8000 /* 1: Promiscuous Mode Enable */
291#define MAC_CTRL_TX_PAUSE 0x10000 /* 1: transmit test pause */
292#define MAC_CTRL_SCNT 0x20000 /* 1: shortcut slot time counter */
293#define MAC_CTRL_SRST_TX 0x40000 /* 1: synchronized reset Transmit MAC module */
294#define MAC_CTRL_TX_SIMURST 0x80000 /* 1: transmit simulation reset */
295#define MAC_CTRL_SPEED_SHIFT 20 /* 10: gigabit 01:10M/100M */
296#define MAC_CTRL_SPEED_MASK 0x300000
297#define MAC_CTRL_SPEED_1000 2
298#define MAC_CTRL_SPEED_10_100 1
299#define MAC_CTRL_DBG_TX_BKPRESURE 0x400000 /* 1: transmit maximum backoff (half-duplex test bit) */
300#define MAC_CTRL_TX_HUGE 0x800000 /* 1: transmit huge enable */
301#define MAC_CTRL_RX_CHKSUM_EN 0x1000000 /* 1: RX checksum enable */
302#define MAC_CTRL_MC_ALL_EN 0x2000000 /* 1: upload all multicast frame without error to system */
303#define MAC_CTRL_BC_EN 0x4000000 /* 1: upload all broadcast frame without error to system */
304#define MAC_CTRL_DBG 0x8000000 /* 1: upload all received frame to system (Debug Mode) */
305
306/* MAC IPG/IFG Control Register */
307#define REG_MAC_IPG_IFG 0x1484
308#define MAC_IPG_IFG_IPGT_SHIFT 0 /* Desired back to back inter-packet gap. The default is 96-bit time */
309#define MAC_IPG_IFG_IPGT_MASK 0x7f
310#define MAC_IPG_IFG_MIFG_SHIFT 8 /* Minimum number of IFG to enforce in between RX frames */
311#define MAC_IPG_IFG_MIFG_MASK 0xff /* Frame gap below such IFP is dropped */
312#define MAC_IPG_IFG_IPGR1_SHIFT 16 /* 64bit Carrier-Sense window */
313#define MAC_IPG_IFG_IPGR1_MASK 0x7f
314#define MAC_IPG_IFG_IPGR2_SHIFT 24 /* 96-bit IPG window */
315#define MAC_IPG_IFG_IPGR2_MASK 0x7f
316
317/* MAC STATION ADDRESS */
318#define REG_MAC_STA_ADDR 0x1488
319
320/* Hash table for multicast address */
321#define REG_RX_HASH_TABLE 0x1490
322
323
324/* MAC Half-Duplex Control Register */
325#define REG_MAC_HALF_DUPLX_CTRL 0x1498
326#define MAC_HALF_DUPLX_CTRL_LCOL_SHIFT 0 /* Collision Window */
327#define MAC_HALF_DUPLX_CTRL_LCOL_MASK 0x3ff
328#define MAC_HALF_DUPLX_CTRL_RETRY_SHIFT 12 /* Retransmission maximum, afterwards the packet will be discarded */
329#define MAC_HALF_DUPLX_CTRL_RETRY_MASK 0xf
330#define MAC_HALF_DUPLX_CTRL_EXC_DEF_EN 0x10000 /* 1: Allow the transmission of a packet which has been excessively deferred */
331#define MAC_HALF_DUPLX_CTRL_NO_BACK_C 0x20000 /* 1: No back-off on collision, immediately start the retransmission */
332#define MAC_HALF_DUPLX_CTRL_NO_BACK_P 0x40000 /* 1: No back-off on backpressure, immediately start the transmission after back pressure */
333#define MAC_HALF_DUPLX_CTRL_ABEBE 0x80000 /* 1: Alternative Binary Exponential Back-off Enabled */
334#define MAC_HALF_DUPLX_CTRL_ABEBT_SHIFT 20 /* Maximum binary exponential number */
335#define MAC_HALF_DUPLX_CTRL_ABEBT_MASK 0xf
336#define MAC_HALF_DUPLX_CTRL_JAMIPG_SHIFT 24 /* IPG to start JAM for collision based flow control in half-duplex */
337#define MAC_HALF_DUPLX_CTRL_JAMIPG_MASK 0xf /* mode. In unit of 8-bit time */
338
339/* Maximum Frame Length Control Register */
340#define REG_MTU 0x149c
341
342/* Wake-On-Lan control register */
343#define REG_WOL_CTRL 0x14a0
344#define WOL_PATTERN_EN 0x00000001
345#define WOL_PATTERN_PME_EN 0x00000002
346#define WOL_MAGIC_EN 0x00000004
347#define WOL_MAGIC_PME_EN 0x00000008
348#define WOL_LINK_CHG_EN 0x00000010
349#define WOL_LINK_CHG_PME_EN 0x00000020
350#define WOL_PATTERN_ST 0x00000100
351#define WOL_MAGIC_ST 0x00000200
352#define WOL_LINKCHG_ST 0x00000400
353#define WOL_CLK_SWITCH_EN 0x00008000
354#define WOL_PT0_EN 0x00010000
355#define WOL_PT1_EN 0x00020000
356#define WOL_PT2_EN 0x00040000
357#define WOL_PT3_EN 0x00080000
358#define WOL_PT4_EN 0x00100000
359#define WOL_PT5_EN 0x00200000
360#define WOL_PT6_EN 0x00400000
361/* WOL Length ( 2 DWORD ) */
362#define REG_WOL_PATTERN_LEN 0x14a4
363#define WOL_PT_LEN_MASK 0x7f
364#define WOL_PT0_LEN_SHIFT 0
365#define WOL_PT1_LEN_SHIFT 8
366#define WOL_PT2_LEN_SHIFT 16
367#define WOL_PT3_LEN_SHIFT 24
368#define WOL_PT4_LEN_SHIFT 0
369#define WOL_PT5_LEN_SHIFT 8
370#define WOL_PT6_LEN_SHIFT 16
371
372/* Internal SRAM Partition Register */
373#define REG_SRAM_TRD_ADDR 0x1518
374#define REG_SRAM_TRD_LEN 0x151C
375#define REG_SRAM_RXF_ADDR 0x1520
376#define REG_SRAM_RXF_LEN 0x1524
377#define REG_SRAM_TXF_ADDR 0x1528
378#define REG_SRAM_TXF_LEN 0x152C
379#define REG_SRAM_TCPH_ADDR 0x1530
380#define REG_SRAM_PKTH_ADDR 0x1532
381
382/* Load Ptr Register */
383#define REG_LOAD_PTR 0x1534 /* Software sets this bit after the initialization of the head and tail */
384
385/*
386 * addresses of all descriptors, as well as the following descriptor
387 * control register, which triggers each function block to load the head
388 * pointer to prepare for the operation. This bit is then self-cleared
389 * after one cycle.
390 */
391
392/* Descriptor Control register */
393#define REG_RXF3_BASE_ADDR_HI 0x153C
394#define REG_DESC_BASE_ADDR_HI 0x1540
395#define REG_RXF0_BASE_ADDR_HI 0x1540 /* share with DESC BASE ADDR HI */
396#define REG_HOST_RXF0_PAGE0_LO 0x1544
397#define REG_HOST_RXF0_PAGE1_LO 0x1548
398#define REG_TPD_BASE_ADDR_LO 0x154C
399#define REG_RXF1_BASE_ADDR_HI 0x1550
400#define REG_RXF2_BASE_ADDR_HI 0x1554
401#define REG_HOST_RXFPAGE_SIZE 0x1558
402#define REG_TPD_RING_SIZE 0x155C
403/* RSS about */
404#define REG_RSS_KEY0 0x14B0
405#define REG_RSS_KEY1 0x14B4
406#define REG_RSS_KEY2 0x14B8
407#define REG_RSS_KEY3 0x14BC
408#define REG_RSS_KEY4 0x14C0
409#define REG_RSS_KEY5 0x14C4
410#define REG_RSS_KEY6 0x14C8
411#define REG_RSS_KEY7 0x14CC
412#define REG_RSS_KEY8 0x14D0
413#define REG_RSS_KEY9 0x14D4
414#define REG_IDT_TABLE4 0x14E0
415#define REG_IDT_TABLE5 0x14E4
416#define REG_IDT_TABLE6 0x14E8
417#define REG_IDT_TABLE7 0x14EC
418#define REG_IDT_TABLE0 0x1560
419#define REG_IDT_TABLE1 0x1564
420#define REG_IDT_TABLE2 0x1568
421#define REG_IDT_TABLE3 0x156C
422#define REG_IDT_TABLE REG_IDT_TABLE0
423#define REG_RSS_HASH_VALUE 0x1570
424#define REG_RSS_HASH_FLAG 0x1574
425#define REG_BASE_CPU_NUMBER 0x157C
426
427
428/* TXQ Control Register */
429#define REG_TXQ_CTRL 0x1580
430#define TXQ_CTRL_NUM_TPD_BURST_MASK 0xF
431#define TXQ_CTRL_NUM_TPD_BURST_SHIFT 0
432#define TXQ_CTRL_EN 0x20 /* 1: Enable TXQ */
433#define TXQ_CTRL_ENH_MODE 0x40 /* Performance enhancement mode, in which up to two back-to-back DMA read commands might be dispatched. */
434#define TXQ_CTRL_TXF_BURST_NUM_SHIFT 16 /* Number of data byte to read in a cache-aligned burst. Each SRAM entry is 8-byte in length. */
435#define TXQ_CTRL_TXF_BURST_NUM_MASK 0xffff
436
437/* Jumbo packet Threshold for task offload */
438#define REG_TX_EARLY_TH 0x1584 /* Jumbo frame threshold in QWORD unit. Packet greater than */
439/* JUMBO_TASK_OFFLOAD_THRESHOLD will not be task offloaded. */
440#define TX_TX_EARLY_TH_MASK 0x7ff
441#define TX_TX_EARLY_TH_SHIFT 0
442
443
444/* RXQ Control Register */
445#define REG_RXQ_CTRL 0x15A0
446#define RXQ_CTRL_PBA_ALIGN_32 0 /* rx-packet alignment */
447#define RXQ_CTRL_PBA_ALIGN_64 1
448#define RXQ_CTRL_PBA_ALIGN_128 2
449#define RXQ_CTRL_PBA_ALIGN_256 3
450#define RXQ_CTRL_Q1_EN 0x10
451#define RXQ_CTRL_Q2_EN 0x20
452#define RXQ_CTRL_Q3_EN 0x40
453#define RXQ_CTRL_IPV6_XSUM_VERIFY_EN 0x80
454#define RXQ_CTRL_HASH_TLEN_SHIFT 8
455#define RXQ_CTRL_HASH_TLEN_MASK 0xFF
456#define RXQ_CTRL_HASH_TYPE_IPV4 0x10000
457#define RXQ_CTRL_HASH_TYPE_IPV4_TCP 0x20000
458#define RXQ_CTRL_HASH_TYPE_IPV6 0x40000
459#define RXQ_CTRL_HASH_TYPE_IPV6_TCP 0x80000
460#define RXQ_CTRL_RSS_MODE_DISABLE 0
461#define RXQ_CTRL_RSS_MODE_SQSINT 0x4000000
462#define RXQ_CTRL_RSS_MODE_MQUESINT 0x8000000
463#define RXQ_CTRL_RSS_MODE_MQUEMINT 0xC000000
464#define RXQ_CTRL_NIP_QUEUE_SEL_TBL 0x10000000
465#define RXQ_CTRL_HASH_ENABLE 0x20000000
466#define RXQ_CTRL_CUT_THRU_EN 0x40000000
467#define RXQ_CTRL_EN 0x80000000
468
469/* Rx jumbo packet threshold and rrd retirement timer */
470#define REG_RXQ_JMBOSZ_RRDTIM 0x15A4
471/*
472 * Jumbo packet threshold for non-VLAN packet, in QWORD (64-bit) unit.
473 * When the packet length greater than or equal to this value, RXQ
474 * shall start cut-through forwarding of the received packet.
475 */
476#define RXQ_JMBOSZ_TH_MASK 0x7ff
477#define RXQ_JMBOSZ_TH_SHIFT 0 /* RRD retirement timer. Decrement by 1 after every 512ns passes*/
478#define RXQ_JMBO_LKAH_MASK 0xf
479#define RXQ_JMBO_LKAH_SHIFT 11
480
481/* RXF flow control register */
482#define REG_RXQ_RXF_PAUSE_THRESH 0x15A8
483#define RXQ_RXF_PAUSE_TH_HI_SHIFT 0
484#define RXQ_RXF_PAUSE_TH_HI_MASK 0xfff
485#define RXQ_RXF_PAUSE_TH_LO_SHIFT 16
486#define RXQ_RXF_PAUSE_TH_LO_MASK 0xfff
487
488
489/* DMA Engine Control Register */
490#define REG_DMA_CTRL 0x15C0
491#define DMA_CTRL_DMAR_IN_ORDER 0x1
492#define DMA_CTRL_DMAR_ENH_ORDER 0x2
493#define DMA_CTRL_DMAR_OUT_ORDER 0x4
494#define DMA_CTRL_RCB_VALUE 0x8
495#define DMA_CTRL_DMAR_BURST_LEN_SHIFT 4
496#define DMA_CTRL_DMAR_BURST_LEN_MASK 7
497#define DMA_CTRL_DMAW_BURST_LEN_SHIFT 7
498#define DMA_CTRL_DMAW_BURST_LEN_MASK 7
499#define DMA_CTRL_DMAR_REQ_PRI 0x400
500#define DMA_CTRL_DMAR_DLY_CNT_MASK 0x1F
501#define DMA_CTRL_DMAR_DLY_CNT_SHIFT 11
502#define DMA_CTRL_DMAW_DLY_CNT_MASK 0xF
503#define DMA_CTRL_DMAW_DLY_CNT_SHIFT 16
504#define DMA_CTRL_TXCMB_EN 0x100000
505#define DMA_CTRL_RXCMB_EN 0x200000
506
507
508/* CMB/SMB Control Register */
509#define REG_SMB_STAT_TIMER 0x15C4
510#define REG_TRIG_RRD_THRESH 0x15CA
511#define REG_TRIG_TPD_THRESH 0x15C8
512#define REG_TRIG_TXTIMER 0x15CC
513#define REG_TRIG_RXTIMER 0x15CE
514
515/* HOST RXF Page 1,2,3 address */
516#define REG_HOST_RXF1_PAGE0_LO 0x15D0
517#define REG_HOST_RXF1_PAGE1_LO 0x15D4
518#define REG_HOST_RXF2_PAGE0_LO 0x15D8
519#define REG_HOST_RXF2_PAGE1_LO 0x15DC
520#define REG_HOST_RXF3_PAGE0_LO 0x15E0
521#define REG_HOST_RXF3_PAGE1_LO 0x15E4
522
523/* Mail box */
524#define REG_MB_RXF1_RADDR 0x15B4
525#define REG_MB_RXF2_RADDR 0x15B8
526#define REG_MB_RXF3_RADDR 0x15BC
527#define REG_MB_TPD_PROD_IDX 0x15F0
528
529/* RXF-Page 0-3 PageNo & Valid bit */
530#define REG_HOST_RXF0_PAGE0_VLD 0x15F4
531#define HOST_RXF_VALID 1
532#define HOST_RXF_PAGENO_SHIFT 1
533#define HOST_RXF_PAGENO_MASK 0x7F
534#define REG_HOST_RXF0_PAGE1_VLD 0x15F5
535#define REG_HOST_RXF1_PAGE0_VLD 0x15F6
536#define REG_HOST_RXF1_PAGE1_VLD 0x15F7
537#define REG_HOST_RXF2_PAGE0_VLD 0x15F8
538#define REG_HOST_RXF2_PAGE1_VLD 0x15F9
539#define REG_HOST_RXF3_PAGE0_VLD 0x15FA
540#define REG_HOST_RXF3_PAGE1_VLD 0x15FB
541
542/* Interrupt Status Register */
543#define REG_ISR 0x1600
544#define ISR_SMB 1
545#define ISR_TIMER 2 /* Interrupt when Timer is counted down to zero */
546/*
547 * Software manual interrupt, for debug. Set when SW_MAN_INT_EN is set
548 * in Table 51 Selene Master Control Register (Offset 0x1400).
549 */
550#define ISR_MANUAL 4
551#define ISR_HW_RXF_OV 8 /* RXF overflow interrupt */
552#define ISR_HOST_RXF0_OV 0x10
553#define ISR_HOST_RXF1_OV 0x20
554#define ISR_HOST_RXF2_OV 0x40
555#define ISR_HOST_RXF3_OV 0x80
556#define ISR_TXF_UN 0x100
557#define ISR_RX0_PAGE_FULL 0x200
558#define ISR_DMAR_TO_RST 0x400
559#define ISR_DMAW_TO_RST 0x800
560#define ISR_GPHY 0x1000
561#define ISR_TX_CREDIT 0x2000
562#define ISR_GPHY_LPW 0x4000 /* GPHY low power state interrupt */
563#define ISR_RX_PKT 0x10000 /* One packet received, triggered by RFD */
564#define ISR_TX_PKT 0x20000 /* One packet transmitted, triggered by TPD */
565#define ISR_TX_DMA 0x40000
566#define ISR_RX_PKT_1 0x80000
567#define ISR_RX_PKT_2 0x100000
568#define ISR_RX_PKT_3 0x200000
569#define ISR_MAC_RX 0x400000
570#define ISR_MAC_TX 0x800000
571#define ISR_UR_DETECTED 0x1000000
572#define ISR_FERR_DETECTED 0x2000000
573#define ISR_NFERR_DETECTED 0x4000000
574#define ISR_CERR_DETECTED 0x8000000
575#define ISR_PHY_LINKDOWN 0x10000000
576#define ISR_DIS_INT 0x80000000
577
578
579/* Interrupt Mask Register */
580#define REG_IMR 0x1604
581
582
583#define IMR_NORMAL_MASK (\
584 ISR_SMB |\
585 ISR_TXF_UN |\
586 ISR_HW_RXF_OV |\
587 ISR_HOST_RXF0_OV|\
588 ISR_MANUAL |\
589 ISR_GPHY |\
590 ISR_GPHY_LPW |\
591 ISR_DMAR_TO_RST |\
592 ISR_DMAW_TO_RST |\
593 ISR_PHY_LINKDOWN|\
594 ISR_RX_PKT |\
595 ISR_TX_PKT)
596
597#define ISR_TX_EVENT (ISR_TXF_UN | ISR_TX_PKT)
598#define ISR_RX_EVENT (ISR_HOST_RXF0_OV | ISR_HW_RXF_OV | ISR_RX_PKT)
599
600#define REG_MAC_RX_STATUS_BIN 0x1700
601#define REG_MAC_RX_STATUS_END 0x175c
602#define REG_MAC_TX_STATUS_BIN 0x1760
603#define REG_MAC_TX_STATUS_END 0x17c0
604
605/* Hardware Offset Register */
606#define REG_HOST_RXF0_PAGEOFF 0x1800
607#define REG_TPD_CONS_IDX 0x1804
608#define REG_HOST_RXF1_PAGEOFF 0x1808
609#define REG_HOST_RXF2_PAGEOFF 0x180C
610#define REG_HOST_RXF3_PAGEOFF 0x1810
611
612/* RXF-Page 0-3 Offset DMA Address */
613#define REG_HOST_RXF0_MB0_LO 0x1820
614#define REG_HOST_RXF0_MB1_LO 0x1824
615#define REG_HOST_RXF1_MB0_LO 0x1828
616#define REG_HOST_RXF1_MB1_LO 0x182C
617#define REG_HOST_RXF2_MB0_LO 0x1830
618#define REG_HOST_RXF2_MB1_LO 0x1834
619#define REG_HOST_RXF3_MB0_LO 0x1838
620#define REG_HOST_RXF3_MB1_LO 0x183C
621
622/* Tpd CMB DMA Address */
623#define REG_HOST_TX_CMB_LO 0x1840
624#define REG_HOST_SMB_ADDR_LO 0x1844
625
626/* DEBUG ADDR */
627#define REG_DEBUG_DATA0 0x1900
628#define REG_DEBUG_DATA1 0x1904
629
630/***************************** MII definition ***************************************/
631/* PHY Common Register */
632#define MII_BMCR 0x00
633#define MII_BMSR 0x01
634#define MII_PHYSID1 0x02
635#define MII_PHYSID2 0x03
636#define MII_ADVERTISE 0x04
637#define MII_LPA 0x05
638#define MII_EXPANSION 0x06
639#define MII_AT001_CR 0x09
640#define MII_AT001_SR 0x0A
641#define MII_AT001_ESR 0x0F
642#define MII_AT001_PSCR 0x10
643#define MII_AT001_PSSR 0x11
644#define MII_INT_CTRL 0x12
645#define MII_INT_STATUS 0x13
646#define MII_SMARTSPEED 0x14
647#define MII_RERRCOUNTER 0x15
648#define MII_SREVISION 0x16
649#define MII_RESV1 0x17
650#define MII_LBRERROR 0x18
651#define MII_PHYADDR 0x19
652#define MII_RESV2 0x1a
653#define MII_TPISTATUS 0x1b
654#define MII_NCONFIG 0x1c
655
656#define MII_DBG_ADDR 0x1D
657#define MII_DBG_DATA 0x1E
658
659
660/* PHY Control Register */
661#define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */
662#define MII_CR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */
663#define MII_CR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */
664#define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */
665#define MII_CR_ISOLATE 0x0400 /* Isolate PHY from MII */
666#define MII_CR_POWER_DOWN 0x0800 /* Power down */
667#define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */
668#define MII_CR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */
669#define MII_CR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */
670#define MII_CR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */
671#define MII_CR_SPEED_MASK 0x2040
672#define MII_CR_SPEED_1000 0x0040
673#define MII_CR_SPEED_100 0x2000
674#define MII_CR_SPEED_10 0x0000
675
676
677/* PHY Status Register */
678#define MII_SR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */
679#define MII_SR_JABBER_DETECT 0x0002 /* Jabber Detected */
680#define MII_SR_LINK_STATUS 0x0004 /* Link Status 1 = link */
681#define MII_SR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */
682#define MII_SR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */
683#define MII_SR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */
684#define MII_SR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */
685#define MII_SR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */
686#define MII_SR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */
687#define MII_SR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */
688#define MII_SR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */
689#define MII_SR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */
690#define MII_SR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */
691#define MII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */
692#define MII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */
693
694/* Link partner ability register. */
695#define MII_LPA_SLCT 0x001f /* Same as advertise selector */
696#define MII_LPA_10HALF 0x0020 /* Can do 10mbps half-duplex */
697#define MII_LPA_10FULL 0x0040 /* Can do 10mbps full-duplex */
698#define MII_LPA_100HALF 0x0080 /* Can do 100mbps half-duplex */
699#define MII_LPA_100FULL 0x0100 /* Can do 100mbps full-duplex */
700#define MII_LPA_100BASE4 0x0200 /* 100BASE-T4 */
701#define MII_LPA_PAUSE 0x0400 /* PAUSE */
702#define MII_LPA_ASYPAUSE 0x0800 /* Asymmetrical PAUSE */
703#define MII_LPA_RFAULT 0x2000 /* Link partner faulted */
704#define MII_LPA_LPACK 0x4000 /* Link partner acked us */
705#define MII_LPA_NPAGE 0x8000 /* Next page bit */
706
707/* Autoneg Advertisement Register */
708#define MII_AR_SELECTOR_FIELD 0x0001 /* indicates IEEE 802.3 CSMA/CD */
709#define MII_AR_10T_HD_CAPS 0x0020 /* 10T Half Duplex Capable */
710#define MII_AR_10T_FD_CAPS 0x0040 /* 10T Full Duplex Capable */
711#define MII_AR_100TX_HD_CAPS 0x0080 /* 100TX Half Duplex Capable */
712#define MII_AR_100TX_FD_CAPS 0x0100 /* 100TX Full Duplex Capable */
713#define MII_AR_100T4_CAPS 0x0200 /* 100T4 Capable */
714#define MII_AR_PAUSE 0x0400 /* Pause operation desired */
715#define MII_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */
716#define MII_AR_REMOTE_FAULT 0x2000 /* Remote Fault detected */
717#define MII_AR_NEXT_PAGE 0x8000 /* Next Page ability supported */
718#define MII_AR_SPEED_MASK 0x01E0
719#define MII_AR_DEFAULT_CAP_MASK 0x0DE0
720
721/* 1000BASE-T Control Register */
722#define MII_AT001_CR_1000T_HD_CAPS 0x0100 /* Advertise 1000T HD capability */
723#define MII_AT001_CR_1000T_FD_CAPS 0x0200 /* Advertise 1000T FD capability */
724#define MII_AT001_CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port */
725/* 0=DTE device */
726#define MII_AT001_CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master */
727/* 0=Configure PHY as Slave */
728#define MII_AT001_CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value */
729/* 0=Automatic Master/Slave config */
730#define MII_AT001_CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */
731#define MII_AT001_CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */
732#define MII_AT001_CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */
733#define MII_AT001_CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */
734#define MII_AT001_CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */
735#define MII_AT001_CR_1000T_SPEED_MASK 0x0300
736#define MII_AT001_CR_1000T_DEFAULT_CAP_MASK 0x0300
737
738/* 1000BASE-T Status Register */
739#define MII_AT001_SR_1000T_LP_HD_CAPS 0x0400 /* LP is 1000T HD capable */
740#define MII_AT001_SR_1000T_LP_FD_CAPS 0x0800 /* LP is 1000T FD capable */
741#define MII_AT001_SR_1000T_REMOTE_RX_STATUS 0x1000 /* Remote receiver OK */
742#define MII_AT001_SR_1000T_LOCAL_RX_STATUS 0x2000 /* Local receiver OK */
743#define MII_AT001_SR_1000T_MS_CONFIG_RES 0x4000 /* 1=Local TX is Master, 0=Slave */
744#define MII_AT001_SR_1000T_MS_CONFIG_FAULT 0x8000 /* Master/Slave config fault */
745#define MII_AT001_SR_1000T_REMOTE_RX_STATUS_SHIFT 12
746#define MII_AT001_SR_1000T_LOCAL_RX_STATUS_SHIFT 13
747
748/* Extended Status Register */
749#define MII_AT001_ESR_1000T_HD_CAPS 0x1000 /* 1000T HD capable */
750#define MII_AT001_ESR_1000T_FD_CAPS 0x2000 /* 1000T FD capable */
751#define MII_AT001_ESR_1000X_HD_CAPS 0x4000 /* 1000X HD capable */
752#define MII_AT001_ESR_1000X_FD_CAPS 0x8000 /* 1000X FD capable */
753
754/* AT001 PHY Specific Control Register */
755#define MII_AT001_PSCR_JABBER_DISABLE 0x0001 /* 1=Jabber Function disabled */
756#define MII_AT001_PSCR_POLARITY_REVERSAL 0x0002 /* 1=Polarity Reversal enabled */
757#define MII_AT001_PSCR_SQE_TEST 0x0004 /* 1=SQE Test enabled */
758#define MII_AT001_PSCR_MAC_POWERDOWN 0x0008
759#define MII_AT001_PSCR_CLK125_DISABLE 0x0010 /* 1=CLK125 low,
760 * 0=CLK125 toggling
761 */
762#define MII_AT001_PSCR_MDI_MANUAL_MODE 0x0000 /* MDI Crossover Mode bits 6:5 */
763/* Manual MDI configuration */
764#define MII_AT001_PSCR_MDIX_MANUAL_MODE 0x0020 /* Manual MDIX configuration */
765#define MII_AT001_PSCR_AUTO_X_1000T 0x0040 /* 1000BASE-T: Auto crossover,
766 * 100BASE-TX/10BASE-T:
767 * MDI Mode
768 */
769#define MII_AT001_PSCR_AUTO_X_MODE 0x0060 /* Auto crossover enabled
770 * all speeds.
771 */
772#define MII_AT001_PSCR_10BT_EXT_DIST_ENABLE 0x0080
773/* 1=Enable Extended 10BASE-T distance
774 * (Lower 10BASE-T RX Threshold)
775 * 0=Normal 10BASE-T RX Threshold */
776#define MII_AT001_PSCR_MII_5BIT_ENABLE 0x0100
777/* 1=5-Bit interface in 100BASE-TX
778 * 0=MII interface in 100BASE-TX */
779#define MII_AT001_PSCR_SCRAMBLER_DISABLE 0x0200 /* 1=Scrambler disable */
780#define MII_AT001_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force link good */
781#define MII_AT001_PSCR_ASSERT_CRS_ON_TX 0x0800 /* 1=Assert CRS on Transmit */
782#define MII_AT001_PSCR_POLARITY_REVERSAL_SHIFT 1
783#define MII_AT001_PSCR_AUTO_X_MODE_SHIFT 5
784#define MII_AT001_PSCR_10BT_EXT_DIST_ENABLE_SHIFT 7
785/* AT001 PHY Specific Status Register */
786#define MII_AT001_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */
787#define MII_AT001_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */
788#define MII_AT001_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */
789#define MII_AT001_PSSR_10MBS 0x0000 /* 00=10Mbs */
790#define MII_AT001_PSSR_100MBS 0x4000 /* 01=100Mbs */
791#define MII_AT001_PSSR_1000MBS 0x8000 /* 10=1000Mbs */
792
793#endif /*_ATHL1E_HW_H_*/
diff --git a/drivers/net/atl1e/atl1e_main.c b/drivers/net/atl1e/atl1e_main.c
new file mode 100644
index 000000000000..35264c244cfd
--- /dev/null
+++ b/drivers/net/atl1e/atl1e_main.c
@@ -0,0 +1,2599 @@
1/*
2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
3 *
4 * Derived from Intel e1000 driver
5 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21
22#include "atl1e.h"
23
24#define DRV_VERSION "1.0.0.7-NAPI"
25
26char atl1e_driver_name[] = "ATL1E";
27char atl1e_driver_version[] = DRV_VERSION;
28#define PCI_DEVICE_ID_ATTANSIC_L1E 0x1026
29/*
30 * atl1e_pci_tbl - PCI Device ID Table
31 *
32 * Wildcard entries (PCI_ANY_ID) should come last
33 * Last entry must be all 0s
34 *
35 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
36 * Class, Class Mask, private data (not used) }
37 */
38static struct pci_device_id atl1e_pci_tbl[] = {
39 {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1E)},
40 /* required last entry */
41 { 0 }
42};
43MODULE_DEVICE_TABLE(pci, atl1e_pci_tbl);
44
45MODULE_AUTHOR("Atheros Corporation, <xiong.huang@atheros.com>, Jie Yang <jie.yang@atheros.com>");
46MODULE_DESCRIPTION("Atheros 1000M Ethernet Network Driver");
47MODULE_LICENSE("GPL");
48MODULE_VERSION(DRV_VERSION);
49
50static inline void atl1e_setup_mac_ctrl(struct atl1e_adapter *adapter);
51
52static const u16
53atl1e_rx_page_vld_regs[AT_MAX_RECEIVE_QUEUE][AT_PAGE_NUM_PER_QUEUE] =
54{
55 {REG_HOST_RXF0_PAGE0_VLD, REG_HOST_RXF0_PAGE1_VLD},
56 {REG_HOST_RXF1_PAGE0_VLD, REG_HOST_RXF1_PAGE1_VLD},
57 {REG_HOST_RXF2_PAGE0_VLD, REG_HOST_RXF2_PAGE1_VLD},
58 {REG_HOST_RXF3_PAGE0_VLD, REG_HOST_RXF3_PAGE1_VLD}
59};
60
61static const u16 atl1e_rx_page_hi_addr_regs[AT_MAX_RECEIVE_QUEUE] =
62{
63 REG_RXF0_BASE_ADDR_HI,
64 REG_RXF1_BASE_ADDR_HI,
65 REG_RXF2_BASE_ADDR_HI,
66 REG_RXF3_BASE_ADDR_HI
67};
68
69static const u16
70atl1e_rx_page_lo_addr_regs[AT_MAX_RECEIVE_QUEUE][AT_PAGE_NUM_PER_QUEUE] =
71{
72 {REG_HOST_RXF0_PAGE0_LO, REG_HOST_RXF0_PAGE1_LO},
73 {REG_HOST_RXF1_PAGE0_LO, REG_HOST_RXF1_PAGE1_LO},
74 {REG_HOST_RXF2_PAGE0_LO, REG_HOST_RXF2_PAGE1_LO},
75 {REG_HOST_RXF3_PAGE0_LO, REG_HOST_RXF3_PAGE1_LO}
76};
77
78static const u16
79atl1e_rx_page_write_offset_regs[AT_MAX_RECEIVE_QUEUE][AT_PAGE_NUM_PER_QUEUE] =
80{
81 {REG_HOST_RXF0_MB0_LO, REG_HOST_RXF0_MB1_LO},
82 {REG_HOST_RXF1_MB0_LO, REG_HOST_RXF1_MB1_LO},
83 {REG_HOST_RXF2_MB0_LO, REG_HOST_RXF2_MB1_LO},
84 {REG_HOST_RXF3_MB0_LO, REG_HOST_RXF3_MB1_LO}
85};
86
87static const u16 atl1e_pay_load_size[] = {
88 128, 256, 512, 1024, 2048, 4096,
89};
90
91/*
92 * atl1e_irq_enable - Enable default interrupt generation settings
93 * @adapter: board private structure
94 */
95static inline void atl1e_irq_enable(struct atl1e_adapter *adapter)
96{
97 if (likely(atomic_dec_and_test(&adapter->irq_sem))) {
98 AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
99 AT_WRITE_REG(&adapter->hw, REG_IMR, IMR_NORMAL_MASK);
100 AT_WRITE_FLUSH(&adapter->hw);
101 }
102}
103
104/*
105 * atl1e_irq_disable - Mask off interrupt generation on the NIC
106 * @adapter: board private structure
107 */
108static inline void atl1e_irq_disable(struct atl1e_adapter *adapter)
109{
110 atomic_inc(&adapter->irq_sem);
111 AT_WRITE_REG(&adapter->hw, REG_IMR, 0);
112 AT_WRITE_FLUSH(&adapter->hw);
113 synchronize_irq(adapter->pdev->irq);
114}
115
116/*
117 * atl1e_irq_reset - reset interrupt confiure on the NIC
118 * @adapter: board private structure
119 */
120static inline void atl1e_irq_reset(struct atl1e_adapter *adapter)
121{
122 atomic_set(&adapter->irq_sem, 0);
123 AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
124 AT_WRITE_REG(&adapter->hw, REG_IMR, 0);
125 AT_WRITE_FLUSH(&adapter->hw);
126}
127
128/*
129 * atl1e_phy_config - Timer Call-back
130 * @data: pointer to netdev cast into an unsigned long
131 */
132static void atl1e_phy_config(unsigned long data)
133{
134 struct atl1e_adapter *adapter = (struct atl1e_adapter *) data;
135 struct atl1e_hw *hw = &adapter->hw;
136 unsigned long flags;
137
138 spin_lock_irqsave(&adapter->mdio_lock, flags);
139 atl1e_restart_autoneg(hw);
140 spin_unlock_irqrestore(&adapter->mdio_lock, flags);
141}
142
143void atl1e_reinit_locked(struct atl1e_adapter *adapter)
144{
145
146 WARN_ON(in_interrupt());
147 while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
148 msleep(1);
149 atl1e_down(adapter);
150 atl1e_up(adapter);
151 clear_bit(__AT_RESETTING, &adapter->flags);
152}
153
154static void atl1e_reset_task(struct work_struct *work)
155{
156 struct atl1e_adapter *adapter;
157 adapter = container_of(work, struct atl1e_adapter, reset_task);
158
159 atl1e_reinit_locked(adapter);
160}
161
162static int atl1e_check_link(struct atl1e_adapter *adapter)
163{
164 struct atl1e_hw *hw = &adapter->hw;
165 struct net_device *netdev = adapter->netdev;
166 struct pci_dev *pdev = adapter->pdev;
167 int err = 0;
168 u16 speed, duplex, phy_data;
169
170 /* MII_BMSR must read twise */
171 atl1e_read_phy_reg(hw, MII_BMSR, &phy_data);
172 atl1e_read_phy_reg(hw, MII_BMSR, &phy_data);
173 if ((phy_data & BMSR_LSTATUS) == 0) {
174 /* link down */
175 if (netif_carrier_ok(netdev)) { /* old link state: Up */
176 u32 value;
177 /* disable rx */
178 value = AT_READ_REG(hw, REG_MAC_CTRL);
179 value &= ~MAC_CTRL_RX_EN;
180 AT_WRITE_REG(hw, REG_MAC_CTRL, value);
181 adapter->link_speed = SPEED_0;
182 netif_carrier_off(netdev);
183 netif_stop_queue(netdev);
184 }
185 } else {
186 /* Link Up */
187 err = atl1e_get_speed_and_duplex(hw, &speed, &duplex);
188 if (unlikely(err))
189 return err;
190
191 /* link result is our setting */
192 if (adapter->link_speed != speed ||
193 adapter->link_duplex != duplex) {
194 adapter->link_speed = speed;
195 adapter->link_duplex = duplex;
196 atl1e_setup_mac_ctrl(adapter);
197 dev_info(&pdev->dev,
198 "%s: %s NIC Link is Up<%d Mbps %s>\n",
199 atl1e_driver_name, netdev->name,
200 adapter->link_speed,
201 adapter->link_duplex == FULL_DUPLEX ?
202 "Full Duplex" : "Half Duplex");
203 }
204
205 if (!netif_carrier_ok(netdev)) {
206 /* Link down -> Up */
207 netif_carrier_on(netdev);
208 netif_wake_queue(netdev);
209 }
210 }
211 return 0;
212}
213
214/*
215 * atl1e_link_chg_task - deal with link change event Out of interrupt context
216 * @netdev: network interface device structure
217 */
218static void atl1e_link_chg_task(struct work_struct *work)
219{
220 struct atl1e_adapter *adapter;
221 unsigned long flags;
222
223 adapter = container_of(work, struct atl1e_adapter, link_chg_task);
224 spin_lock_irqsave(&adapter->mdio_lock, flags);
225 atl1e_check_link(adapter);
226 spin_unlock_irqrestore(&adapter->mdio_lock, flags);
227}
228
229static void atl1e_link_chg_event(struct atl1e_adapter *adapter)
230{
231 struct net_device *netdev = adapter->netdev;
232 struct pci_dev *pdev = adapter->pdev;
233 u16 phy_data = 0;
234 u16 link_up = 0;
235
236 spin_lock(&adapter->mdio_lock);
237 atl1e_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
238 atl1e_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
239 spin_unlock(&adapter->mdio_lock);
240 link_up = phy_data & BMSR_LSTATUS;
241 /* notify upper layer link down ASAP */
242 if (!link_up) {
243 if (netif_carrier_ok(netdev)) {
244 /* old link state: Up */
245 dev_info(&pdev->dev, "%s: %s NIC Link is Down\n",
246 atl1e_driver_name, netdev->name);
247 adapter->link_speed = SPEED_0;
248 netif_stop_queue(netdev);
249 }
250 }
251 schedule_work(&adapter->link_chg_task);
252}
253
254static void atl1e_del_timer(struct atl1e_adapter *adapter)
255{
256 del_timer_sync(&adapter->phy_config_timer);
257}
258
259static void atl1e_cancel_work(struct atl1e_adapter *adapter)
260{
261 cancel_work_sync(&adapter->reset_task);
262 cancel_work_sync(&adapter->link_chg_task);
263}
264
265/*
266 * atl1e_tx_timeout - Respond to a Tx Hang
267 * @netdev: network interface device structure
268 */
269static void atl1e_tx_timeout(struct net_device *netdev)
270{
271 struct atl1e_adapter *adapter = netdev_priv(netdev);
272
273 /* Do the reset outside of interrupt context */
274 schedule_work(&adapter->reset_task);
275}
276
277/*
278 * atl1e_set_multi - Multicast and Promiscuous mode set
279 * @netdev: network interface device structure
280 *
281 * The set_multi entry point is called whenever the multicast address
282 * list or the network interface flags are updated. This routine is
283 * responsible for configuring the hardware for proper multicast,
284 * promiscuous mode, and all-multi behavior.
285 */
286static void atl1e_set_multi(struct net_device *netdev)
287{
288 struct atl1e_adapter *adapter = netdev_priv(netdev);
289 struct atl1e_hw *hw = &adapter->hw;
290 struct dev_mc_list *mc_ptr;
291 u32 mac_ctrl_data = 0;
292 u32 hash_value;
293
294 /* Check for Promiscuous and All Multicast modes */
295 mac_ctrl_data = AT_READ_REG(hw, REG_MAC_CTRL);
296
297 if (netdev->flags & IFF_PROMISC) {
298 mac_ctrl_data |= MAC_CTRL_PROMIS_EN;
299 } else if (netdev->flags & IFF_ALLMULTI) {
300 mac_ctrl_data |= MAC_CTRL_MC_ALL_EN;
301 mac_ctrl_data &= ~MAC_CTRL_PROMIS_EN;
302 } else {
303 mac_ctrl_data &= ~(MAC_CTRL_PROMIS_EN | MAC_CTRL_MC_ALL_EN);
304 }
305
306 AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
307
308 /* clear the old settings from the multicast hash table */
309 AT_WRITE_REG(hw, REG_RX_HASH_TABLE, 0);
310 AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, 1, 0);
311
312 /* comoute mc addresses' hash value ,and put it into hash table */
313 for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) {
314 hash_value = atl1e_hash_mc_addr(hw, mc_ptr->dmi_addr);
315 atl1e_hash_set(hw, hash_value);
316 }
317}
318
319static void atl1e_vlan_rx_register(struct net_device *netdev,
320 struct vlan_group *grp)
321{
322 struct atl1e_adapter *adapter = netdev_priv(netdev);
323 struct pci_dev *pdev = adapter->pdev;
324 u32 mac_ctrl_data = 0;
325
326 dev_dbg(&pdev->dev, "atl1e_vlan_rx_register\n");
327
328 atl1e_irq_disable(adapter);
329
330 adapter->vlgrp = grp;
331 mac_ctrl_data = AT_READ_REG(&adapter->hw, REG_MAC_CTRL);
332
333 if (grp) {
334 /* enable VLAN tag insert/strip */
335 mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
336 } else {
337 /* disable VLAN tag insert/strip */
338 mac_ctrl_data &= ~MAC_CTRL_RMV_VLAN;
339 }
340
341 AT_WRITE_REG(&adapter->hw, REG_MAC_CTRL, mac_ctrl_data);
342 atl1e_irq_enable(adapter);
343}
344
345static void atl1e_restore_vlan(struct atl1e_adapter *adapter)
346{
347 struct pci_dev *pdev = adapter->pdev;
348
349 dev_dbg(&pdev->dev, "atl1e_restore_vlan !");
350 atl1e_vlan_rx_register(adapter->netdev, adapter->vlgrp);
351}
352/*
353 * atl1e_set_mac - Change the Ethernet Address of the NIC
354 * @netdev: network interface device structure
355 * @p: pointer to an address structure
356 *
357 * Returns 0 on success, negative on failure
358 */
359static int atl1e_set_mac_addr(struct net_device *netdev, void *p)
360{
361 struct atl1e_adapter *adapter = netdev_priv(netdev);
362 struct sockaddr *addr = p;
363
364 if (!is_valid_ether_addr(addr->sa_data))
365 return -EADDRNOTAVAIL;
366
367 if (netif_running(netdev))
368 return -EBUSY;
369
370 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
371 memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
372
373 atl1e_hw_set_mac_addr(&adapter->hw);
374
375 return 0;
376}
377
378/*
379 * atl1e_change_mtu - Change the Maximum Transfer Unit
380 * @netdev: network interface device structure
381 * @new_mtu: new value for maximum frame size
382 *
383 * Returns 0 on success, negative on failure
384 */
385static int atl1e_change_mtu(struct net_device *netdev, int new_mtu)
386{
387 struct atl1e_adapter *adapter = netdev_priv(netdev);
388 int old_mtu = netdev->mtu;
389 int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
390
391 if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
392 (max_frame > MAX_JUMBO_FRAME_SIZE)) {
393 dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
394 return -EINVAL;
395 }
396 /* set MTU */
397 if (old_mtu != new_mtu && netif_running(netdev)) {
398 while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
399 msleep(1);
400 netdev->mtu = new_mtu;
401 adapter->hw.max_frame_size = new_mtu;
402 adapter->hw.rx_jumbo_th = (max_frame + 7) >> 3;
403 atl1e_down(adapter);
404 atl1e_up(adapter);
405 clear_bit(__AT_RESETTING, &adapter->flags);
406 }
407 return 0;
408}
409
410/*
411 * caller should hold mdio_lock
412 */
413static int atl1e_mdio_read(struct net_device *netdev, int phy_id, int reg_num)
414{
415 struct atl1e_adapter *adapter = netdev_priv(netdev);
416 u16 result;
417
418 atl1e_read_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, &result);
419 return result;
420}
421
422static void atl1e_mdio_write(struct net_device *netdev, int phy_id,
423 int reg_num, int val)
424{
425 struct atl1e_adapter *adapter = netdev_priv(netdev);
426
427 atl1e_write_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, val);
428}
429
430/*
431 * atl1e_mii_ioctl -
432 * @netdev:
433 * @ifreq:
434 * @cmd:
435 */
436static int atl1e_mii_ioctl(struct net_device *netdev,
437 struct ifreq *ifr, int cmd)
438{
439 struct atl1e_adapter *adapter = netdev_priv(netdev);
440 struct pci_dev *pdev = adapter->pdev;
441 struct mii_ioctl_data *data = if_mii(ifr);
442 unsigned long flags;
443 int retval = 0;
444
445 if (!netif_running(netdev))
446 return -EINVAL;
447
448 spin_lock_irqsave(&adapter->mdio_lock, flags);
449 switch (cmd) {
450 case SIOCGMIIPHY:
451 data->phy_id = 0;
452 break;
453
454 case SIOCGMIIREG:
455 if (!capable(CAP_NET_ADMIN)) {
456 retval = -EPERM;
457 goto out;
458 }
459 if (atl1e_read_phy_reg(&adapter->hw, data->reg_num & 0x1F,
460 &data->val_out)) {
461 retval = -EIO;
462 goto out;
463 }
464 break;
465
466 case SIOCSMIIREG:
467 if (!capable(CAP_NET_ADMIN)) {
468 retval = -EPERM;
469 goto out;
470 }
471 if (data->reg_num & ~(0x1F)) {
472 retval = -EFAULT;
473 goto out;
474 }
475
476 dev_dbg(&pdev->dev, "<atl1e_mii_ioctl> write %x %x",
477 data->reg_num, data->val_in);
478 if (atl1e_write_phy_reg(&adapter->hw,
479 data->reg_num, data->val_in)) {
480 retval = -EIO;
481 goto out;
482 }
483 break;
484
485 default:
486 retval = -EOPNOTSUPP;
487 break;
488 }
489out:
490 spin_unlock_irqrestore(&adapter->mdio_lock, flags);
491 return retval;
492
493}
494
495/*
496 * atl1e_ioctl -
497 * @netdev:
498 * @ifreq:
499 * @cmd:
500 */
501static int atl1e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
502{
503 switch (cmd) {
504 case SIOCGMIIPHY:
505 case SIOCGMIIREG:
506 case SIOCSMIIREG:
507 return atl1e_mii_ioctl(netdev, ifr, cmd);
508 default:
509 return -EOPNOTSUPP;
510 }
511}
512
513static void atl1e_setup_pcicmd(struct pci_dev *pdev)
514{
515 u16 cmd;
516
517 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
518 cmd &= ~(PCI_COMMAND_INTX_DISABLE | PCI_COMMAND_IO);
519 cmd |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
520 pci_write_config_word(pdev, PCI_COMMAND, cmd);
521
522 /*
523 * some motherboards BIOS(PXE/EFI) driver may set PME
524 * while they transfer control to OS (Windows/Linux)
525 * so we should clear this bit before NIC work normally
526 */
527 pci_write_config_dword(pdev, REG_PM_CTRLSTAT, 0);
528 msleep(1);
529}
530
531/*
532 * atl1e_alloc_queues - Allocate memory for all rings
533 * @adapter: board private structure to initialize
534 *
535 */
536static int __devinit atl1e_alloc_queues(struct atl1e_adapter *adapter)
537{
538 return 0;
539}
540
541/*
542 * atl1e_sw_init - Initialize general software structures (struct atl1e_adapter)
543 * @adapter: board private structure to initialize
544 *
545 * atl1e_sw_init initializes the Adapter private data structure.
546 * Fields are initialized based on PCI device information and
547 * OS network device settings (MTU size).
548 */
549static int __devinit atl1e_sw_init(struct atl1e_adapter *adapter)
550{
551 struct atl1e_hw *hw = &adapter->hw;
552 struct pci_dev *pdev = adapter->pdev;
553 u32 phy_status_data = 0;
554
555 adapter->wol = 0;
556 adapter->link_speed = SPEED_0; /* hardware init */
557 adapter->link_duplex = FULL_DUPLEX;
558 adapter->num_rx_queues = 1;
559
560 /* PCI config space info */
561 hw->vendor_id = pdev->vendor;
562 hw->device_id = pdev->device;
563 hw->subsystem_vendor_id = pdev->subsystem_vendor;
564 hw->subsystem_id = pdev->subsystem_device;
565
566 pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id);
567 pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
568
569 phy_status_data = AT_READ_REG(hw, REG_PHY_STATUS);
570 /* nic type */
571 if (hw->revision_id >= 0xF0) {
572 hw->nic_type = athr_l2e_revB;
573 } else {
574 if (phy_status_data & PHY_STATUS_100M)
575 hw->nic_type = athr_l1e;
576 else
577 hw->nic_type = athr_l2e_revA;
578 }
579
580 phy_status_data = AT_READ_REG(hw, REG_PHY_STATUS);
581
582 if (phy_status_data & PHY_STATUS_EMI_CA)
583 hw->emi_ca = true;
584 else
585 hw->emi_ca = false;
586
587 hw->phy_configured = false;
588 hw->preamble_len = 7;
589 hw->max_frame_size = adapter->netdev->mtu;
590 hw->rx_jumbo_th = (hw->max_frame_size + ETH_HLEN +
591 VLAN_HLEN + ETH_FCS_LEN + 7) >> 3;
592
593 hw->rrs_type = atl1e_rrs_disable;
594 hw->indirect_tab = 0;
595 hw->base_cpu = 0;
596
597 /* need confirm */
598
599 hw->ict = 50000; /* 100ms */
600 hw->smb_timer = 200000; /* 200ms */
601 hw->tpd_burst = 5;
602 hw->rrd_thresh = 1;
603 hw->tpd_thresh = adapter->tx_ring.count / 2;
604 hw->rx_count_down = 4; /* 2us resolution */
605 hw->tx_count_down = hw->imt * 4 / 3;
606 hw->dmar_block = atl1e_dma_req_1024;
607 hw->dmaw_block = atl1e_dma_req_1024;
608 hw->dmar_dly_cnt = 15;
609 hw->dmaw_dly_cnt = 4;
610
611 if (atl1e_alloc_queues(adapter)) {
612 dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
613 return -ENOMEM;
614 }
615
616 atomic_set(&adapter->irq_sem, 1);
617 spin_lock_init(&adapter->mdio_lock);
618 spin_lock_init(&adapter->tx_lock);
619
620 set_bit(__AT_DOWN, &adapter->flags);
621
622 return 0;
623}
624
625/*
626 * atl1e_clean_tx_ring - Free Tx-skb
627 * @adapter: board private structure
628 */
629static void atl1e_clean_tx_ring(struct atl1e_adapter *adapter)
630{
631 struct atl1e_tx_ring *tx_ring = (struct atl1e_tx_ring *)
632 &adapter->tx_ring;
633 struct atl1e_tx_buffer *tx_buffer = NULL;
634 struct pci_dev *pdev = adapter->pdev;
635 u16 index, ring_count;
636
637 if (tx_ring->desc == NULL || tx_ring->tx_buffer == NULL)
638 return;
639
640 ring_count = tx_ring->count;
641 /* first unmmap dma */
642 for (index = 0; index < ring_count; index++) {
643 tx_buffer = &tx_ring->tx_buffer[index];
644 if (tx_buffer->dma) {
645 pci_unmap_page(pdev, tx_buffer->dma,
646 tx_buffer->length, PCI_DMA_TODEVICE);
647 tx_buffer->dma = 0;
648 }
649 }
650 /* second free skb */
651 for (index = 0; index < ring_count; index++) {
652 tx_buffer = &tx_ring->tx_buffer[index];
653 if (tx_buffer->skb) {
654 dev_kfree_skb_any(tx_buffer->skb);
655 tx_buffer->skb = NULL;
656 }
657 }
658 /* Zero out Tx-buffers */
659 memset(tx_ring->desc, 0, sizeof(struct atl1e_tpd_desc) *
660 ring_count);
661 memset(tx_ring->tx_buffer, 0, sizeof(struct atl1e_tx_buffer) *
662 ring_count);
663}
664
665/*
666 * atl1e_clean_rx_ring - Free rx-reservation skbs
667 * @adapter: board private structure
668 */
669static void atl1e_clean_rx_ring(struct atl1e_adapter *adapter)
670{
671 struct atl1e_rx_ring *rx_ring =
672 (struct atl1e_rx_ring *)&adapter->rx_ring;
673 struct atl1e_rx_page_desc *rx_page_desc = rx_ring->rx_page_desc;
674 u16 i, j;
675
676
677 if (adapter->ring_vir_addr == NULL)
678 return;
679 /* Zero out the descriptor ring */
680 for (i = 0; i < adapter->num_rx_queues; i++) {
681 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
682 if (rx_page_desc[i].rx_page[j].addr != NULL) {
683 memset(rx_page_desc[i].rx_page[j].addr, 0,
684 rx_ring->real_page_size);
685 }
686 }
687 }
688}
689
690static void atl1e_cal_ring_size(struct atl1e_adapter *adapter, u32 *ring_size)
691{
692 *ring_size = ((u32)(adapter->tx_ring.count *
693 sizeof(struct atl1e_tpd_desc) + 7
694 /* tx ring, qword align */
695 + adapter->rx_ring.real_page_size * AT_PAGE_NUM_PER_QUEUE *
696 adapter->num_rx_queues + 31
697 /* rx ring, 32 bytes align */
698 + (1 + AT_PAGE_NUM_PER_QUEUE * adapter->num_rx_queues) *
699 sizeof(u32) + 3));
700 /* tx, rx cmd, dword align */
701}
702
703static void atl1e_init_ring_resources(struct atl1e_adapter *adapter)
704{
705 struct atl1e_tx_ring *tx_ring = NULL;
706 struct atl1e_rx_ring *rx_ring = NULL;
707
708 tx_ring = &adapter->tx_ring;
709 rx_ring = &adapter->rx_ring;
710
711 rx_ring->real_page_size = adapter->rx_ring.page_size
712 + adapter->hw.max_frame_size
713 + ETH_HLEN + VLAN_HLEN
714 + ETH_FCS_LEN;
715 rx_ring->real_page_size = roundup(rx_ring->real_page_size, 32);
716 atl1e_cal_ring_size(adapter, &adapter->ring_size);
717
718 adapter->ring_vir_addr = NULL;
719 adapter->rx_ring.desc = NULL;
720 rwlock_init(&adapter->tx_ring.tx_lock);
721
722 return;
723}
724
725/*
726 * Read / Write Ptr Initialize:
727 */
728static void atl1e_init_ring_ptrs(struct atl1e_adapter *adapter)
729{
730 struct atl1e_tx_ring *tx_ring = NULL;
731 struct atl1e_rx_ring *rx_ring = NULL;
732 struct atl1e_rx_page_desc *rx_page_desc = NULL;
733 int i, j;
734
735 tx_ring = &adapter->tx_ring;
736 rx_ring = &adapter->rx_ring;
737 rx_page_desc = rx_ring->rx_page_desc;
738
739 tx_ring->next_to_use = 0;
740 atomic_set(&tx_ring->next_to_clean, 0);
741
742 for (i = 0; i < adapter->num_rx_queues; i++) {
743 rx_page_desc[i].rx_using = 0;
744 rx_page_desc[i].rx_nxseq = 0;
745 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
746 *rx_page_desc[i].rx_page[j].write_offset_addr = 0;
747 rx_page_desc[i].rx_page[j].read_offset = 0;
748 }
749 }
750}
751
752/*
753 * atl1e_free_ring_resources - Free Tx / RX descriptor Resources
754 * @adapter: board private structure
755 *
756 * Free all transmit software resources
757 */
758static void atl1e_free_ring_resources(struct atl1e_adapter *adapter)
759{
760 struct pci_dev *pdev = adapter->pdev;
761
762 atl1e_clean_tx_ring(adapter);
763 atl1e_clean_rx_ring(adapter);
764
765 if (adapter->ring_vir_addr) {
766 pci_free_consistent(pdev, adapter->ring_size,
767 adapter->ring_vir_addr, adapter->ring_dma);
768 adapter->ring_vir_addr = NULL;
769 }
770
771 if (adapter->tx_ring.tx_buffer) {
772 kfree(adapter->tx_ring.tx_buffer);
773 adapter->tx_ring.tx_buffer = NULL;
774 }
775}
776
777/*
778 * atl1e_setup_mem_resources - allocate Tx / RX descriptor resources
779 * @adapter: board private structure
780 *
781 * Return 0 on success, negative on failure
782 */
783static int atl1e_setup_ring_resources(struct atl1e_adapter *adapter)
784{
785 struct pci_dev *pdev = adapter->pdev;
786 struct atl1e_tx_ring *tx_ring;
787 struct atl1e_rx_ring *rx_ring;
788 struct atl1e_rx_page_desc *rx_page_desc;
789 int size, i, j;
790 u32 offset = 0;
791 int err = 0;
792
793 if (adapter->ring_vir_addr != NULL)
794 return 0; /* alloced already */
795
796 tx_ring = &adapter->tx_ring;
797 rx_ring = &adapter->rx_ring;
798
799 /* real ring DMA buffer */
800
801 size = adapter->ring_size;
802 adapter->ring_vir_addr = pci_alloc_consistent(pdev,
803 adapter->ring_size, &adapter->ring_dma);
804
805 if (adapter->ring_vir_addr == NULL) {
806 dev_err(&pdev->dev, "pci_alloc_consistent failed, "
807 "size = D%d", size);
808 return -ENOMEM;
809 }
810
811 memset(adapter->ring_vir_addr, 0, adapter->ring_size);
812
813 rx_page_desc = rx_ring->rx_page_desc;
814
815 /* Init TPD Ring */
816 tx_ring->dma = roundup(adapter->ring_dma, 8);
817 offset = tx_ring->dma - adapter->ring_dma;
818 tx_ring->desc = (struct atl1e_tpd_desc *)
819 (adapter->ring_vir_addr + offset);
820 size = sizeof(struct atl1e_tx_buffer) * (tx_ring->count);
821 tx_ring->tx_buffer = kzalloc(size, GFP_KERNEL);
822 if (tx_ring->tx_buffer == NULL) {
823 dev_err(&pdev->dev, "kzalloc failed , size = D%d", size);
824 err = -ENOMEM;
825 goto failed;
826 }
827
828 /* Init RXF-Pages */
829 offset += (sizeof(struct atl1e_tpd_desc) * tx_ring->count);
830 offset = roundup(offset, 32);
831
832 for (i = 0; i < adapter->num_rx_queues; i++) {
833 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
834 rx_page_desc[i].rx_page[j].dma =
835 adapter->ring_dma + offset;
836 rx_page_desc[i].rx_page[j].addr =
837 adapter->ring_vir_addr + offset;
838 offset += rx_ring->real_page_size;
839 }
840 }
841
842 /* Init CMB dma address */
843 tx_ring->cmb_dma = adapter->ring_dma + offset;
844 tx_ring->cmb = (u32 *)(adapter->ring_vir_addr + offset);
845 offset += sizeof(u32);
846
847 for (i = 0; i < adapter->num_rx_queues; i++) {
848 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
849 rx_page_desc[i].rx_page[j].write_offset_dma =
850 adapter->ring_dma + offset;
851 rx_page_desc[i].rx_page[j].write_offset_addr =
852 adapter->ring_vir_addr + offset;
853 offset += sizeof(u32);
854 }
855 }
856
857 if (unlikely(offset > adapter->ring_size)) {
858 dev_err(&pdev->dev, "offset(%d) > ring size(%d) !!\n",
859 offset, adapter->ring_size);
860 err = -1;
861 goto failed;
862 }
863
864 return 0;
865failed:
866 if (adapter->ring_vir_addr != NULL) {
867 pci_free_consistent(pdev, adapter->ring_size,
868 adapter->ring_vir_addr, adapter->ring_dma);
869 adapter->ring_vir_addr = NULL;
870 }
871 return err;
872}
873
874static inline void atl1e_configure_des_ring(const struct atl1e_adapter *adapter)
875{
876
877 struct atl1e_hw *hw = (struct atl1e_hw *)&adapter->hw;
878 struct atl1e_rx_ring *rx_ring =
879 (struct atl1e_rx_ring *)&adapter->rx_ring;
880 struct atl1e_tx_ring *tx_ring =
881 (struct atl1e_tx_ring *)&adapter->tx_ring;
882 struct atl1e_rx_page_desc *rx_page_desc = NULL;
883 int i, j;
884
885 AT_WRITE_REG(hw, REG_DESC_BASE_ADDR_HI,
886 (u32)((adapter->ring_dma & AT_DMA_HI_ADDR_MASK) >> 32));
887 AT_WRITE_REG(hw, REG_TPD_BASE_ADDR_LO,
888 (u32)((tx_ring->dma) & AT_DMA_LO_ADDR_MASK));
889 AT_WRITE_REG(hw, REG_TPD_RING_SIZE, (u16)(tx_ring->count));
890 AT_WRITE_REG(hw, REG_HOST_TX_CMB_LO,
891 (u32)((tx_ring->cmb_dma) & AT_DMA_LO_ADDR_MASK));
892
893 rx_page_desc = rx_ring->rx_page_desc;
894 /* RXF Page Physical address / Page Length */
895 for (i = 0; i < AT_MAX_RECEIVE_QUEUE; i++) {
896 AT_WRITE_REG(hw, atl1e_rx_page_hi_addr_regs[i],
897 (u32)((adapter->ring_dma &
898 AT_DMA_HI_ADDR_MASK) >> 32));
899 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
900 u32 page_phy_addr;
901 u32 offset_phy_addr;
902
903 page_phy_addr = rx_page_desc[i].rx_page[j].dma;
904 offset_phy_addr =
905 rx_page_desc[i].rx_page[j].write_offset_dma;
906
907 AT_WRITE_REG(hw, atl1e_rx_page_lo_addr_regs[i][j],
908 page_phy_addr & AT_DMA_LO_ADDR_MASK);
909 AT_WRITE_REG(hw, atl1e_rx_page_write_offset_regs[i][j],
910 offset_phy_addr & AT_DMA_LO_ADDR_MASK);
911 AT_WRITE_REGB(hw, atl1e_rx_page_vld_regs[i][j], 1);
912 }
913 }
914 /* Page Length */
915 AT_WRITE_REG(hw, REG_HOST_RXFPAGE_SIZE, rx_ring->page_size);
916 /* Load all of base address above */
917 AT_WRITE_REG(hw, REG_LOAD_PTR, 1);
918
919 return;
920}
921
922static inline void atl1e_configure_tx(struct atl1e_adapter *adapter)
923{
924 struct atl1e_hw *hw = (struct atl1e_hw *)&adapter->hw;
925 u32 dev_ctrl_data = 0;
926 u32 max_pay_load = 0;
927 u32 jumbo_thresh = 0;
928 u32 extra_size = 0; /* Jumbo frame threshold in QWORD unit */
929
930 /* configure TXQ param */
931 if (hw->nic_type != athr_l2e_revB) {
932 extra_size = ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
933 if (hw->max_frame_size <= 1500) {
934 jumbo_thresh = hw->max_frame_size + extra_size;
935 } else if (hw->max_frame_size < 6*1024) {
936 jumbo_thresh =
937 (hw->max_frame_size + extra_size) * 2 / 3;
938 } else {
939 jumbo_thresh = (hw->max_frame_size + extra_size) / 2;
940 }
941 AT_WRITE_REG(hw, REG_TX_EARLY_TH, (jumbo_thresh + 7) >> 3);
942 }
943
944 dev_ctrl_data = AT_READ_REG(hw, REG_DEVICE_CTRL);
945
946 max_pay_load = ((dev_ctrl_data >> DEVICE_CTRL_MAX_PAYLOAD_SHIFT)) &
947 DEVICE_CTRL_MAX_PAYLOAD_MASK;
948
949 hw->dmaw_block = min(max_pay_load, hw->dmaw_block);
950
951 max_pay_load = ((dev_ctrl_data >> DEVICE_CTRL_MAX_RREQ_SZ_SHIFT)) &
952 DEVICE_CTRL_MAX_RREQ_SZ_MASK;
953 hw->dmar_block = min(max_pay_load, hw->dmar_block);
954
955 if (hw->nic_type != athr_l2e_revB)
956 AT_WRITE_REGW(hw, REG_TXQ_CTRL + 2,
957 atl1e_pay_load_size[hw->dmar_block]);
958 /* enable TXQ */
959 AT_WRITE_REGW(hw, REG_TXQ_CTRL,
960 (((u16)hw->tpd_burst & TXQ_CTRL_NUM_TPD_BURST_MASK)
961 << TXQ_CTRL_NUM_TPD_BURST_SHIFT)
962 | TXQ_CTRL_ENH_MODE | TXQ_CTRL_EN);
963 return;
964}
965
966static inline void atl1e_configure_rx(struct atl1e_adapter *adapter)
967{
968 struct atl1e_hw *hw = (struct atl1e_hw *)&adapter->hw;
969 u32 rxf_len = 0;
970 u32 rxf_low = 0;
971 u32 rxf_high = 0;
972 u32 rxf_thresh_data = 0;
973 u32 rxq_ctrl_data = 0;
974
975 if (hw->nic_type != athr_l2e_revB) {
976 AT_WRITE_REGW(hw, REG_RXQ_JMBOSZ_RRDTIM,
977 (u16)((hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK) <<
978 RXQ_JMBOSZ_TH_SHIFT |
979 (1 & RXQ_JMBO_LKAH_MASK) <<
980 RXQ_JMBO_LKAH_SHIFT));
981
982 rxf_len = AT_READ_REG(hw, REG_SRAM_RXF_LEN);
983 rxf_high = rxf_len * 4 / 5;
984 rxf_low = rxf_len / 5;
985 rxf_thresh_data = ((rxf_high & RXQ_RXF_PAUSE_TH_HI_MASK)
986 << RXQ_RXF_PAUSE_TH_HI_SHIFT) |
987 ((rxf_low & RXQ_RXF_PAUSE_TH_LO_MASK)
988 << RXQ_RXF_PAUSE_TH_LO_SHIFT);
989
990 AT_WRITE_REG(hw, REG_RXQ_RXF_PAUSE_THRESH, rxf_thresh_data);
991 }
992
993 /* RRS */
994 AT_WRITE_REG(hw, REG_IDT_TABLE, hw->indirect_tab);
995 AT_WRITE_REG(hw, REG_BASE_CPU_NUMBER, hw->base_cpu);
996
997 if (hw->rrs_type & atl1e_rrs_ipv4)
998 rxq_ctrl_data |= RXQ_CTRL_HASH_TYPE_IPV4;
999
1000 if (hw->rrs_type & atl1e_rrs_ipv4_tcp)
1001 rxq_ctrl_data |= RXQ_CTRL_HASH_TYPE_IPV4_TCP;
1002
1003 if (hw->rrs_type & atl1e_rrs_ipv6)
1004 rxq_ctrl_data |= RXQ_CTRL_HASH_TYPE_IPV6;
1005
1006 if (hw->rrs_type & atl1e_rrs_ipv6_tcp)
1007 rxq_ctrl_data |= RXQ_CTRL_HASH_TYPE_IPV6_TCP;
1008
1009 if (hw->rrs_type != atl1e_rrs_disable)
1010 rxq_ctrl_data |=
1011 (RXQ_CTRL_HASH_ENABLE | RXQ_CTRL_RSS_MODE_MQUESINT);
1012
1013 rxq_ctrl_data |= RXQ_CTRL_IPV6_XSUM_VERIFY_EN | RXQ_CTRL_PBA_ALIGN_32 |
1014 RXQ_CTRL_CUT_THRU_EN | RXQ_CTRL_EN;
1015
1016 AT_WRITE_REG(hw, REG_RXQ_CTRL, rxq_ctrl_data);
1017 return;
1018}
1019
1020static inline void atl1e_configure_dma(struct atl1e_adapter *adapter)
1021{
1022 struct atl1e_hw *hw = &adapter->hw;
1023 u32 dma_ctrl_data = 0;
1024
1025 dma_ctrl_data = DMA_CTRL_RXCMB_EN;
1026 dma_ctrl_data |= (((u32)hw->dmar_block) & DMA_CTRL_DMAR_BURST_LEN_MASK)
1027 << DMA_CTRL_DMAR_BURST_LEN_SHIFT;
1028 dma_ctrl_data |= (((u32)hw->dmaw_block) & DMA_CTRL_DMAW_BURST_LEN_MASK)
1029 << DMA_CTRL_DMAW_BURST_LEN_SHIFT;
1030 dma_ctrl_data |= DMA_CTRL_DMAR_REQ_PRI | DMA_CTRL_DMAR_OUT_ORDER;
1031 dma_ctrl_data |= (((u32)hw->dmar_dly_cnt) & DMA_CTRL_DMAR_DLY_CNT_MASK)
1032 << DMA_CTRL_DMAR_DLY_CNT_SHIFT;
1033 dma_ctrl_data |= (((u32)hw->dmaw_dly_cnt) & DMA_CTRL_DMAW_DLY_CNT_MASK)
1034 << DMA_CTRL_DMAW_DLY_CNT_SHIFT;
1035
1036 AT_WRITE_REG(hw, REG_DMA_CTRL, dma_ctrl_data);
1037 return;
1038}
1039
1040static inline void atl1e_setup_mac_ctrl(struct atl1e_adapter *adapter)
1041{
1042 u32 value;
1043 struct atl1e_hw *hw = &adapter->hw;
1044 struct net_device *netdev = adapter->netdev;
1045
1046 /* Config MAC CTRL Register */
1047 value = MAC_CTRL_TX_EN |
1048 MAC_CTRL_RX_EN ;
1049
1050 if (FULL_DUPLEX == adapter->link_duplex)
1051 value |= MAC_CTRL_DUPLX;
1052
1053 value |= ((u32)((SPEED_1000 == adapter->link_speed) ?
1054 MAC_CTRL_SPEED_1000 : MAC_CTRL_SPEED_10_100) <<
1055 MAC_CTRL_SPEED_SHIFT);
1056 value |= (MAC_CTRL_TX_FLOW | MAC_CTRL_RX_FLOW);
1057
1058 value |= (MAC_CTRL_ADD_CRC | MAC_CTRL_PAD);
1059 value |= (((u32)adapter->hw.preamble_len &
1060 MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT);
1061
1062 if (adapter->vlgrp)
1063 value |= MAC_CTRL_RMV_VLAN;
1064
1065 value |= MAC_CTRL_BC_EN;
1066 if (netdev->flags & IFF_PROMISC)
1067 value |= MAC_CTRL_PROMIS_EN;
1068 if (netdev->flags & IFF_ALLMULTI)
1069 value |= MAC_CTRL_MC_ALL_EN;
1070
1071 AT_WRITE_REG(hw, REG_MAC_CTRL, value);
1072}
1073
1074/*
1075 * atl1e_configure - Configure Transmit&Receive Unit after Reset
1076 * @adapter: board private structure
1077 *
1078 * Configure the Tx /Rx unit of the MAC after a reset.
1079 */
1080static int atl1e_configure(struct atl1e_adapter *adapter)
1081{
1082 struct atl1e_hw *hw = &adapter->hw;
1083 struct pci_dev *pdev = adapter->pdev;
1084
1085 u32 intr_status_data = 0;
1086
1087 /* clear interrupt status */
1088 AT_WRITE_REG(hw, REG_ISR, ~0);
1089
1090 /* 1. set MAC Address */
1091 atl1e_hw_set_mac_addr(hw);
1092
1093 /* 2. Init the Multicast HASH table done by set_muti */
1094
1095 /* 3. Clear any WOL status */
1096 AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
1097
1098 /* 4. Descripter Ring BaseMem/Length/Read ptr/Write ptr
1099 * TPD Ring/SMB/RXF0 Page CMBs, they use the same
1100 * High 32bits memory */
1101 atl1e_configure_des_ring(adapter);
1102
1103 /* 5. set Interrupt Moderator Timer */
1104 AT_WRITE_REGW(hw, REG_IRQ_MODU_TIMER_INIT, hw->imt);
1105 AT_WRITE_REGW(hw, REG_IRQ_MODU_TIMER2_INIT, hw->imt);
1106 AT_WRITE_REG(hw, REG_MASTER_CTRL, MASTER_CTRL_LED_MODE |
1107 MASTER_CTRL_ITIMER_EN | MASTER_CTRL_ITIMER2_EN);
1108
1109 /* 6. rx/tx threshold to trig interrupt */
1110 AT_WRITE_REGW(hw, REG_TRIG_RRD_THRESH, hw->rrd_thresh);
1111 AT_WRITE_REGW(hw, REG_TRIG_TPD_THRESH, hw->tpd_thresh);
1112 AT_WRITE_REGW(hw, REG_TRIG_RXTIMER, hw->rx_count_down);
1113 AT_WRITE_REGW(hw, REG_TRIG_TXTIMER, hw->tx_count_down);
1114
1115 /* 7. set Interrupt Clear Timer */
1116 AT_WRITE_REGW(hw, REG_CMBDISDMA_TIMER, hw->ict);
1117
1118 /* 8. set MTU */
1119 AT_WRITE_REG(hw, REG_MTU, hw->max_frame_size + ETH_HLEN +
1120 VLAN_HLEN + ETH_FCS_LEN);
1121
1122 /* 9. config TXQ early tx threshold */
1123 atl1e_configure_tx(adapter);
1124
1125 /* 10. config RXQ */
1126 atl1e_configure_rx(adapter);
1127
1128 /* 11. config DMA Engine */
1129 atl1e_configure_dma(adapter);
1130
1131 /* 12. smb timer to trig interrupt */
1132 AT_WRITE_REG(hw, REG_SMB_STAT_TIMER, hw->smb_timer);
1133
1134 intr_status_data = AT_READ_REG(hw, REG_ISR);
1135 if (unlikely((intr_status_data & ISR_PHY_LINKDOWN) != 0)) {
1136 dev_err(&pdev->dev, "atl1e_configure failed,"
1137 "PCIE phy link down\n");
1138 return -1;
1139 }
1140
1141 AT_WRITE_REG(hw, REG_ISR, 0x7fffffff);
1142 return 0;
1143}
1144
1145/*
1146 * atl1e_get_stats - Get System Network Statistics
1147 * @netdev: network interface device structure
1148 *
1149 * Returns the address of the device statistics structure.
1150 * The statistics are actually updated from the timer callback.
1151 */
1152static struct net_device_stats *atl1e_get_stats(struct net_device *netdev)
1153{
1154 struct atl1e_adapter *adapter = netdev_priv(netdev);
1155 struct atl1e_hw_stats *hw_stats = &adapter->hw_stats;
1156 struct net_device_stats *net_stats = &adapter->net_stats;
1157
1158 net_stats->rx_packets = hw_stats->rx_ok;
1159 net_stats->tx_packets = hw_stats->tx_ok;
1160 net_stats->rx_bytes = hw_stats->rx_byte_cnt;
1161 net_stats->tx_bytes = hw_stats->tx_byte_cnt;
1162 net_stats->multicast = hw_stats->rx_mcast;
1163 net_stats->collisions = hw_stats->tx_1_col +
1164 hw_stats->tx_2_col * 2 +
1165 hw_stats->tx_late_col + hw_stats->tx_abort_col;
1166
1167 net_stats->rx_errors = hw_stats->rx_frag + hw_stats->rx_fcs_err +
1168 hw_stats->rx_len_err + hw_stats->rx_sz_ov +
1169 hw_stats->rx_rrd_ov + hw_stats->rx_align_err;
1170 net_stats->rx_fifo_errors = hw_stats->rx_rxf_ov;
1171 net_stats->rx_length_errors = hw_stats->rx_len_err;
1172 net_stats->rx_crc_errors = hw_stats->rx_fcs_err;
1173 net_stats->rx_frame_errors = hw_stats->rx_align_err;
1174 net_stats->rx_over_errors = hw_stats->rx_rrd_ov + hw_stats->rx_rxf_ov;
1175
1176 net_stats->rx_missed_errors = hw_stats->rx_rrd_ov + hw_stats->rx_rxf_ov;
1177
1178 net_stats->tx_errors = hw_stats->tx_late_col + hw_stats->tx_abort_col +
1179 hw_stats->tx_underrun + hw_stats->tx_trunc;
1180 net_stats->tx_fifo_errors = hw_stats->tx_underrun;
1181 net_stats->tx_aborted_errors = hw_stats->tx_abort_col;
1182 net_stats->tx_window_errors = hw_stats->tx_late_col;
1183
1184 return &adapter->net_stats;
1185}
1186
1187static void atl1e_update_hw_stats(struct atl1e_adapter *adapter)
1188{
1189 u16 hw_reg_addr = 0;
1190 unsigned long *stats_item = NULL;
1191
1192 /* update rx status */
1193 hw_reg_addr = REG_MAC_RX_STATUS_BIN;
1194 stats_item = &adapter->hw_stats.rx_ok;
1195 while (hw_reg_addr <= REG_MAC_RX_STATUS_END) {
1196 *stats_item += AT_READ_REG(&adapter->hw, hw_reg_addr);
1197 stats_item++;
1198 hw_reg_addr += 4;
1199 }
1200 /* update tx status */
1201 hw_reg_addr = REG_MAC_TX_STATUS_BIN;
1202 stats_item = &adapter->hw_stats.tx_ok;
1203 while (hw_reg_addr <= REG_MAC_TX_STATUS_END) {
1204 *stats_item += AT_READ_REG(&adapter->hw, hw_reg_addr);
1205 stats_item++;
1206 hw_reg_addr += 4;
1207 }
1208}
1209
1210static inline void atl1e_clear_phy_int(struct atl1e_adapter *adapter)
1211{
1212 u16 phy_data;
1213
1214 spin_lock(&adapter->mdio_lock);
1215 atl1e_read_phy_reg(&adapter->hw, MII_INT_STATUS, &phy_data);
1216 spin_unlock(&adapter->mdio_lock);
1217}
1218
1219static bool atl1e_clean_tx_irq(struct atl1e_adapter *adapter)
1220{
1221 struct atl1e_tx_ring *tx_ring = (struct atl1e_tx_ring *)
1222 &adapter->tx_ring;
1223 struct atl1e_tx_buffer *tx_buffer = NULL;
1224 u16 hw_next_to_clean = AT_READ_REGW(&adapter->hw, REG_TPD_CONS_IDX);
1225 u16 next_to_clean = atomic_read(&tx_ring->next_to_clean);
1226
1227 while (next_to_clean != hw_next_to_clean) {
1228 tx_buffer = &tx_ring->tx_buffer[next_to_clean];
1229 if (tx_buffer->dma) {
1230 pci_unmap_page(adapter->pdev, tx_buffer->dma,
1231 tx_buffer->length, PCI_DMA_TODEVICE);
1232 tx_buffer->dma = 0;
1233 }
1234
1235 if (tx_buffer->skb) {
1236 dev_kfree_skb_irq(tx_buffer->skb);
1237 tx_buffer->skb = NULL;
1238 }
1239
1240 if (++next_to_clean == tx_ring->count)
1241 next_to_clean = 0;
1242 }
1243
1244 atomic_set(&tx_ring->next_to_clean, next_to_clean);
1245
1246 if (netif_queue_stopped(adapter->netdev) &&
1247 netif_carrier_ok(adapter->netdev)) {
1248 netif_wake_queue(adapter->netdev);
1249 }
1250
1251 return true;
1252}
1253
1254/*
1255 * atl1e_intr - Interrupt Handler
1256 * @irq: interrupt number
1257 * @data: pointer to a network interface device structure
1258 * @pt_regs: CPU registers structure
1259 */
1260static irqreturn_t atl1e_intr(int irq, void *data)
1261{
1262 struct net_device *netdev = data;
1263 struct atl1e_adapter *adapter = netdev_priv(netdev);
1264 struct pci_dev *pdev = adapter->pdev;
1265 struct atl1e_hw *hw = &adapter->hw;
1266 int max_ints = AT_MAX_INT_WORK;
1267 int handled = IRQ_NONE;
1268 u32 status;
1269
1270 do {
1271 status = AT_READ_REG(hw, REG_ISR);
1272 if ((status & IMR_NORMAL_MASK) == 0 ||
1273 (status & ISR_DIS_INT) != 0) {
1274 if (max_ints != AT_MAX_INT_WORK)
1275 handled = IRQ_HANDLED;
1276 break;
1277 }
1278 /* link event */
1279 if (status & ISR_GPHY)
1280 atl1e_clear_phy_int(adapter);
1281 /* Ack ISR */
1282 AT_WRITE_REG(hw, REG_ISR, status | ISR_DIS_INT);
1283
1284 handled = IRQ_HANDLED;
1285 /* check if PCIE PHY Link down */
1286 if (status & ISR_PHY_LINKDOWN) {
1287 dev_err(&pdev->dev,
1288 "pcie phy linkdown %x\n", status);
1289 if (netif_running(adapter->netdev)) {
1290 /* reset MAC */
1291 atl1e_irq_reset(adapter);
1292 schedule_work(&adapter->reset_task);
1293 break;
1294 }
1295 }
1296
1297 /* check if DMA read/write error */
1298 if (status & (ISR_DMAR_TO_RST | ISR_DMAW_TO_RST)) {
1299 dev_err(&pdev->dev,
1300 "PCIE DMA RW error (status = 0x%x)\n",
1301 status);
1302 atl1e_irq_reset(adapter);
1303 schedule_work(&adapter->reset_task);
1304 break;
1305 }
1306
1307 if (status & ISR_SMB)
1308 atl1e_update_hw_stats(adapter);
1309
1310 /* link event */
1311 if (status & (ISR_GPHY | ISR_MANUAL)) {
1312 adapter->net_stats.tx_carrier_errors++;
1313 atl1e_link_chg_event(adapter);
1314 break;
1315 }
1316
1317 /* transmit event */
1318 if (status & ISR_TX_EVENT)
1319 atl1e_clean_tx_irq(adapter);
1320
1321 if (status & ISR_RX_EVENT) {
1322 /*
1323 * disable rx interrupts, without
1324 * the synchronize_irq bit
1325 */
1326 AT_WRITE_REG(hw, REG_IMR,
1327 IMR_NORMAL_MASK & ~ISR_RX_EVENT);
1328 AT_WRITE_FLUSH(hw);
1329 if (likely(netif_rx_schedule_prep(netdev,
1330 &adapter->napi)))
1331 __netif_rx_schedule(netdev, &adapter->napi);
1332 }
1333 } while (--max_ints > 0);
1334 /* re-enable Interrupt*/
1335 AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
1336
1337 return handled;
1338}
1339
1340static inline void atl1e_rx_checksum(struct atl1e_adapter *adapter,
1341 struct sk_buff *skb, struct atl1e_recv_ret_status *prrs)
1342{
1343 u8 *packet = (u8 *)(prrs + 1);
1344 struct iphdr *iph;
1345 u16 head_len = ETH_HLEN;
1346 u16 pkt_flags;
1347 u16 err_flags;
1348
1349 skb->ip_summed = CHECKSUM_NONE;
1350 pkt_flags = prrs->pkt_flag;
1351 err_flags = prrs->err_flag;
1352 if (((pkt_flags & RRS_IS_IPV4) || (pkt_flags & RRS_IS_IPV6)) &&
1353 ((pkt_flags & RRS_IS_TCP) || (pkt_flags & RRS_IS_UDP))) {
1354 if (pkt_flags & RRS_IS_IPV4) {
1355 if (pkt_flags & RRS_IS_802_3)
1356 head_len += 8;
1357 iph = (struct iphdr *) (packet + head_len);
1358 if (iph->frag_off != 0 && !(pkt_flags & RRS_IS_IP_DF))
1359 goto hw_xsum;
1360 }
1361 if (!(err_flags & (RRS_ERR_IP_CSUM | RRS_ERR_L4_CSUM))) {
1362 skb->ip_summed = CHECKSUM_UNNECESSARY;
1363 return;
1364 }
1365 }
1366
1367hw_xsum :
1368 return;
1369}
1370
1371static struct atl1e_rx_page *atl1e_get_rx_page(struct atl1e_adapter *adapter,
1372 u8 que)
1373{
1374 struct atl1e_rx_page_desc *rx_page_desc =
1375 (struct atl1e_rx_page_desc *) adapter->rx_ring.rx_page_desc;
1376 u8 rx_using = rx_page_desc[que].rx_using;
1377
1378 return (struct atl1e_rx_page *)&(rx_page_desc[que].rx_page[rx_using]);
1379}
1380
1381static void atl1e_clean_rx_irq(struct atl1e_adapter *adapter, u8 que,
1382 int *work_done, int work_to_do)
1383{
1384 struct pci_dev *pdev = adapter->pdev;
1385 struct net_device *netdev = adapter->netdev;
1386 struct atl1e_rx_ring *rx_ring = (struct atl1e_rx_ring *)
1387 &adapter->rx_ring;
1388 struct atl1e_rx_page_desc *rx_page_desc =
1389 (struct atl1e_rx_page_desc *) rx_ring->rx_page_desc;
1390 struct sk_buff *skb = NULL;
1391 struct atl1e_rx_page *rx_page = atl1e_get_rx_page(adapter, que);
1392 u32 packet_size, write_offset;
1393 struct atl1e_recv_ret_status *prrs;
1394
1395 write_offset = *(rx_page->write_offset_addr);
1396 if (likely(rx_page->read_offset < write_offset)) {
1397 do {
1398 if (*work_done >= work_to_do)
1399 break;
1400 (*work_done)++;
1401 /* get new packet's rrs */
1402 prrs = (struct atl1e_recv_ret_status *) (rx_page->addr +
1403 rx_page->read_offset);
1404 /* check sequence number */
1405 if (prrs->seq_num != rx_page_desc[que].rx_nxseq) {
1406 dev_err(&pdev->dev,
1407 "rx sequence number"
1408 " error (rx=%d) (expect=%d)\n",
1409 prrs->seq_num,
1410 rx_page_desc[que].rx_nxseq);
1411 rx_page_desc[que].rx_nxseq++;
1412 /* just for debug use */
1413 AT_WRITE_REG(&adapter->hw, REG_DEBUG_DATA0,
1414 (((u32)prrs->seq_num) << 16) |
1415 rx_page_desc[que].rx_nxseq);
1416 goto fatal_err;
1417 }
1418 rx_page_desc[que].rx_nxseq++;
1419
1420 /* error packet */
1421 if (prrs->pkt_flag & RRS_IS_ERR_FRAME) {
1422 if (prrs->err_flag & (RRS_ERR_BAD_CRC |
1423 RRS_ERR_DRIBBLE | RRS_ERR_CODE |
1424 RRS_ERR_TRUNC)) {
1425 /* hardware error, discard this packet*/
1426 dev_err(&pdev->dev,
1427 "rx packet desc error %x\n",
1428 *((u32 *)prrs + 1));
1429 goto skip_pkt;
1430 }
1431 }
1432
1433 packet_size = ((prrs->word1 >> RRS_PKT_SIZE_SHIFT) &
1434 RRS_PKT_SIZE_MASK) - 4; /* CRC */
1435 skb = netdev_alloc_skb(netdev,
1436 packet_size + NET_IP_ALIGN);
1437 if (skb == NULL) {
1438 dev_warn(&pdev->dev, "%s: Memory squeeze,"
1439 "deferring packet.\n", netdev->name);
1440 goto skip_pkt;
1441 }
1442 skb_reserve(skb, NET_IP_ALIGN);
1443 skb->dev = netdev;
1444 memcpy(skb->data, (u8 *)(prrs + 1), packet_size);
1445 skb_put(skb, packet_size);
1446 skb->protocol = eth_type_trans(skb, netdev);
1447 atl1e_rx_checksum(adapter, skb, prrs);
1448
1449 if (unlikely(adapter->vlgrp &&
1450 (prrs->pkt_flag & RRS_IS_VLAN_TAG))) {
1451 u16 vlan_tag = (prrs->vtag >> 4) |
1452 ((prrs->vtag & 7) << 13) |
1453 ((prrs->vtag & 8) << 9);
1454 dev_dbg(&pdev->dev,
1455 "RXD VLAN TAG<RRD>=0x%04x\n",
1456 prrs->vtag);
1457 vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
1458 vlan_tag);
1459 } else {
1460 netif_receive_skb(skb);
1461 }
1462
1463 netdev->last_rx = jiffies;
1464skip_pkt:
1465 /* skip current packet whether it's ok or not. */
1466 rx_page->read_offset +=
1467 (((u32)((prrs->word1 >> RRS_PKT_SIZE_SHIFT) &
1468 RRS_PKT_SIZE_MASK) +
1469 sizeof(struct atl1e_recv_ret_status) + 31) &
1470 0xFFFFFFE0);
1471
1472 if (rx_page->read_offset >= rx_ring->page_size) {
1473 /* mark this page clean */
1474 u16 reg_addr;
1475 u8 rx_using;
1476
1477 rx_page->read_offset =
1478 *(rx_page->write_offset_addr) = 0;
1479 rx_using = rx_page_desc[que].rx_using;
1480 reg_addr =
1481 atl1e_rx_page_vld_regs[que][rx_using];
1482 AT_WRITE_REGB(&adapter->hw, reg_addr, 1);
1483 rx_page_desc[que].rx_using ^= 1;
1484 rx_page = atl1e_get_rx_page(adapter, que);
1485 }
1486 write_offset = *(rx_page->write_offset_addr);
1487 } while (rx_page->read_offset < write_offset);
1488 }
1489
1490 return;
1491
1492fatal_err:
1493 if (!test_bit(__AT_DOWN, &adapter->flags))
1494 schedule_work(&adapter->reset_task);
1495}
1496
1497/*
1498 * atl1e_clean - NAPI Rx polling callback
1499 * @adapter: board private structure
1500 */
1501static int atl1e_clean(struct napi_struct *napi, int budget)
1502{
1503 struct atl1e_adapter *adapter =
1504 container_of(napi, struct atl1e_adapter, napi);
1505 struct net_device *netdev = adapter->netdev;
1506 struct pci_dev *pdev = adapter->pdev;
1507 u32 imr_data;
1508 int work_done = 0;
1509
1510 /* Keep link state information with original netdev */
1511 if (!netif_carrier_ok(adapter->netdev))
1512 goto quit_polling;
1513
1514 atl1e_clean_rx_irq(adapter, 0, &work_done, budget);
1515
1516 /* If no Tx and not enough Rx work done, exit the polling mode */
1517 if (work_done < budget) {
1518quit_polling:
1519 netif_rx_complete(netdev, napi);
1520 imr_data = AT_READ_REG(&adapter->hw, REG_IMR);
1521 AT_WRITE_REG(&adapter->hw, REG_IMR, imr_data | ISR_RX_EVENT);
1522 /* test debug */
1523 if (test_bit(__AT_DOWN, &adapter->flags)) {
1524 atomic_dec(&adapter->irq_sem);
1525 dev_err(&pdev->dev,
1526 "atl1e_clean is called when AT_DOWN\n");
1527 }
1528 /* reenable RX intr */
1529 /*atl1e_irq_enable(adapter); */
1530
1531 }
1532 return work_done;
1533}
1534
1535#ifdef CONFIG_NET_POLL_CONTROLLER
1536
1537/*
1538 * Polling 'interrupt' - used by things like netconsole to send skbs
1539 * without having to re-enable interrupts. It's not called while
1540 * the interrupt routine is executing.
1541 */
1542static void atl1e_netpoll(struct net_device *netdev)
1543{
1544 struct atl1e_adapter *adapter = netdev_priv(netdev);
1545
1546 disable_irq(adapter->pdev->irq);
1547 atl1e_intr(adapter->pdev->irq, netdev);
1548 enable_irq(adapter->pdev->irq);
1549}
1550#endif
1551
1552static inline u16 atl1e_tpd_avail(struct atl1e_adapter *adapter)
1553{
1554 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
1555 u16 next_to_use = 0;
1556 u16 next_to_clean = 0;
1557
1558 next_to_clean = atomic_read(&tx_ring->next_to_clean);
1559 next_to_use = tx_ring->next_to_use;
1560
1561 return (u16)(next_to_clean > next_to_use) ?
1562 (next_to_clean - next_to_use - 1) :
1563 (tx_ring->count + next_to_clean - next_to_use - 1);
1564}
1565
1566/*
1567 * get next usable tpd
1568 * Note: should call atl1e_tdp_avail to make sure
1569 * there is enough tpd to use
1570 */
1571static struct atl1e_tpd_desc *atl1e_get_tpd(struct atl1e_adapter *adapter)
1572{
1573 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
1574 u16 next_to_use = 0;
1575
1576 next_to_use = tx_ring->next_to_use;
1577 if (++tx_ring->next_to_use == tx_ring->count)
1578 tx_ring->next_to_use = 0;
1579
1580 memset(&tx_ring->desc[next_to_use], 0, sizeof(struct atl1e_tpd_desc));
1581 return (struct atl1e_tpd_desc *)&tx_ring->desc[next_to_use];
1582}
1583
1584static struct atl1e_tx_buffer *
1585atl1e_get_tx_buffer(struct atl1e_adapter *adapter, struct atl1e_tpd_desc *tpd)
1586{
1587 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
1588
1589 return &tx_ring->tx_buffer[tpd - tx_ring->desc];
1590}
1591
1592/* Calculate the transmit packet descript needed*/
1593static u16 atl1e_cal_tdp_req(const struct sk_buff *skb)
1594{
1595 int i = 0;
1596 u16 tpd_req = 1;
1597 u16 fg_size = 0;
1598 u16 proto_hdr_len = 0;
1599
1600 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1601 fg_size = skb_shinfo(skb)->frags[i].size;
1602 tpd_req += ((fg_size + MAX_TX_BUF_LEN - 1) >> MAX_TX_BUF_SHIFT);
1603 }
1604
1605 if (skb_is_gso(skb)) {
1606 if (skb->protocol == ntohs(ETH_P_IP) ||
1607 (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6)) {
1608 proto_hdr_len = skb_transport_offset(skb) +
1609 tcp_hdrlen(skb);
1610 if (proto_hdr_len < skb_headlen(skb)) {
1611 tpd_req += ((skb_headlen(skb) - proto_hdr_len +
1612 MAX_TX_BUF_LEN - 1) >>
1613 MAX_TX_BUF_SHIFT);
1614 }
1615 }
1616
1617 }
1618 return tpd_req;
1619}
1620
1621static int atl1e_tso_csum(struct atl1e_adapter *adapter,
1622 struct sk_buff *skb, struct atl1e_tpd_desc *tpd)
1623{
1624 struct pci_dev *pdev = adapter->pdev;
1625 u8 hdr_len;
1626 u32 real_len;
1627 unsigned short offload_type;
1628 int err;
1629
1630 if (skb_is_gso(skb)) {
1631 if (skb_header_cloned(skb)) {
1632 err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
1633 if (unlikely(err))
1634 return -1;
1635 }
1636 offload_type = skb_shinfo(skb)->gso_type;
1637
1638 if (offload_type & SKB_GSO_TCPV4) {
1639 real_len = (((unsigned char *)ip_hdr(skb) - skb->data)
1640 + ntohs(ip_hdr(skb)->tot_len));
1641
1642 if (real_len < skb->len)
1643 pskb_trim(skb, real_len);
1644
1645 hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
1646 if (unlikely(skb->len == hdr_len)) {
1647 /* only xsum need */
1648 dev_warn(&pdev->dev,
1649 "IPV4 tso with zero data??\n");
1650 goto check_sum;
1651 } else {
1652 ip_hdr(skb)->check = 0;
1653 ip_hdr(skb)->tot_len = 0;
1654 tcp_hdr(skb)->check = ~csum_tcpudp_magic(
1655 ip_hdr(skb)->saddr,
1656 ip_hdr(skb)->daddr,
1657 0, IPPROTO_TCP, 0);
1658 tpd->word3 |= (ip_hdr(skb)->ihl &
1659 TDP_V4_IPHL_MASK) <<
1660 TPD_V4_IPHL_SHIFT;
1661 tpd->word3 |= ((tcp_hdrlen(skb) >> 2) &
1662 TPD_TCPHDRLEN_MASK) <<
1663 TPD_TCPHDRLEN_SHIFT;
1664 tpd->word3 |= ((skb_shinfo(skb)->gso_size) &
1665 TPD_MSS_MASK) << TPD_MSS_SHIFT;
1666 tpd->word3 |= 1 << TPD_SEGMENT_EN_SHIFT;
1667 }
1668 return 0;
1669 }
1670
1671 if (offload_type & SKB_GSO_TCPV6) {
1672 real_len = (((unsigned char *)ipv6_hdr(skb) - skb->data)
1673 + ntohs(ipv6_hdr(skb)->payload_len));
1674 if (real_len < skb->len)
1675 pskb_trim(skb, real_len);
1676
1677 /* check payload == 0 byte ? */
1678 hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
1679 if (unlikely(skb->len == hdr_len)) {
1680 /* only xsum need */
1681 dev_warn(&pdev->dev,
1682 "IPV6 tso with zero data??\n");
1683 goto check_sum;
1684 } else {
1685 tcp_hdr(skb)->check = ~csum_ipv6_magic(
1686 &ipv6_hdr(skb)->saddr,
1687 &ipv6_hdr(skb)->daddr,
1688 0, IPPROTO_TCP, 0);
1689 tpd->word3 |= 1 << TPD_IP_VERSION_SHIFT;
1690 hdr_len >>= 1;
1691 tpd->word3 |= (hdr_len & TPD_V6_IPHLLO_MASK) <<
1692 TPD_V6_IPHLLO_SHIFT;
1693 tpd->word3 |= ((hdr_len >> 3) &
1694 TPD_V6_IPHLHI_MASK) <<
1695 TPD_V6_IPHLHI_SHIFT;
1696 tpd->word3 |= (tcp_hdrlen(skb) >> 2 &
1697 TPD_TCPHDRLEN_MASK) <<
1698 TPD_TCPHDRLEN_SHIFT;
1699 tpd->word3 |= ((skb_shinfo(skb)->gso_size) &
1700 TPD_MSS_MASK) << TPD_MSS_SHIFT;
1701 tpd->word3 |= 1 << TPD_SEGMENT_EN_SHIFT;
1702 }
1703 }
1704 return 0;
1705 }
1706
1707check_sum:
1708 if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
1709 u8 css, cso;
1710
1711 cso = skb_transport_offset(skb);
1712 if (unlikely(cso & 0x1)) {
1713 dev_err(&adapter->pdev->dev,
1714 "pay load offset should not ant event number\n");
1715 return -1;
1716 } else {
1717 css = cso + skb->csum_offset;
1718 tpd->word3 |= (cso & TPD_PLOADOFFSET_MASK) <<
1719 TPD_PLOADOFFSET_SHIFT;
1720 tpd->word3 |= (css & TPD_CCSUMOFFSET_MASK) <<
1721 TPD_CCSUMOFFSET_SHIFT;
1722 tpd->word3 |= 1 << TPD_CC_SEGMENT_EN_SHIFT;
1723 }
1724 }
1725
1726 return 0;
1727}
1728
1729static void atl1e_tx_map(struct atl1e_adapter *adapter,
1730 struct sk_buff *skb, struct atl1e_tpd_desc *tpd)
1731{
1732 struct atl1e_tpd_desc *use_tpd = NULL;
1733 struct atl1e_tx_buffer *tx_buffer = NULL;
1734 u16 buf_len = skb->len - skb->data_len;
1735 u16 map_len = 0;
1736 u16 mapped_len = 0;
1737 u16 hdr_len = 0;
1738 u16 nr_frags;
1739 u16 f;
1740 int segment;
1741
1742 nr_frags = skb_shinfo(skb)->nr_frags;
1743 segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK;
1744 if (segment) {
1745 /* TSO */
1746 map_len = hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
1747 use_tpd = tpd;
1748
1749 tx_buffer = atl1e_get_tx_buffer(adapter, use_tpd);
1750 tx_buffer->length = map_len;
1751 tx_buffer->dma = pci_map_single(adapter->pdev,
1752 skb->data, hdr_len, PCI_DMA_TODEVICE);
1753 mapped_len += map_len;
1754 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
1755 use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
1756 ((cpu_to_le32(tx_buffer->length) &
1757 TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT);
1758 }
1759
1760 while (mapped_len < buf_len) {
1761 /* mapped_len == 0, means we should use the first tpd,
1762 which is given by caller */
1763 if (mapped_len == 0) {
1764 use_tpd = tpd;
1765 } else {
1766 use_tpd = atl1e_get_tpd(adapter);
1767 memcpy(use_tpd, tpd, sizeof(struct atl1e_tpd_desc));
1768 }
1769 tx_buffer = atl1e_get_tx_buffer(adapter, use_tpd);
1770 tx_buffer->skb = NULL;
1771
1772 tx_buffer->length = map_len =
1773 ((buf_len - mapped_len) >= MAX_TX_BUF_LEN) ?
1774 MAX_TX_BUF_LEN : (buf_len - mapped_len);
1775 tx_buffer->dma =
1776 pci_map_single(adapter->pdev, skb->data + mapped_len,
1777 map_len, PCI_DMA_TODEVICE);
1778 mapped_len += map_len;
1779 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
1780 use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
1781 ((cpu_to_le32(tx_buffer->length) &
1782 TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT);
1783 }
1784
1785 for (f = 0; f < nr_frags; f++) {
1786 struct skb_frag_struct *frag;
1787 u16 i;
1788 u16 seg_num;
1789
1790 frag = &skb_shinfo(skb)->frags[f];
1791 buf_len = frag->size;
1792
1793 seg_num = (buf_len + MAX_TX_BUF_LEN - 1) / MAX_TX_BUF_LEN;
1794 for (i = 0; i < seg_num; i++) {
1795 use_tpd = atl1e_get_tpd(adapter);
1796 memcpy(use_tpd, tpd, sizeof(struct atl1e_tpd_desc));
1797
1798 tx_buffer = atl1e_get_tx_buffer(adapter, use_tpd);
1799 if (tx_buffer->skb)
1800 BUG();
1801
1802 tx_buffer->skb = NULL;
1803 tx_buffer->length =
1804 (buf_len > MAX_TX_BUF_LEN) ?
1805 MAX_TX_BUF_LEN : buf_len;
1806 buf_len -= tx_buffer->length;
1807
1808 tx_buffer->dma =
1809 pci_map_page(adapter->pdev, frag->page,
1810 frag->page_offset +
1811 (i * MAX_TX_BUF_LEN),
1812 tx_buffer->length,
1813 PCI_DMA_TODEVICE);
1814 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
1815 use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
1816 ((cpu_to_le32(tx_buffer->length) &
1817 TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT);
1818 }
1819 }
1820
1821 if ((tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK)
1822 /* note this one is a tcp header */
1823 tpd->word3 |= 1 << TPD_HDRFLAG_SHIFT;
1824 /* The last tpd */
1825
1826 use_tpd->word3 |= 1 << TPD_EOP_SHIFT;
1827 /* The last buffer info contain the skb address,
1828 so it will be free after unmap */
1829 tx_buffer->skb = skb;
1830}
1831
1832static void atl1e_tx_queue(struct atl1e_adapter *adapter, u16 count,
1833 struct atl1e_tpd_desc *tpd)
1834{
1835 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
1836 /* Force memory writes to complete before letting h/w
1837 * know there are new descriptors to fetch. (Only
1838 * applicable for weak-ordered memory model archs,
1839 * such as IA-64). */
1840 wmb();
1841 AT_WRITE_REG(&adapter->hw, REG_MB_TPD_PROD_IDX, tx_ring->next_to_use);
1842}
1843
1844static int atl1e_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
1845{
1846 struct atl1e_adapter *adapter = netdev_priv(netdev);
1847 unsigned long flags;
1848 u16 tpd_req = 1;
1849 struct atl1e_tpd_desc *tpd;
1850
1851 if (test_bit(__AT_DOWN, &adapter->flags)) {
1852 dev_kfree_skb_any(skb);
1853 return NETDEV_TX_OK;
1854 }
1855
1856 if (unlikely(skb->len <= 0)) {
1857 dev_kfree_skb_any(skb);
1858 return NETDEV_TX_OK;
1859 }
1860 tpd_req = atl1e_cal_tdp_req(skb);
1861 if (!spin_trylock_irqsave(&adapter->tx_lock, flags))
1862 return NETDEV_TX_LOCKED;
1863
1864 if (atl1e_tpd_avail(adapter) < tpd_req) {
1865 /* no enough descriptor, just stop queue */
1866 netif_stop_queue(netdev);
1867 spin_unlock_irqrestore(&adapter->tx_lock, flags);
1868 return NETDEV_TX_BUSY;
1869 }
1870
1871 tpd = atl1e_get_tpd(adapter);
1872
1873 if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
1874 u16 vlan_tag = vlan_tx_tag_get(skb);
1875 u16 atl1e_vlan_tag;
1876
1877 tpd->word3 |= 1 << TPD_INS_VL_TAG_SHIFT;
1878 AT_VLAN_TAG_TO_TPD_TAG(vlan_tag, atl1e_vlan_tag);
1879 tpd->word2 |= (atl1e_vlan_tag & TPD_VLANTAG_MASK) <<
1880 TPD_VLAN_SHIFT;
1881 }
1882
1883 if (skb->protocol == ntohs(ETH_P_8021Q))
1884 tpd->word3 |= 1 << TPD_VL_TAGGED_SHIFT;
1885
1886 if (skb_network_offset(skb) != ETH_HLEN)
1887 tpd->word3 |= 1 << TPD_ETHTYPE_SHIFT; /* 802.3 frame */
1888
1889 /* do TSO and check sum */
1890 if (atl1e_tso_csum(adapter, skb, tpd) != 0) {
1891 spin_unlock_irqrestore(&adapter->tx_lock, flags);
1892 dev_kfree_skb_any(skb);
1893 return NETDEV_TX_OK;
1894 }
1895
1896 atl1e_tx_map(adapter, skb, tpd);
1897 atl1e_tx_queue(adapter, tpd_req, tpd);
1898
1899 netdev->trans_start = jiffies;
1900 spin_unlock_irqrestore(&adapter->tx_lock, flags);
1901 return NETDEV_TX_OK;
1902}
1903
1904static void atl1e_free_irq(struct atl1e_adapter *adapter)
1905{
1906 struct net_device *netdev = adapter->netdev;
1907
1908 free_irq(adapter->pdev->irq, netdev);
1909
1910 if (adapter->have_msi)
1911 pci_disable_msi(adapter->pdev);
1912}
1913
1914static int atl1e_request_irq(struct atl1e_adapter *adapter)
1915{
1916 struct pci_dev *pdev = adapter->pdev;
1917 struct net_device *netdev = adapter->netdev;
1918 int flags = 0;
1919 int err = 0;
1920
1921 adapter->have_msi = true;
1922 err = pci_enable_msi(adapter->pdev);
1923 if (err) {
1924 dev_dbg(&pdev->dev,
1925 "Unable to allocate MSI interrupt Error: %d\n", err);
1926 adapter->have_msi = false;
1927 } else
1928 netdev->irq = pdev->irq;
1929
1930
1931 if (!adapter->have_msi)
1932 flags |= IRQF_SHARED;
1933 err = request_irq(adapter->pdev->irq, &atl1e_intr, flags,
1934 netdev->name, netdev);
1935 if (err) {
1936 dev_dbg(&pdev->dev,
1937 "Unable to allocate interrupt Error: %d\n", err);
1938 if (adapter->have_msi)
1939 pci_disable_msi(adapter->pdev);
1940 return err;
1941 }
1942 dev_dbg(&pdev->dev, "atl1e_request_irq OK\n");
1943 return err;
1944}
1945
1946int atl1e_up(struct atl1e_adapter *adapter)
1947{
1948 struct net_device *netdev = adapter->netdev;
1949 int err = 0;
1950 u32 val;
1951
1952 /* hardware has been reset, we need to reload some things */
1953 err = atl1e_init_hw(&adapter->hw);
1954 if (err) {
1955 err = -EIO;
1956 return err;
1957 }
1958 atl1e_init_ring_ptrs(adapter);
1959 atl1e_set_multi(netdev);
1960 atl1e_restore_vlan(adapter);
1961
1962 if (atl1e_configure(adapter)) {
1963 err = -EIO;
1964 goto err_up;
1965 }
1966
1967 clear_bit(__AT_DOWN, &adapter->flags);
1968 napi_enable(&adapter->napi);
1969 atl1e_irq_enable(adapter);
1970 val = AT_READ_REG(&adapter->hw, REG_MASTER_CTRL);
1971 AT_WRITE_REG(&adapter->hw, REG_MASTER_CTRL,
1972 val | MASTER_CTRL_MANUAL_INT);
1973
1974err_up:
1975 return err;
1976}
1977
1978void atl1e_down(struct atl1e_adapter *adapter)
1979{
1980 struct net_device *netdev = adapter->netdev;
1981
1982 /* signal that we're down so the interrupt handler does not
1983 * reschedule our watchdog timer */
1984 set_bit(__AT_DOWN, &adapter->flags);
1985
1986#ifdef NETIF_F_LLTX
1987 netif_stop_queue(netdev);
1988#else
1989 netif_tx_disable(netdev);
1990#endif
1991
1992 /* reset MAC to disable all RX/TX */
1993 atl1e_reset_hw(&adapter->hw);
1994 msleep(1);
1995
1996 napi_disable(&adapter->napi);
1997 atl1e_del_timer(adapter);
1998 atl1e_irq_disable(adapter);
1999
2000 netif_carrier_off(netdev);
2001 adapter->link_speed = SPEED_0;
2002 adapter->link_duplex = -1;
2003 atl1e_clean_tx_ring(adapter);
2004 atl1e_clean_rx_ring(adapter);
2005}
2006
2007/*
2008 * atl1e_open - Called when a network interface is made active
2009 * @netdev: network interface device structure
2010 *
2011 * Returns 0 on success, negative value on failure
2012 *
2013 * The open entry point is called when a network interface is made
2014 * active by the system (IFF_UP). At this point all resources needed
2015 * for transmit and receive operations are allocated, the interrupt
2016 * handler is registered with the OS, the watchdog timer is started,
2017 * and the stack is notified that the interface is ready.
2018 */
2019static int atl1e_open(struct net_device *netdev)
2020{
2021 struct atl1e_adapter *adapter = netdev_priv(netdev);
2022 int err;
2023
2024 /* disallow open during test */
2025 if (test_bit(__AT_TESTING, &adapter->flags))
2026 return -EBUSY;
2027
2028 /* allocate rx/tx dma buffer & descriptors */
2029 atl1e_init_ring_resources(adapter);
2030 err = atl1e_setup_ring_resources(adapter);
2031 if (unlikely(err))
2032 return err;
2033
2034 err = atl1e_request_irq(adapter);
2035 if (unlikely(err))
2036 goto err_req_irq;
2037
2038 err = atl1e_up(adapter);
2039 if (unlikely(err))
2040 goto err_up;
2041
2042 return 0;
2043
2044err_up:
2045 atl1e_free_irq(adapter);
2046err_req_irq:
2047 atl1e_free_ring_resources(adapter);
2048 atl1e_reset_hw(&adapter->hw);
2049
2050 return err;
2051}
2052
2053/*
2054 * atl1e_close - Disables a network interface
2055 * @netdev: network interface device structure
2056 *
2057 * Returns 0, this is not allowed to fail
2058 *
2059 * The close entry point is called when an interface is de-activated
2060 * by the OS. The hardware is still under the drivers control, but
2061 * needs to be disabled. A global MAC reset is issued to stop the
2062 * hardware, and all transmit and receive resources are freed.
2063 */
2064static int atl1e_close(struct net_device *netdev)
2065{
2066 struct atl1e_adapter *adapter = netdev_priv(netdev);
2067
2068 WARN_ON(test_bit(__AT_RESETTING, &adapter->flags));
2069 atl1e_down(adapter);
2070 atl1e_free_irq(adapter);
2071 atl1e_free_ring_resources(adapter);
2072
2073 return 0;
2074}
2075
2076static int atl1e_suspend(struct pci_dev *pdev, pm_message_t state)
2077{
2078 struct net_device *netdev = pci_get_drvdata(pdev);
2079 struct atl1e_adapter *adapter = netdev_priv(netdev);
2080 struct atl1e_hw *hw = &adapter->hw;
2081 u32 ctrl = 0;
2082 u32 mac_ctrl_data = 0;
2083 u32 wol_ctrl_data = 0;
2084 u16 mii_advertise_data = 0;
2085 u16 mii_bmsr_data = 0;
2086 u16 mii_intr_status_data = 0;
2087 u32 wufc = adapter->wol;
2088 u32 i;
2089#ifdef CONFIG_PM
2090 int retval = 0;
2091#endif
2092
2093 if (netif_running(netdev)) {
2094 WARN_ON(test_bit(__AT_RESETTING, &adapter->flags));
2095 atl1e_down(adapter);
2096 }
2097 netif_device_detach(netdev);
2098
2099#ifdef CONFIG_PM
2100 retval = pci_save_state(pdev);
2101 if (retval)
2102 return retval;
2103#endif
2104
2105 if (wufc) {
2106 /* get link status */
2107 atl1e_read_phy_reg(hw, MII_BMSR, (u16 *)&mii_bmsr_data);
2108 atl1e_read_phy_reg(hw, MII_BMSR, (u16 *)&mii_bmsr_data);
2109
2110 mii_advertise_data = MII_AR_10T_HD_CAPS;
2111
2112 if ((atl1e_write_phy_reg(hw, MII_AT001_CR, 0) != 0) ||
2113 (atl1e_write_phy_reg(hw,
2114 MII_ADVERTISE, mii_advertise_data) != 0) ||
2115 (atl1e_phy_commit(hw)) != 0) {
2116 dev_dbg(&pdev->dev, "set phy register failed\n");
2117 goto wol_dis;
2118 }
2119
2120 hw->phy_configured = false; /* re-init PHY when resume */
2121
2122 /* turn on magic packet wol */
2123 if (wufc & AT_WUFC_MAG)
2124 wol_ctrl_data |= WOL_MAGIC_EN | WOL_MAGIC_PME_EN;
2125
2126 if (wufc & AT_WUFC_LNKC) {
2127 /* if orignal link status is link, just wait for retrive link */
2128 if (mii_bmsr_data & BMSR_LSTATUS) {
2129 for (i = 0; i < AT_SUSPEND_LINK_TIMEOUT; i++) {
2130 msleep(100);
2131 atl1e_read_phy_reg(hw, MII_BMSR,
2132 (u16 *)&mii_bmsr_data);
2133 if (mii_bmsr_data & BMSR_LSTATUS)
2134 break;
2135 }
2136
2137 if ((mii_bmsr_data & BMSR_LSTATUS) == 0)
2138 dev_dbg(&pdev->dev,
2139 "%s: Link may change"
2140 "when suspend\n",
2141 atl1e_driver_name);
2142 }
2143 wol_ctrl_data |= WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN;
2144 /* only link up can wake up */
2145 if (atl1e_write_phy_reg(hw, MII_INT_CTRL, 0x400) != 0) {
2146 dev_dbg(&pdev->dev, "%s: read write phy "
2147 "register failed.\n",
2148 atl1e_driver_name);
2149 goto wol_dis;
2150 }
2151 }
2152 /* clear phy interrupt */
2153 atl1e_read_phy_reg(hw, MII_INT_STATUS, &mii_intr_status_data);
2154 /* Config MAC Ctrl register */
2155 mac_ctrl_data = MAC_CTRL_RX_EN;
2156 /* set to 10/100M halt duplex */
2157 mac_ctrl_data |= MAC_CTRL_SPEED_10_100 << MAC_CTRL_SPEED_SHIFT;
2158 mac_ctrl_data |= (((u32)adapter->hw.preamble_len &
2159 MAC_CTRL_PRMLEN_MASK) <<
2160 MAC_CTRL_PRMLEN_SHIFT);
2161
2162 if (adapter->vlgrp)
2163 mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
2164
2165 /* magic packet maybe Broadcast&multicast&Unicast frame */
2166 if (wufc & AT_WUFC_MAG)
2167 mac_ctrl_data |= MAC_CTRL_BC_EN;
2168
2169 dev_dbg(&pdev->dev,
2170 "%s: suspend MAC=0x%x\n",
2171 atl1e_driver_name, mac_ctrl_data);
2172
2173 AT_WRITE_REG(hw, REG_WOL_CTRL, wol_ctrl_data);
2174 AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
2175 /* pcie patch */
2176 ctrl = AT_READ_REG(hw, REG_PCIE_PHYMISC);
2177 ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
2178 AT_WRITE_REG(hw, REG_PCIE_PHYMISC, ctrl);
2179 pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
2180 goto suspend_exit;
2181 }
2182wol_dis:
2183
2184 /* WOL disabled */
2185 AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
2186
2187 /* pcie patch */
2188 ctrl = AT_READ_REG(hw, REG_PCIE_PHYMISC);
2189 ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
2190 AT_WRITE_REG(hw, REG_PCIE_PHYMISC, ctrl);
2191
2192 atl1e_force_ps(hw);
2193 hw->phy_configured = false; /* re-init PHY when resume */
2194
2195 pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
2196
2197suspend_exit:
2198
2199 if (netif_running(netdev))
2200 atl1e_free_irq(adapter);
2201
2202 pci_disable_device(pdev);
2203
2204 pci_set_power_state(pdev, pci_choose_state(pdev, state));
2205
2206 return 0;
2207}
2208
2209#ifdef CONFIG_PM
2210static int atl1e_resume(struct pci_dev *pdev)
2211{
2212 struct net_device *netdev = pci_get_drvdata(pdev);
2213 struct atl1e_adapter *adapter = netdev_priv(netdev);
2214 u32 err;
2215
2216 pci_set_power_state(pdev, PCI_D0);
2217 pci_restore_state(pdev);
2218
2219 err = pci_enable_device(pdev);
2220 if (err) {
2221 dev_err(&pdev->dev, "ATL1e: Cannot enable PCI"
2222 " device from suspend\n");
2223 return err;
2224 }
2225
2226 pci_set_master(pdev);
2227
2228 AT_READ_REG(&adapter->hw, REG_WOL_CTRL); /* clear WOL status */
2229
2230 pci_enable_wake(pdev, PCI_D3hot, 0);
2231 pci_enable_wake(pdev, PCI_D3cold, 0);
2232
2233 AT_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0);
2234
2235 if (netif_running(netdev))
2236 err = atl1e_request_irq(adapter);
2237 if (err)
2238 return err;
2239
2240 atl1e_reset_hw(&adapter->hw);
2241
2242 if (netif_running(netdev))
2243 atl1e_up(adapter);
2244
2245 netif_device_attach(netdev);
2246
2247 return 0;
2248}
2249#endif
2250
2251static void atl1e_shutdown(struct pci_dev *pdev)
2252{
2253 atl1e_suspend(pdev, PMSG_SUSPEND);
2254}
2255
2256static int atl1e_init_netdev(struct net_device *netdev, struct pci_dev *pdev)
2257{
2258 SET_NETDEV_DEV(netdev, &pdev->dev);
2259 pci_set_drvdata(pdev, netdev);
2260
2261 netdev->irq = pdev->irq;
2262 netdev->open = &atl1e_open;
2263 netdev->stop = &atl1e_close;
2264 netdev->hard_start_xmit = &atl1e_xmit_frame;
2265 netdev->get_stats = &atl1e_get_stats;
2266 netdev->set_multicast_list = &atl1e_set_multi;
2267 netdev->set_mac_address = &atl1e_set_mac_addr;
2268 netdev->change_mtu = &atl1e_change_mtu;
2269 netdev->do_ioctl = &atl1e_ioctl;
2270 netdev->tx_timeout = &atl1e_tx_timeout;
2271 netdev->watchdog_timeo = AT_TX_WATCHDOG;
2272 netdev->vlan_rx_register = atl1e_vlan_rx_register;
2273#ifdef CONFIG_NET_POLL_CONTROLLER
2274 netdev->poll_controller = atl1e_netpoll;
2275#endif
2276 atl1e_set_ethtool_ops(netdev);
2277
2278 netdev->features = NETIF_F_SG | NETIF_F_HW_CSUM |
2279 NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
2280 netdev->features |= NETIF_F_LLTX;
2281 netdev->features |= NETIF_F_TSO;
2282 netdev->features |= NETIF_F_TSO6;
2283
2284 return 0;
2285}
2286
2287/*
2288 * atl1e_probe - Device Initialization Routine
2289 * @pdev: PCI device information struct
2290 * @ent: entry in atl1e_pci_tbl
2291 *
2292 * Returns 0 on success, negative on failure
2293 *
2294 * atl1e_probe initializes an adapter identified by a pci_dev structure.
2295 * The OS initialization, configuring of the adapter private structure,
2296 * and a hardware reset occur.
2297 */
2298static int __devinit atl1e_probe(struct pci_dev *pdev,
2299 const struct pci_device_id *ent)
2300{
2301 struct net_device *netdev;
2302 struct atl1e_adapter *adapter = NULL;
2303 static int cards_found;
2304
2305 int err = 0;
2306
2307 err = pci_enable_device(pdev);
2308 if (err) {
2309 dev_err(&pdev->dev, "cannot enable PCI device\n");
2310 return err;
2311 }
2312
2313 /*
2314 * The atl1e chip can DMA to 64-bit addresses, but it uses a single
2315 * shared register for the high 32 bits, so only a single, aligned,
2316 * 4 GB physical address range can be used at a time.
2317 *
2318 * Supporting 64-bit DMA on this hardware is more trouble than it's
2319 * worth. It is far easier to limit to 32-bit DMA than update
2320 * various kernel subsystems to support the mechanics required by a
2321 * fixed-high-32-bit system.
2322 */
2323 if ((pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) ||
2324 (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) != 0)) {
2325 dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
2326 goto err_dma;
2327 }
2328
2329 err = pci_request_regions(pdev, atl1e_driver_name);
2330 if (err) {
2331 dev_err(&pdev->dev, "cannot obtain PCI resources\n");
2332 goto err_pci_reg;
2333 }
2334
2335 pci_set_master(pdev);
2336
2337 netdev = alloc_etherdev(sizeof(struct atl1e_adapter));
2338 if (netdev == NULL) {
2339 err = -ENOMEM;
2340 dev_err(&pdev->dev, "etherdev alloc failed\n");
2341 goto err_alloc_etherdev;
2342 }
2343
2344 err = atl1e_init_netdev(netdev, pdev);
2345 if (err) {
2346 dev_err(&pdev->dev, "init netdevice failed\n");
2347 goto err_init_netdev;
2348 }
2349 adapter = netdev_priv(netdev);
2350 adapter->bd_number = cards_found;
2351 adapter->netdev = netdev;
2352 adapter->pdev = pdev;
2353 adapter->hw.adapter = adapter;
2354 adapter->hw.hw_addr = pci_iomap(pdev, BAR_0, 0);
2355 if (!adapter->hw.hw_addr) {
2356 err = -EIO;
2357 dev_err(&pdev->dev, "cannot map device registers\n");
2358 goto err_ioremap;
2359 }
2360 netdev->base_addr = (unsigned long)adapter->hw.hw_addr;
2361
2362 /* init mii data */
2363 adapter->mii.dev = netdev;
2364 adapter->mii.mdio_read = atl1e_mdio_read;
2365 adapter->mii.mdio_write = atl1e_mdio_write;
2366 adapter->mii.phy_id_mask = 0x1f;
2367 adapter->mii.reg_num_mask = MDIO_REG_ADDR_MASK;
2368
2369 netif_napi_add(netdev, &adapter->napi, atl1e_clean, 64);
2370
2371 init_timer(&adapter->phy_config_timer);
2372 adapter->phy_config_timer.function = &atl1e_phy_config;
2373 adapter->phy_config_timer.data = (unsigned long) adapter;
2374
2375 /* get user settings */
2376 atl1e_check_options(adapter);
2377 /*
2378 * Mark all PCI regions associated with PCI device
2379 * pdev as being reserved by owner atl1e_driver_name
2380 * Enables bus-mastering on the device and calls
2381 * pcibios_set_master to do the needed arch specific settings
2382 */
2383 atl1e_setup_pcicmd(pdev);
2384 /* setup the private structure */
2385 err = atl1e_sw_init(adapter);
2386 if (err) {
2387 dev_err(&pdev->dev, "net device private data init failed\n");
2388 goto err_sw_init;
2389 }
2390
2391 /* Init GPHY as early as possible due to power saving issue */
2392 spin_lock(&adapter->mdio_lock);
2393 atl1e_phy_init(&adapter->hw);
2394 spin_unlock(&adapter->mdio_lock);
2395 /* reset the controller to
2396 * put the device in a known good starting state */
2397 err = atl1e_reset_hw(&adapter->hw);
2398 if (err) {
2399 err = -EIO;
2400 goto err_reset;
2401 }
2402
2403 if (atl1e_read_mac_addr(&adapter->hw) != 0) {
2404 err = -EIO;
2405 dev_err(&pdev->dev, "get mac address failed\n");
2406 goto err_eeprom;
2407 }
2408
2409 memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
2410 memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
2411 dev_dbg(&pdev->dev, "mac address : %02x-%02x-%02x-%02x-%02x-%02x\n",
2412 adapter->hw.mac_addr[0], adapter->hw.mac_addr[1],
2413 adapter->hw.mac_addr[2], adapter->hw.mac_addr[3],
2414 adapter->hw.mac_addr[4], adapter->hw.mac_addr[5]);
2415
2416 INIT_WORK(&adapter->reset_task, atl1e_reset_task);
2417 INIT_WORK(&adapter->link_chg_task, atl1e_link_chg_task);
2418 err = register_netdev(netdev);
2419 if (err) {
2420 dev_err(&pdev->dev, "register netdevice failed\n");
2421 goto err_register;
2422 }
2423
2424 /* assume we have no link for now */
2425 netif_stop_queue(netdev);
2426 netif_carrier_off(netdev);
2427
2428 cards_found++;
2429
2430 return 0;
2431
2432err_reset:
2433err_register:
2434err_sw_init:
2435err_eeprom:
2436 iounmap(adapter->hw.hw_addr);
2437err_init_netdev:
2438err_ioremap:
2439 free_netdev(netdev);
2440err_alloc_etherdev:
2441 pci_release_regions(pdev);
2442err_pci_reg:
2443err_dma:
2444 pci_disable_device(pdev);
2445 return err;
2446}
2447
2448/*
2449 * atl1e_remove - Device Removal Routine
2450 * @pdev: PCI device information struct
2451 *
2452 * atl1e_remove is called by the PCI subsystem to alert the driver
2453 * that it should release a PCI device. The could be caused by a
2454 * Hot-Plug event, or because the driver is going to be removed from
2455 * memory.
2456 */
2457static void __devexit atl1e_remove(struct pci_dev *pdev)
2458{
2459 struct net_device *netdev = pci_get_drvdata(pdev);
2460 struct atl1e_adapter *adapter = netdev_priv(netdev);
2461
2462 /*
2463 * flush_scheduled work may reschedule our watchdog task, so
2464 * explicitly disable watchdog tasks from being rescheduled
2465 */
2466 set_bit(__AT_DOWN, &adapter->flags);
2467
2468 atl1e_del_timer(adapter);
2469 atl1e_cancel_work(adapter);
2470
2471 unregister_netdev(netdev);
2472 atl1e_free_ring_resources(adapter);
2473 atl1e_force_ps(&adapter->hw);
2474 iounmap(adapter->hw.hw_addr);
2475 pci_release_regions(pdev);
2476 free_netdev(netdev);
2477 pci_disable_device(pdev);
2478}
2479
2480/*
2481 * atl1e_io_error_detected - called when PCI error is detected
2482 * @pdev: Pointer to PCI device
2483 * @state: The current pci connection state
2484 *
2485 * This function is called after a PCI bus error affecting
2486 * this device has been detected.
2487 */
2488static pci_ers_result_t
2489atl1e_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
2490{
2491 struct net_device *netdev = pci_get_drvdata(pdev);
2492 struct atl1e_adapter *adapter = netdev->priv;
2493
2494 netif_device_detach(netdev);
2495
2496 if (netif_running(netdev))
2497 atl1e_down(adapter);
2498
2499 pci_disable_device(pdev);
2500
2501 /* Request a slot slot reset. */
2502 return PCI_ERS_RESULT_NEED_RESET;
2503}
2504
2505/*
2506 * atl1e_io_slot_reset - called after the pci bus has been reset.
2507 * @pdev: Pointer to PCI device
2508 *
2509 * Restart the card from scratch, as if from a cold-boot. Implementation
2510 * resembles the first-half of the e1000_resume routine.
2511 */
2512static pci_ers_result_t atl1e_io_slot_reset(struct pci_dev *pdev)
2513{
2514 struct net_device *netdev = pci_get_drvdata(pdev);
2515 struct atl1e_adapter *adapter = netdev->priv;
2516
2517 if (pci_enable_device(pdev)) {
2518 dev_err(&pdev->dev,
2519 "ATL1e: Cannot re-enable PCI device after reset.\n");
2520 return PCI_ERS_RESULT_DISCONNECT;
2521 }
2522 pci_set_master(pdev);
2523
2524 pci_enable_wake(pdev, PCI_D3hot, 0);
2525 pci_enable_wake(pdev, PCI_D3cold, 0);
2526
2527 atl1e_reset_hw(&adapter->hw);
2528
2529 return PCI_ERS_RESULT_RECOVERED;
2530}
2531
2532/*
2533 * atl1e_io_resume - called when traffic can start flowing again.
2534 * @pdev: Pointer to PCI device
2535 *
2536 * This callback is called when the error recovery driver tells us that
2537 * its OK to resume normal operation. Implementation resembles the
2538 * second-half of the atl1e_resume routine.
2539 */
2540static void atl1e_io_resume(struct pci_dev *pdev)
2541{
2542 struct net_device *netdev = pci_get_drvdata(pdev);
2543 struct atl1e_adapter *adapter = netdev->priv;
2544
2545 if (netif_running(netdev)) {
2546 if (atl1e_up(adapter)) {
2547 dev_err(&pdev->dev,
2548 "ATL1e: can't bring device back up after reset\n");
2549 return;
2550 }
2551 }
2552
2553 netif_device_attach(netdev);
2554}
2555
2556static struct pci_error_handlers atl1e_err_handler = {
2557 .error_detected = atl1e_io_error_detected,
2558 .slot_reset = atl1e_io_slot_reset,
2559 .resume = atl1e_io_resume,
2560};
2561
2562static struct pci_driver atl1e_driver = {
2563 .name = atl1e_driver_name,
2564 .id_table = atl1e_pci_tbl,
2565 .probe = atl1e_probe,
2566 .remove = __devexit_p(atl1e_remove),
2567 /* Power Managment Hooks */
2568#ifdef CONFIG_PM
2569 .suspend = atl1e_suspend,
2570 .resume = atl1e_resume,
2571#endif
2572 .shutdown = atl1e_shutdown,
2573 .err_handler = &atl1e_err_handler
2574};
2575
2576/*
2577 * atl1e_init_module - Driver Registration Routine
2578 *
2579 * atl1e_init_module is the first routine called when the driver is
2580 * loaded. All it does is register with the PCI subsystem.
2581 */
2582static int __init atl1e_init_module(void)
2583{
2584 return pci_register_driver(&atl1e_driver);
2585}
2586
2587/*
2588 * atl1e_exit_module - Driver Exit Cleanup Routine
2589 *
2590 * atl1e_exit_module is called just before the driver is removed
2591 * from memory.
2592 */
2593static void __exit atl1e_exit_module(void)
2594{
2595 pci_unregister_driver(&atl1e_driver);
2596}
2597
2598module_init(atl1e_init_module);
2599module_exit(atl1e_exit_module);
diff --git a/drivers/net/atl1e/atl1e_param.c b/drivers/net/atl1e/atl1e_param.c
new file mode 100644
index 000000000000..f72abb34b0cd
--- /dev/null
+++ b/drivers/net/atl1e/atl1e_param.c
@@ -0,0 +1,263 @@
1/*
2 * Copyright(c) 2007 Atheros Corporation. All rights reserved.
3 *
4 * Derived from Intel e1000 driver
5 * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21
22#include <linux/netdevice.h>
23
24#include "atl1e.h"
25
26/* This is the only thing that needs to be changed to adjust the
27 * maximum number of ports that the driver can manage.
28 */
29
30#define ATL1E_MAX_NIC 32
31
32#define OPTION_UNSET -1
33#define OPTION_DISABLED 0
34#define OPTION_ENABLED 1
35
36/* All parameters are treated the same, as an integer array of values.
37 * This macro just reduces the need to repeat the same declaration code
38 * over and over (plus this helps to avoid typo bugs).
39 */
40#define ATL1E_PARAM_INIT { [0 ... ATL1E_MAX_NIC] = OPTION_UNSET }
41
42#define ATL1E_PARAM(x, desc) \
43 static int __devinitdata x[ATL1E_MAX_NIC + 1] = ATL1E_PARAM_INIT; \
44 static int num_##x; \
45 module_param_array_named(x, x, int, &num_##x, 0); \
46 MODULE_PARM_DESC(x, desc);
47
48/* Transmit Memory count
49 *
50 * Valid Range: 64-2048
51 *
52 * Default Value: 128
53 */
54#define ATL1E_MIN_TX_DESC_CNT 32
55#define ATL1E_MAX_TX_DESC_CNT 1020
56#define ATL1E_DEFAULT_TX_DESC_CNT 128
57ATL1E_PARAM(tx_desc_cnt, "Transmit description count");
58
59/* Receive Memory Block Count
60 *
61 * Valid Range: 16-512
62 *
63 * Default Value: 128
64 */
65#define ATL1E_MIN_RX_MEM_SIZE 8 /* 8KB */
66#define ATL1E_MAX_RX_MEM_SIZE 1024 /* 1MB */
67#define ATL1E_DEFAULT_RX_MEM_SIZE 256 /* 128KB */
68ATL1E_PARAM(rx_mem_size, "memory size of rx buffer(KB)");
69
70/* User Specified MediaType Override
71 *
72 * Valid Range: 0-5
73 * - 0 - auto-negotiate at all supported speeds
74 * - 1 - only link at 100Mbps Full Duplex
75 * - 2 - only link at 100Mbps Half Duplex
76 * - 3 - only link at 10Mbps Full Duplex
77 * - 4 - only link at 10Mbps Half Duplex
78 * Default Value: 0
79 */
80
81ATL1E_PARAM(media_type, "MediaType Select");
82
83/* Interrupt Moderate Timer in units of 2 us
84 *
85 * Valid Range: 10-65535
86 *
87 * Default Value: 45000(90ms)
88 */
89#define INT_MOD_DEFAULT_CNT 100 /* 200us */
90#define INT_MOD_MAX_CNT 65000
91#define INT_MOD_MIN_CNT 50
92ATL1E_PARAM(int_mod_timer, "Interrupt Moderator Timer");
93
94#define AUTONEG_ADV_DEFAULT 0x2F
95#define AUTONEG_ADV_MASK 0x2F
96#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
97
98#define FLASH_VENDOR_DEFAULT 0
99#define FLASH_VENDOR_MIN 0
100#define FLASH_VENDOR_MAX 2
101
102struct atl1e_option {
103 enum { enable_option, range_option, list_option } type;
104 char *name;
105 char *err;
106 int def;
107 union {
108 struct { /* range_option info */
109 int min;
110 int max;
111 } r;
112 struct { /* list_option info */
113 int nr;
114 struct atl1e_opt_list { int i; char *str; } *p;
115 } l;
116 } arg;
117};
118
119static int __devinit atl1e_validate_option(int *value, struct atl1e_option *opt, struct pci_dev *pdev)
120{
121 if (*value == OPTION_UNSET) {
122 *value = opt->def;
123 return 0;
124 }
125
126 switch (opt->type) {
127 case enable_option:
128 switch (*value) {
129 case OPTION_ENABLED:
130 dev_info(&pdev->dev, "%s Enabled\n", opt->name);
131 return 0;
132 case OPTION_DISABLED:
133 dev_info(&pdev->dev, "%s Disabled\n", opt->name);
134 return 0;
135 }
136 break;
137 case range_option:
138 if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
139 dev_info(&pdev->dev, "%s set to %i\n", opt->name, *value);
140 return 0;
141 }
142 break;
143 case list_option:{
144 int i;
145 struct atl1e_opt_list *ent;
146
147 for (i = 0; i < opt->arg.l.nr; i++) {
148 ent = &opt->arg.l.p[i];
149 if (*value == ent->i) {
150 if (ent->str[0] != '\0')
151 dev_info(&pdev->dev, "%s\n",
152 ent->str);
153 return 0;
154 }
155 }
156 break;
157 }
158 default:
159 BUG();
160 }
161
162 dev_info(&pdev->dev, "Invalid %s specified (%i) %s\n",
163 opt->name, *value, opt->err);
164 *value = opt->def;
165 return -1;
166}
167
168/*
169 * atl1e_check_options - Range Checking for Command Line Parameters
170 * @adapter: board private structure
171 *
172 * This routine checks all command line parameters for valid user
173 * input. If an invalid value is given, or if no user specified
174 * value exists, a default value is used. The final value is stored
175 * in a variable in the adapter structure.
176 */
177void __devinit atl1e_check_options(struct atl1e_adapter *adapter)
178{
179 struct pci_dev *pdev = adapter->pdev;
180 int bd = adapter->bd_number;
181 if (bd >= ATL1E_MAX_NIC) {
182 dev_notice(&pdev->dev, "no configuration for board #%i\n", bd);
183 dev_notice(&pdev->dev, "Using defaults for all values\n");
184 }
185
186 { /* Transmit Ring Size */
187 struct atl1e_option opt = {
188 .type = range_option,
189 .name = "Transmit Ddescription Count",
190 .err = "using default of "
191 __MODULE_STRING(ATL1E_DEFAULT_TX_DESC_CNT),
192 .def = ATL1E_DEFAULT_TX_DESC_CNT,
193 .arg = { .r = { .min = ATL1E_MIN_TX_DESC_CNT,
194 .max = ATL1E_MAX_TX_DESC_CNT} }
195 };
196 int val;
197 if (num_tx_desc_cnt > bd) {
198 val = tx_desc_cnt[bd];
199 atl1e_validate_option(&val, &opt, pdev);
200 adapter->tx_ring.count = (u16) val & 0xFFFC;
201 } else
202 adapter->tx_ring.count = (u16)opt.def;
203 }
204
205 { /* Receive Memory Block Count */
206 struct atl1e_option opt = {
207 .type = range_option,
208 .name = "Memory size of rx buffer(KB)",
209 .err = "using default of "
210 __MODULE_STRING(ATL1E_DEFAULT_RX_MEM_SIZE),
211 .def = ATL1E_DEFAULT_RX_MEM_SIZE,
212 .arg = { .r = { .min = ATL1E_MIN_RX_MEM_SIZE,
213 .max = ATL1E_MAX_RX_MEM_SIZE} }
214 };
215 int val;
216 if (num_rx_mem_size > bd) {
217 val = rx_mem_size[bd];
218 atl1e_validate_option(&val, &opt, pdev);
219 adapter->rx_ring.page_size = (u32)val * 1024;
220 } else {
221 adapter->rx_ring.page_size = (u32)opt.def * 1024;
222 }
223 }
224
225 { /* Interrupt Moderate Timer */
226 struct atl1e_option opt = {
227 .type = range_option,
228 .name = "Interrupt Moderate Timer",
229 .err = "using default of "
230 __MODULE_STRING(INT_MOD_DEFAULT_CNT),
231 .def = INT_MOD_DEFAULT_CNT,
232 .arg = { .r = { .min = INT_MOD_MIN_CNT,
233 .max = INT_MOD_MAX_CNT} }
234 } ;
235 int val;
236 if (num_int_mod_timer > bd) {
237 val = int_mod_timer[bd];
238 atl1e_validate_option(&val, &opt, pdev);
239 adapter->hw.imt = (u16) val;
240 } else
241 adapter->hw.imt = (u16)(opt.def);
242 }
243
244 { /* MediaType */
245 struct atl1e_option opt = {
246 .type = range_option,
247 .name = "Speed/Duplex Selection",
248 .err = "using default of "
249 __MODULE_STRING(MEDIA_TYPE_AUTO_SENSOR),
250 .def = MEDIA_TYPE_AUTO_SENSOR,
251 .arg = { .r = { .min = MEDIA_TYPE_AUTO_SENSOR,
252 .max = MEDIA_TYPE_10M_HALF} }
253 } ;
254 int val;
255 if (num_media_type > bd) {
256 val = media_type[bd];
257 atl1e_validate_option(&val, &opt, pdev);
258 adapter->hw.media_type = (u16) val;
259 } else
260 adapter->hw.media_type = (u16)(opt.def);
261
262 }
263}
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 3e22e7817bc3..f12e3d12474b 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1308,7 +1308,6 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
1308 dev_info(&adapter->pdev->dev, "link is down\n"); 1308 dev_info(&adapter->pdev->dev, "link is down\n");
1309 adapter->link_speed = SPEED_0; 1309 adapter->link_speed = SPEED_0;
1310 netif_carrier_off(netdev); 1310 netif_carrier_off(netdev);
1311 netif_stop_queue(netdev);
1312 } 1311 }
1313 return 0; 1312 return 0;
1314 } 1313 }
@@ -1358,7 +1357,6 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
1358 if (!netif_carrier_ok(netdev)) { 1357 if (!netif_carrier_ok(netdev)) {
1359 /* Link down -> Up */ 1358 /* Link down -> Up */
1360 netif_carrier_on(netdev); 1359 netif_carrier_on(netdev);
1361 netif_wake_queue(netdev);
1362 } 1360 }
1363 return 0; 1361 return 0;
1364 } 1362 }
@@ -2627,6 +2625,7 @@ static s32 atl1_up(struct atl1_adapter *adapter)
2627 mod_timer(&adapter->watchdog_timer, jiffies); 2625 mod_timer(&adapter->watchdog_timer, jiffies);
2628 atlx_irq_enable(adapter); 2626 atlx_irq_enable(adapter);
2629 atl1_check_link(adapter); 2627 atl1_check_link(adapter);
2628 netif_start_queue(netdev);
2630 return 0; 2629 return 0;
2631 2630
2632err_up: 2631err_up:
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c
index 3ab61e40e86a..cb8be490e5ae 100644
--- a/drivers/net/au1000_eth.c
+++ b/drivers/net/au1000_eth.c
@@ -911,9 +911,8 @@ au1000_adjust_link(struct net_device *dev)
911 if(phydev->link != aup->old_link) { 911 if(phydev->link != aup->old_link) {
912 // link state changed 912 // link state changed
913 913
914 if (phydev->link) // link went up 914 if (!phydev->link) {
915 netif_tx_schedule_all(dev); 915 /* link went down */
916 else { // link went down
917 aup->old_speed = 0; 916 aup->old_speed = 0;
918 aup->old_duplex = -1; 917 aup->old_duplex = -1;
919 } 918 }
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c
index a6a3da89f590..a8ec60e1ed75 100644
--- a/drivers/net/bfin_mac.c
+++ b/drivers/net/bfin_mac.c
@@ -357,7 +357,6 @@ static void bfin_mac_adjust_link(struct net_device *dev)
357 if (!lp->old_link) { 357 if (!lp->old_link) {
358 new_state = 1; 358 new_state = 1;
359 lp->old_link = 1; 359 lp->old_link = 1;
360 netif_tx_schedule_all(dev);
361 } 360 }
362 } else if (lp->old_link) { 361 } else if (lp->old_link) {
363 new_state = 1; 362 new_state = 1;
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 9737c06045d6..a641eeaa2a2f 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -5041,6 +5041,7 @@ static int bond_check_params(struct bond_params *params)
5041} 5041}
5042 5042
5043static struct lock_class_key bonding_netdev_xmit_lock_key; 5043static struct lock_class_key bonding_netdev_xmit_lock_key;
5044static struct lock_class_key bonding_netdev_addr_lock_key;
5044 5045
5045static void bond_set_lockdep_class_one(struct net_device *dev, 5046static void bond_set_lockdep_class_one(struct net_device *dev,
5046 struct netdev_queue *txq, 5047 struct netdev_queue *txq,
@@ -5052,6 +5053,8 @@ static void bond_set_lockdep_class_one(struct net_device *dev,
5052 5053
5053static void bond_set_lockdep_class(struct net_device *dev) 5054static void bond_set_lockdep_class(struct net_device *dev)
5054{ 5055{
5056 lockdep_set_class(&dev->addr_list_lock,
5057 &bonding_netdev_addr_lock_key);
5055 netdev_for_each_tx_queue(dev, bond_set_lockdep_class_one, NULL); 5058 netdev_for_each_tx_queue(dev, bond_set_lockdep_class_one, NULL);
5056} 5059}
5057 5060
diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c
index fbd4280c102c..a7800e559090 100644
--- a/drivers/net/cpmac.c
+++ b/drivers/net/cpmac.c
@@ -945,10 +945,8 @@ static void cpmac_adjust_link(struct net_device *dev)
945 if (!priv->oldlink) { 945 if (!priv->oldlink) {
946 new_state = 1; 946 new_state = 1;
947 priv->oldlink = 1; 947 priv->oldlink = 1;
948 netif_tx_schedule_all(dev);
949 } 948 }
950 } else if (priv->oldlink) { 949 } else if (priv->oldlink) {
951 netif_tx_stop_all_queues(dev);
952 new_state = 1; 950 new_state = 1;
953 priv->oldlink = 0; 951 priv->oldlink = 0;
954 priv->oldspeed = 0; 952 priv->oldspeed = 0;
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 952e10d686ec..0b0f1c407a7e 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -888,19 +888,22 @@ dm9000_rx(struct net_device *dev)
888 dev_dbg(db->dev, "RST: RX Len:%x\n", RxLen); 888 dev_dbg(db->dev, "RST: RX Len:%x\n", RxLen);
889 } 889 }
890 890
891 if (rxhdr.RxStatus & 0xbf) { 891 /* rxhdr.RxStatus is identical to RSR register. */
892 if (rxhdr.RxStatus & (RSR_FOE | RSR_CE | RSR_AE |
893 RSR_PLE | RSR_RWTO |
894 RSR_LCS | RSR_RF)) {
892 GoodPacket = false; 895 GoodPacket = false;
893 if (rxhdr.RxStatus & 0x01) { 896 if (rxhdr.RxStatus & RSR_FOE) {
894 if (netif_msg_rx_err(db)) 897 if (netif_msg_rx_err(db))
895 dev_dbg(db->dev, "fifo error\n"); 898 dev_dbg(db->dev, "fifo error\n");
896 dev->stats.rx_fifo_errors++; 899 dev->stats.rx_fifo_errors++;
897 } 900 }
898 if (rxhdr.RxStatus & 0x02) { 901 if (rxhdr.RxStatus & RSR_CE) {
899 if (netif_msg_rx_err(db)) 902 if (netif_msg_rx_err(db))
900 dev_dbg(db->dev, "crc error\n"); 903 dev_dbg(db->dev, "crc error\n");
901 dev->stats.rx_crc_errors++; 904 dev->stats.rx_crc_errors++;
902 } 905 }
903 if (rxhdr.RxStatus & 0x80) { 906 if (rxhdr.RxStatus & RSR_RF) {
904 if (netif_msg_rx_err(db)) 907 if (netif_msg_rx_err(db))
905 dev_dbg(db->dev, "length error\n"); 908 dev_dbg(db->dev, "length error\n");
906 dev->stats.rx_length_errors++; 909 dev->stats.rx_length_errors++;
@@ -1067,7 +1070,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
1067 /* Fill the phyxcer register into REG_0C */ 1070 /* Fill the phyxcer register into REG_0C */
1068 iow(db, DM9000_EPAR, DM9000_PHY | reg); 1071 iow(db, DM9000_EPAR, DM9000_PHY | reg);
1069 1072
1070 iow(db, DM9000_EPCR, 0xc); /* Issue phyxcer read command */ 1073 iow(db, DM9000_EPCR, EPCR_ERPRR | EPCR_EPOS); /* Issue phyxcer read command */
1071 1074
1072 writeb(reg_save, db->io_addr); 1075 writeb(reg_save, db->io_addr);
1073 spin_unlock_irqrestore(&db->lock,flags); 1076 spin_unlock_irqrestore(&db->lock,flags);
@@ -1118,7 +1121,7 @@ dm9000_phy_write(struct net_device *dev,
1118 iow(db, DM9000_EPDRL, value); 1121 iow(db, DM9000_EPDRL, value);
1119 iow(db, DM9000_EPDRH, value >> 8); 1122 iow(db, DM9000_EPDRH, value >> 8);
1120 1123
1121 iow(db, DM9000_EPCR, 0xa); /* Issue phyxcer write command */ 1124 iow(db, DM9000_EPCR, EPCR_EPOS | EPCR_ERPRW); /* Issue phyxcer write command */
1122 1125
1123 writeb(reg_save, db->io_addr); 1126 writeb(reg_save, db->io_addr);
1124 spin_unlock_irqrestore(&db->lock, flags); 1127 spin_unlock_irqrestore(&db->lock, flags);
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h
index 31feae1ea390..19e317eaf5bc 100644
--- a/drivers/net/e1000/e1000.h
+++ b/drivers/net/e1000/e1000.h
@@ -90,10 +90,13 @@ struct e1000_adapter;
90#define E1000_ERR(args...) printk(KERN_ERR "e1000: " args) 90#define E1000_ERR(args...) printk(KERN_ERR "e1000: " args)
91 91
92#define PFX "e1000: " 92#define PFX "e1000: "
93#define DPRINTK(nlevel, klevel, fmt, args...) \ 93
94 (void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \ 94#define DPRINTK(nlevel, klevel, fmt, args...) \
95 printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \ 95do { \
96 __FUNCTION__ , ## args)) 96 if (NETIF_MSG_##nlevel & adapter->msg_enable) \
97 printk(KERN_##klevel PFX "%s: %s: " fmt, \
98 adapter->netdev->name, __func__, ##args); \
99} while (0)
97 100
98#define E1000_MAX_INTR 10 101#define E1000_MAX_INTR 10
99 102
@@ -151,9 +154,9 @@ struct e1000_adapter;
151#define E1000_MASTER_SLAVE e1000_ms_hw_default 154#define E1000_MASTER_SLAVE e1000_ms_hw_default
152#endif 155#endif
153 156
154#define E1000_MNG_VLAN_NONE -1 157#define E1000_MNG_VLAN_NONE (-1)
155/* Number of packet split data buffers (not including the header buffer) */ 158/* Number of packet split data buffers (not including the header buffer) */
156#define PS_PAGE_BUFFERS MAX_PS_BUFFERS-1 159#define PS_PAGE_BUFFERS (MAX_PS_BUFFERS - 1)
157 160
158/* wrapper around a pointer to a socket buffer, 161/* wrapper around a pointer to a socket buffer,
159 * so a DMA handle can be stored along with the buffer */ 162 * so a DMA handle can be stored along with the buffer */
@@ -165,9 +168,13 @@ struct e1000_buffer {
165 u16 next_to_watch; 168 u16 next_to_watch;
166}; 169};
167 170
171struct e1000_ps_page {
172 struct page *ps_page[PS_PAGE_BUFFERS];
173};
168 174
169struct e1000_ps_page { struct page *ps_page[PS_PAGE_BUFFERS]; }; 175struct e1000_ps_page_dma {
170struct e1000_ps_page_dma { u64 ps_page_dma[PS_PAGE_BUFFERS]; }; 176 u64 ps_page_dma[PS_PAGE_BUFFERS];
177};
171 178
172struct e1000_tx_ring { 179struct e1000_tx_ring {
173 /* pointer to the descriptor ring memory */ 180 /* pointer to the descriptor ring memory */
@@ -217,13 +224,13 @@ struct e1000_rx_ring {
217 u16 rdt; 224 u16 rdt;
218}; 225};
219 226
220#define E1000_DESC_UNUSED(R) \ 227#define E1000_DESC_UNUSED(R) \
221 ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ 228 ((((R)->next_to_clean > (R)->next_to_use) \
222 (R)->next_to_clean - (R)->next_to_use - 1) 229 ? 0 : (R)->count) + (R)->next_to_clean - (R)->next_to_use - 1)
223 230
224#define E1000_RX_DESC_PS(R, i) \ 231#define E1000_RX_DESC_PS(R, i) \
225 (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) 232 (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
226#define E1000_RX_DESC_EXT(R, i) \ 233#define E1000_RX_DESC_EXT(R, i) \
227 (&(((union e1000_rx_desc_extended *)((R).desc))[i])) 234 (&(((union e1000_rx_desc_extended *)((R).desc))[i]))
228#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) 235#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))
229#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc) 236#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc)
@@ -246,9 +253,7 @@ struct e1000_adapter {
246 u16 link_speed; 253 u16 link_speed;
247 u16 link_duplex; 254 u16 link_duplex;
248 spinlock_t stats_lock; 255 spinlock_t stats_lock;
249#ifdef CONFIG_E1000_NAPI
250 spinlock_t tx_queue_lock; 256 spinlock_t tx_queue_lock;
251#endif
252 unsigned int total_tx_bytes; 257 unsigned int total_tx_bytes;
253 unsigned int total_tx_packets; 258 unsigned int total_tx_packets;
254 unsigned int total_rx_bytes; 259 unsigned int total_rx_bytes;
@@ -286,22 +291,16 @@ struct e1000_adapter {
286 bool detect_tx_hung; 291 bool detect_tx_hung;
287 292
288 /* RX */ 293 /* RX */
289#ifdef CONFIG_E1000_NAPI 294 bool (*clean_rx)(struct e1000_adapter *adapter,
290 bool (*clean_rx) (struct e1000_adapter *adapter, 295 struct e1000_rx_ring *rx_ring,
291 struct e1000_rx_ring *rx_ring, 296 int *work_done, int work_to_do);
292 int *work_done, int work_to_do); 297 void (*alloc_rx_buf)(struct e1000_adapter *adapter,
293#else 298 struct e1000_rx_ring *rx_ring,
294 bool (*clean_rx) (struct e1000_adapter *adapter, 299 int cleaned_count);
295 struct e1000_rx_ring *rx_ring);
296#endif
297 void (*alloc_rx_buf) (struct e1000_adapter *adapter,
298 struct e1000_rx_ring *rx_ring,
299 int cleaned_count);
300 struct e1000_rx_ring *rx_ring; /* One per active queue */ 300 struct e1000_rx_ring *rx_ring; /* One per active queue */
301#ifdef CONFIG_E1000_NAPI
302 struct napi_struct napi; 301 struct napi_struct napi;
303 struct net_device *polling_netdev; /* One per active queue */ 302 struct net_device *polling_netdev; /* One per active queue */
304#endif 303
305 int num_tx_queues; 304 int num_tx_queues;
306 int num_rx_queues; 305 int num_rx_queues;
307 306
@@ -317,7 +316,6 @@ struct e1000_adapter {
317 u64 gorcl_old; 316 u64 gorcl_old;
318 u16 rx_ps_bsize0; 317 u16 rx_ps_bsize0;
319 318
320
321 /* OS defined structs */ 319 /* OS defined structs */
322 struct net_device *netdev; 320 struct net_device *netdev;
323 struct pci_dev *pdev; 321 struct pci_dev *pdev;
@@ -342,6 +340,10 @@ struct e1000_adapter {
342 bool quad_port_a; 340 bool quad_port_a;
343 unsigned long flags; 341 unsigned long flags;
344 u32 eeprom_wol; 342 u32 eeprom_wol;
343
344 /* for ioport free */
345 int bars;
346 int need_ioport;
345}; 347};
346 348
347enum e1000_state_t { 349enum e1000_state_t {
@@ -353,9 +355,18 @@ enum e1000_state_t {
353extern char e1000_driver_name[]; 355extern char e1000_driver_name[];
354extern const char e1000_driver_version[]; 356extern const char e1000_driver_version[];
355 357
358extern int e1000_up(struct e1000_adapter *adapter);
359extern void e1000_down(struct e1000_adapter *adapter);
360extern void e1000_reinit_locked(struct e1000_adapter *adapter);
361extern void e1000_reset(struct e1000_adapter *adapter);
362extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx);
363extern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
364extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
365extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
366extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
367extern void e1000_update_stats(struct e1000_adapter *adapter);
356extern void e1000_power_up_phy(struct e1000_adapter *); 368extern void e1000_power_up_phy(struct e1000_adapter *);
357extern void e1000_set_ethtool_ops(struct net_device *netdev); 369extern void e1000_set_ethtool_ops(struct net_device *netdev);
358extern void e1000_check_options(struct e1000_adapter *adapter); 370extern void e1000_check_options(struct e1000_adapter *adapter);
359 371
360
361#endif /* _E1000_H_ */ 372#endif /* _E1000_H_ */
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c
index a3f6a9c72ec8..6a3893acfe04 100644
--- a/drivers/net/e1000/e1000_ethtool.c
+++ b/drivers/net/e1000/e1000_ethtool.c
@@ -29,21 +29,8 @@
29/* ethtool support for e1000 */ 29/* ethtool support for e1000 */
30 30
31#include "e1000.h" 31#include "e1000.h"
32
33#include <asm/uaccess.h> 32#include <asm/uaccess.h>
34 33
35extern int e1000_up(struct e1000_adapter *adapter);
36extern void e1000_down(struct e1000_adapter *adapter);
37extern void e1000_reinit_locked(struct e1000_adapter *adapter);
38extern void e1000_reset(struct e1000_adapter *adapter);
39extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx);
40extern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
41extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
42extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
43extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
44extern void e1000_update_stats(struct e1000_adapter *adapter);
45
46
47struct e1000_stats { 34struct e1000_stats {
48 char stat_string[ETH_GSTRING_LEN]; 35 char stat_string[ETH_GSTRING_LEN];
49 int sizeof_stat; 36 int sizeof_stat;
@@ -112,8 +99,8 @@ static const char e1000_gstrings_test[][ETH_GSTRING_LEN] = {
112}; 99};
113#define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test) 100#define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test)
114 101
115static int 102static int e1000_get_settings(struct net_device *netdev,
116e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) 103 struct ethtool_cmd *ecmd)
117{ 104{
118 struct e1000_adapter *adapter = netdev_priv(netdev); 105 struct e1000_adapter *adapter = netdev_priv(netdev);
119 struct e1000_hw *hw = &adapter->hw; 106 struct e1000_hw *hw = &adapter->hw;
@@ -162,7 +149,7 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
162 ecmd->transceiver = XCVR_EXTERNAL; 149 ecmd->transceiver = XCVR_EXTERNAL;
163 } 150 }
164 151
165 if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) { 152 if (er32(STATUS) & E1000_STATUS_LU) {
166 153
167 e1000_get_speed_and_duplex(hw, &adapter->link_speed, 154 e1000_get_speed_and_duplex(hw, &adapter->link_speed,
168 &adapter->link_duplex); 155 &adapter->link_duplex);
@@ -185,8 +172,8 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
185 return 0; 172 return 0;
186} 173}
187 174
188static int 175static int e1000_set_settings(struct net_device *netdev,
189e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) 176 struct ethtool_cmd *ecmd)
190{ 177{
191 struct e1000_adapter *adapter = netdev_priv(netdev); 178 struct e1000_adapter *adapter = netdev_priv(netdev);
192 struct e1000_hw *hw = &adapter->hw; 179 struct e1000_hw *hw = &adapter->hw;
@@ -231,9 +218,8 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
231 return 0; 218 return 0;
232} 219}
233 220
234static void 221static void e1000_get_pauseparam(struct net_device *netdev,
235e1000_get_pauseparam(struct net_device *netdev, 222 struct ethtool_pauseparam *pause)
236 struct ethtool_pauseparam *pause)
237{ 223{
238 struct e1000_adapter *adapter = netdev_priv(netdev); 224 struct e1000_adapter *adapter = netdev_priv(netdev);
239 struct e1000_hw *hw = &adapter->hw; 225 struct e1000_hw *hw = &adapter->hw;
@@ -251,9 +237,8 @@ e1000_get_pauseparam(struct net_device *netdev,
251 } 237 }
252} 238}
253 239
254static int 240static int e1000_set_pauseparam(struct net_device *netdev,
255e1000_set_pauseparam(struct net_device *netdev, 241 struct ethtool_pauseparam *pause)
256 struct ethtool_pauseparam *pause)
257{ 242{
258 struct e1000_adapter *adapter = netdev_priv(netdev); 243 struct e1000_adapter *adapter = netdev_priv(netdev);
259 struct e1000_hw *hw = &adapter->hw; 244 struct e1000_hw *hw = &adapter->hw;
@@ -289,15 +274,13 @@ e1000_set_pauseparam(struct net_device *netdev,
289 return retval; 274 return retval;
290} 275}
291 276
292static u32 277static u32 e1000_get_rx_csum(struct net_device *netdev)
293e1000_get_rx_csum(struct net_device *netdev)
294{ 278{
295 struct e1000_adapter *adapter = netdev_priv(netdev); 279 struct e1000_adapter *adapter = netdev_priv(netdev);
296 return adapter->rx_csum; 280 return adapter->rx_csum;
297} 281}
298 282
299static int 283static int e1000_set_rx_csum(struct net_device *netdev, u32 data)
300e1000_set_rx_csum(struct net_device *netdev, u32 data)
301{ 284{
302 struct e1000_adapter *adapter = netdev_priv(netdev); 285 struct e1000_adapter *adapter = netdev_priv(netdev);
303 adapter->rx_csum = data; 286 adapter->rx_csum = data;
@@ -309,18 +292,17 @@ e1000_set_rx_csum(struct net_device *netdev, u32 data)
309 return 0; 292 return 0;
310} 293}
311 294
312static u32 295static u32 e1000_get_tx_csum(struct net_device *netdev)
313e1000_get_tx_csum(struct net_device *netdev)
314{ 296{
315 return (netdev->features & NETIF_F_HW_CSUM) != 0; 297 return (netdev->features & NETIF_F_HW_CSUM) != 0;
316} 298}
317 299
318static int 300static int e1000_set_tx_csum(struct net_device *netdev, u32 data)
319e1000_set_tx_csum(struct net_device *netdev, u32 data)
320{ 301{
321 struct e1000_adapter *adapter = netdev_priv(netdev); 302 struct e1000_adapter *adapter = netdev_priv(netdev);
303 struct e1000_hw *hw = &adapter->hw;
322 304
323 if (adapter->hw.mac_type < e1000_82543) { 305 if (hw->mac_type < e1000_82543) {
324 if (!data) 306 if (!data)
325 return -EINVAL; 307 return -EINVAL;
326 return 0; 308 return 0;
@@ -334,12 +316,13 @@ e1000_set_tx_csum(struct net_device *netdev, u32 data)
334 return 0; 316 return 0;
335} 317}
336 318
337static int 319static int e1000_set_tso(struct net_device *netdev, u32 data)
338e1000_set_tso(struct net_device *netdev, u32 data)
339{ 320{
340 struct e1000_adapter *adapter = netdev_priv(netdev); 321 struct e1000_adapter *adapter = netdev_priv(netdev);
341 if ((adapter->hw.mac_type < e1000_82544) || 322 struct e1000_hw *hw = &adapter->hw;
342 (adapter->hw.mac_type == e1000_82547)) 323
324 if ((hw->mac_type < e1000_82544) ||
325 (hw->mac_type == e1000_82547))
343 return data ? -EINVAL : 0; 326 return data ? -EINVAL : 0;
344 327
345 if (data) 328 if (data)
@@ -357,30 +340,26 @@ e1000_set_tso(struct net_device *netdev, u32 data)
357 return 0; 340 return 0;
358} 341}
359 342
360static u32 343static u32 e1000_get_msglevel(struct net_device *netdev)
361e1000_get_msglevel(struct net_device *netdev)
362{ 344{
363 struct e1000_adapter *adapter = netdev_priv(netdev); 345 struct e1000_adapter *adapter = netdev_priv(netdev);
364 return adapter->msg_enable; 346 return adapter->msg_enable;
365} 347}
366 348
367static void 349static void e1000_set_msglevel(struct net_device *netdev, u32 data)
368e1000_set_msglevel(struct net_device *netdev, u32 data)
369{ 350{
370 struct e1000_adapter *adapter = netdev_priv(netdev); 351 struct e1000_adapter *adapter = netdev_priv(netdev);
371 adapter->msg_enable = data; 352 adapter->msg_enable = data;
372} 353}
373 354
374static int 355static int e1000_get_regs_len(struct net_device *netdev)
375e1000_get_regs_len(struct net_device *netdev)
376{ 356{
377#define E1000_REGS_LEN 32 357#define E1000_REGS_LEN 32
378 return E1000_REGS_LEN * sizeof(u32); 358 return E1000_REGS_LEN * sizeof(u32);
379} 359}
380 360
381static void 361static void e1000_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
382e1000_get_regs(struct net_device *netdev, 362 void *p)
383 struct ethtool_regs *regs, void *p)
384{ 363{
385 struct e1000_adapter *adapter = netdev_priv(netdev); 364 struct e1000_adapter *adapter = netdev_priv(netdev);
386 struct e1000_hw *hw = &adapter->hw; 365 struct e1000_hw *hw = &adapter->hw;
@@ -391,22 +370,22 @@ e1000_get_regs(struct net_device *netdev,
391 370
392 regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id; 371 regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id;
393 372
394 regs_buff[0] = E1000_READ_REG(hw, CTRL); 373 regs_buff[0] = er32(CTRL);
395 regs_buff[1] = E1000_READ_REG(hw, STATUS); 374 regs_buff[1] = er32(STATUS);
396 375
397 regs_buff[2] = E1000_READ_REG(hw, RCTL); 376 regs_buff[2] = er32(RCTL);
398 regs_buff[3] = E1000_READ_REG(hw, RDLEN); 377 regs_buff[3] = er32(RDLEN);
399 regs_buff[4] = E1000_READ_REG(hw, RDH); 378 regs_buff[4] = er32(RDH);
400 regs_buff[5] = E1000_READ_REG(hw, RDT); 379 regs_buff[5] = er32(RDT);
401 regs_buff[6] = E1000_READ_REG(hw, RDTR); 380 regs_buff[6] = er32(RDTR);
402 381
403 regs_buff[7] = E1000_READ_REG(hw, TCTL); 382 regs_buff[7] = er32(TCTL);
404 regs_buff[8] = E1000_READ_REG(hw, TDLEN); 383 regs_buff[8] = er32(TDLEN);
405 regs_buff[9] = E1000_READ_REG(hw, TDH); 384 regs_buff[9] = er32(TDH);
406 regs_buff[10] = E1000_READ_REG(hw, TDT); 385 regs_buff[10] = er32(TDT);
407 regs_buff[11] = E1000_READ_REG(hw, TIDV); 386 regs_buff[11] = er32(TIDV);
408 387
409 regs_buff[12] = adapter->hw.phy_type; /* PHY type (IGP=1, M88=0) */ 388 regs_buff[12] = hw->phy_type; /* PHY type (IGP=1, M88=0) */
410 if (hw->phy_type == e1000_phy_igp) { 389 if (hw->phy_type == e1000_phy_igp) {
411 e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 390 e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT,
412 IGP01E1000_PHY_AGC_A); 391 IGP01E1000_PHY_AGC_A);
@@ -464,20 +443,20 @@ e1000_get_regs(struct net_device *netdev,
464 if (hw->mac_type >= e1000_82540 && 443 if (hw->mac_type >= e1000_82540 &&
465 hw->mac_type < e1000_82571 && 444 hw->mac_type < e1000_82571 &&
466 hw->media_type == e1000_media_type_copper) { 445 hw->media_type == e1000_media_type_copper) {
467 regs_buff[26] = E1000_READ_REG(hw, MANC); 446 regs_buff[26] = er32(MANC);
468 } 447 }
469} 448}
470 449
471static int 450static int e1000_get_eeprom_len(struct net_device *netdev)
472e1000_get_eeprom_len(struct net_device *netdev)
473{ 451{
474 struct e1000_adapter *adapter = netdev_priv(netdev); 452 struct e1000_adapter *adapter = netdev_priv(netdev);
475 return adapter->hw.eeprom.word_size * 2; 453 struct e1000_hw *hw = &adapter->hw;
454
455 return hw->eeprom.word_size * 2;
476} 456}
477 457
478static int 458static int e1000_get_eeprom(struct net_device *netdev,
479e1000_get_eeprom(struct net_device *netdev, 459 struct ethtool_eeprom *eeprom, u8 *bytes)
480 struct ethtool_eeprom *eeprom, u8 *bytes)
481{ 460{
482 struct e1000_adapter *adapter = netdev_priv(netdev); 461 struct e1000_adapter *adapter = netdev_priv(netdev);
483 struct e1000_hw *hw = &adapter->hw; 462 struct e1000_hw *hw = &adapter->hw;
@@ -504,10 +483,12 @@ e1000_get_eeprom(struct net_device *netdev,
504 last_word - first_word + 1, 483 last_word - first_word + 1,
505 eeprom_buff); 484 eeprom_buff);
506 else { 485 else {
507 for (i = 0; i < last_word - first_word + 1; i++) 486 for (i = 0; i < last_word - first_word + 1; i++) {
508 if ((ret_val = e1000_read_eeprom(hw, first_word + i, 1, 487 ret_val = e1000_read_eeprom(hw, first_word + i, 1,
509 &eeprom_buff[i]))) 488 &eeprom_buff[i]);
489 if (ret_val)
510 break; 490 break;
491 }
511 } 492 }
512 493
513 /* Device's eeprom is always little-endian, word addressable */ 494 /* Device's eeprom is always little-endian, word addressable */
@@ -521,9 +502,8 @@ e1000_get_eeprom(struct net_device *netdev,
521 return ret_val; 502 return ret_val;
522} 503}
523 504
524static int 505static int e1000_set_eeprom(struct net_device *netdev,
525e1000_set_eeprom(struct net_device *netdev, 506 struct ethtool_eeprom *eeprom, u8 *bytes)
526 struct ethtool_eeprom *eeprom, u8 *bytes)
527{ 507{
528 struct e1000_adapter *adapter = netdev_priv(netdev); 508 struct e1000_adapter *adapter = netdev_priv(netdev);
529 struct e1000_hw *hw = &adapter->hw; 509 struct e1000_hw *hw = &adapter->hw;
@@ -584,11 +564,11 @@ e1000_set_eeprom(struct net_device *netdev,
584 return ret_val; 564 return ret_val;
585} 565}
586 566
587static void 567static void e1000_get_drvinfo(struct net_device *netdev,
588e1000_get_drvinfo(struct net_device *netdev, 568 struct ethtool_drvinfo *drvinfo)
589 struct ethtool_drvinfo *drvinfo)
590{ 569{
591 struct e1000_adapter *adapter = netdev_priv(netdev); 570 struct e1000_adapter *adapter = netdev_priv(netdev);
571 struct e1000_hw *hw = &adapter->hw;
592 char firmware_version[32]; 572 char firmware_version[32];
593 u16 eeprom_data; 573 u16 eeprom_data;
594 574
@@ -597,8 +577,8 @@ e1000_get_drvinfo(struct net_device *netdev,
597 577
598 /* EEPROM image version # is reported as firmware version # for 578 /* EEPROM image version # is reported as firmware version # for
599 * 8257{1|2|3} controllers */ 579 * 8257{1|2|3} controllers */
600 e1000_read_eeprom(&adapter->hw, 5, 1, &eeprom_data); 580 e1000_read_eeprom(hw, 5, 1, &eeprom_data);
601 switch (adapter->hw.mac_type) { 581 switch (hw->mac_type) {
602 case e1000_82571: 582 case e1000_82571:
603 case e1000_82572: 583 case e1000_82572:
604 case e1000_82573: 584 case e1000_82573:
@@ -619,12 +599,12 @@ e1000_get_drvinfo(struct net_device *netdev,
619 drvinfo->eedump_len = e1000_get_eeprom_len(netdev); 599 drvinfo->eedump_len = e1000_get_eeprom_len(netdev);
620} 600}
621 601
622static void 602static void e1000_get_ringparam(struct net_device *netdev,
623e1000_get_ringparam(struct net_device *netdev, 603 struct ethtool_ringparam *ring)
624 struct ethtool_ringparam *ring)
625{ 604{
626 struct e1000_adapter *adapter = netdev_priv(netdev); 605 struct e1000_adapter *adapter = netdev_priv(netdev);
627 e1000_mac_type mac_type = adapter->hw.mac_type; 606 struct e1000_hw *hw = &adapter->hw;
607 e1000_mac_type mac_type = hw->mac_type;
628 struct e1000_tx_ring *txdr = adapter->tx_ring; 608 struct e1000_tx_ring *txdr = adapter->tx_ring;
629 struct e1000_rx_ring *rxdr = adapter->rx_ring; 609 struct e1000_rx_ring *rxdr = adapter->rx_ring;
630 610
@@ -640,12 +620,12 @@ e1000_get_ringparam(struct net_device *netdev,
640 ring->rx_jumbo_pending = 0; 620 ring->rx_jumbo_pending = 0;
641} 621}
642 622
643static int 623static int e1000_set_ringparam(struct net_device *netdev,
644e1000_set_ringparam(struct net_device *netdev, 624 struct ethtool_ringparam *ring)
645 struct ethtool_ringparam *ring)
646{ 625{
647 struct e1000_adapter *adapter = netdev_priv(netdev); 626 struct e1000_adapter *adapter = netdev_priv(netdev);
648 e1000_mac_type mac_type = adapter->hw.mac_type; 627 struct e1000_hw *hw = &adapter->hw;
628 e1000_mac_type mac_type = hw->mac_type;
649 struct e1000_tx_ring *txdr, *tx_old; 629 struct e1000_tx_ring *txdr, *tx_old;
650 struct e1000_rx_ring *rxdr, *rx_old; 630 struct e1000_rx_ring *rxdr, *rx_old;
651 int i, err; 631 int i, err;
@@ -691,9 +671,11 @@ e1000_set_ringparam(struct net_device *netdev,
691 671
692 if (netif_running(adapter->netdev)) { 672 if (netif_running(adapter->netdev)) {
693 /* Try to get new resources before deleting old */ 673 /* Try to get new resources before deleting old */
694 if ((err = e1000_setup_all_rx_resources(adapter))) 674 err = e1000_setup_all_rx_resources(adapter);
675 if (err)
695 goto err_setup_rx; 676 goto err_setup_rx;
696 if ((err = e1000_setup_all_tx_resources(adapter))) 677 err = e1000_setup_all_tx_resources(adapter);
678 if (err)
697 goto err_setup_tx; 679 goto err_setup_tx;
698 680
699 /* save the new, restore the old in order to free it, 681 /* save the new, restore the old in order to free it,
@@ -707,7 +689,8 @@ e1000_set_ringparam(struct net_device *netdev,
707 kfree(rx_old); 689 kfree(rx_old);
708 adapter->rx_ring = rxdr; 690 adapter->rx_ring = rxdr;
709 adapter->tx_ring = txdr; 691 adapter->tx_ring = txdr;
710 if ((err = e1000_up(adapter))) 692 err = e1000_up(adapter);
693 if (err)
711 goto err_setup; 694 goto err_setup;
712 } 695 }
713 696
@@ -728,12 +711,13 @@ err_setup:
728 return err; 711 return err;
729} 712}
730 713
731static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data, 714static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data, int reg,
732 int reg, u32 mask, u32 write) 715 u32 mask, u32 write)
733{ 716{
717 struct e1000_hw *hw = &adapter->hw;
734 static const u32 test[] = 718 static const u32 test[] =
735 {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; 719 {0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF};
736 u8 __iomem *address = adapter->hw.hw_addr + reg; 720 u8 __iomem *address = hw->hw_addr + reg;
737 u32 read; 721 u32 read;
738 int i; 722 int i;
739 723
@@ -751,10 +735,11 @@ static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data,
751 return false; 735 return false;
752} 736}
753 737
754static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data, 738static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data, int reg,
755 int reg, u32 mask, u32 write) 739 u32 mask, u32 write)
756{ 740{
757 u8 __iomem *address = adapter->hw.hw_addr + reg; 741 struct e1000_hw *hw = &adapter->hw;
742 u8 __iomem *address = hw->hw_addr + reg;
758 u32 read; 743 u32 read;
759 744
760 writel(write & mask, address); 745 writel(write & mask, address);
@@ -772,7 +757,7 @@ static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data,
772#define REG_PATTERN_TEST(reg, mask, write) \ 757#define REG_PATTERN_TEST(reg, mask, write) \
773 do { \ 758 do { \
774 if (reg_pattern_test(adapter, data, \ 759 if (reg_pattern_test(adapter, data, \
775 (adapter->hw.mac_type >= e1000_82543) \ 760 (hw->mac_type >= e1000_82543) \
776 ? E1000_##reg : E1000_82542_##reg, \ 761 ? E1000_##reg : E1000_82542_##reg, \
777 mask, write)) \ 762 mask, write)) \
778 return 1; \ 763 return 1; \
@@ -781,22 +766,22 @@ static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data,
781#define REG_SET_AND_CHECK(reg, mask, write) \ 766#define REG_SET_AND_CHECK(reg, mask, write) \
782 do { \ 767 do { \
783 if (reg_set_and_check(adapter, data, \ 768 if (reg_set_and_check(adapter, data, \
784 (adapter->hw.mac_type >= e1000_82543) \ 769 (hw->mac_type >= e1000_82543) \
785 ? E1000_##reg : E1000_82542_##reg, \ 770 ? E1000_##reg : E1000_82542_##reg, \
786 mask, write)) \ 771 mask, write)) \
787 return 1; \ 772 return 1; \
788 } while (0) 773 } while (0)
789 774
790static int 775static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
791e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
792{ 776{
793 u32 value, before, after; 777 u32 value, before, after;
794 u32 i, toggle; 778 u32 i, toggle;
779 struct e1000_hw *hw = &adapter->hw;
795 780
796 /* The status register is Read Only, so a write should fail. 781 /* The status register is Read Only, so a write should fail.
797 * Some bits that get toggled are ignored. 782 * Some bits that get toggled are ignored.
798 */ 783 */
799 switch (adapter->hw.mac_type) { 784 switch (hw->mac_type) {
800 /* there are several bits on newer hardware that are r/w */ 785 /* there are several bits on newer hardware that are r/w */
801 case e1000_82571: 786 case e1000_82571:
802 case e1000_82572: 787 case e1000_82572:
@@ -812,10 +797,10 @@ e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
812 break; 797 break;
813 } 798 }
814 799
815 before = E1000_READ_REG(&adapter->hw, STATUS); 800 before = er32(STATUS);
816 value = (E1000_READ_REG(&adapter->hw, STATUS) & toggle); 801 value = (er32(STATUS) & toggle);
817 E1000_WRITE_REG(&adapter->hw, STATUS, toggle); 802 ew32(STATUS, toggle);
818 after = E1000_READ_REG(&adapter->hw, STATUS) & toggle; 803 after = er32(STATUS) & toggle;
819 if (value != after) { 804 if (value != after) {
820 DPRINTK(DRV, ERR, "failed STATUS register test got: " 805 DPRINTK(DRV, ERR, "failed STATUS register test got: "
821 "0x%08X expected: 0x%08X\n", after, value); 806 "0x%08X expected: 0x%08X\n", after, value);
@@ -823,9 +808,9 @@ e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
823 return 1; 808 return 1;
824 } 809 }
825 /* restore previous status */ 810 /* restore previous status */
826 E1000_WRITE_REG(&adapter->hw, STATUS, before); 811 ew32(STATUS, before);
827 812
828 if (adapter->hw.mac_type != e1000_ich8lan) { 813 if (hw->mac_type != e1000_ich8lan) {
829 REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF); 814 REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
830 REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF); 815 REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
831 REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF); 816 REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
@@ -845,20 +830,20 @@ e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
845 830
846 REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000); 831 REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000);
847 832
848 before = (adapter->hw.mac_type == e1000_ich8lan ? 833 before = (hw->mac_type == e1000_ich8lan ?
849 0x06C3B33E : 0x06DFB3FE); 834 0x06C3B33E : 0x06DFB3FE);
850 REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB); 835 REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB);
851 REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000); 836 REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000);
852 837
853 if (adapter->hw.mac_type >= e1000_82543) { 838 if (hw->mac_type >= e1000_82543) {
854 839
855 REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF); 840 REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF);
856 REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); 841 REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
857 if (adapter->hw.mac_type != e1000_ich8lan) 842 if (hw->mac_type != e1000_ich8lan)
858 REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); 843 REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
859 REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); 844 REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
860 REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF); 845 REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF);
861 value = (adapter->hw.mac_type == e1000_ich8lan ? 846 value = (hw->mac_type == e1000_ich8lan ?
862 E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES); 847 E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES);
863 for (i = 0; i < value; i++) { 848 for (i = 0; i < value; i++) {
864 REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF, 849 REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF,
@@ -874,7 +859,7 @@ e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
874 859
875 } 860 }
876 861
877 value = (adapter->hw.mac_type == e1000_ich8lan ? 862 value = (hw->mac_type == e1000_ich8lan ?
878 E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE); 863 E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE);
879 for (i = 0; i < value; i++) 864 for (i = 0; i < value; i++)
880 REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF); 865 REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF);
@@ -883,9 +868,9 @@ e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
883 return 0; 868 return 0;
884} 869}
885 870
886static int 871static int e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data)
887e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data)
888{ 872{
873 struct e1000_hw *hw = &adapter->hw;
889 u16 temp; 874 u16 temp;
890 u16 checksum = 0; 875 u16 checksum = 0;
891 u16 i; 876 u16 i;
@@ -893,7 +878,7 @@ e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data)
893 *data = 0; 878 *data = 0;
894 /* Read and add up the contents of the EEPROM */ 879 /* Read and add up the contents of the EEPROM */
895 for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) { 880 for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
896 if ((e1000_read_eeprom(&adapter->hw, i, 1, &temp)) < 0) { 881 if ((e1000_read_eeprom(hw, i, 1, &temp)) < 0) {
897 *data = 1; 882 *data = 1;
898 break; 883 break;
899 } 884 }
@@ -901,30 +886,30 @@ e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data)
901 } 886 }
902 887
903 /* If Checksum is not Correct return error else test passed */ 888 /* If Checksum is not Correct return error else test passed */
904 if ((checksum != (u16) EEPROM_SUM) && !(*data)) 889 if ((checksum != (u16)EEPROM_SUM) && !(*data))
905 *data = 2; 890 *data = 2;
906 891
907 return *data; 892 return *data;
908} 893}
909 894
910static irqreturn_t 895static irqreturn_t e1000_test_intr(int irq, void *data)
911e1000_test_intr(int irq, void *data)
912{ 896{
913 struct net_device *netdev = (struct net_device *) data; 897 struct net_device *netdev = (struct net_device *)data;
914 struct e1000_adapter *adapter = netdev_priv(netdev); 898 struct e1000_adapter *adapter = netdev_priv(netdev);
899 struct e1000_hw *hw = &adapter->hw;
915 900
916 adapter->test_icr |= E1000_READ_REG(&adapter->hw, ICR); 901 adapter->test_icr |= er32(ICR);
917 902
918 return IRQ_HANDLED; 903 return IRQ_HANDLED;
919} 904}
920 905
921static int 906static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
922e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
923{ 907{
924 struct net_device *netdev = adapter->netdev; 908 struct net_device *netdev = adapter->netdev;
925 u32 mask, i = 0; 909 u32 mask, i = 0;
926 bool shared_int = true; 910 bool shared_int = true;
927 u32 irq = adapter->pdev->irq; 911 u32 irq = adapter->pdev->irq;
912 struct e1000_hw *hw = &adapter->hw;
928 913
929 *data = 0; 914 *data = 0;
930 915
@@ -942,13 +927,13 @@ e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
942 (shared_int ? "shared" : "unshared")); 927 (shared_int ? "shared" : "unshared"));
943 928
944 /* Disable all the interrupts */ 929 /* Disable all the interrupts */
945 E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF); 930 ew32(IMC, 0xFFFFFFFF);
946 msleep(10); 931 msleep(10);
947 932
948 /* Test each interrupt */ 933 /* Test each interrupt */
949 for (; i < 10; i++) { 934 for (; i < 10; i++) {
950 935
951 if (adapter->hw.mac_type == e1000_ich8lan && i == 8) 936 if (hw->mac_type == e1000_ich8lan && i == 8)
952 continue; 937 continue;
953 938
954 /* Interrupt to test */ 939 /* Interrupt to test */
@@ -962,8 +947,8 @@ e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
962 * test failed. 947 * test failed.
963 */ 948 */
964 adapter->test_icr = 0; 949 adapter->test_icr = 0;
965 E1000_WRITE_REG(&adapter->hw, IMC, mask); 950 ew32(IMC, mask);
966 E1000_WRITE_REG(&adapter->hw, ICS, mask); 951 ew32(ICS, mask);
967 msleep(10); 952 msleep(10);
968 953
969 if (adapter->test_icr & mask) { 954 if (adapter->test_icr & mask) {
@@ -979,8 +964,8 @@ e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
979 * test failed. 964 * test failed.
980 */ 965 */
981 adapter->test_icr = 0; 966 adapter->test_icr = 0;
982 E1000_WRITE_REG(&adapter->hw, IMS, mask); 967 ew32(IMS, mask);
983 E1000_WRITE_REG(&adapter->hw, ICS, mask); 968 ew32(ICS, mask);
984 msleep(10); 969 msleep(10);
985 970
986 if (!(adapter->test_icr & mask)) { 971 if (!(adapter->test_icr & mask)) {
@@ -996,8 +981,8 @@ e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
996 * test failed. 981 * test failed.
997 */ 982 */
998 adapter->test_icr = 0; 983 adapter->test_icr = 0;
999 E1000_WRITE_REG(&adapter->hw, IMC, ~mask & 0x00007FFF); 984 ew32(IMC, ~mask & 0x00007FFF);
1000 E1000_WRITE_REG(&adapter->hw, ICS, ~mask & 0x00007FFF); 985 ew32(ICS, ~mask & 0x00007FFF);
1001 msleep(10); 986 msleep(10);
1002 987
1003 if (adapter->test_icr) { 988 if (adapter->test_icr) {
@@ -1008,7 +993,7 @@ e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
1008 } 993 }
1009 994
1010 /* Disable all the interrupts */ 995 /* Disable all the interrupts */
1011 E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF); 996 ew32(IMC, 0xFFFFFFFF);
1012 msleep(10); 997 msleep(10);
1013 998
1014 /* Unhook test interrupt handler */ 999 /* Unhook test interrupt handler */
@@ -1017,8 +1002,7 @@ e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
1017 return *data; 1002 return *data;
1018} 1003}
1019 1004
1020static void 1005static void e1000_free_desc_rings(struct e1000_adapter *adapter)
1021e1000_free_desc_rings(struct e1000_adapter *adapter)
1022{ 1006{
1023 struct e1000_tx_ring *txdr = &adapter->test_tx_ring; 1007 struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
1024 struct e1000_rx_ring *rxdr = &adapter->test_rx_ring; 1008 struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
@@ -1064,9 +1048,9 @@ e1000_free_desc_rings(struct e1000_adapter *adapter)
1064 return; 1048 return;
1065} 1049}
1066 1050
1067static int 1051static int e1000_setup_desc_rings(struct e1000_adapter *adapter)
1068e1000_setup_desc_rings(struct e1000_adapter *adapter)
1069{ 1052{
1053 struct e1000_hw *hw = &adapter->hw;
1070 struct e1000_tx_ring *txdr = &adapter->test_tx_ring; 1054 struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
1071 struct e1000_rx_ring *rxdr = &adapter->test_rx_ring; 1055 struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
1072 struct pci_dev *pdev = adapter->pdev; 1056 struct pci_dev *pdev = adapter->pdev;
@@ -1078,41 +1062,39 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
1078 if (!txdr->count) 1062 if (!txdr->count)
1079 txdr->count = E1000_DEFAULT_TXD; 1063 txdr->count = E1000_DEFAULT_TXD;
1080 1064
1081 if (!(txdr->buffer_info = kcalloc(txdr->count, 1065 txdr->buffer_info = kcalloc(txdr->count, sizeof(struct e1000_buffer),
1082 sizeof(struct e1000_buffer), 1066 GFP_KERNEL);
1083 GFP_KERNEL))) { 1067 if (!txdr->buffer_info) {
1084 ret_val = 1; 1068 ret_val = 1;
1085 goto err_nomem; 1069 goto err_nomem;
1086 } 1070 }
1087 1071
1088 txdr->size = txdr->count * sizeof(struct e1000_tx_desc); 1072 txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
1089 txdr->size = ALIGN(txdr->size, 4096); 1073 txdr->size = ALIGN(txdr->size, 4096);
1090 if (!(txdr->desc = pci_alloc_consistent(pdev, txdr->size, 1074 txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
1091 &txdr->dma))) { 1075 if (!txdr->desc) {
1092 ret_val = 2; 1076 ret_val = 2;
1093 goto err_nomem; 1077 goto err_nomem;
1094 } 1078 }
1095 memset(txdr->desc, 0, txdr->size); 1079 memset(txdr->desc, 0, txdr->size);
1096 txdr->next_to_use = txdr->next_to_clean = 0; 1080 txdr->next_to_use = txdr->next_to_clean = 0;
1097 1081
1098 E1000_WRITE_REG(&adapter->hw, TDBAL, 1082 ew32(TDBAL, ((u64)txdr->dma & 0x00000000FFFFFFFF));
1099 ((u64) txdr->dma & 0x00000000FFFFFFFF)); 1083 ew32(TDBAH, ((u64)txdr->dma >> 32));
1100 E1000_WRITE_REG(&adapter->hw, TDBAH, ((u64) txdr->dma >> 32)); 1084 ew32(TDLEN, txdr->count * sizeof(struct e1000_tx_desc));
1101 E1000_WRITE_REG(&adapter->hw, TDLEN, 1085 ew32(TDH, 0);
1102 txdr->count * sizeof(struct e1000_tx_desc)); 1086 ew32(TDT, 0);
1103 E1000_WRITE_REG(&adapter->hw, TDH, 0); 1087 ew32(TCTL, E1000_TCTL_PSP | E1000_TCTL_EN |
1104 E1000_WRITE_REG(&adapter->hw, TDT, 0); 1088 E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT |
1105 E1000_WRITE_REG(&adapter->hw, TCTL, 1089 E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT);
1106 E1000_TCTL_PSP | E1000_TCTL_EN |
1107 E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT |
1108 E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT);
1109 1090
1110 for (i = 0; i < txdr->count; i++) { 1091 for (i = 0; i < txdr->count; i++) {
1111 struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*txdr, i); 1092 struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*txdr, i);
1112 struct sk_buff *skb; 1093 struct sk_buff *skb;
1113 unsigned int size = 1024; 1094 unsigned int size = 1024;
1114 1095
1115 if (!(skb = alloc_skb(size, GFP_KERNEL))) { 1096 skb = alloc_skb(size, GFP_KERNEL);
1097 if (!skb) {
1116 ret_val = 3; 1098 ret_val = 3;
1117 goto err_nomem; 1099 goto err_nomem;
1118 } 1100 }
@@ -1135,40 +1117,40 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
1135 if (!rxdr->count) 1117 if (!rxdr->count)
1136 rxdr->count = E1000_DEFAULT_RXD; 1118 rxdr->count = E1000_DEFAULT_RXD;
1137 1119
1138 if (!(rxdr->buffer_info = kcalloc(rxdr->count, 1120 rxdr->buffer_info = kcalloc(rxdr->count, sizeof(struct e1000_buffer),
1139 sizeof(struct e1000_buffer), 1121 GFP_KERNEL);
1140 GFP_KERNEL))) { 1122 if (!rxdr->buffer_info) {
1141 ret_val = 4; 1123 ret_val = 4;
1142 goto err_nomem; 1124 goto err_nomem;
1143 } 1125 }
1144 1126
1145 rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc); 1127 rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc);
1146 if (!(rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma))) { 1128 rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
1129 if (!rxdr->desc) {
1147 ret_val = 5; 1130 ret_val = 5;
1148 goto err_nomem; 1131 goto err_nomem;
1149 } 1132 }
1150 memset(rxdr->desc, 0, rxdr->size); 1133 memset(rxdr->desc, 0, rxdr->size);
1151 rxdr->next_to_use = rxdr->next_to_clean = 0; 1134 rxdr->next_to_use = rxdr->next_to_clean = 0;
1152 1135
1153 rctl = E1000_READ_REG(&adapter->hw, RCTL); 1136 rctl = er32(RCTL);
1154 E1000_WRITE_REG(&adapter->hw, RCTL, rctl & ~E1000_RCTL_EN); 1137 ew32(RCTL, rctl & ~E1000_RCTL_EN);
1155 E1000_WRITE_REG(&adapter->hw, RDBAL, 1138 ew32(RDBAL, ((u64)rxdr->dma & 0xFFFFFFFF));
1156 ((u64) rxdr->dma & 0xFFFFFFFF)); 1139 ew32(RDBAH, ((u64)rxdr->dma >> 32));
1157 E1000_WRITE_REG(&adapter->hw, RDBAH, ((u64) rxdr->dma >> 32)); 1140 ew32(RDLEN, rxdr->size);
1158 E1000_WRITE_REG(&adapter->hw, RDLEN, rxdr->size); 1141 ew32(RDH, 0);
1159 E1000_WRITE_REG(&adapter->hw, RDH, 0); 1142 ew32(RDT, 0);
1160 E1000_WRITE_REG(&adapter->hw, RDT, 0);
1161 rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | 1143 rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 |
1162 E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | 1144 E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
1163 (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT); 1145 (hw->mc_filter_type << E1000_RCTL_MO_SHIFT);
1164 E1000_WRITE_REG(&adapter->hw, RCTL, rctl); 1146 ew32(RCTL, rctl);
1165 1147
1166 for (i = 0; i < rxdr->count; i++) { 1148 for (i = 0; i < rxdr->count; i++) {
1167 struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i); 1149 struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i);
1168 struct sk_buff *skb; 1150 struct sk_buff *skb;
1169 1151
1170 if (!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, 1152 skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, GFP_KERNEL);
1171 GFP_KERNEL))) { 1153 if (!skb) {
1172 ret_val = 6; 1154 ret_val = 6;
1173 goto err_nomem; 1155 goto err_nomem;
1174 } 1156 }
@@ -1189,73 +1171,74 @@ err_nomem:
1189 return ret_val; 1171 return ret_val;
1190} 1172}
1191 1173
1192static void 1174static void e1000_phy_disable_receiver(struct e1000_adapter *adapter)
1193e1000_phy_disable_receiver(struct e1000_adapter *adapter)
1194{ 1175{
1176 struct e1000_hw *hw = &adapter->hw;
1177
1195 /* Write out to PHY registers 29 and 30 to disable the Receiver. */ 1178 /* Write out to PHY registers 29 and 30 to disable the Receiver. */
1196 e1000_write_phy_reg(&adapter->hw, 29, 0x001F); 1179 e1000_write_phy_reg(hw, 29, 0x001F);
1197 e1000_write_phy_reg(&adapter->hw, 30, 0x8FFC); 1180 e1000_write_phy_reg(hw, 30, 0x8FFC);
1198 e1000_write_phy_reg(&adapter->hw, 29, 0x001A); 1181 e1000_write_phy_reg(hw, 29, 0x001A);
1199 e1000_write_phy_reg(&adapter->hw, 30, 0x8FF0); 1182 e1000_write_phy_reg(hw, 30, 0x8FF0);
1200} 1183}
1201 1184
1202static void 1185static void e1000_phy_reset_clk_and_crs(struct e1000_adapter *adapter)
1203e1000_phy_reset_clk_and_crs(struct e1000_adapter *adapter)
1204{ 1186{
1187 struct e1000_hw *hw = &adapter->hw;
1205 u16 phy_reg; 1188 u16 phy_reg;
1206 1189
1207 /* Because we reset the PHY above, we need to re-force TX_CLK in the 1190 /* Because we reset the PHY above, we need to re-force TX_CLK in the
1208 * Extended PHY Specific Control Register to 25MHz clock. This 1191 * Extended PHY Specific Control Register to 25MHz clock. This
1209 * value defaults back to a 2.5MHz clock when the PHY is reset. 1192 * value defaults back to a 2.5MHz clock when the PHY is reset.
1210 */ 1193 */
1211 e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg); 1194 e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg);
1212 phy_reg |= M88E1000_EPSCR_TX_CLK_25; 1195 phy_reg |= M88E1000_EPSCR_TX_CLK_25;
1213 e1000_write_phy_reg(&adapter->hw, 1196 e1000_write_phy_reg(hw,
1214 M88E1000_EXT_PHY_SPEC_CTRL, phy_reg); 1197 M88E1000_EXT_PHY_SPEC_CTRL, phy_reg);
1215 1198
1216 /* In addition, because of the s/w reset above, we need to enable 1199 /* In addition, because of the s/w reset above, we need to enable
1217 * CRS on TX. This must be set for both full and half duplex 1200 * CRS on TX. This must be set for both full and half duplex
1218 * operation. 1201 * operation.
1219 */ 1202 */
1220 e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg); 1203 e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_reg);
1221 phy_reg |= M88E1000_PSCR_ASSERT_CRS_ON_TX; 1204 phy_reg |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
1222 e1000_write_phy_reg(&adapter->hw, 1205 e1000_write_phy_reg(hw,
1223 M88E1000_PHY_SPEC_CTRL, phy_reg); 1206 M88E1000_PHY_SPEC_CTRL, phy_reg);
1224} 1207}
1225 1208
1226static int 1209static int e1000_nonintegrated_phy_loopback(struct e1000_adapter *adapter)
1227e1000_nonintegrated_phy_loopback(struct e1000_adapter *adapter)
1228{ 1210{
1211 struct e1000_hw *hw = &adapter->hw;
1229 u32 ctrl_reg; 1212 u32 ctrl_reg;
1230 u16 phy_reg; 1213 u16 phy_reg;
1231 1214
1232 /* Setup the Device Control Register for PHY loopback test. */ 1215 /* Setup the Device Control Register for PHY loopback test. */
1233 1216
1234 ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL); 1217 ctrl_reg = er32(CTRL);
1235 ctrl_reg |= (E1000_CTRL_ILOS | /* Invert Loss-Of-Signal */ 1218 ctrl_reg |= (E1000_CTRL_ILOS | /* Invert Loss-Of-Signal */
1236 E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ 1219 E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
1237 E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ 1220 E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
1238 E1000_CTRL_SPD_1000 | /* Force Speed to 1000 */ 1221 E1000_CTRL_SPD_1000 | /* Force Speed to 1000 */
1239 E1000_CTRL_FD); /* Force Duplex to FULL */ 1222 E1000_CTRL_FD); /* Force Duplex to FULL */
1240 1223
1241 E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg); 1224 ew32(CTRL, ctrl_reg);
1242 1225
1243 /* Read the PHY Specific Control Register (0x10) */ 1226 /* Read the PHY Specific Control Register (0x10) */
1244 e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg); 1227 e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_reg);
1245 1228
1246 /* Clear Auto-Crossover bits in PHY Specific Control Register 1229 /* Clear Auto-Crossover bits in PHY Specific Control Register
1247 * (bits 6:5). 1230 * (bits 6:5).
1248 */ 1231 */
1249 phy_reg &= ~M88E1000_PSCR_AUTO_X_MODE; 1232 phy_reg &= ~M88E1000_PSCR_AUTO_X_MODE;
1250 e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, phy_reg); 1233 e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_reg);
1251 1234
1252 /* Perform software reset on the PHY */ 1235 /* Perform software reset on the PHY */
1253 e1000_phy_reset(&adapter->hw); 1236 e1000_phy_reset(hw);
1254 1237
1255 /* Have to setup TX_CLK and TX_CRS after software reset */ 1238 /* Have to setup TX_CLK and TX_CRS after software reset */
1256 e1000_phy_reset_clk_and_crs(adapter); 1239 e1000_phy_reset_clk_and_crs(adapter);
1257 1240
1258 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8100); 1241 e1000_write_phy_reg(hw, PHY_CTRL, 0x8100);
1259 1242
1260 /* Wait for reset to complete. */ 1243 /* Wait for reset to complete. */
1261 udelay(500); 1244 udelay(500);
@@ -1267,55 +1250,55 @@ e1000_nonintegrated_phy_loopback(struct e1000_adapter *adapter)
1267 e1000_phy_disable_receiver(adapter); 1250 e1000_phy_disable_receiver(adapter);
1268 1251
1269 /* Set the loopback bit in the PHY control register. */ 1252 /* Set the loopback bit in the PHY control register. */
1270 e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg); 1253 e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
1271 phy_reg |= MII_CR_LOOPBACK; 1254 phy_reg |= MII_CR_LOOPBACK;
1272 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_reg); 1255 e1000_write_phy_reg(hw, PHY_CTRL, phy_reg);
1273 1256
1274 /* Setup TX_CLK and TX_CRS one more time. */ 1257 /* Setup TX_CLK and TX_CRS one more time. */
1275 e1000_phy_reset_clk_and_crs(adapter); 1258 e1000_phy_reset_clk_and_crs(adapter);
1276 1259
1277 /* Check Phy Configuration */ 1260 /* Check Phy Configuration */
1278 e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg); 1261 e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
1279 if (phy_reg != 0x4100) 1262 if (phy_reg != 0x4100)
1280 return 9; 1263 return 9;
1281 1264
1282 e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg); 1265 e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg);
1283 if (phy_reg != 0x0070) 1266 if (phy_reg != 0x0070)
1284 return 10; 1267 return 10;
1285 1268
1286 e1000_read_phy_reg(&adapter->hw, 29, &phy_reg); 1269 e1000_read_phy_reg(hw, 29, &phy_reg);
1287 if (phy_reg != 0x001A) 1270 if (phy_reg != 0x001A)
1288 return 11; 1271 return 11;
1289 1272
1290 return 0; 1273 return 0;
1291} 1274}
1292 1275
1293static int 1276static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
1294e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
1295{ 1277{
1278 struct e1000_hw *hw = &adapter->hw;
1296 u32 ctrl_reg = 0; 1279 u32 ctrl_reg = 0;
1297 u32 stat_reg = 0; 1280 u32 stat_reg = 0;
1298 1281
1299 adapter->hw.autoneg = false; 1282 hw->autoneg = false;
1300 1283
1301 if (adapter->hw.phy_type == e1000_phy_m88) { 1284 if (hw->phy_type == e1000_phy_m88) {
1302 /* Auto-MDI/MDIX Off */ 1285 /* Auto-MDI/MDIX Off */
1303 e1000_write_phy_reg(&adapter->hw, 1286 e1000_write_phy_reg(hw,
1304 M88E1000_PHY_SPEC_CTRL, 0x0808); 1287 M88E1000_PHY_SPEC_CTRL, 0x0808);
1305 /* reset to update Auto-MDI/MDIX */ 1288 /* reset to update Auto-MDI/MDIX */
1306 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140); 1289 e1000_write_phy_reg(hw, PHY_CTRL, 0x9140);
1307 /* autoneg off */ 1290 /* autoneg off */
1308 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140); 1291 e1000_write_phy_reg(hw, PHY_CTRL, 0x8140);
1309 } else if (adapter->hw.phy_type == e1000_phy_gg82563) 1292 } else if (hw->phy_type == e1000_phy_gg82563)
1310 e1000_write_phy_reg(&adapter->hw, 1293 e1000_write_phy_reg(hw,
1311 GG82563_PHY_KMRN_MODE_CTRL, 1294 GG82563_PHY_KMRN_MODE_CTRL,
1312 0x1CC); 1295 0x1CC);
1313 1296
1314 ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL); 1297 ctrl_reg = er32(CTRL);
1315 1298
1316 if (adapter->hw.phy_type == e1000_phy_ife) { 1299 if (hw->phy_type == e1000_phy_ife) {
1317 /* force 100, set loopback */ 1300 /* force 100, set loopback */
1318 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x6100); 1301 e1000_write_phy_reg(hw, PHY_CTRL, 0x6100);
1319 1302
1320 /* Now set up the MAC to the same speed/duplex as the PHY. */ 1303 /* Now set up the MAC to the same speed/duplex as the PHY. */
1321 ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ 1304 ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
@@ -1325,10 +1308,10 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
1325 E1000_CTRL_FD); /* Force Duplex to FULL */ 1308 E1000_CTRL_FD); /* Force Duplex to FULL */
1326 } else { 1309 } else {
1327 /* force 1000, set loopback */ 1310 /* force 1000, set loopback */
1328 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140); 1311 e1000_write_phy_reg(hw, PHY_CTRL, 0x4140);
1329 1312
1330 /* Now set up the MAC to the same speed/duplex as the PHY. */ 1313 /* Now set up the MAC to the same speed/duplex as the PHY. */
1331 ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL); 1314 ctrl_reg = er32(CTRL);
1332 ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ 1315 ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
1333 ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ 1316 ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
1334 E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ 1317 E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
@@ -1336,23 +1319,23 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
1336 E1000_CTRL_FD); /* Force Duplex to FULL */ 1319 E1000_CTRL_FD); /* Force Duplex to FULL */
1337 } 1320 }
1338 1321
1339 if (adapter->hw.media_type == e1000_media_type_copper && 1322 if (hw->media_type == e1000_media_type_copper &&
1340 adapter->hw.phy_type == e1000_phy_m88) 1323 hw->phy_type == e1000_phy_m88)
1341 ctrl_reg |= E1000_CTRL_ILOS; /* Invert Loss of Signal */ 1324 ctrl_reg |= E1000_CTRL_ILOS; /* Invert Loss of Signal */
1342 else { 1325 else {
1343 /* Set the ILOS bit on the fiber Nic is half 1326 /* Set the ILOS bit on the fiber Nic is half
1344 * duplex link is detected. */ 1327 * duplex link is detected. */
1345 stat_reg = E1000_READ_REG(&adapter->hw, STATUS); 1328 stat_reg = er32(STATUS);
1346 if ((stat_reg & E1000_STATUS_FD) == 0) 1329 if ((stat_reg & E1000_STATUS_FD) == 0)
1347 ctrl_reg |= (E1000_CTRL_ILOS | E1000_CTRL_SLU); 1330 ctrl_reg |= (E1000_CTRL_ILOS | E1000_CTRL_SLU);
1348 } 1331 }
1349 1332
1350 E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg); 1333 ew32(CTRL, ctrl_reg);
1351 1334
1352 /* Disable the receiver on the PHY so when a cable is plugged in, the 1335 /* Disable the receiver on the PHY so when a cable is plugged in, the
1353 * PHY does not begin to autoneg when a cable is reconnected to the NIC. 1336 * PHY does not begin to autoneg when a cable is reconnected to the NIC.
1354 */ 1337 */
1355 if (adapter->hw.phy_type == e1000_phy_m88) 1338 if (hw->phy_type == e1000_phy_m88)
1356 e1000_phy_disable_receiver(adapter); 1339 e1000_phy_disable_receiver(adapter);
1357 1340
1358 udelay(500); 1341 udelay(500);
@@ -1360,15 +1343,15 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
1360 return 0; 1343 return 0;
1361} 1344}
1362 1345
1363static int 1346static int e1000_set_phy_loopback(struct e1000_adapter *adapter)
1364e1000_set_phy_loopback(struct e1000_adapter *adapter)
1365{ 1347{
1348 struct e1000_hw *hw = &adapter->hw;
1366 u16 phy_reg = 0; 1349 u16 phy_reg = 0;
1367 u16 count = 0; 1350 u16 count = 0;
1368 1351
1369 switch (adapter->hw.mac_type) { 1352 switch (hw->mac_type) {
1370 case e1000_82543: 1353 case e1000_82543:
1371 if (adapter->hw.media_type == e1000_media_type_copper) { 1354 if (hw->media_type == e1000_media_type_copper) {
1372 /* Attempt to setup Loopback mode on Non-integrated PHY. 1355 /* Attempt to setup Loopback mode on Non-integrated PHY.
1373 * Some PHY registers get corrupted at random, so 1356 * Some PHY registers get corrupted at random, so
1374 * attempt this 10 times. 1357 * attempt this 10 times.
@@ -1402,9 +1385,9 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
1402 /* Default PHY loopback work is to read the MII 1385 /* Default PHY loopback work is to read the MII
1403 * control register and assert bit 14 (loopback mode). 1386 * control register and assert bit 14 (loopback mode).
1404 */ 1387 */
1405 e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg); 1388 e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
1406 phy_reg |= MII_CR_LOOPBACK; 1389 phy_reg |= MII_CR_LOOPBACK;
1407 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_reg); 1390 e1000_write_phy_reg(hw, PHY_CTRL, phy_reg);
1408 return 0; 1391 return 0;
1409 break; 1392 break;
1410 } 1393 }
@@ -1412,8 +1395,7 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
1412 return 8; 1395 return 8;
1413} 1396}
1414 1397
1415static int 1398static int e1000_setup_loopback_test(struct e1000_adapter *adapter)
1416e1000_setup_loopback_test(struct e1000_adapter *adapter)
1417{ 1399{
1418 struct e1000_hw *hw = &adapter->hw; 1400 struct e1000_hw *hw = &adapter->hw;
1419 u32 rctl; 1401 u32 rctl;
@@ -1431,14 +1413,14 @@ e1000_setup_loopback_test(struct e1000_adapter *adapter)
1431 case e1000_82572: 1413 case e1000_82572:
1432#define E1000_SERDES_LB_ON 0x410 1414#define E1000_SERDES_LB_ON 0x410
1433 e1000_set_phy_loopback(adapter); 1415 e1000_set_phy_loopback(adapter);
1434 E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_ON); 1416 ew32(SCTL, E1000_SERDES_LB_ON);
1435 msleep(10); 1417 msleep(10);
1436 return 0; 1418 return 0;
1437 break; 1419 break;
1438 default: 1420 default:
1439 rctl = E1000_READ_REG(hw, RCTL); 1421 rctl = er32(RCTL);
1440 rctl |= E1000_RCTL_LBM_TCVR; 1422 rctl |= E1000_RCTL_LBM_TCVR;
1441 E1000_WRITE_REG(hw, RCTL, rctl); 1423 ew32(RCTL, rctl);
1442 return 0; 1424 return 0;
1443 } 1425 }
1444 } else if (hw->media_type == e1000_media_type_copper) 1426 } else if (hw->media_type == e1000_media_type_copper)
@@ -1447,16 +1429,15 @@ e1000_setup_loopback_test(struct e1000_adapter *adapter)
1447 return 7; 1429 return 7;
1448} 1430}
1449 1431
1450static void 1432static void e1000_loopback_cleanup(struct e1000_adapter *adapter)
1451e1000_loopback_cleanup(struct e1000_adapter *adapter)
1452{ 1433{
1453 struct e1000_hw *hw = &adapter->hw; 1434 struct e1000_hw *hw = &adapter->hw;
1454 u32 rctl; 1435 u32 rctl;
1455 u16 phy_reg; 1436 u16 phy_reg;
1456 1437
1457 rctl = E1000_READ_REG(hw, RCTL); 1438 rctl = er32(RCTL);
1458 rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC); 1439 rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC);
1459 E1000_WRITE_REG(hw, RCTL, rctl); 1440 ew32(RCTL, rctl);
1460 1441
1461 switch (hw->mac_type) { 1442 switch (hw->mac_type) {
1462 case e1000_82571: 1443 case e1000_82571:
@@ -1464,7 +1445,7 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
1464 if (hw->media_type == e1000_media_type_fiber || 1445 if (hw->media_type == e1000_media_type_fiber ||
1465 hw->media_type == e1000_media_type_internal_serdes) { 1446 hw->media_type == e1000_media_type_internal_serdes) {
1466#define E1000_SERDES_LB_OFF 0x400 1447#define E1000_SERDES_LB_OFF 0x400
1467 E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_OFF); 1448 ew32(SCTL, E1000_SERDES_LB_OFF);
1468 msleep(10); 1449 msleep(10);
1469 break; 1450 break;
1470 } 1451 }
@@ -1489,8 +1470,8 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
1489 } 1470 }
1490} 1471}
1491 1472
1492static void 1473static void e1000_create_lbtest_frame(struct sk_buff *skb,
1493e1000_create_lbtest_frame(struct sk_buff *skb, unsigned int frame_size) 1474 unsigned int frame_size)
1494{ 1475{
1495 memset(skb->data, 0xFF, frame_size); 1476 memset(skb->data, 0xFF, frame_size);
1496 frame_size &= ~1; 1477 frame_size &= ~1;
@@ -1499,8 +1480,8 @@ e1000_create_lbtest_frame(struct sk_buff *skb, unsigned int frame_size)
1499 memset(&skb->data[frame_size / 2 + 12], 0xAF, 1); 1480 memset(&skb->data[frame_size / 2 + 12], 0xAF, 1);
1500} 1481}
1501 1482
1502static int 1483static int e1000_check_lbtest_frame(struct sk_buff *skb,
1503e1000_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size) 1484 unsigned int frame_size)
1504{ 1485{
1505 frame_size &= ~1; 1486 frame_size &= ~1;
1506 if (*(skb->data + 3) == 0xFF) { 1487 if (*(skb->data + 3) == 0xFF) {
@@ -1512,16 +1493,16 @@ e1000_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size)
1512 return 13; 1493 return 13;
1513} 1494}
1514 1495
1515static int 1496static int e1000_run_loopback_test(struct e1000_adapter *adapter)
1516e1000_run_loopback_test(struct e1000_adapter *adapter)
1517{ 1497{
1498 struct e1000_hw *hw = &adapter->hw;
1518 struct e1000_tx_ring *txdr = &adapter->test_tx_ring; 1499 struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
1519 struct e1000_rx_ring *rxdr = &adapter->test_rx_ring; 1500 struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
1520 struct pci_dev *pdev = adapter->pdev; 1501 struct pci_dev *pdev = adapter->pdev;
1521 int i, j, k, l, lc, good_cnt, ret_val=0; 1502 int i, j, k, l, lc, good_cnt, ret_val=0;
1522 unsigned long time; 1503 unsigned long time;
1523 1504
1524 E1000_WRITE_REG(&adapter->hw, RDT, rxdr->count - 1); 1505 ew32(RDT, rxdr->count - 1);
1525 1506
1526 /* Calculate the loop count based on the largest descriptor ring 1507 /* Calculate the loop count based on the largest descriptor ring
1527 * The idea is to wrap the largest ring a number of times using 64 1508 * The idea is to wrap the largest ring a number of times using 64
@@ -1544,7 +1525,7 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
1544 PCI_DMA_TODEVICE); 1525 PCI_DMA_TODEVICE);
1545 if (unlikely(++k == txdr->count)) k = 0; 1526 if (unlikely(++k == txdr->count)) k = 0;
1546 } 1527 }
1547 E1000_WRITE_REG(&adapter->hw, TDT, k); 1528 ew32(TDT, k);
1548 msleep(200); 1529 msleep(200);
1549 time = jiffies; /* set the start time for the receive */ 1530 time = jiffies; /* set the start time for the receive */
1550 good_cnt = 0; 1531 good_cnt = 0;
@@ -1577,21 +1558,24 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
1577 return ret_val; 1558 return ret_val;
1578} 1559}
1579 1560
1580static int 1561static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
1581e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
1582{ 1562{
1563 struct e1000_hw *hw = &adapter->hw;
1564
1583 /* PHY loopback cannot be performed if SoL/IDER 1565 /* PHY loopback cannot be performed if SoL/IDER
1584 * sessions are active */ 1566 * sessions are active */
1585 if (e1000_check_phy_reset_block(&adapter->hw)) { 1567 if (e1000_check_phy_reset_block(hw)) {
1586 DPRINTK(DRV, ERR, "Cannot do PHY loopback test " 1568 DPRINTK(DRV, ERR, "Cannot do PHY loopback test "
1587 "when SoL/IDER is active.\n"); 1569 "when SoL/IDER is active.\n");
1588 *data = 0; 1570 *data = 0;
1589 goto out; 1571 goto out;
1590 } 1572 }
1591 1573
1592 if ((*data = e1000_setup_desc_rings(adapter))) 1574 *data = e1000_setup_desc_rings(adapter);
1575 if (*data)
1593 goto out; 1576 goto out;
1594 if ((*data = e1000_setup_loopback_test(adapter))) 1577 *data = e1000_setup_loopback_test(adapter);
1578 if (*data)
1595 goto err_loopback; 1579 goto err_loopback;
1596 *data = e1000_run_loopback_test(adapter); 1580 *data = e1000_run_loopback_test(adapter);
1597 e1000_loopback_cleanup(adapter); 1581 e1000_loopback_cleanup(adapter);
@@ -1602,38 +1586,37 @@ out:
1602 return *data; 1586 return *data;
1603} 1587}
1604 1588
1605static int 1589static int e1000_link_test(struct e1000_adapter *adapter, u64 *data)
1606e1000_link_test(struct e1000_adapter *adapter, u64 *data)
1607{ 1590{
1591 struct e1000_hw *hw = &adapter->hw;
1608 *data = 0; 1592 *data = 0;
1609 if (adapter->hw.media_type == e1000_media_type_internal_serdes) { 1593 if (hw->media_type == e1000_media_type_internal_serdes) {
1610 int i = 0; 1594 int i = 0;
1611 adapter->hw.serdes_link_down = true; 1595 hw->serdes_link_down = true;
1612 1596
1613 /* On some blade server designs, link establishment 1597 /* On some blade server designs, link establishment
1614 * could take as long as 2-3 minutes */ 1598 * could take as long as 2-3 minutes */
1615 do { 1599 do {
1616 e1000_check_for_link(&adapter->hw); 1600 e1000_check_for_link(hw);
1617 if (!adapter->hw.serdes_link_down) 1601 if (!hw->serdes_link_down)
1618 return *data; 1602 return *data;
1619 msleep(20); 1603 msleep(20);
1620 } while (i++ < 3750); 1604 } while (i++ < 3750);
1621 1605
1622 *data = 1; 1606 *data = 1;
1623 } else { 1607 } else {
1624 e1000_check_for_link(&adapter->hw); 1608 e1000_check_for_link(hw);
1625 if (adapter->hw.autoneg) /* if auto_neg is set wait for it */ 1609 if (hw->autoneg) /* if auto_neg is set wait for it */
1626 msleep(4000); 1610 msleep(4000);
1627 1611
1628 if (!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) { 1612 if (!(er32(STATUS) & E1000_STATUS_LU)) {
1629 *data = 1; 1613 *data = 1;
1630 } 1614 }
1631 } 1615 }
1632 return *data; 1616 return *data;
1633} 1617}
1634 1618
1635static int 1619static int e1000_get_sset_count(struct net_device *netdev, int sset)
1636e1000_get_sset_count(struct net_device *netdev, int sset)
1637{ 1620{
1638 switch (sset) { 1621 switch (sset) {
1639 case ETH_SS_TEST: 1622 case ETH_SS_TEST:
@@ -1645,11 +1628,11 @@ e1000_get_sset_count(struct net_device *netdev, int sset)
1645 } 1628 }
1646} 1629}
1647 1630
1648static void 1631static void e1000_diag_test(struct net_device *netdev,
1649e1000_diag_test(struct net_device *netdev, 1632 struct ethtool_test *eth_test, u64 *data)
1650 struct ethtool_test *eth_test, u64 *data)
1651{ 1633{
1652 struct e1000_adapter *adapter = netdev_priv(netdev); 1634 struct e1000_adapter *adapter = netdev_priv(netdev);
1635 struct e1000_hw *hw = &adapter->hw;
1653 bool if_running = netif_running(netdev); 1636 bool if_running = netif_running(netdev);
1654 1637
1655 set_bit(__E1000_TESTING, &adapter->flags); 1638 set_bit(__E1000_TESTING, &adapter->flags);
@@ -1657,9 +1640,9 @@ e1000_diag_test(struct net_device *netdev,
1657 /* Offline tests */ 1640 /* Offline tests */
1658 1641
1659 /* save speed, duplex, autoneg settings */ 1642 /* save speed, duplex, autoneg settings */
1660 u16 autoneg_advertised = adapter->hw.autoneg_advertised; 1643 u16 autoneg_advertised = hw->autoneg_advertised;
1661 u8 forced_speed_duplex = adapter->hw.forced_speed_duplex; 1644 u8 forced_speed_duplex = hw->forced_speed_duplex;
1662 u8 autoneg = adapter->hw.autoneg; 1645 u8 autoneg = hw->autoneg;
1663 1646
1664 DPRINTK(HW, INFO, "offline testing starting\n"); 1647 DPRINTK(HW, INFO, "offline testing starting\n");
1665 1648
@@ -1692,9 +1675,9 @@ e1000_diag_test(struct net_device *netdev,
1692 eth_test->flags |= ETH_TEST_FL_FAILED; 1675 eth_test->flags |= ETH_TEST_FL_FAILED;
1693 1676
1694 /* restore speed, duplex, autoneg settings */ 1677 /* restore speed, duplex, autoneg settings */
1695 adapter->hw.autoneg_advertised = autoneg_advertised; 1678 hw->autoneg_advertised = autoneg_advertised;
1696 adapter->hw.forced_speed_duplex = forced_speed_duplex; 1679 hw->forced_speed_duplex = forced_speed_duplex;
1697 adapter->hw.autoneg = autoneg; 1680 hw->autoneg = autoneg;
1698 1681
1699 e1000_reset(adapter); 1682 e1000_reset(adapter);
1700 clear_bit(__E1000_TESTING, &adapter->flags); 1683 clear_bit(__E1000_TESTING, &adapter->flags);
@@ -1717,7 +1700,8 @@ e1000_diag_test(struct net_device *netdev,
1717 msleep_interruptible(4 * 1000); 1700 msleep_interruptible(4 * 1000);
1718} 1701}
1719 1702
1720static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol) 1703static int e1000_wol_exclusion(struct e1000_adapter *adapter,
1704 struct ethtool_wolinfo *wol)
1721{ 1705{
1722 struct e1000_hw *hw = &adapter->hw; 1706 struct e1000_hw *hw = &adapter->hw;
1723 int retval = 1; /* fail by default */ 1707 int retval = 1; /* fail by default */
@@ -1742,7 +1726,7 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wol
1742 case E1000_DEV_ID_82571EB_SERDES: 1726 case E1000_DEV_ID_82571EB_SERDES:
1743 case E1000_DEV_ID_82571EB_COPPER: 1727 case E1000_DEV_ID_82571EB_COPPER:
1744 /* Wake events not supported on port B */ 1728 /* Wake events not supported on port B */
1745 if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) { 1729 if (er32(STATUS) & E1000_STATUS_FUNC_1) {
1746 wol->supported = 0; 1730 wol->supported = 0;
1747 break; 1731 break;
1748 } 1732 }
@@ -1766,7 +1750,7 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wol
1766 /* dual port cards only support WoL on port A from now on 1750 /* dual port cards only support WoL on port A from now on
1767 * unless it was enabled in the eeprom for port B 1751 * unless it was enabled in the eeprom for port B
1768 * so exclude FUNC_1 ports from having WoL enabled */ 1752 * so exclude FUNC_1 ports from having WoL enabled */
1769 if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1 && 1753 if (er32(STATUS) & E1000_STATUS_FUNC_1 &&
1770 !adapter->eeprom_wol) { 1754 !adapter->eeprom_wol) {
1771 wol->supported = 0; 1755 wol->supported = 0;
1772 break; 1756 break;
@@ -1778,10 +1762,11 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wol
1778 return retval; 1762 return retval;
1779} 1763}
1780 1764
1781static void 1765static void e1000_get_wol(struct net_device *netdev,
1782e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) 1766 struct ethtool_wolinfo *wol)
1783{ 1767{
1784 struct e1000_adapter *adapter = netdev_priv(netdev); 1768 struct e1000_adapter *adapter = netdev_priv(netdev);
1769 struct e1000_hw *hw = &adapter->hw;
1785 1770
1786 wol->supported = WAKE_UCAST | WAKE_MCAST | 1771 wol->supported = WAKE_UCAST | WAKE_MCAST |
1787 WAKE_BCAST | WAKE_MAGIC; 1772 WAKE_BCAST | WAKE_MAGIC;
@@ -1793,7 +1778,7 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
1793 return; 1778 return;
1794 1779
1795 /* apply any specific unsupported masks here */ 1780 /* apply any specific unsupported masks here */
1796 switch (adapter->hw.device_id) { 1781 switch (hw->device_id) {
1797 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 1782 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
1798 /* KSP3 does not suppport UCAST wake-ups */ 1783 /* KSP3 does not suppport UCAST wake-ups */
1799 wol->supported &= ~WAKE_UCAST; 1784 wol->supported &= ~WAKE_UCAST;
@@ -1818,8 +1803,7 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
1818 return; 1803 return;
1819} 1804}
1820 1805
1821static int 1806static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
1822e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
1823{ 1807{
1824 struct e1000_adapter *adapter = netdev_priv(netdev); 1808 struct e1000_adapter *adapter = netdev_priv(netdev);
1825 struct e1000_hw *hw = &adapter->hw; 1809 struct e1000_hw *hw = &adapter->hw;
@@ -1863,61 +1847,60 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
1863/* bit defines for adapter->led_status */ 1847/* bit defines for adapter->led_status */
1864#define E1000_LED_ON 0 1848#define E1000_LED_ON 0
1865 1849
1866static void 1850static void e1000_led_blink_callback(unsigned long data)
1867e1000_led_blink_callback(unsigned long data)
1868{ 1851{
1869 struct e1000_adapter *adapter = (struct e1000_adapter *) data; 1852 struct e1000_adapter *adapter = (struct e1000_adapter *) data;
1853 struct e1000_hw *hw = &adapter->hw;
1870 1854
1871 if (test_and_change_bit(E1000_LED_ON, &adapter->led_status)) 1855 if (test_and_change_bit(E1000_LED_ON, &adapter->led_status))
1872 e1000_led_off(&adapter->hw); 1856 e1000_led_off(hw);
1873 else 1857 else
1874 e1000_led_on(&adapter->hw); 1858 e1000_led_on(hw);
1875 1859
1876 mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL); 1860 mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL);
1877} 1861}
1878 1862
1879static int 1863static int e1000_phys_id(struct net_device *netdev, u32 data)
1880e1000_phys_id(struct net_device *netdev, u32 data)
1881{ 1864{
1882 struct e1000_adapter *adapter = netdev_priv(netdev); 1865 struct e1000_adapter *adapter = netdev_priv(netdev);
1866 struct e1000_hw *hw = &adapter->hw;
1883 1867
1884 if (!data) 1868 if (!data)
1885 data = INT_MAX; 1869 data = INT_MAX;
1886 1870
1887 if (adapter->hw.mac_type < e1000_82571) { 1871 if (hw->mac_type < e1000_82571) {
1888 if (!adapter->blink_timer.function) { 1872 if (!adapter->blink_timer.function) {
1889 init_timer(&adapter->blink_timer); 1873 init_timer(&adapter->blink_timer);
1890 adapter->blink_timer.function = e1000_led_blink_callback; 1874 adapter->blink_timer.function = e1000_led_blink_callback;
1891 adapter->blink_timer.data = (unsigned long) adapter; 1875 adapter->blink_timer.data = (unsigned long)adapter;
1892 } 1876 }
1893 e1000_setup_led(&adapter->hw); 1877 e1000_setup_led(hw);
1894 mod_timer(&adapter->blink_timer, jiffies); 1878 mod_timer(&adapter->blink_timer, jiffies);
1895 msleep_interruptible(data * 1000); 1879 msleep_interruptible(data * 1000);
1896 del_timer_sync(&adapter->blink_timer); 1880 del_timer_sync(&adapter->blink_timer);
1897 } else if (adapter->hw.phy_type == e1000_phy_ife) { 1881 } else if (hw->phy_type == e1000_phy_ife) {
1898 if (!adapter->blink_timer.function) { 1882 if (!adapter->blink_timer.function) {
1899 init_timer(&adapter->blink_timer); 1883 init_timer(&adapter->blink_timer);
1900 adapter->blink_timer.function = e1000_led_blink_callback; 1884 adapter->blink_timer.function = e1000_led_blink_callback;
1901 adapter->blink_timer.data = (unsigned long) adapter; 1885 adapter->blink_timer.data = (unsigned long)adapter;
1902 } 1886 }
1903 mod_timer(&adapter->blink_timer, jiffies); 1887 mod_timer(&adapter->blink_timer, jiffies);
1904 msleep_interruptible(data * 1000); 1888 msleep_interruptible(data * 1000);
1905 del_timer_sync(&adapter->blink_timer); 1889 del_timer_sync(&adapter->blink_timer);
1906 e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0); 1890 e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0);
1907 } else { 1891 } else {
1908 e1000_blink_led_start(&adapter->hw); 1892 e1000_blink_led_start(hw);
1909 msleep_interruptible(data * 1000); 1893 msleep_interruptible(data * 1000);
1910 } 1894 }
1911 1895
1912 e1000_led_off(&adapter->hw); 1896 e1000_led_off(hw);
1913 clear_bit(E1000_LED_ON, &adapter->led_status); 1897 clear_bit(E1000_LED_ON, &adapter->led_status);
1914 e1000_cleanup_led(&adapter->hw); 1898 e1000_cleanup_led(hw);
1915 1899
1916 return 0; 1900 return 0;
1917} 1901}
1918 1902
1919static int 1903static int e1000_nway_reset(struct net_device *netdev)
1920e1000_nway_reset(struct net_device *netdev)
1921{ 1904{
1922 struct e1000_adapter *adapter = netdev_priv(netdev); 1905 struct e1000_adapter *adapter = netdev_priv(netdev);
1923 if (netif_running(netdev)) 1906 if (netif_running(netdev))
@@ -1925,9 +1908,8 @@ e1000_nway_reset(struct net_device *netdev)
1925 return 0; 1908 return 0;
1926} 1909}
1927 1910
1928static void 1911static void e1000_get_ethtool_stats(struct net_device *netdev,
1929e1000_get_ethtool_stats(struct net_device *netdev, 1912 struct ethtool_stats *stats, u64 *data)
1930 struct ethtool_stats *stats, u64 *data)
1931{ 1913{
1932 struct e1000_adapter *adapter = netdev_priv(netdev); 1914 struct e1000_adapter *adapter = netdev_priv(netdev);
1933 int i; 1915 int i;
@@ -1941,8 +1923,8 @@ e1000_get_ethtool_stats(struct net_device *netdev,
1941/* BUG_ON(i != E1000_STATS_LEN); */ 1923/* BUG_ON(i != E1000_STATS_LEN); */
1942} 1924}
1943 1925
1944static void 1926static void e1000_get_strings(struct net_device *netdev, u32 stringset,
1945e1000_get_strings(struct net_device *netdev, u32 stringset, u8 *data) 1927 u8 *data)
1946{ 1928{
1947 u8 *p = data; 1929 u8 *p = data;
1948 int i; 1930 int i;
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c
index 9a4b6cbddf2c..9d6edf3e73f9 100644
--- a/drivers/net/e1000/e1000_hw.c
+++ b/drivers/net/e1000/e1000_hw.c
@@ -42,48 +42,65 @@ static void e1000_release_software_semaphore(struct e1000_hw *hw);
42 42
43static u8 e1000_arc_subsystem_valid(struct e1000_hw *hw); 43static u8 e1000_arc_subsystem_valid(struct e1000_hw *hw);
44static s32 e1000_check_downshift(struct e1000_hw *hw); 44static s32 e1000_check_downshift(struct e1000_hw *hw);
45static s32 e1000_check_polarity(struct e1000_hw *hw, e1000_rev_polarity *polarity); 45static s32 e1000_check_polarity(struct e1000_hw *hw,
46 e1000_rev_polarity *polarity);
46static void e1000_clear_hw_cntrs(struct e1000_hw *hw); 47static void e1000_clear_hw_cntrs(struct e1000_hw *hw);
47static void e1000_clear_vfta(struct e1000_hw *hw); 48static void e1000_clear_vfta(struct e1000_hw *hw);
48static s32 e1000_commit_shadow_ram(struct e1000_hw *hw); 49static s32 e1000_commit_shadow_ram(struct e1000_hw *hw);
49static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw, 50static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw,
50 bool link_up); 51 bool link_up);
51static s32 e1000_config_fc_after_link_up(struct e1000_hw *hw); 52static s32 e1000_config_fc_after_link_up(struct e1000_hw *hw);
52static s32 e1000_detect_gig_phy(struct e1000_hw *hw); 53static s32 e1000_detect_gig_phy(struct e1000_hw *hw);
53static s32 e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank); 54static s32 e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank);
54static s32 e1000_get_auto_rd_done(struct e1000_hw *hw); 55static s32 e1000_get_auto_rd_done(struct e1000_hw *hw);
55static s32 e1000_get_cable_length(struct e1000_hw *hw, u16 *min_length, u16 *max_length); 56static s32 e1000_get_cable_length(struct e1000_hw *hw, u16 *min_length,
57 u16 *max_length);
56static s32 e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw); 58static s32 e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw);
57static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw); 59static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw);
58static s32 e1000_get_software_flag(struct e1000_hw *hw); 60static s32 e1000_get_software_flag(struct e1000_hw *hw);
59static s32 e1000_ich8_cycle_init(struct e1000_hw *hw); 61static s32 e1000_ich8_cycle_init(struct e1000_hw *hw);
60static s32 e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout); 62static s32 e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout);
61static s32 e1000_id_led_init(struct e1000_hw *hw); 63static s32 e1000_id_led_init(struct e1000_hw *hw);
62static s32 e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw, u32 cnf_base_addr, u32 cnf_size); 64static s32 e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
65 u32 cnf_base_addr,
66 u32 cnf_size);
63static s32 e1000_init_lcd_from_nvm(struct e1000_hw *hw); 67static s32 e1000_init_lcd_from_nvm(struct e1000_hw *hw);
64static void e1000_init_rx_addrs(struct e1000_hw *hw); 68static void e1000_init_rx_addrs(struct e1000_hw *hw);
65static void e1000_initialize_hardware_bits(struct e1000_hw *hw); 69static void e1000_initialize_hardware_bits(struct e1000_hw *hw);
66static bool e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw); 70static bool e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw);
67static s32 e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw); 71static s32 e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw);
68static s32 e1000_mng_enable_host_if(struct e1000_hw *hw); 72static s32 e1000_mng_enable_host_if(struct e1000_hw *hw);
69static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length, u16 offset, u8 *sum); 73static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length,
70static s32 e1000_mng_write_cmd_header(struct e1000_hw* hw, struct e1000_host_mng_command_header* hdr); 74 u16 offset, u8 *sum);
75static s32 e1000_mng_write_cmd_header(struct e1000_hw* hw,
76 struct e1000_host_mng_command_header
77 *hdr);
71static s32 e1000_mng_write_commit(struct e1000_hw *hw); 78static s32 e1000_mng_write_commit(struct e1000_hw *hw);
72static s32 e1000_phy_ife_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info); 79static s32 e1000_phy_ife_get_info(struct e1000_hw *hw,
73static s32 e1000_phy_igp_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info); 80 struct e1000_phy_info *phy_info);
74static s32 e1000_read_eeprom_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); 81static s32 e1000_phy_igp_get_info(struct e1000_hw *hw,
75static s32 e1000_write_eeprom_eewr(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); 82 struct e1000_phy_info *phy_info);
83static s32 e1000_read_eeprom_eerd(struct e1000_hw *hw, u16 offset, u16 words,
84 u16 *data);
85static s32 e1000_write_eeprom_eewr(struct e1000_hw *hw, u16 offset, u16 words,
86 u16 *data);
76static s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd); 87static s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd);
77static s32 e1000_phy_m88_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info); 88static s32 e1000_phy_m88_get_info(struct e1000_hw *hw,
89 struct e1000_phy_info *phy_info);
78static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw); 90static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);
79static s32 e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8 *data); 91static s32 e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8 *data);
80static s32 e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte); 92static s32 e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index,
93 u8 byte);
81static s32 e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte); 94static s32 e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte);
82static s32 e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data); 95static s32 e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data);
83static s32 e1000_read_ich8_data(struct e1000_hw *hw, u32 index, u32 size, u16 *data); 96static s32 e1000_read_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
84static s32 e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size, u16 data); 97 u16 *data);
85static s32 e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); 98static s32 e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
86static s32 e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); 99 u16 data);
100static s32 e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
101 u16 *data);
102static s32 e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
103 u16 *data);
87static void e1000_release_software_flag(struct e1000_hw *hw); 104static void e1000_release_software_flag(struct e1000_hw *hw);
88static s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active); 105static s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active);
89static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active); 106static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active);
@@ -101,23 +118,21 @@ static s32 e1000_config_mac_to_phy(struct e1000_hw *hw);
101static void e1000_raise_mdi_clk(struct e1000_hw *hw, u32 *ctrl); 118static void e1000_raise_mdi_clk(struct e1000_hw *hw, u32 *ctrl);
102static void e1000_lower_mdi_clk(struct e1000_hw *hw, u32 *ctrl); 119static void e1000_lower_mdi_clk(struct e1000_hw *hw, u32 *ctrl);
103static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, u32 data, 120static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, u32 data,
104 u16 count); 121 u16 count);
105static u16 e1000_shift_in_mdi_bits(struct e1000_hw *hw); 122static u16 e1000_shift_in_mdi_bits(struct e1000_hw *hw);
106static s32 e1000_phy_reset_dsp(struct e1000_hw *hw); 123static s32 e1000_phy_reset_dsp(struct e1000_hw *hw);
107static s32 e1000_write_eeprom_spi(struct e1000_hw *hw, u16 offset, 124static s32 e1000_write_eeprom_spi(struct e1000_hw *hw, u16 offset,
108 u16 words, u16 *data); 125 u16 words, u16 *data);
109static s32 e1000_write_eeprom_microwire(struct e1000_hw *hw, 126static s32 e1000_write_eeprom_microwire(struct e1000_hw *hw, u16 offset,
110 u16 offset, u16 words, 127 u16 words, u16 *data);
111 u16 *data);
112static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw); 128static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw);
113static void e1000_raise_ee_clk(struct e1000_hw *hw, u32 *eecd); 129static void e1000_raise_ee_clk(struct e1000_hw *hw, u32 *eecd);
114static void e1000_lower_ee_clk(struct e1000_hw *hw, u32 *eecd); 130static void e1000_lower_ee_clk(struct e1000_hw *hw, u32 *eecd);
115static void e1000_shift_out_ee_bits(struct e1000_hw *hw, u16 data, 131static void e1000_shift_out_ee_bits(struct e1000_hw *hw, u16 data, u16 count);
116 u16 count);
117static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr, 132static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
118 u16 phy_data); 133 u16 phy_data);
119static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw,u32 reg_addr, 134static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw,u32 reg_addr,
120 u16 *phy_data); 135 u16 *phy_data);
121static u16 e1000_shift_in_ee_bits(struct e1000_hw *hw, u16 count); 136static u16 e1000_shift_in_ee_bits(struct e1000_hw *hw, u16 count);
122static s32 e1000_acquire_eeprom(struct e1000_hw *hw); 137static s32 e1000_acquire_eeprom(struct e1000_hw *hw);
123static void e1000_release_eeprom(struct e1000_hw *hw); 138static void e1000_release_eeprom(struct e1000_hw *hw);
@@ -127,8 +142,7 @@ static s32 e1000_polarity_reversal_workaround(struct e1000_hw *hw);
127static s32 e1000_set_phy_mode(struct e1000_hw *hw); 142static s32 e1000_set_phy_mode(struct e1000_hw *hw);
128static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer); 143static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer);
129static u8 e1000_calculate_mng_checksum(char *buffer, u32 length); 144static u8 e1000_calculate_mng_checksum(char *buffer, u32 length);
130static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, 145static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex);
131 u16 duplex);
132static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw); 146static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw);
133 147
134/* IGP cable length table */ 148/* IGP cable length table */
@@ -159,8 +173,7 @@ u16 e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] =
159 * 173 *
160 * hw - Struct containing variables accessed by shared code 174 * hw - Struct containing variables accessed by shared code
161 *****************************************************************************/ 175 *****************************************************************************/
162static s32 176static s32 e1000_set_phy_type(struct e1000_hw *hw)
163e1000_set_phy_type(struct e1000_hw *hw)
164{ 177{
165 DEBUGFUNC("e1000_set_phy_type"); 178 DEBUGFUNC("e1000_set_phy_type");
166 179
@@ -210,8 +223,7 @@ e1000_set_phy_type(struct e1000_hw *hw)
210 * 223 *
211 * hw - Struct containing variables accessed by shared code 224 * hw - Struct containing variables accessed by shared code
212 *****************************************************************************/ 225 *****************************************************************************/
213static void 226static void e1000_phy_init_script(struct e1000_hw *hw)
214e1000_phy_init_script(struct e1000_hw *hw)
215{ 227{
216 u32 ret_val; 228 u32 ret_val;
217 u16 phy_saved_data; 229 u16 phy_saved_data;
@@ -306,8 +318,7 @@ e1000_phy_init_script(struct e1000_hw *hw)
306 * 318 *
307 * hw - Struct containing variables accessed by shared code 319 * hw - Struct containing variables accessed by shared code
308 *****************************************************************************/ 320 *****************************************************************************/
309s32 321s32 e1000_set_mac_type(struct e1000_hw *hw)
310e1000_set_mac_type(struct e1000_hw *hw)
311{ 322{
312 DEBUGFUNC("e1000_set_mac_type"); 323 DEBUGFUNC("e1000_set_mac_type");
313 324
@@ -474,8 +485,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
474 * 485 *
475 * hw - Struct containing variables accessed by shared code 486 * hw - Struct containing variables accessed by shared code
476 * **************************************************************************/ 487 * **************************************************************************/
477void 488void e1000_set_media_type(struct e1000_hw *hw)
478e1000_set_media_type(struct e1000_hw *hw)
479{ 489{
480 u32 status; 490 u32 status;
481 491
@@ -510,7 +520,7 @@ e1000_set_media_type(struct e1000_hw *hw)
510 hw->media_type = e1000_media_type_copper; 520 hw->media_type = e1000_media_type_copper;
511 break; 521 break;
512 default: 522 default:
513 status = E1000_READ_REG(hw, STATUS); 523 status = er32(STATUS);
514 if (status & E1000_STATUS_TBIMODE) { 524 if (status & E1000_STATUS_TBIMODE) {
515 hw->media_type = e1000_media_type_fiber; 525 hw->media_type = e1000_media_type_fiber;
516 /* tbi_compatibility not valid on fiber */ 526 /* tbi_compatibility not valid on fiber */
@@ -528,8 +538,7 @@ e1000_set_media_type(struct e1000_hw *hw)
528 * 538 *
529 * hw - Struct containing variables accessed by shared code 539 * hw - Struct containing variables accessed by shared code
530 *****************************************************************************/ 540 *****************************************************************************/
531s32 541s32 e1000_reset_hw(struct e1000_hw *hw)
532e1000_reset_hw(struct e1000_hw *hw)
533{ 542{
534 u32 ctrl; 543 u32 ctrl;
535 u32 ctrl_ext; 544 u32 ctrl_ext;
@@ -559,15 +568,15 @@ e1000_reset_hw(struct e1000_hw *hw)
559 568
560 /* Clear interrupt mask to stop board from generating interrupts */ 569 /* Clear interrupt mask to stop board from generating interrupts */
561 DEBUGOUT("Masking off all interrupts\n"); 570 DEBUGOUT("Masking off all interrupts\n");
562 E1000_WRITE_REG(hw, IMC, 0xffffffff); 571 ew32(IMC, 0xffffffff);
563 572
564 /* Disable the Transmit and Receive units. Then delay to allow 573 /* Disable the Transmit and Receive units. Then delay to allow
565 * any pending transactions to complete before we hit the MAC with 574 * any pending transactions to complete before we hit the MAC with
566 * the global reset. 575 * the global reset.
567 */ 576 */
568 E1000_WRITE_REG(hw, RCTL, 0); 577 ew32(RCTL, 0);
569 E1000_WRITE_REG(hw, TCTL, E1000_TCTL_PSP); 578 ew32(TCTL, E1000_TCTL_PSP);
570 E1000_WRITE_FLUSH(hw); 579 E1000_WRITE_FLUSH();
571 580
572 /* The tbi_compatibility_on Flag must be cleared when Rctl is cleared. */ 581 /* The tbi_compatibility_on Flag must be cleared when Rctl is cleared. */
573 hw->tbi_compatibility_on = false; 582 hw->tbi_compatibility_on = false;
@@ -577,11 +586,11 @@ e1000_reset_hw(struct e1000_hw *hw)
577 */ 586 */
578 msleep(10); 587 msleep(10);
579 588
580 ctrl = E1000_READ_REG(hw, CTRL); 589 ctrl = er32(CTRL);
581 590
582 /* Must reset the PHY before resetting the MAC */ 591 /* Must reset the PHY before resetting the MAC */
583 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 592 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
584 E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST)); 593 ew32(CTRL, (ctrl | E1000_CTRL_PHY_RST));
585 msleep(5); 594 msleep(5);
586 } 595 }
587 596
@@ -590,12 +599,12 @@ e1000_reset_hw(struct e1000_hw *hw)
590 if (hw->mac_type == e1000_82573) { 599 if (hw->mac_type == e1000_82573) {
591 timeout = 10; 600 timeout = 10;
592 601
593 extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL); 602 extcnf_ctrl = er32(EXTCNF_CTRL);
594 extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; 603 extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
595 604
596 do { 605 do {
597 E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl); 606 ew32(EXTCNF_CTRL, extcnf_ctrl);
598 extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL); 607 extcnf_ctrl = er32(EXTCNF_CTRL);
599 608
600 if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP) 609 if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP)
601 break; 610 break;
@@ -610,9 +619,9 @@ e1000_reset_hw(struct e1000_hw *hw)
610 /* Workaround for ICH8 bit corruption issue in FIFO memory */ 619 /* Workaround for ICH8 bit corruption issue in FIFO memory */
611 if (hw->mac_type == e1000_ich8lan) { 620 if (hw->mac_type == e1000_ich8lan) {
612 /* Set Tx and Rx buffer allocation to 8k apiece. */ 621 /* Set Tx and Rx buffer allocation to 8k apiece. */
613 E1000_WRITE_REG(hw, PBA, E1000_PBA_8K); 622 ew32(PBA, E1000_PBA_8K);
614 /* Set Packet Buffer Size to 16k. */ 623 /* Set Packet Buffer Size to 16k. */
615 E1000_WRITE_REG(hw, PBS, E1000_PBS_16K); 624 ew32(PBS, E1000_PBS_16K);
616 } 625 }
617 626
618 /* Issue a global reset to the MAC. This will reset the chip's 627 /* Issue a global reset to the MAC. This will reset the chip's
@@ -636,7 +645,7 @@ e1000_reset_hw(struct e1000_hw *hw)
636 case e1000_82545_rev_3: 645 case e1000_82545_rev_3:
637 case e1000_82546_rev_3: 646 case e1000_82546_rev_3:
638 /* Reset is performed on a shadow of the control register */ 647 /* Reset is performed on a shadow of the control register */
639 E1000_WRITE_REG(hw, CTRL_DUP, (ctrl | E1000_CTRL_RST)); 648 ew32(CTRL_DUP, (ctrl | E1000_CTRL_RST));
640 break; 649 break;
641 case e1000_ich8lan: 650 case e1000_ich8lan:
642 if (!hw->phy_reset_disable && 651 if (!hw->phy_reset_disable &&
@@ -649,11 +658,11 @@ e1000_reset_hw(struct e1000_hw *hw)
649 } 658 }
650 659
651 e1000_get_software_flag(hw); 660 e1000_get_software_flag(hw);
652 E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); 661 ew32(CTRL, (ctrl | E1000_CTRL_RST));
653 msleep(5); 662 msleep(5);
654 break; 663 break;
655 default: 664 default:
656 E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); 665 ew32(CTRL, (ctrl | E1000_CTRL_RST));
657 break; 666 break;
658 } 667 }
659 668
@@ -668,10 +677,10 @@ e1000_reset_hw(struct e1000_hw *hw)
668 case e1000_82544: 677 case e1000_82544:
669 /* Wait for reset to complete */ 678 /* Wait for reset to complete */
670 udelay(10); 679 udelay(10);
671 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 680 ctrl_ext = er32(CTRL_EXT);
672 ctrl_ext |= E1000_CTRL_EXT_EE_RST; 681 ctrl_ext |= E1000_CTRL_EXT_EE_RST;
673 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 682 ew32(CTRL_EXT, ctrl_ext);
674 E1000_WRITE_FLUSH(hw); 683 E1000_WRITE_FLUSH();
675 /* Wait for EEPROM reload */ 684 /* Wait for EEPROM reload */
676 msleep(2); 685 msleep(2);
677 break; 686 break;
@@ -685,10 +694,10 @@ e1000_reset_hw(struct e1000_hw *hw)
685 case e1000_82573: 694 case e1000_82573:
686 if (!e1000_is_onboard_nvm_eeprom(hw)) { 695 if (!e1000_is_onboard_nvm_eeprom(hw)) {
687 udelay(10); 696 udelay(10);
688 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 697 ctrl_ext = er32(CTRL_EXT);
689 ctrl_ext |= E1000_CTRL_EXT_EE_RST; 698 ctrl_ext |= E1000_CTRL_EXT_EE_RST;
690 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 699 ew32(CTRL_EXT, ctrl_ext);
691 E1000_WRITE_FLUSH(hw); 700 E1000_WRITE_FLUSH();
692 } 701 }
693 /* fall through */ 702 /* fall through */
694 default: 703 default:
@@ -701,27 +710,27 @@ e1000_reset_hw(struct e1000_hw *hw)
701 710
702 /* Disable HW ARPs on ASF enabled adapters */ 711 /* Disable HW ARPs on ASF enabled adapters */
703 if (hw->mac_type >= e1000_82540 && hw->mac_type <= e1000_82547_rev_2) { 712 if (hw->mac_type >= e1000_82540 && hw->mac_type <= e1000_82547_rev_2) {
704 manc = E1000_READ_REG(hw, MANC); 713 manc = er32(MANC);
705 manc &= ~(E1000_MANC_ARP_EN); 714 manc &= ~(E1000_MANC_ARP_EN);
706 E1000_WRITE_REG(hw, MANC, manc); 715 ew32(MANC, manc);
707 } 716 }
708 717
709 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 718 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
710 e1000_phy_init_script(hw); 719 e1000_phy_init_script(hw);
711 720
712 /* Configure activity LED after PHY reset */ 721 /* Configure activity LED after PHY reset */
713 led_ctrl = E1000_READ_REG(hw, LEDCTL); 722 led_ctrl = er32(LEDCTL);
714 led_ctrl &= IGP_ACTIVITY_LED_MASK; 723 led_ctrl &= IGP_ACTIVITY_LED_MASK;
715 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 724 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
716 E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 725 ew32(LEDCTL, led_ctrl);
717 } 726 }
718 727
719 /* Clear interrupt mask to stop board from generating interrupts */ 728 /* Clear interrupt mask to stop board from generating interrupts */
720 DEBUGOUT("Masking off all interrupts\n"); 729 DEBUGOUT("Masking off all interrupts\n");
721 E1000_WRITE_REG(hw, IMC, 0xffffffff); 730 ew32(IMC, 0xffffffff);
722 731
723 /* Clear any pending interrupt events. */ 732 /* Clear any pending interrupt events. */
724 icr = E1000_READ_REG(hw, ICR); 733 icr = er32(ICR);
725 734
726 /* If MWI was previously enabled, reenable it. */ 735 /* If MWI was previously enabled, reenable it. */
727 if (hw->mac_type == e1000_82542_rev2_0) { 736 if (hw->mac_type == e1000_82542_rev2_0) {
@@ -730,9 +739,9 @@ e1000_reset_hw(struct e1000_hw *hw)
730 } 739 }
731 740
732 if (hw->mac_type == e1000_ich8lan) { 741 if (hw->mac_type == e1000_ich8lan) {
733 u32 kab = E1000_READ_REG(hw, KABGTXD); 742 u32 kab = er32(KABGTXD);
734 kab |= E1000_KABGTXD_BGSQLBIAS; 743 kab |= E1000_KABGTXD_BGSQLBIAS;
735 E1000_WRITE_REG(hw, KABGTXD, kab); 744 ew32(KABGTXD, kab);
736 } 745 }
737 746
738 return E1000_SUCCESS; 747 return E1000_SUCCESS;
@@ -747,8 +756,7 @@ e1000_reset_hw(struct e1000_hw *hw)
747 * This function contains hardware limitation workarounds for PCI-E adapters 756 * This function contains hardware limitation workarounds for PCI-E adapters
748 * 757 *
749 *****************************************************************************/ 758 *****************************************************************************/
750static void 759static void e1000_initialize_hardware_bits(struct e1000_hw *hw)
751e1000_initialize_hardware_bits(struct e1000_hw *hw)
752{ 760{
753 if ((hw->mac_type >= e1000_82571) && (!hw->initialize_hw_bits_disable)) { 761 if ((hw->mac_type >= e1000_82571) && (!hw->initialize_hw_bits_disable)) {
754 /* Settings common to all PCI-express silicon */ 762 /* Settings common to all PCI-express silicon */
@@ -758,22 +766,22 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
758 u32 reg_txdctl, reg_txdctl1; 766 u32 reg_txdctl, reg_txdctl1;
759 767
760 /* link autonegotiation/sync workarounds */ 768 /* link autonegotiation/sync workarounds */
761 reg_tarc0 = E1000_READ_REG(hw, TARC0); 769 reg_tarc0 = er32(TARC0);
762 reg_tarc0 &= ~((1 << 30)|(1 << 29)|(1 << 28)|(1 << 27)); 770 reg_tarc0 &= ~((1 << 30)|(1 << 29)|(1 << 28)|(1 << 27));
763 771
764 /* Enable not-done TX descriptor counting */ 772 /* Enable not-done TX descriptor counting */
765 reg_txdctl = E1000_READ_REG(hw, TXDCTL); 773 reg_txdctl = er32(TXDCTL);
766 reg_txdctl |= E1000_TXDCTL_COUNT_DESC; 774 reg_txdctl |= E1000_TXDCTL_COUNT_DESC;
767 E1000_WRITE_REG(hw, TXDCTL, reg_txdctl); 775 ew32(TXDCTL, reg_txdctl);
768 reg_txdctl1 = E1000_READ_REG(hw, TXDCTL1); 776 reg_txdctl1 = er32(TXDCTL1);
769 reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC; 777 reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC;
770 E1000_WRITE_REG(hw, TXDCTL1, reg_txdctl1); 778 ew32(TXDCTL1, reg_txdctl1);
771 779
772 switch (hw->mac_type) { 780 switch (hw->mac_type) {
773 case e1000_82571: 781 case e1000_82571:
774 case e1000_82572: 782 case e1000_82572:
775 /* Clear PHY TX compatible mode bits */ 783 /* Clear PHY TX compatible mode bits */
776 reg_tarc1 = E1000_READ_REG(hw, TARC1); 784 reg_tarc1 = er32(TARC1);
777 reg_tarc1 &= ~((1 << 30)|(1 << 29)); 785 reg_tarc1 &= ~((1 << 30)|(1 << 29));
778 786
779 /* link autonegotiation/sync workarounds */ 787 /* link autonegotiation/sync workarounds */
@@ -783,25 +791,25 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
783 reg_tarc1 |= ((1 << 26)|(1 << 25)|(1 << 24)); 791 reg_tarc1 |= ((1 << 26)|(1 << 25)|(1 << 24));
784 792
785 /* Multiple read bit is reversed polarity */ 793 /* Multiple read bit is reversed polarity */
786 reg_tctl = E1000_READ_REG(hw, TCTL); 794 reg_tctl = er32(TCTL);
787 if (reg_tctl & E1000_TCTL_MULR) 795 if (reg_tctl & E1000_TCTL_MULR)
788 reg_tarc1 &= ~(1 << 28); 796 reg_tarc1 &= ~(1 << 28);
789 else 797 else
790 reg_tarc1 |= (1 << 28); 798 reg_tarc1 |= (1 << 28);
791 799
792 E1000_WRITE_REG(hw, TARC1, reg_tarc1); 800 ew32(TARC1, reg_tarc1);
793 break; 801 break;
794 case e1000_82573: 802 case e1000_82573:
795 reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 803 reg_ctrl_ext = er32(CTRL_EXT);
796 reg_ctrl_ext &= ~(1 << 23); 804 reg_ctrl_ext &= ~(1 << 23);
797 reg_ctrl_ext |= (1 << 22); 805 reg_ctrl_ext |= (1 << 22);
798 806
799 /* TX byte count fix */ 807 /* TX byte count fix */
800 reg_ctrl = E1000_READ_REG(hw, CTRL); 808 reg_ctrl = er32(CTRL);
801 reg_ctrl &= ~(1 << 29); 809 reg_ctrl &= ~(1 << 29);
802 810
803 E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext); 811 ew32(CTRL_EXT, reg_ctrl_ext);
804 E1000_WRITE_REG(hw, CTRL, reg_ctrl); 812 ew32(CTRL, reg_ctrl);
805 break; 813 break;
806 case e1000_80003es2lan: 814 case e1000_80003es2lan:
807 /* improve small packet performace for fiber/serdes */ 815 /* improve small packet performace for fiber/serdes */
@@ -811,14 +819,14 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
811 } 819 }
812 820
813 /* Multiple read bit is reversed polarity */ 821 /* Multiple read bit is reversed polarity */
814 reg_tctl = E1000_READ_REG(hw, TCTL); 822 reg_tctl = er32(TCTL);
815 reg_tarc1 = E1000_READ_REG(hw, TARC1); 823 reg_tarc1 = er32(TARC1);
816 if (reg_tctl & E1000_TCTL_MULR) 824 if (reg_tctl & E1000_TCTL_MULR)
817 reg_tarc1 &= ~(1 << 28); 825 reg_tarc1 &= ~(1 << 28);
818 else 826 else
819 reg_tarc1 |= (1 << 28); 827 reg_tarc1 |= (1 << 28);
820 828
821 E1000_WRITE_REG(hw, TARC1, reg_tarc1); 829 ew32(TARC1, reg_tarc1);
822 break; 830 break;
823 case e1000_ich8lan: 831 case e1000_ich8lan:
824 /* Reduce concurrent DMA requests to 3 from 4 */ 832 /* Reduce concurrent DMA requests to 3 from 4 */
@@ -827,16 +835,16 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
827 (hw->device_id != E1000_DEV_ID_ICH8_IGP_M))) 835 (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))
828 reg_tarc0 |= ((1 << 29)|(1 << 28)); 836 reg_tarc0 |= ((1 << 29)|(1 << 28));
829 837
830 reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 838 reg_ctrl_ext = er32(CTRL_EXT);
831 reg_ctrl_ext |= (1 << 22); 839 reg_ctrl_ext |= (1 << 22);
832 E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext); 840 ew32(CTRL_EXT, reg_ctrl_ext);
833 841
834 /* workaround TX hang with TSO=on */ 842 /* workaround TX hang with TSO=on */
835 reg_tarc0 |= ((1 << 27)|(1 << 26)|(1 << 24)|(1 << 23)); 843 reg_tarc0 |= ((1 << 27)|(1 << 26)|(1 << 24)|(1 << 23));
836 844
837 /* Multiple read bit is reversed polarity */ 845 /* Multiple read bit is reversed polarity */
838 reg_tctl = E1000_READ_REG(hw, TCTL); 846 reg_tctl = er32(TCTL);
839 reg_tarc1 = E1000_READ_REG(hw, TARC1); 847 reg_tarc1 = er32(TARC1);
840 if (reg_tctl & E1000_TCTL_MULR) 848 if (reg_tctl & E1000_TCTL_MULR)
841 reg_tarc1 &= ~(1 << 28); 849 reg_tarc1 &= ~(1 << 28);
842 else 850 else
@@ -845,13 +853,13 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
845 /* workaround TX hang with TSO=on */ 853 /* workaround TX hang with TSO=on */
846 reg_tarc1 |= ((1 << 30)|(1 << 26)|(1 << 24)); 854 reg_tarc1 |= ((1 << 30)|(1 << 26)|(1 << 24));
847 855
848 E1000_WRITE_REG(hw, TARC1, reg_tarc1); 856 ew32(TARC1, reg_tarc1);
849 break; 857 break;
850 default: 858 default:
851 break; 859 break;
852 } 860 }
853 861
854 E1000_WRITE_REG(hw, TARC0, reg_tarc0); 862 ew32(TARC0, reg_tarc0);
855 } 863 }
856} 864}
857 865
@@ -866,8 +874,7 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
866 * configuration and flow control settings. Clears all on-chip counters. Leaves 874 * configuration and flow control settings. Clears all on-chip counters. Leaves
867 * the transmit and receive units disabled and uninitialized. 875 * the transmit and receive units disabled and uninitialized.
868 *****************************************************************************/ 876 *****************************************************************************/
869s32 877s32 e1000_init_hw(struct e1000_hw *hw)
870e1000_init_hw(struct e1000_hw *hw)
871{ 878{
872 u32 ctrl; 879 u32 ctrl;
873 u32 i; 880 u32 i;
@@ -883,9 +890,9 @@ e1000_init_hw(struct e1000_hw *hw)
883 ((hw->revision_id < 3) || 890 ((hw->revision_id < 3) ||
884 ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) && 891 ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) &&
885 (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))) { 892 (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))) {
886 reg_data = E1000_READ_REG(hw, STATUS); 893 reg_data = er32(STATUS);
887 reg_data &= ~0x80000000; 894 reg_data &= ~0x80000000;
888 E1000_WRITE_REG(hw, STATUS, reg_data); 895 ew32(STATUS, reg_data);
889 } 896 }
890 897
891 /* Initialize Identification LED */ 898 /* Initialize Identification LED */
@@ -906,7 +913,7 @@ e1000_init_hw(struct e1000_hw *hw)
906 /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */ 913 /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */
907 if (hw->mac_type != e1000_ich8lan) { 914 if (hw->mac_type != e1000_ich8lan) {
908 if (hw->mac_type < e1000_82545_rev_3) 915 if (hw->mac_type < e1000_82545_rev_3)
909 E1000_WRITE_REG(hw, VET, 0); 916 ew32(VET, 0);
910 e1000_clear_vfta(hw); 917 e1000_clear_vfta(hw);
911 } 918 }
912 919
@@ -914,8 +921,8 @@ e1000_init_hw(struct e1000_hw *hw)
914 if (hw->mac_type == e1000_82542_rev2_0) { 921 if (hw->mac_type == e1000_82542_rev2_0) {
915 DEBUGOUT("Disabling MWI on 82542 rev 2.0\n"); 922 DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
916 e1000_pci_clear_mwi(hw); 923 e1000_pci_clear_mwi(hw);
917 E1000_WRITE_REG(hw, RCTL, E1000_RCTL_RST); 924 ew32(RCTL, E1000_RCTL_RST);
918 E1000_WRITE_FLUSH(hw); 925 E1000_WRITE_FLUSH();
919 msleep(5); 926 msleep(5);
920 } 927 }
921 928
@@ -926,8 +933,8 @@ e1000_init_hw(struct e1000_hw *hw)
926 933
927 /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */ 934 /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */
928 if (hw->mac_type == e1000_82542_rev2_0) { 935 if (hw->mac_type == e1000_82542_rev2_0) {
929 E1000_WRITE_REG(hw, RCTL, 0); 936 ew32(RCTL, 0);
930 E1000_WRITE_FLUSH(hw); 937 E1000_WRITE_FLUSH();
931 msleep(1); 938 msleep(1);
932 if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE) 939 if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
933 e1000_pci_set_mwi(hw); 940 e1000_pci_set_mwi(hw);
@@ -942,7 +949,7 @@ e1000_init_hw(struct e1000_hw *hw)
942 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); 949 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
943 /* use write flush to prevent Memory Write Block (MWB) from 950 /* use write flush to prevent Memory Write Block (MWB) from
944 * occuring when accessing our register space */ 951 * occuring when accessing our register space */
945 E1000_WRITE_FLUSH(hw); 952 E1000_WRITE_FLUSH();
946 } 953 }
947 954
948 /* Set the PCI priority bit correctly in the CTRL register. This 955 /* Set the PCI priority bit correctly in the CTRL register. This
@@ -951,8 +958,8 @@ e1000_init_hw(struct e1000_hw *hw)
951 * 82542 and 82543 silicon. 958 * 82542 and 82543 silicon.
952 */ 959 */
953 if (hw->dma_fairness && hw->mac_type <= e1000_82543) { 960 if (hw->dma_fairness && hw->mac_type <= e1000_82543) {
954 ctrl = E1000_READ_REG(hw, CTRL); 961 ctrl = er32(CTRL);
955 E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR); 962 ew32(CTRL, ctrl | E1000_CTRL_PRIOR);
956 } 963 }
957 964
958 switch (hw->mac_type) { 965 switch (hw->mac_type) {
@@ -975,9 +982,9 @@ e1000_init_hw(struct e1000_hw *hw)
975 982
976 /* Set the transmit descriptor write-back policy */ 983 /* Set the transmit descriptor write-back policy */
977 if (hw->mac_type > e1000_82544) { 984 if (hw->mac_type > e1000_82544) {
978 ctrl = E1000_READ_REG(hw, TXDCTL); 985 ctrl = er32(TXDCTL);
979 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB; 986 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
980 E1000_WRITE_REG(hw, TXDCTL, ctrl); 987 ew32(TXDCTL, ctrl);
981 } 988 }
982 989
983 if (hw->mac_type == e1000_82573) { 990 if (hw->mac_type == e1000_82573) {
@@ -989,21 +996,21 @@ e1000_init_hw(struct e1000_hw *hw)
989 break; 996 break;
990 case e1000_80003es2lan: 997 case e1000_80003es2lan:
991 /* Enable retransmit on late collisions */ 998 /* Enable retransmit on late collisions */
992 reg_data = E1000_READ_REG(hw, TCTL); 999 reg_data = er32(TCTL);
993 reg_data |= E1000_TCTL_RTLC; 1000 reg_data |= E1000_TCTL_RTLC;
994 E1000_WRITE_REG(hw, TCTL, reg_data); 1001 ew32(TCTL, reg_data);
995 1002
996 /* Configure Gigabit Carry Extend Padding */ 1003 /* Configure Gigabit Carry Extend Padding */
997 reg_data = E1000_READ_REG(hw, TCTL_EXT); 1004 reg_data = er32(TCTL_EXT);
998 reg_data &= ~E1000_TCTL_EXT_GCEX_MASK; 1005 reg_data &= ~E1000_TCTL_EXT_GCEX_MASK;
999 reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; 1006 reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
1000 E1000_WRITE_REG(hw, TCTL_EXT, reg_data); 1007 ew32(TCTL_EXT, reg_data);
1001 1008
1002 /* Configure Transmit Inter-Packet Gap */ 1009 /* Configure Transmit Inter-Packet Gap */
1003 reg_data = E1000_READ_REG(hw, TIPG); 1010 reg_data = er32(TIPG);
1004 reg_data &= ~E1000_TIPG_IPGT_MASK; 1011 reg_data &= ~E1000_TIPG_IPGT_MASK;
1005 reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; 1012 reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
1006 E1000_WRITE_REG(hw, TIPG, reg_data); 1013 ew32(TIPG, reg_data);
1007 1014
1008 reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001); 1015 reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001);
1009 reg_data &= ~0x00100000; 1016 reg_data &= ~0x00100000;
@@ -1012,17 +1019,17 @@ e1000_init_hw(struct e1000_hw *hw)
1012 case e1000_82571: 1019 case e1000_82571:
1013 case e1000_82572: 1020 case e1000_82572:
1014 case e1000_ich8lan: 1021 case e1000_ich8lan:
1015 ctrl = E1000_READ_REG(hw, TXDCTL1); 1022 ctrl = er32(TXDCTL1);
1016 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB; 1023 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
1017 E1000_WRITE_REG(hw, TXDCTL1, ctrl); 1024 ew32(TXDCTL1, ctrl);
1018 break; 1025 break;
1019 } 1026 }
1020 1027
1021 1028
1022 if (hw->mac_type == e1000_82573) { 1029 if (hw->mac_type == e1000_82573) {
1023 u32 gcr = E1000_READ_REG(hw, GCR); 1030 u32 gcr = er32(GCR);
1024 gcr |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; 1031 gcr |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
1025 E1000_WRITE_REG(hw, GCR, gcr); 1032 ew32(GCR, gcr);
1026 } 1033 }
1027 1034
1028 /* Clear all of the statistics registers (clear on read). It is 1035 /* Clear all of the statistics registers (clear on read). It is
@@ -1039,11 +1046,11 @@ e1000_init_hw(struct e1000_hw *hw)
1039 1046
1040 if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER || 1047 if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER ||
1041 hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) { 1048 hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) {
1042 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1049 ctrl_ext = er32(CTRL_EXT);
1043 /* Relaxed ordering must be disabled to avoid a parity 1050 /* Relaxed ordering must be disabled to avoid a parity
1044 * error crash in a PCI slot. */ 1051 * error crash in a PCI slot. */
1045 ctrl_ext |= E1000_CTRL_EXT_RO_DIS; 1052 ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
1046 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 1053 ew32(CTRL_EXT, ctrl_ext);
1047 } 1054 }
1048 1055
1049 return ret_val; 1056 return ret_val;
@@ -1054,8 +1061,7 @@ e1000_init_hw(struct e1000_hw *hw)
1054 * 1061 *
1055 * hw - Struct containing variables accessed by shared code. 1062 * hw - Struct containing variables accessed by shared code.
1056 *****************************************************************************/ 1063 *****************************************************************************/
1057static s32 1064static s32 e1000_adjust_serdes_amplitude(struct e1000_hw *hw)
1058e1000_adjust_serdes_amplitude(struct e1000_hw *hw)
1059{ 1065{
1060 u16 eeprom_data; 1066 u16 eeprom_data;
1061 s32 ret_val; 1067 s32 ret_val;
@@ -1100,8 +1106,7 @@ e1000_adjust_serdes_amplitude(struct e1000_hw *hw)
1100 * established. Assumes the hardware has previously been reset and the 1106 * established. Assumes the hardware has previously been reset and the
1101 * transmitter and receiver are not enabled. 1107 * transmitter and receiver are not enabled.
1102 *****************************************************************************/ 1108 *****************************************************************************/
1103s32 1109s32 e1000_setup_link(struct e1000_hw *hw)
1104e1000_setup_link(struct e1000_hw *hw)
1105{ 1110{
1106 u32 ctrl_ext; 1111 u32 ctrl_ext;
1107 s32 ret_val; 1112 s32 ret_val;
@@ -1176,7 +1181,7 @@ e1000_setup_link(struct e1000_hw *hw)
1176 } 1181 }
1177 ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) << 1182 ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) <<
1178 SWDPIO__EXT_SHIFT); 1183 SWDPIO__EXT_SHIFT);
1179 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 1184 ew32(CTRL_EXT, ctrl_ext);
1180 } 1185 }
1181 1186
1182 /* Call the necessary subroutine to configure the link. */ 1187 /* Call the necessary subroutine to configure the link. */
@@ -1193,12 +1198,12 @@ e1000_setup_link(struct e1000_hw *hw)
1193 1198
1194 /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */ 1199 /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */
1195 if (hw->mac_type != e1000_ich8lan) { 1200 if (hw->mac_type != e1000_ich8lan) {
1196 E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE); 1201 ew32(FCT, FLOW_CONTROL_TYPE);
1197 E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH); 1202 ew32(FCAH, FLOW_CONTROL_ADDRESS_HIGH);
1198 E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW); 1203 ew32(FCAL, FLOW_CONTROL_ADDRESS_LOW);
1199 } 1204 }
1200 1205
1201 E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time); 1206 ew32(FCTTV, hw->fc_pause_time);
1202 1207
1203 /* Set the flow control receive threshold registers. Normally, 1208 /* Set the flow control receive threshold registers. Normally,
1204 * these registers will be set to a default threshold that may be 1209 * these registers will be set to a default threshold that may be
@@ -1207,18 +1212,18 @@ e1000_setup_link(struct e1000_hw *hw)
1207 * registers will be set to 0. 1212 * registers will be set to 0.
1208 */ 1213 */
1209 if (!(hw->fc & E1000_FC_TX_PAUSE)) { 1214 if (!(hw->fc & E1000_FC_TX_PAUSE)) {
1210 E1000_WRITE_REG(hw, FCRTL, 0); 1215 ew32(FCRTL, 0);
1211 E1000_WRITE_REG(hw, FCRTH, 0); 1216 ew32(FCRTH, 0);
1212 } else { 1217 } else {
1213 /* We need to set up the Receive Threshold high and low water marks 1218 /* We need to set up the Receive Threshold high and low water marks
1214 * as well as (optionally) enabling the transmission of XON frames. 1219 * as well as (optionally) enabling the transmission of XON frames.
1215 */ 1220 */
1216 if (hw->fc_send_xon) { 1221 if (hw->fc_send_xon) {
1217 E1000_WRITE_REG(hw, FCRTL, (hw->fc_low_water | E1000_FCRTL_XONE)); 1222 ew32(FCRTL, (hw->fc_low_water | E1000_FCRTL_XONE));
1218 E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water); 1223 ew32(FCRTH, hw->fc_high_water);
1219 } else { 1224 } else {
1220 E1000_WRITE_REG(hw, FCRTL, hw->fc_low_water); 1225 ew32(FCRTL, hw->fc_low_water);
1221 E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water); 1226 ew32(FCRTH, hw->fc_high_water);
1222 } 1227 }
1223 } 1228 }
1224 return ret_val; 1229 return ret_val;
@@ -1233,8 +1238,7 @@ e1000_setup_link(struct e1000_hw *hw)
1233 * link. Assumes the hardware has been previously reset and the transmitter 1238 * link. Assumes the hardware has been previously reset and the transmitter
1234 * and receiver are not enabled. 1239 * and receiver are not enabled.
1235 *****************************************************************************/ 1240 *****************************************************************************/
1236static s32 1241static s32 e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1237e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1238{ 1242{
1239 u32 ctrl; 1243 u32 ctrl;
1240 u32 status; 1244 u32 status;
@@ -1251,7 +1255,7 @@ e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1251 * loopback mode is disabled during initialization. 1255 * loopback mode is disabled during initialization.
1252 */ 1256 */
1253 if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) 1257 if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572)
1254 E1000_WRITE_REG(hw, SCTL, E1000_DISABLE_SERDES_LOOPBACK); 1258 ew32(SCTL, E1000_DISABLE_SERDES_LOOPBACK);
1255 1259
1256 /* On adapters with a MAC newer than 82544, SWDP 1 will be 1260 /* On adapters with a MAC newer than 82544, SWDP 1 will be
1257 * set when the optics detect a signal. On older adapters, it will be 1261 * set when the optics detect a signal. On older adapters, it will be
@@ -1259,7 +1263,7 @@ e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1259 * If we're on serdes media, adjust the output amplitude to value 1263 * If we're on serdes media, adjust the output amplitude to value
1260 * set in the EEPROM. 1264 * set in the EEPROM.
1261 */ 1265 */
1262 ctrl = E1000_READ_REG(hw, CTRL); 1266 ctrl = er32(CTRL);
1263 if (hw->media_type == e1000_media_type_fiber) 1267 if (hw->media_type == e1000_media_type_fiber)
1264 signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0; 1268 signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
1265 1269
@@ -1330,9 +1334,9 @@ e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1330 */ 1334 */
1331 DEBUGOUT("Auto-negotiation enabled\n"); 1335 DEBUGOUT("Auto-negotiation enabled\n");
1332 1336
1333 E1000_WRITE_REG(hw, TXCW, txcw); 1337 ew32(TXCW, txcw);
1334 E1000_WRITE_REG(hw, CTRL, ctrl); 1338 ew32(CTRL, ctrl);
1335 E1000_WRITE_FLUSH(hw); 1339 E1000_WRITE_FLUSH();
1336 1340
1337 hw->txcw = txcw; 1341 hw->txcw = txcw;
1338 msleep(1); 1342 msleep(1);
@@ -1344,11 +1348,11 @@ e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1344 * For internal serdes, we just assume a signal is present, then poll. 1348 * For internal serdes, we just assume a signal is present, then poll.
1345 */ 1349 */
1346 if (hw->media_type == e1000_media_type_internal_serdes || 1350 if (hw->media_type == e1000_media_type_internal_serdes ||
1347 (E1000_READ_REG(hw, CTRL) & E1000_CTRL_SWDPIN1) == signal) { 1351 (er32(CTRL) & E1000_CTRL_SWDPIN1) == signal) {
1348 DEBUGOUT("Looking for Link\n"); 1352 DEBUGOUT("Looking for Link\n");
1349 for (i = 0; i < (LINK_UP_TIMEOUT / 10); i++) { 1353 for (i = 0; i < (LINK_UP_TIMEOUT / 10); i++) {
1350 msleep(10); 1354 msleep(10);
1351 status = E1000_READ_REG(hw, STATUS); 1355 status = er32(STATUS);
1352 if (status & E1000_STATUS_LU) break; 1356 if (status & E1000_STATUS_LU) break;
1353 } 1357 }
1354 if (i == (LINK_UP_TIMEOUT / 10)) { 1358 if (i == (LINK_UP_TIMEOUT / 10)) {
@@ -1380,8 +1384,7 @@ e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
1380* 1384*
1381* hw - Struct containing variables accessed by shared code 1385* hw - Struct containing variables accessed by shared code
1382******************************************************************************/ 1386******************************************************************************/
1383static s32 1387static s32 e1000_copper_link_preconfig(struct e1000_hw *hw)
1384e1000_copper_link_preconfig(struct e1000_hw *hw)
1385{ 1388{
1386 u32 ctrl; 1389 u32 ctrl;
1387 s32 ret_val; 1390 s32 ret_val;
@@ -1389,7 +1392,7 @@ e1000_copper_link_preconfig(struct e1000_hw *hw)
1389 1392
1390 DEBUGFUNC("e1000_copper_link_preconfig"); 1393 DEBUGFUNC("e1000_copper_link_preconfig");
1391 1394
1392 ctrl = E1000_READ_REG(hw, CTRL); 1395 ctrl = er32(CTRL);
1393 /* With 82543, we need to force speed and duplex on the MAC equal to what 1396 /* With 82543, we need to force speed and duplex on the MAC equal to what
1394 * the PHY speed and duplex configuration is. In addition, we need to 1397 * the PHY speed and duplex configuration is. In addition, we need to
1395 * perform a hardware reset on the PHY to take it out of reset. 1398 * perform a hardware reset on the PHY to take it out of reset.
@@ -1397,10 +1400,10 @@ e1000_copper_link_preconfig(struct e1000_hw *hw)
1397 if (hw->mac_type > e1000_82543) { 1400 if (hw->mac_type > e1000_82543) {
1398 ctrl |= E1000_CTRL_SLU; 1401 ctrl |= E1000_CTRL_SLU;
1399 ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 1402 ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
1400 E1000_WRITE_REG(hw, CTRL, ctrl); 1403 ew32(CTRL, ctrl);
1401 } else { 1404 } else {
1402 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_SLU); 1405 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_SLU);
1403 E1000_WRITE_REG(hw, CTRL, ctrl); 1406 ew32(CTRL, ctrl);
1404 ret_val = e1000_phy_hw_reset(hw); 1407 ret_val = e1000_phy_hw_reset(hw);
1405 if (ret_val) 1408 if (ret_val)
1406 return ret_val; 1409 return ret_val;
@@ -1440,8 +1443,7 @@ e1000_copper_link_preconfig(struct e1000_hw *hw)
1440* 1443*
1441* hw - Struct containing variables accessed by shared code 1444* hw - Struct containing variables accessed by shared code
1442*********************************************************************/ 1445*********************************************************************/
1443static s32 1446static s32 e1000_copper_link_igp_setup(struct e1000_hw *hw)
1444e1000_copper_link_igp_setup(struct e1000_hw *hw)
1445{ 1447{
1446 u32 led_ctrl; 1448 u32 led_ctrl;
1447 s32 ret_val; 1449 s32 ret_val;
@@ -1462,10 +1464,10 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw)
1462 msleep(15); 1464 msleep(15);
1463 if (hw->mac_type != e1000_ich8lan) { 1465 if (hw->mac_type != e1000_ich8lan) {
1464 /* Configure activity LED after PHY reset */ 1466 /* Configure activity LED after PHY reset */
1465 led_ctrl = E1000_READ_REG(hw, LEDCTL); 1467 led_ctrl = er32(LEDCTL);
1466 led_ctrl &= IGP_ACTIVITY_LED_MASK; 1468 led_ctrl &= IGP_ACTIVITY_LED_MASK;
1467 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 1469 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
1468 E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 1470 ew32(LEDCTL, led_ctrl);
1469 } 1471 }
1470 1472
1471 /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */ 1473 /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */
@@ -1587,8 +1589,7 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw)
1587* 1589*
1588* hw - Struct containing variables accessed by shared code 1590* hw - Struct containing variables accessed by shared code
1589*********************************************************************/ 1591*********************************************************************/
1590static s32 1592static s32 e1000_copper_link_ggp_setup(struct e1000_hw *hw)
1591e1000_copper_link_ggp_setup(struct e1000_hw *hw)
1592{ 1593{
1593 s32 ret_val; 1594 s32 ret_val;
1594 u16 phy_data; 1595 u16 phy_data;
@@ -1679,9 +1680,9 @@ e1000_copper_link_ggp_setup(struct e1000_hw *hw)
1679 if (ret_val) 1680 if (ret_val)
1680 return ret_val; 1681 return ret_val;
1681 1682
1682 reg_data = E1000_READ_REG(hw, CTRL_EXT); 1683 reg_data = er32(CTRL_EXT);
1683 reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK); 1684 reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);
1684 E1000_WRITE_REG(hw, CTRL_EXT, reg_data); 1685 ew32(CTRL_EXT, reg_data);
1685 1686
1686 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL, 1687 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
1687 &phy_data); 1688 &phy_data);
@@ -1735,8 +1736,7 @@ e1000_copper_link_ggp_setup(struct e1000_hw *hw)
1735* 1736*
1736* hw - Struct containing variables accessed by shared code 1737* hw - Struct containing variables accessed by shared code
1737*********************************************************************/ 1738*********************************************************************/
1738static s32 1739static s32 e1000_copper_link_mgp_setup(struct e1000_hw *hw)
1739e1000_copper_link_mgp_setup(struct e1000_hw *hw)
1740{ 1740{
1741 s32 ret_val; 1741 s32 ret_val;
1742 u16 phy_data; 1742 u16 phy_data;
@@ -1839,8 +1839,7 @@ e1000_copper_link_mgp_setup(struct e1000_hw *hw)
1839* 1839*
1840* hw - Struct containing variables accessed by shared code 1840* hw - Struct containing variables accessed by shared code
1841*********************************************************************/ 1841*********************************************************************/
1842static s32 1842static s32 e1000_copper_link_autoneg(struct e1000_hw *hw)
1843e1000_copper_link_autoneg(struct e1000_hw *hw)
1844{ 1843{
1845 s32 ret_val; 1844 s32 ret_val;
1846 u16 phy_data; 1845 u16 phy_data;
@@ -1910,8 +1909,7 @@ e1000_copper_link_autoneg(struct e1000_hw *hw)
1910* 1909*
1911* hw - Struct containing variables accessed by shared code 1910* hw - Struct containing variables accessed by shared code
1912******************************************************************************/ 1911******************************************************************************/
1913static s32 1912static s32 e1000_copper_link_postconfig(struct e1000_hw *hw)
1914e1000_copper_link_postconfig(struct e1000_hw *hw)
1915{ 1913{
1916 s32 ret_val; 1914 s32 ret_val;
1917 DEBUGFUNC("e1000_copper_link_postconfig"); 1915 DEBUGFUNC("e1000_copper_link_postconfig");
@@ -1948,8 +1946,7 @@ e1000_copper_link_postconfig(struct e1000_hw *hw)
1948* 1946*
1949* hw - Struct containing variables accessed by shared code 1947* hw - Struct containing variables accessed by shared code
1950******************************************************************************/ 1948******************************************************************************/
1951static s32 1949static s32 e1000_setup_copper_link(struct e1000_hw *hw)
1952e1000_setup_copper_link(struct e1000_hw *hw)
1953{ 1950{
1954 s32 ret_val; 1951 s32 ret_val;
1955 u16 i; 1952 u16 i;
@@ -2062,8 +2059,7 @@ e1000_setup_copper_link(struct e1000_hw *hw)
2062* 2059*
2063* hw - Struct containing variables accessed by shared code 2060* hw - Struct containing variables accessed by shared code
2064******************************************************************************/ 2061******************************************************************************/
2065static s32 2062static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex)
2066e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex)
2067{ 2063{
2068 s32 ret_val = E1000_SUCCESS; 2064 s32 ret_val = E1000_SUCCESS;
2069 u32 tipg; 2065 u32 tipg;
@@ -2078,10 +2074,10 @@ e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex)
2078 return ret_val; 2074 return ret_val;
2079 2075
2080 /* Configure Transmit Inter-Packet Gap */ 2076 /* Configure Transmit Inter-Packet Gap */
2081 tipg = E1000_READ_REG(hw, TIPG); 2077 tipg = er32(TIPG);
2082 tipg &= ~E1000_TIPG_IPGT_MASK; 2078 tipg &= ~E1000_TIPG_IPGT_MASK;
2083 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100; 2079 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100;
2084 E1000_WRITE_REG(hw, TIPG, tipg); 2080 ew32(TIPG, tipg);
2085 2081
2086 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data); 2082 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
2087 2083
@@ -2098,8 +2094,7 @@ e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex)
2098 return ret_val; 2094 return ret_val;
2099} 2095}
2100 2096
2101static s32 2097static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
2102e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
2103{ 2098{
2104 s32 ret_val = E1000_SUCCESS; 2099 s32 ret_val = E1000_SUCCESS;
2105 u16 reg_data; 2100 u16 reg_data;
@@ -2114,10 +2109,10 @@ e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
2114 return ret_val; 2109 return ret_val;
2115 2110
2116 /* Configure Transmit Inter-Packet Gap */ 2111 /* Configure Transmit Inter-Packet Gap */
2117 tipg = E1000_READ_REG(hw, TIPG); 2112 tipg = er32(TIPG);
2118 tipg &= ~E1000_TIPG_IPGT_MASK; 2113 tipg &= ~E1000_TIPG_IPGT_MASK;
2119 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; 2114 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
2120 E1000_WRITE_REG(hw, TIPG, tipg); 2115 ew32(TIPG, tipg);
2121 2116
2122 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data); 2117 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
2123 2118
@@ -2135,8 +2130,7 @@ e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
2135* 2130*
2136* hw - Struct containing variables accessed by shared code 2131* hw - Struct containing variables accessed by shared code
2137******************************************************************************/ 2132******************************************************************************/
2138s32 2133s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
2139e1000_phy_setup_autoneg(struct e1000_hw *hw)
2140{ 2134{
2141 s32 ret_val; 2135 s32 ret_val;
2142 u16 mii_autoneg_adv_reg; 2136 u16 mii_autoneg_adv_reg;
@@ -2284,8 +2278,7 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw)
2284* 2278*
2285* hw - Struct containing variables accessed by shared code 2279* hw - Struct containing variables accessed by shared code
2286******************************************************************************/ 2280******************************************************************************/
2287static s32 2281static s32 e1000_phy_force_speed_duplex(struct e1000_hw *hw)
2288e1000_phy_force_speed_duplex(struct e1000_hw *hw)
2289{ 2282{
2290 u32 ctrl; 2283 u32 ctrl;
2291 s32 ret_val; 2284 s32 ret_val;
@@ -2302,7 +2295,7 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
2302 DEBUGOUT1("hw->fc = %d\n", hw->fc); 2295 DEBUGOUT1("hw->fc = %d\n", hw->fc);
2303 2296
2304 /* Read the Device Control Register. */ 2297 /* Read the Device Control Register. */
2305 ctrl = E1000_READ_REG(hw, CTRL); 2298 ctrl = er32(CTRL);
2306 2299
2307 /* Set the bits to Force Speed and Duplex in the Device Ctrl Reg. */ 2300 /* Set the bits to Force Speed and Duplex in the Device Ctrl Reg. */
2308 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 2301 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
@@ -2357,7 +2350,7 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
2357 e1000_config_collision_dist(hw); 2350 e1000_config_collision_dist(hw);
2358 2351
2359 /* Write the configured values back to the Device Control Reg. */ 2352 /* Write the configured values back to the Device Control Reg. */
2360 E1000_WRITE_REG(hw, CTRL, ctrl); 2353 ew32(CTRL, ctrl);
2361 2354
2362 if ((hw->phy_type == e1000_phy_m88) || 2355 if ((hw->phy_type == e1000_phy_m88) ||
2363 (hw->phy_type == e1000_phy_gg82563)) { 2356 (hw->phy_type == e1000_phy_gg82563)) {
@@ -2535,8 +2528,7 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
2535* Link should have been established previously. Reads the speed and duplex 2528* Link should have been established previously. Reads the speed and duplex
2536* information from the Device Status register. 2529* information from the Device Status register.
2537******************************************************************************/ 2530******************************************************************************/
2538void 2531void e1000_config_collision_dist(struct e1000_hw *hw)
2539e1000_config_collision_dist(struct e1000_hw *hw)
2540{ 2532{
2541 u32 tctl, coll_dist; 2533 u32 tctl, coll_dist;
2542 2534
@@ -2547,13 +2539,13 @@ e1000_config_collision_dist(struct e1000_hw *hw)
2547 else 2539 else
2548 coll_dist = E1000_COLLISION_DISTANCE; 2540 coll_dist = E1000_COLLISION_DISTANCE;
2549 2541
2550 tctl = E1000_READ_REG(hw, TCTL); 2542 tctl = er32(TCTL);
2551 2543
2552 tctl &= ~E1000_TCTL_COLD; 2544 tctl &= ~E1000_TCTL_COLD;
2553 tctl |= coll_dist << E1000_COLD_SHIFT; 2545 tctl |= coll_dist << E1000_COLD_SHIFT;
2554 2546
2555 E1000_WRITE_REG(hw, TCTL, tctl); 2547 ew32(TCTL, tctl);
2556 E1000_WRITE_FLUSH(hw); 2548 E1000_WRITE_FLUSH();
2557} 2549}
2558 2550
2559/****************************************************************************** 2551/******************************************************************************
@@ -2565,8 +2557,7 @@ e1000_config_collision_dist(struct e1000_hw *hw)
2565* The contents of the PHY register containing the needed information need to 2557* The contents of the PHY register containing the needed information need to
2566* be passed in. 2558* be passed in.
2567******************************************************************************/ 2559******************************************************************************/
2568static s32 2560static s32 e1000_config_mac_to_phy(struct e1000_hw *hw)
2569e1000_config_mac_to_phy(struct e1000_hw *hw)
2570{ 2561{
2571 u32 ctrl; 2562 u32 ctrl;
2572 s32 ret_val; 2563 s32 ret_val;
@@ -2582,7 +2573,7 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
2582 /* Read the Device Control Register and set the bits to Force Speed 2573 /* Read the Device Control Register and set the bits to Force Speed
2583 * and Duplex. 2574 * and Duplex.
2584 */ 2575 */
2585 ctrl = E1000_READ_REG(hw, CTRL); 2576 ctrl = er32(CTRL);
2586 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 2577 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
2587 ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS); 2578 ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS);
2588 2579
@@ -2609,7 +2600,7 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
2609 ctrl |= E1000_CTRL_SPD_100; 2600 ctrl |= E1000_CTRL_SPD_100;
2610 2601
2611 /* Write the configured values back to the Device Control Reg. */ 2602 /* Write the configured values back to the Device Control Reg. */
2612 E1000_WRITE_REG(hw, CTRL, ctrl); 2603 ew32(CTRL, ctrl);
2613 return E1000_SUCCESS; 2604 return E1000_SUCCESS;
2614} 2605}
2615 2606
@@ -2624,15 +2615,14 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
2624 * by the PHY rather than the MAC. Software must also configure these 2615 * by the PHY rather than the MAC. Software must also configure these
2625 * bits when link is forced on a fiber connection. 2616 * bits when link is forced on a fiber connection.
2626 *****************************************************************************/ 2617 *****************************************************************************/
2627s32 2618s32 e1000_force_mac_fc(struct e1000_hw *hw)
2628e1000_force_mac_fc(struct e1000_hw *hw)
2629{ 2619{
2630 u32 ctrl; 2620 u32 ctrl;
2631 2621
2632 DEBUGFUNC("e1000_force_mac_fc"); 2622 DEBUGFUNC("e1000_force_mac_fc");
2633 2623
2634 /* Get the current configuration of the Device Control Register */ 2624 /* Get the current configuration of the Device Control Register */
2635 ctrl = E1000_READ_REG(hw, CTRL); 2625 ctrl = er32(CTRL);
2636 2626
2637 /* Because we didn't get link via the internal auto-negotiation 2627 /* Because we didn't get link via the internal auto-negotiation
2638 * mechanism (we either forced link or we got link via PHY 2628 * mechanism (we either forced link or we got link via PHY
@@ -2676,7 +2666,7 @@ e1000_force_mac_fc(struct e1000_hw *hw)
2676 if (hw->mac_type == e1000_82542_rev2_0) 2666 if (hw->mac_type == e1000_82542_rev2_0)
2677 ctrl &= (~E1000_CTRL_TFCE); 2667 ctrl &= (~E1000_CTRL_TFCE);
2678 2668
2679 E1000_WRITE_REG(hw, CTRL, ctrl); 2669 ew32(CTRL, ctrl);
2680 return E1000_SUCCESS; 2670 return E1000_SUCCESS;
2681} 2671}
2682 2672
@@ -2691,8 +2681,7 @@ e1000_force_mac_fc(struct e1000_hw *hw)
2691 * based on the flow control negotiated by the PHY. In TBI mode, the TFCE 2681 * based on the flow control negotiated by the PHY. In TBI mode, the TFCE
2692 * and RFCE bits will be automaticaly set to the negotiated flow control mode. 2682 * and RFCE bits will be automaticaly set to the negotiated flow control mode.
2693 *****************************************************************************/ 2683 *****************************************************************************/
2694static s32 2684static s32 e1000_config_fc_after_link_up(struct e1000_hw *hw)
2695e1000_config_fc_after_link_up(struct e1000_hw *hw)
2696{ 2685{
2697 s32 ret_val; 2686 s32 ret_val;
2698 u16 mii_status_reg; 2687 u16 mii_status_reg;
@@ -2896,8 +2885,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
2896 * 2885 *
2897 * Called by any function that needs to check the link status of the adapter. 2886 * Called by any function that needs to check the link status of the adapter.
2898 *****************************************************************************/ 2887 *****************************************************************************/
2899s32 2888s32 e1000_check_for_link(struct e1000_hw *hw)
2900e1000_check_for_link(struct e1000_hw *hw)
2901{ 2889{
2902 u32 rxcw = 0; 2890 u32 rxcw = 0;
2903 u32 ctrl; 2891 u32 ctrl;
@@ -2910,8 +2898,8 @@ e1000_check_for_link(struct e1000_hw *hw)
2910 2898
2911 DEBUGFUNC("e1000_check_for_link"); 2899 DEBUGFUNC("e1000_check_for_link");
2912 2900
2913 ctrl = E1000_READ_REG(hw, CTRL); 2901 ctrl = er32(CTRL);
2914 status = E1000_READ_REG(hw, STATUS); 2902 status = er32(STATUS);
2915 2903
2916 /* On adapters with a MAC newer than 82544, SW Defineable pin 1 will be 2904 /* On adapters with a MAC newer than 82544, SW Defineable pin 1 will be
2917 * set when the optics detect a signal. On older adapters, it will be 2905 * set when the optics detect a signal. On older adapters, it will be
@@ -2919,7 +2907,7 @@ e1000_check_for_link(struct e1000_hw *hw)
2919 */ 2907 */
2920 if ((hw->media_type == e1000_media_type_fiber) || 2908 if ((hw->media_type == e1000_media_type_fiber) ||
2921 (hw->media_type == e1000_media_type_internal_serdes)) { 2909 (hw->media_type == e1000_media_type_internal_serdes)) {
2922 rxcw = E1000_READ_REG(hw, RXCW); 2910 rxcw = er32(RXCW);
2923 2911
2924 if (hw->media_type == e1000_media_type_fiber) { 2912 if (hw->media_type == e1000_media_type_fiber) {
2925 signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0; 2913 signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
@@ -2965,11 +2953,11 @@ e1000_check_for_link(struct e1000_hw *hw)
2965 (!hw->autoneg) && 2953 (!hw->autoneg) &&
2966 (hw->forced_speed_duplex == e1000_10_full || 2954 (hw->forced_speed_duplex == e1000_10_full ||
2967 hw->forced_speed_duplex == e1000_10_half)) { 2955 hw->forced_speed_duplex == e1000_10_half)) {
2968 E1000_WRITE_REG(hw, IMC, 0xffffffff); 2956 ew32(IMC, 0xffffffff);
2969 ret_val = e1000_polarity_reversal_workaround(hw); 2957 ret_val = e1000_polarity_reversal_workaround(hw);
2970 icr = E1000_READ_REG(hw, ICR); 2958 icr = er32(ICR);
2971 E1000_WRITE_REG(hw, ICS, (icr & ~E1000_ICS_LSC)); 2959 ew32(ICS, (icr & ~E1000_ICS_LSC));
2972 E1000_WRITE_REG(hw, IMS, IMS_ENABLE_MASK); 2960 ew32(IMS, IMS_ENABLE_MASK);
2973 } 2961 }
2974 2962
2975 } else { 2963 } else {
@@ -3034,9 +3022,9 @@ e1000_check_for_link(struct e1000_hw *hw)
3034 */ 3022 */
3035 if (hw->tbi_compatibility_on) { 3023 if (hw->tbi_compatibility_on) {
3036 /* If we previously were in the mode, turn it off. */ 3024 /* If we previously were in the mode, turn it off. */
3037 rctl = E1000_READ_REG(hw, RCTL); 3025 rctl = er32(RCTL);
3038 rctl &= ~E1000_RCTL_SBP; 3026 rctl &= ~E1000_RCTL_SBP;
3039 E1000_WRITE_REG(hw, RCTL, rctl); 3027 ew32(RCTL, rctl);
3040 hw->tbi_compatibility_on = false; 3028 hw->tbi_compatibility_on = false;
3041 } 3029 }
3042 } else { 3030 } else {
@@ -3047,9 +3035,9 @@ e1000_check_for_link(struct e1000_hw *hw)
3047 */ 3035 */
3048 if (!hw->tbi_compatibility_on) { 3036 if (!hw->tbi_compatibility_on) {
3049 hw->tbi_compatibility_on = true; 3037 hw->tbi_compatibility_on = true;
3050 rctl = E1000_READ_REG(hw, RCTL); 3038 rctl = er32(RCTL);
3051 rctl |= E1000_RCTL_SBP; 3039 rctl |= E1000_RCTL_SBP;
3052 E1000_WRITE_REG(hw, RCTL, rctl); 3040 ew32(RCTL, rctl);
3053 } 3041 }
3054 } 3042 }
3055 } 3043 }
@@ -3073,12 +3061,12 @@ e1000_check_for_link(struct e1000_hw *hw)
3073 DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); 3061 DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
3074 3062
3075 /* Disable auto-negotiation in the TXCW register */ 3063 /* Disable auto-negotiation in the TXCW register */
3076 E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE)); 3064 ew32(TXCW, (hw->txcw & ~E1000_TXCW_ANE));
3077 3065
3078 /* Force link-up and also force full-duplex. */ 3066 /* Force link-up and also force full-duplex. */
3079 ctrl = E1000_READ_REG(hw, CTRL); 3067 ctrl = er32(CTRL);
3080 ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); 3068 ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
3081 E1000_WRITE_REG(hw, CTRL, ctrl); 3069 ew32(CTRL, ctrl);
3082 3070
3083 /* Configure Flow Control after forcing link up. */ 3071 /* Configure Flow Control after forcing link up. */
3084 ret_val = e1000_config_fc_after_link_up(hw); 3072 ret_val = e1000_config_fc_after_link_up(hw);
@@ -3096,8 +3084,8 @@ e1000_check_for_link(struct e1000_hw *hw)
3096 (hw->media_type == e1000_media_type_internal_serdes)) && 3084 (hw->media_type == e1000_media_type_internal_serdes)) &&
3097 (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { 3085 (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
3098 DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); 3086 DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
3099 E1000_WRITE_REG(hw, TXCW, hw->txcw); 3087 ew32(TXCW, hw->txcw);
3100 E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); 3088 ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
3101 3089
3102 hw->serdes_link_down = false; 3090 hw->serdes_link_down = false;
3103 } 3091 }
@@ -3105,10 +3093,10 @@ e1000_check_for_link(struct e1000_hw *hw)
3105 * based on MAC synchronization for internal serdes media type. 3093 * based on MAC synchronization for internal serdes media type.
3106 */ 3094 */
3107 else if ((hw->media_type == e1000_media_type_internal_serdes) && 3095 else if ((hw->media_type == e1000_media_type_internal_serdes) &&
3108 !(E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) { 3096 !(E1000_TXCW_ANE & er32(TXCW))) {
3109 /* SYNCH bit and IV bit are sticky. */ 3097 /* SYNCH bit and IV bit are sticky. */
3110 udelay(10); 3098 udelay(10);
3111 if (E1000_RXCW_SYNCH & E1000_READ_REG(hw, RXCW)) { 3099 if (E1000_RXCW_SYNCH & er32(RXCW)) {
3112 if (!(rxcw & E1000_RXCW_IV)) { 3100 if (!(rxcw & E1000_RXCW_IV)) {
3113 hw->serdes_link_down = false; 3101 hw->serdes_link_down = false;
3114 DEBUGOUT("SERDES: Link is up.\n"); 3102 DEBUGOUT("SERDES: Link is up.\n");
@@ -3119,8 +3107,8 @@ e1000_check_for_link(struct e1000_hw *hw)
3119 } 3107 }
3120 } 3108 }
3121 if ((hw->media_type == e1000_media_type_internal_serdes) && 3109 if ((hw->media_type == e1000_media_type_internal_serdes) &&
3122 (E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) { 3110 (E1000_TXCW_ANE & er32(TXCW))) {
3123 hw->serdes_link_down = !(E1000_STATUS_LU & E1000_READ_REG(hw, STATUS)); 3111 hw->serdes_link_down = !(E1000_STATUS_LU & er32(STATUS));
3124 } 3112 }
3125 return E1000_SUCCESS; 3113 return E1000_SUCCESS;
3126} 3114}
@@ -3132,10 +3120,7 @@ e1000_check_for_link(struct e1000_hw *hw)
3132 * speed - Speed of the connection 3120 * speed - Speed of the connection
3133 * duplex - Duplex setting of the connection 3121 * duplex - Duplex setting of the connection
3134 *****************************************************************************/ 3122 *****************************************************************************/
3135s32 3123s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex)
3136e1000_get_speed_and_duplex(struct e1000_hw *hw,
3137 u16 *speed,
3138 u16 *duplex)
3139{ 3124{
3140 u32 status; 3125 u32 status;
3141 s32 ret_val; 3126 s32 ret_val;
@@ -3144,7 +3129,7 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw,
3144 DEBUGFUNC("e1000_get_speed_and_duplex"); 3129 DEBUGFUNC("e1000_get_speed_and_duplex");
3145 3130
3146 if (hw->mac_type >= e1000_82543) { 3131 if (hw->mac_type >= e1000_82543) {
3147 status = E1000_READ_REG(hw, STATUS); 3132 status = er32(STATUS);
3148 if (status & E1000_STATUS_SPEED_1000) { 3133 if (status & E1000_STATUS_SPEED_1000) {
3149 *speed = SPEED_1000; 3134 *speed = SPEED_1000;
3150 DEBUGOUT("1000 Mbs, "); 3135 DEBUGOUT("1000 Mbs, ");
@@ -3214,8 +3199,7 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw,
3214* 3199*
3215* hw - Struct containing variables accessed by shared code 3200* hw - Struct containing variables accessed by shared code
3216******************************************************************************/ 3201******************************************************************************/
3217static s32 3202static s32 e1000_wait_autoneg(struct e1000_hw *hw)
3218e1000_wait_autoneg(struct e1000_hw *hw)
3219{ 3203{
3220 s32 ret_val; 3204 s32 ret_val;
3221 u16 i; 3205 u16 i;
@@ -3249,15 +3233,13 @@ e1000_wait_autoneg(struct e1000_hw *hw)
3249* hw - Struct containing variables accessed by shared code 3233* hw - Struct containing variables accessed by shared code
3250* ctrl - Device control register's current value 3234* ctrl - Device control register's current value
3251******************************************************************************/ 3235******************************************************************************/
3252static void 3236static void e1000_raise_mdi_clk(struct e1000_hw *hw, u32 *ctrl)
3253e1000_raise_mdi_clk(struct e1000_hw *hw,
3254 u32 *ctrl)
3255{ 3237{
3256 /* Raise the clock input to the Management Data Clock (by setting the MDC 3238 /* Raise the clock input to the Management Data Clock (by setting the MDC
3257 * bit), and then delay 10 microseconds. 3239 * bit), and then delay 10 microseconds.
3258 */ 3240 */
3259 E1000_WRITE_REG(hw, CTRL, (*ctrl | E1000_CTRL_MDC)); 3241 ew32(CTRL, (*ctrl | E1000_CTRL_MDC));
3260 E1000_WRITE_FLUSH(hw); 3242 E1000_WRITE_FLUSH();
3261 udelay(10); 3243 udelay(10);
3262} 3244}
3263 3245
@@ -3267,15 +3249,13 @@ e1000_raise_mdi_clk(struct e1000_hw *hw,
3267* hw - Struct containing variables accessed by shared code 3249* hw - Struct containing variables accessed by shared code
3268* ctrl - Device control register's current value 3250* ctrl - Device control register's current value
3269******************************************************************************/ 3251******************************************************************************/
3270static void 3252static void e1000_lower_mdi_clk(struct e1000_hw *hw, u32 *ctrl)
3271e1000_lower_mdi_clk(struct e1000_hw *hw,
3272 u32 *ctrl)
3273{ 3253{
3274 /* Lower the clock input to the Management Data Clock (by clearing the MDC 3254 /* Lower the clock input to the Management Data Clock (by clearing the MDC
3275 * bit), and then delay 10 microseconds. 3255 * bit), and then delay 10 microseconds.
3276 */ 3256 */
3277 E1000_WRITE_REG(hw, CTRL, (*ctrl & ~E1000_CTRL_MDC)); 3257 ew32(CTRL, (*ctrl & ~E1000_CTRL_MDC));
3278 E1000_WRITE_FLUSH(hw); 3258 E1000_WRITE_FLUSH();
3279 udelay(10); 3259 udelay(10);
3280} 3260}
3281 3261
@@ -3288,10 +3268,7 @@ e1000_lower_mdi_clk(struct e1000_hw *hw,
3288* 3268*
3289* Bits are shifted out in MSB to LSB order. 3269* Bits are shifted out in MSB to LSB order.
3290******************************************************************************/ 3270******************************************************************************/
3291static void 3271static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, u32 data, u16 count)
3292e1000_shift_out_mdi_bits(struct e1000_hw *hw,
3293 u32 data,
3294 u16 count)
3295{ 3272{
3296 u32 ctrl; 3273 u32 ctrl;
3297 u32 mask; 3274 u32 mask;
@@ -3303,7 +3280,7 @@ e1000_shift_out_mdi_bits(struct e1000_hw *hw,
3303 mask = 0x01; 3280 mask = 0x01;
3304 mask <<= (count - 1); 3281 mask <<= (count - 1);
3305 3282
3306 ctrl = E1000_READ_REG(hw, CTRL); 3283 ctrl = er32(CTRL);
3307 3284
3308 /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */ 3285 /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */
3309 ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR); 3286 ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR);
@@ -3319,8 +3296,8 @@ e1000_shift_out_mdi_bits(struct e1000_hw *hw,
3319 else 3296 else
3320 ctrl &= ~E1000_CTRL_MDIO; 3297 ctrl &= ~E1000_CTRL_MDIO;
3321 3298
3322 E1000_WRITE_REG(hw, CTRL, ctrl); 3299 ew32(CTRL, ctrl);
3323 E1000_WRITE_FLUSH(hw); 3300 E1000_WRITE_FLUSH();
3324 3301
3325 udelay(10); 3302 udelay(10);
3326 3303
@@ -3338,8 +3315,7 @@ e1000_shift_out_mdi_bits(struct e1000_hw *hw,
3338* 3315*
3339* Bits are shifted in in MSB to LSB order. 3316* Bits are shifted in in MSB to LSB order.
3340******************************************************************************/ 3317******************************************************************************/
3341static u16 3318static u16 e1000_shift_in_mdi_bits(struct e1000_hw *hw)
3342e1000_shift_in_mdi_bits(struct e1000_hw *hw)
3343{ 3319{
3344 u32 ctrl; 3320 u32 ctrl;
3345 u16 data = 0; 3321 u16 data = 0;
@@ -3352,14 +3328,14 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw)
3352 * by raising the input to the Management Data Clock (setting the MDC bit), 3328 * by raising the input to the Management Data Clock (setting the MDC bit),
3353 * and then reading the value of the MDIO bit. 3329 * and then reading the value of the MDIO bit.
3354 */ 3330 */
3355 ctrl = E1000_READ_REG(hw, CTRL); 3331 ctrl = er32(CTRL);
3356 3332
3357 /* Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as input. */ 3333 /* Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as input. */
3358 ctrl &= ~E1000_CTRL_MDIO_DIR; 3334 ctrl &= ~E1000_CTRL_MDIO_DIR;
3359 ctrl &= ~E1000_CTRL_MDIO; 3335 ctrl &= ~E1000_CTRL_MDIO;
3360 3336
3361 E1000_WRITE_REG(hw, CTRL, ctrl); 3337 ew32(CTRL, ctrl);
3362 E1000_WRITE_FLUSH(hw); 3338 E1000_WRITE_FLUSH();
3363 3339
3364 /* Raise and Lower the clock before reading in the data. This accounts for 3340 /* Raise and Lower the clock before reading in the data. This accounts for
3365 * the turnaround bits. The first clock occurred when we clocked out the 3341 * the turnaround bits. The first clock occurred when we clocked out the
@@ -3371,7 +3347,7 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw)
3371 for (data = 0, i = 0; i < 16; i++) { 3347 for (data = 0, i = 0; i < 16; i++) {
3372 data = data << 1; 3348 data = data << 1;
3373 e1000_raise_mdi_clk(hw, &ctrl); 3349 e1000_raise_mdi_clk(hw, &ctrl);
3374 ctrl = E1000_READ_REG(hw, CTRL); 3350 ctrl = er32(CTRL);
3375 /* Check to see if we shifted in a "1". */ 3351 /* Check to see if we shifted in a "1". */
3376 if (ctrl & E1000_CTRL_MDIO) 3352 if (ctrl & E1000_CTRL_MDIO)
3377 data |= 1; 3353 data |= 1;
@@ -3384,8 +3360,7 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw)
3384 return data; 3360 return data;
3385} 3361}
3386 3362
3387static s32 3363static s32 e1000_swfw_sync_acquire(struct e1000_hw *hw, u16 mask)
3388e1000_swfw_sync_acquire(struct e1000_hw *hw, u16 mask)
3389{ 3364{
3390 u32 swfw_sync = 0; 3365 u32 swfw_sync = 0;
3391 u32 swmask = mask; 3366 u32 swmask = mask;
@@ -3404,7 +3379,7 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, u16 mask)
3404 if (e1000_get_hw_eeprom_semaphore(hw)) 3379 if (e1000_get_hw_eeprom_semaphore(hw))
3405 return -E1000_ERR_SWFW_SYNC; 3380 return -E1000_ERR_SWFW_SYNC;
3406 3381
3407 swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); 3382 swfw_sync = er32(SW_FW_SYNC);
3408 if (!(swfw_sync & (fwmask | swmask))) { 3383 if (!(swfw_sync & (fwmask | swmask))) {
3409 break; 3384 break;
3410 } 3385 }
@@ -3422,14 +3397,13 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, u16 mask)
3422 } 3397 }
3423 3398
3424 swfw_sync |= swmask; 3399 swfw_sync |= swmask;
3425 E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync); 3400 ew32(SW_FW_SYNC, swfw_sync);
3426 3401
3427 e1000_put_hw_eeprom_semaphore(hw); 3402 e1000_put_hw_eeprom_semaphore(hw);
3428 return E1000_SUCCESS; 3403 return E1000_SUCCESS;
3429} 3404}
3430 3405
3431static void 3406static void e1000_swfw_sync_release(struct e1000_hw *hw, u16 mask)
3432e1000_swfw_sync_release(struct e1000_hw *hw, u16 mask)
3433{ 3407{
3434 u32 swfw_sync; 3408 u32 swfw_sync;
3435 u32 swmask = mask; 3409 u32 swmask = mask;
@@ -3451,9 +3425,9 @@ e1000_swfw_sync_release(struct e1000_hw *hw, u16 mask)
3451 while (e1000_get_hw_eeprom_semaphore(hw) != E1000_SUCCESS); 3425 while (e1000_get_hw_eeprom_semaphore(hw) != E1000_SUCCESS);
3452 /* empty */ 3426 /* empty */
3453 3427
3454 swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); 3428 swfw_sync = er32(SW_FW_SYNC);
3455 swfw_sync &= ~swmask; 3429 swfw_sync &= ~swmask;
3456 E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync); 3430 ew32(SW_FW_SYNC, swfw_sync);
3457 3431
3458 e1000_put_hw_eeprom_semaphore(hw); 3432 e1000_put_hw_eeprom_semaphore(hw);
3459} 3433}
@@ -3464,10 +3438,7 @@ e1000_swfw_sync_release(struct e1000_hw *hw, u16 mask)
3464* hw - Struct containing variables accessed by shared code 3438* hw - Struct containing variables accessed by shared code
3465* reg_addr - address of the PHY register to read 3439* reg_addr - address of the PHY register to read
3466******************************************************************************/ 3440******************************************************************************/
3467s32 3441s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 reg_addr, u16 *phy_data)
3468e1000_read_phy_reg(struct e1000_hw *hw,
3469 u32 reg_addr,
3470 u16 *phy_data)
3471{ 3442{
3472 u32 ret_val; 3443 u32 ret_val;
3473 u16 swfw; 3444 u16 swfw;
@@ -3475,7 +3446,7 @@ e1000_read_phy_reg(struct e1000_hw *hw,
3475 DEBUGFUNC("e1000_read_phy_reg"); 3446 DEBUGFUNC("e1000_read_phy_reg");
3476 3447
3477 if ((hw->mac_type == e1000_80003es2lan) && 3448 if ((hw->mac_type == e1000_80003es2lan) &&
3478 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 3449 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
3479 swfw = E1000_SWFW_PHY1_SM; 3450 swfw = E1000_SWFW_PHY1_SM;
3480 } else { 3451 } else {
3481 swfw = E1000_SWFW_PHY0_SM; 3452 swfw = E1000_SWFW_PHY0_SM;
@@ -3523,9 +3494,8 @@ e1000_read_phy_reg(struct e1000_hw *hw,
3523 return ret_val; 3494 return ret_val;
3524} 3495}
3525 3496
3526static s32 3497static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3527e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr, 3498 u16 *phy_data)
3528 u16 *phy_data)
3529{ 3499{
3530 u32 i; 3500 u32 i;
3531 u32 mdic = 0; 3501 u32 mdic = 0;
@@ -3547,12 +3517,12 @@ e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3547 (phy_addr << E1000_MDIC_PHY_SHIFT) | 3517 (phy_addr << E1000_MDIC_PHY_SHIFT) |
3548 (E1000_MDIC_OP_READ)); 3518 (E1000_MDIC_OP_READ));
3549 3519
3550 E1000_WRITE_REG(hw, MDIC, mdic); 3520 ew32(MDIC, mdic);
3551 3521
3552 /* Poll the ready bit to see if the MDI read completed */ 3522 /* Poll the ready bit to see if the MDI read completed */
3553 for (i = 0; i < 64; i++) { 3523 for (i = 0; i < 64; i++) {
3554 udelay(50); 3524 udelay(50);
3555 mdic = E1000_READ_REG(hw, MDIC); 3525 mdic = er32(MDIC);
3556 if (mdic & E1000_MDIC_READY) break; 3526 if (mdic & E1000_MDIC_READY) break;
3557 } 3527 }
3558 if (!(mdic & E1000_MDIC_READY)) { 3528 if (!(mdic & E1000_MDIC_READY)) {
@@ -3563,7 +3533,7 @@ e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3563 DEBUGOUT("MDI Error\n"); 3533 DEBUGOUT("MDI Error\n");
3564 return -E1000_ERR_PHY; 3534 return -E1000_ERR_PHY;
3565 } 3535 }
3566 *phy_data = (u16) mdic; 3536 *phy_data = (u16)mdic;
3567 } else { 3537 } else {
3568 /* We must first send a preamble through the MDIO pin to signal the 3538 /* We must first send a preamble through the MDIO pin to signal the
3569 * beginning of an MII instruction. This is done by sending 32 3539 * beginning of an MII instruction. This is done by sending 32
@@ -3603,9 +3573,7 @@ e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3603* reg_addr - address of the PHY register to write 3573* reg_addr - address of the PHY register to write
3604* data - data to write to the PHY 3574* data - data to write to the PHY
3605******************************************************************************/ 3575******************************************************************************/
3606s32 3576s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 reg_addr, u16 phy_data)
3607e1000_write_phy_reg(struct e1000_hw *hw, u32 reg_addr,
3608 u16 phy_data)
3609{ 3577{
3610 u32 ret_val; 3578 u32 ret_val;
3611 u16 swfw; 3579 u16 swfw;
@@ -3613,7 +3581,7 @@ e1000_write_phy_reg(struct e1000_hw *hw, u32 reg_addr,
3613 DEBUGFUNC("e1000_write_phy_reg"); 3581 DEBUGFUNC("e1000_write_phy_reg");
3614 3582
3615 if ((hw->mac_type == e1000_80003es2lan) && 3583 if ((hw->mac_type == e1000_80003es2lan) &&
3616 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 3584 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
3617 swfw = E1000_SWFW_PHY1_SM; 3585 swfw = E1000_SWFW_PHY1_SM;
3618 } else { 3586 } else {
3619 swfw = E1000_SWFW_PHY0_SM; 3587 swfw = E1000_SWFW_PHY0_SM;
@@ -3661,9 +3629,8 @@ e1000_write_phy_reg(struct e1000_hw *hw, u32 reg_addr,
3661 return ret_val; 3629 return ret_val;
3662} 3630}
3663 3631
3664static s32 3632static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3665e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr, 3633 u16 phy_data)
3666 u16 phy_data)
3667{ 3634{
3668 u32 i; 3635 u32 i;
3669 u32 mdic = 0; 3636 u32 mdic = 0;
@@ -3681,17 +3648,17 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3681 * for the PHY register in the MDI Control register. The MAC will take 3648 * for the PHY register in the MDI Control register. The MAC will take
3682 * care of interfacing with the PHY to send the desired data. 3649 * care of interfacing with the PHY to send the desired data.
3683 */ 3650 */
3684 mdic = (((u32) phy_data) | 3651 mdic = (((u32)phy_data) |
3685 (reg_addr << E1000_MDIC_REG_SHIFT) | 3652 (reg_addr << E1000_MDIC_REG_SHIFT) |
3686 (phy_addr << E1000_MDIC_PHY_SHIFT) | 3653 (phy_addr << E1000_MDIC_PHY_SHIFT) |
3687 (E1000_MDIC_OP_WRITE)); 3654 (E1000_MDIC_OP_WRITE));
3688 3655
3689 E1000_WRITE_REG(hw, MDIC, mdic); 3656 ew32(MDIC, mdic);
3690 3657
3691 /* Poll the ready bit to see if the MDI read completed */ 3658 /* Poll the ready bit to see if the MDI read completed */
3692 for (i = 0; i < 641; i++) { 3659 for (i = 0; i < 641; i++) {
3693 udelay(5); 3660 udelay(5);
3694 mdic = E1000_READ_REG(hw, MDIC); 3661 mdic = er32(MDIC);
3695 if (mdic & E1000_MDIC_READY) break; 3662 if (mdic & E1000_MDIC_READY) break;
3696 } 3663 }
3697 if (!(mdic & E1000_MDIC_READY)) { 3664 if (!(mdic & E1000_MDIC_READY)) {
@@ -3715,7 +3682,7 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3715 mdic = ((PHY_TURNAROUND) | (reg_addr << 2) | (phy_addr << 7) | 3682 mdic = ((PHY_TURNAROUND) | (reg_addr << 2) | (phy_addr << 7) |
3716 (PHY_OP_WRITE << 12) | (PHY_SOF << 14)); 3683 (PHY_OP_WRITE << 12) | (PHY_SOF << 14));
3717 mdic <<= 16; 3684 mdic <<= 16;
3718 mdic |= (u32) phy_data; 3685 mdic |= (u32)phy_data;
3719 3686
3720 e1000_shift_out_mdi_bits(hw, mdic, 32); 3687 e1000_shift_out_mdi_bits(hw, mdic, 32);
3721 } 3688 }
@@ -3723,17 +3690,14 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3723 return E1000_SUCCESS; 3690 return E1000_SUCCESS;
3724} 3691}
3725 3692
3726static s32 3693static s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 reg_addr, u16 *data)
3727e1000_read_kmrn_reg(struct e1000_hw *hw,
3728 u32 reg_addr,
3729 u16 *data)
3730{ 3694{
3731 u32 reg_val; 3695 u32 reg_val;
3732 u16 swfw; 3696 u16 swfw;
3733 DEBUGFUNC("e1000_read_kmrn_reg"); 3697 DEBUGFUNC("e1000_read_kmrn_reg");
3734 3698
3735 if ((hw->mac_type == e1000_80003es2lan) && 3699 if ((hw->mac_type == e1000_80003es2lan) &&
3736 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 3700 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
3737 swfw = E1000_SWFW_PHY1_SM; 3701 swfw = E1000_SWFW_PHY1_SM;
3738 } else { 3702 } else {
3739 swfw = E1000_SWFW_PHY0_SM; 3703 swfw = E1000_SWFW_PHY0_SM;
@@ -3745,28 +3709,25 @@ e1000_read_kmrn_reg(struct e1000_hw *hw,
3745 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) & 3709 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
3746 E1000_KUMCTRLSTA_OFFSET) | 3710 E1000_KUMCTRLSTA_OFFSET) |
3747 E1000_KUMCTRLSTA_REN; 3711 E1000_KUMCTRLSTA_REN;
3748 E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); 3712 ew32(KUMCTRLSTA, reg_val);
3749 udelay(2); 3713 udelay(2);
3750 3714
3751 /* Read the data returned */ 3715 /* Read the data returned */
3752 reg_val = E1000_READ_REG(hw, KUMCTRLSTA); 3716 reg_val = er32(KUMCTRLSTA);
3753 *data = (u16)reg_val; 3717 *data = (u16)reg_val;
3754 3718
3755 e1000_swfw_sync_release(hw, swfw); 3719 e1000_swfw_sync_release(hw, swfw);
3756 return E1000_SUCCESS; 3720 return E1000_SUCCESS;
3757} 3721}
3758 3722
3759static s32 3723static s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 reg_addr, u16 data)
3760e1000_write_kmrn_reg(struct e1000_hw *hw,
3761 u32 reg_addr,
3762 u16 data)
3763{ 3724{
3764 u32 reg_val; 3725 u32 reg_val;
3765 u16 swfw; 3726 u16 swfw;
3766 DEBUGFUNC("e1000_write_kmrn_reg"); 3727 DEBUGFUNC("e1000_write_kmrn_reg");
3767 3728
3768 if ((hw->mac_type == e1000_80003es2lan) && 3729 if ((hw->mac_type == e1000_80003es2lan) &&
3769 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 3730 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
3770 swfw = E1000_SWFW_PHY1_SM; 3731 swfw = E1000_SWFW_PHY1_SM;
3771 } else { 3732 } else {
3772 swfw = E1000_SWFW_PHY0_SM; 3733 swfw = E1000_SWFW_PHY0_SM;
@@ -3776,7 +3737,7 @@ e1000_write_kmrn_reg(struct e1000_hw *hw,
3776 3737
3777 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) & 3738 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
3778 E1000_KUMCTRLSTA_OFFSET) | data; 3739 E1000_KUMCTRLSTA_OFFSET) | data;
3779 E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); 3740 ew32(KUMCTRLSTA, reg_val);
3780 udelay(2); 3741 udelay(2);
3781 3742
3782 e1000_swfw_sync_release(hw, swfw); 3743 e1000_swfw_sync_release(hw, swfw);
@@ -3788,8 +3749,7 @@ e1000_write_kmrn_reg(struct e1000_hw *hw,
3788* 3749*
3789* hw - Struct containing variables accessed by shared code 3750* hw - Struct containing variables accessed by shared code
3790******************************************************************************/ 3751******************************************************************************/
3791s32 3752s32 e1000_phy_hw_reset(struct e1000_hw *hw)
3792e1000_phy_hw_reset(struct e1000_hw *hw)
3793{ 3753{
3794 u32 ctrl, ctrl_ext; 3754 u32 ctrl, ctrl_ext;
3795 u32 led_ctrl; 3755 u32 led_ctrl;
@@ -3808,7 +3768,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
3808 3768
3809 if (hw->mac_type > e1000_82543) { 3769 if (hw->mac_type > e1000_82543) {
3810 if ((hw->mac_type == e1000_80003es2lan) && 3770 if ((hw->mac_type == e1000_80003es2lan) &&
3811 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 3771 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
3812 swfw = E1000_SWFW_PHY1_SM; 3772 swfw = E1000_SWFW_PHY1_SM;
3813 } else { 3773 } else {
3814 swfw = E1000_SWFW_PHY0_SM; 3774 swfw = E1000_SWFW_PHY0_SM;
@@ -3823,17 +3783,17 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
3823 * and deassert. For e1000_82571 hardware and later, we instead delay 3783 * and deassert. For e1000_82571 hardware and later, we instead delay
3824 * for 50us between and 10ms after the deassertion. 3784 * for 50us between and 10ms after the deassertion.
3825 */ 3785 */
3826 ctrl = E1000_READ_REG(hw, CTRL); 3786 ctrl = er32(CTRL);
3827 E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST); 3787 ew32(CTRL, ctrl | E1000_CTRL_PHY_RST);
3828 E1000_WRITE_FLUSH(hw); 3788 E1000_WRITE_FLUSH();
3829 3789
3830 if (hw->mac_type < e1000_82571) 3790 if (hw->mac_type < e1000_82571)
3831 msleep(10); 3791 msleep(10);
3832 else 3792 else
3833 udelay(100); 3793 udelay(100);
3834 3794
3835 E1000_WRITE_REG(hw, CTRL, ctrl); 3795 ew32(CTRL, ctrl);
3836 E1000_WRITE_FLUSH(hw); 3796 E1000_WRITE_FLUSH();
3837 3797
3838 if (hw->mac_type >= e1000_82571) 3798 if (hw->mac_type >= e1000_82571)
3839 mdelay(10); 3799 mdelay(10);
@@ -3843,24 +3803,24 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
3843 /* Read the Extended Device Control Register, assert the PHY_RESET_DIR 3803 /* Read the Extended Device Control Register, assert the PHY_RESET_DIR
3844 * bit to put the PHY into reset. Then, take it out of reset. 3804 * bit to put the PHY into reset. Then, take it out of reset.
3845 */ 3805 */
3846 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 3806 ctrl_ext = er32(CTRL_EXT);
3847 ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR; 3807 ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR;
3848 ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA; 3808 ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA;
3849 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 3809 ew32(CTRL_EXT, ctrl_ext);
3850 E1000_WRITE_FLUSH(hw); 3810 E1000_WRITE_FLUSH();
3851 msleep(10); 3811 msleep(10);
3852 ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA; 3812 ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA;
3853 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 3813 ew32(CTRL_EXT, ctrl_ext);
3854 E1000_WRITE_FLUSH(hw); 3814 E1000_WRITE_FLUSH();
3855 } 3815 }
3856 udelay(150); 3816 udelay(150);
3857 3817
3858 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 3818 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
3859 /* Configure activity LED after PHY reset */ 3819 /* Configure activity LED after PHY reset */
3860 led_ctrl = E1000_READ_REG(hw, LEDCTL); 3820 led_ctrl = er32(LEDCTL);
3861 led_ctrl &= IGP_ACTIVITY_LED_MASK; 3821 led_ctrl &= IGP_ACTIVITY_LED_MASK;
3862 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 3822 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
3863 E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 3823 ew32(LEDCTL, led_ctrl);
3864 } 3824 }
3865 3825
3866 /* Wait for FW to finish PHY configuration. */ 3826 /* Wait for FW to finish PHY configuration. */
@@ -3882,8 +3842,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
3882* 3842*
3883* Sets bit 15 of the MII Control register 3843* Sets bit 15 of the MII Control register
3884******************************************************************************/ 3844******************************************************************************/
3885s32 3845s32 e1000_phy_reset(struct e1000_hw *hw)
3886e1000_phy_reset(struct e1000_hw *hw)
3887{ 3846{
3888 s32 ret_val; 3847 s32 ret_val;
3889 u16 phy_data; 3848 u16 phy_data;
@@ -3934,8 +3893,7 @@ e1000_phy_reset(struct e1000_hw *hw)
3934* 3893*
3935* hw - struct containing variables accessed by shared code 3894* hw - struct containing variables accessed by shared code
3936******************************************************************************/ 3895******************************************************************************/
3937void 3896void e1000_phy_powerdown_workaround(struct e1000_hw *hw)
3938e1000_phy_powerdown_workaround(struct e1000_hw *hw)
3939{ 3897{
3940 s32 reg; 3898 s32 reg;
3941 u16 phy_data; 3899 u16 phy_data;
@@ -3948,8 +3906,8 @@ e1000_phy_powerdown_workaround(struct e1000_hw *hw)
3948 3906
3949 do { 3907 do {
3950 /* Disable link */ 3908 /* Disable link */
3951 reg = E1000_READ_REG(hw, PHY_CTRL); 3909 reg = er32(PHY_CTRL);
3952 E1000_WRITE_REG(hw, PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE | 3910 ew32(PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE |
3953 E1000_PHY_CTRL_NOND0A_GBE_DISABLE); 3911 E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
3954 3912
3955 /* Write VR power-down enable - bits 9:8 should be 10b */ 3913 /* Write VR power-down enable - bits 9:8 should be 10b */
@@ -3964,8 +3922,8 @@ e1000_phy_powerdown_workaround(struct e1000_hw *hw)
3964 break; 3922 break;
3965 3923
3966 /* Issue PHY reset and repeat at most one more time */ 3924 /* Issue PHY reset and repeat at most one more time */
3967 reg = E1000_READ_REG(hw, CTRL); 3925 reg = er32(CTRL);
3968 E1000_WRITE_REG(hw, CTRL, reg | E1000_CTRL_PHY_RST); 3926 ew32(CTRL, reg | E1000_CTRL_PHY_RST);
3969 retry++; 3927 retry++;
3970 } while (retry); 3928 } while (retry);
3971 3929
@@ -3987,8 +3945,7 @@ e1000_phy_powerdown_workaround(struct e1000_hw *hw)
3987* 3945*
3988* hw - struct containing variables accessed by shared code 3946* hw - struct containing variables accessed by shared code
3989******************************************************************************/ 3947******************************************************************************/
3990static s32 3948static s32 e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
3991e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
3992{ 3949{
3993 s32 ret_val; 3950 s32 ret_val;
3994 s32 reg; 3951 s32 reg;
@@ -4024,8 +3981,8 @@ e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
4024 mdelay(5); 3981 mdelay(5);
4025 } 3982 }
4026 /* Disable GigE link negotiation */ 3983 /* Disable GigE link negotiation */
4027 reg = E1000_READ_REG(hw, PHY_CTRL); 3984 reg = er32(PHY_CTRL);
4028 E1000_WRITE_REG(hw, PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE | 3985 ew32(PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE |
4029 E1000_PHY_CTRL_NOND0A_GBE_DISABLE); 3986 E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
4030 3987
4031 /* unable to acquire PCS lock */ 3988 /* unable to acquire PCS lock */
@@ -4040,8 +3997,7 @@ e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
4040* 3997*
4041* hw - Struct containing variables accessed by shared code 3998* hw - Struct containing variables accessed by shared code
4042******************************************************************************/ 3999******************************************************************************/
4043static s32 4000static s32 e1000_detect_gig_phy(struct e1000_hw *hw)
4044e1000_detect_gig_phy(struct e1000_hw *hw)
4045{ 4001{
4046 s32 phy_init_status, ret_val; 4002 s32 phy_init_status, ret_val;
4047 u16 phy_id_high, phy_id_low; 4003 u16 phy_id_high, phy_id_low;
@@ -4076,14 +4032,14 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
4076 if (ret_val) 4032 if (ret_val)
4077 return ret_val; 4033 return ret_val;
4078 4034
4079 hw->phy_id = (u32) (phy_id_high << 16); 4035 hw->phy_id = (u32)(phy_id_high << 16);
4080 udelay(20); 4036 udelay(20);
4081 ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low); 4037 ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low);
4082 if (ret_val) 4038 if (ret_val)
4083 return ret_val; 4039 return ret_val;
4084 4040
4085 hw->phy_id |= (u32) (phy_id_low & PHY_REVISION_MASK); 4041 hw->phy_id |= (u32)(phy_id_low & PHY_REVISION_MASK);
4086 hw->phy_revision = (u32) phy_id_low & ~PHY_REVISION_MASK; 4042 hw->phy_revision = (u32)phy_id_low & ~PHY_REVISION_MASK;
4087 4043
4088 switch (hw->mac_type) { 4044 switch (hw->mac_type) {
4089 case e1000_82543: 4045 case e1000_82543:
@@ -4136,8 +4092,7 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
4136* 4092*
4137* hw - Struct containing variables accessed by shared code 4093* hw - Struct containing variables accessed by shared code
4138******************************************************************************/ 4094******************************************************************************/
4139static s32 4095static s32 e1000_phy_reset_dsp(struct e1000_hw *hw)
4140e1000_phy_reset_dsp(struct e1000_hw *hw)
4141{ 4096{
4142 s32 ret_val; 4097 s32 ret_val;
4143 DEBUGFUNC("e1000_phy_reset_dsp"); 4098 DEBUGFUNC("e1000_phy_reset_dsp");
@@ -4163,9 +4118,8 @@ e1000_phy_reset_dsp(struct e1000_hw *hw)
4163* hw - Struct containing variables accessed by shared code 4118* hw - Struct containing variables accessed by shared code
4164* phy_info - PHY information structure 4119* phy_info - PHY information structure
4165******************************************************************************/ 4120******************************************************************************/
4166static s32 4121static s32 e1000_phy_igp_get_info(struct e1000_hw *hw,
4167e1000_phy_igp_get_info(struct e1000_hw *hw, 4122 struct e1000_phy_info *phy_info)
4168 struct e1000_phy_info *phy_info)
4169{ 4123{
4170 s32 ret_val; 4124 s32 ret_val;
4171 u16 phy_data, min_length, max_length, average; 4125 u16 phy_data, min_length, max_length, average;
@@ -4240,9 +4194,8 @@ e1000_phy_igp_get_info(struct e1000_hw *hw,
4240* hw - Struct containing variables accessed by shared code 4194* hw - Struct containing variables accessed by shared code
4241* phy_info - PHY information structure 4195* phy_info - PHY information structure
4242******************************************************************************/ 4196******************************************************************************/
4243static s32 4197static s32 e1000_phy_ife_get_info(struct e1000_hw *hw,
4244e1000_phy_ife_get_info(struct e1000_hw *hw, 4198 struct e1000_phy_info *phy_info)
4245 struct e1000_phy_info *phy_info)
4246{ 4199{
4247 s32 ret_val; 4200 s32 ret_val;
4248 u16 phy_data; 4201 u16 phy_data;
@@ -4290,9 +4243,8 @@ e1000_phy_ife_get_info(struct e1000_hw *hw,
4290* hw - Struct containing variables accessed by shared code 4243* hw - Struct containing variables accessed by shared code
4291* phy_info - PHY information structure 4244* phy_info - PHY information structure
4292******************************************************************************/ 4245******************************************************************************/
4293static s32 4246static s32 e1000_phy_m88_get_info(struct e1000_hw *hw,
4294e1000_phy_m88_get_info(struct e1000_hw *hw, 4247 struct e1000_phy_info *phy_info)
4295 struct e1000_phy_info *phy_info)
4296{ 4248{
4297 s32 ret_val; 4249 s32 ret_val;
4298 u16 phy_data; 4250 u16 phy_data;
@@ -4369,9 +4321,7 @@ e1000_phy_m88_get_info(struct e1000_hw *hw,
4369* hw - Struct containing variables accessed by shared code 4321* hw - Struct containing variables accessed by shared code
4370* phy_info - PHY information structure 4322* phy_info - PHY information structure
4371******************************************************************************/ 4323******************************************************************************/
4372s32 4324s32 e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info)
4373e1000_phy_get_info(struct e1000_hw *hw,
4374 struct e1000_phy_info *phy_info)
4375{ 4325{
4376 s32 ret_val; 4326 s32 ret_val;
4377 u16 phy_data; 4327 u16 phy_data;
@@ -4415,8 +4365,7 @@ e1000_phy_get_info(struct e1000_hw *hw,
4415 return e1000_phy_m88_get_info(hw, phy_info); 4365 return e1000_phy_m88_get_info(hw, phy_info);
4416} 4366}
4417 4367
4418s32 4368s32 e1000_validate_mdi_setting(struct e1000_hw *hw)
4419e1000_validate_mdi_setting(struct e1000_hw *hw)
4420{ 4369{
4421 DEBUGFUNC("e1000_validate_mdi_settings"); 4370 DEBUGFUNC("e1000_validate_mdi_settings");
4422 4371
@@ -4436,11 +4385,10 @@ e1000_validate_mdi_setting(struct e1000_hw *hw)
4436 * 4385 *
4437 * hw - Struct containing variables accessed by shared code 4386 * hw - Struct containing variables accessed by shared code
4438 *****************************************************************************/ 4387 *****************************************************************************/
4439s32 4388s32 e1000_init_eeprom_params(struct e1000_hw *hw)
4440e1000_init_eeprom_params(struct e1000_hw *hw)
4441{ 4389{
4442 struct e1000_eeprom_info *eeprom = &hw->eeprom; 4390 struct e1000_eeprom_info *eeprom = &hw->eeprom;
4443 u32 eecd = E1000_READ_REG(hw, EECD); 4391 u32 eecd = er32(EECD);
4444 s32 ret_val = E1000_SUCCESS; 4392 s32 ret_val = E1000_SUCCESS;
4445 u16 eeprom_size; 4393 u16 eeprom_size;
4446 4394
@@ -4542,7 +4490,7 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
4542 /* Ensure that the Autonomous FLASH update bit is cleared due to 4490 /* Ensure that the Autonomous FLASH update bit is cleared due to
4543 * Flash update issue on parts which use a FLASH for NVM. */ 4491 * Flash update issue on parts which use a FLASH for NVM. */
4544 eecd &= ~E1000_EECD_AUPDEN; 4492 eecd &= ~E1000_EECD_AUPDEN;
4545 E1000_WRITE_REG(hw, EECD, eecd); 4493 ew32(EECD, eecd);
4546 } 4494 }
4547 break; 4495 break;
4548 case e1000_80003es2lan: 4496 case e1000_80003es2lan:
@@ -4626,16 +4574,14 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
4626 * hw - Struct containing variables accessed by shared code 4574 * hw - Struct containing variables accessed by shared code
4627 * eecd - EECD's current value 4575 * eecd - EECD's current value
4628 *****************************************************************************/ 4576 *****************************************************************************/
4629static void 4577static void e1000_raise_ee_clk(struct e1000_hw *hw, u32 *eecd)
4630e1000_raise_ee_clk(struct e1000_hw *hw,
4631 u32 *eecd)
4632{ 4578{
4633 /* Raise the clock input to the EEPROM (by setting the SK bit), and then 4579 /* Raise the clock input to the EEPROM (by setting the SK bit), and then
4634 * wait <delay> microseconds. 4580 * wait <delay> microseconds.
4635 */ 4581 */
4636 *eecd = *eecd | E1000_EECD_SK; 4582 *eecd = *eecd | E1000_EECD_SK;
4637 E1000_WRITE_REG(hw, EECD, *eecd); 4583 ew32(EECD, *eecd);
4638 E1000_WRITE_FLUSH(hw); 4584 E1000_WRITE_FLUSH();
4639 udelay(hw->eeprom.delay_usec); 4585 udelay(hw->eeprom.delay_usec);
4640} 4586}
4641 4587
@@ -4645,16 +4591,14 @@ e1000_raise_ee_clk(struct e1000_hw *hw,
4645 * hw - Struct containing variables accessed by shared code 4591 * hw - Struct containing variables accessed by shared code
4646 * eecd - EECD's current value 4592 * eecd - EECD's current value
4647 *****************************************************************************/ 4593 *****************************************************************************/
4648static void 4594static void e1000_lower_ee_clk(struct e1000_hw *hw, u32 *eecd)
4649e1000_lower_ee_clk(struct e1000_hw *hw,
4650 u32 *eecd)
4651{ 4595{
4652 /* Lower the clock input to the EEPROM (by clearing the SK bit), and then 4596 /* Lower the clock input to the EEPROM (by clearing the SK bit), and then
4653 * wait 50 microseconds. 4597 * wait 50 microseconds.
4654 */ 4598 */
4655 *eecd = *eecd & ~E1000_EECD_SK; 4599 *eecd = *eecd & ~E1000_EECD_SK;
4656 E1000_WRITE_REG(hw, EECD, *eecd); 4600 ew32(EECD, *eecd);
4657 E1000_WRITE_FLUSH(hw); 4601 E1000_WRITE_FLUSH();
4658 udelay(hw->eeprom.delay_usec); 4602 udelay(hw->eeprom.delay_usec);
4659} 4603}
4660 4604
@@ -4665,10 +4609,7 @@ e1000_lower_ee_clk(struct e1000_hw *hw,
4665 * data - data to send to the EEPROM 4609 * data - data to send to the EEPROM
4666 * count - number of bits to shift out 4610 * count - number of bits to shift out
4667 *****************************************************************************/ 4611 *****************************************************************************/
4668static void 4612static void e1000_shift_out_ee_bits(struct e1000_hw *hw, u16 data, u16 count)
4669e1000_shift_out_ee_bits(struct e1000_hw *hw,
4670 u16 data,
4671 u16 count)
4672{ 4613{
4673 struct e1000_eeprom_info *eeprom = &hw->eeprom; 4614 struct e1000_eeprom_info *eeprom = &hw->eeprom;
4674 u32 eecd; 4615 u32 eecd;
@@ -4679,7 +4620,7 @@ e1000_shift_out_ee_bits(struct e1000_hw *hw,
4679 * In order to do this, "data" must be broken down into bits. 4620 * In order to do this, "data" must be broken down into bits.
4680 */ 4621 */
4681 mask = 0x01 << (count - 1); 4622 mask = 0x01 << (count - 1);
4682 eecd = E1000_READ_REG(hw, EECD); 4623 eecd = er32(EECD);
4683 if (eeprom->type == e1000_eeprom_microwire) { 4624 if (eeprom->type == e1000_eeprom_microwire) {
4684 eecd &= ~E1000_EECD_DO; 4625 eecd &= ~E1000_EECD_DO;
4685 } else if (eeprom->type == e1000_eeprom_spi) { 4626 } else if (eeprom->type == e1000_eeprom_spi) {
@@ -4696,8 +4637,8 @@ e1000_shift_out_ee_bits(struct e1000_hw *hw,
4696 if (data & mask) 4637 if (data & mask)
4697 eecd |= E1000_EECD_DI; 4638 eecd |= E1000_EECD_DI;
4698 4639
4699 E1000_WRITE_REG(hw, EECD, eecd); 4640 ew32(EECD, eecd);
4700 E1000_WRITE_FLUSH(hw); 4641 E1000_WRITE_FLUSH();
4701 4642
4702 udelay(eeprom->delay_usec); 4643 udelay(eeprom->delay_usec);
4703 4644
@@ -4710,7 +4651,7 @@ e1000_shift_out_ee_bits(struct e1000_hw *hw,
4710 4651
4711 /* We leave the "DI" bit set to "0" when we leave this routine. */ 4652 /* We leave the "DI" bit set to "0" when we leave this routine. */
4712 eecd &= ~E1000_EECD_DI; 4653 eecd &= ~E1000_EECD_DI;
4713 E1000_WRITE_REG(hw, EECD, eecd); 4654 ew32(EECD, eecd);
4714} 4655}
4715 4656
4716/****************************************************************************** 4657/******************************************************************************
@@ -4718,9 +4659,7 @@ e1000_shift_out_ee_bits(struct e1000_hw *hw,
4718 * 4659 *
4719 * hw - Struct containing variables accessed by shared code 4660 * hw - Struct containing variables accessed by shared code
4720 *****************************************************************************/ 4661 *****************************************************************************/
4721static u16 4662static u16 e1000_shift_in_ee_bits(struct e1000_hw *hw, u16 count)
4722e1000_shift_in_ee_bits(struct e1000_hw *hw,
4723 u16 count)
4724{ 4663{
4725 u32 eecd; 4664 u32 eecd;
4726 u32 i; 4665 u32 i;
@@ -4733,7 +4672,7 @@ e1000_shift_in_ee_bits(struct e1000_hw *hw,
4733 * always be clear. 4672 * always be clear.
4734 */ 4673 */
4735 4674
4736 eecd = E1000_READ_REG(hw, EECD); 4675 eecd = er32(EECD);
4737 4676
4738 eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); 4677 eecd &= ~(E1000_EECD_DO | E1000_EECD_DI);
4739 data = 0; 4678 data = 0;
@@ -4742,7 +4681,7 @@ e1000_shift_in_ee_bits(struct e1000_hw *hw,
4742 data = data << 1; 4681 data = data << 1;
4743 e1000_raise_ee_clk(hw, &eecd); 4682 e1000_raise_ee_clk(hw, &eecd);
4744 4683
4745 eecd = E1000_READ_REG(hw, EECD); 4684 eecd = er32(EECD);
4746 4685
4747 eecd &= ~(E1000_EECD_DI); 4686 eecd &= ~(E1000_EECD_DI);
4748 if (eecd & E1000_EECD_DO) 4687 if (eecd & E1000_EECD_DO)
@@ -4762,8 +4701,7 @@ e1000_shift_in_ee_bits(struct e1000_hw *hw,
4762 * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This 4701 * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This
4763 * function should be called before issuing a command to the EEPROM. 4702 * function should be called before issuing a command to the EEPROM.
4764 *****************************************************************************/ 4703 *****************************************************************************/
4765static s32 4704static s32 e1000_acquire_eeprom(struct e1000_hw *hw)
4766e1000_acquire_eeprom(struct e1000_hw *hw)
4767{ 4705{
4768 struct e1000_eeprom_info *eeprom = &hw->eeprom; 4706 struct e1000_eeprom_info *eeprom = &hw->eeprom;
4769 u32 eecd, i=0; 4707 u32 eecd, i=0;
@@ -4772,23 +4710,23 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
4772 4710
4773 if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM)) 4711 if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
4774 return -E1000_ERR_SWFW_SYNC; 4712 return -E1000_ERR_SWFW_SYNC;
4775 eecd = E1000_READ_REG(hw, EECD); 4713 eecd = er32(EECD);
4776 4714
4777 if (hw->mac_type != e1000_82573) { 4715 if (hw->mac_type != e1000_82573) {
4778 /* Request EEPROM Access */ 4716 /* Request EEPROM Access */
4779 if (hw->mac_type > e1000_82544) { 4717 if (hw->mac_type > e1000_82544) {
4780 eecd |= E1000_EECD_REQ; 4718 eecd |= E1000_EECD_REQ;
4781 E1000_WRITE_REG(hw, EECD, eecd); 4719 ew32(EECD, eecd);
4782 eecd = E1000_READ_REG(hw, EECD); 4720 eecd = er32(EECD);
4783 while ((!(eecd & E1000_EECD_GNT)) && 4721 while ((!(eecd & E1000_EECD_GNT)) &&
4784 (i < E1000_EEPROM_GRANT_ATTEMPTS)) { 4722 (i < E1000_EEPROM_GRANT_ATTEMPTS)) {
4785 i++; 4723 i++;
4786 udelay(5); 4724 udelay(5);
4787 eecd = E1000_READ_REG(hw, EECD); 4725 eecd = er32(EECD);
4788 } 4726 }
4789 if (!(eecd & E1000_EECD_GNT)) { 4727 if (!(eecd & E1000_EECD_GNT)) {
4790 eecd &= ~E1000_EECD_REQ; 4728 eecd &= ~E1000_EECD_REQ;
4791 E1000_WRITE_REG(hw, EECD, eecd); 4729 ew32(EECD, eecd);
4792 DEBUGOUT("Could not acquire EEPROM grant\n"); 4730 DEBUGOUT("Could not acquire EEPROM grant\n");
4793 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM); 4731 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
4794 return -E1000_ERR_EEPROM; 4732 return -E1000_ERR_EEPROM;
@@ -4801,15 +4739,15 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
4801 if (eeprom->type == e1000_eeprom_microwire) { 4739 if (eeprom->type == e1000_eeprom_microwire) {
4802 /* Clear SK and DI */ 4740 /* Clear SK and DI */
4803 eecd &= ~(E1000_EECD_DI | E1000_EECD_SK); 4741 eecd &= ~(E1000_EECD_DI | E1000_EECD_SK);
4804 E1000_WRITE_REG(hw, EECD, eecd); 4742 ew32(EECD, eecd);
4805 4743
4806 /* Set CS */ 4744 /* Set CS */
4807 eecd |= E1000_EECD_CS; 4745 eecd |= E1000_EECD_CS;
4808 E1000_WRITE_REG(hw, EECD, eecd); 4746 ew32(EECD, eecd);
4809 } else if (eeprom->type == e1000_eeprom_spi) { 4747 } else if (eeprom->type == e1000_eeprom_spi) {
4810 /* Clear SK and CS */ 4748 /* Clear SK and CS */
4811 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 4749 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
4812 E1000_WRITE_REG(hw, EECD, eecd); 4750 ew32(EECD, eecd);
4813 udelay(1); 4751 udelay(1);
4814 } 4752 }
4815 4753
@@ -4821,46 +4759,45 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
4821 * 4759 *
4822 * hw - Struct containing variables accessed by shared code 4760 * hw - Struct containing variables accessed by shared code
4823 *****************************************************************************/ 4761 *****************************************************************************/
4824static void 4762static void e1000_standby_eeprom(struct e1000_hw *hw)
4825e1000_standby_eeprom(struct e1000_hw *hw)
4826{ 4763{
4827 struct e1000_eeprom_info *eeprom = &hw->eeprom; 4764 struct e1000_eeprom_info *eeprom = &hw->eeprom;
4828 u32 eecd; 4765 u32 eecd;
4829 4766
4830 eecd = E1000_READ_REG(hw, EECD); 4767 eecd = er32(EECD);
4831 4768
4832 if (eeprom->type == e1000_eeprom_microwire) { 4769 if (eeprom->type == e1000_eeprom_microwire) {
4833 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 4770 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
4834 E1000_WRITE_REG(hw, EECD, eecd); 4771 ew32(EECD, eecd);
4835 E1000_WRITE_FLUSH(hw); 4772 E1000_WRITE_FLUSH();
4836 udelay(eeprom->delay_usec); 4773 udelay(eeprom->delay_usec);
4837 4774
4838 /* Clock high */ 4775 /* Clock high */
4839 eecd |= E1000_EECD_SK; 4776 eecd |= E1000_EECD_SK;
4840 E1000_WRITE_REG(hw, EECD, eecd); 4777 ew32(EECD, eecd);
4841 E1000_WRITE_FLUSH(hw); 4778 E1000_WRITE_FLUSH();
4842 udelay(eeprom->delay_usec); 4779 udelay(eeprom->delay_usec);
4843 4780
4844 /* Select EEPROM */ 4781 /* Select EEPROM */
4845 eecd |= E1000_EECD_CS; 4782 eecd |= E1000_EECD_CS;
4846 E1000_WRITE_REG(hw, EECD, eecd); 4783 ew32(EECD, eecd);
4847 E1000_WRITE_FLUSH(hw); 4784 E1000_WRITE_FLUSH();
4848 udelay(eeprom->delay_usec); 4785 udelay(eeprom->delay_usec);
4849 4786
4850 /* Clock low */ 4787 /* Clock low */
4851 eecd &= ~E1000_EECD_SK; 4788 eecd &= ~E1000_EECD_SK;
4852 E1000_WRITE_REG(hw, EECD, eecd); 4789 ew32(EECD, eecd);
4853 E1000_WRITE_FLUSH(hw); 4790 E1000_WRITE_FLUSH();
4854 udelay(eeprom->delay_usec); 4791 udelay(eeprom->delay_usec);
4855 } else if (eeprom->type == e1000_eeprom_spi) { 4792 } else if (eeprom->type == e1000_eeprom_spi) {
4856 /* Toggle CS to flush commands */ 4793 /* Toggle CS to flush commands */
4857 eecd |= E1000_EECD_CS; 4794 eecd |= E1000_EECD_CS;
4858 E1000_WRITE_REG(hw, EECD, eecd); 4795 ew32(EECD, eecd);
4859 E1000_WRITE_FLUSH(hw); 4796 E1000_WRITE_FLUSH();
4860 udelay(eeprom->delay_usec); 4797 udelay(eeprom->delay_usec);
4861 eecd &= ~E1000_EECD_CS; 4798 eecd &= ~E1000_EECD_CS;
4862 E1000_WRITE_REG(hw, EECD, eecd); 4799 ew32(EECD, eecd);
4863 E1000_WRITE_FLUSH(hw); 4800 E1000_WRITE_FLUSH();
4864 udelay(eeprom->delay_usec); 4801 udelay(eeprom->delay_usec);
4865 } 4802 }
4866} 4803}
@@ -4870,20 +4807,19 @@ e1000_standby_eeprom(struct e1000_hw *hw)
4870 * 4807 *
4871 * hw - Struct containing variables accessed by shared code 4808 * hw - Struct containing variables accessed by shared code
4872 *****************************************************************************/ 4809 *****************************************************************************/
4873static void 4810static void e1000_release_eeprom(struct e1000_hw *hw)
4874e1000_release_eeprom(struct e1000_hw *hw)
4875{ 4811{
4876 u32 eecd; 4812 u32 eecd;
4877 4813
4878 DEBUGFUNC("e1000_release_eeprom"); 4814 DEBUGFUNC("e1000_release_eeprom");
4879 4815
4880 eecd = E1000_READ_REG(hw, EECD); 4816 eecd = er32(EECD);
4881 4817
4882 if (hw->eeprom.type == e1000_eeprom_spi) { 4818 if (hw->eeprom.type == e1000_eeprom_spi) {
4883 eecd |= E1000_EECD_CS; /* Pull CS high */ 4819 eecd |= E1000_EECD_CS; /* Pull CS high */
4884 eecd &= ~E1000_EECD_SK; /* Lower SCK */ 4820 eecd &= ~E1000_EECD_SK; /* Lower SCK */
4885 4821
4886 E1000_WRITE_REG(hw, EECD, eecd); 4822 ew32(EECD, eecd);
4887 4823
4888 udelay(hw->eeprom.delay_usec); 4824 udelay(hw->eeprom.delay_usec);
4889 } else if (hw->eeprom.type == e1000_eeprom_microwire) { 4825 } else if (hw->eeprom.type == e1000_eeprom_microwire) {
@@ -4892,25 +4828,25 @@ e1000_release_eeprom(struct e1000_hw *hw)
4892 /* CS on Microwire is active-high */ 4828 /* CS on Microwire is active-high */
4893 eecd &= ~(E1000_EECD_CS | E1000_EECD_DI); 4829 eecd &= ~(E1000_EECD_CS | E1000_EECD_DI);
4894 4830
4895 E1000_WRITE_REG(hw, EECD, eecd); 4831 ew32(EECD, eecd);
4896 4832
4897 /* Rising edge of clock */ 4833 /* Rising edge of clock */
4898 eecd |= E1000_EECD_SK; 4834 eecd |= E1000_EECD_SK;
4899 E1000_WRITE_REG(hw, EECD, eecd); 4835 ew32(EECD, eecd);
4900 E1000_WRITE_FLUSH(hw); 4836 E1000_WRITE_FLUSH();
4901 udelay(hw->eeprom.delay_usec); 4837 udelay(hw->eeprom.delay_usec);
4902 4838
4903 /* Falling edge of clock */ 4839 /* Falling edge of clock */
4904 eecd &= ~E1000_EECD_SK; 4840 eecd &= ~E1000_EECD_SK;
4905 E1000_WRITE_REG(hw, EECD, eecd); 4841 ew32(EECD, eecd);
4906 E1000_WRITE_FLUSH(hw); 4842 E1000_WRITE_FLUSH();
4907 udelay(hw->eeprom.delay_usec); 4843 udelay(hw->eeprom.delay_usec);
4908 } 4844 }
4909 4845
4910 /* Stop requesting EEPROM access */ 4846 /* Stop requesting EEPROM access */
4911 if (hw->mac_type > e1000_82544) { 4847 if (hw->mac_type > e1000_82544) {
4912 eecd &= ~E1000_EECD_REQ; 4848 eecd &= ~E1000_EECD_REQ;
4913 E1000_WRITE_REG(hw, EECD, eecd); 4849 ew32(EECD, eecd);
4914 } 4850 }
4915 4851
4916 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM); 4852 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
@@ -4921,8 +4857,7 @@ e1000_release_eeprom(struct e1000_hw *hw)
4921 * 4857 *
4922 * hw - Struct containing variables accessed by shared code 4858 * hw - Struct containing variables accessed by shared code
4923 *****************************************************************************/ 4859 *****************************************************************************/
4924static s32 4860static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw)
4925e1000_spi_eeprom_ready(struct e1000_hw *hw)
4926{ 4861{
4927 u16 retry_count = 0; 4862 u16 retry_count = 0;
4928 u8 spi_stat_reg; 4863 u8 spi_stat_reg;
@@ -4967,11 +4902,7 @@ e1000_spi_eeprom_ready(struct e1000_hw *hw)
4967 * data - word read from the EEPROM 4902 * data - word read from the EEPROM
4968 * words - number of words to read 4903 * words - number of words to read
4969 *****************************************************************************/ 4904 *****************************************************************************/
4970s32 4905s32 e1000_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
4971e1000_read_eeprom(struct e1000_hw *hw,
4972 u16 offset,
4973 u16 words,
4974 u16 *data)
4975{ 4906{
4976 struct e1000_eeprom_info *eeprom = &hw->eeprom; 4907 struct e1000_eeprom_info *eeprom = &hw->eeprom;
4977 u32 i = 0; 4908 u32 i = 0;
@@ -5068,11 +4999,8 @@ e1000_read_eeprom(struct e1000_hw *hw,
5068 * data - word read from the EEPROM 4999 * data - word read from the EEPROM
5069 * words - number of words to read 5000 * words - number of words to read
5070 *****************************************************************************/ 5001 *****************************************************************************/
5071static s32 5002static s32 e1000_read_eeprom_eerd(struct e1000_hw *hw, u16 offset, u16 words,
5072e1000_read_eeprom_eerd(struct e1000_hw *hw, 5003 u16 *data)
5073 u16 offset,
5074 u16 words,
5075 u16 *data)
5076{ 5004{
5077 u32 i, eerd = 0; 5005 u32 i, eerd = 0;
5078 s32 error = 0; 5006 s32 error = 0;
@@ -5081,13 +5009,13 @@ e1000_read_eeprom_eerd(struct e1000_hw *hw,
5081 eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) + 5009 eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) +
5082 E1000_EEPROM_RW_REG_START; 5010 E1000_EEPROM_RW_REG_START;
5083 5011
5084 E1000_WRITE_REG(hw, EERD, eerd); 5012 ew32(EERD, eerd);
5085 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ); 5013 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);
5086 5014
5087 if (error) { 5015 if (error) {
5088 break; 5016 break;
5089 } 5017 }
5090 data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA); 5018 data[i] = (er32(EERD) >> E1000_EEPROM_RW_REG_DATA);
5091 5019
5092 } 5020 }
5093 5021
@@ -5102,11 +5030,8 @@ e1000_read_eeprom_eerd(struct e1000_hw *hw,
5102 * data - word read from the EEPROM 5030 * data - word read from the EEPROM
5103 * words - number of words to read 5031 * words - number of words to read
5104 *****************************************************************************/ 5032 *****************************************************************************/
5105static s32 5033static s32 e1000_write_eeprom_eewr(struct e1000_hw *hw, u16 offset, u16 words,
5106e1000_write_eeprom_eewr(struct e1000_hw *hw, 5034 u16 *data)
5107 u16 offset,
5108 u16 words,
5109 u16 *data)
5110{ 5035{
5111 u32 register_value = 0; 5036 u32 register_value = 0;
5112 u32 i = 0; 5037 u32 i = 0;
@@ -5125,7 +5050,7 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw,
5125 break; 5050 break;
5126 } 5051 }
5127 5052
5128 E1000_WRITE_REG(hw, EEWR, register_value); 5053 ew32(EEWR, register_value);
5129 5054
5130 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE); 5055 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
5131 5056
@@ -5143,8 +5068,7 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw,
5143 * 5068 *
5144 * hw - Struct containing variables accessed by shared code 5069 * hw - Struct containing variables accessed by shared code
5145 *****************************************************************************/ 5070 *****************************************************************************/
5146static s32 5071static s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
5147e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
5148{ 5072{
5149 u32 attempts = 100000; 5073 u32 attempts = 100000;
5150 u32 i, reg = 0; 5074 u32 i, reg = 0;
@@ -5152,9 +5076,9 @@ e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
5152 5076
5153 for (i = 0; i < attempts; i++) { 5077 for (i = 0; i < attempts; i++) {
5154 if (eerd == E1000_EEPROM_POLL_READ) 5078 if (eerd == E1000_EEPROM_POLL_READ)
5155 reg = E1000_READ_REG(hw, EERD); 5079 reg = er32(EERD);
5156 else 5080 else
5157 reg = E1000_READ_REG(hw, EEWR); 5081 reg = er32(EEWR);
5158 5082
5159 if (reg & E1000_EEPROM_RW_REG_DONE) { 5083 if (reg & E1000_EEPROM_RW_REG_DONE) {
5160 done = E1000_SUCCESS; 5084 done = E1000_SUCCESS;
@@ -5171,8 +5095,7 @@ e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
5171* 5095*
5172* hw - Struct containing variables accessed by shared code 5096* hw - Struct containing variables accessed by shared code
5173****************************************************************************/ 5097****************************************************************************/
5174static bool 5098static bool e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
5175e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
5176{ 5099{
5177 u32 eecd = 0; 5100 u32 eecd = 0;
5178 5101
@@ -5182,7 +5105,7 @@ e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
5182 return false; 5105 return false;
5183 5106
5184 if (hw->mac_type == e1000_82573) { 5107 if (hw->mac_type == e1000_82573) {
5185 eecd = E1000_READ_REG(hw, EECD); 5108 eecd = er32(EECD);
5186 5109
5187 /* Isolate bits 15 & 16 */ 5110 /* Isolate bits 15 & 16 */
5188 eecd = ((eecd >> 15) & 0x03); 5111 eecd = ((eecd >> 15) & 0x03);
@@ -5204,8 +5127,7 @@ e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
5204 * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is 5127 * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
5205 * valid. 5128 * valid.
5206 *****************************************************************************/ 5129 *****************************************************************************/
5207s32 5130s32 e1000_validate_eeprom_checksum(struct e1000_hw *hw)
5208e1000_validate_eeprom_checksum(struct e1000_hw *hw)
5209{ 5131{
5210 u16 checksum = 0; 5132 u16 checksum = 0;
5211 u16 i, eeprom_data; 5133 u16 i, eeprom_data;
@@ -5252,7 +5174,7 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw)
5252 checksum += eeprom_data; 5174 checksum += eeprom_data;
5253 } 5175 }
5254 5176
5255 if (checksum == (u16) EEPROM_SUM) 5177 if (checksum == (u16)EEPROM_SUM)
5256 return E1000_SUCCESS; 5178 return E1000_SUCCESS;
5257 else { 5179 else {
5258 DEBUGOUT("EEPROM Checksum Invalid\n"); 5180 DEBUGOUT("EEPROM Checksum Invalid\n");
@@ -5268,8 +5190,7 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw)
5268 * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA. 5190 * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
5269 * Writes the difference to word offset 63 of the EEPROM. 5191 * Writes the difference to word offset 63 of the EEPROM.
5270 *****************************************************************************/ 5192 *****************************************************************************/
5271s32 5193s32 e1000_update_eeprom_checksum(struct e1000_hw *hw)
5272e1000_update_eeprom_checksum(struct e1000_hw *hw)
5273{ 5194{
5274 u32 ctrl_ext; 5195 u32 ctrl_ext;
5275 u16 checksum = 0; 5196 u16 checksum = 0;
@@ -5284,7 +5205,7 @@ e1000_update_eeprom_checksum(struct e1000_hw *hw)
5284 } 5205 }
5285 checksum += eeprom_data; 5206 checksum += eeprom_data;
5286 } 5207 }
5287 checksum = (u16) EEPROM_SUM - checksum; 5208 checksum = (u16)EEPROM_SUM - checksum;
5288 if (e1000_write_eeprom(hw, EEPROM_CHECKSUM_REG, 1, &checksum) < 0) { 5209 if (e1000_write_eeprom(hw, EEPROM_CHECKSUM_REG, 1, &checksum) < 0) {
5289 DEBUGOUT("EEPROM Write Error\n"); 5210 DEBUGOUT("EEPROM Write Error\n");
5290 return -E1000_ERR_EEPROM; 5211 return -E1000_ERR_EEPROM;
@@ -5294,9 +5215,9 @@ e1000_update_eeprom_checksum(struct e1000_hw *hw)
5294 e1000_commit_shadow_ram(hw); 5215 e1000_commit_shadow_ram(hw);
5295 /* Reload the EEPROM, or else modifications will not appear 5216 /* Reload the EEPROM, or else modifications will not appear
5296 * until after next adapter reset. */ 5217 * until after next adapter reset. */
5297 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 5218 ctrl_ext = er32(CTRL_EXT);
5298 ctrl_ext |= E1000_CTRL_EXT_EE_RST; 5219 ctrl_ext |= E1000_CTRL_EXT_EE_RST;
5299 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 5220 ew32(CTRL_EXT, ctrl_ext);
5300 msleep(10); 5221 msleep(10);
5301 } 5222 }
5302 return E1000_SUCCESS; 5223 return E1000_SUCCESS;
@@ -5313,11 +5234,7 @@ e1000_update_eeprom_checksum(struct e1000_hw *hw)
5313 * If e1000_update_eeprom_checksum is not called after this function, the 5234 * If e1000_update_eeprom_checksum is not called after this function, the
5314 * EEPROM will most likely contain an invalid checksum. 5235 * EEPROM will most likely contain an invalid checksum.
5315 *****************************************************************************/ 5236 *****************************************************************************/
5316s32 5237s32 e1000_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
5317e1000_write_eeprom(struct e1000_hw *hw,
5318 u16 offset,
5319 u16 words,
5320 u16 *data)
5321{ 5238{
5322 struct e1000_eeprom_info *eeprom = &hw->eeprom; 5239 struct e1000_eeprom_info *eeprom = &hw->eeprom;
5323 s32 status = 0; 5240 s32 status = 0;
@@ -5370,11 +5287,8 @@ e1000_write_eeprom(struct e1000_hw *hw,
5370 * data - pointer to array of 8 bit words to be written to the EEPROM 5287 * data - pointer to array of 8 bit words to be written to the EEPROM
5371 * 5288 *
5372 *****************************************************************************/ 5289 *****************************************************************************/
5373static s32 5290static s32 e1000_write_eeprom_spi(struct e1000_hw *hw, u16 offset, u16 words,
5374e1000_write_eeprom_spi(struct e1000_hw *hw, 5291 u16 *data)
5375 u16 offset,
5376 u16 words,
5377 u16 *data)
5378{ 5292{
5379 struct e1000_eeprom_info *eeprom = &hw->eeprom; 5293 struct e1000_eeprom_info *eeprom = &hw->eeprom;
5380 u16 widx = 0; 5294 u16 widx = 0;
@@ -5436,11 +5350,8 @@ e1000_write_eeprom_spi(struct e1000_hw *hw,
5436 * data - pointer to array of 16 bit words to be written to the EEPROM 5350 * data - pointer to array of 16 bit words to be written to the EEPROM
5437 * 5351 *
5438 *****************************************************************************/ 5352 *****************************************************************************/
5439static s32 5353static s32 e1000_write_eeprom_microwire(struct e1000_hw *hw, u16 offset,
5440e1000_write_eeprom_microwire(struct e1000_hw *hw, 5354 u16 words, u16 *data)
5441 u16 offset,
5442 u16 words,
5443 u16 *data)
5444{ 5355{
5445 struct e1000_eeprom_info *eeprom = &hw->eeprom; 5356 struct e1000_eeprom_info *eeprom = &hw->eeprom;
5446 u32 eecd; 5357 u32 eecd;
@@ -5484,7 +5395,7 @@ e1000_write_eeprom_microwire(struct e1000_hw *hw,
5484 * If DO does not go high in 10 milliseconds, then error out. 5395 * If DO does not go high in 10 milliseconds, then error out.
5485 */ 5396 */
5486 for (i = 0; i < 200; i++) { 5397 for (i = 0; i < 200; i++) {
5487 eecd = E1000_READ_REG(hw, EECD); 5398 eecd = er32(EECD);
5488 if (eecd & E1000_EECD_DO) break; 5399 if (eecd & E1000_EECD_DO) break;
5489 udelay(50); 5400 udelay(50);
5490 } 5401 }
@@ -5523,8 +5434,7 @@ e1000_write_eeprom_microwire(struct e1000_hw *hw,
5523 * data - word read from the EEPROM 5434 * data - word read from the EEPROM
5524 * words - number of words to read 5435 * words - number of words to read
5525 *****************************************************************************/ 5436 *****************************************************************************/
5526static s32 5437static s32 e1000_commit_shadow_ram(struct e1000_hw *hw)
5527e1000_commit_shadow_ram(struct e1000_hw *hw)
5528{ 5438{
5529 u32 attempts = 100000; 5439 u32 attempts = 100000;
5530 u32 eecd = 0; 5440 u32 eecd = 0;
@@ -5539,9 +5449,9 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
5539 5449
5540 if (hw->mac_type == e1000_82573) { 5450 if (hw->mac_type == e1000_82573) {
5541 /* The flop register will be used to determine if flash type is STM */ 5451 /* The flop register will be used to determine if flash type is STM */
5542 flop = E1000_READ_REG(hw, FLOP); 5452 flop = er32(FLOP);
5543 for (i=0; i < attempts; i++) { 5453 for (i=0; i < attempts; i++) {
5544 eecd = E1000_READ_REG(hw, EECD); 5454 eecd = er32(EECD);
5545 if ((eecd & E1000_EECD_FLUPD) == 0) { 5455 if ((eecd & E1000_EECD_FLUPD) == 0) {
5546 break; 5456 break;
5547 } 5457 }
@@ -5554,14 +5464,14 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
5554 5464
5555 /* If STM opcode located in bits 15:8 of flop, reset firmware */ 5465 /* If STM opcode located in bits 15:8 of flop, reset firmware */
5556 if ((flop & 0xFF00) == E1000_STM_OPCODE) { 5466 if ((flop & 0xFF00) == E1000_STM_OPCODE) {
5557 E1000_WRITE_REG(hw, HICR, E1000_HICR_FW_RESET); 5467 ew32(HICR, E1000_HICR_FW_RESET);
5558 } 5468 }
5559 5469
5560 /* Perform the flash update */ 5470 /* Perform the flash update */
5561 E1000_WRITE_REG(hw, EECD, eecd | E1000_EECD_FLUPD); 5471 ew32(EECD, eecd | E1000_EECD_FLUPD);
5562 5472
5563 for (i=0; i < attempts; i++) { 5473 for (i=0; i < attempts; i++) {
5564 eecd = E1000_READ_REG(hw, EECD); 5474 eecd = er32(EECD);
5565 if ((eecd & E1000_EECD_FLUPD) == 0) { 5475 if ((eecd & E1000_EECD_FLUPD) == 0) {
5566 break; 5476 break;
5567 } 5477 }
@@ -5577,7 +5487,7 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
5577 /* We're writing to the opposite bank so if we're on bank 1, 5487 /* We're writing to the opposite bank so if we're on bank 1,
5578 * write to bank 0 etc. We also need to erase the segment that 5488 * write to bank 0 etc. We also need to erase the segment that
5579 * is going to be written */ 5489 * is going to be written */
5580 if (!(E1000_READ_REG(hw, EECD) & E1000_EECD_SEC1VAL)) { 5490 if (!(er32(EECD) & E1000_EECD_SEC1VAL)) {
5581 new_bank_offset = hw->flash_bank_size * 2; 5491 new_bank_offset = hw->flash_bank_size * 2;
5582 old_bank_offset = 0; 5492 old_bank_offset = 0;
5583 e1000_erase_ich8_4k_segment(hw, 1); 5493 e1000_erase_ich8_4k_segment(hw, 1);
@@ -5687,8 +5597,7 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
5687 * 5597 *
5688 * hw - Struct containing variables accessed by shared code 5598 * hw - Struct containing variables accessed by shared code
5689 *****************************************************************************/ 5599 *****************************************************************************/
5690s32 5600s32 e1000_read_mac_addr(struct e1000_hw *hw)
5691e1000_read_mac_addr(struct e1000_hw * hw)
5692{ 5601{
5693 u16 offset; 5602 u16 offset;
5694 u16 eeprom_data, i; 5603 u16 eeprom_data, i;
@@ -5701,8 +5610,8 @@ e1000_read_mac_addr(struct e1000_hw * hw)
5701 DEBUGOUT("EEPROM Read Error\n"); 5610 DEBUGOUT("EEPROM Read Error\n");
5702 return -E1000_ERR_EEPROM; 5611 return -E1000_ERR_EEPROM;
5703 } 5612 }
5704 hw->perm_mac_addr[i] = (u8) (eeprom_data & 0x00FF); 5613 hw->perm_mac_addr[i] = (u8)(eeprom_data & 0x00FF);
5705 hw->perm_mac_addr[i+1] = (u8) (eeprom_data >> 8); 5614 hw->perm_mac_addr[i+1] = (u8)(eeprom_data >> 8);
5706 } 5615 }
5707 5616
5708 switch (hw->mac_type) { 5617 switch (hw->mac_type) {
@@ -5712,7 +5621,7 @@ e1000_read_mac_addr(struct e1000_hw * hw)
5712 case e1000_82546_rev_3: 5621 case e1000_82546_rev_3:
5713 case e1000_82571: 5622 case e1000_82571:
5714 case e1000_80003es2lan: 5623 case e1000_80003es2lan:
5715 if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) 5624 if (er32(STATUS) & E1000_STATUS_FUNC_1)
5716 hw->perm_mac_addr[5] ^= 0x01; 5625 hw->perm_mac_addr[5] ^= 0x01;
5717 break; 5626 break;
5718 } 5627 }
@@ -5731,8 +5640,7 @@ e1000_read_mac_addr(struct e1000_hw * hw)
5731 * of the receive addresss registers. Clears the multicast table. Assumes 5640 * of the receive addresss registers. Clears the multicast table. Assumes
5732 * the receiver is in reset when the routine is called. 5641 * the receiver is in reset when the routine is called.
5733 *****************************************************************************/ 5642 *****************************************************************************/
5734static void 5643static void e1000_init_rx_addrs(struct e1000_hw *hw)
5735e1000_init_rx_addrs(struct e1000_hw *hw)
5736{ 5644{
5737 u32 i; 5645 u32 i;
5738 u32 rar_num; 5646 u32 rar_num;
@@ -5758,9 +5666,9 @@ e1000_init_rx_addrs(struct e1000_hw *hw)
5758 DEBUGOUT("Clearing RAR[1-15]\n"); 5666 DEBUGOUT("Clearing RAR[1-15]\n");
5759 for (i = 1; i < rar_num; i++) { 5667 for (i = 1; i < rar_num; i++) {
5760 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0); 5668 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
5761 E1000_WRITE_FLUSH(hw); 5669 E1000_WRITE_FLUSH();
5762 E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0); 5670 E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
5763 E1000_WRITE_FLUSH(hw); 5671 E1000_WRITE_FLUSH();
5764 } 5672 }
5765} 5673}
5766 5674
@@ -5770,9 +5678,7 @@ e1000_init_rx_addrs(struct e1000_hw *hw)
5770 * hw - Struct containing variables accessed by shared code 5678 * hw - Struct containing variables accessed by shared code
5771 * mc_addr - the multicast address to hash 5679 * mc_addr - the multicast address to hash
5772 *****************************************************************************/ 5680 *****************************************************************************/
5773u32 5681u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
5774e1000_hash_mc_addr(struct e1000_hw *hw,
5775 u8 *mc_addr)
5776{ 5682{
5777 u32 hash_value = 0; 5683 u32 hash_value = 0;
5778 5684
@@ -5787,37 +5693,37 @@ e1000_hash_mc_addr(struct e1000_hw *hw,
5787 case 0: 5693 case 0:
5788 if (hw->mac_type == e1000_ich8lan) { 5694 if (hw->mac_type == e1000_ich8lan) {
5789 /* [47:38] i.e. 0x158 for above example address */ 5695 /* [47:38] i.e. 0x158 for above example address */
5790 hash_value = ((mc_addr[4] >> 6) | (((u16) mc_addr[5]) << 2)); 5696 hash_value = ((mc_addr[4] >> 6) | (((u16)mc_addr[5]) << 2));
5791 } else { 5697 } else {
5792 /* [47:36] i.e. 0x563 for above example address */ 5698 /* [47:36] i.e. 0x563 for above example address */
5793 hash_value = ((mc_addr[4] >> 4) | (((u16) mc_addr[5]) << 4)); 5699 hash_value = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4));
5794 } 5700 }
5795 break; 5701 break;
5796 case 1: 5702 case 1:
5797 if (hw->mac_type == e1000_ich8lan) { 5703 if (hw->mac_type == e1000_ich8lan) {
5798 /* [46:37] i.e. 0x2B1 for above example address */ 5704 /* [46:37] i.e. 0x2B1 for above example address */
5799 hash_value = ((mc_addr[4] >> 5) | (((u16) mc_addr[5]) << 3)); 5705 hash_value = ((mc_addr[4] >> 5) | (((u16)mc_addr[5]) << 3));
5800 } else { 5706 } else {
5801 /* [46:35] i.e. 0xAC6 for above example address */ 5707 /* [46:35] i.e. 0xAC6 for above example address */
5802 hash_value = ((mc_addr[4] >> 3) | (((u16) mc_addr[5]) << 5)); 5708 hash_value = ((mc_addr[4] >> 3) | (((u16)mc_addr[5]) << 5));
5803 } 5709 }
5804 break; 5710 break;
5805 case 2: 5711 case 2:
5806 if (hw->mac_type == e1000_ich8lan) { 5712 if (hw->mac_type == e1000_ich8lan) {
5807 /*[45:36] i.e. 0x163 for above example address */ 5713 /*[45:36] i.e. 0x163 for above example address */
5808 hash_value = ((mc_addr[4] >> 4) | (((u16) mc_addr[5]) << 4)); 5714 hash_value = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4));
5809 } else { 5715 } else {
5810 /* [45:34] i.e. 0x5D8 for above example address */ 5716 /* [45:34] i.e. 0x5D8 for above example address */
5811 hash_value = ((mc_addr[4] >> 2) | (((u16) mc_addr[5]) << 6)); 5717 hash_value = ((mc_addr[4] >> 2) | (((u16)mc_addr[5]) << 6));
5812 } 5718 }
5813 break; 5719 break;
5814 case 3: 5720 case 3:
5815 if (hw->mac_type == e1000_ich8lan) { 5721 if (hw->mac_type == e1000_ich8lan) {
5816 /* [43:34] i.e. 0x18D for above example address */ 5722 /* [43:34] i.e. 0x18D for above example address */
5817 hash_value = ((mc_addr[4] >> 2) | (((u16) mc_addr[5]) << 6)); 5723 hash_value = ((mc_addr[4] >> 2) | (((u16)mc_addr[5]) << 6));
5818 } else { 5724 } else {
5819 /* [43:32] i.e. 0x634 for above example address */ 5725 /* [43:32] i.e. 0x634 for above example address */
5820 hash_value = ((mc_addr[4]) | (((u16) mc_addr[5]) << 8)); 5726 hash_value = ((mc_addr[4]) | (((u16)mc_addr[5]) << 8));
5821 } 5727 }
5822 break; 5728 break;
5823 } 5729 }
@@ -5835,9 +5741,7 @@ e1000_hash_mc_addr(struct e1000_hw *hw,
5835 * hw - Struct containing variables accessed by shared code 5741 * hw - Struct containing variables accessed by shared code
5836 * hash_value - Multicast address hash value 5742 * hash_value - Multicast address hash value
5837 *****************************************************************************/ 5743 *****************************************************************************/
5838void 5744void e1000_mta_set(struct e1000_hw *hw, u32 hash_value)
5839e1000_mta_set(struct e1000_hw *hw,
5840 u32 hash_value)
5841{ 5745{
5842 u32 hash_bit, hash_reg; 5746 u32 hash_bit, hash_reg;
5843 u32 mta; 5747 u32 mta;
@@ -5868,12 +5772,12 @@ e1000_mta_set(struct e1000_hw *hw,
5868 if ((hw->mac_type == e1000_82544) && ((hash_reg & 0x1) == 1)) { 5772 if ((hw->mac_type == e1000_82544) && ((hash_reg & 0x1) == 1)) {
5869 temp = E1000_READ_REG_ARRAY(hw, MTA, (hash_reg - 1)); 5773 temp = E1000_READ_REG_ARRAY(hw, MTA, (hash_reg - 1));
5870 E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta); 5774 E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta);
5871 E1000_WRITE_FLUSH(hw); 5775 E1000_WRITE_FLUSH();
5872 E1000_WRITE_REG_ARRAY(hw, MTA, (hash_reg - 1), temp); 5776 E1000_WRITE_REG_ARRAY(hw, MTA, (hash_reg - 1), temp);
5873 E1000_WRITE_FLUSH(hw); 5777 E1000_WRITE_FLUSH();
5874 } else { 5778 } else {
5875 E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta); 5779 E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta);
5876 E1000_WRITE_FLUSH(hw); 5780 E1000_WRITE_FLUSH();
5877 } 5781 }
5878} 5782}
5879 5783
@@ -5884,20 +5788,16 @@ e1000_mta_set(struct e1000_hw *hw,
5884 * addr - Address to put into receive address register 5788 * addr - Address to put into receive address register
5885 * index - Receive address register to write 5789 * index - Receive address register to write
5886 *****************************************************************************/ 5790 *****************************************************************************/
5887void 5791void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)
5888e1000_rar_set(struct e1000_hw *hw,
5889 u8 *addr,
5890 u32 index)
5891{ 5792{
5892 u32 rar_low, rar_high; 5793 u32 rar_low, rar_high;
5893 5794
5894 /* HW expects these in little endian so we reverse the byte order 5795 /* HW expects these in little endian so we reverse the byte order
5895 * from network order (big endian) to little endian 5796 * from network order (big endian) to little endian
5896 */ 5797 */
5897 rar_low = ((u32) addr[0] | 5798 rar_low = ((u32)addr[0] | ((u32)addr[1] << 8) |
5898 ((u32) addr[1] << 8) | 5799 ((u32)addr[2] << 16) | ((u32)addr[3] << 24));
5899 ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); 5800 rar_high = ((u32)addr[4] | ((u32)addr[5] << 8));
5900 rar_high = ((u32) addr[4] | ((u32) addr[5] << 8));
5901 5801
5902 /* Disable Rx and flush all Rx frames before enabling RSS to avoid Rx 5802 /* Disable Rx and flush all Rx frames before enabling RSS to avoid Rx
5903 * unit hang. 5803 * unit hang.
@@ -5930,9 +5830,9 @@ e1000_rar_set(struct e1000_hw *hw,
5930 } 5830 }
5931 5831
5932 E1000_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low); 5832 E1000_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low);
5933 E1000_WRITE_FLUSH(hw); 5833 E1000_WRITE_FLUSH();
5934 E1000_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high); 5834 E1000_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high);
5935 E1000_WRITE_FLUSH(hw); 5835 E1000_WRITE_FLUSH();
5936} 5836}
5937 5837
5938/****************************************************************************** 5838/******************************************************************************
@@ -5942,10 +5842,7 @@ e1000_rar_set(struct e1000_hw *hw,
5942 * offset - Offset in VLAN filer table to write 5842 * offset - Offset in VLAN filer table to write
5943 * value - Value to write into VLAN filter table 5843 * value - Value to write into VLAN filter table
5944 *****************************************************************************/ 5844 *****************************************************************************/
5945void 5845void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value)
5946e1000_write_vfta(struct e1000_hw *hw,
5947 u32 offset,
5948 u32 value)
5949{ 5846{
5950 u32 temp; 5847 u32 temp;
5951 5848
@@ -5955,12 +5852,12 @@ e1000_write_vfta(struct e1000_hw *hw,
5955 if ((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) { 5852 if ((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) {
5956 temp = E1000_READ_REG_ARRAY(hw, VFTA, (offset - 1)); 5853 temp = E1000_READ_REG_ARRAY(hw, VFTA, (offset - 1));
5957 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value); 5854 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value);
5958 E1000_WRITE_FLUSH(hw); 5855 E1000_WRITE_FLUSH();
5959 E1000_WRITE_REG_ARRAY(hw, VFTA, (offset - 1), temp); 5856 E1000_WRITE_REG_ARRAY(hw, VFTA, (offset - 1), temp);
5960 E1000_WRITE_FLUSH(hw); 5857 E1000_WRITE_FLUSH();
5961 } else { 5858 } else {
5962 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value); 5859 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value);
5963 E1000_WRITE_FLUSH(hw); 5860 E1000_WRITE_FLUSH();
5964 } 5861 }
5965} 5862}
5966 5863
@@ -5969,8 +5866,7 @@ e1000_write_vfta(struct e1000_hw *hw,
5969 * 5866 *
5970 * hw - Struct containing variables accessed by shared code 5867 * hw - Struct containing variables accessed by shared code
5971 *****************************************************************************/ 5868 *****************************************************************************/
5972static void 5869static void e1000_clear_vfta(struct e1000_hw *hw)
5973e1000_clear_vfta(struct e1000_hw *hw)
5974{ 5870{
5975 u32 offset; 5871 u32 offset;
5976 u32 vfta_value = 0; 5872 u32 vfta_value = 0;
@@ -5999,12 +5895,11 @@ e1000_clear_vfta(struct e1000_hw *hw)
5999 * manageability unit */ 5895 * manageability unit */
6000 vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0; 5896 vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0;
6001 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value); 5897 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value);
6002 E1000_WRITE_FLUSH(hw); 5898 E1000_WRITE_FLUSH();
6003 } 5899 }
6004} 5900}
6005 5901
6006static s32 5902static s32 e1000_id_led_init(struct e1000_hw *hw)
6007e1000_id_led_init(struct e1000_hw * hw)
6008{ 5903{
6009 u32 ledctl; 5904 u32 ledctl;
6010 const u32 ledctl_mask = 0x000000FF; 5905 const u32 ledctl_mask = 0x000000FF;
@@ -6020,7 +5915,7 @@ e1000_id_led_init(struct e1000_hw * hw)
6020 return E1000_SUCCESS; 5915 return E1000_SUCCESS;
6021 } 5916 }
6022 5917
6023 ledctl = E1000_READ_REG(hw, LEDCTL); 5918 ledctl = er32(LEDCTL);
6024 hw->ledctl_default = ledctl; 5919 hw->ledctl_default = ledctl;
6025 hw->ledctl_mode1 = hw->ledctl_default; 5920 hw->ledctl_mode1 = hw->ledctl_default;
6026 hw->ledctl_mode2 = hw->ledctl_default; 5921 hw->ledctl_mode2 = hw->ledctl_default;
@@ -6086,8 +5981,7 @@ e1000_id_led_init(struct e1000_hw * hw)
6086 * 5981 *
6087 * hw - Struct containing variables accessed by shared code 5982 * hw - Struct containing variables accessed by shared code
6088 *****************************************************************************/ 5983 *****************************************************************************/
6089s32 5984s32 e1000_setup_led(struct e1000_hw *hw)
6090e1000_setup_led(struct e1000_hw *hw)
6091{ 5985{
6092 u32 ledctl; 5986 u32 ledctl;
6093 s32 ret_val = E1000_SUCCESS; 5987 s32 ret_val = E1000_SUCCESS;
@@ -6118,7 +6012,7 @@ e1000_setup_led(struct e1000_hw *hw)
6118 /* Fall Through */ 6012 /* Fall Through */
6119 default: 6013 default:
6120 if (hw->media_type == e1000_media_type_fiber) { 6014 if (hw->media_type == e1000_media_type_fiber) {
6121 ledctl = E1000_READ_REG(hw, LEDCTL); 6015 ledctl = er32(LEDCTL);
6122 /* Save current LEDCTL settings */ 6016 /* Save current LEDCTL settings */
6123 hw->ledctl_default = ledctl; 6017 hw->ledctl_default = ledctl;
6124 /* Turn off LED0 */ 6018 /* Turn off LED0 */
@@ -6127,9 +6021,9 @@ e1000_setup_led(struct e1000_hw *hw)
6127 E1000_LEDCTL_LED0_MODE_MASK); 6021 E1000_LEDCTL_LED0_MODE_MASK);
6128 ledctl |= (E1000_LEDCTL_MODE_LED_OFF << 6022 ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
6129 E1000_LEDCTL_LED0_MODE_SHIFT); 6023 E1000_LEDCTL_LED0_MODE_SHIFT);
6130 E1000_WRITE_REG(hw, LEDCTL, ledctl); 6024 ew32(LEDCTL, ledctl);
6131 } else if (hw->media_type == e1000_media_type_copper) 6025 } else if (hw->media_type == e1000_media_type_copper)
6132 E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); 6026 ew32(LEDCTL, hw->ledctl_mode1);
6133 break; 6027 break;
6134 } 6028 }
6135 6029
@@ -6145,8 +6039,7 @@ e1000_setup_led(struct e1000_hw *hw)
6145 * 6039 *
6146 * hw - Struct containing variables accessed by shared code 6040 * hw - Struct containing variables accessed by shared code
6147 *****************************************************************************/ 6041 *****************************************************************************/
6148s32 6042s32 e1000_blink_led_start(struct e1000_hw *hw)
6149e1000_blink_led_start(struct e1000_hw *hw)
6150{ 6043{
6151 s16 i; 6044 s16 i;
6152 u32 ledctl_blink = 0; 6045 u32 ledctl_blink = 0;
@@ -6170,7 +6063,7 @@ e1000_blink_led_start(struct e1000_hw *hw)
6170 ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << (i * 8)); 6063 ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << (i * 8));
6171 } 6064 }
6172 6065
6173 E1000_WRITE_REG(hw, LEDCTL, ledctl_blink); 6066 ew32(LEDCTL, ledctl_blink);
6174 6067
6175 return E1000_SUCCESS; 6068 return E1000_SUCCESS;
6176} 6069}
@@ -6180,8 +6073,7 @@ e1000_blink_led_start(struct e1000_hw *hw)
6180 * 6073 *
6181 * hw - Struct containing variables accessed by shared code 6074 * hw - Struct containing variables accessed by shared code
6182 *****************************************************************************/ 6075 *****************************************************************************/
6183s32 6076s32 e1000_cleanup_led(struct e1000_hw *hw)
6184e1000_cleanup_led(struct e1000_hw *hw)
6185{ 6077{
6186 s32 ret_val = E1000_SUCCESS; 6078 s32 ret_val = E1000_SUCCESS;
6187 6079
@@ -6210,7 +6102,7 @@ e1000_cleanup_led(struct e1000_hw *hw)
6210 break; 6102 break;
6211 } 6103 }
6212 /* Restore LEDCTL settings */ 6104 /* Restore LEDCTL settings */
6213 E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_default); 6105 ew32(LEDCTL, hw->ledctl_default);
6214 break; 6106 break;
6215 } 6107 }
6216 6108
@@ -6222,10 +6114,9 @@ e1000_cleanup_led(struct e1000_hw *hw)
6222 * 6114 *
6223 * hw - Struct containing variables accessed by shared code 6115 * hw - Struct containing variables accessed by shared code
6224 *****************************************************************************/ 6116 *****************************************************************************/
6225s32 6117s32 e1000_led_on(struct e1000_hw *hw)
6226e1000_led_on(struct e1000_hw *hw)
6227{ 6118{
6228 u32 ctrl = E1000_READ_REG(hw, CTRL); 6119 u32 ctrl = er32(CTRL);
6229 6120
6230 DEBUGFUNC("e1000_led_on"); 6121 DEBUGFUNC("e1000_led_on");
6231 6122
@@ -6257,13 +6148,13 @@ e1000_led_on(struct e1000_hw *hw)
6257 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, 6148 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED,
6258 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON)); 6149 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON));
6259 } else if (hw->media_type == e1000_media_type_copper) { 6150 } else if (hw->media_type == e1000_media_type_copper) {
6260 E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode2); 6151 ew32(LEDCTL, hw->ledctl_mode2);
6261 return E1000_SUCCESS; 6152 return E1000_SUCCESS;
6262 } 6153 }
6263 break; 6154 break;
6264 } 6155 }
6265 6156
6266 E1000_WRITE_REG(hw, CTRL, ctrl); 6157 ew32(CTRL, ctrl);
6267 6158
6268 return E1000_SUCCESS; 6159 return E1000_SUCCESS;
6269} 6160}
@@ -6273,10 +6164,9 @@ e1000_led_on(struct e1000_hw *hw)
6273 * 6164 *
6274 * hw - Struct containing variables accessed by shared code 6165 * hw - Struct containing variables accessed by shared code
6275 *****************************************************************************/ 6166 *****************************************************************************/
6276s32 6167s32 e1000_led_off(struct e1000_hw *hw)
6277e1000_led_off(struct e1000_hw *hw)
6278{ 6168{
6279 u32 ctrl = E1000_READ_REG(hw, CTRL); 6169 u32 ctrl = er32(CTRL);
6280 6170
6281 DEBUGFUNC("e1000_led_off"); 6171 DEBUGFUNC("e1000_led_off");
6282 6172
@@ -6308,13 +6198,13 @@ e1000_led_off(struct e1000_hw *hw)
6308 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, 6198 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED,
6309 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF)); 6199 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF));
6310 } else if (hw->media_type == e1000_media_type_copper) { 6200 } else if (hw->media_type == e1000_media_type_copper) {
6311 E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); 6201 ew32(LEDCTL, hw->ledctl_mode1);
6312 return E1000_SUCCESS; 6202 return E1000_SUCCESS;
6313 } 6203 }
6314 break; 6204 break;
6315 } 6205 }
6316 6206
6317 E1000_WRITE_REG(hw, CTRL, ctrl); 6207 ew32(CTRL, ctrl);
6318 6208
6319 return E1000_SUCCESS; 6209 return E1000_SUCCESS;
6320} 6210}
@@ -6324,98 +6214,97 @@ e1000_led_off(struct e1000_hw *hw)
6324 * 6214 *
6325 * hw - Struct containing variables accessed by shared code 6215 * hw - Struct containing variables accessed by shared code
6326 *****************************************************************************/ 6216 *****************************************************************************/
6327static void 6217static void e1000_clear_hw_cntrs(struct e1000_hw *hw)
6328e1000_clear_hw_cntrs(struct e1000_hw *hw)
6329{ 6218{
6330 volatile u32 temp; 6219 volatile u32 temp;
6331 6220
6332 temp = E1000_READ_REG(hw, CRCERRS); 6221 temp = er32(CRCERRS);
6333 temp = E1000_READ_REG(hw, SYMERRS); 6222 temp = er32(SYMERRS);
6334 temp = E1000_READ_REG(hw, MPC); 6223 temp = er32(MPC);
6335 temp = E1000_READ_REG(hw, SCC); 6224 temp = er32(SCC);
6336 temp = E1000_READ_REG(hw, ECOL); 6225 temp = er32(ECOL);
6337 temp = E1000_READ_REG(hw, MCC); 6226 temp = er32(MCC);
6338 temp = E1000_READ_REG(hw, LATECOL); 6227 temp = er32(LATECOL);
6339 temp = E1000_READ_REG(hw, COLC); 6228 temp = er32(COLC);
6340 temp = E1000_READ_REG(hw, DC); 6229 temp = er32(DC);
6341 temp = E1000_READ_REG(hw, SEC); 6230 temp = er32(SEC);
6342 temp = E1000_READ_REG(hw, RLEC); 6231 temp = er32(RLEC);
6343 temp = E1000_READ_REG(hw, XONRXC); 6232 temp = er32(XONRXC);
6344 temp = E1000_READ_REG(hw, XONTXC); 6233 temp = er32(XONTXC);
6345 temp = E1000_READ_REG(hw, XOFFRXC); 6234 temp = er32(XOFFRXC);
6346 temp = E1000_READ_REG(hw, XOFFTXC); 6235 temp = er32(XOFFTXC);
6347 temp = E1000_READ_REG(hw, FCRUC); 6236 temp = er32(FCRUC);
6348 6237
6349 if (hw->mac_type != e1000_ich8lan) { 6238 if (hw->mac_type != e1000_ich8lan) {
6350 temp = E1000_READ_REG(hw, PRC64); 6239 temp = er32(PRC64);
6351 temp = E1000_READ_REG(hw, PRC127); 6240 temp = er32(PRC127);
6352 temp = E1000_READ_REG(hw, PRC255); 6241 temp = er32(PRC255);
6353 temp = E1000_READ_REG(hw, PRC511); 6242 temp = er32(PRC511);
6354 temp = E1000_READ_REG(hw, PRC1023); 6243 temp = er32(PRC1023);
6355 temp = E1000_READ_REG(hw, PRC1522); 6244 temp = er32(PRC1522);
6356 } 6245 }
6357 6246
6358 temp = E1000_READ_REG(hw, GPRC); 6247 temp = er32(GPRC);
6359 temp = E1000_READ_REG(hw, BPRC); 6248 temp = er32(BPRC);
6360 temp = E1000_READ_REG(hw, MPRC); 6249 temp = er32(MPRC);
6361 temp = E1000_READ_REG(hw, GPTC); 6250 temp = er32(GPTC);
6362 temp = E1000_READ_REG(hw, GORCL); 6251 temp = er32(GORCL);
6363 temp = E1000_READ_REG(hw, GORCH); 6252 temp = er32(GORCH);
6364 temp = E1000_READ_REG(hw, GOTCL); 6253 temp = er32(GOTCL);
6365 temp = E1000_READ_REG(hw, GOTCH); 6254 temp = er32(GOTCH);
6366 temp = E1000_READ_REG(hw, RNBC); 6255 temp = er32(RNBC);
6367 temp = E1000_READ_REG(hw, RUC); 6256 temp = er32(RUC);
6368 temp = E1000_READ_REG(hw, RFC); 6257 temp = er32(RFC);
6369 temp = E1000_READ_REG(hw, ROC); 6258 temp = er32(ROC);
6370 temp = E1000_READ_REG(hw, RJC); 6259 temp = er32(RJC);
6371 temp = E1000_READ_REG(hw, TORL); 6260 temp = er32(TORL);
6372 temp = E1000_READ_REG(hw, TORH); 6261 temp = er32(TORH);
6373 temp = E1000_READ_REG(hw, TOTL); 6262 temp = er32(TOTL);
6374 temp = E1000_READ_REG(hw, TOTH); 6263 temp = er32(TOTH);
6375 temp = E1000_READ_REG(hw, TPR); 6264 temp = er32(TPR);
6376 temp = E1000_READ_REG(hw, TPT); 6265 temp = er32(TPT);
6377 6266
6378 if (hw->mac_type != e1000_ich8lan) { 6267 if (hw->mac_type != e1000_ich8lan) {
6379 temp = E1000_READ_REG(hw, PTC64); 6268 temp = er32(PTC64);
6380 temp = E1000_READ_REG(hw, PTC127); 6269 temp = er32(PTC127);
6381 temp = E1000_READ_REG(hw, PTC255); 6270 temp = er32(PTC255);
6382 temp = E1000_READ_REG(hw, PTC511); 6271 temp = er32(PTC511);
6383 temp = E1000_READ_REG(hw, PTC1023); 6272 temp = er32(PTC1023);
6384 temp = E1000_READ_REG(hw, PTC1522); 6273 temp = er32(PTC1522);
6385 } 6274 }
6386 6275
6387 temp = E1000_READ_REG(hw, MPTC); 6276 temp = er32(MPTC);
6388 temp = E1000_READ_REG(hw, BPTC); 6277 temp = er32(BPTC);
6389 6278
6390 if (hw->mac_type < e1000_82543) return; 6279 if (hw->mac_type < e1000_82543) return;
6391 6280
6392 temp = E1000_READ_REG(hw, ALGNERRC); 6281 temp = er32(ALGNERRC);
6393 temp = E1000_READ_REG(hw, RXERRC); 6282 temp = er32(RXERRC);
6394 temp = E1000_READ_REG(hw, TNCRS); 6283 temp = er32(TNCRS);
6395 temp = E1000_READ_REG(hw, CEXTERR); 6284 temp = er32(CEXTERR);
6396 temp = E1000_READ_REG(hw, TSCTC); 6285 temp = er32(TSCTC);
6397 temp = E1000_READ_REG(hw, TSCTFC); 6286 temp = er32(TSCTFC);
6398 6287
6399 if (hw->mac_type <= e1000_82544) return; 6288 if (hw->mac_type <= e1000_82544) return;
6400 6289
6401 temp = E1000_READ_REG(hw, MGTPRC); 6290 temp = er32(MGTPRC);
6402 temp = E1000_READ_REG(hw, MGTPDC); 6291 temp = er32(MGTPDC);
6403 temp = E1000_READ_REG(hw, MGTPTC); 6292 temp = er32(MGTPTC);
6404 6293
6405 if (hw->mac_type <= e1000_82547_rev_2) return; 6294 if (hw->mac_type <= e1000_82547_rev_2) return;
6406 6295
6407 temp = E1000_READ_REG(hw, IAC); 6296 temp = er32(IAC);
6408 temp = E1000_READ_REG(hw, ICRXOC); 6297 temp = er32(ICRXOC);
6409 6298
6410 if (hw->mac_type == e1000_ich8lan) return; 6299 if (hw->mac_type == e1000_ich8lan) return;
6411 6300
6412 temp = E1000_READ_REG(hw, ICRXPTC); 6301 temp = er32(ICRXPTC);
6413 temp = E1000_READ_REG(hw, ICRXATC); 6302 temp = er32(ICRXATC);
6414 temp = E1000_READ_REG(hw, ICTXPTC); 6303 temp = er32(ICTXPTC);
6415 temp = E1000_READ_REG(hw, ICTXATC); 6304 temp = er32(ICTXATC);
6416 temp = E1000_READ_REG(hw, ICTXQEC); 6305 temp = er32(ICTXQEC);
6417 temp = E1000_READ_REG(hw, ICTXQMTC); 6306 temp = er32(ICTXQMTC);
6418 temp = E1000_READ_REG(hw, ICRXDMTC); 6307 temp = er32(ICRXDMTC);
6419} 6308}
6420 6309
6421/****************************************************************************** 6310/******************************************************************************
@@ -6428,8 +6317,7 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw)
6428 * current_ifs_val, ifs_min_val, ifs_max_val, ifs_step_size, and ifs_ratio 6317 * current_ifs_val, ifs_min_val, ifs_max_val, ifs_step_size, and ifs_ratio
6429 * before calling this function. 6318 * before calling this function.
6430 *****************************************************************************/ 6319 *****************************************************************************/
6431void 6320void e1000_reset_adaptive(struct e1000_hw *hw)
6432e1000_reset_adaptive(struct e1000_hw *hw)
6433{ 6321{
6434 DEBUGFUNC("e1000_reset_adaptive"); 6322 DEBUGFUNC("e1000_reset_adaptive");
6435 6323
@@ -6442,7 +6330,7 @@ e1000_reset_adaptive(struct e1000_hw *hw)
6442 hw->ifs_ratio = IFS_RATIO; 6330 hw->ifs_ratio = IFS_RATIO;
6443 } 6331 }
6444 hw->in_ifs_mode = false; 6332 hw->in_ifs_mode = false;
6445 E1000_WRITE_REG(hw, AIT, 0); 6333 ew32(AIT, 0);
6446 } else { 6334 } else {
6447 DEBUGOUT("Not in Adaptive IFS mode!\n"); 6335 DEBUGOUT("Not in Adaptive IFS mode!\n");
6448 } 6336 }
@@ -6456,8 +6344,7 @@ e1000_reset_adaptive(struct e1000_hw *hw)
6456 * tx_packets - Number of transmits since last callback 6344 * tx_packets - Number of transmits since last callback
6457 * total_collisions - Number of collisions since last callback 6345 * total_collisions - Number of collisions since last callback
6458 *****************************************************************************/ 6346 *****************************************************************************/
6459void 6347void e1000_update_adaptive(struct e1000_hw *hw)
6460e1000_update_adaptive(struct e1000_hw *hw)
6461{ 6348{
6462 DEBUGFUNC("e1000_update_adaptive"); 6349 DEBUGFUNC("e1000_update_adaptive");
6463 6350
@@ -6470,14 +6357,14 @@ e1000_update_adaptive(struct e1000_hw *hw)
6470 hw->current_ifs_val = hw->ifs_min_val; 6357 hw->current_ifs_val = hw->ifs_min_val;
6471 else 6358 else
6472 hw->current_ifs_val += hw->ifs_step_size; 6359 hw->current_ifs_val += hw->ifs_step_size;
6473 E1000_WRITE_REG(hw, AIT, hw->current_ifs_val); 6360 ew32(AIT, hw->current_ifs_val);
6474 } 6361 }
6475 } 6362 }
6476 } else { 6363 } else {
6477 if (hw->in_ifs_mode && (hw->tx_packet_delta <= MIN_NUM_XMITS)) { 6364 if (hw->in_ifs_mode && (hw->tx_packet_delta <= MIN_NUM_XMITS)) {
6478 hw->current_ifs_val = 0; 6365 hw->current_ifs_val = 0;
6479 hw->in_ifs_mode = false; 6366 hw->in_ifs_mode = false;
6480 E1000_WRITE_REG(hw, AIT, 0); 6367 ew32(AIT, 0);
6481 } 6368 }
6482 } 6369 }
6483 } else { 6370 } else {
@@ -6492,11 +6379,8 @@ e1000_update_adaptive(struct e1000_hw *hw)
6492 * frame_len - The length of the frame in question 6379 * frame_len - The length of the frame in question
6493 * mac_addr - The Ethernet destination address of the frame in question 6380 * mac_addr - The Ethernet destination address of the frame in question
6494 *****************************************************************************/ 6381 *****************************************************************************/
6495void 6382void e1000_tbi_adjust_stats(struct e1000_hw *hw, struct e1000_hw_stats *stats,
6496e1000_tbi_adjust_stats(struct e1000_hw *hw, 6383 u32 frame_len, u8 *mac_addr)
6497 struct e1000_hw_stats *stats,
6498 u32 frame_len,
6499 u8 *mac_addr)
6500{ 6384{
6501 u64 carry_bit; 6385 u64 carry_bit;
6502 6386
@@ -6527,7 +6411,7 @@ e1000_tbi_adjust_stats(struct e1000_hw *hw,
6527 * since the test for a multicast frame will test positive on 6411 * since the test for a multicast frame will test positive on
6528 * a broadcast frame. 6412 * a broadcast frame.
6529 */ 6413 */
6530 if ((mac_addr[0] == (u8) 0xff) && (mac_addr[1] == (u8) 0xff)) 6414 if ((mac_addr[0] == (u8)0xff) && (mac_addr[1] == (u8)0xff))
6531 /* Broadcast packet */ 6415 /* Broadcast packet */
6532 stats->bprc++; 6416 stats->bprc++;
6533 else if (*mac_addr & 0x01) 6417 else if (*mac_addr & 0x01)
@@ -6570,8 +6454,7 @@ e1000_tbi_adjust_stats(struct e1000_hw *hw,
6570 * 6454 *
6571 * hw - Struct containing variables accessed by shared code 6455 * hw - Struct containing variables accessed by shared code
6572 *****************************************************************************/ 6456 *****************************************************************************/
6573void 6457void e1000_get_bus_info(struct e1000_hw *hw)
6574e1000_get_bus_info(struct e1000_hw *hw)
6575{ 6458{
6576 s32 ret_val; 6459 s32 ret_val;
6577 u16 pci_ex_link_status; 6460 u16 pci_ex_link_status;
@@ -6605,7 +6488,7 @@ e1000_get_bus_info(struct e1000_hw *hw)
6605 hw->bus_width = e1000_bus_width_pciex_1; 6488 hw->bus_width = e1000_bus_width_pciex_1;
6606 break; 6489 break;
6607 default: 6490 default:
6608 status = E1000_READ_REG(hw, STATUS); 6491 status = er32(STATUS);
6609 hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ? 6492 hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
6610 e1000_bus_type_pcix : e1000_bus_type_pci; 6493 e1000_bus_type_pcix : e1000_bus_type_pci;
6611 6494
@@ -6645,10 +6528,7 @@ e1000_get_bus_info(struct e1000_hw *hw)
6645 * offset - offset to write to 6528 * offset - offset to write to
6646 * value - value to write 6529 * value - value to write
6647 *****************************************************************************/ 6530 *****************************************************************************/
6648static void 6531static void e1000_write_reg_io(struct e1000_hw *hw, u32 offset, u32 value)
6649e1000_write_reg_io(struct e1000_hw *hw,
6650 u32 offset,
6651 u32 value)
6652{ 6532{
6653 unsigned long io_addr = hw->io_base; 6533 unsigned long io_addr = hw->io_base;
6654 unsigned long io_data = hw->io_base + 4; 6534 unsigned long io_data = hw->io_base + 4;
@@ -6672,10 +6552,8 @@ e1000_write_reg_io(struct e1000_hw *hw,
6672 * register to the minimum and maximum range. 6552 * register to the minimum and maximum range.
6673 * For IGP phy's, the function calculates the range by the AGC registers. 6553 * For IGP phy's, the function calculates the range by the AGC registers.
6674 *****************************************************************************/ 6554 *****************************************************************************/
6675static s32 6555static s32 e1000_get_cable_length(struct e1000_hw *hw, u16 *min_length,
6676e1000_get_cable_length(struct e1000_hw *hw, 6556 u16 *max_length)
6677 u16 *min_length,
6678 u16 *max_length)
6679{ 6557{
6680 s32 ret_val; 6558 s32 ret_val;
6681 u16 agc_value = 0; 6559 u16 agc_value = 0;
@@ -6863,9 +6741,8 @@ e1000_get_cable_length(struct e1000_hw *hw,
6863 * return 0. If the link speed is 1000 Mbps the polarity status is in the 6741 * return 0. If the link speed is 1000 Mbps the polarity status is in the
6864 * IGP01E1000_PHY_PCS_INIT_REG. 6742 * IGP01E1000_PHY_PCS_INIT_REG.
6865 *****************************************************************************/ 6743 *****************************************************************************/
6866static s32 6744static s32 e1000_check_polarity(struct e1000_hw *hw,
6867e1000_check_polarity(struct e1000_hw *hw, 6745 e1000_rev_polarity *polarity)
6868 e1000_rev_polarity *polarity)
6869{ 6746{
6870 s32 ret_val; 6747 s32 ret_val;
6871 u16 phy_data; 6748 u16 phy_data;
@@ -6939,8 +6816,7 @@ e1000_check_polarity(struct e1000_hw *hw,
6939 * Link Health register. In IGP this bit is latched high, so the driver must 6816 * Link Health register. In IGP this bit is latched high, so the driver must
6940 * read it immediately after link is established. 6817 * read it immediately after link is established.
6941 *****************************************************************************/ 6818 *****************************************************************************/
6942static s32 6819static s32 e1000_check_downshift(struct e1000_hw *hw)
6943e1000_check_downshift(struct e1000_hw *hw)
6944{ 6820{
6945 s32 ret_val; 6821 s32 ret_val;
6946 u16 phy_data; 6822 u16 phy_data;
@@ -6985,9 +6861,7 @@ e1000_check_downshift(struct e1000_hw *hw)
6985 * 6861 *
6986 ****************************************************************************/ 6862 ****************************************************************************/
6987 6863
6988static s32 6864static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw, bool link_up)
6989e1000_config_dsp_after_link_change(struct e1000_hw *hw,
6990 bool link_up)
6991{ 6865{
6992 s32 ret_val; 6866 s32 ret_val;
6993 u16 phy_data, phy_saved_data, speed, duplex, i; 6867 u16 phy_data, phy_saved_data, speed, duplex, i;
@@ -7173,8 +7047,7 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw,
7173 * 7047 *
7174 * hw - Struct containing variables accessed by shared code 7048 * hw - Struct containing variables accessed by shared code
7175 ****************************************************************************/ 7049 ****************************************************************************/
7176static s32 7050static s32 e1000_set_phy_mode(struct e1000_hw *hw)
7177e1000_set_phy_mode(struct e1000_hw *hw)
7178{ 7051{
7179 s32 ret_val; 7052 s32 ret_val;
7180 u16 eeprom_data; 7053 u16 eeprom_data;
@@ -7218,9 +7091,7 @@ e1000_set_phy_mode(struct e1000_hw *hw)
7218 * 7091 *
7219 ****************************************************************************/ 7092 ****************************************************************************/
7220 7093
7221static s32 7094static s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active)
7222e1000_set_d3_lplu_state(struct e1000_hw *hw,
7223 bool active)
7224{ 7095{
7225 u32 phy_ctrl = 0; 7096 u32 phy_ctrl = 0;
7226 s32 ret_val; 7097 s32 ret_val;
@@ -7242,7 +7113,7 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
7242 /* MAC writes into PHY register based on the state transition 7113 /* MAC writes into PHY register based on the state transition
7243 * and start auto-negotiation. SW driver can overwrite the settings 7114 * and start auto-negotiation. SW driver can overwrite the settings
7244 * in CSR PHY power control E1000_PHY_CTRL register. */ 7115 * in CSR PHY power control E1000_PHY_CTRL register. */
7245 phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); 7116 phy_ctrl = er32(PHY_CTRL);
7246 } else { 7117 } else {
7247 ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data); 7118 ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
7248 if (ret_val) 7119 if (ret_val)
@@ -7259,7 +7130,7 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
7259 } else { 7130 } else {
7260 if (hw->mac_type == e1000_ich8lan) { 7131 if (hw->mac_type == e1000_ich8lan) {
7261 phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU; 7132 phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU;
7262 E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 7133 ew32(PHY_CTRL, phy_ctrl);
7263 } else { 7134 } else {
7264 phy_data &= ~IGP02E1000_PM_D3_LPLU; 7135 phy_data &= ~IGP02E1000_PM_D3_LPLU;
7265 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, 7136 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
@@ -7310,7 +7181,7 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
7310 } else { 7181 } else {
7311 if (hw->mac_type == e1000_ich8lan) { 7182 if (hw->mac_type == e1000_ich8lan) {
7312 phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU; 7183 phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU;
7313 E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 7184 ew32(PHY_CTRL, phy_ctrl);
7314 } else { 7185 } else {
7315 phy_data |= IGP02E1000_PM_D3_LPLU; 7186 phy_data |= IGP02E1000_PM_D3_LPLU;
7316 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, 7187 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
@@ -7348,9 +7219,7 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
7348 * 7219 *
7349 ****************************************************************************/ 7220 ****************************************************************************/
7350 7221
7351static s32 7222static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active)
7352e1000_set_d0_lplu_state(struct e1000_hw *hw,
7353 bool active)
7354{ 7223{
7355 u32 phy_ctrl = 0; 7224 u32 phy_ctrl = 0;
7356 s32 ret_val; 7225 s32 ret_val;
@@ -7361,7 +7230,7 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
7361 return E1000_SUCCESS; 7230 return E1000_SUCCESS;
7362 7231
7363 if (hw->mac_type == e1000_ich8lan) { 7232 if (hw->mac_type == e1000_ich8lan) {
7364 phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); 7233 phy_ctrl = er32(PHY_CTRL);
7365 } else { 7234 } else {
7366 ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data); 7235 ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
7367 if (ret_val) 7236 if (ret_val)
@@ -7371,7 +7240,7 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
7371 if (!active) { 7240 if (!active) {
7372 if (hw->mac_type == e1000_ich8lan) { 7241 if (hw->mac_type == e1000_ich8lan) {
7373 phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU; 7242 phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU;
7374 E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 7243 ew32(PHY_CTRL, phy_ctrl);
7375 } else { 7244 } else {
7376 phy_data &= ~IGP02E1000_PM_D0_LPLU; 7245 phy_data &= ~IGP02E1000_PM_D0_LPLU;
7377 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data); 7246 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
@@ -7412,7 +7281,7 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
7412 7281
7413 if (hw->mac_type == e1000_ich8lan) { 7282 if (hw->mac_type == e1000_ich8lan) {
7414 phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU; 7283 phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU;
7415 E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 7284 ew32(PHY_CTRL, phy_ctrl);
7416 } else { 7285 } else {
7417 phy_data |= IGP02E1000_PM_D0_LPLU; 7286 phy_data |= IGP02E1000_PM_D0_LPLU;
7418 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data); 7287 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
@@ -7439,8 +7308,7 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
7439 * 7308 *
7440 * hw - Struct containing variables accessed by shared code 7309 * hw - Struct containing variables accessed by shared code
7441 *****************************************************************************/ 7310 *****************************************************************************/
7442static s32 7311static s32 e1000_set_vco_speed(struct e1000_hw *hw)
7443e1000_set_vco_speed(struct e1000_hw *hw)
7444{ 7312{
7445 s32 ret_val; 7313 s32 ret_val;
7446 u16 default_page = 0; 7314 u16 default_page = 0;
@@ -7503,8 +7371,7 @@ e1000_set_vco_speed(struct e1000_hw *hw)
7503 * 7371 *
7504 * returns: - E1000_SUCCESS . 7372 * returns: - E1000_SUCCESS .
7505 ****************************************************************************/ 7373 ****************************************************************************/
7506static s32 7374static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer)
7507e1000_host_if_read_cookie(struct e1000_hw * hw, u8 *buffer)
7508{ 7375{
7509 u8 i; 7376 u8 i;
7510 u32 offset = E1000_MNG_DHCP_COOKIE_OFFSET; 7377 u32 offset = E1000_MNG_DHCP_COOKIE_OFFSET;
@@ -7514,7 +7381,7 @@ e1000_host_if_read_cookie(struct e1000_hw * hw, u8 *buffer)
7514 offset = (offset >> 2); 7381 offset = (offset >> 2);
7515 7382
7516 for (i = 0; i < length; i++) { 7383 for (i = 0; i < length; i++) {
7517 *((u32 *) buffer + i) = 7384 *((u32 *)buffer + i) =
7518 E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset + i); 7385 E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset + i);
7519 } 7386 }
7520 return E1000_SUCCESS; 7387 return E1000_SUCCESS;
@@ -7530,21 +7397,20 @@ e1000_host_if_read_cookie(struct e1000_hw * hw, u8 *buffer)
7530 * timeout 7397 * timeout
7531 * - E1000_SUCCESS for success. 7398 * - E1000_SUCCESS for success.
7532 ****************************************************************************/ 7399 ****************************************************************************/
7533static s32 7400static s32 e1000_mng_enable_host_if(struct e1000_hw *hw)
7534e1000_mng_enable_host_if(struct e1000_hw * hw)
7535{ 7401{
7536 u32 hicr; 7402 u32 hicr;
7537 u8 i; 7403 u8 i;
7538 7404
7539 /* Check that the host interface is enabled. */ 7405 /* Check that the host interface is enabled. */
7540 hicr = E1000_READ_REG(hw, HICR); 7406 hicr = er32(HICR);
7541 if ((hicr & E1000_HICR_EN) == 0) { 7407 if ((hicr & E1000_HICR_EN) == 0) {
7542 DEBUGOUT("E1000_HOST_EN bit disabled.\n"); 7408 DEBUGOUT("E1000_HOST_EN bit disabled.\n");
7543 return -E1000_ERR_HOST_INTERFACE_COMMAND; 7409 return -E1000_ERR_HOST_INTERFACE_COMMAND;
7544 } 7410 }
7545 /* check the previous command is completed */ 7411 /* check the previous command is completed */
7546 for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) { 7412 for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {
7547 hicr = E1000_READ_REG(hw, HICR); 7413 hicr = er32(HICR);
7548 if (!(hicr & E1000_HICR_C)) 7414 if (!(hicr & E1000_HICR_C))
7549 break; 7415 break;
7550 mdelay(1); 7416 mdelay(1);
@@ -7564,9 +7430,8 @@ e1000_mng_enable_host_if(struct e1000_hw * hw)
7564 * 7430 *
7565 * returns - E1000_SUCCESS for success. 7431 * returns - E1000_SUCCESS for success.
7566 ****************************************************************************/ 7432 ****************************************************************************/
7567static s32 7433static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length,
7568e1000_mng_host_if_write(struct e1000_hw * hw, u8 *buffer, 7434 u16 offset, u8 *sum)
7569 u16 length, u16 offset, u8 *sum)
7570{ 7435{
7571 u8 *tmp; 7436 u8 *tmp;
7572 u8 *bufptr = buffer; 7437 u8 *bufptr = buffer;
@@ -7632,9 +7497,8 @@ e1000_mng_host_if_write(struct e1000_hw * hw, u8 *buffer,
7632 * 7497 *
7633 * returns - E1000_SUCCESS for success. 7498 * returns - E1000_SUCCESS for success.
7634 ****************************************************************************/ 7499 ****************************************************************************/
7635static s32 7500static s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
7636e1000_mng_write_cmd_header(struct e1000_hw * hw, 7501 struct e1000_host_mng_command_header *hdr)
7637 struct e1000_host_mng_command_header * hdr)
7638{ 7502{
7639 u16 i; 7503 u16 i;
7640 u8 sum; 7504 u8 sum;
@@ -7648,7 +7512,7 @@ e1000_mng_write_cmd_header(struct e1000_hw * hw,
7648 sum = hdr->checksum; 7512 sum = hdr->checksum;
7649 hdr->checksum = 0; 7513 hdr->checksum = 0;
7650 7514
7651 buffer = (u8 *) hdr; 7515 buffer = (u8 *)hdr;
7652 i = length; 7516 i = length;
7653 while (i--) 7517 while (i--)
7654 sum += buffer[i]; 7518 sum += buffer[i];
@@ -7658,8 +7522,8 @@ e1000_mng_write_cmd_header(struct e1000_hw * hw,
7658 length >>= 2; 7522 length >>= 2;
7659 /* The device driver writes the relevant command block into the ram area. */ 7523 /* The device driver writes the relevant command block into the ram area. */
7660 for (i = 0; i < length; i++) { 7524 for (i = 0; i < length; i++) {
7661 E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((u32 *) hdr + i)); 7525 E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((u32 *)hdr + i));
7662 E1000_WRITE_FLUSH(hw); 7526 E1000_WRITE_FLUSH();
7663 } 7527 }
7664 7528
7665 return E1000_SUCCESS; 7529 return E1000_SUCCESS;
@@ -7672,14 +7536,13 @@ e1000_mng_write_cmd_header(struct e1000_hw * hw,
7672 * 7536 *
7673 * returns - E1000_SUCCESS for success. 7537 * returns - E1000_SUCCESS for success.
7674 ****************************************************************************/ 7538 ****************************************************************************/
7675static s32 7539static s32 e1000_mng_write_commit(struct e1000_hw *hw)
7676e1000_mng_write_commit(struct e1000_hw * hw)
7677{ 7540{
7678 u32 hicr; 7541 u32 hicr;
7679 7542
7680 hicr = E1000_READ_REG(hw, HICR); 7543 hicr = er32(HICR);
7681 /* Setting this bit tells the ARC that a new command is pending. */ 7544 /* Setting this bit tells the ARC that a new command is pending. */
7682 E1000_WRITE_REG(hw, HICR, hicr | E1000_HICR_C); 7545 ew32(HICR, hicr | E1000_HICR_C);
7683 7546
7684 return E1000_SUCCESS; 7547 return E1000_SUCCESS;
7685} 7548}
@@ -7690,12 +7553,11 @@ e1000_mng_write_commit(struct e1000_hw * hw)
7690 * 7553 *
7691 * returns - true when the mode is IAMT or false. 7554 * returns - true when the mode is IAMT or false.
7692 ****************************************************************************/ 7555 ****************************************************************************/
7693bool 7556bool e1000_check_mng_mode(struct e1000_hw *hw)
7694e1000_check_mng_mode(struct e1000_hw *hw)
7695{ 7557{
7696 u32 fwsm; 7558 u32 fwsm;
7697 7559
7698 fwsm = E1000_READ_REG(hw, FWSM); 7560 fwsm = er32(FWSM);
7699 7561
7700 if (hw->mac_type == e1000_ich8lan) { 7562 if (hw->mac_type == e1000_ich8lan) {
7701 if ((fwsm & E1000_FWSM_MODE_MASK) == 7563 if ((fwsm & E1000_FWSM_MODE_MASK) ==
@@ -7712,9 +7574,7 @@ e1000_check_mng_mode(struct e1000_hw *hw)
7712/***************************************************************************** 7574/*****************************************************************************
7713 * This function writes the dhcp info . 7575 * This function writes the dhcp info .
7714 ****************************************************************************/ 7576 ****************************************************************************/
7715s32 7577s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length)
7716e1000_mng_write_dhcp_info(struct e1000_hw * hw, u8 *buffer,
7717 u16 length)
7718{ 7578{
7719 s32 ret_val; 7579 s32 ret_val;
7720 struct e1000_host_mng_command_header hdr; 7580 struct e1000_host_mng_command_header hdr;
@@ -7744,8 +7604,7 @@ e1000_mng_write_dhcp_info(struct e1000_hw * hw, u8 *buffer,
7744 * 7604 *
7745 * returns - checksum of buffer contents. 7605 * returns - checksum of buffer contents.
7746 ****************************************************************************/ 7606 ****************************************************************************/
7747static u8 7607static u8 e1000_calculate_mng_checksum(char *buffer, u32 length)
7748e1000_calculate_mng_checksum(char *buffer, u32 length)
7749{ 7608{
7750 u8 sum = 0; 7609 u8 sum = 0;
7751 u32 i; 7610 u32 i;
@@ -7756,7 +7615,7 @@ e1000_calculate_mng_checksum(char *buffer, u32 length)
7756 for (i=0; i < length; i++) 7615 for (i=0; i < length; i++)
7757 sum += buffer[i]; 7616 sum += buffer[i];
7758 7617
7759 return (u8) (0 - sum); 7618 return (u8)(0 - sum);
7760} 7619}
7761 7620
7762/***************************************************************************** 7621/*****************************************************************************
@@ -7764,8 +7623,7 @@ e1000_calculate_mng_checksum(char *buffer, u32 length)
7764 * 7623 *
7765 * returns - true for packet filtering or false. 7624 * returns - true for packet filtering or false.
7766 ****************************************************************************/ 7625 ****************************************************************************/
7767bool 7626bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
7768e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
7769{ 7627{
7770 /* called in init as well as watchdog timer functions */ 7628 /* called in init as well as watchdog timer functions */
7771 7629
@@ -7806,21 +7664,20 @@ e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
7806 * returns: - true/false 7664 * returns: - true/false
7807 * 7665 *
7808 *****************************************************************************/ 7666 *****************************************************************************/
7809u32 7667u32 e1000_enable_mng_pass_thru(struct e1000_hw *hw)
7810e1000_enable_mng_pass_thru(struct e1000_hw *hw)
7811{ 7668{
7812 u32 manc; 7669 u32 manc;
7813 u32 fwsm, factps; 7670 u32 fwsm, factps;
7814 7671
7815 if (hw->asf_firmware_present) { 7672 if (hw->asf_firmware_present) {
7816 manc = E1000_READ_REG(hw, MANC); 7673 manc = er32(MANC);
7817 7674
7818 if (!(manc & E1000_MANC_RCV_TCO_EN) || 7675 if (!(manc & E1000_MANC_RCV_TCO_EN) ||
7819 !(manc & E1000_MANC_EN_MAC_ADDR_FILTER)) 7676 !(manc & E1000_MANC_EN_MAC_ADDR_FILTER))
7820 return false; 7677 return false;
7821 if (e1000_arc_subsystem_valid(hw)) { 7678 if (e1000_arc_subsystem_valid(hw)) {
7822 fwsm = E1000_READ_REG(hw, FWSM); 7679 fwsm = er32(FWSM);
7823 factps = E1000_READ_REG(hw, FACTPS); 7680 factps = er32(FACTPS);
7824 7681
7825 if ((((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT) == 7682 if ((((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT) ==
7826 e1000_mng_mode_pt) && !(factps & E1000_FACTPS_MNGCG)) 7683 e1000_mng_mode_pt) && !(factps & E1000_FACTPS_MNGCG))
@@ -7832,8 +7689,7 @@ e1000_enable_mng_pass_thru(struct e1000_hw *hw)
7832 return false; 7689 return false;
7833} 7690}
7834 7691
7835static s32 7692static s32 e1000_polarity_reversal_workaround(struct e1000_hw *hw)
7836e1000_polarity_reversal_workaround(struct e1000_hw *hw)
7837{ 7693{
7838 s32 ret_val; 7694 s32 ret_val;
7839 u16 mii_status_reg; 7695 u16 mii_status_reg;
@@ -7926,8 +7782,7 @@ e1000_polarity_reversal_workaround(struct e1000_hw *hw)
7926 * returns: - none. 7782 * returns: - none.
7927 * 7783 *
7928 ***************************************************************************/ 7784 ***************************************************************************/
7929static void 7785static void e1000_set_pci_express_master_disable(struct e1000_hw *hw)
7930e1000_set_pci_express_master_disable(struct e1000_hw *hw)
7931{ 7786{
7932 u32 ctrl; 7787 u32 ctrl;
7933 7788
@@ -7936,9 +7791,9 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw)
7936 if (hw->bus_type != e1000_bus_type_pci_express) 7791 if (hw->bus_type != e1000_bus_type_pci_express)
7937 return; 7792 return;
7938 7793
7939 ctrl = E1000_READ_REG(hw, CTRL); 7794 ctrl = er32(CTRL);
7940 ctrl |= E1000_CTRL_GIO_MASTER_DISABLE; 7795 ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
7941 E1000_WRITE_REG(hw, CTRL, ctrl); 7796 ew32(CTRL, ctrl);
7942} 7797}
7943 7798
7944/******************************************************************************* 7799/*******************************************************************************
@@ -7952,8 +7807,7 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw)
7952 * E1000_SUCCESS master requests disabled. 7807 * E1000_SUCCESS master requests disabled.
7953 * 7808 *
7954 ******************************************************************************/ 7809 ******************************************************************************/
7955s32 7810s32 e1000_disable_pciex_master(struct e1000_hw *hw)
7956e1000_disable_pciex_master(struct e1000_hw *hw)
7957{ 7811{
7958 s32 timeout = MASTER_DISABLE_TIMEOUT; /* 80ms */ 7812 s32 timeout = MASTER_DISABLE_TIMEOUT; /* 80ms */
7959 7813
@@ -7965,7 +7819,7 @@ e1000_disable_pciex_master(struct e1000_hw *hw)
7965 e1000_set_pci_express_master_disable(hw); 7819 e1000_set_pci_express_master_disable(hw);
7966 7820
7967 while (timeout) { 7821 while (timeout) {
7968 if (!(E1000_READ_REG(hw, STATUS) & E1000_STATUS_GIO_MASTER_ENABLE)) 7822 if (!(er32(STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))
7969 break; 7823 break;
7970 else 7824 else
7971 udelay(100); 7825 udelay(100);
@@ -7990,8 +7844,7 @@ e1000_disable_pciex_master(struct e1000_hw *hw)
7990 * E1000_SUCCESS at any other case. 7844 * E1000_SUCCESS at any other case.
7991 * 7845 *
7992 ******************************************************************************/ 7846 ******************************************************************************/
7993static s32 7847static s32 e1000_get_auto_rd_done(struct e1000_hw *hw)
7994e1000_get_auto_rd_done(struct e1000_hw *hw)
7995{ 7848{
7996 s32 timeout = AUTO_READ_DONE_TIMEOUT; 7849 s32 timeout = AUTO_READ_DONE_TIMEOUT;
7997 7850
@@ -8007,7 +7860,7 @@ e1000_get_auto_rd_done(struct e1000_hw *hw)
8007 case e1000_80003es2lan: 7860 case e1000_80003es2lan:
8008 case e1000_ich8lan: 7861 case e1000_ich8lan:
8009 while (timeout) { 7862 while (timeout) {
8010 if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) 7863 if (er32(EECD) & E1000_EECD_AUTO_RD)
8011 break; 7864 break;
8012 else msleep(1); 7865 else msleep(1);
8013 timeout--; 7866 timeout--;
@@ -8038,8 +7891,7 @@ e1000_get_auto_rd_done(struct e1000_hw *hw)
8038 * E1000_SUCCESS at any other case. 7891 * E1000_SUCCESS at any other case.
8039 * 7892 *
8040 ***************************************************************************/ 7893 ***************************************************************************/
8041static s32 7894static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw)
8042e1000_get_phy_cfg_done(struct e1000_hw *hw)
8043{ 7895{
8044 s32 timeout = PHY_CFG_TIMEOUT; 7896 s32 timeout = PHY_CFG_TIMEOUT;
8045 u32 cfg_mask = E1000_EEPROM_CFG_DONE; 7897 u32 cfg_mask = E1000_EEPROM_CFG_DONE;
@@ -8052,13 +7904,13 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)
8052 break; 7904 break;
8053 case e1000_80003es2lan: 7905 case e1000_80003es2lan:
8054 /* Separate *_CFG_DONE_* bit for each port */ 7906 /* Separate *_CFG_DONE_* bit for each port */
8055 if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) 7907 if (er32(STATUS) & E1000_STATUS_FUNC_1)
8056 cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1; 7908 cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1;
8057 /* Fall Through */ 7909 /* Fall Through */
8058 case e1000_82571: 7910 case e1000_82571:
8059 case e1000_82572: 7911 case e1000_82572:
8060 while (timeout) { 7912 while (timeout) {
8061 if (E1000_READ_REG(hw, EEMNGCTL) & cfg_mask) 7913 if (er32(EEMNGCTL) & cfg_mask)
8062 break; 7914 break;
8063 else 7915 else
8064 msleep(1); 7916 msleep(1);
@@ -8085,8 +7937,7 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)
8085 * E1000_SUCCESS at any other case. 7937 * E1000_SUCCESS at any other case.
8086 * 7938 *
8087 ***************************************************************************/ 7939 ***************************************************************************/
8088static s32 7940static s32 e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
8089e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
8090{ 7941{
8091 s32 timeout; 7942 s32 timeout;
8092 u32 swsm; 7943 u32 swsm;
@@ -8105,11 +7956,11 @@ e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
8105 /* Get the FW semaphore. */ 7956 /* Get the FW semaphore. */
8106 timeout = hw->eeprom.word_size + 1; 7957 timeout = hw->eeprom.word_size + 1;
8107 while (timeout) { 7958 while (timeout) {
8108 swsm = E1000_READ_REG(hw, SWSM); 7959 swsm = er32(SWSM);
8109 swsm |= E1000_SWSM_SWESMBI; 7960 swsm |= E1000_SWSM_SWESMBI;
8110 E1000_WRITE_REG(hw, SWSM, swsm); 7961 ew32(SWSM, swsm);
8111 /* if we managed to set the bit we got the semaphore. */ 7962 /* if we managed to set the bit we got the semaphore. */
8112 swsm = E1000_READ_REG(hw, SWSM); 7963 swsm = er32(SWSM);
8113 if (swsm & E1000_SWSM_SWESMBI) 7964 if (swsm & E1000_SWSM_SWESMBI)
8114 break; 7965 break;
8115 7966
@@ -8135,8 +7986,7 @@ e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
8135 * returns: - None. 7986 * returns: - None.
8136 * 7987 *
8137 ***************************************************************************/ 7988 ***************************************************************************/
8138static void 7989static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
8139e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
8140{ 7990{
8141 u32 swsm; 7991 u32 swsm;
8142 7992
@@ -8145,13 +7995,13 @@ e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
8145 if (!hw->eeprom_semaphore_present) 7995 if (!hw->eeprom_semaphore_present)
8146 return; 7996 return;
8147 7997
8148 swsm = E1000_READ_REG(hw, SWSM); 7998 swsm = er32(SWSM);
8149 if (hw->mac_type == e1000_80003es2lan) { 7999 if (hw->mac_type == e1000_80003es2lan) {
8150 /* Release both semaphores. */ 8000 /* Release both semaphores. */
8151 swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); 8001 swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
8152 } else 8002 } else
8153 swsm &= ~(E1000_SWSM_SWESMBI); 8003 swsm &= ~(E1000_SWSM_SWESMBI);
8154 E1000_WRITE_REG(hw, SWSM, swsm); 8004 ew32(SWSM, swsm);
8155} 8005}
8156 8006
8157/*************************************************************************** 8007/***************************************************************************
@@ -8164,8 +8014,7 @@ e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
8164 * E1000_SUCCESS at any other case. 8014 * E1000_SUCCESS at any other case.
8165 * 8015 *
8166 ***************************************************************************/ 8016 ***************************************************************************/
8167static s32 8017static s32 e1000_get_software_semaphore(struct e1000_hw *hw)
8168e1000_get_software_semaphore(struct e1000_hw *hw)
8169{ 8018{
8170 s32 timeout = hw->eeprom.word_size + 1; 8019 s32 timeout = hw->eeprom.word_size + 1;
8171 u32 swsm; 8020 u32 swsm;
@@ -8177,7 +8026,7 @@ e1000_get_software_semaphore(struct e1000_hw *hw)
8177 } 8026 }
8178 8027
8179 while (timeout) { 8028 while (timeout) {
8180 swsm = E1000_READ_REG(hw, SWSM); 8029 swsm = er32(SWSM);
8181 /* If SMBI bit cleared, it is now set and we hold the semaphore */ 8030 /* If SMBI bit cleared, it is now set and we hold the semaphore */
8182 if (!(swsm & E1000_SWSM_SMBI)) 8031 if (!(swsm & E1000_SWSM_SMBI))
8183 break; 8032 break;
@@ -8200,8 +8049,7 @@ e1000_get_software_semaphore(struct e1000_hw *hw)
8200 * hw: Struct containing variables accessed by shared code 8049 * hw: Struct containing variables accessed by shared code
8201 * 8050 *
8202 ***************************************************************************/ 8051 ***************************************************************************/
8203static void 8052static void e1000_release_software_semaphore(struct e1000_hw *hw)
8204e1000_release_software_semaphore(struct e1000_hw *hw)
8205{ 8053{
8206 u32 swsm; 8054 u32 swsm;
8207 8055
@@ -8211,10 +8059,10 @@ e1000_release_software_semaphore(struct e1000_hw *hw)
8211 return; 8059 return;
8212 } 8060 }
8213 8061
8214 swsm = E1000_READ_REG(hw, SWSM); 8062 swsm = er32(SWSM);
8215 /* Release the SW semaphores.*/ 8063 /* Release the SW semaphores.*/
8216 swsm &= ~E1000_SWSM_SMBI; 8064 swsm &= ~E1000_SWSM_SMBI;
8217 E1000_WRITE_REG(hw, SWSM, swsm); 8065 ew32(SWSM, swsm);
8218} 8066}
8219 8067
8220/****************************************************************************** 8068/******************************************************************************
@@ -8228,26 +8076,24 @@ e1000_release_software_semaphore(struct e1000_hw *hw)
8228 * E1000_SUCCESS 8076 * E1000_SUCCESS
8229 * 8077 *
8230 *****************************************************************************/ 8078 *****************************************************************************/
8231s32 8079s32 e1000_check_phy_reset_block(struct e1000_hw *hw)
8232e1000_check_phy_reset_block(struct e1000_hw *hw)
8233{ 8080{
8234 u32 manc = 0; 8081 u32 manc = 0;
8235 u32 fwsm = 0; 8082 u32 fwsm = 0;
8236 8083
8237 if (hw->mac_type == e1000_ich8lan) { 8084 if (hw->mac_type == e1000_ich8lan) {
8238 fwsm = E1000_READ_REG(hw, FWSM); 8085 fwsm = er32(FWSM);
8239 return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS 8086 return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS
8240 : E1000_BLK_PHY_RESET; 8087 : E1000_BLK_PHY_RESET;
8241 } 8088 }
8242 8089
8243 if (hw->mac_type > e1000_82547_rev_2) 8090 if (hw->mac_type > e1000_82547_rev_2)
8244 manc = E1000_READ_REG(hw, MANC); 8091 manc = er32(MANC);
8245 return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? 8092 return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ?
8246 E1000_BLK_PHY_RESET : E1000_SUCCESS; 8093 E1000_BLK_PHY_RESET : E1000_SUCCESS;
8247} 8094}
8248 8095
8249static u8 8096static u8 e1000_arc_subsystem_valid(struct e1000_hw *hw)
8250e1000_arc_subsystem_valid(struct e1000_hw *hw)
8251{ 8097{
8252 u32 fwsm; 8098 u32 fwsm;
8253 8099
@@ -8261,7 +8107,7 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw)
8261 case e1000_82572: 8107 case e1000_82572:
8262 case e1000_82573: 8108 case e1000_82573:
8263 case e1000_80003es2lan: 8109 case e1000_80003es2lan:
8264 fwsm = E1000_READ_REG(hw, FWSM); 8110 fwsm = er32(FWSM);
8265 if ((fwsm & E1000_FWSM_MODE_MASK) != 0) 8111 if ((fwsm & E1000_FWSM_MODE_MASK) != 0)
8266 return true; 8112 return true;
8267 break; 8113 break;
@@ -8283,8 +8129,7 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw)
8283 * returns: E1000_SUCCESS 8129 * returns: E1000_SUCCESS
8284 * 8130 *
8285 *****************************************************************************/ 8131 *****************************************************************************/
8286static s32 8132static s32 e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, u32 no_snoop)
8287e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, u32 no_snoop)
8288{ 8133{
8289 u32 gcr_reg = 0; 8134 u32 gcr_reg = 0;
8290 8135
@@ -8297,19 +8142,19 @@ e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, u32 no_snoop)
8297 return E1000_SUCCESS; 8142 return E1000_SUCCESS;
8298 8143
8299 if (no_snoop) { 8144 if (no_snoop) {
8300 gcr_reg = E1000_READ_REG(hw, GCR); 8145 gcr_reg = er32(GCR);
8301 gcr_reg &= ~(PCI_EX_NO_SNOOP_ALL); 8146 gcr_reg &= ~(PCI_EX_NO_SNOOP_ALL);
8302 gcr_reg |= no_snoop; 8147 gcr_reg |= no_snoop;
8303 E1000_WRITE_REG(hw, GCR, gcr_reg); 8148 ew32(GCR, gcr_reg);
8304 } 8149 }
8305 if (hw->mac_type == e1000_ich8lan) { 8150 if (hw->mac_type == e1000_ich8lan) {
8306 u32 ctrl_ext; 8151 u32 ctrl_ext;
8307 8152
8308 E1000_WRITE_REG(hw, GCR, PCI_EX_82566_SNOOP_ALL); 8153 ew32(GCR, PCI_EX_82566_SNOOP_ALL);
8309 8154
8310 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 8155 ctrl_ext = er32(CTRL_EXT);
8311 ctrl_ext |= E1000_CTRL_EXT_RO_DIS; 8156 ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
8312 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 8157 ew32(CTRL_EXT, ctrl_ext);
8313 } 8158 }
8314 8159
8315 return E1000_SUCCESS; 8160 return E1000_SUCCESS;
@@ -8324,8 +8169,7 @@ e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, u32 no_snoop)
8324 * hw: Struct containing variables accessed by shared code 8169 * hw: Struct containing variables accessed by shared code
8325 * 8170 *
8326 ***************************************************************************/ 8171 ***************************************************************************/
8327static s32 8172static s32 e1000_get_software_flag(struct e1000_hw *hw)
8328e1000_get_software_flag(struct e1000_hw *hw)
8329{ 8173{
8330 s32 timeout = PHY_CFG_TIMEOUT; 8174 s32 timeout = PHY_CFG_TIMEOUT;
8331 u32 extcnf_ctrl; 8175 u32 extcnf_ctrl;
@@ -8334,11 +8178,11 @@ e1000_get_software_flag(struct e1000_hw *hw)
8334 8178
8335 if (hw->mac_type == e1000_ich8lan) { 8179 if (hw->mac_type == e1000_ich8lan) {
8336 while (timeout) { 8180 while (timeout) {
8337 extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL); 8181 extcnf_ctrl = er32(EXTCNF_CTRL);
8338 extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; 8182 extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
8339 E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl); 8183 ew32(EXTCNF_CTRL, extcnf_ctrl);
8340 8184
8341 extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL); 8185 extcnf_ctrl = er32(EXTCNF_CTRL);
8342 if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) 8186 if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
8343 break; 8187 break;
8344 mdelay(1); 8188 mdelay(1);
@@ -8363,17 +8207,16 @@ e1000_get_software_flag(struct e1000_hw *hw)
8363 * hw: Struct containing variables accessed by shared code 8207 * hw: Struct containing variables accessed by shared code
8364 * 8208 *
8365 ***************************************************************************/ 8209 ***************************************************************************/
8366static void 8210static void e1000_release_software_flag(struct e1000_hw *hw)
8367e1000_release_software_flag(struct e1000_hw *hw)
8368{ 8211{
8369 u32 extcnf_ctrl; 8212 u32 extcnf_ctrl;
8370 8213
8371 DEBUGFUNC("e1000_release_software_flag"); 8214 DEBUGFUNC("e1000_release_software_flag");
8372 8215
8373 if (hw->mac_type == e1000_ich8lan) { 8216 if (hw->mac_type == e1000_ich8lan) {
8374 extcnf_ctrl= E1000_READ_REG(hw, EXTCNF_CTRL); 8217 extcnf_ctrl= er32(EXTCNF_CTRL);
8375 extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; 8218 extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
8376 E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl); 8219 ew32(EXTCNF_CTRL, extcnf_ctrl);
8377 } 8220 }
8378 8221
8379 return; 8222 return;
@@ -8388,9 +8231,8 @@ e1000_release_software_flag(struct e1000_hw *hw)
8388 * data - word read from the EEPROM 8231 * data - word read from the EEPROM
8389 * words - number of words to read 8232 * words - number of words to read
8390 *****************************************************************************/ 8233 *****************************************************************************/
8391static s32 8234static s32 e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8392e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words, 8235 u16 *data)
8393 u16 *data)
8394{ 8236{
8395 s32 error = E1000_SUCCESS; 8237 s32 error = E1000_SUCCESS;
8396 u32 flash_bank = 0; 8238 u32 flash_bank = 0;
@@ -8405,7 +8247,7 @@ e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8405 * to be updated with each read. 8247 * to be updated with each read.
8406 */ 8248 */
8407 /* Value of bit 22 corresponds to the flash bank we're on. */ 8249 /* Value of bit 22 corresponds to the flash bank we're on. */
8408 flash_bank = (E1000_READ_REG(hw, EECD) & E1000_EECD_SEC1VAL) ? 1 : 0; 8250 flash_bank = (er32(EECD) & E1000_EECD_SEC1VAL) ? 1 : 0;
8409 8251
8410 /* Adjust offset appropriately if we're on bank 1 - adjust for word size */ 8252 /* Adjust offset appropriately if we're on bank 1 - adjust for word size */
8411 bank_offset = flash_bank * (hw->flash_bank_size * 2); 8253 bank_offset = flash_bank * (hw->flash_bank_size * 2);
@@ -8444,9 +8286,8 @@ e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8444 * words - number of words to write 8286 * words - number of words to write
8445 * data - words to write to the EEPROM 8287 * data - words to write to the EEPROM
8446 *****************************************************************************/ 8288 *****************************************************************************/
8447static s32 8289static s32 e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8448e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words, 8290 u16 *data)
8449 u16 *data)
8450{ 8291{
8451 u32 i = 0; 8292 u32 i = 0;
8452 s32 error = E1000_SUCCESS; 8293 s32 error = E1000_SUCCESS;
@@ -8491,8 +8332,7 @@ e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8491 * 8332 *
8492 * hw - The pointer to the hw structure 8333 * hw - The pointer to the hw structure
8493 ****************************************************************************/ 8334 ****************************************************************************/
8494static s32 8335static s32 e1000_ich8_cycle_init(struct e1000_hw *hw)
8495e1000_ich8_cycle_init(struct e1000_hw *hw)
8496{ 8336{
8497 union ich8_hws_flash_status hsfsts; 8337 union ich8_hws_flash_status hsfsts;
8498 s32 error = E1000_ERR_EEPROM; 8338 s32 error = E1000_ERR_EEPROM;
@@ -8558,8 +8398,7 @@ e1000_ich8_cycle_init(struct e1000_hw *hw)
8558 * 8398 *
8559 * hw - The pointer to the hw structure 8399 * hw - The pointer to the hw structure
8560 ****************************************************************************/ 8400 ****************************************************************************/
8561static s32 8401static s32 e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout)
8562e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout)
8563{ 8402{
8564 union ich8_hws_flash_ctrl hsflctl; 8403 union ich8_hws_flash_ctrl hsflctl;
8565 union ich8_hws_flash_status hsfsts; 8404 union ich8_hws_flash_status hsfsts;
@@ -8593,9 +8432,8 @@ e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout)
8593 * size - Size of data to read, 1=byte 2=word 8432 * size - Size of data to read, 1=byte 2=word
8594 * data - Pointer to the word to store the value read. 8433 * data - Pointer to the word to store the value read.
8595 *****************************************************************************/ 8434 *****************************************************************************/
8596static s32 8435static s32 e1000_read_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
8597e1000_read_ich8_data(struct e1000_hw *hw, u32 index, 8436 u16 *data)
8598 u32 size, u16* data)
8599{ 8437{
8600 union ich8_hws_flash_status hsfsts; 8438 union ich8_hws_flash_status hsfsts;
8601 union ich8_hws_flash_ctrl hsflctl; 8439 union ich8_hws_flash_ctrl hsflctl;
@@ -8672,9 +8510,8 @@ e1000_read_ich8_data(struct e1000_hw *hw, u32 index,
8672 * size - Size of data to read, 1=byte 2=word 8510 * size - Size of data to read, 1=byte 2=word
8673 * data - The byte(s) to write to the NVM. 8511 * data - The byte(s) to write to the NVM.
8674 *****************************************************************************/ 8512 *****************************************************************************/
8675static s32 8513static s32 e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
8676e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size, 8514 u16 data)
8677 u16 data)
8678{ 8515{
8679 union ich8_hws_flash_status hsfsts; 8516 union ich8_hws_flash_status hsfsts;
8680 union ich8_hws_flash_ctrl hsflctl; 8517 union ich8_hws_flash_ctrl hsflctl;
@@ -8747,8 +8584,7 @@ e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
8747 * index - The index of the byte to read. 8584 * index - The index of the byte to read.
8748 * data - Pointer to a byte to store the value read. 8585 * data - Pointer to a byte to store the value read.
8749 *****************************************************************************/ 8586 *****************************************************************************/
8750static s32 8587static s32 e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8 *data)
8751e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8* data)
8752{ 8588{
8753 s32 status = E1000_SUCCESS; 8589 s32 status = E1000_SUCCESS;
8754 u16 word = 0; 8590 u16 word = 0;
@@ -8770,8 +8606,7 @@ e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8* data)
8770 * index - The index of the byte to write. 8606 * index - The index of the byte to write.
8771 * byte - The byte to write to the NVM. 8607 * byte - The byte to write to the NVM.
8772 *****************************************************************************/ 8608 *****************************************************************************/
8773static s32 8609static s32 e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte)
8774e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte)
8775{ 8610{
8776 s32 error = E1000_SUCCESS; 8611 s32 error = E1000_SUCCESS;
8777 s32 program_retries = 0; 8612 s32 program_retries = 0;
@@ -8803,8 +8638,7 @@ e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte)
8803 * index - The index of the byte to read. 8638 * index - The index of the byte to read.
8804 * data - The byte to write to the NVM. 8639 * data - The byte to write to the NVM.
8805 *****************************************************************************/ 8640 *****************************************************************************/
8806static s32 8641static s32 e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 data)
8807e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 data)
8808{ 8642{
8809 s32 status = E1000_SUCCESS; 8643 s32 status = E1000_SUCCESS;
8810 u16 word = (u16)data; 8644 u16 word = (u16)data;
@@ -8821,8 +8655,7 @@ e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 data)
8821 * index - The starting byte index of the word to read. 8655 * index - The starting byte index of the word to read.
8822 * data - Pointer to a word to store the value read. 8656 * data - Pointer to a word to store the value read.
8823 *****************************************************************************/ 8657 *****************************************************************************/
8824static s32 8658static s32 e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data)
8825e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data)
8826{ 8659{
8827 s32 status = E1000_SUCCESS; 8660 s32 status = E1000_SUCCESS;
8828 status = e1000_read_ich8_data(hw, index, 2, data); 8661 status = e1000_read_ich8_data(hw, index, 2, data);
@@ -8840,8 +8673,7 @@ e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data)
8840 * amount of NVM used in each bank is a *minimum* of 4 KBytes, but in fact the 8673 * amount of NVM used in each bank is a *minimum* of 4 KBytes, but in fact the
8841 * bank size may be 4, 8 or 64 KBytes 8674 * bank size may be 4, 8 or 64 KBytes
8842 *****************************************************************************/ 8675 *****************************************************************************/
8843static s32 8676static s32 e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank)
8844e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank)
8845{ 8677{
8846 union ich8_hws_flash_status hsfsts; 8678 union ich8_hws_flash_status hsfsts;
8847 union ich8_hws_flash_ctrl hsflctl; 8679 union ich8_hws_flash_ctrl hsflctl;
@@ -8930,9 +8762,9 @@ e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank)
8930 return error; 8762 return error;
8931} 8763}
8932 8764
8933static s32 8765static s32 e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
8934e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw, 8766 u32 cnf_base_addr,
8935 u32 cnf_base_addr, u32 cnf_size) 8767 u32 cnf_size)
8936{ 8768{
8937 u32 ret_val = E1000_SUCCESS; 8769 u32 ret_val = E1000_SUCCESS;
8938 u16 word_addr, reg_data, reg_addr; 8770 u16 word_addr, reg_data, reg_addr;
@@ -8972,8 +8804,7 @@ e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
8972 * 8804 *
8973 * hw: Struct containing variables accessed by shared code 8805 * hw: Struct containing variables accessed by shared code
8974 *****************************************************************************/ 8806 *****************************************************************************/
8975static s32 8807static s32 e1000_init_lcd_from_nvm(struct e1000_hw *hw)
8976e1000_init_lcd_from_nvm(struct e1000_hw *hw)
8977{ 8808{
8978 u32 reg_data, cnf_base_addr, cnf_size, ret_val, loop; 8809 u32 reg_data, cnf_base_addr, cnf_size, ret_val, loop;
8979 8810
@@ -8981,32 +8812,32 @@ e1000_init_lcd_from_nvm(struct e1000_hw *hw)
8981 return E1000_SUCCESS; 8812 return E1000_SUCCESS;
8982 8813
8983 /* Check if SW needs configure the PHY */ 8814 /* Check if SW needs configure the PHY */
8984 reg_data = E1000_READ_REG(hw, FEXTNVM); 8815 reg_data = er32(FEXTNVM);
8985 if (!(reg_data & FEXTNVM_SW_CONFIG)) 8816 if (!(reg_data & FEXTNVM_SW_CONFIG))
8986 return E1000_SUCCESS; 8817 return E1000_SUCCESS;
8987 8818
8988 /* Wait for basic configuration completes before proceeding*/ 8819 /* Wait for basic configuration completes before proceeding*/
8989 loop = 0; 8820 loop = 0;
8990 do { 8821 do {
8991 reg_data = E1000_READ_REG(hw, STATUS) & E1000_STATUS_LAN_INIT_DONE; 8822 reg_data = er32(STATUS) & E1000_STATUS_LAN_INIT_DONE;
8992 udelay(100); 8823 udelay(100);
8993 loop++; 8824 loop++;
8994 } while ((!reg_data) && (loop < 50)); 8825 } while ((!reg_data) && (loop < 50));
8995 8826
8996 /* Clear the Init Done bit for the next init event */ 8827 /* Clear the Init Done bit for the next init event */
8997 reg_data = E1000_READ_REG(hw, STATUS); 8828 reg_data = er32(STATUS);
8998 reg_data &= ~E1000_STATUS_LAN_INIT_DONE; 8829 reg_data &= ~E1000_STATUS_LAN_INIT_DONE;
8999 E1000_WRITE_REG(hw, STATUS, reg_data); 8830 ew32(STATUS, reg_data);
9000 8831
9001 /* Make sure HW does not configure LCD from PHY extended configuration 8832 /* Make sure HW does not configure LCD from PHY extended configuration
9002 before SW configuration */ 8833 before SW configuration */
9003 reg_data = E1000_READ_REG(hw, EXTCNF_CTRL); 8834 reg_data = er32(EXTCNF_CTRL);
9004 if ((reg_data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) == 0x0000) { 8835 if ((reg_data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) == 0x0000) {
9005 reg_data = E1000_READ_REG(hw, EXTCNF_SIZE); 8836 reg_data = er32(EXTCNF_SIZE);
9006 cnf_size = reg_data & E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH; 8837 cnf_size = reg_data & E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH;
9007 cnf_size >>= 16; 8838 cnf_size >>= 16;
9008 if (cnf_size) { 8839 if (cnf_size) {
9009 reg_data = E1000_READ_REG(hw, EXTCNF_CTRL); 8840 reg_data = er32(EXTCNF_CTRL);
9010 cnf_base_addr = reg_data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER; 8841 cnf_base_addr = reg_data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER;
9011 /* cnf_base_addr is in DWORD */ 8842 /* cnf_base_addr is in DWORD */
9012 cnf_base_addr >>= 16; 8843 cnf_base_addr >>= 16;
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index cf12b05cd011..ad6da7b67e55 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -31,12 +31,7 @@
31 31
32char e1000_driver_name[] = "e1000"; 32char e1000_driver_name[] = "e1000";
33static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; 33static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
34#ifndef CONFIG_E1000_NAPI 34#define DRV_VERSION "7.3.20-k3-NAPI"
35#define DRIVERNAPI
36#else
37#define DRIVERNAPI "-NAPI"
38#endif
39#define DRV_VERSION "7.3.20-k2"DRIVERNAPI
40const char e1000_driver_version[] = DRV_VERSION; 35const char e1000_driver_version[] = DRV_VERSION;
41static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; 36static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
42 37
@@ -138,7 +133,6 @@ static irqreturn_t e1000_intr(int irq, void *data);
138static irqreturn_t e1000_intr_msi(int irq, void *data); 133static irqreturn_t e1000_intr_msi(int irq, void *data);
139static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, 134static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
140 struct e1000_tx_ring *tx_ring); 135 struct e1000_tx_ring *tx_ring);
141#ifdef CONFIG_E1000_NAPI
142static int e1000_clean(struct napi_struct *napi, int budget); 136static int e1000_clean(struct napi_struct *napi, int budget);
143static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, 137static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
144 struct e1000_rx_ring *rx_ring, 138 struct e1000_rx_ring *rx_ring,
@@ -146,12 +140,6 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
146static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, 140static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
147 struct e1000_rx_ring *rx_ring, 141 struct e1000_rx_ring *rx_ring,
148 int *work_done, int work_to_do); 142 int *work_done, int work_to_do);
149#else
150static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
151 struct e1000_rx_ring *rx_ring);
152static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
153 struct e1000_rx_ring *rx_ring);
154#endif
155static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, 143static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
156 struct e1000_rx_ring *rx_ring, 144 struct e1000_rx_ring *rx_ring,
157 int cleaned_count); 145 int cleaned_count);
@@ -232,8 +220,7 @@ MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
232 * loaded. All it does is register with the PCI subsystem. 220 * loaded. All it does is register with the PCI subsystem.
233 **/ 221 **/
234 222
235static int __init 223static int __init e1000_init_module(void)
236e1000_init_module(void)
237{ 224{
238 int ret; 225 int ret;
239 printk(KERN_INFO "%s - version %s\n", 226 printk(KERN_INFO "%s - version %s\n",
@@ -261,8 +248,7 @@ module_init(e1000_init_module);
261 * from memory. 248 * from memory.
262 **/ 249 **/
263 250
264static void __exit 251static void __exit e1000_exit_module(void)
265e1000_exit_module(void)
266{ 252{
267 pci_unregister_driver(&e1000_driver); 253 pci_unregister_driver(&e1000_driver);
268} 254}
@@ -271,12 +257,13 @@ module_exit(e1000_exit_module);
271 257
272static int e1000_request_irq(struct e1000_adapter *adapter) 258static int e1000_request_irq(struct e1000_adapter *adapter)
273{ 259{
260 struct e1000_hw *hw = &adapter->hw;
274 struct net_device *netdev = adapter->netdev; 261 struct net_device *netdev = adapter->netdev;
275 irq_handler_t handler = e1000_intr; 262 irq_handler_t handler = e1000_intr;
276 int irq_flags = IRQF_SHARED; 263 int irq_flags = IRQF_SHARED;
277 int err; 264 int err;
278 265
279 if (adapter->hw.mac_type >= e1000_82571) { 266 if (hw->mac_type >= e1000_82571) {
280 adapter->have_msi = !pci_enable_msi(adapter->pdev); 267 adapter->have_msi = !pci_enable_msi(adapter->pdev);
281 if (adapter->have_msi) { 268 if (adapter->have_msi) {
282 handler = e1000_intr_msi; 269 handler = e1000_intr_msi;
@@ -311,11 +298,12 @@ static void e1000_free_irq(struct e1000_adapter *adapter)
311 * @adapter: board private structure 298 * @adapter: board private structure
312 **/ 299 **/
313 300
314static void 301static void e1000_irq_disable(struct e1000_adapter *adapter)
315e1000_irq_disable(struct e1000_adapter *adapter)
316{ 302{
317 E1000_WRITE_REG(&adapter->hw, IMC, ~0); 303 struct e1000_hw *hw = &adapter->hw;
318 E1000_WRITE_FLUSH(&adapter->hw); 304
305 ew32(IMC, ~0);
306 E1000_WRITE_FLUSH();
319 synchronize_irq(adapter->pdev->irq); 307 synchronize_irq(adapter->pdev->irq);
320} 308}
321 309
@@ -324,22 +312,23 @@ e1000_irq_disable(struct e1000_adapter *adapter)
324 * @adapter: board private structure 312 * @adapter: board private structure
325 **/ 313 **/
326 314
327static void 315static void e1000_irq_enable(struct e1000_adapter *adapter)
328e1000_irq_enable(struct e1000_adapter *adapter)
329{ 316{
330 E1000_WRITE_REG(&adapter->hw, IMS, IMS_ENABLE_MASK); 317 struct e1000_hw *hw = &adapter->hw;
331 E1000_WRITE_FLUSH(&adapter->hw); 318
319 ew32(IMS, IMS_ENABLE_MASK);
320 E1000_WRITE_FLUSH();
332} 321}
333 322
334static void 323static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
335e1000_update_mng_vlan(struct e1000_adapter *adapter)
336{ 324{
325 struct e1000_hw *hw = &adapter->hw;
337 struct net_device *netdev = adapter->netdev; 326 struct net_device *netdev = adapter->netdev;
338 u16 vid = adapter->hw.mng_cookie.vlan_id; 327 u16 vid = hw->mng_cookie.vlan_id;
339 u16 old_vid = adapter->mng_vlan_id; 328 u16 old_vid = adapter->mng_vlan_id;
340 if (adapter->vlgrp) { 329 if (adapter->vlgrp) {
341 if (!vlan_group_get_device(adapter->vlgrp, vid)) { 330 if (!vlan_group_get_device(adapter->vlgrp, vid)) {
342 if (adapter->hw.mng_cookie.status & 331 if (hw->mng_cookie.status &
343 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) { 332 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
344 e1000_vlan_rx_add_vid(netdev, vid); 333 e1000_vlan_rx_add_vid(netdev, vid);
345 adapter->mng_vlan_id = vid; 334 adapter->mng_vlan_id = vid;
@@ -366,26 +355,24 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter)
366 * 355 *
367 **/ 356 **/
368 357
369static void 358static void e1000_release_hw_control(struct e1000_adapter *adapter)
370e1000_release_hw_control(struct e1000_adapter *adapter)
371{ 359{
372 u32 ctrl_ext; 360 u32 ctrl_ext;
373 u32 swsm; 361 u32 swsm;
362 struct e1000_hw *hw = &adapter->hw;
374 363
375 /* Let firmware taken over control of h/w */ 364 /* Let firmware taken over control of h/w */
376 switch (adapter->hw.mac_type) { 365 switch (hw->mac_type) {
377 case e1000_82573: 366 case e1000_82573:
378 swsm = E1000_READ_REG(&adapter->hw, SWSM); 367 swsm = er32(SWSM);
379 E1000_WRITE_REG(&adapter->hw, SWSM, 368 ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
380 swsm & ~E1000_SWSM_DRV_LOAD);
381 break; 369 break;
382 case e1000_82571: 370 case e1000_82571:
383 case e1000_82572: 371 case e1000_82572:
384 case e1000_80003es2lan: 372 case e1000_80003es2lan:
385 case e1000_ich8lan: 373 case e1000_ich8lan:
386 ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); 374 ctrl_ext = er32(CTRL_EXT);
387 E1000_WRITE_REG(&adapter->hw, CTRL_EXT, 375 ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
388 ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
389 break; 376 break;
390 default: 377 default:
391 break; 378 break;
@@ -403,37 +390,36 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
403 * 390 *
404 **/ 391 **/
405 392
406static void 393static void e1000_get_hw_control(struct e1000_adapter *adapter)
407e1000_get_hw_control(struct e1000_adapter *adapter)
408{ 394{
409 u32 ctrl_ext; 395 u32 ctrl_ext;
410 u32 swsm; 396 u32 swsm;
397 struct e1000_hw *hw = &adapter->hw;
411 398
412 /* Let firmware know the driver has taken over */ 399 /* Let firmware know the driver has taken over */
413 switch (adapter->hw.mac_type) { 400 switch (hw->mac_type) {
414 case e1000_82573: 401 case e1000_82573:
415 swsm = E1000_READ_REG(&adapter->hw, SWSM); 402 swsm = er32(SWSM);
416 E1000_WRITE_REG(&adapter->hw, SWSM, 403 ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
417 swsm | E1000_SWSM_DRV_LOAD);
418 break; 404 break;
419 case e1000_82571: 405 case e1000_82571:
420 case e1000_82572: 406 case e1000_82572:
421 case e1000_80003es2lan: 407 case e1000_80003es2lan:
422 case e1000_ich8lan: 408 case e1000_ich8lan:
423 ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); 409 ctrl_ext = er32(CTRL_EXT);
424 E1000_WRITE_REG(&adapter->hw, CTRL_EXT, 410 ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
425 ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
426 break; 411 break;
427 default: 412 default:
428 break; 413 break;
429 } 414 }
430} 415}
431 416
432static void 417static void e1000_init_manageability(struct e1000_adapter *adapter)
433e1000_init_manageability(struct e1000_adapter *adapter)
434{ 418{
419 struct e1000_hw *hw = &adapter->hw;
420
435 if (adapter->en_mng_pt) { 421 if (adapter->en_mng_pt) {
436 u32 manc = E1000_READ_REG(&adapter->hw, MANC); 422 u32 manc = er32(MANC);
437 423
438 /* disable hardware interception of ARP */ 424 /* disable hardware interception of ARP */
439 manc &= ~(E1000_MANC_ARP_EN); 425 manc &= ~(E1000_MANC_ARP_EN);
@@ -441,37 +427,38 @@ e1000_init_manageability(struct e1000_adapter *adapter)
441 /* enable receiving management packets to the host */ 427 /* enable receiving management packets to the host */
442 /* this will probably generate destination unreachable messages 428 /* this will probably generate destination unreachable messages
443 * from the host OS, but the packets will be handled on SMBUS */ 429 * from the host OS, but the packets will be handled on SMBUS */
444 if (adapter->hw.has_manc2h) { 430 if (hw->has_manc2h) {
445 u32 manc2h = E1000_READ_REG(&adapter->hw, MANC2H); 431 u32 manc2h = er32(MANC2H);
446 432
447 manc |= E1000_MANC_EN_MNG2HOST; 433 manc |= E1000_MANC_EN_MNG2HOST;
448#define E1000_MNG2HOST_PORT_623 (1 << 5) 434#define E1000_MNG2HOST_PORT_623 (1 << 5)
449#define E1000_MNG2HOST_PORT_664 (1 << 6) 435#define E1000_MNG2HOST_PORT_664 (1 << 6)
450 manc2h |= E1000_MNG2HOST_PORT_623; 436 manc2h |= E1000_MNG2HOST_PORT_623;
451 manc2h |= E1000_MNG2HOST_PORT_664; 437 manc2h |= E1000_MNG2HOST_PORT_664;
452 E1000_WRITE_REG(&adapter->hw, MANC2H, manc2h); 438 ew32(MANC2H, manc2h);
453 } 439 }
454 440
455 E1000_WRITE_REG(&adapter->hw, MANC, manc); 441 ew32(MANC, manc);
456 } 442 }
457} 443}
458 444
459static void 445static void e1000_release_manageability(struct e1000_adapter *adapter)
460e1000_release_manageability(struct e1000_adapter *adapter)
461{ 446{
447 struct e1000_hw *hw = &adapter->hw;
448
462 if (adapter->en_mng_pt) { 449 if (adapter->en_mng_pt) {
463 u32 manc = E1000_READ_REG(&adapter->hw, MANC); 450 u32 manc = er32(MANC);
464 451
465 /* re-enable hardware interception of ARP */ 452 /* re-enable hardware interception of ARP */
466 manc |= E1000_MANC_ARP_EN; 453 manc |= E1000_MANC_ARP_EN;
467 454
468 if (adapter->hw.has_manc2h) 455 if (hw->has_manc2h)
469 manc &= ~E1000_MANC_EN_MNG2HOST; 456 manc &= ~E1000_MANC_EN_MNG2HOST;
470 457
471 /* don't explicitly have to mess with MANC2H since 458 /* don't explicitly have to mess with MANC2H since
472 * MANC has an enable disable that gates MANC2H */ 459 * MANC has an enable disable that gates MANC2H */
473 460
474 E1000_WRITE_REG(&adapter->hw, MANC, manc); 461 ew32(MANC, manc);
475 } 462 }
476} 463}
477 464
@@ -506,18 +493,19 @@ static void e1000_configure(struct e1000_adapter *adapter)
506 493
507int e1000_up(struct e1000_adapter *adapter) 494int e1000_up(struct e1000_adapter *adapter)
508{ 495{
496 struct e1000_hw *hw = &adapter->hw;
497
509 /* hardware has been reset, we need to reload some things */ 498 /* hardware has been reset, we need to reload some things */
510 e1000_configure(adapter); 499 e1000_configure(adapter);
511 500
512 clear_bit(__E1000_DOWN, &adapter->flags); 501 clear_bit(__E1000_DOWN, &adapter->flags);
513 502
514#ifdef CONFIG_E1000_NAPI
515 napi_enable(&adapter->napi); 503 napi_enable(&adapter->napi);
516#endif 504
517 e1000_irq_enable(adapter); 505 e1000_irq_enable(adapter);
518 506
519 /* fire a link change interrupt to start the watchdog */ 507 /* fire a link change interrupt to start the watchdog */
520 E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC); 508 ew32(ICS, E1000_ICS_LSC);
521 return 0; 509 return 0;
522} 510}
523 511
@@ -533,30 +521,33 @@ int e1000_up(struct e1000_adapter *adapter)
533 521
534void e1000_power_up_phy(struct e1000_adapter *adapter) 522void e1000_power_up_phy(struct e1000_adapter *adapter)
535{ 523{
524 struct e1000_hw *hw = &adapter->hw;
536 u16 mii_reg = 0; 525 u16 mii_reg = 0;
537 526
538 /* Just clear the power down bit to wake the phy back up */ 527 /* Just clear the power down bit to wake the phy back up */
539 if (adapter->hw.media_type == e1000_media_type_copper) { 528 if (hw->media_type == e1000_media_type_copper) {
540 /* according to the manual, the phy will retain its 529 /* according to the manual, the phy will retain its
541 * settings across a power-down/up cycle */ 530 * settings across a power-down/up cycle */
542 e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); 531 e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
543 mii_reg &= ~MII_CR_POWER_DOWN; 532 mii_reg &= ~MII_CR_POWER_DOWN;
544 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg); 533 e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
545 } 534 }
546} 535}
547 536
548static void e1000_power_down_phy(struct e1000_adapter *adapter) 537static void e1000_power_down_phy(struct e1000_adapter *adapter)
549{ 538{
539 struct e1000_hw *hw = &adapter->hw;
540
550 /* Power down the PHY so no link is implied when interface is down * 541 /* Power down the PHY so no link is implied when interface is down *
551 * The PHY cannot be powered down if any of the following is true * 542 * The PHY cannot be powered down if any of the following is true *
552 * (a) WoL is enabled 543 * (a) WoL is enabled
553 * (b) AMT is active 544 * (b) AMT is active
554 * (c) SoL/IDER session is active */ 545 * (c) SoL/IDER session is active */
555 if (!adapter->wol && adapter->hw.mac_type >= e1000_82540 && 546 if (!adapter->wol && hw->mac_type >= e1000_82540 &&
556 adapter->hw.media_type == e1000_media_type_copper) { 547 hw->media_type == e1000_media_type_copper) {
557 u16 mii_reg = 0; 548 u16 mii_reg = 0;
558 549
559 switch (adapter->hw.mac_type) { 550 switch (hw->mac_type) {
560 case e1000_82540: 551 case e1000_82540:
561 case e1000_82545: 552 case e1000_82545:
562 case e1000_82545_rev_3: 553 case e1000_82545_rev_3:
@@ -566,8 +557,7 @@ static void e1000_power_down_phy(struct e1000_adapter *adapter)
566 case e1000_82541_rev_2: 557 case e1000_82541_rev_2:
567 case e1000_82547: 558 case e1000_82547:
568 case e1000_82547_rev_2: 559 case e1000_82547_rev_2:
569 if (E1000_READ_REG(&adapter->hw, MANC) & 560 if (er32(MANC) & E1000_MANC_SMBUS_EN)
570 E1000_MANC_SMBUS_EN)
571 goto out; 561 goto out;
572 break; 562 break;
573 case e1000_82571: 563 case e1000_82571:
@@ -575,24 +565,23 @@ static void e1000_power_down_phy(struct e1000_adapter *adapter)
575 case e1000_82573: 565 case e1000_82573:
576 case e1000_80003es2lan: 566 case e1000_80003es2lan:
577 case e1000_ich8lan: 567 case e1000_ich8lan:
578 if (e1000_check_mng_mode(&adapter->hw) || 568 if (e1000_check_mng_mode(hw) ||
579 e1000_check_phy_reset_block(&adapter->hw)) 569 e1000_check_phy_reset_block(hw))
580 goto out; 570 goto out;
581 break; 571 break;
582 default: 572 default:
583 goto out; 573 goto out;
584 } 574 }
585 e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); 575 e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
586 mii_reg |= MII_CR_POWER_DOWN; 576 mii_reg |= MII_CR_POWER_DOWN;
587 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg); 577 e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
588 mdelay(1); 578 mdelay(1);
589 } 579 }
590out: 580out:
591 return; 581 return;
592} 582}
593 583
594void 584void e1000_down(struct e1000_adapter *adapter)
595e1000_down(struct e1000_adapter *adapter)
596{ 585{
597 struct net_device *netdev = adapter->netdev; 586 struct net_device *netdev = adapter->netdev;
598 587
@@ -600,9 +589,8 @@ e1000_down(struct e1000_adapter *adapter)
600 * reschedule our watchdog timer */ 589 * reschedule our watchdog timer */
601 set_bit(__E1000_DOWN, &adapter->flags); 590 set_bit(__E1000_DOWN, &adapter->flags);
602 591
603#ifdef CONFIG_E1000_NAPI
604 napi_disable(&adapter->napi); 592 napi_disable(&adapter->napi);
605#endif 593
606 e1000_irq_disable(adapter); 594 e1000_irq_disable(adapter);
607 595
608 del_timer_sync(&adapter->tx_fifo_stall_timer); 596 del_timer_sync(&adapter->tx_fifo_stall_timer);
@@ -620,8 +608,7 @@ e1000_down(struct e1000_adapter *adapter)
620 e1000_clean_all_rx_rings(adapter); 608 e1000_clean_all_rx_rings(adapter);
621} 609}
622 610
623void 611void e1000_reinit_locked(struct e1000_adapter *adapter)
624e1000_reinit_locked(struct e1000_adapter *adapter)
625{ 612{
626 WARN_ON(in_interrupt()); 613 WARN_ON(in_interrupt());
627 while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) 614 while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
@@ -631,9 +618,9 @@ e1000_reinit_locked(struct e1000_adapter *adapter)
631 clear_bit(__E1000_RESETTING, &adapter->flags); 618 clear_bit(__E1000_RESETTING, &adapter->flags);
632} 619}
633 620
634void 621void e1000_reset(struct e1000_adapter *adapter)
635e1000_reset(struct e1000_adapter *adapter)
636{ 622{
623 struct e1000_hw *hw = &adapter->hw;
637 u32 pba = 0, tx_space, min_tx_space, min_rx_space; 624 u32 pba = 0, tx_space, min_tx_space, min_rx_space;
638 u16 fc_high_water_mark = E1000_FC_HIGH_DIFF; 625 u16 fc_high_water_mark = E1000_FC_HIGH_DIFF;
639 bool legacy_pba_adjust = false; 626 bool legacy_pba_adjust = false;
@@ -642,7 +629,7 @@ e1000_reset(struct e1000_adapter *adapter)
642 * To take effect CTRL.RST is required. 629 * To take effect CTRL.RST is required.
643 */ 630 */
644 631
645 switch (adapter->hw.mac_type) { 632 switch (hw->mac_type) {
646 case e1000_82542_rev2_0: 633 case e1000_82542_rev2_0:
647 case e1000_82542_rev2_1: 634 case e1000_82542_rev2_1:
648 case e1000_82543: 635 case e1000_82543:
@@ -683,16 +670,16 @@ e1000_reset(struct e1000_adapter *adapter)
683 if (adapter->netdev->mtu > E1000_RXBUFFER_8192) 670 if (adapter->netdev->mtu > E1000_RXBUFFER_8192)
684 pba -= 8; /* allocate more FIFO for Tx */ 671 pba -= 8; /* allocate more FIFO for Tx */
685 672
686 if (adapter->hw.mac_type == e1000_82547) { 673 if (hw->mac_type == e1000_82547) {
687 adapter->tx_fifo_head = 0; 674 adapter->tx_fifo_head = 0;
688 adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT; 675 adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;
689 adapter->tx_fifo_size = 676 adapter->tx_fifo_size =
690 (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT; 677 (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
691 atomic_set(&adapter->tx_fifo_stall, 0); 678 atomic_set(&adapter->tx_fifo_stall, 0);
692 } 679 }
693 } else if (adapter->hw.max_frame_size > MAXIMUM_ETHERNET_FRAME_SIZE) { 680 } else if (hw->max_frame_size > MAXIMUM_ETHERNET_FRAME_SIZE) {
694 /* adjust PBA for jumbo frames */ 681 /* adjust PBA for jumbo frames */
695 E1000_WRITE_REG(&adapter->hw, PBA, pba); 682 ew32(PBA, pba);
696 683
697 /* To maintain wire speed transmits, the Tx FIFO should be 684 /* To maintain wire speed transmits, the Tx FIFO should be
698 * large enough to accomodate two full transmit packets, 685 * large enough to accomodate two full transmit packets,
@@ -700,7 +687,7 @@ e1000_reset(struct e1000_adapter *adapter)
700 * the Rx FIFO should be large enough to accomodate at least 687 * the Rx FIFO should be large enough to accomodate at least
701 * one full receive packet and is similarly rounded up and 688 * one full receive packet and is similarly rounded up and
702 * expressed in KB. */ 689 * expressed in KB. */
703 pba = E1000_READ_REG(&adapter->hw, PBA); 690 pba = er32(PBA);
704 /* upper 16 bits has Tx packet buffer allocation size in KB */ 691 /* upper 16 bits has Tx packet buffer allocation size in KB */
705 tx_space = pba >> 16; 692 tx_space = pba >> 16;
706 /* lower 16 bits has Rx packet buffer allocation size in KB */ 693 /* lower 16 bits has Rx packet buffer allocation size in KB */
@@ -723,7 +710,7 @@ e1000_reset(struct e1000_adapter *adapter)
723 pba = pba - (min_tx_space - tx_space); 710 pba = pba - (min_tx_space - tx_space);
724 711
725 /* PCI/PCIx hardware has PBA alignment constraints */ 712 /* PCI/PCIx hardware has PBA alignment constraints */
726 switch (adapter->hw.mac_type) { 713 switch (hw->mac_type) {
727 case e1000_82545 ... e1000_82546_rev_3: 714 case e1000_82545 ... e1000_82546_rev_3:
728 pba &= ~(E1000_PBA_8K - 1); 715 pba &= ~(E1000_PBA_8K - 1);
729 break; 716 break;
@@ -734,7 +721,7 @@ e1000_reset(struct e1000_adapter *adapter)
734 /* if short on rx space, rx wins and must trump tx 721 /* if short on rx space, rx wins and must trump tx
735 * adjustment or use Early Receive if available */ 722 * adjustment or use Early Receive if available */
736 if (pba < min_rx_space) { 723 if (pba < min_rx_space) {
737 switch (adapter->hw.mac_type) { 724 switch (hw->mac_type) {
738 case e1000_82573: 725 case e1000_82573:
739 /* ERT enabled in e1000_configure_rx */ 726 /* ERT enabled in e1000_configure_rx */
740 break; 727 break;
@@ -746,7 +733,7 @@ e1000_reset(struct e1000_adapter *adapter)
746 } 733 }
747 } 734 }
748 735
749 E1000_WRITE_REG(&adapter->hw, PBA, pba); 736 ew32(PBA, pba);
750 737
751 /* flow control settings */ 738 /* flow control settings */
752 /* Set the FC high water mark to 90% of the FIFO size. 739 /* Set the FC high water mark to 90% of the FIFO size.
@@ -759,54 +746,54 @@ e1000_reset(struct e1000_adapter *adapter)
759 if (pba < E1000_PBA_16K) 746 if (pba < E1000_PBA_16K)
760 fc_high_water_mark = (pba * 1024) - 1600; 747 fc_high_water_mark = (pba * 1024) - 1600;
761 748
762 adapter->hw.fc_high_water = fc_high_water_mark; 749 hw->fc_high_water = fc_high_water_mark;
763 adapter->hw.fc_low_water = fc_high_water_mark - 8; 750 hw->fc_low_water = fc_high_water_mark - 8;
764 if (adapter->hw.mac_type == e1000_80003es2lan) 751 if (hw->mac_type == e1000_80003es2lan)
765 adapter->hw.fc_pause_time = 0xFFFF; 752 hw->fc_pause_time = 0xFFFF;
766 else 753 else
767 adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME; 754 hw->fc_pause_time = E1000_FC_PAUSE_TIME;
768 adapter->hw.fc_send_xon = 1; 755 hw->fc_send_xon = 1;
769 adapter->hw.fc = adapter->hw.original_fc; 756 hw->fc = hw->original_fc;
770 757
771 /* Allow time for pending master requests to run */ 758 /* Allow time for pending master requests to run */
772 e1000_reset_hw(&adapter->hw); 759 e1000_reset_hw(hw);
773 if (adapter->hw.mac_type >= e1000_82544) 760 if (hw->mac_type >= e1000_82544)
774 E1000_WRITE_REG(&adapter->hw, WUC, 0); 761 ew32(WUC, 0);
775 762
776 if (e1000_init_hw(&adapter->hw)) 763 if (e1000_init_hw(hw))
777 DPRINTK(PROBE, ERR, "Hardware Error\n"); 764 DPRINTK(PROBE, ERR, "Hardware Error\n");
778 e1000_update_mng_vlan(adapter); 765 e1000_update_mng_vlan(adapter);
779 766
780 /* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */ 767 /* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */
781 if (adapter->hw.mac_type >= e1000_82544 && 768 if (hw->mac_type >= e1000_82544 &&
782 adapter->hw.mac_type <= e1000_82547_rev_2 && 769 hw->mac_type <= e1000_82547_rev_2 &&
783 adapter->hw.autoneg == 1 && 770 hw->autoneg == 1 &&
784 adapter->hw.autoneg_advertised == ADVERTISE_1000_FULL) { 771 hw->autoneg_advertised == ADVERTISE_1000_FULL) {
785 u32 ctrl = E1000_READ_REG(&adapter->hw, CTRL); 772 u32 ctrl = er32(CTRL);
786 /* clear phy power management bit if we are in gig only mode, 773 /* clear phy power management bit if we are in gig only mode,
787 * which if enabled will attempt negotiation to 100Mb, which 774 * which if enabled will attempt negotiation to 100Mb, which
788 * can cause a loss of link at power off or driver unload */ 775 * can cause a loss of link at power off or driver unload */
789 ctrl &= ~E1000_CTRL_SWDPIN3; 776 ctrl &= ~E1000_CTRL_SWDPIN3;
790 E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); 777 ew32(CTRL, ctrl);
791 } 778 }
792 779
793 /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */ 780 /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
794 E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE); 781 ew32(VET, ETHERNET_IEEE_VLAN_TYPE);
795 782
796 e1000_reset_adaptive(&adapter->hw); 783 e1000_reset_adaptive(hw);
797 e1000_phy_get_info(&adapter->hw, &adapter->phy_info); 784 e1000_phy_get_info(hw, &adapter->phy_info);
798 785
799 if (!adapter->smart_power_down && 786 if (!adapter->smart_power_down &&
800 (adapter->hw.mac_type == e1000_82571 || 787 (hw->mac_type == e1000_82571 ||
801 adapter->hw.mac_type == e1000_82572)) { 788 hw->mac_type == e1000_82572)) {
802 u16 phy_data = 0; 789 u16 phy_data = 0;
803 /* speed up time to link by disabling smart power down, ignore 790 /* speed up time to link by disabling smart power down, ignore
804 * the return value of this function because there is nothing 791 * the return value of this function because there is nothing
805 * different we would do if it failed */ 792 * different we would do if it failed */
806 e1000_read_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT, 793 e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
807 &phy_data); 794 &phy_data);
808 phy_data &= ~IGP02E1000_PM_SPD; 795 phy_data &= ~IGP02E1000_PM_SPD;
809 e1000_write_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT, 796 e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
810 phy_data); 797 phy_data);
811 } 798 }
812 799
@@ -865,13 +852,49 @@ static void e1000_dump_eeprom(struct e1000_adapter *adapter)
865 printk(KERN_ERR "to enable this network device.\n"); 852 printk(KERN_ERR "to enable this network device.\n");
866 printk(KERN_ERR "Please inspect the EEPROM dump and report the issue " 853 printk(KERN_ERR "Please inspect the EEPROM dump and report the issue "
867 "to your hardware vendor\n"); 854 "to your hardware vendor\n");
868 printk(KERN_ERR "or Intel Customer Support: linux-nics@intel.com\n"); 855 printk(KERN_ERR "or Intel Customer Support.\n");
869 printk(KERN_ERR "/*********************/\n"); 856 printk(KERN_ERR "/*********************/\n");
870 857
871 kfree(data); 858 kfree(data);
872} 859}
873 860
874/** 861/**
862 * e1000_is_need_ioport - determine if an adapter needs ioport resources or not
863 * @pdev: PCI device information struct
864 *
865 * Return true if an adapter needs ioport resources
866 **/
867static int e1000_is_need_ioport(struct pci_dev *pdev)
868{
869 switch (pdev->device) {
870 case E1000_DEV_ID_82540EM:
871 case E1000_DEV_ID_82540EM_LOM:
872 case E1000_DEV_ID_82540EP:
873 case E1000_DEV_ID_82540EP_LOM:
874 case E1000_DEV_ID_82540EP_LP:
875 case E1000_DEV_ID_82541EI:
876 case E1000_DEV_ID_82541EI_MOBILE:
877 case E1000_DEV_ID_82541ER:
878 case E1000_DEV_ID_82541ER_LOM:
879 case E1000_DEV_ID_82541GI:
880 case E1000_DEV_ID_82541GI_LF:
881 case E1000_DEV_ID_82541GI_MOBILE:
882 case E1000_DEV_ID_82544EI_COPPER:
883 case E1000_DEV_ID_82544EI_FIBER:
884 case E1000_DEV_ID_82544GC_COPPER:
885 case E1000_DEV_ID_82544GC_LOM:
886 case E1000_DEV_ID_82545EM_COPPER:
887 case E1000_DEV_ID_82545EM_FIBER:
888 case E1000_DEV_ID_82546EB_COPPER:
889 case E1000_DEV_ID_82546EB_FIBER:
890 case E1000_DEV_ID_82546EB_QUAD_COPPER:
891 return true;
892 default:
893 return false;
894 }
895}
896
897/**
875 * e1000_probe - Device Initialization Routine 898 * e1000_probe - Device Initialization Routine
876 * @pdev: PCI device information struct 899 * @pdev: PCI device information struct
877 * @ent: entry in e1000_pci_tbl 900 * @ent: entry in e1000_pci_tbl
@@ -882,37 +905,51 @@ static void e1000_dump_eeprom(struct e1000_adapter *adapter)
882 * The OS initialization, configuring of the adapter private structure, 905 * The OS initialization, configuring of the adapter private structure,
883 * and a hardware reset occur. 906 * and a hardware reset occur.
884 **/ 907 **/
885 908static int __devinit e1000_probe(struct pci_dev *pdev,
886static int __devinit 909 const struct pci_device_id *ent)
887e1000_probe(struct pci_dev *pdev,
888 const struct pci_device_id *ent)
889{ 910{
890 struct net_device *netdev; 911 struct net_device *netdev;
891 struct e1000_adapter *adapter; 912 struct e1000_adapter *adapter;
913 struct e1000_hw *hw;
892 914
893 static int cards_found = 0; 915 static int cards_found = 0;
894 static int global_quad_port_a = 0; /* global ksp3 port a indication */ 916 static int global_quad_port_a = 0; /* global ksp3 port a indication */
895 int i, err, pci_using_dac; 917 int i, err, pci_using_dac;
896 u16 eeprom_data = 0; 918 u16 eeprom_data = 0;
897 u16 eeprom_apme_mask = E1000_EEPROM_APME; 919 u16 eeprom_apme_mask = E1000_EEPROM_APME;
920 int bars, need_ioport;
898 DECLARE_MAC_BUF(mac); 921 DECLARE_MAC_BUF(mac);
899 922
900 if ((err = pci_enable_device(pdev))) 923 /* do not allocate ioport bars when not needed */
924 need_ioport = e1000_is_need_ioport(pdev);
925 if (need_ioport) {
926 bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
927 err = pci_enable_device(pdev);
928 } else {
929 bars = pci_select_bars(pdev, IORESOURCE_MEM);
930 err = pci_enable_device(pdev);
931 }
932 if (err)
901 return err; 933 return err;
902 934
903 if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && 935 if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) &&
904 !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) { 936 !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
905 pci_using_dac = 1; 937 pci_using_dac = 1;
906 } else { 938 } else {
907 if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) && 939 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
908 (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { 940 if (err) {
909 E1000_ERR("No usable DMA configuration, aborting\n"); 941 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
910 goto err_dma; 942 if (err) {
943 E1000_ERR("No usable DMA configuration, "
944 "aborting\n");
945 goto err_dma;
946 }
911 } 947 }
912 pci_using_dac = 0; 948 pci_using_dac = 0;
913 } 949 }
914 950
915 if ((err = pci_request_regions(pdev, e1000_driver_name))) 951 err = pci_request_selected_regions(pdev, bars, e1000_driver_name);
952 if (err)
916 goto err_pci_reg; 953 goto err_pci_reg;
917 954
918 pci_set_master(pdev); 955 pci_set_master(pdev);
@@ -928,21 +965,27 @@ e1000_probe(struct pci_dev *pdev,
928 adapter = netdev_priv(netdev); 965 adapter = netdev_priv(netdev);
929 adapter->netdev = netdev; 966 adapter->netdev = netdev;
930 adapter->pdev = pdev; 967 adapter->pdev = pdev;
931 adapter->hw.back = adapter;
932 adapter->msg_enable = (1 << debug) - 1; 968 adapter->msg_enable = (1 << debug) - 1;
969 adapter->bars = bars;
970 adapter->need_ioport = need_ioport;
971
972 hw = &adapter->hw;
973 hw->back = adapter;
933 974
934 err = -EIO; 975 err = -EIO;
935 adapter->hw.hw_addr = ioremap(pci_resource_start(pdev, BAR_0), 976 hw->hw_addr = ioremap(pci_resource_start(pdev, BAR_0),
936 pci_resource_len(pdev, BAR_0)); 977 pci_resource_len(pdev, BAR_0));
937 if (!adapter->hw.hw_addr) 978 if (!hw->hw_addr)
938 goto err_ioremap; 979 goto err_ioremap;
939 980
940 for (i = BAR_1; i <= BAR_5; i++) { 981 if (adapter->need_ioport) {
941 if (pci_resource_len(pdev, i) == 0) 982 for (i = BAR_1; i <= BAR_5; i++) {
942 continue; 983 if (pci_resource_len(pdev, i) == 0)
943 if (pci_resource_flags(pdev, i) & IORESOURCE_IO) { 984 continue;
944 adapter->hw.io_base = pci_resource_start(pdev, i); 985 if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
945 break; 986 hw->io_base = pci_resource_start(pdev, i);
987 break;
988 }
946 } 989 }
947 } 990 }
948 991
@@ -957,9 +1000,7 @@ e1000_probe(struct pci_dev *pdev,
957 e1000_set_ethtool_ops(netdev); 1000 e1000_set_ethtool_ops(netdev);
958 netdev->tx_timeout = &e1000_tx_timeout; 1001 netdev->tx_timeout = &e1000_tx_timeout;
959 netdev->watchdog_timeo = 5 * HZ; 1002 netdev->watchdog_timeo = 5 * HZ;
960#ifdef CONFIG_E1000_NAPI
961 netif_napi_add(netdev, &adapter->napi, e1000_clean, 64); 1003 netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
962#endif
963 netdev->vlan_rx_register = e1000_vlan_rx_register; 1004 netdev->vlan_rx_register = e1000_vlan_rx_register;
964 netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; 1005 netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;
965 netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid; 1006 netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;
@@ -972,49 +1013,50 @@ e1000_probe(struct pci_dev *pdev,
972 1013
973 /* setup the private structure */ 1014 /* setup the private structure */
974 1015
975 if ((err = e1000_sw_init(adapter))) 1016 err = e1000_sw_init(adapter);
1017 if (err)
976 goto err_sw_init; 1018 goto err_sw_init;
977 1019
978 err = -EIO; 1020 err = -EIO;
979 /* Flash BAR mapping must happen after e1000_sw_init 1021 /* Flash BAR mapping must happen after e1000_sw_init
980 * because it depends on mac_type */ 1022 * because it depends on mac_type */
981 if ((adapter->hw.mac_type == e1000_ich8lan) && 1023 if ((hw->mac_type == e1000_ich8lan) &&
982 (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { 1024 (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
983 adapter->hw.flash_address = 1025 hw->flash_address =
984 ioremap(pci_resource_start(pdev, 1), 1026 ioremap(pci_resource_start(pdev, 1),
985 pci_resource_len(pdev, 1)); 1027 pci_resource_len(pdev, 1));
986 if (!adapter->hw.flash_address) 1028 if (!hw->flash_address)
987 goto err_flashmap; 1029 goto err_flashmap;
988 } 1030 }
989 1031
990 if (e1000_check_phy_reset_block(&adapter->hw)) 1032 if (e1000_check_phy_reset_block(hw))
991 DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n"); 1033 DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
992 1034
993 if (adapter->hw.mac_type >= e1000_82543) { 1035 if (hw->mac_type >= e1000_82543) {
994 netdev->features = NETIF_F_SG | 1036 netdev->features = NETIF_F_SG |
995 NETIF_F_HW_CSUM | 1037 NETIF_F_HW_CSUM |
996 NETIF_F_HW_VLAN_TX | 1038 NETIF_F_HW_VLAN_TX |
997 NETIF_F_HW_VLAN_RX | 1039 NETIF_F_HW_VLAN_RX |
998 NETIF_F_HW_VLAN_FILTER; 1040 NETIF_F_HW_VLAN_FILTER;
999 if (adapter->hw.mac_type == e1000_ich8lan) 1041 if (hw->mac_type == e1000_ich8lan)
1000 netdev->features &= ~NETIF_F_HW_VLAN_FILTER; 1042 netdev->features &= ~NETIF_F_HW_VLAN_FILTER;
1001 } 1043 }
1002 1044
1003 if ((adapter->hw.mac_type >= e1000_82544) && 1045 if ((hw->mac_type >= e1000_82544) &&
1004 (adapter->hw.mac_type != e1000_82547)) 1046 (hw->mac_type != e1000_82547))
1005 netdev->features |= NETIF_F_TSO; 1047 netdev->features |= NETIF_F_TSO;
1006 1048
1007 if (adapter->hw.mac_type > e1000_82547_rev_2) 1049 if (hw->mac_type > e1000_82547_rev_2)
1008 netdev->features |= NETIF_F_TSO6; 1050 netdev->features |= NETIF_F_TSO6;
1009 if (pci_using_dac) 1051 if (pci_using_dac)
1010 netdev->features |= NETIF_F_HIGHDMA; 1052 netdev->features |= NETIF_F_HIGHDMA;
1011 1053
1012 netdev->features |= NETIF_F_LLTX; 1054 netdev->features |= NETIF_F_LLTX;
1013 1055
1014 adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw); 1056 adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw);
1015 1057
1016 /* initialize eeprom parameters */ 1058 /* initialize eeprom parameters */
1017 if (e1000_init_eeprom_params(&adapter->hw)) { 1059 if (e1000_init_eeprom_params(hw)) {
1018 E1000_ERR("EEPROM initialization failed\n"); 1060 E1000_ERR("EEPROM initialization failed\n");
1019 goto err_eeprom; 1061 goto err_eeprom;
1020 } 1062 }
@@ -1022,10 +1064,10 @@ e1000_probe(struct pci_dev *pdev,
1022 /* before reading the EEPROM, reset the controller to 1064 /* before reading the EEPROM, reset the controller to
1023 * put the device in a known good starting state */ 1065 * put the device in a known good starting state */
1024 1066
1025 e1000_reset_hw(&adapter->hw); 1067 e1000_reset_hw(hw);
1026 1068
1027 /* make sure the EEPROM is good */ 1069 /* make sure the EEPROM is good */
1028 if (e1000_validate_eeprom_checksum(&adapter->hw) < 0) { 1070 if (e1000_validate_eeprom_checksum(hw) < 0) {
1029 DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n"); 1071 DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n");
1030 e1000_dump_eeprom(adapter); 1072 e1000_dump_eeprom(adapter);
1031 /* 1073 /*
@@ -1036,24 +1078,24 @@ e1000_probe(struct pci_dev *pdev,
1036 * interface after manually setting a hw addr using 1078 * interface after manually setting a hw addr using
1037 * `ip set address` 1079 * `ip set address`
1038 */ 1080 */
1039 memset(adapter->hw.mac_addr, 0, netdev->addr_len); 1081 memset(hw->mac_addr, 0, netdev->addr_len);
1040 } else { 1082 } else {
1041 /* copy the MAC address out of the EEPROM */ 1083 /* copy the MAC address out of the EEPROM */
1042 if (e1000_read_mac_addr(&adapter->hw)) 1084 if (e1000_read_mac_addr(hw))
1043 DPRINTK(PROBE, ERR, "EEPROM Read Error\n"); 1085 DPRINTK(PROBE, ERR, "EEPROM Read Error\n");
1044 } 1086 }
1045 /* don't block initalization here due to bad MAC address */ 1087 /* don't block initalization here due to bad MAC address */
1046 memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len); 1088 memcpy(netdev->dev_addr, hw->mac_addr, netdev->addr_len);
1047 memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len); 1089 memcpy(netdev->perm_addr, hw->mac_addr, netdev->addr_len);
1048 1090
1049 if (!is_valid_ether_addr(netdev->perm_addr)) 1091 if (!is_valid_ether_addr(netdev->perm_addr))
1050 DPRINTK(PROBE, ERR, "Invalid MAC Address\n"); 1092 DPRINTK(PROBE, ERR, "Invalid MAC Address\n");
1051 1093
1052 e1000_get_bus_info(&adapter->hw); 1094 e1000_get_bus_info(hw);
1053 1095
1054 init_timer(&adapter->tx_fifo_stall_timer); 1096 init_timer(&adapter->tx_fifo_stall_timer);
1055 adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall; 1097 adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall;
1056 adapter->tx_fifo_stall_timer.data = (unsigned long) adapter; 1098 adapter->tx_fifo_stall_timer.data = (unsigned long)adapter;
1057 1099
1058 init_timer(&adapter->watchdog_timer); 1100 init_timer(&adapter->watchdog_timer);
1059 adapter->watchdog_timer.function = &e1000_watchdog; 1101 adapter->watchdog_timer.function = &e1000_watchdog;
@@ -1061,7 +1103,7 @@ e1000_probe(struct pci_dev *pdev,
1061 1103
1062 init_timer(&adapter->phy_info_timer); 1104 init_timer(&adapter->phy_info_timer);
1063 adapter->phy_info_timer.function = &e1000_update_phy_info; 1105 adapter->phy_info_timer.function = &e1000_update_phy_info;
1064 adapter->phy_info_timer.data = (unsigned long) adapter; 1106 adapter->phy_info_timer.data = (unsigned long)adapter;
1065 1107
1066 INIT_WORK(&adapter->reset_task, e1000_reset_task); 1108 INIT_WORK(&adapter->reset_task, e1000_reset_task);
1067 1109
@@ -1072,18 +1114,18 @@ e1000_probe(struct pci_dev *pdev,
1072 * enable the ACPI Magic Packet filter 1114 * enable the ACPI Magic Packet filter
1073 */ 1115 */
1074 1116
1075 switch (adapter->hw.mac_type) { 1117 switch (hw->mac_type) {
1076 case e1000_82542_rev2_0: 1118 case e1000_82542_rev2_0:
1077 case e1000_82542_rev2_1: 1119 case e1000_82542_rev2_1:
1078 case e1000_82543: 1120 case e1000_82543:
1079 break; 1121 break;
1080 case e1000_82544: 1122 case e1000_82544:
1081 e1000_read_eeprom(&adapter->hw, 1123 e1000_read_eeprom(hw,
1082 EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data); 1124 EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
1083 eeprom_apme_mask = E1000_EEPROM_82544_APM; 1125 eeprom_apme_mask = E1000_EEPROM_82544_APM;
1084 break; 1126 break;
1085 case e1000_ich8lan: 1127 case e1000_ich8lan:
1086 e1000_read_eeprom(&adapter->hw, 1128 e1000_read_eeprom(hw,
1087 EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data); 1129 EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data);
1088 eeprom_apme_mask = E1000_EEPROM_ICH8_APME; 1130 eeprom_apme_mask = E1000_EEPROM_ICH8_APME;
1089 break; 1131 break;
@@ -1091,14 +1133,14 @@ e1000_probe(struct pci_dev *pdev,
1091 case e1000_82546_rev_3: 1133 case e1000_82546_rev_3:
1092 case e1000_82571: 1134 case e1000_82571:
1093 case e1000_80003es2lan: 1135 case e1000_80003es2lan:
1094 if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1){ 1136 if (er32(STATUS) & E1000_STATUS_FUNC_1){
1095 e1000_read_eeprom(&adapter->hw, 1137 e1000_read_eeprom(hw,
1096 EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); 1138 EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
1097 break; 1139 break;
1098 } 1140 }
1099 /* Fall Through */ 1141 /* Fall Through */
1100 default: 1142 default:
1101 e1000_read_eeprom(&adapter->hw, 1143 e1000_read_eeprom(hw,
1102 EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); 1144 EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
1103 break; 1145 break;
1104 } 1146 }
@@ -1117,7 +1159,7 @@ e1000_probe(struct pci_dev *pdev,
1117 case E1000_DEV_ID_82571EB_FIBER: 1159 case E1000_DEV_ID_82571EB_FIBER:
1118 /* Wake events only supported on port A for dual fiber 1160 /* Wake events only supported on port A for dual fiber
1119 * regardless of eeprom setting */ 1161 * regardless of eeprom setting */
1120 if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1) 1162 if (er32(STATUS) & E1000_STATUS_FUNC_1)
1121 adapter->eeprom_wol = 0; 1163 adapter->eeprom_wol = 0;
1122 break; 1164 break;
1123 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 1165 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
@@ -1140,8 +1182,6 @@ e1000_probe(struct pci_dev *pdev,
1140 adapter->wol = adapter->eeprom_wol; 1182 adapter->wol = adapter->eeprom_wol;
1141 1183
1142 /* print bus type/speed/width info */ 1184 /* print bus type/speed/width info */
1143 {
1144 struct e1000_hw *hw = &adapter->hw;
1145 DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ", 1185 DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
1146 ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : 1186 ((hw->bus_type == e1000_bus_type_pcix) ? "-X" :
1147 (hw->bus_type == e1000_bus_type_pci_express ? " Express":"")), 1187 (hw->bus_type == e1000_bus_type_pci_express ? " Express":"")),
@@ -1154,11 +1194,10 @@ e1000_probe(struct pci_dev *pdev,
1154 (hw->bus_width == e1000_bus_width_pciex_4) ? "Width x4" : 1194 (hw->bus_width == e1000_bus_width_pciex_4) ? "Width x4" :
1155 (hw->bus_width == e1000_bus_width_pciex_1) ? "Width x1" : 1195 (hw->bus_width == e1000_bus_width_pciex_1) ? "Width x1" :
1156 "32-bit")); 1196 "32-bit"));
1157 }
1158 1197
1159 printk("%s\n", print_mac(mac, netdev->dev_addr)); 1198 printk("%s\n", print_mac(mac, netdev->dev_addr));
1160 1199
1161 if (adapter->hw.bus_type == e1000_bus_type_pci_express) { 1200 if (hw->bus_type == e1000_bus_type_pci_express) {
1162 DPRINTK(PROBE, WARNING, "This device (id %04x:%04x) will no " 1201 DPRINTK(PROBE, WARNING, "This device (id %04x:%04x) will no "
1163 "longer be supported by this driver in the future.\n", 1202 "longer be supported by this driver in the future.\n",
1164 pdev->vendor, pdev->device); 1203 pdev->vendor, pdev->device);
@@ -1173,8 +1212,8 @@ e1000_probe(struct pci_dev *pdev,
1173 * DRV_LOAD until the interface is up. For all other cases, 1212 * DRV_LOAD until the interface is up. For all other cases,
1174 * let the f/w know that the h/w is now under the control 1213 * let the f/w know that the h/w is now under the control
1175 * of the driver. */ 1214 * of the driver. */
1176 if (adapter->hw.mac_type != e1000_82573 || 1215 if (hw->mac_type != e1000_82573 ||
1177 !e1000_check_mng_mode(&adapter->hw)) 1216 !e1000_check_mng_mode(hw))
1178 e1000_get_hw_control(adapter); 1217 e1000_get_hw_control(adapter);
1179 1218
1180 /* tell the stack to leave us alone until e1000_open() is called */ 1219 /* tell the stack to leave us alone until e1000_open() is called */
@@ -1182,7 +1221,8 @@ e1000_probe(struct pci_dev *pdev,
1182 netif_stop_queue(netdev); 1221 netif_stop_queue(netdev);
1183 1222
1184 strcpy(netdev->name, "eth%d"); 1223 strcpy(netdev->name, "eth%d");
1185 if ((err = register_netdev(netdev))) 1224 err = register_netdev(netdev);
1225 if (err)
1186 goto err_register; 1226 goto err_register;
1187 1227
1188 DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n"); 1228 DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");
@@ -1193,28 +1233,24 @@ e1000_probe(struct pci_dev *pdev,
1193err_register: 1233err_register:
1194 e1000_release_hw_control(adapter); 1234 e1000_release_hw_control(adapter);
1195err_eeprom: 1235err_eeprom:
1196 if (!e1000_check_phy_reset_block(&adapter->hw)) 1236 if (!e1000_check_phy_reset_block(hw))
1197 e1000_phy_hw_reset(&adapter->hw); 1237 e1000_phy_hw_reset(hw);
1198 1238
1199 if (adapter->hw.flash_address) 1239 if (hw->flash_address)
1200 iounmap(adapter->hw.flash_address); 1240 iounmap(hw->flash_address);
1201err_flashmap: 1241err_flashmap:
1202#ifdef CONFIG_E1000_NAPI
1203 for (i = 0; i < adapter->num_rx_queues; i++) 1242 for (i = 0; i < adapter->num_rx_queues; i++)
1204 dev_put(&adapter->polling_netdev[i]); 1243 dev_put(&adapter->polling_netdev[i]);
1205#endif
1206 1244
1207 kfree(adapter->tx_ring); 1245 kfree(adapter->tx_ring);
1208 kfree(adapter->rx_ring); 1246 kfree(adapter->rx_ring);
1209#ifdef CONFIG_E1000_NAPI
1210 kfree(adapter->polling_netdev); 1247 kfree(adapter->polling_netdev);
1211#endif
1212err_sw_init: 1248err_sw_init:
1213 iounmap(adapter->hw.hw_addr); 1249 iounmap(hw->hw_addr);
1214err_ioremap: 1250err_ioremap:
1215 free_netdev(netdev); 1251 free_netdev(netdev);
1216err_alloc_etherdev: 1252err_alloc_etherdev:
1217 pci_release_regions(pdev); 1253 pci_release_selected_regions(pdev, bars);
1218err_pci_reg: 1254err_pci_reg:
1219err_dma: 1255err_dma:
1220 pci_disable_device(pdev); 1256 pci_disable_device(pdev);
@@ -1231,14 +1267,12 @@ err_dma:
1231 * memory. 1267 * memory.
1232 **/ 1268 **/
1233 1269
1234static void __devexit 1270static void __devexit e1000_remove(struct pci_dev *pdev)
1235e1000_remove(struct pci_dev *pdev)
1236{ 1271{
1237 struct net_device *netdev = pci_get_drvdata(pdev); 1272 struct net_device *netdev = pci_get_drvdata(pdev);
1238 struct e1000_adapter *adapter = netdev_priv(netdev); 1273 struct e1000_adapter *adapter = netdev_priv(netdev);
1239#ifdef CONFIG_E1000_NAPI 1274 struct e1000_hw *hw = &adapter->hw;
1240 int i; 1275 int i;
1241#endif
1242 1276
1243 cancel_work_sync(&adapter->reset_task); 1277 cancel_work_sync(&adapter->reset_task);
1244 1278
@@ -1248,26 +1282,22 @@ e1000_remove(struct pci_dev *pdev)
1248 * would have already happened in close and is redundant. */ 1282 * would have already happened in close and is redundant. */
1249 e1000_release_hw_control(adapter); 1283 e1000_release_hw_control(adapter);
1250 1284
1251#ifdef CONFIG_E1000_NAPI
1252 for (i = 0; i < adapter->num_rx_queues; i++) 1285 for (i = 0; i < adapter->num_rx_queues; i++)
1253 dev_put(&adapter->polling_netdev[i]); 1286 dev_put(&adapter->polling_netdev[i]);
1254#endif
1255 1287
1256 unregister_netdev(netdev); 1288 unregister_netdev(netdev);
1257 1289
1258 if (!e1000_check_phy_reset_block(&adapter->hw)) 1290 if (!e1000_check_phy_reset_block(hw))
1259 e1000_phy_hw_reset(&adapter->hw); 1291 e1000_phy_hw_reset(hw);
1260 1292
1261 kfree(adapter->tx_ring); 1293 kfree(adapter->tx_ring);
1262 kfree(adapter->rx_ring); 1294 kfree(adapter->rx_ring);
1263#ifdef CONFIG_E1000_NAPI
1264 kfree(adapter->polling_netdev); 1295 kfree(adapter->polling_netdev);
1265#endif
1266 1296
1267 iounmap(adapter->hw.hw_addr); 1297 iounmap(hw->hw_addr);
1268 if (adapter->hw.flash_address) 1298 if (hw->flash_address)
1269 iounmap(adapter->hw.flash_address); 1299 iounmap(hw->flash_address);
1270 pci_release_regions(pdev); 1300 pci_release_selected_regions(pdev, adapter->bars);
1271 1301
1272 free_netdev(netdev); 1302 free_netdev(netdev);
1273 1303
@@ -1283,15 +1313,12 @@ e1000_remove(struct pci_dev *pdev)
1283 * OS network device settings (MTU size). 1313 * OS network device settings (MTU size).
1284 **/ 1314 **/
1285 1315
1286static int __devinit 1316static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
1287e1000_sw_init(struct e1000_adapter *adapter)
1288{ 1317{
1289 struct e1000_hw *hw = &adapter->hw; 1318 struct e1000_hw *hw = &adapter->hw;
1290 struct net_device *netdev = adapter->netdev; 1319 struct net_device *netdev = adapter->netdev;
1291 struct pci_dev *pdev = adapter->pdev; 1320 struct pci_dev *pdev = adapter->pdev;
1292#ifdef CONFIG_E1000_NAPI
1293 int i; 1321 int i;
1294#endif
1295 1322
1296 /* PCI config space info */ 1323 /* PCI config space info */
1297 1324
@@ -1349,14 +1376,12 @@ e1000_sw_init(struct e1000_adapter *adapter)
1349 return -ENOMEM; 1376 return -ENOMEM;
1350 } 1377 }
1351 1378
1352#ifdef CONFIG_E1000_NAPI
1353 for (i = 0; i < adapter->num_rx_queues; i++) { 1379 for (i = 0; i < adapter->num_rx_queues; i++) {
1354 adapter->polling_netdev[i].priv = adapter; 1380 adapter->polling_netdev[i].priv = adapter;
1355 dev_hold(&adapter->polling_netdev[i]); 1381 dev_hold(&adapter->polling_netdev[i]);
1356 set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state); 1382 set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state);
1357 } 1383 }
1358 spin_lock_init(&adapter->tx_queue_lock); 1384 spin_lock_init(&adapter->tx_queue_lock);
1359#endif
1360 1385
1361 /* Explicitly disable IRQ since the NIC can be in any state. */ 1386 /* Explicitly disable IRQ since the NIC can be in any state. */
1362 e1000_irq_disable(adapter); 1387 e1000_irq_disable(adapter);
@@ -1377,8 +1402,7 @@ e1000_sw_init(struct e1000_adapter *adapter)
1377 * intended for Multiqueue, but should work fine with a single queue. 1402 * intended for Multiqueue, but should work fine with a single queue.
1378 **/ 1403 **/
1379 1404
1380static int __devinit 1405static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
1381e1000_alloc_queues(struct e1000_adapter *adapter)
1382{ 1406{
1383 adapter->tx_ring = kcalloc(adapter->num_tx_queues, 1407 adapter->tx_ring = kcalloc(adapter->num_tx_queues,
1384 sizeof(struct e1000_tx_ring), GFP_KERNEL); 1408 sizeof(struct e1000_tx_ring), GFP_KERNEL);
@@ -1392,7 +1416,6 @@ e1000_alloc_queues(struct e1000_adapter *adapter)
1392 return -ENOMEM; 1416 return -ENOMEM;
1393 } 1417 }
1394 1418
1395#ifdef CONFIG_E1000_NAPI
1396 adapter->polling_netdev = kcalloc(adapter->num_rx_queues, 1419 adapter->polling_netdev = kcalloc(adapter->num_rx_queues,
1397 sizeof(struct net_device), 1420 sizeof(struct net_device),
1398 GFP_KERNEL); 1421 GFP_KERNEL);
@@ -1401,7 +1424,6 @@ e1000_alloc_queues(struct e1000_adapter *adapter)
1401 kfree(adapter->rx_ring); 1424 kfree(adapter->rx_ring);
1402 return -ENOMEM; 1425 return -ENOMEM;
1403 } 1426 }
1404#endif
1405 1427
1406 return E1000_SUCCESS; 1428 return E1000_SUCCESS;
1407} 1429}
@@ -1419,10 +1441,10 @@ e1000_alloc_queues(struct e1000_adapter *adapter)
1419 * and the stack is notified that the interface is ready. 1441 * and the stack is notified that the interface is ready.
1420 **/ 1442 **/
1421 1443
1422static int 1444static int e1000_open(struct net_device *netdev)
1423e1000_open(struct net_device *netdev)
1424{ 1445{
1425 struct e1000_adapter *adapter = netdev_priv(netdev); 1446 struct e1000_adapter *adapter = netdev_priv(netdev);
1447 struct e1000_hw *hw = &adapter->hw;
1426 int err; 1448 int err;
1427 1449
1428 /* disallow open during test */ 1450 /* disallow open during test */
@@ -1442,15 +1464,15 @@ e1000_open(struct net_device *netdev)
1442 e1000_power_up_phy(adapter); 1464 e1000_power_up_phy(adapter);
1443 1465
1444 adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; 1466 adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
1445 if ((adapter->hw.mng_cookie.status & 1467 if ((hw->mng_cookie.status &
1446 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) { 1468 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
1447 e1000_update_mng_vlan(adapter); 1469 e1000_update_mng_vlan(adapter);
1448 } 1470 }
1449 1471
1450 /* If AMT is enabled, let the firmware know that the network 1472 /* If AMT is enabled, let the firmware know that the network
1451 * interface is now open */ 1473 * interface is now open */
1452 if (adapter->hw.mac_type == e1000_82573 && 1474 if (hw->mac_type == e1000_82573 &&
1453 e1000_check_mng_mode(&adapter->hw)) 1475 e1000_check_mng_mode(hw))
1454 e1000_get_hw_control(adapter); 1476 e1000_get_hw_control(adapter);
1455 1477
1456 /* before we allocate an interrupt, we must be ready to handle it. 1478 /* before we allocate an interrupt, we must be ready to handle it.
@@ -1466,16 +1488,14 @@ e1000_open(struct net_device *netdev)
1466 /* From here on the code is the same as e1000_up() */ 1488 /* From here on the code is the same as e1000_up() */
1467 clear_bit(__E1000_DOWN, &adapter->flags); 1489 clear_bit(__E1000_DOWN, &adapter->flags);
1468 1490
1469#ifdef CONFIG_E1000_NAPI
1470 napi_enable(&adapter->napi); 1491 napi_enable(&adapter->napi);
1471#endif
1472 1492
1473 e1000_irq_enable(adapter); 1493 e1000_irq_enable(adapter);
1474 1494
1475 netif_start_queue(netdev); 1495 netif_start_queue(netdev);
1476 1496
1477 /* fire a link status change interrupt to start the watchdog */ 1497 /* fire a link status change interrupt to start the watchdog */
1478 E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC); 1498 ew32(ICS, E1000_ICS_LSC);
1479 1499
1480 return E1000_SUCCESS; 1500 return E1000_SUCCESS;
1481 1501
@@ -1503,10 +1523,10 @@ err_setup_tx:
1503 * hardware, and all transmit and receive resources are freed. 1523 * hardware, and all transmit and receive resources are freed.
1504 **/ 1524 **/
1505 1525
1506static int 1526static int e1000_close(struct net_device *netdev)
1507e1000_close(struct net_device *netdev)
1508{ 1527{
1509 struct e1000_adapter *adapter = netdev_priv(netdev); 1528 struct e1000_adapter *adapter = netdev_priv(netdev);
1529 struct e1000_hw *hw = &adapter->hw;
1510 1530
1511 WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); 1531 WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
1512 e1000_down(adapter); 1532 e1000_down(adapter);
@@ -1518,7 +1538,7 @@ e1000_close(struct net_device *netdev)
1518 1538
1519 /* kill manageability vlan ID if supported, but not if a vlan with 1539 /* kill manageability vlan ID if supported, but not if a vlan with
1520 * the same ID is registered on the host OS (let 8021q kill it) */ 1540 * the same ID is registered on the host OS (let 8021q kill it) */
1521 if ((adapter->hw.mng_cookie.status & 1541 if ((hw->mng_cookie.status &
1522 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && 1542 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
1523 !(adapter->vlgrp && 1543 !(adapter->vlgrp &&
1524 vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) { 1544 vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
@@ -1527,8 +1547,8 @@ e1000_close(struct net_device *netdev)
1527 1547
1528 /* If AMT is enabled, let the firmware know that the network 1548 /* If AMT is enabled, let the firmware know that the network
1529 * interface is now closed */ 1549 * interface is now closed */
1530 if (adapter->hw.mac_type == e1000_82573 && 1550 if (hw->mac_type == e1000_82573 &&
1531 e1000_check_mng_mode(&adapter->hw)) 1551 e1000_check_mng_mode(hw))
1532 e1000_release_hw_control(adapter); 1552 e1000_release_hw_control(adapter);
1533 1553
1534 return 0; 1554 return 0;
@@ -1540,17 +1560,17 @@ e1000_close(struct net_device *netdev)
1540 * @start: address of beginning of memory 1560 * @start: address of beginning of memory
1541 * @len: length of memory 1561 * @len: length of memory
1542 **/ 1562 **/
1543static bool 1563static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start,
1544e1000_check_64k_bound(struct e1000_adapter *adapter, 1564 unsigned long len)
1545 void *start, unsigned long len)
1546{ 1565{
1547 unsigned long begin = (unsigned long) start; 1566 struct e1000_hw *hw = &adapter->hw;
1567 unsigned long begin = (unsigned long)start;
1548 unsigned long end = begin + len; 1568 unsigned long end = begin + len;
1549 1569
1550 /* First rev 82545 and 82546 need to not allow any memory 1570 /* First rev 82545 and 82546 need to not allow any memory
1551 * write location to cross 64k boundary due to errata 23 */ 1571 * write location to cross 64k boundary due to errata 23 */
1552 if (adapter->hw.mac_type == e1000_82545 || 1572 if (hw->mac_type == e1000_82545 ||
1553 adapter->hw.mac_type == e1000_82546) { 1573 hw->mac_type == e1000_82546) {
1554 return ((begin ^ (end - 1)) >> 16) != 0 ? false : true; 1574 return ((begin ^ (end - 1)) >> 16) != 0 ? false : true;
1555 } 1575 }
1556 1576
@@ -1565,9 +1585,8 @@ e1000_check_64k_bound(struct e1000_adapter *adapter,
1565 * Return 0 on success, negative on failure 1585 * Return 0 on success, negative on failure
1566 **/ 1586 **/
1567 1587
1568static int 1588static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
1569e1000_setup_tx_resources(struct e1000_adapter *adapter, 1589 struct e1000_tx_ring *txdr)
1570 struct e1000_tx_ring *txdr)
1571{ 1590{
1572 struct pci_dev *pdev = adapter->pdev; 1591 struct pci_dev *pdev = adapter->pdev;
1573 int size; 1592 int size;
@@ -1641,8 +1660,7 @@ setup_tx_desc_die:
1641 * Return 0 on success, negative on failure 1660 * Return 0 on success, negative on failure
1642 **/ 1661 **/
1643 1662
1644int 1663int e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
1645e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
1646{ 1664{
1647 int i, err = 0; 1665 int i, err = 0;
1648 1666
@@ -1668,8 +1686,7 @@ e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
1668 * Configure the Tx unit of the MAC after a reset. 1686 * Configure the Tx unit of the MAC after a reset.
1669 **/ 1687 **/
1670 1688
1671static void 1689static void e1000_configure_tx(struct e1000_adapter *adapter)
1672e1000_configure_tx(struct e1000_adapter *adapter)
1673{ 1690{
1674 u64 tdba; 1691 u64 tdba;
1675 struct e1000_hw *hw = &adapter->hw; 1692 struct e1000_hw *hw = &adapter->hw;
@@ -1684,18 +1701,18 @@ e1000_configure_tx(struct e1000_adapter *adapter)
1684 tdba = adapter->tx_ring[0].dma; 1701 tdba = adapter->tx_ring[0].dma;
1685 tdlen = adapter->tx_ring[0].count * 1702 tdlen = adapter->tx_ring[0].count *
1686 sizeof(struct e1000_tx_desc); 1703 sizeof(struct e1000_tx_desc);
1687 E1000_WRITE_REG(hw, TDLEN, tdlen); 1704 ew32(TDLEN, tdlen);
1688 E1000_WRITE_REG(hw, TDBAH, (tdba >> 32)); 1705 ew32(TDBAH, (tdba >> 32));
1689 E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL)); 1706 ew32(TDBAL, (tdba & 0x00000000ffffffffULL));
1690 E1000_WRITE_REG(hw, TDT, 0); 1707 ew32(TDT, 0);
1691 E1000_WRITE_REG(hw, TDH, 0); 1708 ew32(TDH, 0);
1692 adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH); 1709 adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH);
1693 adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT); 1710 adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT);
1694 break; 1711 break;
1695 } 1712 }
1696 1713
1697 /* Set the default values for the Tx Inter Packet Gap timer */ 1714 /* Set the default values for the Tx Inter Packet Gap timer */
1698 if (adapter->hw.mac_type <= e1000_82547_rev_2 && 1715 if (hw->mac_type <= e1000_82547_rev_2 &&
1699 (hw->media_type == e1000_media_type_fiber || 1716 (hw->media_type == e1000_media_type_fiber ||
1700 hw->media_type == e1000_media_type_internal_serdes)) 1717 hw->media_type == e1000_media_type_internal_serdes))
1701 tipg = DEFAULT_82543_TIPG_IPGT_FIBER; 1718 tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
@@ -1720,34 +1737,34 @@ e1000_configure_tx(struct e1000_adapter *adapter)
1720 } 1737 }
1721 tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT; 1738 tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
1722 tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT; 1739 tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
1723 E1000_WRITE_REG(hw, TIPG, tipg); 1740 ew32(TIPG, tipg);
1724 1741
1725 /* Set the Tx Interrupt Delay register */ 1742 /* Set the Tx Interrupt Delay register */
1726 1743
1727 E1000_WRITE_REG(hw, TIDV, adapter->tx_int_delay); 1744 ew32(TIDV, adapter->tx_int_delay);
1728 if (hw->mac_type >= e1000_82540) 1745 if (hw->mac_type >= e1000_82540)
1729 E1000_WRITE_REG(hw, TADV, adapter->tx_abs_int_delay); 1746 ew32(TADV, adapter->tx_abs_int_delay);
1730 1747
1731 /* Program the Transmit Control Register */ 1748 /* Program the Transmit Control Register */
1732 1749
1733 tctl = E1000_READ_REG(hw, TCTL); 1750 tctl = er32(TCTL);
1734 tctl &= ~E1000_TCTL_CT; 1751 tctl &= ~E1000_TCTL_CT;
1735 tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC | 1752 tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
1736 (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); 1753 (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
1737 1754
1738 if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) { 1755 if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) {
1739 tarc = E1000_READ_REG(hw, TARC0); 1756 tarc = er32(TARC0);
1740 /* set the speed mode bit, we'll clear it if we're not at 1757 /* set the speed mode bit, we'll clear it if we're not at
1741 * gigabit link later */ 1758 * gigabit link later */
1742 tarc |= (1 << 21); 1759 tarc |= (1 << 21);
1743 E1000_WRITE_REG(hw, TARC0, tarc); 1760 ew32(TARC0, tarc);
1744 } else if (hw->mac_type == e1000_80003es2lan) { 1761 } else if (hw->mac_type == e1000_80003es2lan) {
1745 tarc = E1000_READ_REG(hw, TARC0); 1762 tarc = er32(TARC0);
1746 tarc |= 1; 1763 tarc |= 1;
1747 E1000_WRITE_REG(hw, TARC0, tarc); 1764 ew32(TARC0, tarc);
1748 tarc = E1000_READ_REG(hw, TARC1); 1765 tarc = er32(TARC1);
1749 tarc |= 1; 1766 tarc |= 1;
1750 E1000_WRITE_REG(hw, TARC1, tarc); 1767 ew32(TARC1, tarc);
1751 } 1768 }
1752 1769
1753 e1000_config_collision_dist(hw); 1770 e1000_config_collision_dist(hw);
@@ -1770,7 +1787,7 @@ e1000_configure_tx(struct e1000_adapter *adapter)
1770 hw->bus_type == e1000_bus_type_pcix) 1787 hw->bus_type == e1000_bus_type_pcix)
1771 adapter->pcix_82544 = 1; 1788 adapter->pcix_82544 = 1;
1772 1789
1773 E1000_WRITE_REG(hw, TCTL, tctl); 1790 ew32(TCTL, tctl);
1774 1791
1775} 1792}
1776 1793
@@ -1782,10 +1799,10 @@ e1000_configure_tx(struct e1000_adapter *adapter)
1782 * Returns 0 on success, negative on failure 1799 * Returns 0 on success, negative on failure
1783 **/ 1800 **/
1784 1801
1785static int 1802static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
1786e1000_setup_rx_resources(struct e1000_adapter *adapter, 1803 struct e1000_rx_ring *rxdr)
1787 struct e1000_rx_ring *rxdr)
1788{ 1804{
1805 struct e1000_hw *hw = &adapter->hw;
1789 struct pci_dev *pdev = adapter->pdev; 1806 struct pci_dev *pdev = adapter->pdev;
1790 int size, desc_len; 1807 int size, desc_len;
1791 1808
@@ -1818,7 +1835,7 @@ e1000_setup_rx_resources(struct e1000_adapter *adapter,
1818 return -ENOMEM; 1835 return -ENOMEM;
1819 } 1836 }
1820 1837
1821 if (adapter->hw.mac_type <= e1000_82547_rev_2) 1838 if (hw->mac_type <= e1000_82547_rev_2)
1822 desc_len = sizeof(struct e1000_rx_desc); 1839 desc_len = sizeof(struct e1000_rx_desc);
1823 else 1840 else
1824 desc_len = sizeof(union e1000_rx_desc_packet_split); 1841 desc_len = sizeof(union e1000_rx_desc_packet_split);
@@ -1887,8 +1904,7 @@ setup_rx_desc_die:
1887 * Return 0 on success, negative on failure 1904 * Return 0 on success, negative on failure
1888 **/ 1905 **/
1889 1906
1890int 1907int e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
1891e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
1892{ 1908{
1893 int i, err = 0; 1909 int i, err = 0;
1894 1910
@@ -1913,24 +1929,24 @@ e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
1913 **/ 1929 **/
1914#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \ 1930#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \
1915 (((S) & (PAGE_SIZE - 1)) ? 1 : 0)) 1931 (((S) & (PAGE_SIZE - 1)) ? 1 : 0))
1916static void 1932static void e1000_setup_rctl(struct e1000_adapter *adapter)
1917e1000_setup_rctl(struct e1000_adapter *adapter)
1918{ 1933{
1934 struct e1000_hw *hw = &adapter->hw;
1919 u32 rctl, rfctl; 1935 u32 rctl, rfctl;
1920 u32 psrctl = 0; 1936 u32 psrctl = 0;
1921#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT 1937#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
1922 u32 pages = 0; 1938 u32 pages = 0;
1923#endif 1939#endif
1924 1940
1925 rctl = E1000_READ_REG(&adapter->hw, RCTL); 1941 rctl = er32(RCTL);
1926 1942
1927 rctl &= ~(3 << E1000_RCTL_MO_SHIFT); 1943 rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
1928 1944
1929 rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | 1945 rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
1930 E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | 1946 E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
1931 (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT); 1947 (hw->mc_filter_type << E1000_RCTL_MO_SHIFT);
1932 1948
1933 if (adapter->hw.tbi_compatibility_on == 1) 1949 if (hw->tbi_compatibility_on == 1)
1934 rctl |= E1000_RCTL_SBP; 1950 rctl |= E1000_RCTL_SBP;
1935 else 1951 else
1936 rctl &= ~E1000_RCTL_SBP; 1952 rctl &= ~E1000_RCTL_SBP;
@@ -1983,7 +1999,7 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
1983 /* allocations using alloc_page take too long for regular MTU 1999 /* allocations using alloc_page take too long for regular MTU
1984 * so only enable packet split for jumbo frames */ 2000 * so only enable packet split for jumbo frames */
1985 pages = PAGE_USE_COUNT(adapter->netdev->mtu); 2001 pages = PAGE_USE_COUNT(adapter->netdev->mtu);
1986 if ((adapter->hw.mac_type >= e1000_82571) && (pages <= 3) && 2002 if ((hw->mac_type >= e1000_82571) && (pages <= 3) &&
1987 PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE)) 2003 PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE))
1988 adapter->rx_ps_pages = pages; 2004 adapter->rx_ps_pages = pages;
1989 else 2005 else
@@ -1991,14 +2007,14 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
1991#endif 2007#endif
1992 if (adapter->rx_ps_pages) { 2008 if (adapter->rx_ps_pages) {
1993 /* Configure extra packet-split registers */ 2009 /* Configure extra packet-split registers */
1994 rfctl = E1000_READ_REG(&adapter->hw, RFCTL); 2010 rfctl = er32(RFCTL);
1995 rfctl |= E1000_RFCTL_EXTEN; 2011 rfctl |= E1000_RFCTL_EXTEN;
1996 /* disable packet split support for IPv6 extension headers, 2012 /* disable packet split support for IPv6 extension headers,
1997 * because some malformed IPv6 headers can hang the RX */ 2013 * because some malformed IPv6 headers can hang the RX */
1998 rfctl |= (E1000_RFCTL_IPV6_EX_DIS | 2014 rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
1999 E1000_RFCTL_NEW_IPV6_EXT_DIS); 2015 E1000_RFCTL_NEW_IPV6_EXT_DIS);
2000 2016
2001 E1000_WRITE_REG(&adapter->hw, RFCTL, rfctl); 2017 ew32(RFCTL, rfctl);
2002 2018
2003 rctl |= E1000_RCTL_DTYP_PS; 2019 rctl |= E1000_RCTL_DTYP_PS;
2004 2020
@@ -2018,10 +2034,10 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
2018 break; 2034 break;
2019 } 2035 }
2020 2036
2021 E1000_WRITE_REG(&adapter->hw, PSRCTL, psrctl); 2037 ew32(PSRCTL, psrctl);
2022 } 2038 }
2023 2039
2024 E1000_WRITE_REG(&adapter->hw, RCTL, rctl); 2040 ew32(RCTL, rctl);
2025} 2041}
2026 2042
2027/** 2043/**
@@ -2031,8 +2047,7 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
2031 * Configure the Rx unit of the MAC after a reset. 2047 * Configure the Rx unit of the MAC after a reset.
2032 **/ 2048 **/
2033 2049
2034static void 2050static void e1000_configure_rx(struct e1000_adapter *adapter)
2035e1000_configure_rx(struct e1000_adapter *adapter)
2036{ 2051{
2037 u64 rdba; 2052 u64 rdba;
2038 struct e1000_hw *hw = &adapter->hw; 2053 struct e1000_hw *hw = &adapter->hw;
@@ -2052,30 +2067,27 @@ e1000_configure_rx(struct e1000_adapter *adapter)
2052 } 2067 }
2053 2068
2054 /* disable receives while setting up the descriptors */ 2069 /* disable receives while setting up the descriptors */
2055 rctl = E1000_READ_REG(hw, RCTL); 2070 rctl = er32(RCTL);
2056 E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN); 2071 ew32(RCTL, rctl & ~E1000_RCTL_EN);
2057 2072
2058 /* set the Receive Delay Timer Register */ 2073 /* set the Receive Delay Timer Register */
2059 E1000_WRITE_REG(hw, RDTR, adapter->rx_int_delay); 2074 ew32(RDTR, adapter->rx_int_delay);
2060 2075
2061 if (hw->mac_type >= e1000_82540) { 2076 if (hw->mac_type >= e1000_82540) {
2062 E1000_WRITE_REG(hw, RADV, adapter->rx_abs_int_delay); 2077 ew32(RADV, adapter->rx_abs_int_delay);
2063 if (adapter->itr_setting != 0) 2078 if (adapter->itr_setting != 0)
2064 E1000_WRITE_REG(hw, ITR, 2079 ew32(ITR, 1000000000 / (adapter->itr * 256));
2065 1000000000 / (adapter->itr * 256));
2066 } 2080 }
2067 2081
2068 if (hw->mac_type >= e1000_82571) { 2082 if (hw->mac_type >= e1000_82571) {
2069 ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 2083 ctrl_ext = er32(CTRL_EXT);
2070 /* Reset delay timers after every interrupt */ 2084 /* Reset delay timers after every interrupt */
2071 ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; 2085 ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR;
2072#ifdef CONFIG_E1000_NAPI
2073 /* Auto-Mask interrupts upon ICR access */ 2086 /* Auto-Mask interrupts upon ICR access */
2074 ctrl_ext |= E1000_CTRL_EXT_IAME; 2087 ctrl_ext |= E1000_CTRL_EXT_IAME;
2075 E1000_WRITE_REG(hw, IAM, 0xffffffff); 2088 ew32(IAM, 0xffffffff);
2076#endif 2089 ew32(CTRL_EXT, ctrl_ext);
2077 E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 2090 E1000_WRITE_FLUSH();
2078 E1000_WRITE_FLUSH(hw);
2079 } 2091 }
2080 2092
2081 /* Setup the HW Rx Head and Tail Descriptor Pointers and 2093 /* Setup the HW Rx Head and Tail Descriptor Pointers and
@@ -2084,11 +2096,11 @@ e1000_configure_rx(struct e1000_adapter *adapter)
2084 case 1: 2096 case 1:
2085 default: 2097 default:
2086 rdba = adapter->rx_ring[0].dma; 2098 rdba = adapter->rx_ring[0].dma;
2087 E1000_WRITE_REG(hw, RDLEN, rdlen); 2099 ew32(RDLEN, rdlen);
2088 E1000_WRITE_REG(hw, RDBAH, (rdba >> 32)); 2100 ew32(RDBAH, (rdba >> 32));
2089 E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL)); 2101 ew32(RDBAL, (rdba & 0x00000000ffffffffULL));
2090 E1000_WRITE_REG(hw, RDT, 0); 2102 ew32(RDT, 0);
2091 E1000_WRITE_REG(hw, RDH, 0); 2103 ew32(RDH, 0);
2092 adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH); 2104 adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH);
2093 adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT); 2105 adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT);
2094 break; 2106 break;
@@ -2096,7 +2108,7 @@ e1000_configure_rx(struct e1000_adapter *adapter)
2096 2108
2097 /* Enable 82543 Receive Checksum Offload for TCP and UDP */ 2109 /* Enable 82543 Receive Checksum Offload for TCP and UDP */
2098 if (hw->mac_type >= e1000_82543) { 2110 if (hw->mac_type >= e1000_82543) {
2099 rxcsum = E1000_READ_REG(hw, RXCSUM); 2111 rxcsum = er32(RXCSUM);
2100 if (adapter->rx_csum) { 2112 if (adapter->rx_csum) {
2101 rxcsum |= E1000_RXCSUM_TUOFL; 2113 rxcsum |= E1000_RXCSUM_TUOFL;
2102 2114
@@ -2110,17 +2122,17 @@ e1000_configure_rx(struct e1000_adapter *adapter)
2110 rxcsum &= ~E1000_RXCSUM_TUOFL; 2122 rxcsum &= ~E1000_RXCSUM_TUOFL;
2111 /* don't need to clear IPPCSE as it defaults to 0 */ 2123 /* don't need to clear IPPCSE as it defaults to 0 */
2112 } 2124 }
2113 E1000_WRITE_REG(hw, RXCSUM, rxcsum); 2125 ew32(RXCSUM, rxcsum);
2114 } 2126 }
2115 2127
2116 /* enable early receives on 82573, only takes effect if using > 2048 2128 /* enable early receives on 82573, only takes effect if using > 2048
2117 * byte total frame size. for example only for jumbo frames */ 2129 * byte total frame size. for example only for jumbo frames */
2118#define E1000_ERT_2048 0x100 2130#define E1000_ERT_2048 0x100
2119 if (hw->mac_type == e1000_82573) 2131 if (hw->mac_type == e1000_82573)
2120 E1000_WRITE_REG(hw, ERT, E1000_ERT_2048); 2132 ew32(ERT, E1000_ERT_2048);
2121 2133
2122 /* Enable Receives */ 2134 /* Enable Receives */
2123 E1000_WRITE_REG(hw, RCTL, rctl); 2135 ew32(RCTL, rctl);
2124} 2136}
2125 2137
2126/** 2138/**
@@ -2131,9 +2143,8 @@ e1000_configure_rx(struct e1000_adapter *adapter)
2131 * Free all transmit software resources 2143 * Free all transmit software resources
2132 **/ 2144 **/
2133 2145
2134static void 2146static void e1000_free_tx_resources(struct e1000_adapter *adapter,
2135e1000_free_tx_resources(struct e1000_adapter *adapter, 2147 struct e1000_tx_ring *tx_ring)
2136 struct e1000_tx_ring *tx_ring)
2137{ 2148{
2138 struct pci_dev *pdev = adapter->pdev; 2149 struct pci_dev *pdev = adapter->pdev;
2139 2150
@@ -2154,8 +2165,7 @@ e1000_free_tx_resources(struct e1000_adapter *adapter,
2154 * Free all transmit software resources 2165 * Free all transmit software resources
2155 **/ 2166 **/
2156 2167
2157void 2168void e1000_free_all_tx_resources(struct e1000_adapter *adapter)
2158e1000_free_all_tx_resources(struct e1000_adapter *adapter)
2159{ 2169{
2160 int i; 2170 int i;
2161 2171
@@ -2163,9 +2173,8 @@ e1000_free_all_tx_resources(struct e1000_adapter *adapter)
2163 e1000_free_tx_resources(adapter, &adapter->tx_ring[i]); 2173 e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
2164} 2174}
2165 2175
2166static void 2176static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
2167e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, 2177 struct e1000_buffer *buffer_info)
2168 struct e1000_buffer *buffer_info)
2169{ 2178{
2170 if (buffer_info->dma) { 2179 if (buffer_info->dma) {
2171 pci_unmap_page(adapter->pdev, 2180 pci_unmap_page(adapter->pdev,
@@ -2187,10 +2196,10 @@ e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
2187 * @tx_ring: ring to be cleaned 2196 * @tx_ring: ring to be cleaned
2188 **/ 2197 **/
2189 2198
2190static void 2199static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
2191e1000_clean_tx_ring(struct e1000_adapter *adapter, 2200 struct e1000_tx_ring *tx_ring)
2192 struct e1000_tx_ring *tx_ring)
2193{ 2201{
2202 struct e1000_hw *hw = &adapter->hw;
2194 struct e1000_buffer *buffer_info; 2203 struct e1000_buffer *buffer_info;
2195 unsigned long size; 2204 unsigned long size;
2196 unsigned int i; 2205 unsigned int i;
@@ -2213,8 +2222,8 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter,
2213 tx_ring->next_to_clean = 0; 2222 tx_ring->next_to_clean = 0;
2214 tx_ring->last_tx_tso = 0; 2223 tx_ring->last_tx_tso = 0;
2215 2224
2216 writel(0, adapter->hw.hw_addr + tx_ring->tdh); 2225 writel(0, hw->hw_addr + tx_ring->tdh);
2217 writel(0, adapter->hw.hw_addr + tx_ring->tdt); 2226 writel(0, hw->hw_addr + tx_ring->tdt);
2218} 2227}
2219 2228
2220/** 2229/**
@@ -2222,8 +2231,7 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter,
2222 * @adapter: board private structure 2231 * @adapter: board private structure
2223 **/ 2232 **/
2224 2233
2225static void 2234static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
2226e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
2227{ 2235{
2228 int i; 2236 int i;
2229 2237
@@ -2239,9 +2247,8 @@ e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
2239 * Free all receive software resources 2247 * Free all receive software resources
2240 **/ 2248 **/
2241 2249
2242static void 2250static void e1000_free_rx_resources(struct e1000_adapter *adapter,
2243e1000_free_rx_resources(struct e1000_adapter *adapter, 2251 struct e1000_rx_ring *rx_ring)
2244 struct e1000_rx_ring *rx_ring)
2245{ 2252{
2246 struct pci_dev *pdev = adapter->pdev; 2253 struct pci_dev *pdev = adapter->pdev;
2247 2254
@@ -2266,8 +2273,7 @@ e1000_free_rx_resources(struct e1000_adapter *adapter,
2266 * Free all receive software resources 2273 * Free all receive software resources
2267 **/ 2274 **/
2268 2275
2269void 2276void e1000_free_all_rx_resources(struct e1000_adapter *adapter)
2270e1000_free_all_rx_resources(struct e1000_adapter *adapter)
2271{ 2277{
2272 int i; 2278 int i;
2273 2279
@@ -2281,10 +2287,10 @@ e1000_free_all_rx_resources(struct e1000_adapter *adapter)
2281 * @rx_ring: ring to free buffers from 2287 * @rx_ring: ring to free buffers from
2282 **/ 2288 **/
2283 2289
2284static void 2290static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
2285e1000_clean_rx_ring(struct e1000_adapter *adapter, 2291 struct e1000_rx_ring *rx_ring)
2286 struct e1000_rx_ring *rx_ring)
2287{ 2292{
2293 struct e1000_hw *hw = &adapter->hw;
2288 struct e1000_buffer *buffer_info; 2294 struct e1000_buffer *buffer_info;
2289 struct e1000_ps_page *ps_page; 2295 struct e1000_ps_page *ps_page;
2290 struct e1000_ps_page_dma *ps_page_dma; 2296 struct e1000_ps_page_dma *ps_page_dma;
@@ -2331,8 +2337,8 @@ e1000_clean_rx_ring(struct e1000_adapter *adapter,
2331 rx_ring->next_to_clean = 0; 2337 rx_ring->next_to_clean = 0;
2332 rx_ring->next_to_use = 0; 2338 rx_ring->next_to_use = 0;
2333 2339
2334 writel(0, adapter->hw.hw_addr + rx_ring->rdh); 2340 writel(0, hw->hw_addr + rx_ring->rdh);
2335 writel(0, adapter->hw.hw_addr + rx_ring->rdt); 2341 writel(0, hw->hw_addr + rx_ring->rdt);
2336} 2342}
2337 2343
2338/** 2344/**
@@ -2340,8 +2346,7 @@ e1000_clean_rx_ring(struct e1000_adapter *adapter,
2340 * @adapter: board private structure 2346 * @adapter: board private structure
2341 **/ 2347 **/
2342 2348
2343static void 2349static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
2344e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
2345{ 2350{
2346 int i; 2351 int i;
2347 2352
@@ -2352,38 +2357,38 @@ e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
2352/* The 82542 2.0 (revision 2) needs to have the receive unit in reset 2357/* The 82542 2.0 (revision 2) needs to have the receive unit in reset
2353 * and memory write and invalidate disabled for certain operations 2358 * and memory write and invalidate disabled for certain operations
2354 */ 2359 */
2355static void 2360static void e1000_enter_82542_rst(struct e1000_adapter *adapter)
2356e1000_enter_82542_rst(struct e1000_adapter *adapter)
2357{ 2361{
2362 struct e1000_hw *hw = &adapter->hw;
2358 struct net_device *netdev = adapter->netdev; 2363 struct net_device *netdev = adapter->netdev;
2359 u32 rctl; 2364 u32 rctl;
2360 2365
2361 e1000_pci_clear_mwi(&adapter->hw); 2366 e1000_pci_clear_mwi(hw);
2362 2367
2363 rctl = E1000_READ_REG(&adapter->hw, RCTL); 2368 rctl = er32(RCTL);
2364 rctl |= E1000_RCTL_RST; 2369 rctl |= E1000_RCTL_RST;
2365 E1000_WRITE_REG(&adapter->hw, RCTL, rctl); 2370 ew32(RCTL, rctl);
2366 E1000_WRITE_FLUSH(&adapter->hw); 2371 E1000_WRITE_FLUSH();
2367 mdelay(5); 2372 mdelay(5);
2368 2373
2369 if (netif_running(netdev)) 2374 if (netif_running(netdev))
2370 e1000_clean_all_rx_rings(adapter); 2375 e1000_clean_all_rx_rings(adapter);
2371} 2376}
2372 2377
2373static void 2378static void e1000_leave_82542_rst(struct e1000_adapter *adapter)
2374e1000_leave_82542_rst(struct e1000_adapter *adapter)
2375{ 2379{
2380 struct e1000_hw *hw = &adapter->hw;
2376 struct net_device *netdev = adapter->netdev; 2381 struct net_device *netdev = adapter->netdev;
2377 u32 rctl; 2382 u32 rctl;
2378 2383
2379 rctl = E1000_READ_REG(&adapter->hw, RCTL); 2384 rctl = er32(RCTL);
2380 rctl &= ~E1000_RCTL_RST; 2385 rctl &= ~E1000_RCTL_RST;
2381 E1000_WRITE_REG(&adapter->hw, RCTL, rctl); 2386 ew32(RCTL, rctl);
2382 E1000_WRITE_FLUSH(&adapter->hw); 2387 E1000_WRITE_FLUSH();
2383 mdelay(5); 2388 mdelay(5);
2384 2389
2385 if (adapter->hw.pci_cmd_word & PCI_COMMAND_INVALIDATE) 2390 if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
2386 e1000_pci_set_mwi(&adapter->hw); 2391 e1000_pci_set_mwi(hw);
2387 2392
2388 if (netif_running(netdev)) { 2393 if (netif_running(netdev)) {
2389 /* No need to loop, because 82542 supports only 1 queue */ 2394 /* No need to loop, because 82542 supports only 1 queue */
@@ -2401,10 +2406,10 @@ e1000_leave_82542_rst(struct e1000_adapter *adapter)
2401 * Returns 0 on success, negative on failure 2406 * Returns 0 on success, negative on failure
2402 **/ 2407 **/
2403 2408
2404static int 2409static int e1000_set_mac(struct net_device *netdev, void *p)
2405e1000_set_mac(struct net_device *netdev, void *p)
2406{ 2410{
2407 struct e1000_adapter *adapter = netdev_priv(netdev); 2411 struct e1000_adapter *adapter = netdev_priv(netdev);
2412 struct e1000_hw *hw = &adapter->hw;
2408 struct sockaddr *addr = p; 2413 struct sockaddr *addr = p;
2409 2414
2410 if (!is_valid_ether_addr(addr->sa_data)) 2415 if (!is_valid_ether_addr(addr->sa_data))
@@ -2412,19 +2417,19 @@ e1000_set_mac(struct net_device *netdev, void *p)
2412 2417
2413 /* 82542 2.0 needs to be in reset to write receive address registers */ 2418 /* 82542 2.0 needs to be in reset to write receive address registers */
2414 2419
2415 if (adapter->hw.mac_type == e1000_82542_rev2_0) 2420 if (hw->mac_type == e1000_82542_rev2_0)
2416 e1000_enter_82542_rst(adapter); 2421 e1000_enter_82542_rst(adapter);
2417 2422
2418 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); 2423 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
2419 memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len); 2424 memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len);
2420 2425
2421 e1000_rar_set(&adapter->hw, adapter->hw.mac_addr, 0); 2426 e1000_rar_set(hw, hw->mac_addr, 0);
2422 2427
2423 /* With 82571 controllers, LAA may be overwritten (with the default) 2428 /* With 82571 controllers, LAA may be overwritten (with the default)
2424 * due to controller reset from the other port. */ 2429 * due to controller reset from the other port. */
2425 if (adapter->hw.mac_type == e1000_82571) { 2430 if (hw->mac_type == e1000_82571) {
2426 /* activate the work around */ 2431 /* activate the work around */
2427 adapter->hw.laa_is_present = 1; 2432 hw->laa_is_present = 1;
2428 2433
2429 /* Hold a copy of the LAA in RAR[14] This is done so that 2434 /* Hold a copy of the LAA in RAR[14] This is done so that
2430 * between the time RAR[0] gets clobbered and the time it 2435 * between the time RAR[0] gets clobbered and the time it
@@ -2432,11 +2437,11 @@ e1000_set_mac(struct net_device *netdev, void *p)
2432 * of the RARs and no incoming packets directed to this port 2437 * of the RARs and no incoming packets directed to this port
2433 * are dropped. Eventaully the LAA will be in RAR[0] and 2438 * are dropped. Eventaully the LAA will be in RAR[0] and
2434 * RAR[14] */ 2439 * RAR[14] */
2435 e1000_rar_set(&adapter->hw, adapter->hw.mac_addr, 2440 e1000_rar_set(hw, hw->mac_addr,
2436 E1000_RAR_ENTRIES - 1); 2441 E1000_RAR_ENTRIES - 1);
2437 } 2442 }
2438 2443
2439 if (adapter->hw.mac_type == e1000_82542_rev2_0) 2444 if (hw->mac_type == e1000_82542_rev2_0)
2440 e1000_leave_82542_rst(adapter); 2445 e1000_leave_82542_rst(adapter);
2441 2446
2442 return 0; 2447 return 0;
@@ -2452,8 +2457,7 @@ e1000_set_mac(struct net_device *netdev, void *p)
2452 * promiscuous mode, and all-multi behavior. 2457 * promiscuous mode, and all-multi behavior.
2453 **/ 2458 **/
2454 2459
2455static void 2460static void e1000_set_rx_mode(struct net_device *netdev)
2456e1000_set_rx_mode(struct net_device *netdev)
2457{ 2461{
2458 struct e1000_adapter *adapter = netdev_priv(netdev); 2462 struct e1000_adapter *adapter = netdev_priv(netdev);
2459 struct e1000_hw *hw = &adapter->hw; 2463 struct e1000_hw *hw = &adapter->hw;
@@ -2466,16 +2470,16 @@ e1000_set_rx_mode(struct net_device *netdev)
2466 E1000_NUM_MTA_REGISTERS_ICH8LAN : 2470 E1000_NUM_MTA_REGISTERS_ICH8LAN :
2467 E1000_NUM_MTA_REGISTERS; 2471 E1000_NUM_MTA_REGISTERS;
2468 2472
2469 if (adapter->hw.mac_type == e1000_ich8lan) 2473 if (hw->mac_type == e1000_ich8lan)
2470 rar_entries = E1000_RAR_ENTRIES_ICH8LAN; 2474 rar_entries = E1000_RAR_ENTRIES_ICH8LAN;
2471 2475
2472 /* reserve RAR[14] for LAA over-write work-around */ 2476 /* reserve RAR[14] for LAA over-write work-around */
2473 if (adapter->hw.mac_type == e1000_82571) 2477 if (hw->mac_type == e1000_82571)
2474 rar_entries--; 2478 rar_entries--;
2475 2479
2476 /* Check for Promiscuous and All Multicast modes */ 2480 /* Check for Promiscuous and All Multicast modes */
2477 2481
2478 rctl = E1000_READ_REG(hw, RCTL); 2482 rctl = er32(RCTL);
2479 2483
2480 if (netdev->flags & IFF_PROMISC) { 2484 if (netdev->flags & IFF_PROMISC) {
2481 rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); 2485 rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
@@ -2498,7 +2502,7 @@ e1000_set_rx_mode(struct net_device *netdev)
2498 uc_ptr = netdev->uc_list; 2502 uc_ptr = netdev->uc_list;
2499 } 2503 }
2500 2504
2501 E1000_WRITE_REG(hw, RCTL, rctl); 2505 ew32(RCTL, rctl);
2502 2506
2503 /* 82542 2.0 needs to be in reset to write receive address registers */ 2507 /* 82542 2.0 needs to be in reset to write receive address registers */
2504 2508
@@ -2524,9 +2528,9 @@ e1000_set_rx_mode(struct net_device *netdev)
2524 mc_ptr = mc_ptr->next; 2528 mc_ptr = mc_ptr->next;
2525 } else { 2529 } else {
2526 E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0); 2530 E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
2527 E1000_WRITE_FLUSH(hw); 2531 E1000_WRITE_FLUSH();
2528 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0); 2532 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
2529 E1000_WRITE_FLUSH(hw); 2533 E1000_WRITE_FLUSH();
2530 } 2534 }
2531 } 2535 }
2532 WARN_ON(uc_ptr != NULL); 2536 WARN_ON(uc_ptr != NULL);
@@ -2535,7 +2539,7 @@ e1000_set_rx_mode(struct net_device *netdev)
2535 2539
2536 for (i = 0; i < mta_reg_count; i++) { 2540 for (i = 0; i < mta_reg_count; i++) {
2537 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); 2541 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
2538 E1000_WRITE_FLUSH(hw); 2542 E1000_WRITE_FLUSH();
2539 } 2543 }
2540 2544
2541 /* load any remaining addresses into the hash table */ 2545 /* load any remaining addresses into the hash table */
@@ -2552,11 +2556,11 @@ e1000_set_rx_mode(struct net_device *netdev)
2552/* Need to wait a few seconds after link up to get diagnostic information from 2556/* Need to wait a few seconds after link up to get diagnostic information from
2553 * the phy */ 2557 * the phy */
2554 2558
2555static void 2559static void e1000_update_phy_info(unsigned long data)
2556e1000_update_phy_info(unsigned long data)
2557{ 2560{
2558 struct e1000_adapter *adapter = (struct e1000_adapter *) data; 2561 struct e1000_adapter *adapter = (struct e1000_adapter *)data;
2559 e1000_phy_get_info(&adapter->hw, &adapter->phy_info); 2562 struct e1000_hw *hw = &adapter->hw;
2563 e1000_phy_get_info(hw, &adapter->phy_info);
2560} 2564}
2561 2565
2562/** 2566/**
@@ -2564,33 +2568,25 @@ e1000_update_phy_info(unsigned long data)
2564 * @data: pointer to adapter cast into an unsigned long 2568 * @data: pointer to adapter cast into an unsigned long
2565 **/ 2569 **/
2566 2570
2567static void 2571static void e1000_82547_tx_fifo_stall(unsigned long data)
2568e1000_82547_tx_fifo_stall(unsigned long data)
2569{ 2572{
2570 struct e1000_adapter *adapter = (struct e1000_adapter *) data; 2573 struct e1000_adapter *adapter = (struct e1000_adapter *)data;
2574 struct e1000_hw *hw = &adapter->hw;
2571 struct net_device *netdev = adapter->netdev; 2575 struct net_device *netdev = adapter->netdev;
2572 u32 tctl; 2576 u32 tctl;
2573 2577
2574 if (atomic_read(&adapter->tx_fifo_stall)) { 2578 if (atomic_read(&adapter->tx_fifo_stall)) {
2575 if ((E1000_READ_REG(&adapter->hw, TDT) == 2579 if ((er32(TDT) == er32(TDH)) &&
2576 E1000_READ_REG(&adapter->hw, TDH)) && 2580 (er32(TDFT) == er32(TDFH)) &&
2577 (E1000_READ_REG(&adapter->hw, TDFT) == 2581 (er32(TDFTS) == er32(TDFHS))) {
2578 E1000_READ_REG(&adapter->hw, TDFH)) && 2582 tctl = er32(TCTL);
2579 (E1000_READ_REG(&adapter->hw, TDFTS) == 2583 ew32(TCTL, tctl & ~E1000_TCTL_EN);
2580 E1000_READ_REG(&adapter->hw, TDFHS))) { 2584 ew32(TDFT, adapter->tx_head_addr);
2581 tctl = E1000_READ_REG(&adapter->hw, TCTL); 2585 ew32(TDFH, adapter->tx_head_addr);
2582 E1000_WRITE_REG(&adapter->hw, TCTL, 2586 ew32(TDFTS, adapter->tx_head_addr);
2583 tctl & ~E1000_TCTL_EN); 2587 ew32(TDFHS, adapter->tx_head_addr);
2584 E1000_WRITE_REG(&adapter->hw, TDFT, 2588 ew32(TCTL, tctl);
2585 adapter->tx_head_addr); 2589 E1000_WRITE_FLUSH();
2586 E1000_WRITE_REG(&adapter->hw, TDFH,
2587 adapter->tx_head_addr);
2588 E1000_WRITE_REG(&adapter->hw, TDFTS,
2589 adapter->tx_head_addr);
2590 E1000_WRITE_REG(&adapter->hw, TDFHS,
2591 adapter->tx_head_addr);
2592 E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
2593 E1000_WRITE_FLUSH(&adapter->hw);
2594 2590
2595 adapter->tx_fifo_head = 0; 2591 adapter->tx_fifo_head = 0;
2596 atomic_set(&adapter->tx_fifo_stall, 0); 2592 atomic_set(&adapter->tx_fifo_stall, 0);
@@ -2605,45 +2601,45 @@ e1000_82547_tx_fifo_stall(unsigned long data)
2605 * e1000_watchdog - Timer Call-back 2601 * e1000_watchdog - Timer Call-back
2606 * @data: pointer to adapter cast into an unsigned long 2602 * @data: pointer to adapter cast into an unsigned long
2607 **/ 2603 **/
2608static void 2604static void e1000_watchdog(unsigned long data)
2609e1000_watchdog(unsigned long data)
2610{ 2605{
2611 struct e1000_adapter *adapter = (struct e1000_adapter *) data; 2606 struct e1000_adapter *adapter = (struct e1000_adapter *)data;
2607 struct e1000_hw *hw = &adapter->hw;
2612 struct net_device *netdev = adapter->netdev; 2608 struct net_device *netdev = adapter->netdev;
2613 struct e1000_tx_ring *txdr = adapter->tx_ring; 2609 struct e1000_tx_ring *txdr = adapter->tx_ring;
2614 u32 link, tctl; 2610 u32 link, tctl;
2615 s32 ret_val; 2611 s32 ret_val;
2616 2612
2617 ret_val = e1000_check_for_link(&adapter->hw); 2613 ret_val = e1000_check_for_link(hw);
2618 if ((ret_val == E1000_ERR_PHY) && 2614 if ((ret_val == E1000_ERR_PHY) &&
2619 (adapter->hw.phy_type == e1000_phy_igp_3) && 2615 (hw->phy_type == e1000_phy_igp_3) &&
2620 (E1000_READ_REG(&adapter->hw, CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) { 2616 (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
2621 /* See e1000_kumeran_lock_loss_workaround() */ 2617 /* See e1000_kumeran_lock_loss_workaround() */
2622 DPRINTK(LINK, INFO, 2618 DPRINTK(LINK, INFO,
2623 "Gigabit has been disabled, downgrading speed\n"); 2619 "Gigabit has been disabled, downgrading speed\n");
2624 } 2620 }
2625 2621
2626 if (adapter->hw.mac_type == e1000_82573) { 2622 if (hw->mac_type == e1000_82573) {
2627 e1000_enable_tx_pkt_filtering(&adapter->hw); 2623 e1000_enable_tx_pkt_filtering(hw);
2628 if (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id) 2624 if (adapter->mng_vlan_id != hw->mng_cookie.vlan_id)
2629 e1000_update_mng_vlan(adapter); 2625 e1000_update_mng_vlan(adapter);
2630 } 2626 }
2631 2627
2632 if ((adapter->hw.media_type == e1000_media_type_internal_serdes) && 2628 if ((hw->media_type == e1000_media_type_internal_serdes) &&
2633 !(E1000_READ_REG(&adapter->hw, TXCW) & E1000_TXCW_ANE)) 2629 !(er32(TXCW) & E1000_TXCW_ANE))
2634 link = !adapter->hw.serdes_link_down; 2630 link = !hw->serdes_link_down;
2635 else 2631 else
2636 link = E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU; 2632 link = er32(STATUS) & E1000_STATUS_LU;
2637 2633
2638 if (link) { 2634 if (link) {
2639 if (!netif_carrier_ok(netdev)) { 2635 if (!netif_carrier_ok(netdev)) {
2640 u32 ctrl; 2636 u32 ctrl;
2641 bool txb2b = true; 2637 bool txb2b = true;
2642 e1000_get_speed_and_duplex(&adapter->hw, 2638 e1000_get_speed_and_duplex(hw,
2643 &adapter->link_speed, 2639 &adapter->link_speed,
2644 &adapter->link_duplex); 2640 &adapter->link_duplex);
2645 2641
2646 ctrl = E1000_READ_REG(&adapter->hw, CTRL); 2642 ctrl = er32(CTRL);
2647 DPRINTK(LINK, INFO, "NIC Link is Up %d Mbps %s, " 2643 DPRINTK(LINK, INFO, "NIC Link is Up %d Mbps %s, "
2648 "Flow Control: %s\n", 2644 "Flow Control: %s\n",
2649 adapter->link_speed, 2645 adapter->link_speed,
@@ -2671,19 +2667,19 @@ e1000_watchdog(unsigned long data)
2671 break; 2667 break;
2672 } 2668 }
2673 2669
2674 if ((adapter->hw.mac_type == e1000_82571 || 2670 if ((hw->mac_type == e1000_82571 ||
2675 adapter->hw.mac_type == e1000_82572) && 2671 hw->mac_type == e1000_82572) &&
2676 !txb2b) { 2672 !txb2b) {
2677 u32 tarc0; 2673 u32 tarc0;
2678 tarc0 = E1000_READ_REG(&adapter->hw, TARC0); 2674 tarc0 = er32(TARC0);
2679 tarc0 &= ~(1 << 21); 2675 tarc0 &= ~(1 << 21);
2680 E1000_WRITE_REG(&adapter->hw, TARC0, tarc0); 2676 ew32(TARC0, tarc0);
2681 } 2677 }
2682 2678
2683 /* disable TSO for pcie and 10/100 speeds, to avoid 2679 /* disable TSO for pcie and 10/100 speeds, to avoid
2684 * some hardware issues */ 2680 * some hardware issues */
2685 if (!adapter->tso_force && 2681 if (!adapter->tso_force &&
2686 adapter->hw.bus_type == e1000_bus_type_pci_express){ 2682 hw->bus_type == e1000_bus_type_pci_express){
2687 switch (adapter->link_speed) { 2683 switch (adapter->link_speed) {
2688 case SPEED_10: 2684 case SPEED_10:
2689 case SPEED_100: 2685 case SPEED_100:
@@ -2704,9 +2700,9 @@ e1000_watchdog(unsigned long data)
2704 2700
2705 /* enable transmits in the hardware, need to do this 2701 /* enable transmits in the hardware, need to do this
2706 * after setting TARC0 */ 2702 * after setting TARC0 */
2707 tctl = E1000_READ_REG(&adapter->hw, TCTL); 2703 tctl = er32(TCTL);
2708 tctl |= E1000_TCTL_EN; 2704 tctl |= E1000_TCTL_EN;
2709 E1000_WRITE_REG(&adapter->hw, TCTL, tctl); 2705 ew32(TCTL, tctl);
2710 2706
2711 netif_carrier_on(netdev); 2707 netif_carrier_on(netdev);
2712 netif_wake_queue(netdev); 2708 netif_wake_queue(netdev);
@@ -2714,10 +2710,9 @@ e1000_watchdog(unsigned long data)
2714 adapter->smartspeed = 0; 2710 adapter->smartspeed = 0;
2715 } else { 2711 } else {
2716 /* make sure the receive unit is started */ 2712 /* make sure the receive unit is started */
2717 if (adapter->hw.rx_needs_kicking) { 2713 if (hw->rx_needs_kicking) {
2718 struct e1000_hw *hw = &adapter->hw; 2714 u32 rctl = er32(RCTL);
2719 u32 rctl = E1000_READ_REG(hw, RCTL); 2715 ew32(RCTL, rctl | E1000_RCTL_EN);
2720 E1000_WRITE_REG(hw, RCTL, rctl | E1000_RCTL_EN);
2721 } 2716 }
2722 } 2717 }
2723 } else { 2718 } else {
@@ -2734,7 +2729,7 @@ e1000_watchdog(unsigned long data)
2734 * disable receives in the ISR and 2729 * disable receives in the ISR and
2735 * reset device here in the watchdog 2730 * reset device here in the watchdog
2736 */ 2731 */
2737 if (adapter->hw.mac_type == e1000_80003es2lan) 2732 if (hw->mac_type == e1000_80003es2lan)
2738 /* reset device */ 2733 /* reset device */
2739 schedule_work(&adapter->reset_task); 2734 schedule_work(&adapter->reset_task);
2740 } 2735 }
@@ -2744,9 +2739,9 @@ e1000_watchdog(unsigned long data)
2744 2739
2745 e1000_update_stats(adapter); 2740 e1000_update_stats(adapter);
2746 2741
2747 adapter->hw.tx_packet_delta = adapter->stats.tpt - adapter->tpt_old; 2742 hw->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
2748 adapter->tpt_old = adapter->stats.tpt; 2743 adapter->tpt_old = adapter->stats.tpt;
2749 adapter->hw.collision_delta = adapter->stats.colc - adapter->colc_old; 2744 hw->collision_delta = adapter->stats.colc - adapter->colc_old;
2750 adapter->colc_old = adapter->stats.colc; 2745 adapter->colc_old = adapter->stats.colc;
2751 2746
2752 adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old; 2747 adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old;
@@ -2754,7 +2749,7 @@ e1000_watchdog(unsigned long data)
2754 adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old; 2749 adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old;
2755 adapter->gotcl_old = adapter->stats.gotcl; 2750 adapter->gotcl_old = adapter->stats.gotcl;
2756 2751
2757 e1000_update_adaptive(&adapter->hw); 2752 e1000_update_adaptive(hw);
2758 2753
2759 if (!netif_carrier_ok(netdev)) { 2754 if (!netif_carrier_ok(netdev)) {
2760 if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) { 2755 if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
@@ -2768,15 +2763,15 @@ e1000_watchdog(unsigned long data)
2768 } 2763 }
2769 2764
2770 /* Cause software interrupt to ensure rx ring is cleaned */ 2765 /* Cause software interrupt to ensure rx ring is cleaned */
2771 E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_RXDMT0); 2766 ew32(ICS, E1000_ICS_RXDMT0);
2772 2767
2773 /* Force detection of hung controller every watchdog period */ 2768 /* Force detection of hung controller every watchdog period */
2774 adapter->detect_tx_hung = true; 2769 adapter->detect_tx_hung = true;
2775 2770
2776 /* With 82571 controllers, LAA may be overwritten due to controller 2771 /* With 82571 controllers, LAA may be overwritten due to controller
2777 * reset from the other port. Set the appropriate LAA in RAR[0] */ 2772 * reset from the other port. Set the appropriate LAA in RAR[0] */
2778 if (adapter->hw.mac_type == e1000_82571 && adapter->hw.laa_is_present) 2773 if (hw->mac_type == e1000_82571 && hw->laa_is_present)
2779 e1000_rar_set(&adapter->hw, adapter->hw.mac_addr, 0); 2774 e1000_rar_set(hw, hw->mac_addr, 0);
2780 2775
2781 /* Reset the timer */ 2776 /* Reset the timer */
2782 mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ)); 2777 mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ));
@@ -2806,9 +2801,7 @@ enum latency_range {
2806 * @bytes: the number of bytes during this measurement interval 2801 * @bytes: the number of bytes during this measurement interval
2807 **/ 2802 **/
2808static unsigned int e1000_update_itr(struct e1000_adapter *adapter, 2803static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
2809 u16 itr_setting, 2804 u16 itr_setting, int packets, int bytes)
2810 int packets,
2811 int bytes)
2812{ 2805{
2813 unsigned int retval = itr_setting; 2806 unsigned int retval = itr_setting;
2814 struct e1000_hw *hw = &adapter->hw; 2807 struct e1000_hw *hw = &adapter->hw;
@@ -2913,7 +2906,7 @@ set_itr_now:
2913 min(adapter->itr + (new_itr >> 2), new_itr) : 2906 min(adapter->itr + (new_itr >> 2), new_itr) :
2914 new_itr; 2907 new_itr;
2915 adapter->itr = new_itr; 2908 adapter->itr = new_itr;
2916 E1000_WRITE_REG(hw, ITR, 1000000000 / (new_itr * 256)); 2909 ew32(ITR, 1000000000 / (new_itr * 256));
2917 } 2910 }
2918 2911
2919 return; 2912 return;
@@ -2926,9 +2919,8 @@ set_itr_now:
2926#define E1000_TX_FLAGS_VLAN_MASK 0xffff0000 2919#define E1000_TX_FLAGS_VLAN_MASK 0xffff0000
2927#define E1000_TX_FLAGS_VLAN_SHIFT 16 2920#define E1000_TX_FLAGS_VLAN_SHIFT 16
2928 2921
2929static int 2922static int e1000_tso(struct e1000_adapter *adapter,
2930e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, 2923 struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
2931 struct sk_buff *skb)
2932{ 2924{
2933 struct e1000_context_desc *context_desc; 2925 struct e1000_context_desc *context_desc;
2934 struct e1000_buffer *buffer_info; 2926 struct e1000_buffer *buffer_info;
@@ -2999,9 +2991,8 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
2999 return false; 2991 return false;
3000} 2992}
3001 2993
3002static bool 2994static bool e1000_tx_csum(struct e1000_adapter *adapter,
3003e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, 2995 struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
3004 struct sk_buff *skb)
3005{ 2996{
3006 struct e1000_context_desc *context_desc; 2997 struct e1000_context_desc *context_desc;
3007 struct e1000_buffer *buffer_info; 2998 struct e1000_buffer *buffer_info;
@@ -3038,11 +3029,13 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
3038#define E1000_MAX_TXD_PWR 12 3029#define E1000_MAX_TXD_PWR 12
3039#define E1000_MAX_DATA_PER_TXD (1<<E1000_MAX_TXD_PWR) 3030#define E1000_MAX_DATA_PER_TXD (1<<E1000_MAX_TXD_PWR)
3040 3031
3041static int 3032static int e1000_tx_map(struct e1000_adapter *adapter,
3042e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, 3033 struct e1000_tx_ring *tx_ring,
3043 struct sk_buff *skb, unsigned int first, unsigned int max_per_txd, 3034 struct sk_buff *skb, unsigned int first,
3044 unsigned int nr_frags, unsigned int mss) 3035 unsigned int max_per_txd, unsigned int nr_frags,
3036 unsigned int mss)
3045{ 3037{
3038 struct e1000_hw *hw = &adapter->hw;
3046 struct e1000_buffer *buffer_info; 3039 struct e1000_buffer *buffer_info;
3047 unsigned int len = skb->len; 3040 unsigned int len = skb->len;
3048 unsigned int offset = 0, size, count = 0, i; 3041 unsigned int offset = 0, size, count = 0, i;
@@ -3073,7 +3066,7 @@ e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
3073 * The fix is to make sure that the first descriptor of a 3066 * The fix is to make sure that the first descriptor of a
3074 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes 3067 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
3075 */ 3068 */
3076 if (unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) && 3069 if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
3077 (size > 2015) && count == 0)) 3070 (size > 2015) && count == 0))
3078 size = 2015; 3071 size = 2015;
3079 3072
@@ -3145,10 +3138,11 @@ e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
3145 return count; 3138 return count;
3146} 3139}
3147 3140
3148static void 3141static void e1000_tx_queue(struct e1000_adapter *adapter,
3149e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, 3142 struct e1000_tx_ring *tx_ring, int tx_flags,
3150 int tx_flags, int count) 3143 int count)
3151{ 3144{
3145 struct e1000_hw *hw = &adapter->hw;
3152 struct e1000_tx_desc *tx_desc = NULL; 3146 struct e1000_tx_desc *tx_desc = NULL;
3153 struct e1000_buffer *buffer_info; 3147 struct e1000_buffer *buffer_info;
3154 u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS; 3148 u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
@@ -3194,7 +3188,7 @@ e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
3194 wmb(); 3188 wmb();
3195 3189
3196 tx_ring->next_to_use = i; 3190 tx_ring->next_to_use = i;
3197 writel(i, adapter->hw.hw_addr + tx_ring->tdt); 3191 writel(i, hw->hw_addr + tx_ring->tdt);
3198 /* we need this if more than one processor can write to our tail 3192 /* we need this if more than one processor can write to our tail
3199 * at a time, it syncronizes IO on IA64/Altix systems */ 3193 * at a time, it syncronizes IO on IA64/Altix systems */
3200 mmiowb(); 3194 mmiowb();
@@ -3212,8 +3206,8 @@ e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
3212#define E1000_FIFO_HDR 0x10 3206#define E1000_FIFO_HDR 0x10
3213#define E1000_82547_PAD_LEN 0x3E0 3207#define E1000_82547_PAD_LEN 0x3E0
3214 3208
3215static int 3209static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
3216e1000_82547_fifo_workaround(struct e1000_adapter *adapter, struct sk_buff *skb) 3210 struct sk_buff *skb)
3217{ 3211{
3218 u32 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head; 3212 u32 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
3219 u32 skb_fifo_len = skb->len + E1000_FIFO_HDR; 3213 u32 skb_fifo_len = skb->len + E1000_FIFO_HDR;
@@ -3239,19 +3233,19 @@ no_fifo_stall_required:
3239} 3233}
3240 3234
3241#define MINIMUM_DHCP_PACKET_SIZE 282 3235#define MINIMUM_DHCP_PACKET_SIZE 282
3242static int 3236static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
3243e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb) 3237 struct sk_buff *skb)
3244{ 3238{
3245 struct e1000_hw *hw = &adapter->hw; 3239 struct e1000_hw *hw = &adapter->hw;
3246 u16 length, offset; 3240 u16 length, offset;
3247 if (vlan_tx_tag_present(skb)) { 3241 if (vlan_tx_tag_present(skb)) {
3248 if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) && 3242 if (!((vlan_tx_tag_get(skb) == hw->mng_cookie.vlan_id) &&
3249 ( adapter->hw.mng_cookie.status & 3243 ( hw->mng_cookie.status &
3250 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) ) 3244 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) )
3251 return 0; 3245 return 0;
3252 } 3246 }
3253 if (skb->len > MINIMUM_DHCP_PACKET_SIZE) { 3247 if (skb->len > MINIMUM_DHCP_PACKET_SIZE) {
3254 struct ethhdr *eth = (struct ethhdr *) skb->data; 3248 struct ethhdr *eth = (struct ethhdr *)skb->data;
3255 if ((htons(ETH_P_IP) == eth->h_proto)) { 3249 if ((htons(ETH_P_IP) == eth->h_proto)) {
3256 const struct iphdr *ip = 3250 const struct iphdr *ip =
3257 (struct iphdr *)((u8 *)skb->data+14); 3251 (struct iphdr *)((u8 *)skb->data+14);
@@ -3304,10 +3298,10 @@ static int e1000_maybe_stop_tx(struct net_device *netdev,
3304} 3298}
3305 3299
3306#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 ) 3300#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
3307static int 3301static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3308e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3309{ 3302{
3310 struct e1000_adapter *adapter = netdev_priv(netdev); 3303 struct e1000_adapter *adapter = netdev_priv(netdev);
3304 struct e1000_hw *hw = &adapter->hw;
3311 struct e1000_tx_ring *tx_ring; 3305 struct e1000_tx_ring *tx_ring;
3312 unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD; 3306 unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD;
3313 unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; 3307 unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
@@ -3333,7 +3327,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3333 3327
3334 /* 82571 and newer doesn't need the workaround that limited descriptor 3328 /* 82571 and newer doesn't need the workaround that limited descriptor
3335 * length to 4kB */ 3329 * length to 4kB */
3336 if (adapter->hw.mac_type >= e1000_82571) 3330 if (hw->mac_type >= e1000_82571)
3337 max_per_txd = 8192; 3331 max_per_txd = 8192;
3338 3332
3339 mss = skb_shinfo(skb)->gso_size; 3333 mss = skb_shinfo(skb)->gso_size;
@@ -3353,7 +3347,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3353 * frags into skb->data */ 3347 * frags into skb->data */
3354 hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); 3348 hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
3355 if (skb->data_len && hdr_len == len) { 3349 if (skb->data_len && hdr_len == len) {
3356 switch (adapter->hw.mac_type) { 3350 switch (hw->mac_type) {
3357 unsigned int pull_size; 3351 unsigned int pull_size;
3358 case e1000_82544: 3352 case e1000_82544:
3359 /* Make sure we have room to chop off 4 bytes, 3353 /* Make sure we have room to chop off 4 bytes,
@@ -3402,7 +3396,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3402 /* work-around for errata 10 and it applies to all controllers 3396 /* work-around for errata 10 and it applies to all controllers
3403 * in PCI-X mode, so add one more descriptor to the count 3397 * in PCI-X mode, so add one more descriptor to the count
3404 */ 3398 */
3405 if (unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) && 3399 if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
3406 (len > 2015))) 3400 (len > 2015)))
3407 count++; 3401 count++;
3408 3402
@@ -3414,8 +3408,8 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3414 count += nr_frags; 3408 count += nr_frags;
3415 3409
3416 3410
3417 if (adapter->hw.tx_pkt_filtering && 3411 if (hw->tx_pkt_filtering &&
3418 (adapter->hw.mac_type == e1000_82573)) 3412 (hw->mac_type == e1000_82573))
3419 e1000_transfer_dhcp_info(adapter, skb); 3413 e1000_transfer_dhcp_info(adapter, skb);
3420 3414
3421 if (!spin_trylock_irqsave(&tx_ring->tx_lock, flags)) 3415 if (!spin_trylock_irqsave(&tx_ring->tx_lock, flags))
@@ -3429,7 +3423,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3429 return NETDEV_TX_BUSY; 3423 return NETDEV_TX_BUSY;
3430 } 3424 }
3431 3425
3432 if (unlikely(adapter->hw.mac_type == e1000_82547)) { 3426 if (unlikely(hw->mac_type == e1000_82547)) {
3433 if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) { 3427 if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
3434 netif_stop_queue(netdev); 3428 netif_stop_queue(netdev);
3435 mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1); 3429 mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
@@ -3482,8 +3476,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
3482 * @netdev: network interface device structure 3476 * @netdev: network interface device structure
3483 **/ 3477 **/
3484 3478
3485static void 3479static void e1000_tx_timeout(struct net_device *netdev)
3486e1000_tx_timeout(struct net_device *netdev)
3487{ 3480{
3488 struct e1000_adapter *adapter = netdev_priv(netdev); 3481 struct e1000_adapter *adapter = netdev_priv(netdev);
3489 3482
@@ -3492,8 +3485,7 @@ e1000_tx_timeout(struct net_device *netdev)
3492 schedule_work(&adapter->reset_task); 3485 schedule_work(&adapter->reset_task);
3493} 3486}
3494 3487
3495static void 3488static void e1000_reset_task(struct work_struct *work)
3496e1000_reset_task(struct work_struct *work)
3497{ 3489{
3498 struct e1000_adapter *adapter = 3490 struct e1000_adapter *adapter =
3499 container_of(work, struct e1000_adapter, reset_task); 3491 container_of(work, struct e1000_adapter, reset_task);
@@ -3509,8 +3501,7 @@ e1000_reset_task(struct work_struct *work)
3509 * The statistics are actually updated from the timer callback. 3501 * The statistics are actually updated from the timer callback.
3510 **/ 3502 **/
3511 3503
3512static struct net_device_stats * 3504static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
3513e1000_get_stats(struct net_device *netdev)
3514{ 3505{
3515 struct e1000_adapter *adapter = netdev_priv(netdev); 3506 struct e1000_adapter *adapter = netdev_priv(netdev);
3516 3507
@@ -3526,10 +3517,10 @@ e1000_get_stats(struct net_device *netdev)
3526 * Returns 0 on success, negative on failure 3517 * Returns 0 on success, negative on failure
3527 **/ 3518 **/
3528 3519
3529static int 3520static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
3530e1000_change_mtu(struct net_device *netdev, int new_mtu)
3531{ 3521{
3532 struct e1000_adapter *adapter = netdev_priv(netdev); 3522 struct e1000_adapter *adapter = netdev_priv(netdev);
3523 struct e1000_hw *hw = &adapter->hw;
3533 int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; 3524 int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
3534 u16 eeprom_data = 0; 3525 u16 eeprom_data = 0;
3535 3526
@@ -3540,7 +3531,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
3540 } 3531 }
3541 3532
3542 /* Adapter-specific max frame size limits. */ 3533 /* Adapter-specific max frame size limits. */
3543 switch (adapter->hw.mac_type) { 3534 switch (hw->mac_type) {
3544 case e1000_undefined ... e1000_82542_rev2_1: 3535 case e1000_undefined ... e1000_82542_rev2_1:
3545 case e1000_ich8lan: 3536 case e1000_ich8lan:
3546 if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { 3537 if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
@@ -3552,9 +3543,9 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
3552 /* Jumbo Frames not supported if: 3543 /* Jumbo Frames not supported if:
3553 * - this is not an 82573L device 3544 * - this is not an 82573L device
3554 * - ASPM is enabled in any way (0x1A bits 3:2) */ 3545 * - ASPM is enabled in any way (0x1A bits 3:2) */
3555 e1000_read_eeprom(&adapter->hw, EEPROM_INIT_3GIO_3, 1, 3546 e1000_read_eeprom(hw, EEPROM_INIT_3GIO_3, 1,
3556 &eeprom_data); 3547 &eeprom_data);
3557 if ((adapter->hw.device_id != E1000_DEV_ID_82573L) || 3548 if ((hw->device_id != E1000_DEV_ID_82573L) ||
3558 (eeprom_data & EEPROM_WORD1A_ASPM_MASK)) { 3549 (eeprom_data & EEPROM_WORD1A_ASPM_MASK)) {
3559 if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { 3550 if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
3560 DPRINTK(PROBE, ERR, 3551 DPRINTK(PROBE, ERR,
@@ -3601,13 +3592,13 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
3601 adapter->rx_buffer_len = E1000_RXBUFFER_16384; 3592 adapter->rx_buffer_len = E1000_RXBUFFER_16384;
3602 3593
3603 /* adjust allocation if LPE protects us, and we aren't using SBP */ 3594 /* adjust allocation if LPE protects us, and we aren't using SBP */
3604 if (!adapter->hw.tbi_compatibility_on && 3595 if (!hw->tbi_compatibility_on &&
3605 ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) || 3596 ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) ||
3606 (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE))) 3597 (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
3607 adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; 3598 adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
3608 3599
3609 netdev->mtu = new_mtu; 3600 netdev->mtu = new_mtu;
3610 adapter->hw.max_frame_size = max_frame; 3601 hw->max_frame_size = max_frame;
3611 3602
3612 if (netif_running(netdev)) 3603 if (netif_running(netdev))
3613 e1000_reinit_locked(adapter); 3604 e1000_reinit_locked(adapter);
@@ -3620,8 +3611,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
3620 * @adapter: board private structure 3611 * @adapter: board private structure
3621 **/ 3612 **/
3622 3613
3623void 3614void e1000_update_stats(struct e1000_adapter *adapter)
3624e1000_update_stats(struct e1000_adapter *adapter)
3625{ 3615{
3626 struct e1000_hw *hw = &adapter->hw; 3616 struct e1000_hw *hw = &adapter->hw;
3627 struct pci_dev *pdev = adapter->pdev; 3617 struct pci_dev *pdev = adapter->pdev;
@@ -3646,89 +3636,89 @@ e1000_update_stats(struct e1000_adapter *adapter)
3646 * be written while holding adapter->stats_lock 3636 * be written while holding adapter->stats_lock
3647 */ 3637 */
3648 3638
3649 adapter->stats.crcerrs += E1000_READ_REG(hw, CRCERRS); 3639 adapter->stats.crcerrs += er32(CRCERRS);
3650 adapter->stats.gprc += E1000_READ_REG(hw, GPRC); 3640 adapter->stats.gprc += er32(GPRC);
3651 adapter->stats.gorcl += E1000_READ_REG(hw, GORCL); 3641 adapter->stats.gorcl += er32(GORCL);
3652 adapter->stats.gorch += E1000_READ_REG(hw, GORCH); 3642 adapter->stats.gorch += er32(GORCH);
3653 adapter->stats.bprc += E1000_READ_REG(hw, BPRC); 3643 adapter->stats.bprc += er32(BPRC);
3654 adapter->stats.mprc += E1000_READ_REG(hw, MPRC); 3644 adapter->stats.mprc += er32(MPRC);
3655 adapter->stats.roc += E1000_READ_REG(hw, ROC); 3645 adapter->stats.roc += er32(ROC);
3656 3646
3657 if (adapter->hw.mac_type != e1000_ich8lan) { 3647 if (hw->mac_type != e1000_ich8lan) {
3658 adapter->stats.prc64 += E1000_READ_REG(hw, PRC64); 3648 adapter->stats.prc64 += er32(PRC64);
3659 adapter->stats.prc127 += E1000_READ_REG(hw, PRC127); 3649 adapter->stats.prc127 += er32(PRC127);
3660 adapter->stats.prc255 += E1000_READ_REG(hw, PRC255); 3650 adapter->stats.prc255 += er32(PRC255);
3661 adapter->stats.prc511 += E1000_READ_REG(hw, PRC511); 3651 adapter->stats.prc511 += er32(PRC511);
3662 adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023); 3652 adapter->stats.prc1023 += er32(PRC1023);
3663 adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522); 3653 adapter->stats.prc1522 += er32(PRC1522);
3664 } 3654 }
3665 3655
3666 adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS); 3656 adapter->stats.symerrs += er32(SYMERRS);
3667 adapter->stats.mpc += E1000_READ_REG(hw, MPC); 3657 adapter->stats.mpc += er32(MPC);
3668 adapter->stats.scc += E1000_READ_REG(hw, SCC); 3658 adapter->stats.scc += er32(SCC);
3669 adapter->stats.ecol += E1000_READ_REG(hw, ECOL); 3659 adapter->stats.ecol += er32(ECOL);
3670 adapter->stats.mcc += E1000_READ_REG(hw, MCC); 3660 adapter->stats.mcc += er32(MCC);
3671 adapter->stats.latecol += E1000_READ_REG(hw, LATECOL); 3661 adapter->stats.latecol += er32(LATECOL);
3672 adapter->stats.dc += E1000_READ_REG(hw, DC); 3662 adapter->stats.dc += er32(DC);
3673 adapter->stats.sec += E1000_READ_REG(hw, SEC); 3663 adapter->stats.sec += er32(SEC);
3674 adapter->stats.rlec += E1000_READ_REG(hw, RLEC); 3664 adapter->stats.rlec += er32(RLEC);
3675 adapter->stats.xonrxc += E1000_READ_REG(hw, XONRXC); 3665 adapter->stats.xonrxc += er32(XONRXC);
3676 adapter->stats.xontxc += E1000_READ_REG(hw, XONTXC); 3666 adapter->stats.xontxc += er32(XONTXC);
3677 adapter->stats.xoffrxc += E1000_READ_REG(hw, XOFFRXC); 3667 adapter->stats.xoffrxc += er32(XOFFRXC);
3678 adapter->stats.xofftxc += E1000_READ_REG(hw, XOFFTXC); 3668 adapter->stats.xofftxc += er32(XOFFTXC);
3679 adapter->stats.fcruc += E1000_READ_REG(hw, FCRUC); 3669 adapter->stats.fcruc += er32(FCRUC);
3680 adapter->stats.gptc += E1000_READ_REG(hw, GPTC); 3670 adapter->stats.gptc += er32(GPTC);
3681 adapter->stats.gotcl += E1000_READ_REG(hw, GOTCL); 3671 adapter->stats.gotcl += er32(GOTCL);
3682 adapter->stats.gotch += E1000_READ_REG(hw, GOTCH); 3672 adapter->stats.gotch += er32(GOTCH);
3683 adapter->stats.rnbc += E1000_READ_REG(hw, RNBC); 3673 adapter->stats.rnbc += er32(RNBC);
3684 adapter->stats.ruc += E1000_READ_REG(hw, RUC); 3674 adapter->stats.ruc += er32(RUC);
3685 adapter->stats.rfc += E1000_READ_REG(hw, RFC); 3675 adapter->stats.rfc += er32(RFC);
3686 adapter->stats.rjc += E1000_READ_REG(hw, RJC); 3676 adapter->stats.rjc += er32(RJC);
3687 adapter->stats.torl += E1000_READ_REG(hw, TORL); 3677 adapter->stats.torl += er32(TORL);
3688 adapter->stats.torh += E1000_READ_REG(hw, TORH); 3678 adapter->stats.torh += er32(TORH);
3689 adapter->stats.totl += E1000_READ_REG(hw, TOTL); 3679 adapter->stats.totl += er32(TOTL);
3690 adapter->stats.toth += E1000_READ_REG(hw, TOTH); 3680 adapter->stats.toth += er32(TOTH);
3691 adapter->stats.tpr += E1000_READ_REG(hw, TPR); 3681 adapter->stats.tpr += er32(TPR);
3692 3682
3693 if (adapter->hw.mac_type != e1000_ich8lan) { 3683 if (hw->mac_type != e1000_ich8lan) {
3694 adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64); 3684 adapter->stats.ptc64 += er32(PTC64);
3695 adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127); 3685 adapter->stats.ptc127 += er32(PTC127);
3696 adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255); 3686 adapter->stats.ptc255 += er32(PTC255);
3697 adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511); 3687 adapter->stats.ptc511 += er32(PTC511);
3698 adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023); 3688 adapter->stats.ptc1023 += er32(PTC1023);
3699 adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522); 3689 adapter->stats.ptc1522 += er32(PTC1522);
3700 } 3690 }
3701 3691
3702 adapter->stats.mptc += E1000_READ_REG(hw, MPTC); 3692 adapter->stats.mptc += er32(MPTC);
3703 adapter->stats.bptc += E1000_READ_REG(hw, BPTC); 3693 adapter->stats.bptc += er32(BPTC);
3704 3694
3705 /* used for adaptive IFS */ 3695 /* used for adaptive IFS */
3706 3696
3707 hw->tx_packet_delta = E1000_READ_REG(hw, TPT); 3697 hw->tx_packet_delta = er32(TPT);
3708 adapter->stats.tpt += hw->tx_packet_delta; 3698 adapter->stats.tpt += hw->tx_packet_delta;
3709 hw->collision_delta = E1000_READ_REG(hw, COLC); 3699 hw->collision_delta = er32(COLC);
3710 adapter->stats.colc += hw->collision_delta; 3700 adapter->stats.colc += hw->collision_delta;
3711 3701
3712 if (hw->mac_type >= e1000_82543) { 3702 if (hw->mac_type >= e1000_82543) {
3713 adapter->stats.algnerrc += E1000_READ_REG(hw, ALGNERRC); 3703 adapter->stats.algnerrc += er32(ALGNERRC);
3714 adapter->stats.rxerrc += E1000_READ_REG(hw, RXERRC); 3704 adapter->stats.rxerrc += er32(RXERRC);
3715 adapter->stats.tncrs += E1000_READ_REG(hw, TNCRS); 3705 adapter->stats.tncrs += er32(TNCRS);
3716 adapter->stats.cexterr += E1000_READ_REG(hw, CEXTERR); 3706 adapter->stats.cexterr += er32(CEXTERR);
3717 adapter->stats.tsctc += E1000_READ_REG(hw, TSCTC); 3707 adapter->stats.tsctc += er32(TSCTC);
3718 adapter->stats.tsctfc += E1000_READ_REG(hw, TSCTFC); 3708 adapter->stats.tsctfc += er32(TSCTFC);
3719 } 3709 }
3720 if (hw->mac_type > e1000_82547_rev_2) { 3710 if (hw->mac_type > e1000_82547_rev_2) {
3721 adapter->stats.iac += E1000_READ_REG(hw, IAC); 3711 adapter->stats.iac += er32(IAC);
3722 adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC); 3712 adapter->stats.icrxoc += er32(ICRXOC);
3723 3713
3724 if (adapter->hw.mac_type != e1000_ich8lan) { 3714 if (hw->mac_type != e1000_ich8lan) {
3725 adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC); 3715 adapter->stats.icrxptc += er32(ICRXPTC);
3726 adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC); 3716 adapter->stats.icrxatc += er32(ICRXATC);
3727 adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC); 3717 adapter->stats.ictxptc += er32(ICTXPTC);
3728 adapter->stats.ictxatc += E1000_READ_REG(hw, ICTXATC); 3718 adapter->stats.ictxatc += er32(ICTXATC);
3729 adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC); 3719 adapter->stats.ictxqec += er32(ICTXQEC);
3730 adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC); 3720 adapter->stats.ictxqmtc += er32(ICTXQMTC);
3731 adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC); 3721 adapter->stats.icrxdmtc += er32(ICRXDMTC);
3732 } 3722 }
3733 } 3723 }
3734 3724
@@ -3756,7 +3746,7 @@ e1000_update_stats(struct e1000_adapter *adapter)
3756 adapter->net_stats.tx_aborted_errors = adapter->stats.ecol; 3746 adapter->net_stats.tx_aborted_errors = adapter->stats.ecol;
3757 adapter->net_stats.tx_window_errors = adapter->stats.latecol; 3747 adapter->net_stats.tx_window_errors = adapter->stats.latecol;
3758 adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; 3748 adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs;
3759 if (adapter->hw.bad_tx_carr_stats_fd && 3749 if (hw->bad_tx_carr_stats_fd &&
3760 adapter->link_duplex == FULL_DUPLEX) { 3750 adapter->link_duplex == FULL_DUPLEX) {
3761 adapter->net_stats.tx_carrier_errors = 0; 3751 adapter->net_stats.tx_carrier_errors = 0;
3762 adapter->stats.tncrs = 0; 3752 adapter->stats.tncrs = 0;
@@ -3779,10 +3769,10 @@ e1000_update_stats(struct e1000_adapter *adapter)
3779 } 3769 }
3780 3770
3781 /* Management Stats */ 3771 /* Management Stats */
3782 if (adapter->hw.has_smbus) { 3772 if (hw->has_smbus) {
3783 adapter->stats.mgptc += E1000_READ_REG(hw, MGTPTC); 3773 adapter->stats.mgptc += er32(MGTPTC);
3784 adapter->stats.mgprc += E1000_READ_REG(hw, MGTPRC); 3774 adapter->stats.mgprc += er32(MGTPRC);
3785 adapter->stats.mgpdc += E1000_READ_REG(hw, MGTPDC); 3775 adapter->stats.mgpdc += er32(MGTPDC);
3786 } 3776 }
3787 3777
3788 spin_unlock_irqrestore(&adapter->stats_lock, flags); 3778 spin_unlock_irqrestore(&adapter->stats_lock, flags);
@@ -3794,16 +3784,12 @@ e1000_update_stats(struct e1000_adapter *adapter)
3794 * @data: pointer to a network interface device structure 3784 * @data: pointer to a network interface device structure
3795 **/ 3785 **/
3796 3786
3797static irqreturn_t 3787static irqreturn_t e1000_intr_msi(int irq, void *data)
3798e1000_intr_msi(int irq, void *data)
3799{ 3788{
3800 struct net_device *netdev = data; 3789 struct net_device *netdev = data;
3801 struct e1000_adapter *adapter = netdev_priv(netdev); 3790 struct e1000_adapter *adapter = netdev_priv(netdev);
3802 struct e1000_hw *hw = &adapter->hw; 3791 struct e1000_hw *hw = &adapter->hw;
3803#ifndef CONFIG_E1000_NAPI 3792 u32 icr = er32(ICR);
3804 int i;
3805#endif
3806 u32 icr = E1000_READ_REG(hw, ICR);
3807 3793
3808 /* in NAPI mode read ICR disables interrupts using IAM */ 3794 /* in NAPI mode read ICR disables interrupts using IAM */
3809 3795
@@ -3813,17 +3799,16 @@ e1000_intr_msi(int irq, void *data)
3813 * link down event; disable receives here in the ISR and reset 3799 * link down event; disable receives here in the ISR and reset
3814 * adapter in watchdog */ 3800 * adapter in watchdog */
3815 if (netif_carrier_ok(netdev) && 3801 if (netif_carrier_ok(netdev) &&
3816 (adapter->hw.mac_type == e1000_80003es2lan)) { 3802 (hw->mac_type == e1000_80003es2lan)) {
3817 /* disable receives */ 3803 /* disable receives */
3818 u32 rctl = E1000_READ_REG(hw, RCTL); 3804 u32 rctl = er32(RCTL);
3819 E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN); 3805 ew32(RCTL, rctl & ~E1000_RCTL_EN);
3820 } 3806 }
3821 /* guard against interrupt when we're going down */ 3807 /* guard against interrupt when we're going down */
3822 if (!test_bit(__E1000_DOWN, &adapter->flags)) 3808 if (!test_bit(__E1000_DOWN, &adapter->flags))
3823 mod_timer(&adapter->watchdog_timer, jiffies + 1); 3809 mod_timer(&adapter->watchdog_timer, jiffies + 1);
3824 } 3810 }
3825 3811
3826#ifdef CONFIG_E1000_NAPI
3827 if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { 3812 if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) {
3828 adapter->total_tx_bytes = 0; 3813 adapter->total_tx_bytes = 0;
3829 adapter->total_tx_packets = 0; 3814 adapter->total_tx_packets = 0;
@@ -3832,20 +3817,6 @@ e1000_intr_msi(int irq, void *data)
3832 __netif_rx_schedule(netdev, &adapter->napi); 3817 __netif_rx_schedule(netdev, &adapter->napi);
3833 } else 3818 } else
3834 e1000_irq_enable(adapter); 3819 e1000_irq_enable(adapter);
3835#else
3836 adapter->total_tx_bytes = 0;
3837 adapter->total_rx_bytes = 0;
3838 adapter->total_tx_packets = 0;
3839 adapter->total_rx_packets = 0;
3840
3841 for (i = 0; i < E1000_MAX_INTR; i++)
3842 if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring) &
3843 !e1000_clean_tx_irq(adapter, adapter->tx_ring)))
3844 break;
3845
3846 if (likely(adapter->itr_setting & 3))
3847 e1000_set_itr(adapter);
3848#endif
3849 3820
3850 return IRQ_HANDLED; 3821 return IRQ_HANDLED;
3851} 3822}
@@ -3856,20 +3827,16 @@ e1000_intr_msi(int irq, void *data)
3856 * @data: pointer to a network interface device structure 3827 * @data: pointer to a network interface device structure
3857 **/ 3828 **/
3858 3829
3859static irqreturn_t 3830static irqreturn_t e1000_intr(int irq, void *data)
3860e1000_intr(int irq, void *data)
3861{ 3831{
3862 struct net_device *netdev = data; 3832 struct net_device *netdev = data;
3863 struct e1000_adapter *adapter = netdev_priv(netdev); 3833 struct e1000_adapter *adapter = netdev_priv(netdev);
3864 struct e1000_hw *hw = &adapter->hw; 3834 struct e1000_hw *hw = &adapter->hw;
3865 u32 rctl, icr = E1000_READ_REG(hw, ICR); 3835 u32 rctl, icr = er32(ICR);
3866#ifndef CONFIG_E1000_NAPI 3836
3867 int i;
3868#endif
3869 if (unlikely(!icr)) 3837 if (unlikely(!icr))
3870 return IRQ_NONE; /* Not our interrupt */ 3838 return IRQ_NONE; /* Not our interrupt */
3871 3839
3872#ifdef CONFIG_E1000_NAPI
3873 /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is 3840 /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
3874 * not set, then the adapter didn't send an interrupt */ 3841 * not set, then the adapter didn't send an interrupt */
3875 if (unlikely(hw->mac_type >= e1000_82571 && 3842 if (unlikely(hw->mac_type >= e1000_82571 &&
@@ -3878,7 +3845,6 @@ e1000_intr(int irq, void *data)
3878 3845
3879 /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No 3846 /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No
3880 * need for the IMC write */ 3847 * need for the IMC write */
3881#endif
3882 3848
3883 if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) { 3849 if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
3884 hw->get_link_status = 1; 3850 hw->get_link_status = 1;
@@ -3888,21 +3854,20 @@ e1000_intr(int irq, void *data)
3888 * reset adapter in watchdog 3854 * reset adapter in watchdog
3889 */ 3855 */
3890 if (netif_carrier_ok(netdev) && 3856 if (netif_carrier_ok(netdev) &&
3891 (adapter->hw.mac_type == e1000_80003es2lan)) { 3857 (hw->mac_type == e1000_80003es2lan)) {
3892 /* disable receives */ 3858 /* disable receives */
3893 rctl = E1000_READ_REG(hw, RCTL); 3859 rctl = er32(RCTL);
3894 E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN); 3860 ew32(RCTL, rctl & ~E1000_RCTL_EN);
3895 } 3861 }
3896 /* guard against interrupt when we're going down */ 3862 /* guard against interrupt when we're going down */
3897 if (!test_bit(__E1000_DOWN, &adapter->flags)) 3863 if (!test_bit(__E1000_DOWN, &adapter->flags))
3898 mod_timer(&adapter->watchdog_timer, jiffies + 1); 3864 mod_timer(&adapter->watchdog_timer, jiffies + 1);
3899 } 3865 }
3900 3866
3901#ifdef CONFIG_E1000_NAPI
3902 if (unlikely(hw->mac_type < e1000_82571)) { 3867 if (unlikely(hw->mac_type < e1000_82571)) {
3903 /* disable interrupts, without the synchronize_irq bit */ 3868 /* disable interrupts, without the synchronize_irq bit */
3904 E1000_WRITE_REG(hw, IMC, ~0); 3869 ew32(IMC, ~0);
3905 E1000_WRITE_FLUSH(hw); 3870 E1000_WRITE_FLUSH();
3906 } 3871 }
3907 if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) { 3872 if (likely(netif_rx_schedule_prep(netdev, &adapter->napi))) {
3908 adapter->total_tx_bytes = 0; 3873 adapter->total_tx_bytes = 0;
@@ -3914,48 +3879,15 @@ e1000_intr(int irq, void *data)
3914 /* this really should not happen! if it does it is basically a 3879 /* this really should not happen! if it does it is basically a
3915 * bug, but not a hard error, so enable ints and continue */ 3880 * bug, but not a hard error, so enable ints and continue */
3916 e1000_irq_enable(adapter); 3881 e1000_irq_enable(adapter);
3917#else
3918 /* Writing IMC and IMS is needed for 82547.
3919 * Due to Hub Link bus being occupied, an interrupt
3920 * de-assertion message is not able to be sent.
3921 * When an interrupt assertion message is generated later,
3922 * two messages are re-ordered and sent out.
3923 * That causes APIC to think 82547 is in de-assertion
3924 * state, while 82547 is in assertion state, resulting
3925 * in dead lock. Writing IMC forces 82547 into
3926 * de-assertion state.
3927 */
3928 if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
3929 E1000_WRITE_REG(hw, IMC, ~0);
3930
3931 adapter->total_tx_bytes = 0;
3932 adapter->total_rx_bytes = 0;
3933 adapter->total_tx_packets = 0;
3934 adapter->total_rx_packets = 0;
3935 3882
3936 for (i = 0; i < E1000_MAX_INTR; i++)
3937 if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring) &
3938 !e1000_clean_tx_irq(adapter, adapter->tx_ring)))
3939 break;
3940
3941 if (likely(adapter->itr_setting & 3))
3942 e1000_set_itr(adapter);
3943
3944 if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
3945 e1000_irq_enable(adapter);
3946
3947#endif
3948 return IRQ_HANDLED; 3883 return IRQ_HANDLED;
3949} 3884}
3950 3885
3951#ifdef CONFIG_E1000_NAPI
3952/** 3886/**
3953 * e1000_clean - NAPI Rx polling callback 3887 * e1000_clean - NAPI Rx polling callback
3954 * @adapter: board private structure 3888 * @adapter: board private structure
3955 **/ 3889 **/
3956 3890static int e1000_clean(struct napi_struct *napi, int budget)
3957static int
3958e1000_clean(struct napi_struct *napi, int budget)
3959{ 3891{
3960 struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); 3892 struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
3961 struct net_device *poll_dev = adapter->netdev; 3893 struct net_device *poll_dev = adapter->netdev;
@@ -3991,23 +3923,19 @@ e1000_clean(struct napi_struct *napi, int budget)
3991 return work_done; 3923 return work_done;
3992} 3924}
3993 3925
3994#endif
3995/** 3926/**
3996 * e1000_clean_tx_irq - Reclaim resources after transmit completes 3927 * e1000_clean_tx_irq - Reclaim resources after transmit completes
3997 * @adapter: board private structure 3928 * @adapter: board private structure
3998 **/ 3929 **/
3999 3930static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
4000static bool 3931 struct e1000_tx_ring *tx_ring)
4001e1000_clean_tx_irq(struct e1000_adapter *adapter,
4002 struct e1000_tx_ring *tx_ring)
4003{ 3932{
3933 struct e1000_hw *hw = &adapter->hw;
4004 struct net_device *netdev = adapter->netdev; 3934 struct net_device *netdev = adapter->netdev;
4005 struct e1000_tx_desc *tx_desc, *eop_desc; 3935 struct e1000_tx_desc *tx_desc, *eop_desc;
4006 struct e1000_buffer *buffer_info; 3936 struct e1000_buffer *buffer_info;
4007 unsigned int i, eop; 3937 unsigned int i, eop;
4008#ifdef CONFIG_E1000_NAPI
4009 unsigned int count = 0; 3938 unsigned int count = 0;
4010#endif
4011 bool cleaned = false; 3939 bool cleaned = false;
4012 unsigned int total_tx_bytes=0, total_tx_packets=0; 3940 unsigned int total_tx_bytes=0, total_tx_packets=0;
4013 3941
@@ -4039,11 +3967,10 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
4039 3967
4040 eop = tx_ring->buffer_info[i].next_to_watch; 3968 eop = tx_ring->buffer_info[i].next_to_watch;
4041 eop_desc = E1000_TX_DESC(*tx_ring, eop); 3969 eop_desc = E1000_TX_DESC(*tx_ring, eop);
4042#ifdef CONFIG_E1000_NAPI
4043#define E1000_TX_WEIGHT 64 3970#define E1000_TX_WEIGHT 64
4044 /* weight of a sort for tx, to avoid endless transmit cleanup */ 3971 /* weight of a sort for tx, to avoid endless transmit cleanup */
4045 if (count++ == E1000_TX_WEIGHT) break; 3972 if (count++ == E1000_TX_WEIGHT)
4046#endif 3973 break;
4047 } 3974 }
4048 3975
4049 tx_ring->next_to_clean = i; 3976 tx_ring->next_to_clean = i;
@@ -4068,8 +3995,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
4068 if (tx_ring->buffer_info[eop].dma && 3995 if (tx_ring->buffer_info[eop].dma &&
4069 time_after(jiffies, tx_ring->buffer_info[eop].time_stamp + 3996 time_after(jiffies, tx_ring->buffer_info[eop].time_stamp +
4070 (adapter->tx_timeout_factor * HZ)) 3997 (adapter->tx_timeout_factor * HZ))
4071 && !(E1000_READ_REG(&adapter->hw, STATUS) & 3998 && !(er32(STATUS) & E1000_STATUS_TXOFF)) {
4072 E1000_STATUS_TXOFF)) {
4073 3999
4074 /* detected Tx unit hang */ 4000 /* detected Tx unit hang */
4075 DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n" 4001 DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n"
@@ -4085,8 +4011,8 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
4085 " next_to_watch.status <%x>\n", 4011 " next_to_watch.status <%x>\n",
4086 (unsigned long)((tx_ring - adapter->tx_ring) / 4012 (unsigned long)((tx_ring - adapter->tx_ring) /
4087 sizeof(struct e1000_tx_ring)), 4013 sizeof(struct e1000_tx_ring)),
4088 readl(adapter->hw.hw_addr + tx_ring->tdh), 4014 readl(hw->hw_addr + tx_ring->tdh),
4089 readl(adapter->hw.hw_addr + tx_ring->tdt), 4015 readl(hw->hw_addr + tx_ring->tdt),
4090 tx_ring->next_to_use, 4016 tx_ring->next_to_use,
4091 tx_ring->next_to_clean, 4017 tx_ring->next_to_clean,
4092 tx_ring->buffer_info[eop].time_stamp, 4018 tx_ring->buffer_info[eop].time_stamp,
@@ -4111,17 +4037,16 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
4111 * @sk_buff: socket buffer with received data 4037 * @sk_buff: socket buffer with received data
4112 **/ 4038 **/
4113 4039
4114static void 4040static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
4115e1000_rx_checksum(struct e1000_adapter *adapter, 4041 u32 csum, struct sk_buff *skb)
4116 u32 status_err, u32 csum,
4117 struct sk_buff *skb)
4118{ 4042{
4043 struct e1000_hw *hw = &adapter->hw;
4119 u16 status = (u16)status_err; 4044 u16 status = (u16)status_err;
4120 u8 errors = (u8)(status_err >> 24); 4045 u8 errors = (u8)(status_err >> 24);
4121 skb->ip_summed = CHECKSUM_NONE; 4046 skb->ip_summed = CHECKSUM_NONE;
4122 4047
4123 /* 82543 or newer only */ 4048 /* 82543 or newer only */
4124 if (unlikely(adapter->hw.mac_type < e1000_82543)) return; 4049 if (unlikely(hw->mac_type < e1000_82543)) return;
4125 /* Ignore Checksum bit is set */ 4050 /* Ignore Checksum bit is set */
4126 if (unlikely(status & E1000_RXD_STAT_IXSM)) return; 4051 if (unlikely(status & E1000_RXD_STAT_IXSM)) return;
4127 /* TCP/UDP checksum error bit is set */ 4052 /* TCP/UDP checksum error bit is set */
@@ -4131,7 +4056,7 @@ e1000_rx_checksum(struct e1000_adapter *adapter,
4131 return; 4056 return;
4132 } 4057 }
4133 /* TCP/UDP Checksum has not been calculated */ 4058 /* TCP/UDP Checksum has not been calculated */
4134 if (adapter->hw.mac_type <= e1000_82547_rev_2) { 4059 if (hw->mac_type <= e1000_82547_rev_2) {
4135 if (!(status & E1000_RXD_STAT_TCPCS)) 4060 if (!(status & E1000_RXD_STAT_TCPCS))
4136 return; 4061 return;
4137 } else { 4062 } else {
@@ -4142,7 +4067,7 @@ e1000_rx_checksum(struct e1000_adapter *adapter,
4142 if (likely(status & E1000_RXD_STAT_TCPCS)) { 4067 if (likely(status & E1000_RXD_STAT_TCPCS)) {
4143 /* TCP checksum is good */ 4068 /* TCP checksum is good */
4144 skb->ip_summed = CHECKSUM_UNNECESSARY; 4069 skb->ip_summed = CHECKSUM_UNNECESSARY;
4145 } else if (adapter->hw.mac_type > e1000_82547_rev_2) { 4070 } else if (hw->mac_type > e1000_82547_rev_2) {
4146 /* IP fragment with UDP payload */ 4071 /* IP fragment with UDP payload */
4147 /* Hardware complements the payload checksum, so we undo it 4072 /* Hardware complements the payload checksum, so we undo it
4148 * and then put the value in host order for further stack use. 4073 * and then put the value in host order for further stack use.
@@ -4158,17 +4083,11 @@ e1000_rx_checksum(struct e1000_adapter *adapter,
4158 * e1000_clean_rx_irq - Send received data up the network stack; legacy 4083 * e1000_clean_rx_irq - Send received data up the network stack; legacy
4159 * @adapter: board private structure 4084 * @adapter: board private structure
4160 **/ 4085 **/
4161 4086static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
4162static bool 4087 struct e1000_rx_ring *rx_ring,
4163#ifdef CONFIG_E1000_NAPI 4088 int *work_done, int work_to_do)
4164e1000_clean_rx_irq(struct e1000_adapter *adapter,
4165 struct e1000_rx_ring *rx_ring,
4166 int *work_done, int work_to_do)
4167#else
4168e1000_clean_rx_irq(struct e1000_adapter *adapter,
4169 struct e1000_rx_ring *rx_ring)
4170#endif
4171{ 4089{
4090 struct e1000_hw *hw = &adapter->hw;
4172 struct net_device *netdev = adapter->netdev; 4091 struct net_device *netdev = adapter->netdev;
4173 struct pci_dev *pdev = adapter->pdev; 4092 struct pci_dev *pdev = adapter->pdev;
4174 struct e1000_rx_desc *rx_desc, *next_rxd; 4093 struct e1000_rx_desc *rx_desc, *next_rxd;
@@ -4189,11 +4108,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
4189 struct sk_buff *skb; 4108 struct sk_buff *skb;
4190 u8 status; 4109 u8 status;
4191 4110
4192#ifdef CONFIG_E1000_NAPI
4193 if (*work_done >= work_to_do) 4111 if (*work_done >= work_to_do)
4194 break; 4112 break;
4195 (*work_done)++; 4113 (*work_done)++;
4196#endif 4114
4197 status = rx_desc->status; 4115 status = rx_desc->status;
4198 skb = buffer_info->skb; 4116 skb = buffer_info->skb;
4199 buffer_info->skb = NULL; 4117 buffer_info->skb = NULL;
@@ -4226,11 +4144,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
4226 4144
4227 if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) { 4145 if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
4228 last_byte = *(skb->data + length - 1); 4146 last_byte = *(skb->data + length - 1);
4229 if (TBI_ACCEPT(&adapter->hw, status, 4147 if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
4230 rx_desc->errors, length, last_byte)) { 4148 last_byte)) {
4231 spin_lock_irqsave(&adapter->stats_lock, flags); 4149 spin_lock_irqsave(&adapter->stats_lock, flags);
4232 e1000_tbi_adjust_stats(&adapter->hw, 4150 e1000_tbi_adjust_stats(hw, &adapter->stats,
4233 &adapter->stats,
4234 length, skb->data); 4151 length, skb->data);
4235 spin_unlock_irqrestore(&adapter->stats_lock, 4152 spin_unlock_irqrestore(&adapter->stats_lock,
4236 flags); 4153 flags);
@@ -4280,7 +4197,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
4280 le16_to_cpu(rx_desc->csum), skb); 4197 le16_to_cpu(rx_desc->csum), skb);
4281 4198
4282 skb->protocol = eth_type_trans(skb, netdev); 4199 skb->protocol = eth_type_trans(skb, netdev);
4283#ifdef CONFIG_E1000_NAPI 4200
4284 if (unlikely(adapter->vlgrp && 4201 if (unlikely(adapter->vlgrp &&
4285 (status & E1000_RXD_STAT_VP))) { 4202 (status & E1000_RXD_STAT_VP))) {
4286 vlan_hwaccel_receive_skb(skb, adapter->vlgrp, 4203 vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
@@ -4288,15 +4205,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
4288 } else { 4205 } else {
4289 netif_receive_skb(skb); 4206 netif_receive_skb(skb);
4290 } 4207 }
4291#else /* CONFIG_E1000_NAPI */ 4208
4292 if (unlikely(adapter->vlgrp &&
4293 (status & E1000_RXD_STAT_VP))) {
4294 vlan_hwaccel_rx(skb, adapter->vlgrp,
4295 le16_to_cpu(rx_desc->special));
4296 } else {
4297 netif_rx(skb);
4298 }
4299#endif /* CONFIG_E1000_NAPI */
4300 netdev->last_rx = jiffies; 4209 netdev->last_rx = jiffies;
4301 4210
4302next_desc: 4211next_desc:
@@ -4330,15 +4239,9 @@ next_desc:
4330 * @adapter: board private structure 4239 * @adapter: board private structure
4331 **/ 4240 **/
4332 4241
4333static bool 4242static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
4334#ifdef CONFIG_E1000_NAPI 4243 struct e1000_rx_ring *rx_ring,
4335e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, 4244 int *work_done, int work_to_do)
4336 struct e1000_rx_ring *rx_ring,
4337 int *work_done, int work_to_do)
4338#else
4339e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
4340 struct e1000_rx_ring *rx_ring)
4341#endif
4342{ 4245{
4343 union e1000_rx_desc_packet_split *rx_desc, *next_rxd; 4246 union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
4344 struct net_device *netdev = adapter->netdev; 4247 struct net_device *netdev = adapter->netdev;
@@ -4361,11 +4264,11 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
4361 while (staterr & E1000_RXD_STAT_DD) { 4264 while (staterr & E1000_RXD_STAT_DD) {
4362 ps_page = &rx_ring->ps_page[i]; 4265 ps_page = &rx_ring->ps_page[i];
4363 ps_page_dma = &rx_ring->ps_page_dma[i]; 4266 ps_page_dma = &rx_ring->ps_page_dma[i];
4364#ifdef CONFIG_E1000_NAPI 4267
4365 if (unlikely(*work_done >= work_to_do)) 4268 if (unlikely(*work_done >= work_to_do))
4366 break; 4269 break;
4367 (*work_done)++; 4270 (*work_done)++;
4368#endif 4271
4369 skb = buffer_info->skb; 4272 skb = buffer_info->skb;
4370 4273
4371 /* in the packet split case this is header only */ 4274 /* in the packet split case this is header only */
@@ -4438,7 +4341,8 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
4438 } 4341 }
4439 4342
4440 for (j = 0; j < adapter->rx_ps_pages; j++) { 4343 for (j = 0; j < adapter->rx_ps_pages; j++) {
4441 if (!(length= le16_to_cpu(rx_desc->wb.upper.length[j]))) 4344 length = le16_to_cpu(rx_desc->wb.upper.length[j]);
4345 if (!length)
4442 break; 4346 break;
4443 pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j], 4347 pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j],
4444 PAGE_SIZE, PCI_DMA_FROMDEVICE); 4348 PAGE_SIZE, PCI_DMA_FROMDEVICE);
@@ -4466,21 +4370,14 @@ copydone:
4466 if (likely(rx_desc->wb.upper.header_status & 4370 if (likely(rx_desc->wb.upper.header_status &
4467 cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))) 4371 cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP)))
4468 adapter->rx_hdr_split++; 4372 adapter->rx_hdr_split++;
4469#ifdef CONFIG_E1000_NAPI 4373
4470 if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { 4374 if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
4471 vlan_hwaccel_receive_skb(skb, adapter->vlgrp, 4375 vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
4472 le16_to_cpu(rx_desc->wb.middle.vlan)); 4376 le16_to_cpu(rx_desc->wb.middle.vlan));
4473 } else { 4377 } else {
4474 netif_receive_skb(skb); 4378 netif_receive_skb(skb);
4475 } 4379 }
4476#else /* CONFIG_E1000_NAPI */ 4380
4477 if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
4478 vlan_hwaccel_rx(skb, adapter->vlgrp,
4479 le16_to_cpu(rx_desc->wb.middle.vlan));
4480 } else {
4481 netif_rx(skb);
4482 }
4483#endif /* CONFIG_E1000_NAPI */
4484 netdev->last_rx = jiffies; 4381 netdev->last_rx = jiffies;
4485 4382
4486next_desc: 4383next_desc:
@@ -4517,11 +4414,11 @@ next_desc:
4517 * @adapter: address of board private structure 4414 * @adapter: address of board private structure
4518 **/ 4415 **/
4519 4416
4520static void 4417static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
4521e1000_alloc_rx_buffers(struct e1000_adapter *adapter, 4418 struct e1000_rx_ring *rx_ring,
4522 struct e1000_rx_ring *rx_ring, 4419 int cleaned_count)
4523 int cleaned_count)
4524{ 4420{
4421 struct e1000_hw *hw = &adapter->hw;
4525 struct net_device *netdev = adapter->netdev; 4422 struct net_device *netdev = adapter->netdev;
4526 struct pci_dev *pdev = adapter->pdev; 4423 struct pci_dev *pdev = adapter->pdev;
4527 struct e1000_rx_desc *rx_desc; 4424 struct e1000_rx_desc *rx_desc;
@@ -4619,7 +4516,7 @@ map_skb:
4619 * applicable for weak-ordered memory model archs, 4516 * applicable for weak-ordered memory model archs,
4620 * such as IA-64). */ 4517 * such as IA-64). */
4621 wmb(); 4518 wmb();
4622 writel(i, adapter->hw.hw_addr + rx_ring->rdt); 4519 writel(i, hw->hw_addr + rx_ring->rdt);
4623 } 4520 }
4624} 4521}
4625 4522
@@ -4628,11 +4525,11 @@ map_skb:
4628 * @adapter: address of board private structure 4525 * @adapter: address of board private structure
4629 **/ 4526 **/
4630 4527
4631static void 4528static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
4632e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, 4529 struct e1000_rx_ring *rx_ring,
4633 struct e1000_rx_ring *rx_ring, 4530 int cleaned_count)
4634 int cleaned_count)
4635{ 4531{
4532 struct e1000_hw *hw = &adapter->hw;
4636 struct net_device *netdev = adapter->netdev; 4533 struct net_device *netdev = adapter->netdev;
4637 struct pci_dev *pdev = adapter->pdev; 4534 struct pci_dev *pdev = adapter->pdev;
4638 union e1000_rx_desc_packet_split *rx_desc; 4535 union e1000_rx_desc_packet_split *rx_desc;
@@ -4717,7 +4614,7 @@ no_buffers:
4717 * descriptors are 32 bytes...so we increment tail 4614 * descriptors are 32 bytes...so we increment tail
4718 * twice as much. 4615 * twice as much.
4719 */ 4616 */
4720 writel(i<<1, adapter->hw.hw_addr + rx_ring->rdt); 4617 writel(i<<1, hw->hw_addr + rx_ring->rdt);
4721 } 4618 }
4722} 4619}
4723 4620
@@ -4726,49 +4623,49 @@ no_buffers:
4726 * @adapter: 4623 * @adapter:
4727 **/ 4624 **/
4728 4625
4729static void 4626static void e1000_smartspeed(struct e1000_adapter *adapter)
4730e1000_smartspeed(struct e1000_adapter *adapter)
4731{ 4627{
4628 struct e1000_hw *hw = &adapter->hw;
4732 u16 phy_status; 4629 u16 phy_status;
4733 u16 phy_ctrl; 4630 u16 phy_ctrl;
4734 4631
4735 if ((adapter->hw.phy_type != e1000_phy_igp) || !adapter->hw.autoneg || 4632 if ((hw->phy_type != e1000_phy_igp) || !hw->autoneg ||
4736 !(adapter->hw.autoneg_advertised & ADVERTISE_1000_FULL)) 4633 !(hw->autoneg_advertised & ADVERTISE_1000_FULL))
4737 return; 4634 return;
4738 4635
4739 if (adapter->smartspeed == 0) { 4636 if (adapter->smartspeed == 0) {
4740 /* If Master/Slave config fault is asserted twice, 4637 /* If Master/Slave config fault is asserted twice,
4741 * we assume back-to-back */ 4638 * we assume back-to-back */
4742 e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_status); 4639 e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
4743 if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return; 4640 if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
4744 e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_status); 4641 e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
4745 if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return; 4642 if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
4746 e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_ctrl); 4643 e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
4747 if (phy_ctrl & CR_1000T_MS_ENABLE) { 4644 if (phy_ctrl & CR_1000T_MS_ENABLE) {
4748 phy_ctrl &= ~CR_1000T_MS_ENABLE; 4645 phy_ctrl &= ~CR_1000T_MS_ENABLE;
4749 e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, 4646 e1000_write_phy_reg(hw, PHY_1000T_CTRL,
4750 phy_ctrl); 4647 phy_ctrl);
4751 adapter->smartspeed++; 4648 adapter->smartspeed++;
4752 if (!e1000_phy_setup_autoneg(&adapter->hw) && 4649 if (!e1000_phy_setup_autoneg(hw) &&
4753 !e1000_read_phy_reg(&adapter->hw, PHY_CTRL, 4650 !e1000_read_phy_reg(hw, PHY_CTRL,
4754 &phy_ctrl)) { 4651 &phy_ctrl)) {
4755 phy_ctrl |= (MII_CR_AUTO_NEG_EN | 4652 phy_ctrl |= (MII_CR_AUTO_NEG_EN |
4756 MII_CR_RESTART_AUTO_NEG); 4653 MII_CR_RESTART_AUTO_NEG);
4757 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 4654 e1000_write_phy_reg(hw, PHY_CTRL,
4758 phy_ctrl); 4655 phy_ctrl);
4759 } 4656 }
4760 } 4657 }
4761 return; 4658 return;
4762 } else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) { 4659 } else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
4763 /* If still no link, perhaps using 2/3 pair cable */ 4660 /* If still no link, perhaps using 2/3 pair cable */
4764 e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_ctrl); 4661 e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
4765 phy_ctrl |= CR_1000T_MS_ENABLE; 4662 phy_ctrl |= CR_1000T_MS_ENABLE;
4766 e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_ctrl); 4663 e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_ctrl);
4767 if (!e1000_phy_setup_autoneg(&adapter->hw) && 4664 if (!e1000_phy_setup_autoneg(hw) &&
4768 !e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_ctrl)) { 4665 !e1000_read_phy_reg(hw, PHY_CTRL, &phy_ctrl)) {
4769 phy_ctrl |= (MII_CR_AUTO_NEG_EN | 4666 phy_ctrl |= (MII_CR_AUTO_NEG_EN |
4770 MII_CR_RESTART_AUTO_NEG); 4667 MII_CR_RESTART_AUTO_NEG);
4771 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_ctrl); 4668 e1000_write_phy_reg(hw, PHY_CTRL, phy_ctrl);
4772 } 4669 }
4773 } 4670 }
4774 /* Restart process after E1000_SMARTSPEED_MAX iterations */ 4671 /* Restart process after E1000_SMARTSPEED_MAX iterations */
@@ -4783,8 +4680,7 @@ e1000_smartspeed(struct e1000_adapter *adapter)
4783 * @cmd: 4680 * @cmd:
4784 **/ 4681 **/
4785 4682
4786static int 4683static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
4787e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
4788{ 4684{
4789 switch (cmd) { 4685 switch (cmd) {
4790 case SIOCGMIIPHY: 4686 case SIOCGMIIPHY:
@@ -4803,28 +4699,29 @@ e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
4803 * @cmd: 4699 * @cmd:
4804 **/ 4700 **/
4805 4701
4806static int 4702static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
4807e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) 4703 int cmd)
4808{ 4704{
4809 struct e1000_adapter *adapter = netdev_priv(netdev); 4705 struct e1000_adapter *adapter = netdev_priv(netdev);
4706 struct e1000_hw *hw = &adapter->hw;
4810 struct mii_ioctl_data *data = if_mii(ifr); 4707 struct mii_ioctl_data *data = if_mii(ifr);
4811 int retval; 4708 int retval;
4812 u16 mii_reg; 4709 u16 mii_reg;
4813 u16 spddplx; 4710 u16 spddplx;
4814 unsigned long flags; 4711 unsigned long flags;
4815 4712
4816 if (adapter->hw.media_type != e1000_media_type_copper) 4713 if (hw->media_type != e1000_media_type_copper)
4817 return -EOPNOTSUPP; 4714 return -EOPNOTSUPP;
4818 4715
4819 switch (cmd) { 4716 switch (cmd) {
4820 case SIOCGMIIPHY: 4717 case SIOCGMIIPHY:
4821 data->phy_id = adapter->hw.phy_addr; 4718 data->phy_id = hw->phy_addr;
4822 break; 4719 break;
4823 case SIOCGMIIREG: 4720 case SIOCGMIIREG:
4824 if (!capable(CAP_NET_ADMIN)) 4721 if (!capable(CAP_NET_ADMIN))
4825 return -EPERM; 4722 return -EPERM;
4826 spin_lock_irqsave(&adapter->stats_lock, flags); 4723 spin_lock_irqsave(&adapter->stats_lock, flags);
4827 if (e1000_read_phy_reg(&adapter->hw, data->reg_num & 0x1F, 4724 if (e1000_read_phy_reg(hw, data->reg_num & 0x1F,
4828 &data->val_out)) { 4725 &data->val_out)) {
4829 spin_unlock_irqrestore(&adapter->stats_lock, flags); 4726 spin_unlock_irqrestore(&adapter->stats_lock, flags);
4830 return -EIO; 4727 return -EIO;
@@ -4838,20 +4735,20 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
4838 return -EFAULT; 4735 return -EFAULT;
4839 mii_reg = data->val_in; 4736 mii_reg = data->val_in;
4840 spin_lock_irqsave(&adapter->stats_lock, flags); 4737 spin_lock_irqsave(&adapter->stats_lock, flags);
4841 if (e1000_write_phy_reg(&adapter->hw, data->reg_num, 4738 if (e1000_write_phy_reg(hw, data->reg_num,
4842 mii_reg)) { 4739 mii_reg)) {
4843 spin_unlock_irqrestore(&adapter->stats_lock, flags); 4740 spin_unlock_irqrestore(&adapter->stats_lock, flags);
4844 return -EIO; 4741 return -EIO;
4845 } 4742 }
4846 spin_unlock_irqrestore(&adapter->stats_lock, flags); 4743 spin_unlock_irqrestore(&adapter->stats_lock, flags);
4847 if (adapter->hw.media_type == e1000_media_type_copper) { 4744 if (hw->media_type == e1000_media_type_copper) {
4848 switch (data->reg_num) { 4745 switch (data->reg_num) {
4849 case PHY_CTRL: 4746 case PHY_CTRL:
4850 if (mii_reg & MII_CR_POWER_DOWN) 4747 if (mii_reg & MII_CR_POWER_DOWN)
4851 break; 4748 break;
4852 if (mii_reg & MII_CR_AUTO_NEG_EN) { 4749 if (mii_reg & MII_CR_AUTO_NEG_EN) {
4853 adapter->hw.autoneg = 1; 4750 hw->autoneg = 1;
4854 adapter->hw.autoneg_advertised = 0x2F; 4751 hw->autoneg_advertised = 0x2F;
4855 } else { 4752 } else {
4856 if (mii_reg & 0x40) 4753 if (mii_reg & 0x40)
4857 spddplx = SPEED_1000; 4754 spddplx = SPEED_1000;
@@ -4874,7 +4771,7 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
4874 break; 4771 break;
4875 case M88E1000_PHY_SPEC_CTRL: 4772 case M88E1000_PHY_SPEC_CTRL:
4876 case M88E1000_EXT_PHY_SPEC_CTRL: 4773 case M88E1000_EXT_PHY_SPEC_CTRL:
4877 if (e1000_phy_reset(&adapter->hw)) 4774 if (e1000_phy_reset(hw))
4878 return -EIO; 4775 return -EIO;
4879 break; 4776 break;
4880 } 4777 }
@@ -4897,8 +4794,7 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
4897 return E1000_SUCCESS; 4794 return E1000_SUCCESS;
4898} 4795}
4899 4796
4900void 4797void e1000_pci_set_mwi(struct e1000_hw *hw)
4901e1000_pci_set_mwi(struct e1000_hw *hw)
4902{ 4798{
4903 struct e1000_adapter *adapter = hw->back; 4799 struct e1000_adapter *adapter = hw->back;
4904 int ret_val = pci_set_mwi(adapter->pdev); 4800 int ret_val = pci_set_mwi(adapter->pdev);
@@ -4907,30 +4803,26 @@ e1000_pci_set_mwi(struct e1000_hw *hw)
4907 DPRINTK(PROBE, ERR, "Error in setting MWI\n"); 4803 DPRINTK(PROBE, ERR, "Error in setting MWI\n");
4908} 4804}
4909 4805
4910void 4806void e1000_pci_clear_mwi(struct e1000_hw *hw)
4911e1000_pci_clear_mwi(struct e1000_hw *hw)
4912{ 4807{
4913 struct e1000_adapter *adapter = hw->back; 4808 struct e1000_adapter *adapter = hw->back;
4914 4809
4915 pci_clear_mwi(adapter->pdev); 4810 pci_clear_mwi(adapter->pdev);
4916} 4811}
4917 4812
4918int 4813int e1000_pcix_get_mmrbc(struct e1000_hw *hw)
4919e1000_pcix_get_mmrbc(struct e1000_hw *hw)
4920{ 4814{
4921 struct e1000_adapter *adapter = hw->back; 4815 struct e1000_adapter *adapter = hw->back;
4922 return pcix_get_mmrbc(adapter->pdev); 4816 return pcix_get_mmrbc(adapter->pdev);
4923} 4817}
4924 4818
4925void 4819void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
4926e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
4927{ 4820{
4928 struct e1000_adapter *adapter = hw->back; 4821 struct e1000_adapter *adapter = hw->back;
4929 pcix_set_mmrbc(adapter->pdev, mmrbc); 4822 pcix_set_mmrbc(adapter->pdev, mmrbc);
4930} 4823}
4931 4824
4932s32 4825s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
4933e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
4934{ 4826{
4935 struct e1000_adapter *adapter = hw->back; 4827 struct e1000_adapter *adapter = hw->back;
4936 u16 cap_offset; 4828 u16 cap_offset;
@@ -4944,16 +4836,16 @@ e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
4944 return E1000_SUCCESS; 4836 return E1000_SUCCESS;
4945} 4837}
4946 4838
4947void 4839void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value)
4948e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value)
4949{ 4840{
4950 outl(value, port); 4841 outl(value, port);
4951} 4842}
4952 4843
4953static void 4844static void e1000_vlan_rx_register(struct net_device *netdev,
4954e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) 4845 struct vlan_group *grp)
4955{ 4846{
4956 struct e1000_adapter *adapter = netdev_priv(netdev); 4847 struct e1000_adapter *adapter = netdev_priv(netdev);
4848 struct e1000_hw *hw = &adapter->hw;
4957 u32 ctrl, rctl; 4849 u32 ctrl, rctl;
4958 4850
4959 if (!test_bit(__E1000_DOWN, &adapter->flags)) 4851 if (!test_bit(__E1000_DOWN, &adapter->flags))
@@ -4962,22 +4854,22 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
4962 4854
4963 if (grp) { 4855 if (grp) {
4964 /* enable VLAN tag insert/strip */ 4856 /* enable VLAN tag insert/strip */
4965 ctrl = E1000_READ_REG(&adapter->hw, CTRL); 4857 ctrl = er32(CTRL);
4966 ctrl |= E1000_CTRL_VME; 4858 ctrl |= E1000_CTRL_VME;
4967 E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); 4859 ew32(CTRL, ctrl);
4968 4860
4969 if (adapter->hw.mac_type != e1000_ich8lan) { 4861 if (adapter->hw.mac_type != e1000_ich8lan) {
4970 /* enable VLAN receive filtering */ 4862 /* enable VLAN receive filtering */
4971 rctl = E1000_READ_REG(&adapter->hw, RCTL); 4863 rctl = er32(RCTL);
4972 rctl &= ~E1000_RCTL_CFIEN; 4864 rctl &= ~E1000_RCTL_CFIEN;
4973 E1000_WRITE_REG(&adapter->hw, RCTL, rctl); 4865 ew32(RCTL, rctl);
4974 e1000_update_mng_vlan(adapter); 4866 e1000_update_mng_vlan(adapter);
4975 } 4867 }
4976 } else { 4868 } else {
4977 /* disable VLAN tag insert/strip */ 4869 /* disable VLAN tag insert/strip */
4978 ctrl = E1000_READ_REG(&adapter->hw, CTRL); 4870 ctrl = er32(CTRL);
4979 ctrl &= ~E1000_CTRL_VME; 4871 ctrl &= ~E1000_CTRL_VME;
4980 E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); 4872 ew32(CTRL, ctrl);
4981 4873
4982 if (adapter->hw.mac_type != e1000_ich8lan) { 4874 if (adapter->hw.mac_type != e1000_ich8lan) {
4983 if (adapter->mng_vlan_id != 4875 if (adapter->mng_vlan_id !=
@@ -4993,27 +4885,27 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
4993 e1000_irq_enable(adapter); 4885 e1000_irq_enable(adapter);
4994} 4886}
4995 4887
4996static void 4888static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
4997e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
4998{ 4889{
4999 struct e1000_adapter *adapter = netdev_priv(netdev); 4890 struct e1000_adapter *adapter = netdev_priv(netdev);
4891 struct e1000_hw *hw = &adapter->hw;
5000 u32 vfta, index; 4892 u32 vfta, index;
5001 4893
5002 if ((adapter->hw.mng_cookie.status & 4894 if ((hw->mng_cookie.status &
5003 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && 4895 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
5004 (vid == adapter->mng_vlan_id)) 4896 (vid == adapter->mng_vlan_id))
5005 return; 4897 return;
5006 /* add VID to filter table */ 4898 /* add VID to filter table */
5007 index = (vid >> 5) & 0x7F; 4899 index = (vid >> 5) & 0x7F;
5008 vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index); 4900 vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
5009 vfta |= (1 << (vid & 0x1F)); 4901 vfta |= (1 << (vid & 0x1F));
5010 e1000_write_vfta(&adapter->hw, index, vfta); 4902 e1000_write_vfta(hw, index, vfta);
5011} 4903}
5012 4904
5013static void 4905static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
5014e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
5015{ 4906{
5016 struct e1000_adapter *adapter = netdev_priv(netdev); 4907 struct e1000_adapter *adapter = netdev_priv(netdev);
4908 struct e1000_hw *hw = &adapter->hw;
5017 u32 vfta, index; 4909 u32 vfta, index;
5018 4910
5019 if (!test_bit(__E1000_DOWN, &adapter->flags)) 4911 if (!test_bit(__E1000_DOWN, &adapter->flags))
@@ -5022,7 +4914,7 @@ e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
5022 if (!test_bit(__E1000_DOWN, &adapter->flags)) 4914 if (!test_bit(__E1000_DOWN, &adapter->flags))
5023 e1000_irq_enable(adapter); 4915 e1000_irq_enable(adapter);
5024 4916
5025 if ((adapter->hw.mng_cookie.status & 4917 if ((hw->mng_cookie.status &
5026 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && 4918 E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
5027 (vid == adapter->mng_vlan_id)) { 4919 (vid == adapter->mng_vlan_id)) {
5028 /* release control to f/w */ 4920 /* release control to f/w */
@@ -5032,13 +4924,12 @@ e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
5032 4924
5033 /* remove VID from filter table */ 4925 /* remove VID from filter table */
5034 index = (vid >> 5) & 0x7F; 4926 index = (vid >> 5) & 0x7F;
5035 vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index); 4927 vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
5036 vfta &= ~(1 << (vid & 0x1F)); 4928 vfta &= ~(1 << (vid & 0x1F));
5037 e1000_write_vfta(&adapter->hw, index, vfta); 4929 e1000_write_vfta(hw, index, vfta);
5038} 4930}
5039 4931
5040static void 4932static void e1000_restore_vlan(struct e1000_adapter *adapter)
5041e1000_restore_vlan(struct e1000_adapter *adapter)
5042{ 4933{
5043 e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp); 4934 e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
5044 4935
@@ -5052,13 +4943,14 @@ e1000_restore_vlan(struct e1000_adapter *adapter)
5052 } 4943 }
5053} 4944}
5054 4945
5055int 4946int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
5056e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
5057{ 4947{
5058 adapter->hw.autoneg = 0; 4948 struct e1000_hw *hw = &adapter->hw;
4949
4950 hw->autoneg = 0;
5059 4951
5060 /* Fiber NICs only allow 1000 gbps Full duplex */ 4952 /* Fiber NICs only allow 1000 gbps Full duplex */
5061 if ((adapter->hw.media_type == e1000_media_type_fiber) && 4953 if ((hw->media_type == e1000_media_type_fiber) &&
5062 spddplx != (SPEED_1000 + DUPLEX_FULL)) { 4954 spddplx != (SPEED_1000 + DUPLEX_FULL)) {
5063 DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n"); 4955 DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
5064 return -EINVAL; 4956 return -EINVAL;
@@ -5066,20 +4958,20 @@ e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
5066 4958
5067 switch (spddplx) { 4959 switch (spddplx) {
5068 case SPEED_10 + DUPLEX_HALF: 4960 case SPEED_10 + DUPLEX_HALF:
5069 adapter->hw.forced_speed_duplex = e1000_10_half; 4961 hw->forced_speed_duplex = e1000_10_half;
5070 break; 4962 break;
5071 case SPEED_10 + DUPLEX_FULL: 4963 case SPEED_10 + DUPLEX_FULL:
5072 adapter->hw.forced_speed_duplex = e1000_10_full; 4964 hw->forced_speed_duplex = e1000_10_full;
5073 break; 4965 break;
5074 case SPEED_100 + DUPLEX_HALF: 4966 case SPEED_100 + DUPLEX_HALF:
5075 adapter->hw.forced_speed_duplex = e1000_100_half; 4967 hw->forced_speed_duplex = e1000_100_half;
5076 break; 4968 break;
5077 case SPEED_100 + DUPLEX_FULL: 4969 case SPEED_100 + DUPLEX_FULL:
5078 adapter->hw.forced_speed_duplex = e1000_100_full; 4970 hw->forced_speed_duplex = e1000_100_full;
5079 break; 4971 break;
5080 case SPEED_1000 + DUPLEX_FULL: 4972 case SPEED_1000 + DUPLEX_FULL:
5081 adapter->hw.autoneg = 1; 4973 hw->autoneg = 1;
5082 adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; 4974 hw->autoneg_advertised = ADVERTISE_1000_FULL;
5083 break; 4975 break;
5084 case SPEED_1000 + DUPLEX_HALF: /* not supported */ 4976 case SPEED_1000 + DUPLEX_HALF: /* not supported */
5085 default: 4977 default:
@@ -5089,11 +4981,11 @@ e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
5089 return 0; 4981 return 0;
5090} 4982}
5091 4983
5092static int 4984static int e1000_suspend(struct pci_dev *pdev, pm_message_t state)
5093e1000_suspend(struct pci_dev *pdev, pm_message_t state)
5094{ 4985{
5095 struct net_device *netdev = pci_get_drvdata(pdev); 4986 struct net_device *netdev = pci_get_drvdata(pdev);
5096 struct e1000_adapter *adapter = netdev_priv(netdev); 4987 struct e1000_adapter *adapter = netdev_priv(netdev);
4988 struct e1000_hw *hw = &adapter->hw;
5097 u32 ctrl, ctrl_ext, rctl, status; 4989 u32 ctrl, ctrl_ext, rctl, status;
5098 u32 wufc = adapter->wol; 4990 u32 wufc = adapter->wol;
5099#ifdef CONFIG_PM 4991#ifdef CONFIG_PM
@@ -5113,7 +5005,7 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
5113 return retval; 5005 return retval;
5114#endif 5006#endif
5115 5007
5116 status = E1000_READ_REG(&adapter->hw, STATUS); 5008 status = er32(STATUS);
5117 if (status & E1000_STATUS_LU) 5009 if (status & E1000_STATUS_LU)
5118 wufc &= ~E1000_WUFC_LNKC; 5010 wufc &= ~E1000_WUFC_LNKC;
5119 5011
@@ -5123,40 +5015,40 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
5123 5015
5124 /* turn on all-multi mode if wake on multicast is enabled */ 5016 /* turn on all-multi mode if wake on multicast is enabled */
5125 if (wufc & E1000_WUFC_MC) { 5017 if (wufc & E1000_WUFC_MC) {
5126 rctl = E1000_READ_REG(&adapter->hw, RCTL); 5018 rctl = er32(RCTL);
5127 rctl |= E1000_RCTL_MPE; 5019 rctl |= E1000_RCTL_MPE;
5128 E1000_WRITE_REG(&adapter->hw, RCTL, rctl); 5020 ew32(RCTL, rctl);
5129 } 5021 }
5130 5022
5131 if (adapter->hw.mac_type >= e1000_82540) { 5023 if (hw->mac_type >= e1000_82540) {
5132 ctrl = E1000_READ_REG(&adapter->hw, CTRL); 5024 ctrl = er32(CTRL);
5133 /* advertise wake from D3Cold */ 5025 /* advertise wake from D3Cold */
5134 #define E1000_CTRL_ADVD3WUC 0x00100000 5026 #define E1000_CTRL_ADVD3WUC 0x00100000
5135 /* phy power management enable */ 5027 /* phy power management enable */
5136 #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 5028 #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
5137 ctrl |= E1000_CTRL_ADVD3WUC | 5029 ctrl |= E1000_CTRL_ADVD3WUC |
5138 E1000_CTRL_EN_PHY_PWR_MGMT; 5030 E1000_CTRL_EN_PHY_PWR_MGMT;
5139 E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); 5031 ew32(CTRL, ctrl);
5140 } 5032 }
5141 5033
5142 if (adapter->hw.media_type == e1000_media_type_fiber || 5034 if (hw->media_type == e1000_media_type_fiber ||
5143 adapter->hw.media_type == e1000_media_type_internal_serdes) { 5035 hw->media_type == e1000_media_type_internal_serdes) {
5144 /* keep the laser running in D3 */ 5036 /* keep the laser running in D3 */
5145 ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); 5037 ctrl_ext = er32(CTRL_EXT);
5146 ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA; 5038 ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
5147 E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext); 5039 ew32(CTRL_EXT, ctrl_ext);
5148 } 5040 }
5149 5041
5150 /* Allow time for pending master requests to run */ 5042 /* Allow time for pending master requests to run */
5151 e1000_disable_pciex_master(&adapter->hw); 5043 e1000_disable_pciex_master(hw);
5152 5044
5153 E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN); 5045 ew32(WUC, E1000_WUC_PME_EN);
5154 E1000_WRITE_REG(&adapter->hw, WUFC, wufc); 5046 ew32(WUFC, wufc);
5155 pci_enable_wake(pdev, PCI_D3hot, 1); 5047 pci_enable_wake(pdev, PCI_D3hot, 1);
5156 pci_enable_wake(pdev, PCI_D3cold, 1); 5048 pci_enable_wake(pdev, PCI_D3cold, 1);
5157 } else { 5049 } else {
5158 E1000_WRITE_REG(&adapter->hw, WUC, 0); 5050 ew32(WUC, 0);
5159 E1000_WRITE_REG(&adapter->hw, WUFC, 0); 5051 ew32(WUFC, 0);
5160 pci_enable_wake(pdev, PCI_D3hot, 0); 5052 pci_enable_wake(pdev, PCI_D3hot, 0);
5161 pci_enable_wake(pdev, PCI_D3cold, 0); 5053 pci_enable_wake(pdev, PCI_D3cold, 0);
5162 } 5054 }
@@ -5169,8 +5061,8 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
5169 pci_enable_wake(pdev, PCI_D3cold, 1); 5061 pci_enable_wake(pdev, PCI_D3cold, 1);
5170 } 5062 }
5171 5063
5172 if (adapter->hw.phy_type == e1000_phy_igp_3) 5064 if (hw->phy_type == e1000_phy_igp_3)
5173 e1000_phy_powerdown_workaround(&adapter->hw); 5065 e1000_phy_powerdown_workaround(hw);
5174 5066
5175 if (netif_running(netdev)) 5067 if (netif_running(netdev))
5176 e1000_free_irq(adapter); 5068 e1000_free_irq(adapter);
@@ -5187,16 +5079,21 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
5187} 5079}
5188 5080
5189#ifdef CONFIG_PM 5081#ifdef CONFIG_PM
5190static int 5082static int e1000_resume(struct pci_dev *pdev)
5191e1000_resume(struct pci_dev *pdev)
5192{ 5083{
5193 struct net_device *netdev = pci_get_drvdata(pdev); 5084 struct net_device *netdev = pci_get_drvdata(pdev);
5194 struct e1000_adapter *adapter = netdev_priv(netdev); 5085 struct e1000_adapter *adapter = netdev_priv(netdev);
5086 struct e1000_hw *hw = &adapter->hw;
5195 u32 err; 5087 u32 err;
5196 5088
5197 pci_set_power_state(pdev, PCI_D0); 5089 pci_set_power_state(pdev, PCI_D0);
5198 pci_restore_state(pdev); 5090 pci_restore_state(pdev);
5199 if ((err = pci_enable_device(pdev))) { 5091
5092 if (adapter->need_ioport)
5093 err = pci_enable_device(pdev);
5094 else
5095 err = pci_enable_device_mem(pdev);
5096 if (err) {
5200 printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n"); 5097 printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
5201 return err; 5098 return err;
5202 } 5099 }
@@ -5205,12 +5102,15 @@ e1000_resume(struct pci_dev *pdev)
5205 pci_enable_wake(pdev, PCI_D3hot, 0); 5102 pci_enable_wake(pdev, PCI_D3hot, 0);
5206 pci_enable_wake(pdev, PCI_D3cold, 0); 5103 pci_enable_wake(pdev, PCI_D3cold, 0);
5207 5104
5208 if (netif_running(netdev) && (err = e1000_request_irq(adapter))) 5105 if (netif_running(netdev)) {
5209 return err; 5106 err = e1000_request_irq(adapter);
5107 if (err)
5108 return err;
5109 }
5210 5110
5211 e1000_power_up_phy(adapter); 5111 e1000_power_up_phy(adapter);
5212 e1000_reset(adapter); 5112 e1000_reset(adapter);
5213 E1000_WRITE_REG(&adapter->hw, WUS, ~0); 5113 ew32(WUS, ~0);
5214 5114
5215 e1000_init_manageability(adapter); 5115 e1000_init_manageability(adapter);
5216 5116
@@ -5223,8 +5123,8 @@ e1000_resume(struct pci_dev *pdev)
5223 * DRV_LOAD until the interface is up. For all other cases, 5123 * DRV_LOAD until the interface is up. For all other cases,
5224 * let the f/w know that the h/w is now under the control 5124 * let the f/w know that the h/w is now under the control
5225 * of the driver. */ 5125 * of the driver. */
5226 if (adapter->hw.mac_type != e1000_82573 || 5126 if (hw->mac_type != e1000_82573 ||
5227 !e1000_check_mng_mode(&adapter->hw)) 5127 !e1000_check_mng_mode(hw))
5228 e1000_get_hw_control(adapter); 5128 e1000_get_hw_control(adapter);
5229 5129
5230 return 0; 5130 return 0;
@@ -5242,16 +5142,12 @@ static void e1000_shutdown(struct pci_dev *pdev)
5242 * without having to re-enable interrupts. It's not called while 5142 * without having to re-enable interrupts. It's not called while
5243 * the interrupt routine is executing. 5143 * the interrupt routine is executing.
5244 */ 5144 */
5245static void 5145static void e1000_netpoll(struct net_device *netdev)
5246e1000_netpoll(struct net_device *netdev)
5247{ 5146{
5248 struct e1000_adapter *adapter = netdev_priv(netdev); 5147 struct e1000_adapter *adapter = netdev_priv(netdev);
5249 5148
5250 disable_irq(adapter->pdev->irq); 5149 disable_irq(adapter->pdev->irq);
5251 e1000_intr(adapter->pdev->irq, netdev); 5150 e1000_intr(adapter->pdev->irq, netdev);
5252#ifndef CONFIG_E1000_NAPI
5253 adapter->clean_rx(adapter, adapter->rx_ring);
5254#endif
5255 enable_irq(adapter->pdev->irq); 5151 enable_irq(adapter->pdev->irq);
5256} 5152}
5257#endif 5153#endif
@@ -5264,7 +5160,8 @@ e1000_netpoll(struct net_device *netdev)
5264 * This function is called after a PCI bus error affecting 5160 * This function is called after a PCI bus error affecting
5265 * this device has been detected. 5161 * this device has been detected.
5266 */ 5162 */
5267static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state) 5163static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
5164 pci_channel_state_t state)
5268{ 5165{
5269 struct net_device *netdev = pci_get_drvdata(pdev); 5166 struct net_device *netdev = pci_get_drvdata(pdev);
5270 struct e1000_adapter *adapter = netdev->priv; 5167 struct e1000_adapter *adapter = netdev->priv;
@@ -5290,8 +5187,14 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
5290{ 5187{
5291 struct net_device *netdev = pci_get_drvdata(pdev); 5188 struct net_device *netdev = pci_get_drvdata(pdev);
5292 struct e1000_adapter *adapter = netdev->priv; 5189 struct e1000_adapter *adapter = netdev->priv;
5190 struct e1000_hw *hw = &adapter->hw;
5191 int err;
5293 5192
5294 if (pci_enable_device(pdev)) { 5193 if (adapter->need_ioport)
5194 err = pci_enable_device(pdev);
5195 else
5196 err = pci_enable_device_mem(pdev);
5197 if (err) {
5295 printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n"); 5198 printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n");
5296 return PCI_ERS_RESULT_DISCONNECT; 5199 return PCI_ERS_RESULT_DISCONNECT;
5297 } 5200 }
@@ -5301,7 +5204,7 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
5301 pci_enable_wake(pdev, PCI_D3cold, 0); 5204 pci_enable_wake(pdev, PCI_D3cold, 0);
5302 5205
5303 e1000_reset(adapter); 5206 e1000_reset(adapter);
5304 E1000_WRITE_REG(&adapter->hw, WUS, ~0); 5207 ew32(WUS, ~0);
5305 5208
5306 return PCI_ERS_RESULT_RECOVERED; 5209 return PCI_ERS_RESULT_RECOVERED;
5307} 5210}
@@ -5318,6 +5221,7 @@ static void e1000_io_resume(struct pci_dev *pdev)
5318{ 5221{
5319 struct net_device *netdev = pci_get_drvdata(pdev); 5222 struct net_device *netdev = pci_get_drvdata(pdev);
5320 struct e1000_adapter *adapter = netdev->priv; 5223 struct e1000_adapter *adapter = netdev->priv;
5224 struct e1000_hw *hw = &adapter->hw;
5321 5225
5322 e1000_init_manageability(adapter); 5226 e1000_init_manageability(adapter);
5323 5227
@@ -5334,8 +5238,8 @@ static void e1000_io_resume(struct pci_dev *pdev)
5334 * DRV_LOAD until the interface is up. For all other cases, 5238 * DRV_LOAD until the interface is up. For all other cases,
5335 * let the f/w know that the h/w is now under the control 5239 * let the f/w know that the h/w is now under the control
5336 * of the driver. */ 5240 * of the driver. */
5337 if (adapter->hw.mac_type != e1000_82573 || 5241 if (hw->mac_type != e1000_82573 ||
5338 !e1000_check_mng_mode(&adapter->hw)) 5242 !e1000_check_mng_mode(hw))
5339 e1000_get_hw_control(adapter); 5243 e1000_get_hw_control(adapter);
5340 5244
5341} 5245}
diff --git a/drivers/net/e1000/e1000_osdep.h b/drivers/net/e1000/e1000_osdep.h
index 365626d3177e..d9298522f5ae 100644
--- a/drivers/net/e1000/e1000_osdep.h
+++ b/drivers/net/e1000/e1000_osdep.h
@@ -55,13 +55,13 @@
55#define DEBUGOUT7 DEBUGOUT3 55#define DEBUGOUT7 DEBUGOUT3
56 56
57 57
58#define E1000_WRITE_REG(a, reg, value) ( \ 58#define er32(reg) \
59 writel((value), ((a)->hw_addr + \ 59 (readl(hw->hw_addr + ((hw->mac_type >= e1000_82543) \
60 (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg)))) 60 ? E1000_##reg : E1000_82542_##reg)))
61 61
62#define E1000_READ_REG(a, reg) ( \ 62#define ew32(reg, value) \
63 readl((a)->hw_addr + \ 63 (writel((value), (hw->hw_addr + ((hw->mac_type >= e1000_82543) \
64 (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg))) 64 ? E1000_##reg : E1000_82542_##reg))))
65 65
66#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ 66#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \
67 writel((value), ((a)->hw_addr + \ 67 writel((value), ((a)->hw_addr + \
@@ -96,7 +96,7 @@
96 (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \ 96 (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
97 (offset))) 97 (offset)))
98 98
99#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS) 99#define E1000_WRITE_FLUSH() er32(STATUS)
100 100
101#define E1000_WRITE_ICH_FLASH_REG(a, reg, value) ( \ 101#define E1000_WRITE_ICH_FLASH_REG(a, reg, value) ( \
102 writel((value), ((a)->flash_address + reg))) 102 writel((value), ((a)->flash_address + reg)))
diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c
index e6565ce686bc..b9f90a5d3d4d 100644
--- a/drivers/net/e1000/e1000_param.c
+++ b/drivers/net/e1000/e1000_param.c
@@ -213,10 +213,9 @@ struct e1000_option {
213 } arg; 213 } arg;
214}; 214};
215 215
216static int __devinit 216static int __devinit e1000_validate_option(unsigned int *value,
217e1000_validate_option(unsigned int *value, 217 const struct e1000_option *opt,
218 const struct e1000_option *opt, 218 struct e1000_adapter *adapter)
219 struct e1000_adapter *adapter)
220{ 219{
221 if (*value == OPTION_UNSET) { 220 if (*value == OPTION_UNSET) {
222 *value = opt->def; 221 *value = opt->def;
@@ -278,8 +277,7 @@ static void e1000_check_copper_options(struct e1000_adapter *adapter);
278 * in a variable in the adapter structure. 277 * in a variable in the adapter structure.
279 **/ 278 **/
280 279
281void __devinit 280void __devinit e1000_check_options(struct e1000_adapter *adapter)
282e1000_check_options(struct e1000_adapter *adapter)
283{ 281{
284 int bd = adapter->bd_number; 282 int bd = adapter->bd_number;
285 if (bd >= E1000_MAX_NIC) { 283 if (bd >= E1000_MAX_NIC) {
@@ -551,8 +549,7 @@ e1000_check_options(struct e1000_adapter *adapter)
551 * Handles speed and duplex options on fiber adapters 549 * Handles speed and duplex options on fiber adapters
552 **/ 550 **/
553 551
554static void __devinit 552static void __devinit e1000_check_fiber_options(struct e1000_adapter *adapter)
555e1000_check_fiber_options(struct e1000_adapter *adapter)
556{ 553{
557 int bd = adapter->bd_number; 554 int bd = adapter->bd_number;
558 if (num_Speed > bd) { 555 if (num_Speed > bd) {
@@ -579,8 +576,7 @@ e1000_check_fiber_options(struct e1000_adapter *adapter)
579 * Handles speed and duplex options on copper adapters 576 * Handles speed and duplex options on copper adapters
580 **/ 577 **/
581 578
582static void __devinit 579static void __devinit e1000_check_copper_options(struct e1000_adapter *adapter)
583e1000_check_copper_options(struct e1000_adapter *adapter)
584{ 580{
585 unsigned int speed, dplx, an; 581 unsigned int speed, dplx, an;
586 int bd = adapter->bd_number; 582 int bd = adapter->bd_number;
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 869544b8c05c..9c0f56b3c518 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -4067,8 +4067,6 @@ static void e1000_netpoll(struct net_device *netdev)
4067 disable_irq(adapter->pdev->irq); 4067 disable_irq(adapter->pdev->irq);
4068 e1000_intr(adapter->pdev->irq, netdev); 4068 e1000_intr(adapter->pdev->irq, netdev);
4069 4069
4070 e1000_clean_tx_irq(adapter);
4071
4072 enable_irq(adapter->pdev->irq); 4070 enable_irq(adapter->pdev->irq);
4073} 4071}
4074#endif 4072#endif
diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index 32a4f17d35fc..ecd5c71a7a8a 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -2,12 +2,6 @@
2 * Fast Ethernet Controller (FEC) driver for Motorola MPC8xx. 2 * Fast Ethernet Controller (FEC) driver for Motorola MPC8xx.
3 * Copyright (c) 1997 Dan Malek (dmalek@jlc.net) 3 * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
4 * 4 *
5 * This version of the driver is specific to the FADS implementation,
6 * since the board contains control registers external to the processor
7 * for the control of the LevelOne LXT970 transceiver. The MPC860T manual
8 * describes connections using the internal parallel port I/O, which
9 * is basically all of Port D.
10 *
11 * Right now, I am very wasteful with the buffers. I allocate memory 5 * Right now, I am very wasteful with the buffers. I allocate memory
12 * pages and then divide them into 2K frame buffers. This way I know I 6 * pages and then divide them into 2K frame buffers. This way I know I
13 * have buffers large enough to hold one frame within one buffer descriptor. 7 * have buffers large enough to hold one frame within one buffer descriptor.
@@ -49,17 +43,9 @@
49#include <asm/pgtable.h> 43#include <asm/pgtable.h>
50#include <asm/cacheflush.h> 44#include <asm/cacheflush.h>
51 45
52#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \
53 defined(CONFIG_M5272) || defined(CONFIG_M528x) || \
54 defined(CONFIG_M520x) || defined(CONFIG_M532x)
55#include <asm/coldfire.h> 46#include <asm/coldfire.h>
56#include <asm/mcfsim.h> 47#include <asm/mcfsim.h>
57#include "fec.h" 48#include "fec.h"
58#else
59#include <asm/8xx_immap.h>
60#include <asm/mpc8xx.h>
61#include "commproc.h"
62#endif
63 49
64#if defined(CONFIG_FEC2) 50#if defined(CONFIG_FEC2)
65#define FEC_MAX_PORTS 2 51#define FEC_MAX_PORTS 2
@@ -67,7 +53,7 @@
67#define FEC_MAX_PORTS 1 53#define FEC_MAX_PORTS 1
68#endif 54#endif
69 55
70#if defined(CONFIG_FADS) || defined(CONFIG_RPXCLASSIC) || defined(CONFIG_M5272) 56#if defined(CONFIG_M5272)
71#define HAVE_mii_link_interrupt 57#define HAVE_mii_link_interrupt
72#endif 58#endif
73 59
@@ -1235,14 +1221,9 @@ static phy_info_t const * const phy_info[] = {
1235 1221
1236/* ------------------------------------------------------------------------- */ 1222/* ------------------------------------------------------------------------- */
1237#ifdef HAVE_mii_link_interrupt 1223#ifdef HAVE_mii_link_interrupt
1238#ifdef CONFIG_RPXCLASSIC
1239static void
1240mii_link_interrupt(void *dev_id);
1241#else
1242static irqreturn_t 1224static irqreturn_t
1243mii_link_interrupt(int irq, void * dev_id); 1225mii_link_interrupt(int irq, void * dev_id);
1244#endif 1226#endif
1245#endif
1246 1227
1247#if defined(CONFIG_M5272) 1228#if defined(CONFIG_M5272)
1248/* 1229/*
@@ -1795,24 +1776,6 @@ static void __inline__ fec_request_intrs(struct net_device *dev)
1795 1776
1796 if (request_8xxirq(FEC_INTERRUPT, fec_enet_interrupt, 0, "fec", dev) != 0) 1777 if (request_8xxirq(FEC_INTERRUPT, fec_enet_interrupt, 0, "fec", dev) != 0)
1797 panic("Could not allocate FEC IRQ!"); 1778 panic("Could not allocate FEC IRQ!");
1798
1799#ifdef CONFIG_RPXCLASSIC
1800 /* Make Port C, bit 15 an input that causes interrupts.
1801 */
1802 immap->im_ioport.iop_pcpar &= ~0x0001;
1803 immap->im_ioport.iop_pcdir &= ~0x0001;
1804 immap->im_ioport.iop_pcso &= ~0x0001;
1805 immap->im_ioport.iop_pcint |= 0x0001;
1806 cpm_install_handler(CPMVEC_PIO_PC15, mii_link_interrupt, dev);
1807
1808 /* Make LEDS reflect Link status.
1809 */
1810 *((uint *) RPX_CSR_ADDR) &= ~BCSR2_FETHLEDMODE;
1811#endif
1812#ifdef CONFIG_FADS
1813 if (request_8xxirq(SIU_IRQ2, mii_link_interrupt, 0, "mii", dev) != 0)
1814 panic("Could not allocate MII IRQ!");
1815#endif
1816} 1779}
1817 1780
1818static void __inline__ fec_get_mac(struct net_device *dev) 1781static void __inline__ fec_get_mac(struct net_device *dev)
@@ -1821,16 +1784,6 @@ static void __inline__ fec_get_mac(struct net_device *dev)
1821 1784
1822 bd = (bd_t *)__res; 1785 bd = (bd_t *)__res;
1823 memcpy(dev->dev_addr, bd->bi_enetaddr, ETH_ALEN); 1786 memcpy(dev->dev_addr, bd->bi_enetaddr, ETH_ALEN);
1824
1825#ifdef CONFIG_RPXCLASSIC
1826 /* The Embedded Planet boards have only one MAC address in
1827 * the EEPROM, but can have two Ethernet ports. For the
1828 * FEC port, we create another address by setting one of
1829 * the address bits above something that would have (up to
1830 * now) been allocated.
1831 */
1832 dev->dev_adrd[3] |= 0x80;
1833#endif
1834} 1787}
1835 1788
1836static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_private *fep) 1789static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_private *fep)
@@ -2109,13 +2062,8 @@ mii_discover_phy(uint mii_reg, struct net_device *dev)
2109/* This interrupt occurs when the PHY detects a link change. 2062/* This interrupt occurs when the PHY detects a link change.
2110*/ 2063*/
2111#ifdef HAVE_mii_link_interrupt 2064#ifdef HAVE_mii_link_interrupt
2112#ifdef CONFIG_RPXCLASSIC
2113static void
2114mii_link_interrupt(void *dev_id)
2115#else
2116static irqreturn_t 2065static irqreturn_t
2117mii_link_interrupt(int irq, void * dev_id) 2066mii_link_interrupt(int irq, void * dev_id)
2118#endif
2119{ 2067{
2120 struct net_device *dev = dev_id; 2068 struct net_device *dev = dev_id;
2121 struct fec_enet_private *fep = netdev_priv(dev); 2069 struct fec_enet_private *fep = netdev_priv(dev);
diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c
index ae9ecb7df22b..4e4f68304e82 100644
--- a/drivers/net/fec_mpc52xx.c
+++ b/drivers/net/fec_mpc52xx.c
@@ -197,9 +197,6 @@ static void mpc52xx_fec_adjust_link(struct net_device *dev)
197 if (priv->link == PHY_DOWN) { 197 if (priv->link == PHY_DOWN) {
198 new_state = 1; 198 new_state = 1;
199 priv->link = phydev->link; 199 priv->link = phydev->link;
200 netif_tx_schedule_all(dev);
201 netif_carrier_on(dev);
202 netif_start_queue(dev);
203 } 200 }
204 201
205 } else if (priv->link) { 202 } else if (priv->link) {
@@ -207,8 +204,6 @@ static void mpc52xx_fec_adjust_link(struct net_device *dev)
207 priv->link = PHY_DOWN; 204 priv->link = PHY_DOWN;
208 priv->speed = 0; 205 priv->speed = 0;
209 priv->duplex = -1; 206 priv->duplex = -1;
210 netif_stop_queue(dev);
211 netif_carrier_off(dev);
212 } 207 }
213 208
214 if (new_state && netif_msg_link(priv)) 209 if (new_state && netif_msg_link(priv))
diff --git a/drivers/net/fs_enet/Makefile b/drivers/net/fs_enet/Makefile
index 1ffbe0756a0c..d4a305ee3455 100644
--- a/drivers/net/fs_enet/Makefile
+++ b/drivers/net/fs_enet/Makefile
@@ -8,12 +8,7 @@ fs_enet-$(CONFIG_FS_ENET_HAS_SCC) += mac-scc.o
8fs_enet-$(CONFIG_FS_ENET_HAS_FEC) += mac-fec.o 8fs_enet-$(CONFIG_FS_ENET_HAS_FEC) += mac-fec.o
9fs_enet-$(CONFIG_FS_ENET_HAS_FCC) += mac-fcc.o 9fs_enet-$(CONFIG_FS_ENET_HAS_FCC) += mac-fcc.o
10 10
11ifeq ($(CONFIG_PPC_CPM_NEW_BINDING),y)
12obj-$(CONFIG_FS_ENET_MDIO_FEC) += mii-fec.o 11obj-$(CONFIG_FS_ENET_MDIO_FEC) += mii-fec.o
13obj-$(CONFIG_FS_ENET_MDIO_FCC) += mii-bitbang.o 12obj-$(CONFIG_FS_ENET_MDIO_FCC) += mii-bitbang.o
14else
15fs_enet-$(CONFIG_FS_ENET_MDIO_FEC) += mii-fec.o
16fs_enet-$(CONFIG_FS_ENET_MDIO_FCC) += mii-bitbang.o
17endif
18 13
19fs_enet-objs := fs_enet-main.o $(fs_enet-m) 14fs_enet-objs := fs_enet-main.o $(fs_enet-m)
diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c
index 445763e5648e..9a51ec8293cc 100644
--- a/drivers/net/fs_enet/fs_enet-main.c
+++ b/drivers/net/fs_enet/fs_enet-main.c
@@ -36,26 +36,18 @@
36#include <linux/fs.h> 36#include <linux/fs.h>
37#include <linux/platform_device.h> 37#include <linux/platform_device.h>
38#include <linux/phy.h> 38#include <linux/phy.h>
39#include <linux/of_platform.h>
40#include <linux/of_gpio.h>
39 41
40#include <linux/vmalloc.h> 42#include <linux/vmalloc.h>
41#include <asm/pgtable.h> 43#include <asm/pgtable.h>
42#include <asm/irq.h> 44#include <asm/irq.h>
43#include <asm/uaccess.h> 45#include <asm/uaccess.h>
44 46
45#ifdef CONFIG_PPC_CPM_NEW_BINDING
46#include <linux/of_gpio.h>
47#include <linux/of_platform.h>
48#endif
49
50#include "fs_enet.h" 47#include "fs_enet.h"
51 48
52/*************************************************/ 49/*************************************************/
53 50
54#ifndef CONFIG_PPC_CPM_NEW_BINDING
55static char version[] __devinitdata =
56 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")" "\n";
57#endif
58
59MODULE_AUTHOR("Pantelis Antoniou <panto@intracom.gr>"); 51MODULE_AUTHOR("Pantelis Antoniou <panto@intracom.gr>");
60MODULE_DESCRIPTION("Freescale Ethernet Driver"); 52MODULE_DESCRIPTION("Freescale Ethernet Driver");
61MODULE_LICENSE("GPL"); 53MODULE_LICENSE("GPL");
@@ -738,9 +730,6 @@ static void generic_adjust_link(struct net_device *dev)
738 if (!fep->oldlink) { 730 if (!fep->oldlink) {
739 new_state = 1; 731 new_state = 1;
740 fep->oldlink = 1; 732 fep->oldlink = 1;
741 netif_tx_schedule_all(dev);
742 netif_carrier_on(dev);
743 netif_start_queue(dev);
744 } 733 }
745 734
746 if (new_state) 735 if (new_state)
@@ -750,8 +739,6 @@ static void generic_adjust_link(struct net_device *dev)
750 fep->oldlink = 0; 739 fep->oldlink = 0;
751 fep->oldspeed = 0; 740 fep->oldspeed = 0;
752 fep->oldduplex = -1; 741 fep->oldduplex = -1;
753 netif_carrier_off(dev);
754 netif_stop_queue(dev);
755 } 742 }
756 743
757 if (new_state && netif_msg_link(fep)) 744 if (new_state && netif_msg_link(fep))
@@ -826,6 +813,8 @@ static int fs_enet_open(struct net_device *dev)
826 } 813 }
827 phy_start(fep->phydev); 814 phy_start(fep->phydev);
828 815
816 netif_start_queue(dev);
817
829 return 0; 818 return 0;
830} 819}
831 820
@@ -958,190 +947,6 @@ static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
958extern int fs_mii_connect(struct net_device *dev); 947extern int fs_mii_connect(struct net_device *dev);
959extern void fs_mii_disconnect(struct net_device *dev); 948extern void fs_mii_disconnect(struct net_device *dev);
960 949
961#ifndef CONFIG_PPC_CPM_NEW_BINDING
962static struct net_device *fs_init_instance(struct device *dev,
963 struct fs_platform_info *fpi)
964{
965 struct net_device *ndev = NULL;
966 struct fs_enet_private *fep = NULL;
967 int privsize, i, r, err = 0, registered = 0;
968
969 fpi->fs_no = fs_get_id(fpi);
970 /* guard */
971 if ((unsigned int)fpi->fs_no >= FS_MAX_INDEX)
972 return ERR_PTR(-EINVAL);
973
974 privsize = sizeof(*fep) + (sizeof(struct sk_buff **) *
975 (fpi->rx_ring + fpi->tx_ring));
976
977 ndev = alloc_etherdev(privsize);
978 if (!ndev) {
979 err = -ENOMEM;
980 goto err;
981 }
982
983 fep = netdev_priv(ndev);
984
985 fep->dev = dev;
986 dev_set_drvdata(dev, ndev);
987 fep->fpi = fpi;
988 if (fpi->init_ioports)
989 fpi->init_ioports((struct fs_platform_info *)fpi);
990
991#ifdef CONFIG_FS_ENET_HAS_FEC
992 if (fs_get_fec_index(fpi->fs_no) >= 0)
993 fep->ops = &fs_fec_ops;
994#endif
995
996#ifdef CONFIG_FS_ENET_HAS_SCC
997 if (fs_get_scc_index(fpi->fs_no) >=0)
998 fep->ops = &fs_scc_ops;
999#endif
1000
1001#ifdef CONFIG_FS_ENET_HAS_FCC
1002 if (fs_get_fcc_index(fpi->fs_no) >= 0)
1003 fep->ops = &fs_fcc_ops;
1004#endif
1005
1006 if (fep->ops == NULL) {
1007 printk(KERN_ERR DRV_MODULE_NAME
1008 ": %s No matching ops found (%d).\n",
1009 ndev->name, fpi->fs_no);
1010 err = -EINVAL;
1011 goto err;
1012 }
1013
1014 r = (*fep->ops->setup_data)(ndev);
1015 if (r != 0) {
1016 printk(KERN_ERR DRV_MODULE_NAME
1017 ": %s setup_data failed\n",
1018 ndev->name);
1019 err = r;
1020 goto err;
1021 }
1022
1023 /* point rx_skbuff, tx_skbuff */
1024 fep->rx_skbuff = (struct sk_buff **)&fep[1];
1025 fep->tx_skbuff = fep->rx_skbuff + fpi->rx_ring;
1026
1027 /* init locks */
1028 spin_lock_init(&fep->lock);
1029 spin_lock_init(&fep->tx_lock);
1030
1031 /*
1032 * Set the Ethernet address.
1033 */
1034 for (i = 0; i < 6; i++)
1035 ndev->dev_addr[i] = fpi->macaddr[i];
1036
1037 r = (*fep->ops->allocate_bd)(ndev);
1038
1039 if (fep->ring_base == NULL) {
1040 printk(KERN_ERR DRV_MODULE_NAME
1041 ": %s buffer descriptor alloc failed (%d).\n", ndev->name, r);
1042 err = r;
1043 goto err;
1044 }
1045
1046 /*
1047 * Set receive and transmit descriptor base.
1048 */
1049 fep->rx_bd_base = fep->ring_base;
1050 fep->tx_bd_base = fep->rx_bd_base + fpi->rx_ring;
1051
1052 /* initialize ring size variables */
1053 fep->tx_ring = fpi->tx_ring;
1054 fep->rx_ring = fpi->rx_ring;
1055
1056 /*
1057 * The FEC Ethernet specific entries in the device structure.
1058 */
1059 ndev->open = fs_enet_open;
1060 ndev->hard_start_xmit = fs_enet_start_xmit;
1061 ndev->tx_timeout = fs_timeout;
1062 ndev->watchdog_timeo = 2 * HZ;
1063 ndev->stop = fs_enet_close;
1064 ndev->get_stats = fs_enet_get_stats;
1065 ndev->set_multicast_list = fs_set_multicast_list;
1066
1067#ifdef CONFIG_NET_POLL_CONTROLLER
1068 ndev->poll_controller = fs_enet_netpoll;
1069#endif
1070
1071 netif_napi_add(ndev, &fep->napi,
1072 fs_enet_rx_napi, fpi->napi_weight);
1073
1074 ndev->ethtool_ops = &fs_ethtool_ops;
1075 ndev->do_ioctl = fs_ioctl;
1076
1077 init_timer(&fep->phy_timer_list);
1078
1079 netif_carrier_off(ndev);
1080
1081 err = register_netdev(ndev);
1082 if (err != 0) {
1083 printk(KERN_ERR DRV_MODULE_NAME
1084 ": %s register_netdev failed.\n", ndev->name);
1085 goto err;
1086 }
1087 registered = 1;
1088
1089
1090 return ndev;
1091
1092err:
1093 if (ndev != NULL) {
1094 if (registered)
1095 unregister_netdev(ndev);
1096
1097 if (fep && fep->ops) {
1098 (*fep->ops->free_bd)(ndev);
1099 (*fep->ops->cleanup_data)(ndev);
1100 }
1101
1102 free_netdev(ndev);
1103 }
1104
1105 dev_set_drvdata(dev, NULL);
1106
1107 return ERR_PTR(err);
1108}
1109
1110static int fs_cleanup_instance(struct net_device *ndev)
1111{
1112 struct fs_enet_private *fep;
1113 const struct fs_platform_info *fpi;
1114 struct device *dev;
1115
1116 if (ndev == NULL)
1117 return -EINVAL;
1118
1119 fep = netdev_priv(ndev);
1120 if (fep == NULL)
1121 return -EINVAL;
1122
1123 fpi = fep->fpi;
1124
1125 unregister_netdev(ndev);
1126
1127 dma_free_coherent(fep->dev, (fpi->tx_ring + fpi->rx_ring) * sizeof(cbd_t),
1128 (void __force *)fep->ring_base, fep->ring_mem_addr);
1129
1130 /* reset it */
1131 (*fep->ops->cleanup_data)(ndev);
1132
1133 dev = fep->dev;
1134 if (dev != NULL) {
1135 dev_set_drvdata(dev, NULL);
1136 fep->dev = NULL;
1137 }
1138
1139 free_netdev(ndev);
1140
1141 return 0;
1142}
1143#endif
1144
1145/**************************************************************************************/ 950/**************************************************************************************/
1146 951
1147/* handy pointer to the immap */ 952/* handy pointer to the immap */
@@ -1168,7 +973,6 @@ static void cleanup_immap(void)
1168 973
1169/**************************************************************************************/ 974/**************************************************************************************/
1170 975
1171#ifdef CONFIG_PPC_CPM_NEW_BINDING
1172static int __devinit find_phy(struct device_node *np, 976static int __devinit find_phy(struct device_node *np,
1173 struct fs_platform_info *fpi) 977 struct fs_platform_info *fpi)
1174{ 978{
@@ -1408,121 +1212,6 @@ static void __exit fs_cleanup(void)
1408 of_unregister_platform_driver(&fs_enet_driver); 1212 of_unregister_platform_driver(&fs_enet_driver);
1409 cleanup_immap(); 1213 cleanup_immap();
1410} 1214}
1411#else
1412static int __devinit fs_enet_probe(struct device *dev)
1413{
1414 struct net_device *ndev;
1415
1416 /* no fixup - no device */
1417 if (dev->platform_data == NULL) {
1418 printk(KERN_INFO "fs_enet: "
1419 "probe called with no platform data; "
1420 "remove unused devices\n");
1421 return -ENODEV;
1422 }
1423
1424 ndev = fs_init_instance(dev, dev->platform_data);
1425 if (IS_ERR(ndev))
1426 return PTR_ERR(ndev);
1427 return 0;
1428}
1429
1430static int fs_enet_remove(struct device *dev)
1431{
1432 return fs_cleanup_instance(dev_get_drvdata(dev));
1433}
1434
1435static struct device_driver fs_enet_fec_driver = {
1436 .name = "fsl-cpm-fec",
1437 .bus = &platform_bus_type,
1438 .probe = fs_enet_probe,
1439 .remove = fs_enet_remove,
1440#ifdef CONFIG_PM
1441/* .suspend = fs_enet_suspend, TODO */
1442/* .resume = fs_enet_resume, TODO */
1443#endif
1444};
1445
1446static struct device_driver fs_enet_scc_driver = {
1447 .name = "fsl-cpm-scc",
1448 .bus = &platform_bus_type,
1449 .probe = fs_enet_probe,
1450 .remove = fs_enet_remove,
1451#ifdef CONFIG_PM
1452/* .suspend = fs_enet_suspend, TODO */
1453/* .resume = fs_enet_resume, TODO */
1454#endif
1455};
1456
1457static struct device_driver fs_enet_fcc_driver = {
1458 .name = "fsl-cpm-fcc",
1459 .bus = &platform_bus_type,
1460 .probe = fs_enet_probe,
1461 .remove = fs_enet_remove,
1462#ifdef CONFIG_PM
1463/* .suspend = fs_enet_suspend, TODO */
1464/* .resume = fs_enet_resume, TODO */
1465#endif
1466};
1467
1468static int __init fs_init(void)
1469{
1470 int r;
1471
1472 printk(KERN_INFO
1473 "%s", version);
1474
1475 r = setup_immap();
1476 if (r != 0)
1477 return r;
1478
1479#ifdef CONFIG_FS_ENET_HAS_FCC
1480 /* let's insert mii stuff */
1481 r = fs_enet_mdio_bb_init();
1482
1483 if (r != 0) {
1484 printk(KERN_ERR DRV_MODULE_NAME
1485 "BB PHY init failed.\n");
1486 return r;
1487 }
1488 r = driver_register(&fs_enet_fcc_driver);
1489 if (r != 0)
1490 goto err;
1491#endif
1492
1493#ifdef CONFIG_FS_ENET_HAS_FEC
1494 r = fs_enet_mdio_fec_init();
1495 if (r != 0) {
1496 printk(KERN_ERR DRV_MODULE_NAME
1497 "FEC PHY init failed.\n");
1498 return r;
1499 }
1500
1501 r = driver_register(&fs_enet_fec_driver);
1502 if (r != 0)
1503 goto err;
1504#endif
1505
1506#ifdef CONFIG_FS_ENET_HAS_SCC
1507 r = driver_register(&fs_enet_scc_driver);
1508 if (r != 0)
1509 goto err;
1510#endif
1511
1512 return 0;
1513err:
1514 cleanup_immap();
1515 return r;
1516}
1517
1518static void __exit fs_cleanup(void)
1519{
1520 driver_unregister(&fs_enet_fec_driver);
1521 driver_unregister(&fs_enet_fcc_driver);
1522 driver_unregister(&fs_enet_scc_driver);
1523 cleanup_immap();
1524}
1525#endif
1526 1215
1527#ifdef CONFIG_NET_POLL_CONTROLLER 1216#ifdef CONFIG_NET_POLL_CONTROLLER
1528static void fs_enet_netpoll(struct net_device *dev) 1217static void fs_enet_netpoll(struct net_device *dev)
diff --git a/drivers/net/fs_enet/fs_enet.h b/drivers/net/fs_enet/fs_enet.h
index e05389c49bbb..db46d2e72329 100644
--- a/drivers/net/fs_enet/fs_enet.h
+++ b/drivers/net/fs_enet/fs_enet.h
@@ -138,10 +138,6 @@ struct fs_enet_private {
138}; 138};
139 139
140/***************************************************************************/ 140/***************************************************************************/
141#ifndef CONFIG_PPC_CPM_NEW_BINDING
142int fs_enet_mdio_bb_init(void);
143int fs_enet_mdio_fec_init(void);
144#endif
145 141
146void fs_init_bds(struct net_device *dev); 142void fs_init_bds(struct net_device *dev);
147void fs_cleanup_bds(struct net_device *dev); 143void fs_cleanup_bds(struct net_device *dev);
diff --git a/drivers/net/fs_enet/mac-fcc.c b/drivers/net/fs_enet/mac-fcc.c
index 8268b3535b30..0a97fc2d97ec 100644
--- a/drivers/net/fs_enet/mac-fcc.c
+++ b/drivers/net/fs_enet/mac-fcc.c
@@ -33,6 +33,7 @@
33#include <linux/fs.h> 33#include <linux/fs.h>
34#include <linux/platform_device.h> 34#include <linux/platform_device.h>
35#include <linux/phy.h> 35#include <linux/phy.h>
36#include <linux/of_device.h>
36 37
37#include <asm/immap_cpm2.h> 38#include <asm/immap_cpm2.h>
38#include <asm/mpc8260.h> 39#include <asm/mpc8260.h>
@@ -42,10 +43,6 @@
42#include <asm/irq.h> 43#include <asm/irq.h>
43#include <asm/uaccess.h> 44#include <asm/uaccess.h>
44 45
45#ifdef CONFIG_PPC_CPM_NEW_BINDING
46#include <asm/of_device.h>
47#endif
48
49#include "fs_enet.h" 46#include "fs_enet.h"
50 47
51/*************************************************/ 48/*************************************************/
@@ -87,7 +84,6 @@ static inline int fcc_cr_cmd(struct fs_enet_private *fep, u32 op)
87 84
88static int do_pd_setup(struct fs_enet_private *fep) 85static int do_pd_setup(struct fs_enet_private *fep)
89{ 86{
90#ifdef CONFIG_PPC_CPM_NEW_BINDING
91 struct of_device *ofdev = to_of_device(fep->dev); 87 struct of_device *ofdev = to_of_device(fep->dev);
92 struct fs_platform_info *fpi = fep->fpi; 88 struct fs_platform_info *fpi = fep->fpi;
93 int ret = -EINVAL; 89 int ret = -EINVAL;
@@ -125,44 +121,6 @@ out_fccp:
125 iounmap(fep->fcc.fccp); 121 iounmap(fep->fcc.fccp);
126out: 122out:
127 return ret; 123 return ret;
128#else
129 struct platform_device *pdev = to_platform_device(fep->dev);
130 struct resource *r;
131
132 /* Fill out IRQ field */
133 fep->interrupt = platform_get_irq(pdev, 0);
134 if (fep->interrupt < 0)
135 return -EINVAL;
136
137 /* Attach the memory for the FCC Parameter RAM */
138 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_pram");
139 fep->fcc.ep = ioremap(r->start, r->end - r->start + 1);
140 if (fep->fcc.ep == NULL)
141 return -EINVAL;
142
143 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_regs");
144 fep->fcc.fccp = ioremap(r->start, r->end - r->start + 1);
145 if (fep->fcc.fccp == NULL)
146 return -EINVAL;
147
148 if (fep->fpi->fcc_regs_c) {
149 fep->fcc.fcccp = (void __iomem *)fep->fpi->fcc_regs_c;
150 } else {
151 r = platform_get_resource_byname(pdev, IORESOURCE_MEM,
152 "fcc_regs_c");
153 fep->fcc.fcccp = ioremap(r->start,
154 r->end - r->start + 1);
155 }
156
157 if (fep->fcc.fcccp == NULL)
158 return -EINVAL;
159
160 fep->fcc.mem = (void __iomem *)fep->fpi->mem_offset;
161 if (fep->fcc.mem == NULL)
162 return -EINVAL;
163
164 return 0;
165#endif
166} 124}
167 125
168#define FCC_NAPI_RX_EVENT_MSK (FCC_ENET_RXF | FCC_ENET_RXB) 126#define FCC_NAPI_RX_EVENT_MSK (FCC_ENET_RXF | FCC_ENET_RXB)
@@ -173,17 +131,6 @@ out:
173static int setup_data(struct net_device *dev) 131static int setup_data(struct net_device *dev)
174{ 132{
175 struct fs_enet_private *fep = netdev_priv(dev); 133 struct fs_enet_private *fep = netdev_priv(dev);
176#ifndef CONFIG_PPC_CPM_NEW_BINDING
177 struct fs_platform_info *fpi = fep->fpi;
178
179 fpi->cp_command = (fpi->cp_page << 26) |
180 (fpi->cp_block << 21) |
181 (12 << 6);
182
183 fep->fcc.idx = fs_get_fcc_index(fpi->fs_no);
184 if ((unsigned int)fep->fcc.idx >= 3) /* max 3 FCCs */
185 return -EINVAL;
186#endif
187 134
188 if (do_pd_setup(fep) != 0) 135 if (do_pd_setup(fep) != 0)
189 return -EINVAL; 136 return -EINVAL;
@@ -304,9 +251,6 @@ static void restart(struct net_device *dev)
304 fcc_enet_t __iomem *ep = fep->fcc.ep; 251 fcc_enet_t __iomem *ep = fep->fcc.ep;
305 dma_addr_t rx_bd_base_phys, tx_bd_base_phys; 252 dma_addr_t rx_bd_base_phys, tx_bd_base_phys;
306 u16 paddrh, paddrm, paddrl; 253 u16 paddrh, paddrm, paddrl;
307#ifndef CONFIG_PPC_CPM_NEW_BINDING
308 u16 mem_addr;
309#endif
310 const unsigned char *mac; 254 const unsigned char *mac;
311 int i; 255 int i;
312 256
@@ -338,19 +282,10 @@ static void restart(struct net_device *dev)
338 * this area. 282 * this area.
339 */ 283 */
340 284
341#ifdef CONFIG_PPC_CPM_NEW_BINDING
342 W16(ep, fen_genfcc.fcc_riptr, fpi->dpram_offset); 285 W16(ep, fen_genfcc.fcc_riptr, fpi->dpram_offset);
343 W16(ep, fen_genfcc.fcc_tiptr, fpi->dpram_offset + 32); 286 W16(ep, fen_genfcc.fcc_tiptr, fpi->dpram_offset + 32);
344 287
345 W16(ep, fen_padptr, fpi->dpram_offset + 64); 288 W16(ep, fen_padptr, fpi->dpram_offset + 64);
346#else
347 mem_addr = (u32) fep->fcc.mem; /* de-fixup dpram offset */
348
349 W16(ep, fen_genfcc.fcc_riptr, (mem_addr & 0xffff));
350 W16(ep, fen_genfcc.fcc_tiptr, ((mem_addr + 32) & 0xffff));
351
352 W16(ep, fen_padptr, mem_addr + 64);
353#endif
354 289
355 /* fill with special symbol... */ 290 /* fill with special symbol... */
356 memset_io(fep->fcc.mem + fpi->dpram_offset + 64, 0x88, 32); 291 memset_io(fep->fcc.mem + fpi->dpram_offset + 64, 0x88, 32);
diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c
index 8a311d1e435b..0a7d1c5c6524 100644
--- a/drivers/net/fs_enet/mac-fec.c
+++ b/drivers/net/fs_enet/mac-fec.c
@@ -32,6 +32,7 @@
32#include <linux/bitops.h> 32#include <linux/bitops.h>
33#include <linux/fs.h> 33#include <linux/fs.h>
34#include <linux/platform_device.h> 34#include <linux/platform_device.h>
35#include <linux/of_device.h>
35 36
36#include <asm/irq.h> 37#include <asm/irq.h>
37#include <asm/uaccess.h> 38#include <asm/uaccess.h>
@@ -43,10 +44,6 @@
43#include <asm/cpm1.h> 44#include <asm/cpm1.h>
44#endif 45#endif
45 46
46#ifdef CONFIG_PPC_CPM_NEW_BINDING
47#include <asm/of_device.h>
48#endif
49
50#include "fs_enet.h" 47#include "fs_enet.h"
51#include "fec.h" 48#include "fec.h"
52 49
@@ -99,7 +96,6 @@ static int whack_reset(fec_t __iomem *fecp)
99 96
100static int do_pd_setup(struct fs_enet_private *fep) 97static int do_pd_setup(struct fs_enet_private *fep)
101{ 98{
102#ifdef CONFIG_PPC_CPM_NEW_BINDING
103 struct of_device *ofdev = to_of_device(fep->dev); 99 struct of_device *ofdev = to_of_device(fep->dev);
104 100
105 fep->interrupt = of_irq_to_resource(ofdev->node, 0, NULL); 101 fep->interrupt = of_irq_to_resource(ofdev->node, 0, NULL);
@@ -111,23 +107,6 @@ static int do_pd_setup(struct fs_enet_private *fep)
111 return -EINVAL; 107 return -EINVAL;
112 108
113 return 0; 109 return 0;
114#else
115 struct platform_device *pdev = to_platform_device(fep->dev);
116 struct resource *r;
117
118 /* Fill out IRQ field */
119 fep->interrupt = platform_get_irq_byname(pdev,"interrupt");
120 if (fep->interrupt < 0)
121 return -EINVAL;
122
123 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
124 fep->fec.fecp = ioremap(r->start, r->end - r->start + 1);
125
126 if(fep->fec.fecp == NULL)
127 return -EINVAL;
128
129 return 0;
130#endif
131} 110}
132 111
133#define FEC_NAPI_RX_EVENT_MSK (FEC_ENET_RXF | FEC_ENET_RXB) 112#define FEC_NAPI_RX_EVENT_MSK (FEC_ENET_RXF | FEC_ENET_RXB)
diff --git a/drivers/net/fs_enet/mac-scc.c b/drivers/net/fs_enet/mac-scc.c
index e3557eca7b6d..029b3c7ef29c 100644
--- a/drivers/net/fs_enet/mac-scc.c
+++ b/drivers/net/fs_enet/mac-scc.c
@@ -32,6 +32,7 @@
32#include <linux/bitops.h> 32#include <linux/bitops.h>
33#include <linux/fs.h> 33#include <linux/fs.h>
34#include <linux/platform_device.h> 34#include <linux/platform_device.h>
35#include <linux/of_platform.h>
35 36
36#include <asm/irq.h> 37#include <asm/irq.h>
37#include <asm/uaccess.h> 38#include <asm/uaccess.h>
@@ -43,10 +44,6 @@
43#include <asm/cpm1.h> 44#include <asm/cpm1.h>
44#endif 45#endif
45 46
46#ifdef CONFIG_PPC_CPM_NEW_BINDING
47#include <linux/of_platform.h>
48#endif
49
50#include "fs_enet.h" 47#include "fs_enet.h"
51 48
52/*************************************************/ 49/*************************************************/
@@ -99,7 +96,6 @@ static inline int scc_cr_cmd(struct fs_enet_private *fep, u32 op)
99 96
100static int do_pd_setup(struct fs_enet_private *fep) 97static int do_pd_setup(struct fs_enet_private *fep)
101{ 98{
102#ifdef CONFIG_PPC_CPM_NEW_BINDING
103 struct of_device *ofdev = to_of_device(fep->dev); 99 struct of_device *ofdev = to_of_device(fep->dev);
104 100
105 fep->interrupt = of_irq_to_resource(ofdev->node, 0, NULL); 101 fep->interrupt = of_irq_to_resource(ofdev->node, 0, NULL);
@@ -115,27 +111,6 @@ static int do_pd_setup(struct fs_enet_private *fep)
115 iounmap(fep->scc.sccp); 111 iounmap(fep->scc.sccp);
116 return -EINVAL; 112 return -EINVAL;
117 } 113 }
118#else
119 struct platform_device *pdev = to_platform_device(fep->dev);
120 struct resource *r;
121
122 /* Fill out IRQ field */
123 fep->interrupt = platform_get_irq_byname(pdev, "interrupt");
124 if (fep->interrupt < 0)
125 return -EINVAL;
126
127 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
128 fep->scc.sccp = ioremap(r->start, r->end - r->start + 1);
129
130 if (fep->scc.sccp == NULL)
131 return -EINVAL;
132
133 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pram");
134 fep->scc.ep = ioremap(r->start, r->end - r->start + 1);
135
136 if (fep->scc.ep == NULL)
137 return -EINVAL;
138#endif
139 114
140 return 0; 115 return 0;
141} 116}
@@ -149,16 +124,6 @@ static int setup_data(struct net_device *dev)
149{ 124{
150 struct fs_enet_private *fep = netdev_priv(dev); 125 struct fs_enet_private *fep = netdev_priv(dev);
151 126
152#ifndef CONFIG_PPC_CPM_NEW_BINDING
153 struct fs_platform_info *fpi = fep->fpi;
154
155 fep->scc.idx = fs_get_scc_index(fpi->fs_no);
156 if ((unsigned int)fep->fcc.idx >= 4) /* max 4 SCCs */
157 return -EINVAL;
158
159 fpi->cp_command = fep->fcc.idx << 6;
160#endif
161
162 do_pd_setup(fep); 127 do_pd_setup(fep);
163 128
164 fep->scc.hthi = 0; 129 fep->scc.hthi = 0;
diff --git a/drivers/net/fs_enet/mii-bitbang.c b/drivers/net/fs_enet/mii-bitbang.c
index 1620030cd33c..be4b72f4f49a 100644
--- a/drivers/net/fs_enet/mii-bitbang.c
+++ b/drivers/net/fs_enet/mii-bitbang.c
@@ -22,10 +22,7 @@
22#include <linux/mii.h> 22#include <linux/mii.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24#include <linux/mdio-bitbang.h> 24#include <linux/mdio-bitbang.h>
25
26#ifdef CONFIG_PPC_CPM_NEW_BINDING
27#include <linux/of_platform.h> 25#include <linux/of_platform.h>
28#endif
29 26
30#include "fs_enet.h" 27#include "fs_enet.h"
31 28
@@ -110,7 +107,6 @@ static struct mdiobb_ops bb_ops = {
110 .get_mdio_data = mdio_read, 107 .get_mdio_data = mdio_read,
111}; 108};
112 109
113#ifdef CONFIG_PPC_CPM_NEW_BINDING
114static int __devinit fs_mii_bitbang_init(struct mii_bus *bus, 110static int __devinit fs_mii_bitbang_init(struct mii_bus *bus,
115 struct device_node *np) 111 struct device_node *np)
116{ 112{
@@ -271,106 +267,3 @@ static void fs_enet_mdio_bb_exit(void)
271 267
272module_init(fs_enet_mdio_bb_init); 268module_init(fs_enet_mdio_bb_init);
273module_exit(fs_enet_mdio_bb_exit); 269module_exit(fs_enet_mdio_bb_exit);
274#else
275static int __devinit fs_mii_bitbang_init(struct bb_info *bitbang,
276 struct fs_mii_bb_platform_info *fmpi)
277{
278 bitbang->dir = (u32 __iomem *)fmpi->mdio_dir.offset;
279 bitbang->dat = (u32 __iomem *)fmpi->mdio_dat.offset;
280 bitbang->mdio_msk = 1U << (31 - fmpi->mdio_dat.bit);
281 bitbang->mdc_msk = 1U << (31 - fmpi->mdc_dat.bit);
282
283 return 0;
284}
285
286static int __devinit fs_enet_mdio_probe(struct device *dev)
287{
288 struct platform_device *pdev = to_platform_device(dev);
289 struct fs_mii_bb_platform_info *pdata;
290 struct mii_bus *new_bus;
291 struct bb_info *bitbang;
292 int err = 0;
293
294 if (NULL == dev)
295 return -EINVAL;
296
297 bitbang = kzalloc(sizeof(struct bb_info), GFP_KERNEL);
298
299 if (NULL == bitbang)
300 return -ENOMEM;
301
302 bitbang->ctrl.ops = &bb_ops;
303
304 new_bus = alloc_mdio_bitbang(&bitbang->ctrl);
305
306 if (NULL == new_bus)
307 return -ENOMEM;
308
309 new_bus->name = "BB MII Bus",
310 snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", pdev->id);
311
312 new_bus->phy_mask = ~0x9;
313 pdata = (struct fs_mii_bb_platform_info *)pdev->dev.platform_data;
314
315 if (NULL == pdata) {
316 printk(KERN_ERR "gfar mdio %d: Missing platform data!\n", pdev->id);
317 return -ENODEV;
318 }
319
320 /*set up workspace*/
321 fs_mii_bitbang_init(bitbang, pdata);
322
323 new_bus->priv = bitbang;
324
325 new_bus->irq = pdata->irq;
326
327 new_bus->dev = dev;
328 dev_set_drvdata(dev, new_bus);
329
330 err = mdiobus_register(new_bus);
331
332 if (0 != err) {
333 printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
334 new_bus->name);
335 goto bus_register_fail;
336 }
337
338 return 0;
339
340bus_register_fail:
341 free_mdio_bitbang(new_bus);
342 kfree(bitbang);
343
344 return err;
345}
346
347static int fs_enet_mdio_remove(struct device *dev)
348{
349 struct mii_bus *bus = dev_get_drvdata(dev);
350
351 mdiobus_unregister(bus);
352
353 dev_set_drvdata(dev, NULL);
354
355 free_mdio_bitbang(bus);
356
357 return 0;
358}
359
360static struct device_driver fs_enet_bb_mdio_driver = {
361 .name = "fsl-bb-mdio",
362 .bus = &platform_bus_type,
363 .probe = fs_enet_mdio_probe,
364 .remove = fs_enet_mdio_remove,
365};
366
367int fs_enet_mdio_bb_init(void)
368{
369 return driver_register(&fs_enet_bb_mdio_driver);
370}
371
372void fs_enet_mdio_bb_exit(void)
373{
374 driver_unregister(&fs_enet_bb_mdio_driver);
375}
376#endif
diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.c
index 8f6a43b0e0ff..695f74cc4398 100644
--- a/drivers/net/fs_enet/mii-fec.c
+++ b/drivers/net/fs_enet/mii-fec.c
@@ -31,15 +31,12 @@
31#include <linux/ethtool.h> 31#include <linux/ethtool.h>
32#include <linux/bitops.h> 32#include <linux/bitops.h>
33#include <linux/platform_device.h> 33#include <linux/platform_device.h>
34#include <linux/of_platform.h>
34 35
35#include <asm/pgtable.h> 36#include <asm/pgtable.h>
36#include <asm/irq.h> 37#include <asm/irq.h>
37#include <asm/uaccess.h> 38#include <asm/uaccess.h>
38 39
39#ifdef CONFIG_PPC_CPM_NEW_BINDING
40#include <linux/of_platform.h>
41#endif
42
43#include "fs_enet.h" 40#include "fs_enet.h"
44#include "fec.h" 41#include "fec.h"
45 42
@@ -51,52 +48,6 @@
51 48
52#define FEC_MII_LOOPS 10000 49#define FEC_MII_LOOPS 10000
53 50
54#ifndef CONFIG_PPC_CPM_NEW_BINDING
55static int match_has_phy (struct device *dev, void* data)
56{
57 struct platform_device* pdev = container_of(dev, struct platform_device, dev);
58 struct fs_platform_info* fpi;
59 if(strcmp(pdev->name, (char*)data))
60 {
61 return 0;
62 }
63
64 fpi = pdev->dev.platform_data;
65 if((fpi)&&(fpi->has_phy))
66 return 1;
67 return 0;
68}
69
70static int fs_mii_fec_init(struct fec_info* fec, struct fs_mii_fec_platform_info *fmpi)
71{
72 struct resource *r;
73 fec_t __iomem *fecp;
74 char* name = "fsl-cpm-fec";
75
76 /* we need fec in order to be useful */
77 struct platform_device *fec_pdev =
78 container_of(bus_find_device(&platform_bus_type, NULL, name, match_has_phy),
79 struct platform_device, dev);
80
81 if(fec_pdev == NULL) {
82 printk(KERN_ERR"Unable to find PHY for %s", name);
83 return -ENODEV;
84 }
85
86 r = platform_get_resource_byname(fec_pdev, IORESOURCE_MEM, "regs");
87
88 fec->fecp = fecp = ioremap(r->start,sizeof(fec_t));
89 fec->mii_speed = fmpi->mii_speed;
90
91 setbits32(&fecp->fec_r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */
92 setbits32(&fecp->fec_ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN);
93 out_be32(&fecp->fec_ievent, FEC_ENET_MII);
94 out_be32(&fecp->fec_mii_speed, fec->mii_speed);
95
96 return 0;
97}
98#endif
99
100static int fs_enet_fec_mii_read(struct mii_bus *bus , int phy_id, int location) 51static int fs_enet_fec_mii_read(struct mii_bus *bus , int phy_id, int location)
101{ 52{
102 struct fec_info* fec = bus->priv; 53 struct fec_info* fec = bus->priv;
@@ -151,7 +102,6 @@ static int fs_enet_fec_mii_reset(struct mii_bus *bus)
151 return 0; 102 return 0;
152} 103}
153 104
154#ifdef CONFIG_PPC_CPM_NEW_BINDING
155static void __devinit add_phy(struct mii_bus *bus, struct device_node *np) 105static void __devinit add_phy(struct mii_bus *bus, struct device_node *np)
156{ 106{
157 const u32 *data; 107 const u32 *data;
@@ -286,95 +236,3 @@ static void fs_enet_mdio_fec_exit(void)
286 236
287module_init(fs_enet_mdio_fec_init); 237module_init(fs_enet_mdio_fec_init);
288module_exit(fs_enet_mdio_fec_exit); 238module_exit(fs_enet_mdio_fec_exit);
289#else
290static int __devinit fs_enet_fec_mdio_probe(struct device *dev)
291{
292 struct platform_device *pdev = to_platform_device(dev);
293 struct fs_mii_fec_platform_info *pdata;
294 struct mii_bus *new_bus;
295 struct fec_info *fec;
296 int err = 0;
297 if (NULL == dev)
298 return -EINVAL;
299 new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
300
301 if (NULL == new_bus)
302 return -ENOMEM;
303
304 fec = kzalloc(sizeof(struct fec_info), GFP_KERNEL);
305
306 if (NULL == fec)
307 return -ENOMEM;
308
309 new_bus->name = "FEC MII Bus",
310 new_bus->read = &fs_enet_fec_mii_read,
311 new_bus->write = &fs_enet_fec_mii_write,
312 new_bus->reset = &fs_enet_fec_mii_reset,
313 snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", pdev->id);
314
315 pdata = (struct fs_mii_fec_platform_info *)pdev->dev.platform_data;
316
317 if (NULL == pdata) {
318 printk(KERN_ERR "fs_enet FEC mdio %d: Missing platform data!\n", pdev->id);
319 return -ENODEV;
320 }
321
322 /*set up workspace*/
323
324 fs_mii_fec_init(fec, pdata);
325 new_bus->priv = fec;
326
327 new_bus->irq = pdata->irq;
328
329 new_bus->dev = dev;
330 dev_set_drvdata(dev, new_bus);
331
332 err = mdiobus_register(new_bus);
333
334 if (0 != err) {
335 printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
336 new_bus->name);
337 goto bus_register_fail;
338 }
339
340 return 0;
341
342bus_register_fail:
343 kfree(new_bus);
344
345 return err;
346}
347
348
349static int fs_enet_fec_mdio_remove(struct device *dev)
350{
351 struct mii_bus *bus = dev_get_drvdata(dev);
352
353 mdiobus_unregister(bus);
354
355 dev_set_drvdata(dev, NULL);
356 kfree(bus->priv);
357
358 bus->priv = NULL;
359 kfree(bus);
360
361 return 0;
362}
363
364static struct device_driver fs_enet_fec_mdio_driver = {
365 .name = "fsl-cpm-fec-mdio",
366 .bus = &platform_bus_type,
367 .probe = fs_enet_fec_mdio_probe,
368 .remove = fs_enet_fec_mdio_remove,
369};
370
371int fs_enet_mdio_fec_init(void)
372{
373 return driver_register(&fs_enet_fec_mdio_driver);
374}
375
376void fs_enet_mdio_fec_exit(void)
377{
378 driver_unregister(&fs_enet_fec_mdio_driver);
379}
380#endif
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
index 45a63172852f..b8394cf134e8 100644
--- a/drivers/net/gianfar.c
+++ b/drivers/net/gianfar.c
@@ -134,6 +134,9 @@ static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int l
134static void gfar_vlan_rx_register(struct net_device *netdev, 134static void gfar_vlan_rx_register(struct net_device *netdev,
135 struct vlan_group *grp); 135 struct vlan_group *grp);
136void gfar_halt(struct net_device *dev); 136void gfar_halt(struct net_device *dev);
137#ifdef CONFIG_PM
138static void gfar_halt_nodisable(struct net_device *dev);
139#endif
137void gfar_start(struct net_device *dev); 140void gfar_start(struct net_device *dev);
138static void gfar_clear_exact_match(struct net_device *dev); 141static void gfar_clear_exact_match(struct net_device *dev);
139static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr); 142static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr);
@@ -207,6 +210,7 @@ static int gfar_probe(struct platform_device *pdev)
207 210
208 spin_lock_init(&priv->txlock); 211 spin_lock_init(&priv->txlock);
209 spin_lock_init(&priv->rxlock); 212 spin_lock_init(&priv->rxlock);
213 spin_lock_init(&priv->bflock);
210 214
211 platform_set_drvdata(pdev, dev); 215 platform_set_drvdata(pdev, dev);
212 216
@@ -378,6 +382,103 @@ static int gfar_remove(struct platform_device *pdev)
378 return 0; 382 return 0;
379} 383}
380 384
385#ifdef CONFIG_PM
386static int gfar_suspend(struct platform_device *pdev, pm_message_t state)
387{
388 struct net_device *dev = platform_get_drvdata(pdev);
389 struct gfar_private *priv = netdev_priv(dev);
390 unsigned long flags;
391 u32 tempval;
392
393 int magic_packet = priv->wol_en &&
394 (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
395
396 netif_device_detach(dev);
397
398 if (netif_running(dev)) {
399 spin_lock_irqsave(&priv->txlock, flags);
400 spin_lock(&priv->rxlock);
401
402 gfar_halt_nodisable(dev);
403
404 /* Disable Tx, and Rx if wake-on-LAN is disabled. */
405 tempval = gfar_read(&priv->regs->maccfg1);
406
407 tempval &= ~MACCFG1_TX_EN;
408
409 if (!magic_packet)
410 tempval &= ~MACCFG1_RX_EN;
411
412 gfar_write(&priv->regs->maccfg1, tempval);
413
414 spin_unlock(&priv->rxlock);
415 spin_unlock_irqrestore(&priv->txlock, flags);
416
417#ifdef CONFIG_GFAR_NAPI
418 napi_disable(&priv->napi);
419#endif
420
421 if (magic_packet) {
422 /* Enable interrupt on Magic Packet */
423 gfar_write(&priv->regs->imask, IMASK_MAG);
424
425 /* Enable Magic Packet mode */
426 tempval = gfar_read(&priv->regs->maccfg2);
427 tempval |= MACCFG2_MPEN;
428 gfar_write(&priv->regs->maccfg2, tempval);
429 } else {
430 phy_stop(priv->phydev);
431 }
432 }
433
434 return 0;
435}
436
437static int gfar_resume(struct platform_device *pdev)
438{
439 struct net_device *dev = platform_get_drvdata(pdev);
440 struct gfar_private *priv = netdev_priv(dev);
441 unsigned long flags;
442 u32 tempval;
443 int magic_packet = priv->wol_en &&
444 (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET);
445
446 if (!netif_running(dev)) {
447 netif_device_attach(dev);
448 return 0;
449 }
450
451 if (!magic_packet && priv->phydev)
452 phy_start(priv->phydev);
453
454 /* Disable Magic Packet mode, in case something
455 * else woke us up.
456 */
457
458 spin_lock_irqsave(&priv->txlock, flags);
459 spin_lock(&priv->rxlock);
460
461 tempval = gfar_read(&priv->regs->maccfg2);
462 tempval &= ~MACCFG2_MPEN;
463 gfar_write(&priv->regs->maccfg2, tempval);
464
465 gfar_start(dev);
466
467 spin_unlock(&priv->rxlock);
468 spin_unlock_irqrestore(&priv->txlock, flags);
469
470 netif_device_attach(dev);
471
472#ifdef CONFIG_GFAR_NAPI
473 napi_enable(&priv->napi);
474#endif
475
476 return 0;
477}
478#else
479#define gfar_suspend NULL
480#define gfar_resume NULL
481#endif
381 482
382/* Reads the controller's registers to determine what interface 483/* Reads the controller's registers to determine what interface
383 * connects it to the PHY. 484 * connects it to the PHY.
@@ -534,8 +635,9 @@ static void init_registers(struct net_device *dev)
534} 635}
535 636
536 637
638#ifdef CONFIG_PM
537/* Halt the receive and transmit queues */ 639/* Halt the receive and transmit queues */
538void gfar_halt(struct net_device *dev) 640static void gfar_halt_nodisable(struct net_device *dev)
539{ 641{
540 struct gfar_private *priv = netdev_priv(dev); 642 struct gfar_private *priv = netdev_priv(dev);
541 struct gfar __iomem *regs = priv->regs; 643 struct gfar __iomem *regs = priv->regs;
@@ -558,6 +660,15 @@ void gfar_halt(struct net_device *dev)
558 (IEVENT_GRSC | IEVENT_GTSC))) 660 (IEVENT_GRSC | IEVENT_GTSC)))
559 cpu_relax(); 661 cpu_relax();
560 } 662 }
663}
664#endif
665
666/* Halt the receive and transmit queues */
667void gfar_halt(struct net_device *dev)
668{
669 struct gfar_private *priv = netdev_priv(dev);
670 struct gfar __iomem *regs = priv->regs;
671 u32 tempval;
561 672
562 /* Disable Rx and Tx */ 673 /* Disable Rx and Tx */
563 tempval = gfar_read(&regs->maccfg1); 674 tempval = gfar_read(&regs->maccfg1);
@@ -1725,7 +1836,6 @@ static void adjust_link(struct net_device *dev)
1725 if (!priv->oldlink) { 1836 if (!priv->oldlink) {
1726 new_state = 1; 1837 new_state = 1;
1727 priv->oldlink = 1; 1838 priv->oldlink = 1;
1728 netif_tx_schedule_all(dev);
1729 } 1839 }
1730 } else if (priv->oldlink) { 1840 } else if (priv->oldlink) {
1731 new_state = 1; 1841 new_state = 1;
@@ -1910,7 +2020,12 @@ static irqreturn_t gfar_error(int irq, void *dev_id)
1910 u32 events = gfar_read(&priv->regs->ievent); 2020 u32 events = gfar_read(&priv->regs->ievent);
1911 2021
1912 /* Clear IEVENT */ 2022 /* Clear IEVENT */
1913 gfar_write(&priv->regs->ievent, IEVENT_ERR_MASK); 2023 gfar_write(&priv->regs->ievent, events & IEVENT_ERR_MASK);
2024
2025 /* Magic Packet is not an error. */
2026 if ((priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET) &&
2027 (events & IEVENT_MAG))
2028 events &= ~IEVENT_MAG;
1914 2029
1915 /* Hmm... */ 2030 /* Hmm... */
1916 if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv)) 2031 if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv))
@@ -1978,6 +2093,8 @@ MODULE_ALIAS("platform:fsl-gianfar");
1978static struct platform_driver gfar_driver = { 2093static struct platform_driver gfar_driver = {
1979 .probe = gfar_probe, 2094 .probe = gfar_probe,
1980 .remove = gfar_remove, 2095 .remove = gfar_remove,
2096 .suspend = gfar_suspend,
2097 .resume = gfar_resume,
1981 .driver = { 2098 .driver = {
1982 .name = "fsl-gianfar", 2099 .name = "fsl-gianfar",
1983 .owner = THIS_MODULE, 2100 .owner = THIS_MODULE,
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h
index bead71cb2b16..d59df98bd636 100644
--- a/drivers/net/gianfar.h
+++ b/drivers/net/gianfar.h
@@ -157,6 +157,7 @@ extern const char gfar_driver_version[];
157#define MACCFG2_GMII 0x00000200 157#define MACCFG2_GMII 0x00000200
158#define MACCFG2_HUGEFRAME 0x00000020 158#define MACCFG2_HUGEFRAME 0x00000020
159#define MACCFG2_LENGTHCHECK 0x00000010 159#define MACCFG2_LENGTHCHECK 0x00000010
160#define MACCFG2_MPEN 0x00000008
160 161
161#define ECNTRL_INIT_SETTINGS 0x00001000 162#define ECNTRL_INIT_SETTINGS 0x00001000
162#define ECNTRL_TBI_MODE 0x00000020 163#define ECNTRL_TBI_MODE 0x00000020
@@ -229,6 +230,7 @@ extern const char gfar_driver_version[];
229#define IEVENT_CRL 0x00020000 230#define IEVENT_CRL 0x00020000
230#define IEVENT_XFUN 0x00010000 231#define IEVENT_XFUN 0x00010000
231#define IEVENT_RXB0 0x00008000 232#define IEVENT_RXB0 0x00008000
233#define IEVENT_MAG 0x00000800
232#define IEVENT_GRSC 0x00000100 234#define IEVENT_GRSC 0x00000100
233#define IEVENT_RXF0 0x00000080 235#define IEVENT_RXF0 0x00000080
234#define IEVENT_FIR 0x00000008 236#define IEVENT_FIR 0x00000008
@@ -241,7 +243,8 @@ extern const char gfar_driver_version[];
241#define IEVENT_ERR_MASK \ 243#define IEVENT_ERR_MASK \
242(IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \ 244(IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \
243 IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \ 245 IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \
244 | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR) 246 | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \
247 | IEVENT_MAG)
245 248
246#define IMASK_INIT_CLEAR 0x00000000 249#define IMASK_INIT_CLEAR 0x00000000
247#define IMASK_BABR 0x80000000 250#define IMASK_BABR 0x80000000
@@ -259,6 +262,7 @@ extern const char gfar_driver_version[];
259#define IMASK_CRL 0x00020000 262#define IMASK_CRL 0x00020000
260#define IMASK_XFUN 0x00010000 263#define IMASK_XFUN 0x00010000
261#define IMASK_RXB0 0x00008000 264#define IMASK_RXB0 0x00008000
265#define IMASK_MAG 0x00000800
262#define IMASK_GTSC 0x00000100 266#define IMASK_GTSC 0x00000100
263#define IMASK_RXFEN0 0x00000080 267#define IMASK_RXFEN0 0x00000080
264#define IMASK_FIR 0x00000008 268#define IMASK_FIR 0x00000008
@@ -726,10 +730,14 @@ struct gfar_private {
726 unsigned int fifo_starve; 730 unsigned int fifo_starve;
727 unsigned int fifo_starve_off; 731 unsigned int fifo_starve_off;
728 732
733 /* Bitfield update lock */
734 spinlock_t bflock;
735
729 unsigned char vlan_enable:1, 736 unsigned char vlan_enable:1,
730 rx_csum_enable:1, 737 rx_csum_enable:1,
731 extended_hash:1, 738 extended_hash:1,
732 bd_stash_en:1; 739 bd_stash_en:1,
740 wol_en:1; /* Wake-on-LAN enabled */
733 unsigned short padding; 741 unsigned short padding;
734 742
735 unsigned int interruptTransmit; 743 unsigned int interruptTransmit;
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c
index 6007147cc1e9..fb7d3ccc0fdc 100644
--- a/drivers/net/gianfar_ethtool.c
+++ b/drivers/net/gianfar_ethtool.c
@@ -479,14 +479,13 @@ static int gfar_sringparam(struct net_device *dev, struct ethtool_ringparam *rva
479static int gfar_set_rx_csum(struct net_device *dev, uint32_t data) 479static int gfar_set_rx_csum(struct net_device *dev, uint32_t data)
480{ 480{
481 struct gfar_private *priv = netdev_priv(dev); 481 struct gfar_private *priv = netdev_priv(dev);
482 unsigned long flags;
482 int err = 0; 483 int err = 0;
483 484
484 if (!(priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_CSUM)) 485 if (!(priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_CSUM))
485 return -EOPNOTSUPP; 486 return -EOPNOTSUPP;
486 487
487 if (dev->flags & IFF_UP) { 488 if (dev->flags & IFF_UP) {
488 unsigned long flags;
489
490 /* Halt TX and RX, and process the frames which 489 /* Halt TX and RX, and process the frames which
491 * have already been received */ 490 * have already been received */
492 spin_lock_irqsave(&priv->txlock, flags); 491 spin_lock_irqsave(&priv->txlock, flags);
@@ -502,7 +501,9 @@ static int gfar_set_rx_csum(struct net_device *dev, uint32_t data)
502 stop_gfar(dev); 501 stop_gfar(dev);
503 } 502 }
504 503
504 spin_lock_irqsave(&priv->bflock, flags);
505 priv->rx_csum_enable = data; 505 priv->rx_csum_enable = data;
506 spin_unlock_irqrestore(&priv->bflock, flags);
506 507
507 if (dev->flags & IFF_UP) 508 if (dev->flags & IFF_UP)
508 err = startup_gfar(dev); 509 err = startup_gfar(dev);
@@ -564,6 +565,38 @@ static void gfar_set_msglevel(struct net_device *dev, uint32_t data)
564 priv->msg_enable = data; 565 priv->msg_enable = data;
565} 566}
566 567
568#ifdef CONFIG_PM
569static void gfar_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
570{
571 struct gfar_private *priv = netdev_priv(dev);
572
573 if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET) {
574 wol->supported = WAKE_MAGIC;
575 wol->wolopts = priv->wol_en ? WAKE_MAGIC : 0;
576 } else {
577 wol->supported = wol->wolopts = 0;
578 }
579}
580
581static int gfar_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
582{
583 struct gfar_private *priv = netdev_priv(dev);
584 unsigned long flags;
585
586 if (!(priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET) &&
587 wol->wolopts != 0)
588 return -EINVAL;
589
590 if (wol->wolopts & ~WAKE_MAGIC)
591 return -EINVAL;
592
593 spin_lock_irqsave(&priv->bflock, flags);
594 priv->wol_en = wol->wolopts & WAKE_MAGIC ? 1 : 0;
595 spin_unlock_irqrestore(&priv->bflock, flags);
596
597 return 0;
598}
599#endif
567 600
568const struct ethtool_ops gfar_ethtool_ops = { 601const struct ethtool_ops gfar_ethtool_ops = {
569 .get_settings = gfar_gsettings, 602 .get_settings = gfar_gsettings,
@@ -585,4 +618,8 @@ const struct ethtool_ops gfar_ethtool_ops = {
585 .set_tx_csum = gfar_set_tx_csum, 618 .set_tx_csum = gfar_set_tx_csum,
586 .get_msglevel = gfar_get_msglevel, 619 .get_msglevel = gfar_get_msglevel,
587 .set_msglevel = gfar_set_msglevel, 620 .set_msglevel = gfar_set_msglevel,
621#ifdef CONFIG_PM
622 .get_wol = gfar_get_wol,
623 .set_wol = gfar_set_wol,
624#endif
588}; 625};
diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c
index b6500b2aacf2..58f4b1d7bf1f 100644
--- a/drivers/net/hamradio/bpqether.c
+++ b/drivers/net/hamradio/bpqether.c
@@ -123,6 +123,7 @@ static LIST_HEAD(bpq_devices);
123 * off into a separate class since they always nest. 123 * off into a separate class since they always nest.
124 */ 124 */
125static struct lock_class_key bpq_netdev_xmit_lock_key; 125static struct lock_class_key bpq_netdev_xmit_lock_key;
126static struct lock_class_key bpq_netdev_addr_lock_key;
126 127
127static void bpq_set_lockdep_class_one(struct net_device *dev, 128static void bpq_set_lockdep_class_one(struct net_device *dev,
128 struct netdev_queue *txq, 129 struct netdev_queue *txq,
@@ -133,6 +134,7 @@ static void bpq_set_lockdep_class_one(struct net_device *dev,
133 134
134static void bpq_set_lockdep_class(struct net_device *dev) 135static void bpq_set_lockdep_class(struct net_device *dev)
135{ 136{
137 lockdep_set_class(&dev->addr_list_lock, &bpq_netdev_addr_lock_key);
136 netdev_for_each_tx_queue(dev, bpq_set_lockdep_class_one, NULL); 138 netdev_for_each_tx_queue(dev, bpq_set_lockdep_class_one, NULL);
137} 139}
138 140
diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c
index ae9629fa6882..c258a0586e61 100644
--- a/drivers/net/hamradio/hdlcdrv.c
+++ b/drivers/net/hamradio/hdlcdrv.c
@@ -88,6 +88,7 @@
88static inline void append_crc_ccitt(unsigned char *buffer, int len) 88static inline void append_crc_ccitt(unsigned char *buffer, int len)
89{ 89{
90 unsigned int crc = crc_ccitt(0xffff, buffer, len) ^ 0xffff; 90 unsigned int crc = crc_ccitt(0xffff, buffer, len) ^ 0xffff;
91 buffer += len;
91 *buffer++ = crc; 92 *buffer++ = crc;
92 *buffer++ = crc >> 8; 93 *buffer++ = crc >> 8;
93} 94}
diff --git a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c
index c2c4f49d7578..8239939554bc 100644
--- a/drivers/net/hp-plus.c
+++ b/drivers/net/hp-plus.c
@@ -262,7 +262,7 @@ static int __init hpp_probe1(struct net_device *dev, int ioaddr)
262 } 262 }
263 263
264 outw(Perf_Page, ioaddr + HP_PAGING); 264 outw(Perf_Page, ioaddr + HP_PAGING);
265 NS8390_init(dev, 0); 265 NS8390p_init(dev, 0);
266 /* Leave the 8390 and HP chip reset. */ 266 /* Leave the 8390 and HP chip reset. */
267 outw(inw(ioaddr + HPP_OPTION) & ~EnableIRQ, ioaddr + HPP_OPTION); 267 outw(inw(ioaddr + HPP_OPTION) & ~EnableIRQ, ioaddr + HPP_OPTION);
268 268
diff --git a/drivers/net/hp.c b/drivers/net/hp.c
index 8281209ededf..0a8c64930ad3 100644
--- a/drivers/net/hp.c
+++ b/drivers/net/hp.c
@@ -389,7 +389,7 @@ static void __init
389hp_init_card(struct net_device *dev) 389hp_init_card(struct net_device *dev)
390{ 390{
391 int irq = dev->irq; 391 int irq = dev->irq;
392 NS8390_init(dev, 0); 392 NS8390p_init(dev, 0);
393 outb_p(irqmap[irq&0x0f] | HP_RUN, 393 outb_p(irqmap[irq&0x0f] | HP_RUN,
394 dev->base_addr - NIC_OFFSET + HP_CONFIGURE); 394 dev->base_addr - NIC_OFFSET + HP_CONFIGURE);
395 return; 395 return;
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 1b7cb29fe68e..b602c4dd0d14 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -385,7 +385,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)
385 385
386 for (i = 0; i < adapter->num_rx_queues; i++) { 386 for (i = 0; i < adapter->num_rx_queues; i++) {
387 struct igb_ring *rx_ring = &adapter->rx_ring[i]; 387 struct igb_ring *rx_ring = &adapter->rx_ring[i];
388 rx_ring->buddy = 0; 388 rx_ring->buddy = NULL;
389 igb_assign_vector(adapter, i, IGB_N0_QUEUE, vector++); 389 igb_assign_vector(adapter, i, IGB_N0_QUEUE, vector++);
390 adapter->eims_enable_mask |= rx_ring->eims_value; 390 adapter->eims_enable_mask |= rx_ring->eims_value;
391 if (rx_ring->itr_val) 391 if (rx_ring->itr_val)
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index be7b723c924f..e5f3da8468cc 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -70,8 +70,6 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
70 board_82598 }, 70 board_82598 },
71 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT), 71 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT),
72 board_82598 }, 72 board_82598 },
73 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT_DUAL_PORT),
74 board_82598 },
75 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4), 73 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4),
76 board_82598 }, 74 board_82598 },
77 75
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 0496d16f9de5..daba82bbcb56 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -164,9 +164,7 @@ static void macb_handle_link_change(struct net_device *dev)
164 } 164 }
165 165
166 if (phydev->link != bp->link) { 166 if (phydev->link != bp->link) {
167 if (phydev->link) 167 if (!phydev->link) {
168 netif_tx_schedule_all(dev);
169 else {
170 bp->speed = 0; 168 bp->speed = 0;
171 bp->duplex = -1; 169 bp->duplex = -1;
172 } 170 }
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index efbc15567dd3..42394505bb50 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -276,6 +276,7 @@ static int macvlan_change_mtu(struct net_device *dev, int new_mtu)
276 * separate class since they always nest. 276 * separate class since they always nest.
277 */ 277 */
278static struct lock_class_key macvlan_netdev_xmit_lock_key; 278static struct lock_class_key macvlan_netdev_xmit_lock_key;
279static struct lock_class_key macvlan_netdev_addr_lock_key;
279 280
280#define MACVLAN_FEATURES \ 281#define MACVLAN_FEATURES \
281 (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ 282 (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
@@ -295,6 +296,8 @@ static void macvlan_set_lockdep_class_one(struct net_device *dev,
295 296
296static void macvlan_set_lockdep_class(struct net_device *dev) 297static void macvlan_set_lockdep_class(struct net_device *dev)
297{ 298{
299 lockdep_set_class(&dev->addr_list_lock,
300 &macvlan_netdev_addr_lock_key);
298 netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL); 301 netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL);
299} 302}
300 303
diff --git a/drivers/net/meth.c b/drivers/net/meth.c
index 0b32648a2136..4cb364e67dc6 100644
--- a/drivers/net/meth.c
+++ b/drivers/net/meth.c
@@ -287,7 +287,7 @@ int meth_reset(struct net_device *dev)
287 287
288 /* Initial mode: 10 | Half-duplex | Accept normal packets */ 288 /* Initial mode: 10 | Half-duplex | Accept normal packets */
289 priv->mac_ctrl = METH_ACCEPT_MCAST | METH_DEFAULT_IPG; 289 priv->mac_ctrl = METH_ACCEPT_MCAST | METH_DEFAULT_IPG;
290 if (dev->flags | IFF_PROMISC) 290 if (dev->flags & IFF_PROMISC)
291 priv->mac_ctrl |= METH_PROMISC; 291 priv->mac_ctrl |= METH_PROMISC;
292 mace->eth.mac_ctrl = priv->mac_ctrl; 292 mace->eth.mac_ctrl = priv->mac_ctrl;
293 293
diff --git a/drivers/net/mlx4/cmd.c b/drivers/net/mlx4/cmd.c
index 70dff94a8bc6..04d5bc69a6f8 100644
--- a/drivers/net/mlx4/cmd.c
+++ b/drivers/net/mlx4/cmd.c
@@ -67,6 +67,8 @@ enum {
67 CMD_STAT_BAD_INDEX = 0x0a, 67 CMD_STAT_BAD_INDEX = 0x0a,
68 /* FW image corrupted: */ 68 /* FW image corrupted: */
69 CMD_STAT_BAD_NVMEM = 0x0b, 69 CMD_STAT_BAD_NVMEM = 0x0b,
70 /* Error in ICM mapping (e.g. not enough auxiliary ICM pages to execute command): */
71 CMD_STAT_ICM_ERROR = 0x0c,
70 /* Attempt to modify a QP/EE which is not in the presumed state: */ 72 /* Attempt to modify a QP/EE which is not in the presumed state: */
71 CMD_STAT_BAD_QP_STATE = 0x10, 73 CMD_STAT_BAD_QP_STATE = 0x10,
72 /* Bad segment parameters (Address/Size): */ 74 /* Bad segment parameters (Address/Size): */
@@ -119,6 +121,7 @@ static int mlx4_status_to_errno(u8 status)
119 [CMD_STAT_BAD_RES_STATE] = -EBADF, 121 [CMD_STAT_BAD_RES_STATE] = -EBADF,
120 [CMD_STAT_BAD_INDEX] = -EBADF, 122 [CMD_STAT_BAD_INDEX] = -EBADF,
121 [CMD_STAT_BAD_NVMEM] = -EFAULT, 123 [CMD_STAT_BAD_NVMEM] = -EFAULT,
124 [CMD_STAT_ICM_ERROR] = -ENFILE,
122 [CMD_STAT_BAD_QP_STATE] = -EINVAL, 125 [CMD_STAT_BAD_QP_STATE] = -EINVAL,
123 [CMD_STAT_BAD_SEG_PARAM] = -EFAULT, 126 [CMD_STAT_BAD_SEG_PARAM] = -EFAULT,
124 [CMD_STAT_REG_BOUND] = -EBUSY, 127 [CMD_STAT_REG_BOUND] = -EBUSY,
diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c
index e141a1513f07..ea3a09aaa844 100644
--- a/drivers/net/mlx4/eq.c
+++ b/drivers/net/mlx4/eq.c
@@ -33,6 +33,7 @@
33 33
34#include <linux/init.h> 34#include <linux/init.h>
35#include <linux/interrupt.h> 35#include <linux/interrupt.h>
36#include <linux/mm.h>
36#include <linux/dma-mapping.h> 37#include <linux/dma-mapping.h>
37 38
38#include <linux/mlx4/cmd.h> 39#include <linux/mlx4/cmd.h>
diff --git a/drivers/net/mlx4/fw.c b/drivers/net/mlx4/fw.c
index 2b5006b9be67..57278224ba1e 100644
--- a/drivers/net/mlx4/fw.c
+++ b/drivers/net/mlx4/fw.c
@@ -46,6 +46,10 @@ enum {
46extern void __buggy_use_of_MLX4_GET(void); 46extern void __buggy_use_of_MLX4_GET(void);
47extern void __buggy_use_of_MLX4_PUT(void); 47extern void __buggy_use_of_MLX4_PUT(void);
48 48
49static int enable_qos;
50module_param(enable_qos, bool, 0444);
51MODULE_PARM_DESC(enable_qos, "Enable Quality of Service support in the HCA (default: off)");
52
49#define MLX4_GET(dest, source, offset) \ 53#define MLX4_GET(dest, source, offset) \
50 do { \ 54 do { \
51 void *__p = (char *) (source) + (offset); \ 55 void *__p = (char *) (source) + (offset); \
@@ -198,7 +202,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
198#define QUERY_DEV_CAP_C_MPT_ENTRY_SZ_OFFSET 0x8e 202#define QUERY_DEV_CAP_C_MPT_ENTRY_SZ_OFFSET 0x8e
199#define QUERY_DEV_CAP_MTT_ENTRY_SZ_OFFSET 0x90 203#define QUERY_DEV_CAP_MTT_ENTRY_SZ_OFFSET 0x90
200#define QUERY_DEV_CAP_D_MPT_ENTRY_SZ_OFFSET 0x92 204#define QUERY_DEV_CAP_D_MPT_ENTRY_SZ_OFFSET 0x92
201#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x97 205#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x94
202#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98 206#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98
203#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0 207#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0
204 208
@@ -373,12 +377,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
373 } 377 }
374 } 378 }
375 379
376 if (dev_cap->bmme_flags & 1) 380 mlx4_dbg(dev, "Base MM extensions: flags %08x, rsvd L_Key %08x\n",
377 mlx4_dbg(dev, "Base MM extensions: yes " 381 dev_cap->bmme_flags, dev_cap->reserved_lkey);
378 "(flags %d, rsvd L_Key %08x)\n",
379 dev_cap->bmme_flags, dev_cap->reserved_lkey);
380 else
381 mlx4_dbg(dev, "Base MM extensions: no\n");
382 382
383 /* 383 /*
384 * Each UAR has 4 EQ doorbells; so if a UAR is reserved, then 384 * Each UAR has 4 EQ doorbells; so if a UAR is reserved, then
@@ -737,6 +737,10 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
737 if (dev->caps.flags & MLX4_DEV_CAP_FLAG_IPOIB_CSUM) 737 if (dev->caps.flags & MLX4_DEV_CAP_FLAG_IPOIB_CSUM)
738 *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1 << 3); 738 *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1 << 3);
739 739
740 /* Enable QoS support if module parameter set */
741 if (enable_qos)
742 *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1 << 2);
743
740 /* QPC/EEC/CQC/EQC/RDMARC attributes */ 744 /* QPC/EEC/CQC/EQC/RDMARC attributes */
741 745
742 MLX4_PUT(inbox, param->qpc_base, INIT_HCA_QPC_BASE_OFFSET); 746 MLX4_PUT(inbox, param->qpc_base, INIT_HCA_QPC_BASE_OFFSET);
diff --git a/drivers/net/mlx4/fw.h b/drivers/net/mlx4/fw.h
index a0e046c149b7..fbf0e22be122 100644
--- a/drivers/net/mlx4/fw.h
+++ b/drivers/net/mlx4/fw.h
@@ -98,7 +98,7 @@ struct mlx4_dev_cap {
98 int cmpt_entry_sz; 98 int cmpt_entry_sz;
99 int mtt_entry_sz; 99 int mtt_entry_sz;
100 int resize_srq; 100 int resize_srq;
101 u8 bmme_flags; 101 u32 bmme_flags;
102 u32 reserved_lkey; 102 u32 reserved_lkey;
103 u64 max_icm_sz; 103 u64 max_icm_sz;
104 int max_gso_sz; 104 int max_gso_sz;
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c
index d3736013fe9b..8e1d24cda1b0 100644
--- a/drivers/net/mlx4/main.c
+++ b/drivers/net/mlx4/main.c
@@ -158,6 +158,8 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
158 dev->caps.max_msg_sz = dev_cap->max_msg_sz; 158 dev->caps.max_msg_sz = dev_cap->max_msg_sz;
159 dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1); 159 dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1);
160 dev->caps.flags = dev_cap->flags; 160 dev->caps.flags = dev_cap->flags;
161 dev->caps.bmme_flags = dev_cap->bmme_flags;
162 dev->caps.reserved_lkey = dev_cap->reserved_lkey;
161 dev->caps.stat_rate_support = dev_cap->stat_rate_support; 163 dev->caps.stat_rate_support = dev_cap->stat_rate_support;
162 dev->caps.max_gso_sz = dev_cap->max_gso_sz; 164 dev->caps.max_gso_sz = dev_cap->max_gso_sz;
163 165
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index a4023c2dd050..78038499cff5 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -118,6 +118,7 @@ struct mlx4_bitmap {
118 118
119struct mlx4_buddy { 119struct mlx4_buddy {
120 unsigned long **bits; 120 unsigned long **bits;
121 unsigned int *num_free;
121 int max_order; 122 int max_order;
122 spinlock_t lock; 123 spinlock_t lock;
123}; 124};
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c
index 03a9abcce524..a3c04c5f12c2 100644
--- a/drivers/net/mlx4/mr.c
+++ b/drivers/net/mlx4/mr.c
@@ -47,7 +47,7 @@ struct mlx4_mpt_entry {
47 __be32 flags; 47 __be32 flags;
48 __be32 qpn; 48 __be32 qpn;
49 __be32 key; 49 __be32 key;
50 __be32 pd; 50 __be32 pd_flags;
51 __be64 start; 51 __be64 start;
52 __be64 length; 52 __be64 length;
53 __be32 lkey; 53 __be32 lkey;
@@ -61,11 +61,15 @@ struct mlx4_mpt_entry {
61} __attribute__((packed)); 61} __attribute__((packed));
62 62
63#define MLX4_MPT_FLAG_SW_OWNS (0xfUL << 28) 63#define MLX4_MPT_FLAG_SW_OWNS (0xfUL << 28)
64#define MLX4_MPT_FLAG_FREE (0x3UL << 28)
64#define MLX4_MPT_FLAG_MIO (1 << 17) 65#define MLX4_MPT_FLAG_MIO (1 << 17)
65#define MLX4_MPT_FLAG_BIND_ENABLE (1 << 15) 66#define MLX4_MPT_FLAG_BIND_ENABLE (1 << 15)
66#define MLX4_MPT_FLAG_PHYSICAL (1 << 9) 67#define MLX4_MPT_FLAG_PHYSICAL (1 << 9)
67#define MLX4_MPT_FLAG_REGION (1 << 8) 68#define MLX4_MPT_FLAG_REGION (1 << 8)
68 69
70#define MLX4_MPT_PD_FLAG_FAST_REG (1 << 26)
71#define MLX4_MPT_PD_FLAG_EN_INV (3 << 24)
72
69#define MLX4_MTT_FLAG_PRESENT 1 73#define MLX4_MTT_FLAG_PRESENT 1
70 74
71#define MLX4_MPT_STATUS_SW 0xF0 75#define MLX4_MPT_STATUS_SW 0xF0
@@ -79,23 +83,26 @@ static u32 mlx4_buddy_alloc(struct mlx4_buddy *buddy, int order)
79 83
80 spin_lock(&buddy->lock); 84 spin_lock(&buddy->lock);
81 85
82 for (o = order; o <= buddy->max_order; ++o) { 86 for (o = order; o <= buddy->max_order; ++o)
83 m = 1 << (buddy->max_order - o); 87 if (buddy->num_free[o]) {
84 seg = find_first_bit(buddy->bits[o], m); 88 m = 1 << (buddy->max_order - o);
85 if (seg < m) 89 seg = find_first_bit(buddy->bits[o], m);
86 goto found; 90 if (seg < m)
87 } 91 goto found;
92 }
88 93
89 spin_unlock(&buddy->lock); 94 spin_unlock(&buddy->lock);
90 return -1; 95 return -1;
91 96
92 found: 97 found:
93 clear_bit(seg, buddy->bits[o]); 98 clear_bit(seg, buddy->bits[o]);
99 --buddy->num_free[o];
94 100
95 while (o > order) { 101 while (o > order) {
96 --o; 102 --o;
97 seg <<= 1; 103 seg <<= 1;
98 set_bit(seg ^ 1, buddy->bits[o]); 104 set_bit(seg ^ 1, buddy->bits[o]);
105 ++buddy->num_free[o];
99 } 106 }
100 107
101 spin_unlock(&buddy->lock); 108 spin_unlock(&buddy->lock);
@@ -113,11 +120,13 @@ static void mlx4_buddy_free(struct mlx4_buddy *buddy, u32 seg, int order)
113 120
114 while (test_bit(seg ^ 1, buddy->bits[order])) { 121 while (test_bit(seg ^ 1, buddy->bits[order])) {
115 clear_bit(seg ^ 1, buddy->bits[order]); 122 clear_bit(seg ^ 1, buddy->bits[order]);
123 --buddy->num_free[order];
116 seg >>= 1; 124 seg >>= 1;
117 ++order; 125 ++order;
118 } 126 }
119 127
120 set_bit(seg, buddy->bits[order]); 128 set_bit(seg, buddy->bits[order]);
129 ++buddy->num_free[order];
121 130
122 spin_unlock(&buddy->lock); 131 spin_unlock(&buddy->lock);
123} 132}
@@ -131,7 +140,9 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order)
131 140
132 buddy->bits = kzalloc((buddy->max_order + 1) * sizeof (long *), 141 buddy->bits = kzalloc((buddy->max_order + 1) * sizeof (long *),
133 GFP_KERNEL); 142 GFP_KERNEL);
134 if (!buddy->bits) 143 buddy->num_free = kzalloc((buddy->max_order + 1) * sizeof (int *),
144 GFP_KERNEL);
145 if (!buddy->bits || !buddy->num_free)
135 goto err_out; 146 goto err_out;
136 147
137 for (i = 0; i <= buddy->max_order; ++i) { 148 for (i = 0; i <= buddy->max_order; ++i) {
@@ -143,6 +154,7 @@ static int mlx4_buddy_init(struct mlx4_buddy *buddy, int max_order)
143 } 154 }
144 155
145 set_bit(0, buddy->bits[buddy->max_order]); 156 set_bit(0, buddy->bits[buddy->max_order]);
157 buddy->num_free[buddy->max_order] = 1;
146 158
147 return 0; 159 return 0;
148 160
@@ -150,9 +162,10 @@ err_out_free:
150 for (i = 0; i <= buddy->max_order; ++i) 162 for (i = 0; i <= buddy->max_order; ++i)
151 kfree(buddy->bits[i]); 163 kfree(buddy->bits[i]);
152 164
165err_out:
153 kfree(buddy->bits); 166 kfree(buddy->bits);
167 kfree(buddy->num_free);
154 168
155err_out:
156 return -ENOMEM; 169 return -ENOMEM;
157} 170}
158 171
@@ -164,6 +177,7 @@ static void mlx4_buddy_cleanup(struct mlx4_buddy *buddy)
164 kfree(buddy->bits[i]); 177 kfree(buddy->bits[i]);
165 178
166 kfree(buddy->bits); 179 kfree(buddy->bits);
180 kfree(buddy->num_free);
167} 181}
168 182
169static u32 mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order) 183static u32 mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order)
@@ -314,21 +328,30 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr)
314 328
315 memset(mpt_entry, 0, sizeof *mpt_entry); 329 memset(mpt_entry, 0, sizeof *mpt_entry);
316 330
317 mpt_entry->flags = cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS | 331 mpt_entry->flags = cpu_to_be32(MLX4_MPT_FLAG_MIO |
318 MLX4_MPT_FLAG_MIO |
319 MLX4_MPT_FLAG_REGION | 332 MLX4_MPT_FLAG_REGION |
320 mr->access); 333 mr->access);
321 334
322 mpt_entry->key = cpu_to_be32(key_to_hw_index(mr->key)); 335 mpt_entry->key = cpu_to_be32(key_to_hw_index(mr->key));
323 mpt_entry->pd = cpu_to_be32(mr->pd); 336 mpt_entry->pd_flags = cpu_to_be32(mr->pd | MLX4_MPT_PD_FLAG_EN_INV);
324 mpt_entry->start = cpu_to_be64(mr->iova); 337 mpt_entry->start = cpu_to_be64(mr->iova);
325 mpt_entry->length = cpu_to_be64(mr->size); 338 mpt_entry->length = cpu_to_be64(mr->size);
326 mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift); 339 mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift);
340
327 if (mr->mtt.order < 0) { 341 if (mr->mtt.order < 0) {
328 mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_PHYSICAL); 342 mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_PHYSICAL);
329 mpt_entry->mtt_seg = 0; 343 mpt_entry->mtt_seg = 0;
330 } else 344 } else {
331 mpt_entry->mtt_seg = cpu_to_be64(mlx4_mtt_addr(dev, &mr->mtt)); 345 mpt_entry->mtt_seg = cpu_to_be64(mlx4_mtt_addr(dev, &mr->mtt));
346 }
347
348 if (mr->mtt.order >= 0 && mr->mtt.page_shift == 0) {
349 /* fast register MR in free state */
350 mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_FREE);
351 mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG);
352 } else {
353 mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS);
354 }
332 355
333 err = mlx4_SW2HW_MPT(dev, mailbox, 356 err = mlx4_SW2HW_MPT(dev, mailbox,
334 key_to_hw_index(mr->key) & (dev->caps.num_mpts - 1)); 357 key_to_hw_index(mr->key) & (dev->caps.num_mpts - 1));
diff --git a/drivers/net/mlx4/pd.c b/drivers/net/mlx4/pd.c
index 3a93c5f0f7ab..aa616892d09c 100644
--- a/drivers/net/mlx4/pd.c
+++ b/drivers/net/mlx4/pd.c
@@ -91,6 +91,13 @@ EXPORT_SYMBOL_GPL(mlx4_uar_free);
91 91
92int mlx4_init_uar_table(struct mlx4_dev *dev) 92int mlx4_init_uar_table(struct mlx4_dev *dev)
93{ 93{
94 if (dev->caps.num_uars <= 128) {
95 mlx4_err(dev, "Only %d UAR pages (need more than 128)\n",
96 dev->caps.num_uars);
97 mlx4_err(dev, "Increase firmware log2_uar_bar_megabytes?\n");
98 return -ENODEV;
99 }
100
94 return mlx4_bitmap_init(&mlx4_priv(dev)->uar_table.bitmap, 101 return mlx4_bitmap_init(&mlx4_priv(dev)->uar_table.bitmap,
95 dev->caps.num_uars, dev->caps.num_uars - 1, 102 dev->caps.num_uars, dev->caps.num_uars - 1,
96 max(128, dev->caps.reserved_uars)); 103 max(128, dev->caps.reserved_uars));
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index 83a877f3a553..8a97a0066a88 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -2112,7 +2112,7 @@ static void mv643xx_eth_netpoll(struct net_device *dev)
2112 2112
2113 mv643xx_eth_irq(dev->irq, dev); 2113 mv643xx_eth_irq(dev->irq, dev);
2114 2114
2115 wrl(mp, INT_MASK(mp->port_num), INT_TX_END | INT_RX | INT_CAUSE_EXT); 2115 wrl(mp, INT_MASK(mp->port_num), INT_TX_END | INT_RX | INT_EXT);
2116} 2116}
2117#endif 2117#endif
2118 2118
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
index b3981ed972bf..3ab0e5289f7a 100644
--- a/drivers/net/myri10ge/myri10ge.c
+++ b/drivers/net/myri10ge/myri10ge.c
@@ -125,7 +125,6 @@ struct myri10ge_cmd {
125 125
126struct myri10ge_rx_buf { 126struct myri10ge_rx_buf {
127 struct mcp_kreq_ether_recv __iomem *lanai; /* lanai ptr for recv ring */ 127 struct mcp_kreq_ether_recv __iomem *lanai; /* lanai ptr for recv ring */
128 u8 __iomem *wc_fifo; /* w/c rx dma addr fifo address */
129 struct mcp_kreq_ether_recv *shadow; /* host shadow of recv ring */ 128 struct mcp_kreq_ether_recv *shadow; /* host shadow of recv ring */
130 struct myri10ge_rx_buffer_state *info; 129 struct myri10ge_rx_buffer_state *info;
131 struct page *page; 130 struct page *page;
@@ -140,7 +139,6 @@ struct myri10ge_rx_buf {
140 139
141struct myri10ge_tx_buf { 140struct myri10ge_tx_buf {
142 struct mcp_kreq_ether_send __iomem *lanai; /* lanai ptr for sendq */ 141 struct mcp_kreq_ether_send __iomem *lanai; /* lanai ptr for sendq */
143 u8 __iomem *wc_fifo; /* w/c send fifo address */
144 struct mcp_kreq_ether_send *req_list; /* host shadow of sendq */ 142 struct mcp_kreq_ether_send *req_list; /* host shadow of sendq */
145 char *req_bytes; 143 char *req_bytes;
146 struct myri10ge_tx_buffer_state *info; 144 struct myri10ge_tx_buffer_state *info;
@@ -332,10 +330,6 @@ MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed");
332 330
333static int myri10ge_reset_recover = 1; 331static int myri10ge_reset_recover = 1;
334 332
335static int myri10ge_wcfifo = 0;
336module_param(myri10ge_wcfifo, int, S_IRUGO);
337MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled");
338
339static int myri10ge_max_slices = 1; 333static int myri10ge_max_slices = 1;
340module_param(myri10ge_max_slices, int, S_IRUGO); 334module_param(myri10ge_max_slices, int, S_IRUGO);
341MODULE_PARM_DESC(myri10ge_max_slices, "Max tx/rx queues"); 335MODULE_PARM_DESC(myri10ge_max_slices, "Max tx/rx queues");
@@ -1218,14 +1212,8 @@ myri10ge_alloc_rx_pages(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx,
1218 1212
1219 /* copy 8 descriptors to the firmware at a time */ 1213 /* copy 8 descriptors to the firmware at a time */
1220 if ((idx & 7) == 7) { 1214 if ((idx & 7) == 7) {
1221 if (rx->wc_fifo == NULL) 1215 myri10ge_submit_8rx(&rx->lanai[idx - 7],
1222 myri10ge_submit_8rx(&rx->lanai[idx - 7], 1216 &rx->shadow[idx - 7]);
1223 &rx->shadow[idx - 7]);
1224 else {
1225 mb();
1226 myri10ge_pio_copy(rx->wc_fifo,
1227 &rx->shadow[idx - 7], 64);
1228 }
1229 } 1217 }
1230 } 1218 }
1231} 1219}
@@ -2229,18 +2217,6 @@ static int myri10ge_get_txrx(struct myri10ge_priv *mgp, int slice)
2229 ss->rx_big.lanai = (struct mcp_kreq_ether_recv __iomem *) 2217 ss->rx_big.lanai = (struct mcp_kreq_ether_recv __iomem *)
2230 (mgp->sram + cmd.data0); 2218 (mgp->sram + cmd.data0);
2231 2219
2232 if (myri10ge_wcfifo && mgp->wc_enabled) {
2233 ss->tx.wc_fifo = (u8 __iomem *)
2234 mgp->sram + MXGEFW_ETH_SEND_4 + 64 * slice;
2235 ss->rx_small.wc_fifo = (u8 __iomem *)
2236 mgp->sram + MXGEFW_ETH_RECV_SMALL + 64 * slice;
2237 ss->rx_big.wc_fifo = (u8 __iomem *)
2238 mgp->sram + MXGEFW_ETH_RECV_BIG + 64 * slice;
2239 } else {
2240 ss->tx.wc_fifo = NULL;
2241 ss->rx_small.wc_fifo = NULL;
2242 ss->rx_big.wc_fifo = NULL;
2243 }
2244 return status; 2220 return status;
2245 2221
2246} 2222}
@@ -2573,27 +2549,6 @@ myri10ge_submit_req(struct myri10ge_tx_buf *tx, struct mcp_kreq_ether_send *src,
2573 mb(); 2549 mb();
2574} 2550}
2575 2551
2576static inline void
2577myri10ge_submit_req_wc(struct myri10ge_tx_buf *tx,
2578 struct mcp_kreq_ether_send *src, int cnt)
2579{
2580 tx->req += cnt;
2581 mb();
2582 while (cnt >= 4) {
2583 myri10ge_pio_copy(tx->wc_fifo, src, 64);
2584 mb();
2585 src += 4;
2586 cnt -= 4;
2587 }
2588 if (cnt > 0) {
2589 /* pad it to 64 bytes. The src is 64 bytes bigger than it
2590 * needs to be so that we don't overrun it */
2591 myri10ge_pio_copy(tx->wc_fifo + MXGEFW_ETH_SEND_OFFSET(cnt),
2592 src, 64);
2593 mb();
2594 }
2595}
2596
2597/* 2552/*
2598 * Transmit a packet. We need to split the packet so that a single 2553 * Transmit a packet. We need to split the packet so that a single
2599 * segment does not cross myri10ge->tx_boundary, so this makes segment 2554 * segment does not cross myri10ge->tx_boundary, so this makes segment
@@ -2830,10 +2785,7 @@ again:
2830 MXGEFW_FLAGS_FIRST))); 2785 MXGEFW_FLAGS_FIRST)));
2831 idx = ((count - 1) + tx->req) & tx->mask; 2786 idx = ((count - 1) + tx->req) & tx->mask;
2832 tx->info[idx].last = 1; 2787 tx->info[idx].last = 1;
2833 if (tx->wc_fifo == NULL) 2788 myri10ge_submit_req(tx, tx->req_list, count);
2834 myri10ge_submit_req(tx, tx->req_list, count);
2835 else
2836 myri10ge_submit_req_wc(tx, tx->req_list, count);
2837 tx->pkt_start++; 2789 tx->pkt_start++;
2838 if ((avail - count) < MXGEFW_MAX_SEND_DESC) { 2790 if ((avail - count) < MXGEFW_MAX_SEND_DESC) {
2839 tx->stop_queue++; 2791 tx->stop_queue++;
@@ -3768,14 +3720,14 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
3768 if (mgp->sram_size > mgp->board_span) { 3720 if (mgp->sram_size > mgp->board_span) {
3769 dev_err(&pdev->dev, "board span %ld bytes too small\n", 3721 dev_err(&pdev->dev, "board span %ld bytes too small\n",
3770 mgp->board_span); 3722 mgp->board_span);
3771 goto abort_with_wc; 3723 goto abort_with_mtrr;
3772 } 3724 }
3773 mgp->sram = ioremap(mgp->iomem_base, mgp->board_span); 3725 mgp->sram = ioremap_wc(mgp->iomem_base, mgp->board_span);
3774 if (mgp->sram == NULL) { 3726 if (mgp->sram == NULL) {
3775 dev_err(&pdev->dev, "ioremap failed for %ld bytes at 0x%lx\n", 3727 dev_err(&pdev->dev, "ioremap failed for %ld bytes at 0x%lx\n",
3776 mgp->board_span, mgp->iomem_base); 3728 mgp->board_span, mgp->iomem_base);
3777 status = -ENXIO; 3729 status = -ENXIO;
3778 goto abort_with_wc; 3730 goto abort_with_mtrr;
3779 } 3731 }
3780 memcpy_fromio(mgp->eeprom_strings, 3732 memcpy_fromio(mgp->eeprom_strings,
3781 mgp->sram + mgp->sram_size - MYRI10GE_EEPROM_STRINGS_SIZE, 3733 mgp->sram + mgp->sram_size - MYRI10GE_EEPROM_STRINGS_SIZE,
@@ -3876,7 +3828,7 @@ abort_with_firmware:
3876abort_with_ioremap: 3828abort_with_ioremap:
3877 iounmap(mgp->sram); 3829 iounmap(mgp->sram);
3878 3830
3879abort_with_wc: 3831abort_with_mtrr:
3880#ifdef CONFIG_MTRR 3832#ifdef CONFIG_MTRR
3881 if (mgp->mtrr >= 0) 3833 if (mgp->mtrr >= 0)
3882 mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); 3834 mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span);
diff --git a/drivers/net/ne.c b/drivers/net/ne.c
index 14126973bd12..2fec6122c7fa 100644
--- a/drivers/net/ne.c
+++ b/drivers/net/ne.c
@@ -355,7 +355,7 @@ static int __init ne_probe1(struct net_device *dev, unsigned long ioaddr)
355 } 355 }
356 356
357 /* Read the 16 bytes of station address PROM. 357 /* Read the 16 bytes of station address PROM.
358 We must first initialize registers, similar to NS8390_init(eifdev, 0). 358 We must first initialize registers, similar to NS8390p_init(eifdev, 0).
359 We can't reliably read the SAPROM address without this. 359 We can't reliably read the SAPROM address without this.
360 (I learned the hard way!). */ 360 (I learned the hard way!). */
361 { 361 {
diff --git a/drivers/net/ne2.c b/drivers/net/ne2.c
index 8f7256346922..332df75a9ab6 100644
--- a/drivers/net/ne2.c
+++ b/drivers/net/ne2.c
@@ -404,7 +404,7 @@ static int __init ne2_probe1(struct net_device *dev, int slot)
404 404
405 /* Read the 16 bytes of station address PROM. 405 /* Read the 16 bytes of station address PROM.
406 We must first initialize registers, similar to 406 We must first initialize registers, similar to
407 NS8390_init(eifdev, 0). 407 NS8390p_init(eifdev, 0).
408 We can't reliably read the SAPROM address without this. 408 We can't reliably read the SAPROM address without this.
409 (I learned the hard way!). */ 409 (I learned the hard way!). */
410 { 410 {
diff --git a/drivers/net/netxen/Makefile b/drivers/net/netxen/Makefile
index a07cdc6f7384..8e7c4c910d2a 100644
--- a/drivers/net/netxen/Makefile
+++ b/drivers/net/netxen/Makefile
@@ -32,4 +32,4 @@
32obj-$(CONFIG_NETXEN_NIC) := netxen_nic.o 32obj-$(CONFIG_NETXEN_NIC) := netxen_nic.o
33 33
34netxen_nic-y := netxen_nic_hw.o netxen_nic_main.o netxen_nic_init.o \ 34netxen_nic-y := netxen_nic_hw.o netxen_nic_main.o netxen_nic_init.o \
35 netxen_nic_isr.o netxen_nic_ethtool.o netxen_nic_niu.o 35 netxen_nic_ethtool.o netxen_nic_niu.o netxen_nic_ctx.o
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index da4c4fb97064..8e736614407d 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -54,6 +54,7 @@
54 54
55#include <linux/mm.h> 55#include <linux/mm.h>
56#include <linux/mman.h> 56#include <linux/mman.h>
57#include <linux/vmalloc.h>
57 58
58#include <asm/system.h> 59#include <asm/system.h>
59#include <asm/io.h> 60#include <asm/io.h>
@@ -63,10 +64,12 @@
63 64
64#include "netxen_nic_hw.h" 65#include "netxen_nic_hw.h"
65 66
66#define _NETXEN_NIC_LINUX_MAJOR 3 67#define _NETXEN_NIC_LINUX_MAJOR 4
67#define _NETXEN_NIC_LINUX_MINOR 4 68#define _NETXEN_NIC_LINUX_MINOR 0
68#define _NETXEN_NIC_LINUX_SUBVERSION 18 69#define _NETXEN_NIC_LINUX_SUBVERSION 0
69#define NETXEN_NIC_LINUX_VERSIONID "3.4.18" 70#define NETXEN_NIC_LINUX_VERSIONID "4.0.0"
71
72#define NETXEN_VERSION_CODE(a, b, c) (((a) << 16) + ((b) << 8) + (c))
70 73
71#define NETXEN_NUM_FLASH_SECTORS (64) 74#define NETXEN_NUM_FLASH_SECTORS (64)
72#define NETXEN_FLASH_SECTOR_SIZE (64 * 1024) 75#define NETXEN_FLASH_SECTOR_SIZE (64 * 1024)
@@ -84,7 +87,7 @@
84#define TX_RINGSIZE \ 87#define TX_RINGSIZE \
85 (sizeof(struct netxen_cmd_buffer) * adapter->max_tx_desc_count) 88 (sizeof(struct netxen_cmd_buffer) * adapter->max_tx_desc_count)
86#define RCV_BUFFSIZE \ 89#define RCV_BUFFSIZE \
87 (sizeof(struct netxen_rx_buffer) * rcv_desc->max_rx_desc_count) 90 (sizeof(struct netxen_rx_buffer) * rds_ring->max_rx_desc_count)
88#define find_diff_among(a,b,range) ((a)<(b)?((b)-(a)):((b)+(range)-(a))) 91#define find_diff_among(a,b,range) ((a)<(b)?((b)-(a)):((b)+(range)-(a)))
89 92
90#define NETXEN_NETDEV_STATUS 0x1 93#define NETXEN_NETDEV_STATUS 0x1
@@ -111,6 +114,13 @@
111 114
112#define NX_P2_C0 0x24 115#define NX_P2_C0 0x24
113#define NX_P2_C1 0x25 116#define NX_P2_C1 0x25
117#define NX_P3_A0 0x30
118#define NX_P3_A2 0x30
119#define NX_P3_B0 0x40
120#define NX_P3_B1 0x41
121
122#define NX_IS_REVISION_P2(REVISION) (REVISION <= NX_P2_C1)
123#define NX_IS_REVISION_P3(REVISION) (REVISION >= NX_P3_A0)
114 124
115#define FIRST_PAGE_GROUP_START 0 125#define FIRST_PAGE_GROUP_START 0
116#define FIRST_PAGE_GROUP_END 0x100000 126#define FIRST_PAGE_GROUP_END 0x100000
@@ -125,6 +135,16 @@
125#define SECOND_PAGE_GROUP_SIZE SECOND_PAGE_GROUP_END - SECOND_PAGE_GROUP_START 135#define SECOND_PAGE_GROUP_SIZE SECOND_PAGE_GROUP_END - SECOND_PAGE_GROUP_START
126#define THIRD_PAGE_GROUP_SIZE THIRD_PAGE_GROUP_END - THIRD_PAGE_GROUP_START 136#define THIRD_PAGE_GROUP_SIZE THIRD_PAGE_GROUP_END - THIRD_PAGE_GROUP_START
127 137
138#define P2_MAX_MTU (8000)
139#define P3_MAX_MTU (9600)
140#define NX_ETHERMTU 1500
141#define NX_MAX_ETHERHDR 32 /* This contains some padding */
142
143#define NX_RX_NORMAL_BUF_MAX_LEN (NX_MAX_ETHERHDR + NX_ETHERMTU)
144#define NX_P2_RX_JUMBO_BUF_MAX_LEN (NX_MAX_ETHERHDR + P2_MAX_MTU)
145#define NX_P3_RX_JUMBO_BUF_MAX_LEN (NX_MAX_ETHERHDR + P3_MAX_MTU)
146#define NX_CT_DEFAULT_RX_BUF_LEN 2048
147
128#define MAX_RX_BUFFER_LENGTH 1760 148#define MAX_RX_BUFFER_LENGTH 1760
129#define MAX_RX_JUMBO_BUFFER_LENGTH 8062 149#define MAX_RX_JUMBO_BUFFER_LENGTH 8062
130#define MAX_RX_LRO_BUFFER_LENGTH ((48*1024)-512) 150#define MAX_RX_LRO_BUFFER_LENGTH ((48*1024)-512)
@@ -132,7 +152,6 @@
132#define RX_JUMBO_DMA_MAP_LEN \ 152#define RX_JUMBO_DMA_MAP_LEN \
133 (MAX_RX_JUMBO_BUFFER_LENGTH - 2) 153 (MAX_RX_JUMBO_BUFFER_LENGTH - 2)
134#define RX_LRO_DMA_MAP_LEN (MAX_RX_LRO_BUFFER_LENGTH - 2) 154#define RX_LRO_DMA_MAP_LEN (MAX_RX_LRO_BUFFER_LENGTH - 2)
135#define NETXEN_ROM_ROUNDUP 0x80000000ULL
136 155
137/* 156/*
138 * Maximum number of ring contexts 157 * Maximum number of ring contexts
@@ -140,16 +159,16 @@
140#define MAX_RING_CTX 1 159#define MAX_RING_CTX 1
141 160
142/* Opcodes to be used with the commands */ 161/* Opcodes to be used with the commands */
143enum { 162#define TX_ETHER_PKT 0x01
144 TX_ETHER_PKT = 0x01, 163#define TX_TCP_PKT 0x02
145/* The following opcodes are for IP checksum */ 164#define TX_UDP_PKT 0x03
146 TX_TCP_PKT, 165#define TX_IP_PKT 0x04
147 TX_UDP_PKT, 166#define TX_TCP_LSO 0x05
148 TX_IP_PKT, 167#define TX_TCP_LSO6 0x06
149 TX_TCP_LSO, 168#define TX_IPSEC 0x07
150 TX_IPSEC, 169#define TX_IPSEC_CMD 0x0a
151 TX_IPSEC_CMD 170#define TX_TCPV6_PKT 0x0b
152}; 171#define TX_UDPV6_PKT 0x0c
153 172
154/* The following opcodes are for internal consumption. */ 173/* The following opcodes are for internal consumption. */
155#define NETXEN_CONTROL_OP 0x10 174#define NETXEN_CONTROL_OP 0x10
@@ -191,6 +210,7 @@ enum {
191#define MAX_RCV_DESCRIPTORS 16384 210#define MAX_RCV_DESCRIPTORS 16384
192#define MAX_CMD_DESCRIPTORS_HOST (MAX_CMD_DESCRIPTORS / 4) 211#define MAX_CMD_DESCRIPTORS_HOST (MAX_CMD_DESCRIPTORS / 4)
193#define MAX_RCV_DESCRIPTORS_1G (MAX_RCV_DESCRIPTORS / 4) 212#define MAX_RCV_DESCRIPTORS_1G (MAX_RCV_DESCRIPTORS / 4)
213#define MAX_RCV_DESCRIPTORS_10G 8192
194#define MAX_JUMBO_RCV_DESCRIPTORS 1024 214#define MAX_JUMBO_RCV_DESCRIPTORS 1024
195#define MAX_LRO_RCV_DESCRIPTORS 64 215#define MAX_LRO_RCV_DESCRIPTORS 64
196#define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS 216#define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS
@@ -219,8 +239,6 @@ enum {
219#define MPORT_MULTI_FUNCTION_MODE 0x2222 239#define MPORT_MULTI_FUNCTION_MODE 0x2222
220 240
221#include "netxen_nic_phan_reg.h" 241#include "netxen_nic_phan_reg.h"
222extern unsigned long long netxen_dma_mask;
223extern unsigned long last_schedule_time;
224 242
225/* 243/*
226 * NetXen host-peg signal message structure 244 * NetXen host-peg signal message structure
@@ -289,7 +307,7 @@ struct netxen_ring_ctx {
289#define netxen_set_cmd_desc_port(cmd_desc, var) \ 307#define netxen_set_cmd_desc_port(cmd_desc, var) \
290 ((cmd_desc)->port_ctxid |= ((var) & 0x0F)) 308 ((cmd_desc)->port_ctxid |= ((var) & 0x0F))
291#define netxen_set_cmd_desc_ctxid(cmd_desc, var) \ 309#define netxen_set_cmd_desc_ctxid(cmd_desc, var) \
292 ((cmd_desc)->port_ctxid |= ((var) & 0xF0)) 310 ((cmd_desc)->port_ctxid |= ((var) << 4 & 0xF0))
293 311
294#define netxen_set_cmd_desc_flags(cmd_desc, val) \ 312#define netxen_set_cmd_desc_flags(cmd_desc, val) \
295 (cmd_desc)->flags_opcode = ((cmd_desc)->flags_opcode & \ 313 (cmd_desc)->flags_opcode = ((cmd_desc)->flags_opcode & \
@@ -377,8 +395,8 @@ struct rcv_desc {
377}; 395};
378 396
379/* opcode field in status_desc */ 397/* opcode field in status_desc */
380#define RCV_NIC_PKT (0xA) 398#define NETXEN_NIC_RXPKT_DESC 0x04
381#define STATUS_NIC_PKT ((RCV_NIC_PKT) << 12) 399#define NETXEN_OLD_RXPKT_DESC 0x3f
382 400
383/* for status field in status_desc */ 401/* for status field in status_desc */
384#define STATUS_NEED_CKSUM (1) 402#define STATUS_NEED_CKSUM (1)
@@ -410,6 +428,8 @@ struct rcv_desc {
410 (((sts_data) >> 28) & 0xFFFF) 428 (((sts_data) >> 28) & 0xFFFF)
411#define netxen_get_sts_prot(sts_data) \ 429#define netxen_get_sts_prot(sts_data) \
412 (((sts_data) >> 44) & 0x0F) 430 (((sts_data) >> 44) & 0x0F)
431#define netxen_get_sts_pkt_offset(sts_data) \
432 (((sts_data) >> 48) & 0x1F)
413#define netxen_get_sts_opcode(sts_data) \ 433#define netxen_get_sts_opcode(sts_data) \
414 (((sts_data) >> 58) & 0x03F) 434 (((sts_data) >> 58) & 0x03F)
415 435
@@ -424,17 +444,30 @@ struct rcv_desc {
424 444
425struct status_desc { 445struct status_desc {
426 /* Bit pattern: 0-3 port, 4-7 status, 8-11 type, 12-27 total_length 446 /* Bit pattern: 0-3 port, 4-7 status, 8-11 type, 12-27 total_length
427 28-43 reference_handle, 44-47 protocol, 48-52 unused 447 28-43 reference_handle, 44-47 protocol, 48-52 pkt_offset
428 53-55 desc_cnt, 56-57 owner, 58-63 opcode 448 53-55 desc_cnt, 56-57 owner, 58-63 opcode
429 */ 449 */
430 __le64 status_desc_data; 450 __le64 status_desc_data;
431 __le32 hash_value; 451 union {
432 u8 hash_type; 452 struct {
433 u8 msg_type; 453 __le32 hash_value;
434 u8 unused; 454 u8 hash_type;
435 /* Bit pattern: 0-6 lro_count indicates frag sequence, 455 u8 msg_type;
436 7 last_frag indicates last frag */ 456 u8 unused;
437 u8 lro; 457 union {
458 /* Bit pattern: 0-6 lro_count indicates frag
459 * sequence, 7 last_frag indicates last frag
460 */
461 u8 lro;
462
463 /* chained buffers */
464 u8 nr_frags;
465 };
466 };
467 struct {
468 __le16 frag_handles[4];
469 };
470 };
438} __attribute__ ((aligned(16))); 471} __attribute__ ((aligned(16)));
439 472
440enum { 473enum {
@@ -464,7 +497,20 @@ typedef enum {
464 497
465 NETXEN_BRDTYPE_P2_SB31_10G_IMEZ = 0x000d, 498 NETXEN_BRDTYPE_P2_SB31_10G_IMEZ = 0x000d,
466 NETXEN_BRDTYPE_P2_SB31_10G_HMEZ = 0x000e, 499 NETXEN_BRDTYPE_P2_SB31_10G_HMEZ = 0x000e,
467 NETXEN_BRDTYPE_P2_SB31_10G_CX4 = 0x000f 500 NETXEN_BRDTYPE_P2_SB31_10G_CX4 = 0x000f,
501
502 NETXEN_BRDTYPE_P3_REF_QG = 0x0021,
503 NETXEN_BRDTYPE_P3_HMEZ = 0x0022,
504 NETXEN_BRDTYPE_P3_10G_CX4_LP = 0x0023,
505 NETXEN_BRDTYPE_P3_4_GB = 0x0024,
506 NETXEN_BRDTYPE_P3_IMEZ = 0x0025,
507 NETXEN_BRDTYPE_P3_10G_SFP_PLUS = 0x0026,
508 NETXEN_BRDTYPE_P3_10000_BASE_T = 0x0027,
509 NETXEN_BRDTYPE_P3_XG_LOM = 0x0028,
510 NETXEN_BRDTYPE_P3_4_GB_MM = 0x0029,
511 NETXEN_BRDTYPE_P3_10G_CX4 = 0x0031,
512 NETXEN_BRDTYPE_P3_10G_XFP = 0x0032
513
468} netxen_brdtype_t; 514} netxen_brdtype_t;
469 515
470typedef enum { 516typedef enum {
@@ -747,6 +793,7 @@ struct netxen_cmd_buffer {
747 793
748/* In rx_buffer, we do not need multiple fragments as is a single buffer */ 794/* In rx_buffer, we do not need multiple fragments as is a single buffer */
749struct netxen_rx_buffer { 795struct netxen_rx_buffer {
796 struct list_head list;
750 struct sk_buff *skb; 797 struct sk_buff *skb;
751 u64 dma; 798 u64 dma;
752 u16 ref_handle; 799 u16 ref_handle;
@@ -765,7 +812,6 @@ struct netxen_rx_buffer {
765 * contains interrupt info as well shared hardware info. 812 * contains interrupt info as well shared hardware info.
766 */ 813 */
767struct netxen_hardware_context { 814struct netxen_hardware_context {
768 struct pci_dev *pdev;
769 void __iomem *pci_base0; 815 void __iomem *pci_base0;
770 void __iomem *pci_base1; 816 void __iomem *pci_base1;
771 void __iomem *pci_base2; 817 void __iomem *pci_base2;
@@ -773,15 +819,20 @@ struct netxen_hardware_context {
773 unsigned long first_page_group_start; 819 unsigned long first_page_group_start;
774 void __iomem *db_base; 820 void __iomem *db_base;
775 unsigned long db_len; 821 unsigned long db_len;
822 unsigned long pci_len0;
823
824 u8 cut_through;
825 int qdr_sn_window;
826 int ddr_mn_window;
827 unsigned long mn_win_crb;
828 unsigned long ms_win_crb;
776 829
777 u8 revision_id; 830 u8 revision_id;
778 u16 board_type; 831 u16 board_type;
779 struct netxen_board_info boardcfg; 832 struct netxen_board_info boardcfg;
780 u32 xg_linkup; 833 u32 linkup;
781 u32 qg_linksup;
782 /* Address of cmd ring in Phantom */ 834 /* Address of cmd ring in Phantom */
783 struct cmd_desc_type0 *cmd_desc_head; 835 struct cmd_desc_type0 *cmd_desc_head;
784 struct pci_dev *cmd_desc_pdev;
785 dma_addr_t cmd_desc_phys_addr; 836 dma_addr_t cmd_desc_phys_addr;
786 struct netxen_adapter *adapter; 837 struct netxen_adapter *adapter;
787 int pci_func; 838 int pci_func;
@@ -813,17 +864,17 @@ struct netxen_adapter_stats {
813 * Rcv Descriptor Context. One such per Rcv Descriptor. There may 864 * Rcv Descriptor Context. One such per Rcv Descriptor. There may
814 * be one Rcv Descriptor for normal packets, one for jumbo and may be others. 865 * be one Rcv Descriptor for normal packets, one for jumbo and may be others.
815 */ 866 */
816struct netxen_rcv_desc_ctx { 867struct nx_host_rds_ring {
817 u32 flags; 868 u32 flags;
818 u32 producer; 869 u32 producer;
819 u32 rcv_pending; /* Num of bufs posted in phantom */
820 dma_addr_t phys_addr; 870 dma_addr_t phys_addr;
821 struct pci_dev *phys_pdev; 871 u32 crb_rcv_producer; /* reg offset */
822 struct rcv_desc *desc_head; /* address of rx ring in Phantom */ 872 struct rcv_desc *desc_head; /* address of rx ring in Phantom */
823 u32 max_rx_desc_count; 873 u32 max_rx_desc_count;
824 u32 dma_size; 874 u32 dma_size;
825 u32 skb_size; 875 u32 skb_size;
826 struct netxen_rx_buffer *rx_buf_arr; /* rx buffers for receive */ 876 struct netxen_rx_buffer *rx_buf_arr; /* rx buffers for receive */
877 struct list_head free_list;
827 int begin_alloc; 878 int begin_alloc;
828}; 879};
829 880
@@ -834,17 +885,319 @@ struct netxen_rcv_desc_ctx {
834 * present elsewhere. 885 * present elsewhere.
835 */ 886 */
836struct netxen_recv_context { 887struct netxen_recv_context {
837 struct netxen_rcv_desc_ctx rcv_desc[NUM_RCV_DESC_RINGS]; 888 u32 state;
838 u32 status_rx_producer; 889 u16 context_id;
890 u16 virt_port;
891
892 struct nx_host_rds_ring rds_rings[NUM_RCV_DESC_RINGS];
839 u32 status_rx_consumer; 893 u32 status_rx_consumer;
894 u32 crb_sts_consumer; /* reg offset */
840 dma_addr_t rcv_status_desc_phys_addr; 895 dma_addr_t rcv_status_desc_phys_addr;
841 struct pci_dev *rcv_status_desc_pdev;
842 struct status_desc *rcv_status_desc_head; 896 struct status_desc *rcv_status_desc_head;
843}; 897};
844 898
845#define NETXEN_NIC_MSI_ENABLED 0x02 899/* New HW context creation */
846#define NETXEN_DMA_MASK 0xfffffffe 900
847#define NETXEN_DB_MAPSIZE_BYTES 0x1000 901#define NX_OS_CRB_RETRY_COUNT 4000
902#define NX_CDRP_SIGNATURE_MAKE(pcifn, version) \
903 (((pcifn) & 0xff) | (((version) & 0xff) << 8) | (0xcafe << 16))
904
905#define NX_CDRP_CLEAR 0x00000000
906#define NX_CDRP_CMD_BIT 0x80000000
907
908/*
909 * All responses must have the NX_CDRP_CMD_BIT cleared
910 * in the crb NX_CDRP_CRB_OFFSET.
911 */
912#define NX_CDRP_FORM_RSP(rsp) (rsp)
913#define NX_CDRP_IS_RSP(rsp) (((rsp) & NX_CDRP_CMD_BIT) == 0)
914
915#define NX_CDRP_RSP_OK 0x00000001
916#define NX_CDRP_RSP_FAIL 0x00000002
917#define NX_CDRP_RSP_TIMEOUT 0x00000003
918
919/*
920 * All commands must have the NX_CDRP_CMD_BIT set in
921 * the crb NX_CDRP_CRB_OFFSET.
922 */
923#define NX_CDRP_FORM_CMD(cmd) (NX_CDRP_CMD_BIT | (cmd))
924#define NX_CDRP_IS_CMD(cmd) (((cmd) & NX_CDRP_CMD_BIT) != 0)
925
926#define NX_CDRP_CMD_SUBMIT_CAPABILITIES 0x00000001
927#define NX_CDRP_CMD_READ_MAX_RDS_PER_CTX 0x00000002
928#define NX_CDRP_CMD_READ_MAX_SDS_PER_CTX 0x00000003
929#define NX_CDRP_CMD_READ_MAX_RULES_PER_CTX 0x00000004
930#define NX_CDRP_CMD_READ_MAX_RX_CTX 0x00000005
931#define NX_CDRP_CMD_READ_MAX_TX_CTX 0x00000006
932#define NX_CDRP_CMD_CREATE_RX_CTX 0x00000007
933#define NX_CDRP_CMD_DESTROY_RX_CTX 0x00000008
934#define NX_CDRP_CMD_CREATE_TX_CTX 0x00000009
935#define NX_CDRP_CMD_DESTROY_TX_CTX 0x0000000a
936#define NX_CDRP_CMD_SETUP_STATISTICS 0x0000000e
937#define NX_CDRP_CMD_GET_STATISTICS 0x0000000f
938#define NX_CDRP_CMD_DELETE_STATISTICS 0x00000010
939#define NX_CDRP_CMD_SET_MTU 0x00000012
940#define NX_CDRP_CMD_MAX 0x00000013
941
942#define NX_RCODE_SUCCESS 0
943#define NX_RCODE_NO_HOST_MEM 1
944#define NX_RCODE_NO_HOST_RESOURCE 2
945#define NX_RCODE_NO_CARD_CRB 3
946#define NX_RCODE_NO_CARD_MEM 4
947#define NX_RCODE_NO_CARD_RESOURCE 5
948#define NX_RCODE_INVALID_ARGS 6
949#define NX_RCODE_INVALID_ACTION 7
950#define NX_RCODE_INVALID_STATE 8
951#define NX_RCODE_NOT_SUPPORTED 9
952#define NX_RCODE_NOT_PERMITTED 10
953#define NX_RCODE_NOT_READY 11
954#define NX_RCODE_DOES_NOT_EXIST 12
955#define NX_RCODE_ALREADY_EXISTS 13
956#define NX_RCODE_BAD_SIGNATURE 14
957#define NX_RCODE_CMD_NOT_IMPL 15
958#define NX_RCODE_CMD_INVALID 16
959#define NX_RCODE_TIMEOUT 17
960#define NX_RCODE_CMD_FAILED 18
961#define NX_RCODE_MAX_EXCEEDED 19
962#define NX_RCODE_MAX 20
963
964#define NX_DESTROY_CTX_RESET 0
965#define NX_DESTROY_CTX_D3_RESET 1
966#define NX_DESTROY_CTX_MAX 2
967
968/*
969 * Capabilities
970 */
971#define NX_CAP_BIT(class, bit) (1 << bit)
972#define NX_CAP0_LEGACY_CONTEXT NX_CAP_BIT(0, 0)
973#define NX_CAP0_MULTI_CONTEXT NX_CAP_BIT(0, 1)
974#define NX_CAP0_LEGACY_MN NX_CAP_BIT(0, 2)
975#define NX_CAP0_LEGACY_MS NX_CAP_BIT(0, 3)
976#define NX_CAP0_CUT_THROUGH NX_CAP_BIT(0, 4)
977#define NX_CAP0_LRO NX_CAP_BIT(0, 5)
978#define NX_CAP0_LSO NX_CAP_BIT(0, 6)
979#define NX_CAP0_JUMBO_CONTIGUOUS NX_CAP_BIT(0, 7)
980#define NX_CAP0_LRO_CONTIGUOUS NX_CAP_BIT(0, 8)
981
982/*
983 * Context state
984 */
985#define NX_HOST_CTX_STATE_FREED 0
986#define NX_HOST_CTX_STATE_ALLOCATED 1
987#define NX_HOST_CTX_STATE_ACTIVE 2
988#define NX_HOST_CTX_STATE_DISABLED 3
989#define NX_HOST_CTX_STATE_QUIESCED 4
990#define NX_HOST_CTX_STATE_MAX 5
991
992/*
993 * Rx context
994 */
995
996typedef struct {
997 u64 host_phys_addr; /* Ring base addr */
998 u32 ring_size; /* Ring entries */
999 u16 msi_index;
1000 u16 rsvd; /* Padding */
1001} nx_hostrq_sds_ring_t;
1002
1003typedef struct {
1004 u64 host_phys_addr; /* Ring base addr */
1005 u64 buff_size; /* Packet buffer size */
1006 u32 ring_size; /* Ring entries */
1007 u32 ring_kind; /* Class of ring */
1008} nx_hostrq_rds_ring_t;
1009
1010typedef struct {
1011 u64 host_rsp_dma_addr; /* Response dma'd here */
1012 u32 capabilities[4]; /* Flag bit vector */
1013 u32 host_int_crb_mode; /* Interrupt crb usage */
1014 u32 host_rds_crb_mode; /* RDS crb usage */
1015 /* These ring offsets are relative to data[0] below */
1016 u32 rds_ring_offset; /* Offset to RDS config */
1017 u32 sds_ring_offset; /* Offset to SDS config */
1018 u16 num_rds_rings; /* Count of RDS rings */
1019 u16 num_sds_rings; /* Count of SDS rings */
1020 u16 rsvd1; /* Padding */
1021 u16 rsvd2; /* Padding */
1022 u8 reserved[128]; /* reserve space for future expansion*/
1023 /* MUST BE 64-bit aligned.
1024 The following is packed:
1025 - N hostrq_rds_rings
1026 - N hostrq_sds_rings */
1027 char data[0];
1028} nx_hostrq_rx_ctx_t;
1029
1030typedef struct {
1031 u32 host_producer_crb; /* Crb to use */
1032 u32 rsvd1; /* Padding */
1033} nx_cardrsp_rds_ring_t;
1034
1035typedef struct {
1036 u32 host_consumer_crb; /* Crb to use */
1037 u32 interrupt_crb; /* Crb to use */
1038} nx_cardrsp_sds_ring_t;
1039
1040typedef struct {
1041 /* These ring offsets are relative to data[0] below */
1042 u32 rds_ring_offset; /* Offset to RDS config */
1043 u32 sds_ring_offset; /* Offset to SDS config */
1044 u32 host_ctx_state; /* Starting State */
1045 u32 num_fn_per_port; /* How many PCI fn share the port */
1046 u16 num_rds_rings; /* Count of RDS rings */
1047 u16 num_sds_rings; /* Count of SDS rings */
1048 u16 context_id; /* Handle for context */
1049 u8 phys_port; /* Physical id of port */
1050 u8 virt_port; /* Virtual/Logical id of port */
1051 u8 reserved[128]; /* save space for future expansion */
1052 /* MUST BE 64-bit aligned.
1053 The following is packed:
1054 - N cardrsp_rds_rings
1055 - N cardrs_sds_rings */
1056 char data[0];
1057} nx_cardrsp_rx_ctx_t;
1058
1059#define SIZEOF_HOSTRQ_RX(HOSTRQ_RX, rds_rings, sds_rings) \
1060 (sizeof(HOSTRQ_RX) + \
1061 (rds_rings)*(sizeof(nx_hostrq_rds_ring_t)) + \
1062 (sds_rings)*(sizeof(nx_hostrq_sds_ring_t)))
1063
1064#define SIZEOF_CARDRSP_RX(CARDRSP_RX, rds_rings, sds_rings) \
1065 (sizeof(CARDRSP_RX) + \
1066 (rds_rings)*(sizeof(nx_cardrsp_rds_ring_t)) + \
1067 (sds_rings)*(sizeof(nx_cardrsp_sds_ring_t)))
1068
1069/*
1070 * Tx context
1071 */
1072
1073typedef struct {
1074 u64 host_phys_addr; /* Ring base addr */
1075 u32 ring_size; /* Ring entries */
1076 u32 rsvd; /* Padding */
1077} nx_hostrq_cds_ring_t;
1078
1079typedef struct {
1080 u64 host_rsp_dma_addr; /* Response dma'd here */
1081 u64 cmd_cons_dma_addr; /* */
1082 u64 dummy_dma_addr; /* */
1083 u32 capabilities[4]; /* Flag bit vector */
1084 u32 host_int_crb_mode; /* Interrupt crb usage */
1085 u32 rsvd1; /* Padding */
1086 u16 rsvd2; /* Padding */
1087 u16 interrupt_ctl;
1088 u16 msi_index;
1089 u16 rsvd3; /* Padding */
1090 nx_hostrq_cds_ring_t cds_ring; /* Desc of cds ring */
1091 u8 reserved[128]; /* future expansion */
1092} nx_hostrq_tx_ctx_t;
1093
1094typedef struct {
1095 u32 host_producer_crb; /* Crb to use */
1096 u32 interrupt_crb; /* Crb to use */
1097} nx_cardrsp_cds_ring_t;
1098
1099typedef struct {
1100 u32 host_ctx_state; /* Starting state */
1101 u16 context_id; /* Handle for context */
1102 u8 phys_port; /* Physical id of port */
1103 u8 virt_port; /* Virtual/Logical id of port */
1104 nx_cardrsp_cds_ring_t cds_ring; /* Card cds settings */
1105 u8 reserved[128]; /* future expansion */
1106} nx_cardrsp_tx_ctx_t;
1107
1108#define SIZEOF_HOSTRQ_TX(HOSTRQ_TX) (sizeof(HOSTRQ_TX))
1109#define SIZEOF_CARDRSP_TX(CARDRSP_TX) (sizeof(CARDRSP_TX))
1110
1111/* CRB */
1112
1113#define NX_HOST_RDS_CRB_MODE_UNIQUE 0
1114#define NX_HOST_RDS_CRB_MODE_SHARED 1
1115#define NX_HOST_RDS_CRB_MODE_CUSTOM 2
1116#define NX_HOST_RDS_CRB_MODE_MAX 3
1117
1118#define NX_HOST_INT_CRB_MODE_UNIQUE 0
1119#define NX_HOST_INT_CRB_MODE_SHARED 1
1120#define NX_HOST_INT_CRB_MODE_NORX 2
1121#define NX_HOST_INT_CRB_MODE_NOTX 3
1122#define NX_HOST_INT_CRB_MODE_NORXTX 4
1123
1124
1125/* MAC */
1126
1127#define MC_COUNT_P2 16
1128#define MC_COUNT_P3 38
1129
1130#define NETXEN_MAC_NOOP 0
1131#define NETXEN_MAC_ADD 1
1132#define NETXEN_MAC_DEL 2
1133
1134typedef struct nx_mac_list_s {
1135 struct nx_mac_list_s *next;
1136 uint8_t mac_addr[MAX_ADDR_LEN];
1137} nx_mac_list_t;
1138
1139/*
1140 * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is
1141 * adjusted based on configured MTU.
1142 */
1143#define NETXEN_DEFAULT_INTR_COALESCE_RX_TIME_US 3
1144#define NETXEN_DEFAULT_INTR_COALESCE_RX_PACKETS 256
1145#define NETXEN_DEFAULT_INTR_COALESCE_TX_PACKETS 64
1146#define NETXEN_DEFAULT_INTR_COALESCE_TX_TIME_US 4
1147
1148#define NETXEN_NIC_INTR_DEFAULT 0x04
1149
1150typedef union {
1151 struct {
1152 uint16_t rx_packets;
1153 uint16_t rx_time_us;
1154 uint16_t tx_packets;
1155 uint16_t tx_time_us;
1156 } data;
1157 uint64_t word;
1158} nx_nic_intr_coalesce_data_t;
1159
1160typedef struct {
1161 uint16_t stats_time_us;
1162 uint16_t rate_sample_time;
1163 uint16_t flags;
1164 uint16_t rsvd_1;
1165 uint32_t low_threshold;
1166 uint32_t high_threshold;
1167 nx_nic_intr_coalesce_data_t normal;
1168 nx_nic_intr_coalesce_data_t low;
1169 nx_nic_intr_coalesce_data_t high;
1170 nx_nic_intr_coalesce_data_t irq;
1171} nx_nic_intr_coalesce_t;
1172
1173typedef struct {
1174 u64 qhdr;
1175 u64 req_hdr;
1176 u64 words[6];
1177} nx_nic_req_t;
1178
1179typedef struct {
1180 u8 op;
1181 u8 tag;
1182 u8 mac_addr[6];
1183} nx_mac_req_t;
1184
1185#define MAX_PENDING_DESC_BLOCK_SIZE 64
1186
1187#define NETXEN_NIC_MSI_ENABLED 0x02
1188#define NETXEN_NIC_MSIX_ENABLED 0x04
1189#define NETXEN_IS_MSI_FAMILY(adapter) \
1190 ((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED))
1191
1192#define MSIX_ENTRIES_PER_ADAPTER 8
1193#define NETXEN_MSIX_TBL_SPACE 8192
1194#define NETXEN_PCI_REG_MSIX_TBL 0x44
1195
1196#define NETXEN_DB_MAPSIZE_BYTES 0x1000
1197
1198#define NETXEN_NETDEV_WEIGHT 120
1199#define NETXEN_ADAPTER_UP_MAGIC 777
1200#define NETXEN_NIC_PEG_TUNE 0
848 1201
849struct netxen_dummy_dma { 1202struct netxen_dummy_dma {
850 void *addr; 1203 void *addr;
@@ -854,46 +1207,65 @@ struct netxen_dummy_dma {
854struct netxen_adapter { 1207struct netxen_adapter {
855 struct netxen_hardware_context ahw; 1208 struct netxen_hardware_context ahw;
856 1209
857 struct netxen_adapter *master;
858 struct net_device *netdev; 1210 struct net_device *netdev;
859 struct pci_dev *pdev; 1211 struct pci_dev *pdev;
1212 int pci_using_dac;
860 struct napi_struct napi; 1213 struct napi_struct napi;
861 struct net_device_stats net_stats; 1214 struct net_device_stats net_stats;
862 unsigned char mac_addr[ETH_ALEN];
863 int mtu; 1215 int mtu;
864 int portnum; 1216 int portnum;
865 u8 physical_port; 1217 u8 physical_port;
1218 u16 tx_context_id;
1219
1220 uint8_t mc_enabled;
1221 uint8_t max_mc_count;
1222 nx_mac_list_t *mac_list;
1223
1224 struct netxen_legacy_intr_set legacy_intr;
1225 u32 crb_intr_mask;
866 1226
867 struct work_struct watchdog_task; 1227 struct work_struct watchdog_task;
868 struct timer_list watchdog_timer; 1228 struct timer_list watchdog_timer;
869 struct work_struct tx_timeout_task; 1229 struct work_struct tx_timeout_task;
870 1230
871 u32 curr_window; 1231 u32 curr_window;
1232 u32 crb_win;
1233 rwlock_t adapter_lock;
1234
1235 uint64_t dma_mask;
872 1236
873 u32 cmd_producer; 1237 u32 cmd_producer;
874 __le32 *cmd_consumer; 1238 __le32 *cmd_consumer;
875 u32 last_cmd_consumer; 1239 u32 last_cmd_consumer;
1240 u32 crb_addr_cmd_producer;
1241 u32 crb_addr_cmd_consumer;
876 1242
877 u32 max_tx_desc_count; 1243 u32 max_tx_desc_count;
878 u32 max_rx_desc_count; 1244 u32 max_rx_desc_count;
879 u32 max_jumbo_rx_desc_count; 1245 u32 max_jumbo_rx_desc_count;
880 u32 max_lro_rx_desc_count; 1246 u32 max_lro_rx_desc_count;
881 1247
1248 int max_rds_rings;
1249
882 u32 flags; 1250 u32 flags;
883 u32 irq; 1251 u32 irq;
884 int driver_mismatch; 1252 int driver_mismatch;
885 u32 temp; 1253 u32 temp;
886 1254
1255 u32 fw_major;
1256
1257 u8 msix_supported;
1258 u8 max_possible_rss_rings;
1259 struct msix_entry msix_entries[MSIX_ENTRIES_PER_ADAPTER];
1260
887 struct netxen_adapter_stats stats; 1261 struct netxen_adapter_stats stats;
888 1262
889 u16 portno;
890 u16 link_speed; 1263 u16 link_speed;
891 u16 link_duplex; 1264 u16 link_duplex;
892 u16 state; 1265 u16 state;
893 u16 link_autoneg; 1266 u16 link_autoneg;
894 int rx_csum; 1267 int rx_csum;
895 int status; 1268 int status;
896 spinlock_t stats_lock;
897 1269
898 struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */ 1270 struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */
899 1271
@@ -905,25 +1277,33 @@ struct netxen_adapter {
905 1277
906 int is_up; 1278 int is_up;
907 struct netxen_dummy_dma dummy_dma; 1279 struct netxen_dummy_dma dummy_dma;
1280 nx_nic_intr_coalesce_t coal;
908 1281
909 /* Context interface shared between card and host */ 1282 /* Context interface shared between card and host */
910 struct netxen_ring_ctx *ctx_desc; 1283 struct netxen_ring_ctx *ctx_desc;
911 struct pci_dev *ctx_desc_pdev;
912 dma_addr_t ctx_desc_phys_addr; 1284 dma_addr_t ctx_desc_phys_addr;
913 int intr_scheme; 1285 int intr_scheme;
914 int msi_mode; 1286 int msi_mode;
915 int (*enable_phy_interrupts) (struct netxen_adapter *); 1287 int (*enable_phy_interrupts) (struct netxen_adapter *);
916 int (*disable_phy_interrupts) (struct netxen_adapter *); 1288 int (*disable_phy_interrupts) (struct netxen_adapter *);
917 void (*handle_phy_intr) (struct netxen_adapter *);
918 int (*macaddr_set) (struct netxen_adapter *, netxen_ethernet_macaddr_t); 1289 int (*macaddr_set) (struct netxen_adapter *, netxen_ethernet_macaddr_t);
919 int (*set_mtu) (struct netxen_adapter *, int); 1290 int (*set_mtu) (struct netxen_adapter *, int);
920 int (*set_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t); 1291 int (*set_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t);
921 int (*unset_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t);
922 int (*phy_read) (struct netxen_adapter *, long reg, u32 *); 1292 int (*phy_read) (struct netxen_adapter *, long reg, u32 *);
923 int (*phy_write) (struct netxen_adapter *, long reg, u32 val); 1293 int (*phy_write) (struct netxen_adapter *, long reg, u32 val);
924 int (*init_port) (struct netxen_adapter *, int); 1294 int (*init_port) (struct netxen_adapter *, int);
925 void (*init_niu) (struct netxen_adapter *);
926 int (*stop_port) (struct netxen_adapter *); 1295 int (*stop_port) (struct netxen_adapter *);
1296
1297 int (*hw_read_wx)(struct netxen_adapter *, ulong, void *, int);
1298 int (*hw_write_wx)(struct netxen_adapter *, ulong, void *, int);
1299 int (*pci_mem_read)(struct netxen_adapter *, u64, void *, int);
1300 int (*pci_mem_write)(struct netxen_adapter *, u64, void *, int);
1301 int (*pci_write_immediate)(struct netxen_adapter *, u64, u32);
1302 u32 (*pci_read_immediate)(struct netxen_adapter *, u64);
1303 void (*pci_write_normalize)(struct netxen_adapter *, u64, u32);
1304 u32 (*pci_read_normalize)(struct netxen_adapter *, u64);
1305 unsigned long (*pci_set_window)(struct netxen_adapter *,
1306 unsigned long long);
927}; /* netxen_adapter structure */ 1307}; /* netxen_adapter structure */
928 1308
929/* 1309/*
@@ -988,8 +1368,6 @@ int netxen_niu_xgbe_enable_phy_interrupts(struct netxen_adapter *adapter);
988int netxen_niu_gbe_enable_phy_interrupts(struct netxen_adapter *adapter); 1368int netxen_niu_gbe_enable_phy_interrupts(struct netxen_adapter *adapter);
989int netxen_niu_xgbe_disable_phy_interrupts(struct netxen_adapter *adapter); 1369int netxen_niu_xgbe_disable_phy_interrupts(struct netxen_adapter *adapter);
990int netxen_niu_gbe_disable_phy_interrupts(struct netxen_adapter *adapter); 1370int netxen_niu_gbe_disable_phy_interrupts(struct netxen_adapter *adapter);
991void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter);
992void netxen_nic_gbe_handle_phy_intr(struct netxen_adapter *adapter);
993int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg, 1371int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg,
994 __u32 * readval); 1372 __u32 * readval);
995int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, 1373int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter,
@@ -998,27 +1376,61 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter,
998/* Functions available from netxen_nic_hw.c */ 1376/* Functions available from netxen_nic_hw.c */
999int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu); 1377int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu);
1000int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu); 1378int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu);
1001void netxen_nic_init_niu_gb(struct netxen_adapter *adapter);
1002void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw);
1003void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val); 1379void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val);
1004int netxen_nic_reg_read(struct netxen_adapter *adapter, u64 off); 1380int netxen_nic_reg_read(struct netxen_adapter *adapter, u64 off);
1005void netxen_nic_write_w0(struct netxen_adapter *adapter, u32 index, u32 value); 1381void netxen_nic_write_w0(struct netxen_adapter *adapter, u32 index, u32 value);
1006void netxen_nic_read_w0(struct netxen_adapter *adapter, u32 index, u32 * value); 1382void netxen_nic_read_w0(struct netxen_adapter *adapter, u32 index, u32 *value);
1383void netxen_nic_write_w1(struct netxen_adapter *adapter, u32 index, u32 value);
1384void netxen_nic_read_w1(struct netxen_adapter *adapter, u32 index, u32 *value);
1007 1385
1008int netxen_nic_get_board_info(struct netxen_adapter *adapter); 1386int netxen_nic_get_board_info(struct netxen_adapter *adapter);
1009int netxen_nic_hw_read_wx(struct netxen_adapter *adapter, u64 off, void *data, 1387
1010 int len); 1388int netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter,
1011int netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data, 1389 ulong off, void *data, int len);
1012 int len); 1390int netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter,
1391 ulong off, void *data, int len);
1392int netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter,
1393 u64 off, void *data, int size);
1394int netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter,
1395 u64 off, void *data, int size);
1396int netxen_nic_pci_write_immediate_128M(struct netxen_adapter *adapter,
1397 u64 off, u32 data);
1398u32 netxen_nic_pci_read_immediate_128M(struct netxen_adapter *adapter, u64 off);
1399void netxen_nic_pci_write_normalize_128M(struct netxen_adapter *adapter,
1400 u64 off, u32 data);
1401u32 netxen_nic_pci_read_normalize_128M(struct netxen_adapter *adapter, u64 off);
1402unsigned long netxen_nic_pci_set_window_128M(struct netxen_adapter *adapter,
1403 unsigned long long addr);
1404void netxen_nic_pci_change_crbwindow_128M(struct netxen_adapter *adapter,
1405 u32 wndw);
1406
1407int netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter,
1408 ulong off, void *data, int len);
1409int netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter,
1410 ulong off, void *data, int len);
1411int netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter,
1412 u64 off, void *data, int size);
1413int netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter,
1414 u64 off, void *data, int size);
1013void netxen_crb_writelit_adapter(struct netxen_adapter *adapter, 1415void netxen_crb_writelit_adapter(struct netxen_adapter *adapter,
1014 unsigned long off, int data); 1416 unsigned long off, int data);
1417int netxen_nic_pci_write_immediate_2M(struct netxen_adapter *adapter,
1418 u64 off, u32 data);
1419u32 netxen_nic_pci_read_immediate_2M(struct netxen_adapter *adapter, u64 off);
1420void netxen_nic_pci_write_normalize_2M(struct netxen_adapter *adapter,
1421 u64 off, u32 data);
1422u32 netxen_nic_pci_read_normalize_2M(struct netxen_adapter *adapter, u64 off);
1423unsigned long netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter,
1424 unsigned long long addr);
1015 1425
1016/* Functions from netxen_nic_init.c */ 1426/* Functions from netxen_nic_init.c */
1017void netxen_free_adapter_offload(struct netxen_adapter *adapter); 1427void netxen_free_adapter_offload(struct netxen_adapter *adapter);
1018int netxen_initialize_adapter_offload(struct netxen_adapter *adapter); 1428int netxen_initialize_adapter_offload(struct netxen_adapter *adapter);
1019int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); 1429int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
1430int netxen_receive_peg_ready(struct netxen_adapter *adapter);
1020int netxen_load_firmware(struct netxen_adapter *adapter); 1431int netxen_load_firmware(struct netxen_adapter *adapter);
1021int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose); 1432int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose);
1433
1022int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp); 1434int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp);
1023int netxen_rom_fast_read_words(struct netxen_adapter *adapter, int addr, 1435int netxen_rom_fast_read_words(struct netxen_adapter *adapter, int addr,
1024 u8 *bytes, size_t size); 1436 u8 *bytes, size_t size);
@@ -1032,33 +1444,43 @@ void netxen_halt_pegs(struct netxen_adapter *adapter);
1032 1444
1033int netxen_rom_se(struct netxen_adapter *adapter, int addr); 1445int netxen_rom_se(struct netxen_adapter *adapter, int addr);
1034 1446
1035/* Functions from netxen_nic_isr.c */ 1447int netxen_alloc_sw_resources(struct netxen_adapter *adapter);
1036void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); 1448void netxen_free_sw_resources(struct netxen_adapter *adapter);
1037void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, 1449
1038 struct pci_dev **used_dev); 1450int netxen_alloc_hw_resources(struct netxen_adapter *adapter);
1451void netxen_free_hw_resources(struct netxen_adapter *adapter);
1452
1453void netxen_release_rx_buffers(struct netxen_adapter *adapter);
1454void netxen_release_tx_buffers(struct netxen_adapter *adapter);
1455
1039void netxen_initialize_adapter_ops(struct netxen_adapter *adapter); 1456void netxen_initialize_adapter_ops(struct netxen_adapter *adapter);
1040int netxen_init_firmware(struct netxen_adapter *adapter); 1457int netxen_init_firmware(struct netxen_adapter *adapter);
1041void netxen_free_hw_resources(struct netxen_adapter *adapter);
1042void netxen_tso_check(struct netxen_adapter *adapter, 1458void netxen_tso_check(struct netxen_adapter *adapter,
1043 struct cmd_desc_type0 *desc, struct sk_buff *skb); 1459 struct cmd_desc_type0 *desc, struct sk_buff *skb);
1044int netxen_nic_hw_resources(struct netxen_adapter *adapter);
1045void netxen_nic_clear_stats(struct netxen_adapter *adapter); 1460void netxen_nic_clear_stats(struct netxen_adapter *adapter);
1046void netxen_watchdog_task(struct work_struct *work); 1461void netxen_watchdog_task(struct work_struct *work);
1047void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, 1462void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx,
1048 u32 ringid); 1463 u32 ringid);
1049int netxen_process_cmd_ring(struct netxen_adapter *adapter); 1464int netxen_process_cmd_ring(struct netxen_adapter *adapter);
1050u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctx, int max); 1465u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctx, int max);
1051void netxen_nic_set_multi(struct net_device *netdev); 1466void netxen_p2_nic_set_multi(struct net_device *netdev);
1467void netxen_p3_nic_set_multi(struct net_device *netdev);
1468int netxen_config_intr_coalesce(struct netxen_adapter *adapter);
1469
1470u32 nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, u32 mtu);
1052int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu); 1471int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu);
1472
1053int netxen_nic_set_mac(struct net_device *netdev, void *p); 1473int netxen_nic_set_mac(struct net_device *netdev, void *p);
1054struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev); 1474struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev);
1055 1475
1476void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
1477 uint32_t crb_producer);
1056 1478
1057/* 1479/*
1058 * NetXen Board information 1480 * NetXen Board information
1059 */ 1481 */
1060 1482
1061#define NETXEN_MAX_SHORT_NAME 16 1483#define NETXEN_MAX_SHORT_NAME 32
1062struct netxen_brdinfo { 1484struct netxen_brdinfo {
1063 netxen_brdtype_t brdtype; /* type of board */ 1485 netxen_brdtype_t brdtype; /* type of board */
1064 long ports; /* max no of physical ports */ 1486 long ports; /* max no of physical ports */
@@ -1072,6 +1494,17 @@ static const struct netxen_brdinfo netxen_boards[] = {
1072 {NETXEN_BRDTYPE_P2_SB31_10G, 1, "XGb XFP"}, 1494 {NETXEN_BRDTYPE_P2_SB31_10G, 1, "XGb XFP"},
1073 {NETXEN_BRDTYPE_P2_SB35_4G, 4, "Quad Gb"}, 1495 {NETXEN_BRDTYPE_P2_SB35_4G, 4, "Quad Gb"},
1074 {NETXEN_BRDTYPE_P2_SB31_2G, 2, "Dual Gb"}, 1496 {NETXEN_BRDTYPE_P2_SB31_2G, 2, "Dual Gb"},
1497 {NETXEN_BRDTYPE_P3_REF_QG, 4, "Reference Quad Gig "},
1498 {NETXEN_BRDTYPE_P3_HMEZ, 2, "Dual XGb HMEZ"},
1499 {NETXEN_BRDTYPE_P3_10G_CX4_LP, 2, "Dual XGb CX4 LP"},
1500 {NETXEN_BRDTYPE_P3_4_GB, 4, "Quad Gig LP"},
1501 {NETXEN_BRDTYPE_P3_IMEZ, 2, "Dual XGb IMEZ"},
1502 {NETXEN_BRDTYPE_P3_10G_SFP_PLUS, 2, "Dual XGb SFP+ LP"},
1503 {NETXEN_BRDTYPE_P3_10000_BASE_T, 1, "XGB 10G BaseT LP"},
1504 {NETXEN_BRDTYPE_P3_XG_LOM, 2, "Dual XGb LOM"},
1505 {NETXEN_BRDTYPE_P3_4_GB_MM, 4, "Quad GB - March Madness"},
1506 {NETXEN_BRDTYPE_P3_10G_CX4, 2, "Reference Dual CX4 Option"},
1507 {NETXEN_BRDTYPE_P3_10G_XFP, 1, "Reference Single XFP Option"}
1075}; 1508};
1076 1509
1077#define NUM_SUPPORTED_BOARDS ARRAY_SIZE(netxen_boards) 1510#define NUM_SUPPORTED_BOARDS ARRAY_SIZE(netxen_boards)
@@ -1097,7 +1530,7 @@ dma_watchdog_shutdown_request(struct netxen_adapter *adapter)
1097 u32 ctrl; 1530 u32 ctrl;
1098 1531
1099 /* check if already inactive */ 1532 /* check if already inactive */
1100 if (netxen_nic_hw_read_wx(adapter, 1533 if (adapter->hw_read_wx(adapter,
1101 NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4)) 1534 NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4))
1102 printk(KERN_ERR "failed to read dma watchdog status\n"); 1535 printk(KERN_ERR "failed to read dma watchdog status\n");
1103 1536
@@ -1117,7 +1550,7 @@ dma_watchdog_shutdown_poll_result(struct netxen_adapter *adapter)
1117{ 1550{
1118 u32 ctrl; 1551 u32 ctrl;
1119 1552
1120 if (netxen_nic_hw_read_wx(adapter, 1553 if (adapter->hw_read_wx(adapter,
1121 NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4)) 1554 NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4))
1122 printk(KERN_ERR "failed to read dma watchdog status\n"); 1555 printk(KERN_ERR "failed to read dma watchdog status\n");
1123 1556
@@ -1129,7 +1562,7 @@ dma_watchdog_wakeup(struct netxen_adapter *adapter)
1129{ 1562{
1130 u32 ctrl; 1563 u32 ctrl;
1131 1564
1132 if (netxen_nic_hw_read_wx(adapter, 1565 if (adapter->hw_read_wx(adapter,
1133 NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4)) 1566 NETXEN_CAM_RAM(NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL), &ctrl, 4))
1134 printk(KERN_ERR "failed to read dma watchdog status\n"); 1567 printk(KERN_ERR "failed to read dma watchdog status\n");
1135 1568
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c
new file mode 100644
index 000000000000..64babc59e699
--- /dev/null
+++ b/drivers/net/netxen/netxen_nic_ctx.c
@@ -0,0 +1,710 @@
1/*
2 * Copyright (C) 2003 - 2008 NetXen, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18 * MA 02111-1307, USA.
19 *
20 * The full GNU General Public License is included in this distribution
21 * in the file called LICENSE.
22 *
23 * Contact Information:
24 * info@netxen.com
25 * NetXen,
26 * 3965 Freedom Circle, Fourth floor,
27 * Santa Clara, CA 95054
28 *
29 */
30
31#include "netxen_nic_hw.h"
32#include "netxen_nic.h"
33#include "netxen_nic_phan_reg.h"
34
35#define NXHAL_VERSION 1
36
37static int
38netxen_api_lock(struct netxen_adapter *adapter)
39{
40 u32 done = 0, timeout = 0;
41
42 for (;;) {
43 /* Acquire PCIE HW semaphore5 */
44 netxen_nic_read_w0(adapter,
45 NETXEN_PCIE_REG(PCIE_SEM5_LOCK), &done);
46
47 if (done == 1)
48 break;
49
50 if (++timeout >= NX_OS_CRB_RETRY_COUNT) {
51 printk(KERN_ERR "%s: lock timeout.\n", __func__);
52 return -1;
53 }
54
55 msleep(1);
56 }
57
58#if 0
59 netxen_nic_write_w1(adapter,
60 NETXEN_API_LOCK_ID, NX_OS_API_LOCK_DRIVER);
61#endif
62 return 0;
63}
64
65static int
66netxen_api_unlock(struct netxen_adapter *adapter)
67{
68 u32 val;
69
70 /* Release PCIE HW semaphore5 */
71 netxen_nic_read_w0(adapter,
72 NETXEN_PCIE_REG(PCIE_SEM5_UNLOCK), &val);
73 return 0;
74}
75
76static u32
77netxen_poll_rsp(struct netxen_adapter *adapter)
78{
79 u32 raw_rsp, rsp = NX_CDRP_RSP_OK;
80 int timeout = 0;
81
82 do {
83 /* give atleast 1ms for firmware to respond */
84 msleep(1);
85
86 if (++timeout > NX_OS_CRB_RETRY_COUNT)
87 return NX_CDRP_RSP_TIMEOUT;
88
89 netxen_nic_read_w1(adapter, NX_CDRP_CRB_OFFSET,
90 &raw_rsp);
91
92 rsp = le32_to_cpu(raw_rsp);
93 } while (!NX_CDRP_IS_RSP(rsp));
94
95 return rsp;
96}
97
98static u32
99netxen_issue_cmd(struct netxen_adapter *adapter,
100 u32 pci_fn, u32 version, u32 arg1, u32 arg2, u32 arg3, u32 cmd)
101{
102 u32 rsp;
103 u32 signature = 0;
104 u32 rcode = NX_RCODE_SUCCESS;
105
106 signature = NX_CDRP_SIGNATURE_MAKE(pci_fn, version);
107
108 /* Acquire semaphore before accessing CRB */
109 if (netxen_api_lock(adapter))
110 return NX_RCODE_TIMEOUT;
111
112 netxen_nic_write_w1(adapter, NX_SIGN_CRB_OFFSET,
113 cpu_to_le32(signature));
114
115 netxen_nic_write_w1(adapter, NX_ARG1_CRB_OFFSET,
116 cpu_to_le32(arg1));
117
118 netxen_nic_write_w1(adapter, NX_ARG2_CRB_OFFSET,
119 cpu_to_le32(arg2));
120
121 netxen_nic_write_w1(adapter, NX_ARG3_CRB_OFFSET,
122 cpu_to_le32(arg3));
123
124 netxen_nic_write_w1(adapter, NX_CDRP_CRB_OFFSET,
125 cpu_to_le32(NX_CDRP_FORM_CMD(cmd)));
126
127 rsp = netxen_poll_rsp(adapter);
128
129 if (rsp == NX_CDRP_RSP_TIMEOUT) {
130 printk(KERN_ERR "%s: card response timeout.\n",
131 netxen_nic_driver_name);
132
133 rcode = NX_RCODE_TIMEOUT;
134 } else if (rsp == NX_CDRP_RSP_FAIL) {
135 netxen_nic_read_w1(adapter, NX_ARG1_CRB_OFFSET, &rcode);
136 rcode = le32_to_cpu(rcode);
137
138 printk(KERN_ERR "%s: failed card response code:0x%x\n",
139 netxen_nic_driver_name, rcode);
140 }
141
142 /* Release semaphore */
143 netxen_api_unlock(adapter);
144
145 return rcode;
146}
147
148u32
149nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, u32 mtu)
150{
151 u32 rcode = NX_RCODE_SUCCESS;
152 struct netxen_recv_context *recv_ctx = &adapter->recv_ctx[0];
153
154 if (recv_ctx->state == NX_HOST_CTX_STATE_ACTIVE)
155 rcode = netxen_issue_cmd(adapter,
156 adapter->ahw.pci_func,
157 NXHAL_VERSION,
158 recv_ctx->context_id,
159 mtu,
160 0,
161 NX_CDRP_CMD_SET_MTU);
162
163 return rcode;
164}
165
166static int
167nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter)
168{
169 void *addr;
170 nx_hostrq_rx_ctx_t *prq;
171 nx_cardrsp_rx_ctx_t *prsp;
172 nx_hostrq_rds_ring_t *prq_rds;
173 nx_hostrq_sds_ring_t *prq_sds;
174 nx_cardrsp_rds_ring_t *prsp_rds;
175 nx_cardrsp_sds_ring_t *prsp_sds;
176 struct nx_host_rds_ring *rds_ring;
177
178 dma_addr_t hostrq_phys_addr, cardrsp_phys_addr;
179 u64 phys_addr;
180
181 int i, nrds_rings, nsds_rings;
182 size_t rq_size, rsp_size;
183 u32 cap, reg;
184
185 int err;
186
187 struct netxen_recv_context *recv_ctx = &adapter->recv_ctx[0];
188
189 /* only one sds ring for now */
190 nrds_rings = adapter->max_rds_rings;
191 nsds_rings = 1;
192
193 rq_size =
194 SIZEOF_HOSTRQ_RX(nx_hostrq_rx_ctx_t, nrds_rings, nsds_rings);
195 rsp_size =
196 SIZEOF_CARDRSP_RX(nx_cardrsp_rx_ctx_t, nrds_rings, nsds_rings);
197
198 addr = pci_alloc_consistent(adapter->pdev,
199 rq_size, &hostrq_phys_addr);
200 if (addr == NULL)
201 return -ENOMEM;
202 prq = (nx_hostrq_rx_ctx_t *)addr;
203
204 addr = pci_alloc_consistent(adapter->pdev,
205 rsp_size, &cardrsp_phys_addr);
206 if (addr == NULL) {
207 err = -ENOMEM;
208 goto out_free_rq;
209 }
210 prsp = (nx_cardrsp_rx_ctx_t *)addr;
211
212 prq->host_rsp_dma_addr = cpu_to_le64(cardrsp_phys_addr);
213
214 cap = (NX_CAP0_LEGACY_CONTEXT | NX_CAP0_LEGACY_MN);
215 cap |= (NX_CAP0_JUMBO_CONTIGUOUS | NX_CAP0_LRO_CONTIGUOUS);
216
217 prq->capabilities[0] = cpu_to_le32(cap);
218 prq->host_int_crb_mode =
219 cpu_to_le32(NX_HOST_INT_CRB_MODE_SHARED);
220 prq->host_rds_crb_mode =
221 cpu_to_le32(NX_HOST_RDS_CRB_MODE_UNIQUE);
222
223 prq->num_rds_rings = cpu_to_le16(nrds_rings);
224 prq->num_sds_rings = cpu_to_le16(nsds_rings);
225 prq->rds_ring_offset = 0;
226 prq->sds_ring_offset = prq->rds_ring_offset +
227 (sizeof(nx_hostrq_rds_ring_t) * nrds_rings);
228
229 prq_rds = (nx_hostrq_rds_ring_t *)(prq->data + prq->rds_ring_offset);
230
231 for (i = 0; i < nrds_rings; i++) {
232
233 rds_ring = &recv_ctx->rds_rings[i];
234
235 prq_rds[i].host_phys_addr = cpu_to_le64(rds_ring->phys_addr);
236 prq_rds[i].ring_size = cpu_to_le32(rds_ring->max_rx_desc_count);
237 prq_rds[i].ring_kind = cpu_to_le32(i);
238 prq_rds[i].buff_size = cpu_to_le64(rds_ring->dma_size);
239 }
240
241 prq_sds = (nx_hostrq_sds_ring_t *)(prq->data + prq->sds_ring_offset);
242
243 prq_sds[0].host_phys_addr =
244 cpu_to_le64(recv_ctx->rcv_status_desc_phys_addr);
245 prq_sds[0].ring_size = cpu_to_le32(adapter->max_rx_desc_count);
246 /* only one msix vector for now */
247 prq_sds[0].msi_index = cpu_to_le32(0);
248
249 /* now byteswap offsets */
250 prq->rds_ring_offset = cpu_to_le32(prq->rds_ring_offset);
251 prq->sds_ring_offset = cpu_to_le32(prq->sds_ring_offset);
252
253 phys_addr = hostrq_phys_addr;
254 err = netxen_issue_cmd(adapter,
255 adapter->ahw.pci_func,
256 NXHAL_VERSION,
257 (u32)(phys_addr >> 32),
258 (u32)(phys_addr & 0xffffffff),
259 rq_size,
260 NX_CDRP_CMD_CREATE_RX_CTX);
261 if (err) {
262 printk(KERN_WARNING
263 "Failed to create rx ctx in firmware%d\n", err);
264 goto out_free_rsp;
265 }
266
267
268 prsp_rds = ((nx_cardrsp_rds_ring_t *)
269 &prsp->data[prsp->rds_ring_offset]);
270
271 for (i = 0; i < le32_to_cpu(prsp->num_rds_rings); i++) {
272 rds_ring = &recv_ctx->rds_rings[i];
273
274 reg = le32_to_cpu(prsp_rds[i].host_producer_crb);
275 rds_ring->crb_rcv_producer = NETXEN_NIC_REG(reg - 0x200);
276 }
277
278 prsp_sds = ((nx_cardrsp_sds_ring_t *)
279 &prsp->data[prsp->sds_ring_offset]);
280 reg = le32_to_cpu(prsp_sds[0].host_consumer_crb);
281 recv_ctx->crb_sts_consumer = NETXEN_NIC_REG(reg - 0x200);
282
283 reg = le32_to_cpu(prsp_sds[0].interrupt_crb);
284 adapter->crb_intr_mask = NETXEN_NIC_REG(reg - 0x200);
285
286 recv_ctx->state = le32_to_cpu(prsp->host_ctx_state);
287 recv_ctx->context_id = le16_to_cpu(prsp->context_id);
288 recv_ctx->virt_port = le16_to_cpu(prsp->virt_port);
289
290out_free_rsp:
291 pci_free_consistent(adapter->pdev, rsp_size, prsp, cardrsp_phys_addr);
292out_free_rq:
293 pci_free_consistent(adapter->pdev, rq_size, prq, hostrq_phys_addr);
294 return err;
295}
296
297static void
298nx_fw_cmd_destroy_rx_ctx(struct netxen_adapter *adapter)
299{
300 struct netxen_recv_context *recv_ctx = &adapter->recv_ctx[0];
301
302 if (netxen_issue_cmd(adapter,
303 adapter->ahw.pci_func,
304 NXHAL_VERSION,
305 recv_ctx->context_id,
306 NX_DESTROY_CTX_RESET,
307 0,
308 NX_CDRP_CMD_DESTROY_RX_CTX)) {
309
310 printk(KERN_WARNING
311 "%s: Failed to destroy rx ctx in firmware\n",
312 netxen_nic_driver_name);
313 }
314}
315
316static int
317nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)
318{
319 nx_hostrq_tx_ctx_t *prq;
320 nx_hostrq_cds_ring_t *prq_cds;
321 nx_cardrsp_tx_ctx_t *prsp;
322 void *rq_addr, *rsp_addr;
323 size_t rq_size, rsp_size;
324 u32 temp;
325 int err = 0;
326 u64 offset, phys_addr;
327 dma_addr_t rq_phys_addr, rsp_phys_addr;
328
329 rq_size = SIZEOF_HOSTRQ_TX(nx_hostrq_tx_ctx_t);
330 rq_addr = pci_alloc_consistent(adapter->pdev,
331 rq_size, &rq_phys_addr);
332 if (!rq_addr)
333 return -ENOMEM;
334
335 rsp_size = SIZEOF_CARDRSP_TX(nx_cardrsp_tx_ctx_t);
336 rsp_addr = pci_alloc_consistent(adapter->pdev,
337 rsp_size, &rsp_phys_addr);
338 if (!rsp_addr) {
339 err = -ENOMEM;
340 goto out_free_rq;
341 }
342
343 memset(rq_addr, 0, rq_size);
344 prq = (nx_hostrq_tx_ctx_t *)rq_addr;
345
346 memset(rsp_addr, 0, rsp_size);
347 prsp = (nx_cardrsp_tx_ctx_t *)rsp_addr;
348
349 prq->host_rsp_dma_addr = cpu_to_le64(rsp_phys_addr);
350
351 temp = (NX_CAP0_LEGACY_CONTEXT | NX_CAP0_LEGACY_MN | NX_CAP0_LSO);
352 prq->capabilities[0] = cpu_to_le32(temp);
353
354 prq->host_int_crb_mode =
355 cpu_to_le32(NX_HOST_INT_CRB_MODE_SHARED);
356
357 prq->interrupt_ctl = 0;
358 prq->msi_index = 0;
359
360 prq->dummy_dma_addr = cpu_to_le64(adapter->dummy_dma.phys_addr);
361
362 offset = adapter->ctx_desc_phys_addr+sizeof(struct netxen_ring_ctx);
363 prq->cmd_cons_dma_addr = cpu_to_le64(offset);
364
365 prq_cds = &prq->cds_ring;
366
367 prq_cds->host_phys_addr =
368 cpu_to_le64(adapter->ahw.cmd_desc_phys_addr);
369
370 prq_cds->ring_size = cpu_to_le32(adapter->max_tx_desc_count);
371
372 phys_addr = rq_phys_addr;
373 err = netxen_issue_cmd(adapter,
374 adapter->ahw.pci_func,
375 NXHAL_VERSION,
376 (u32)(phys_addr >> 32),
377 ((u32)phys_addr & 0xffffffff),
378 rq_size,
379 NX_CDRP_CMD_CREATE_TX_CTX);
380
381 if (err == NX_RCODE_SUCCESS) {
382 temp = le32_to_cpu(prsp->cds_ring.host_producer_crb);
383 adapter->crb_addr_cmd_producer =
384 NETXEN_NIC_REG(temp - 0x200);
385#if 0
386 adapter->tx_state =
387 le32_to_cpu(prsp->host_ctx_state);
388#endif
389 adapter->tx_context_id =
390 le16_to_cpu(prsp->context_id);
391 } else {
392 printk(KERN_WARNING
393 "Failed to create tx ctx in firmware%d\n", err);
394 err = -EIO;
395 }
396
397 pci_free_consistent(adapter->pdev, rsp_size, rsp_addr, rsp_phys_addr);
398
399out_free_rq:
400 pci_free_consistent(adapter->pdev, rq_size, rq_addr, rq_phys_addr);
401
402 return err;
403}
404
405static void
406nx_fw_cmd_destroy_tx_ctx(struct netxen_adapter *adapter)
407{
408 if (netxen_issue_cmd(adapter,
409 adapter->ahw.pci_func,
410 NXHAL_VERSION,
411 adapter->tx_context_id,
412 NX_DESTROY_CTX_RESET,
413 0,
414 NX_CDRP_CMD_DESTROY_TX_CTX)) {
415
416 printk(KERN_WARNING
417 "%s: Failed to destroy tx ctx in firmware\n",
418 netxen_nic_driver_name);
419 }
420}
421
422static u64 ctx_addr_sig_regs[][3] = {
423 {NETXEN_NIC_REG(0x188), NETXEN_NIC_REG(0x18c), NETXEN_NIC_REG(0x1c0)},
424 {NETXEN_NIC_REG(0x190), NETXEN_NIC_REG(0x194), NETXEN_NIC_REG(0x1c4)},
425 {NETXEN_NIC_REG(0x198), NETXEN_NIC_REG(0x19c), NETXEN_NIC_REG(0x1c8)},
426 {NETXEN_NIC_REG(0x1a0), NETXEN_NIC_REG(0x1a4), NETXEN_NIC_REG(0x1cc)}
427};
428
429#define CRB_CTX_ADDR_REG_LO(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][0])
430#define CRB_CTX_ADDR_REG_HI(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][2])
431#define CRB_CTX_SIGNATURE_REG(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][1])
432
433#define lower32(x) ((u32)((x) & 0xffffffff))
434#define upper32(x) ((u32)(((u64)(x) >> 32) & 0xffffffff))
435
436static struct netxen_recv_crb recv_crb_registers[] = {
437 /* Instance 0 */
438 {
439 /* crb_rcv_producer: */
440 {
441 NETXEN_NIC_REG(0x100),
442 /* Jumbo frames */
443 NETXEN_NIC_REG(0x110),
444 /* LRO */
445 NETXEN_NIC_REG(0x120)
446 },
447 /* crb_sts_consumer: */
448 NETXEN_NIC_REG(0x138),
449 },
450 /* Instance 1 */
451 {
452 /* crb_rcv_producer: */
453 {
454 NETXEN_NIC_REG(0x144),
455 /* Jumbo frames */
456 NETXEN_NIC_REG(0x154),
457 /* LRO */
458 NETXEN_NIC_REG(0x164)
459 },
460 /* crb_sts_consumer: */
461 NETXEN_NIC_REG(0x17c),
462 },
463 /* Instance 2 */
464 {
465 /* crb_rcv_producer: */
466 {
467 NETXEN_NIC_REG(0x1d8),
468 /* Jumbo frames */
469 NETXEN_NIC_REG(0x1f8),
470 /* LRO */
471 NETXEN_NIC_REG(0x208)
472 },
473 /* crb_sts_consumer: */
474 NETXEN_NIC_REG(0x220),
475 },
476 /* Instance 3 */
477 {
478 /* crb_rcv_producer: */
479 {
480 NETXEN_NIC_REG(0x22c),
481 /* Jumbo frames */
482 NETXEN_NIC_REG(0x23c),
483 /* LRO */
484 NETXEN_NIC_REG(0x24c)
485 },
486 /* crb_sts_consumer: */
487 NETXEN_NIC_REG(0x264),
488 },
489};
490
491static int
492netxen_init_old_ctx(struct netxen_adapter *adapter)
493{
494 struct netxen_recv_context *recv_ctx;
495 struct nx_host_rds_ring *rds_ring;
496 int ctx, ring;
497 int func_id = adapter->portnum;
498
499 adapter->ctx_desc->cmd_ring_addr =
500 cpu_to_le64(adapter->ahw.cmd_desc_phys_addr);
501 adapter->ctx_desc->cmd_ring_size =
502 cpu_to_le32(adapter->max_tx_desc_count);
503
504 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
505 recv_ctx = &adapter->recv_ctx[ctx];
506
507 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
508 rds_ring = &recv_ctx->rds_rings[ring];
509
510 adapter->ctx_desc->rcv_ctx[ring].rcv_ring_addr =
511 cpu_to_le64(rds_ring->phys_addr);
512 adapter->ctx_desc->rcv_ctx[ring].rcv_ring_size =
513 cpu_to_le32(rds_ring->max_rx_desc_count);
514 }
515 adapter->ctx_desc->sts_ring_addr =
516 cpu_to_le64(recv_ctx->rcv_status_desc_phys_addr);
517 adapter->ctx_desc->sts_ring_size =
518 cpu_to_le32(adapter->max_rx_desc_count);
519 }
520
521 adapter->pci_write_normalize(adapter, CRB_CTX_ADDR_REG_LO(func_id),
522 lower32(adapter->ctx_desc_phys_addr));
523 adapter->pci_write_normalize(adapter, CRB_CTX_ADDR_REG_HI(func_id),
524 upper32(adapter->ctx_desc_phys_addr));
525 adapter->pci_write_normalize(adapter, CRB_CTX_SIGNATURE_REG(func_id),
526 NETXEN_CTX_SIGNATURE | func_id);
527 return 0;
528}
529
530static uint32_t sw_int_mask[4] = {
531 CRB_SW_INT_MASK_0, CRB_SW_INT_MASK_1,
532 CRB_SW_INT_MASK_2, CRB_SW_INT_MASK_3
533};
534
535int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
536{
537 struct netxen_hardware_context *hw = &adapter->ahw;
538 u32 state = 0;
539 void *addr;
540 int err = 0;
541 int ctx, ring;
542 struct netxen_recv_context *recv_ctx;
543 struct nx_host_rds_ring *rds_ring;
544
545 err = netxen_receive_peg_ready(adapter);
546 if (err) {
547 printk(KERN_ERR "Rcv Peg initialization not complete:%x.\n",
548 state);
549 return err;
550 }
551
552 addr = pci_alloc_consistent(adapter->pdev,
553 sizeof(struct netxen_ring_ctx) + sizeof(uint32_t),
554 &adapter->ctx_desc_phys_addr);
555
556 if (addr == NULL) {
557 DPRINTK(ERR, "failed to allocate hw context\n");
558 return -ENOMEM;
559 }
560 memset(addr, 0, sizeof(struct netxen_ring_ctx));
561 adapter->ctx_desc = (struct netxen_ring_ctx *)addr;
562 adapter->ctx_desc->ctx_id = cpu_to_le32(adapter->portnum);
563 adapter->ctx_desc->cmd_consumer_offset =
564 cpu_to_le64(adapter->ctx_desc_phys_addr +
565 sizeof(struct netxen_ring_ctx));
566 adapter->cmd_consumer =
567 (__le32 *)(((char *)addr) + sizeof(struct netxen_ring_ctx));
568
569 /* cmd desc ring */
570 addr = pci_alloc_consistent(adapter->pdev,
571 sizeof(struct cmd_desc_type0) *
572 adapter->max_tx_desc_count,
573 &hw->cmd_desc_phys_addr);
574
575 if (addr == NULL) {
576 printk(KERN_ERR "%s failed to allocate tx desc ring\n",
577 netxen_nic_driver_name);
578 return -ENOMEM;
579 }
580
581 hw->cmd_desc_head = (struct cmd_desc_type0 *)addr;
582
583 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
584 recv_ctx = &adapter->recv_ctx[ctx];
585
586 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
587 /* rx desc ring */
588 rds_ring = &recv_ctx->rds_rings[ring];
589 addr = pci_alloc_consistent(adapter->pdev,
590 RCV_DESC_RINGSIZE,
591 &rds_ring->phys_addr);
592 if (addr == NULL) {
593 printk(KERN_ERR "%s failed to allocate rx "
594 "desc ring[%d]\n",
595 netxen_nic_driver_name, ring);
596 err = -ENOMEM;
597 goto err_out_free;
598 }
599 rds_ring->desc_head = (struct rcv_desc *)addr;
600
601 if (adapter->fw_major < 4)
602 rds_ring->crb_rcv_producer =
603 recv_crb_registers[adapter->portnum].
604 crb_rcv_producer[ring];
605 }
606
607 /* status desc ring */
608 addr = pci_alloc_consistent(adapter->pdev,
609 STATUS_DESC_RINGSIZE,
610 &recv_ctx->rcv_status_desc_phys_addr);
611 if (addr == NULL) {
612 printk(KERN_ERR "%s failed to allocate sts desc ring\n",
613 netxen_nic_driver_name);
614 err = -ENOMEM;
615 goto err_out_free;
616 }
617 recv_ctx->rcv_status_desc_head = (struct status_desc *)addr;
618
619 if (adapter->fw_major < 4)
620 recv_ctx->crb_sts_consumer =
621 recv_crb_registers[adapter->portnum].
622 crb_sts_consumer;
623 }
624
625 if (adapter->fw_major >= 4) {
626 adapter->intr_scheme = INTR_SCHEME_PERPORT;
627 adapter->msi_mode = MSI_MODE_MULTIFUNC;
628
629 err = nx_fw_cmd_create_rx_ctx(adapter);
630 if (err)
631 goto err_out_free;
632 err = nx_fw_cmd_create_tx_ctx(adapter);
633 if (err)
634 goto err_out_free;
635 } else {
636
637 adapter->intr_scheme = adapter->pci_read_normalize(adapter,
638 CRB_NIC_CAPABILITIES_FW);
639 adapter->msi_mode = adapter->pci_read_normalize(adapter,
640 CRB_NIC_MSI_MODE_FW);
641 adapter->crb_intr_mask = sw_int_mask[adapter->portnum];
642
643 err = netxen_init_old_ctx(adapter);
644 if (err) {
645 netxen_free_hw_resources(adapter);
646 return err;
647 }
648
649 }
650
651 return 0;
652
653err_out_free:
654 netxen_free_hw_resources(adapter);
655 return err;
656}
657
658void netxen_free_hw_resources(struct netxen_adapter *adapter)
659{
660 struct netxen_recv_context *recv_ctx;
661 struct nx_host_rds_ring *rds_ring;
662 int ctx, ring;
663
664 if (adapter->fw_major >= 4) {
665 nx_fw_cmd_destroy_tx_ctx(adapter);
666 nx_fw_cmd_destroy_rx_ctx(adapter);
667 }
668
669 if (adapter->ctx_desc != NULL) {
670 pci_free_consistent(adapter->pdev,
671 sizeof(struct netxen_ring_ctx) +
672 sizeof(uint32_t),
673 adapter->ctx_desc,
674 adapter->ctx_desc_phys_addr);
675 adapter->ctx_desc = NULL;
676 }
677
678 if (adapter->ahw.cmd_desc_head != NULL) {
679 pci_free_consistent(adapter->pdev,
680 sizeof(struct cmd_desc_type0) *
681 adapter->max_tx_desc_count,
682 adapter->ahw.cmd_desc_head,
683 adapter->ahw.cmd_desc_phys_addr);
684 adapter->ahw.cmd_desc_head = NULL;
685 }
686
687 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
688 recv_ctx = &adapter->recv_ctx[ctx];
689 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
690 rds_ring = &recv_ctx->rds_rings[ring];
691
692 if (rds_ring->desc_head != NULL) {
693 pci_free_consistent(adapter->pdev,
694 RCV_DESC_RINGSIZE,
695 rds_ring->desc_head,
696 rds_ring->phys_addr);
697 rds_ring->desc_head = NULL;
698 }
699 }
700
701 if (recv_ctx->rcv_status_desc_head != NULL) {
702 pci_free_consistent(adapter->pdev,
703 STATUS_DESC_RINGSIZE,
704 recv_ctx->rcv_status_desc_head,
705 recv_ctx->rcv_status_desc_phys_addr);
706 recv_ctx->rcv_status_desc_head = NULL;
707 }
708 }
709}
710
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c
index 723487bf200c..48ee06b6f4e9 100644
--- a/drivers/net/netxen/netxen_nic_ethtool.c
+++ b/drivers/net/netxen/netxen_nic_ethtool.c
@@ -93,17 +93,21 @@ static void
93netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) 93netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
94{ 94{
95 struct netxen_adapter *adapter = netdev_priv(dev); 95 struct netxen_adapter *adapter = netdev_priv(dev);
96 unsigned long flags;
96 u32 fw_major = 0; 97 u32 fw_major = 0;
97 u32 fw_minor = 0; 98 u32 fw_minor = 0;
98 u32 fw_build = 0; 99 u32 fw_build = 0;
99 100
100 strncpy(drvinfo->driver, netxen_nic_driver_name, 32); 101 strncpy(drvinfo->driver, netxen_nic_driver_name, 32);
101 strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32); 102 strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32);
102 fw_major = readl(NETXEN_CRB_NORMALIZE(adapter, 103 write_lock_irqsave(&adapter->adapter_lock, flags);
103 NETXEN_FW_VERSION_MAJOR)); 104 fw_major = adapter->pci_read_normalize(adapter,
104 fw_minor = readl(NETXEN_CRB_NORMALIZE(adapter, 105 NETXEN_FW_VERSION_MAJOR);
105 NETXEN_FW_VERSION_MINOR)); 106 fw_minor = adapter->pci_read_normalize(adapter,
106 fw_build = readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); 107 NETXEN_FW_VERSION_MINOR);
108 fw_build = adapter->pci_read_normalize(adapter,
109 NETXEN_FW_VERSION_SUB);
110 write_unlock_irqrestore(&adapter->adapter_lock, flags);
107 sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); 111 sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build);
108 112
109 strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); 113 strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
@@ -159,9 +163,16 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
159 switch ((netxen_brdtype_t) boardinfo->board_type) { 163 switch ((netxen_brdtype_t) boardinfo->board_type) {
160 case NETXEN_BRDTYPE_P2_SB35_4G: 164 case NETXEN_BRDTYPE_P2_SB35_4G:
161 case NETXEN_BRDTYPE_P2_SB31_2G: 165 case NETXEN_BRDTYPE_P2_SB31_2G:
166 case NETXEN_BRDTYPE_P3_REF_QG:
167 case NETXEN_BRDTYPE_P3_4_GB:
168 case NETXEN_BRDTYPE_P3_4_GB_MM:
169 case NETXEN_BRDTYPE_P3_10000_BASE_T:
170
162 ecmd->supported |= SUPPORTED_Autoneg; 171 ecmd->supported |= SUPPORTED_Autoneg;
163 ecmd->advertising |= ADVERTISED_Autoneg; 172 ecmd->advertising |= ADVERTISED_Autoneg;
164 case NETXEN_BRDTYPE_P2_SB31_10G_CX4: 173 case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
174 case NETXEN_BRDTYPE_P3_10G_CX4:
175 case NETXEN_BRDTYPE_P3_10G_CX4_LP:
165 ecmd->supported |= SUPPORTED_TP; 176 ecmd->supported |= SUPPORTED_TP;
166 ecmd->advertising |= ADVERTISED_TP; 177 ecmd->advertising |= ADVERTISED_TP;
167 ecmd->port = PORT_TP; 178 ecmd->port = PORT_TP;
@@ -171,12 +182,17 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
171 break; 182 break;
172 case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: 183 case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
173 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: 184 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
185 case NETXEN_BRDTYPE_P3_IMEZ:
186 case NETXEN_BRDTYPE_P3_XG_LOM:
187 case NETXEN_BRDTYPE_P3_HMEZ:
174 ecmd->supported |= SUPPORTED_MII; 188 ecmd->supported |= SUPPORTED_MII;
175 ecmd->advertising |= ADVERTISED_MII; 189 ecmd->advertising |= ADVERTISED_MII;
176 ecmd->port = PORT_FIBRE; 190 ecmd->port = PORT_FIBRE;
177 ecmd->autoneg = AUTONEG_DISABLE; 191 ecmd->autoneg = AUTONEG_DISABLE;
178 break; 192 break;
179 case NETXEN_BRDTYPE_P2_SB31_10G: 193 case NETXEN_BRDTYPE_P2_SB31_10G:
194 case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
195 case NETXEN_BRDTYPE_P3_10G_XFP:
180 ecmd->supported |= SUPPORTED_FIBRE; 196 ecmd->supported |= SUPPORTED_FIBRE;
181 ecmd->advertising |= ADVERTISED_FIBRE; 197 ecmd->advertising |= ADVERTISED_FIBRE;
182 ecmd->port = PORT_FIBRE; 198 ecmd->port = PORT_FIBRE;
@@ -349,19 +365,18 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
349{ 365{
350 struct netxen_adapter *adapter = netdev_priv(dev); 366 struct netxen_adapter *adapter = netdev_priv(dev);
351 __u32 mode, *regs_buff = p; 367 __u32 mode, *regs_buff = p;
352 void __iomem *addr;
353 int i, window; 368 int i, window;
354 369
355 memset(p, 0, NETXEN_NIC_REGS_LEN); 370 memset(p, 0, NETXEN_NIC_REGS_LEN);
356 regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | 371 regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) |
357 (adapter->pdev)->device; 372 (adapter->pdev)->device;
358 /* which mode */ 373 /* which mode */
359 NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_MODE, &regs_buff[0]); 374 adapter->hw_read_wx(adapter, NETXEN_NIU_MODE, &regs_buff[0], 4);
360 mode = regs_buff[0]; 375 mode = regs_buff[0];
361 376
362 /* Common registers to all the modes */ 377 /* Common registers to all the modes */
363 NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_STRAP_VALUE_SAVE_HIGHER, 378 adapter->hw_read_wx(adapter,
364 &regs_buff[2]); 379 NETXEN_NIU_STRAP_VALUE_SAVE_HIGHER, &regs_buff[2], 4);
365 /* GB/XGB Mode */ 380 /* GB/XGB Mode */
366 mode = (mode / 2) - 1; 381 mode = (mode / 2) - 1;
367 window = 0; 382 window = 0;
@@ -372,9 +387,9 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
372 window = adapter->physical_port * 387 window = adapter->physical_port *
373 NETXEN_NIC_PORT_WINDOW; 388 NETXEN_NIC_PORT_WINDOW;
374 389
375 NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. 390 adapter->hw_read_wx(adapter,
376 reg[i - 3] + window, 391 niu_registers[mode].reg[i - 3] + window,
377 &regs_buff[i]); 392 &regs_buff[i], 4);
378 } 393 }
379 394
380 } 395 }
@@ -398,7 +413,7 @@ static u32 netxen_nic_test_link(struct net_device *dev)
398 return !val; 413 return !val;
399 } 414 }
400 } else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) { 415 } else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
401 val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); 416 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE);
402 return (val == XG_LINK_UP) ? 0 : 1; 417 return (val == XG_LINK_UP) ? 0 : 1;
403 } 418 }
404 return -EIO; 419 return -EIO;
@@ -427,6 +442,7 @@ netxen_nic_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
427 return 0; 442 return 0;
428} 443}
429 444
445#if 0
430static int 446static int
431netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, 447netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
432 u8 * bytes) 448 u8 * bytes)
@@ -447,7 +463,6 @@ netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
447 } 463 }
448 printk(KERN_INFO "%s: flash unlocked. \n", 464 printk(KERN_INFO "%s: flash unlocked. \n",
449 netxen_nic_driver_name); 465 netxen_nic_driver_name);
450 last_schedule_time = jiffies;
451 ret = netxen_flash_erase_secondary(adapter); 466 ret = netxen_flash_erase_secondary(adapter);
452 if (ret != FLASH_SUCCESS) { 467 if (ret != FLASH_SUCCESS) {
453 printk(KERN_ERR "%s: Flash erase failed.\n", 468 printk(KERN_ERR "%s: Flash erase failed.\n",
@@ -497,6 +512,7 @@ netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
497 512
498 return netxen_rom_fast_write_words(adapter, offset, bytes, eeprom->len); 513 return netxen_rom_fast_write_words(adapter, offset, bytes, eeprom->len);
499} 514}
515#endif /* 0 */
500 516
501static void 517static void
502netxen_nic_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring) 518netxen_nic_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
@@ -508,9 +524,9 @@ netxen_nic_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
508 ring->rx_jumbo_pending = 0; 524 ring->rx_jumbo_pending = 0;
509 for (i = 0; i < MAX_RCV_CTX; ++i) { 525 for (i = 0; i < MAX_RCV_CTX; ++i) {
510 ring->rx_pending += adapter->recv_ctx[i]. 526 ring->rx_pending += adapter->recv_ctx[i].
511 rcv_desc[RCV_DESC_NORMAL_CTXID].max_rx_desc_count; 527 rds_rings[RCV_DESC_NORMAL_CTXID].max_rx_desc_count;
512 ring->rx_jumbo_pending += adapter->recv_ctx[i]. 528 ring->rx_jumbo_pending += adapter->recv_ctx[i].
513 rcv_desc[RCV_DESC_JUMBO_CTXID].max_rx_desc_count; 529 rds_rings[RCV_DESC_JUMBO_CTXID].max_rx_desc_count;
514 } 530 }
515 ring->tx_pending = adapter->max_tx_desc_count; 531 ring->tx_pending = adapter->max_tx_desc_count;
516 532
@@ -655,7 +671,7 @@ static int netxen_nic_reg_test(struct net_device *dev)
655 data_written = (u32)0xa5a5a5a5; 671 data_written = (u32)0xa5a5a5a5;
656 672
657 netxen_nic_reg_write(adapter, CRB_SCRATCHPAD_TEST, data_written); 673 netxen_nic_reg_write(adapter, CRB_SCRATCHPAD_TEST, data_written);
658 data_read = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_SCRATCHPAD_TEST)); 674 data_read = adapter->pci_read_normalize(adapter, CRB_SCRATCHPAD_TEST);
659 if (data_written != data_read) 675 if (data_written != data_read)
660 return 1; 676 return 1;
661 677
@@ -736,6 +752,117 @@ static int netxen_nic_set_rx_csum(struct net_device *dev, u32 data)
736 return 0; 752 return 0;
737} 753}
738 754
755static u32 netxen_nic_get_tso(struct net_device *dev)
756{
757 struct netxen_adapter *adapter = netdev_priv(dev);
758
759 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
760 return (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) != 0;
761
762 return (dev->features & NETIF_F_TSO) != 0;
763}
764
765static int netxen_nic_set_tso(struct net_device *dev, u32 data)
766{
767 if (data) {
768 struct netxen_adapter *adapter = netdev_priv(dev);
769
770 dev->features |= NETIF_F_TSO;
771 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
772 dev->features |= NETIF_F_TSO6;
773 } else
774 dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
775
776 return 0;
777}
778
779/*
780 * Set the coalescing parameters. Currently only normal is supported.
781 * If rx_coalesce_usecs == 0 or rx_max_coalesced_frames == 0 then set the
782 * firmware coalescing to default.
783 */
784static int netxen_set_intr_coalesce(struct net_device *netdev,
785 struct ethtool_coalesce *ethcoal)
786{
787 struct netxen_adapter *adapter = netdev_priv(netdev);
788
789 if (!NX_IS_REVISION_P3(adapter->ahw.revision_id))
790 return -EINVAL;
791
792 if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
793 return -EINVAL;
794
795 /*
796 * Return Error if unsupported values or
797 * unsupported parameters are set.
798 */
799 if (ethcoal->rx_coalesce_usecs > 0xffff ||
800 ethcoal->rx_max_coalesced_frames > 0xffff ||
801 ethcoal->tx_coalesce_usecs > 0xffff ||
802 ethcoal->tx_max_coalesced_frames > 0xffff ||
803 ethcoal->rx_coalesce_usecs_irq ||
804 ethcoal->rx_max_coalesced_frames_irq ||
805 ethcoal->tx_coalesce_usecs_irq ||
806 ethcoal->tx_max_coalesced_frames_irq ||
807 ethcoal->stats_block_coalesce_usecs ||
808 ethcoal->use_adaptive_rx_coalesce ||
809 ethcoal->use_adaptive_tx_coalesce ||
810 ethcoal->pkt_rate_low ||
811 ethcoal->rx_coalesce_usecs_low ||
812 ethcoal->rx_max_coalesced_frames_low ||
813 ethcoal->tx_coalesce_usecs_low ||
814 ethcoal->tx_max_coalesced_frames_low ||
815 ethcoal->pkt_rate_high ||
816 ethcoal->rx_coalesce_usecs_high ||
817 ethcoal->rx_max_coalesced_frames_high ||
818 ethcoal->tx_coalesce_usecs_high ||
819 ethcoal->tx_max_coalesced_frames_high)
820 return -EINVAL;
821
822 if (!ethcoal->rx_coalesce_usecs ||
823 !ethcoal->rx_max_coalesced_frames) {
824 adapter->coal.flags = NETXEN_NIC_INTR_DEFAULT;
825 adapter->coal.normal.data.rx_time_us =
826 NETXEN_DEFAULT_INTR_COALESCE_RX_TIME_US;
827 adapter->coal.normal.data.rx_packets =
828 NETXEN_DEFAULT_INTR_COALESCE_RX_PACKETS;
829 } else {
830 adapter->coal.flags = 0;
831 adapter->coal.normal.data.rx_time_us =
832 ethcoal->rx_coalesce_usecs;
833 adapter->coal.normal.data.rx_packets =
834 ethcoal->rx_max_coalesced_frames;
835 }
836 adapter->coal.normal.data.tx_time_us = ethcoal->tx_coalesce_usecs;
837 adapter->coal.normal.data.tx_packets =
838 ethcoal->tx_max_coalesced_frames;
839
840 netxen_config_intr_coalesce(adapter);
841
842 return 0;
843}
844
845static int netxen_get_intr_coalesce(struct net_device *netdev,
846 struct ethtool_coalesce *ethcoal)
847{
848 struct netxen_adapter *adapter = netdev_priv(netdev);
849
850 if (!NX_IS_REVISION_P3(adapter->ahw.revision_id))
851 return -EINVAL;
852
853 if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
854 return -EINVAL;
855
856 ethcoal->rx_coalesce_usecs = adapter->coal.normal.data.rx_time_us;
857 ethcoal->tx_coalesce_usecs = adapter->coal.normal.data.tx_time_us;
858 ethcoal->rx_max_coalesced_frames =
859 adapter->coal.normal.data.rx_packets;
860 ethcoal->tx_max_coalesced_frames =
861 adapter->coal.normal.data.tx_packets;
862
863 return 0;
864}
865
739struct ethtool_ops netxen_nic_ethtool_ops = { 866struct ethtool_ops netxen_nic_ethtool_ops = {
740 .get_settings = netxen_nic_get_settings, 867 .get_settings = netxen_nic_get_settings,
741 .set_settings = netxen_nic_set_settings, 868 .set_settings = netxen_nic_set_settings,
@@ -745,17 +872,22 @@ struct ethtool_ops netxen_nic_ethtool_ops = {
745 .get_link = ethtool_op_get_link, 872 .get_link = ethtool_op_get_link,
746 .get_eeprom_len = netxen_nic_get_eeprom_len, 873 .get_eeprom_len = netxen_nic_get_eeprom_len,
747 .get_eeprom = netxen_nic_get_eeprom, 874 .get_eeprom = netxen_nic_get_eeprom,
875#if 0
748 .set_eeprom = netxen_nic_set_eeprom, 876 .set_eeprom = netxen_nic_set_eeprom,
877#endif
749 .get_ringparam = netxen_nic_get_ringparam, 878 .get_ringparam = netxen_nic_get_ringparam,
750 .get_pauseparam = netxen_nic_get_pauseparam, 879 .get_pauseparam = netxen_nic_get_pauseparam,
751 .set_pauseparam = netxen_nic_set_pauseparam, 880 .set_pauseparam = netxen_nic_set_pauseparam,
752 .set_tx_csum = ethtool_op_set_tx_csum, 881 .set_tx_csum = ethtool_op_set_tx_csum,
753 .set_sg = ethtool_op_set_sg, 882 .set_sg = ethtool_op_set_sg,
754 .set_tso = ethtool_op_set_tso, 883 .get_tso = netxen_nic_get_tso,
884 .set_tso = netxen_nic_set_tso,
755 .self_test = netxen_nic_diag_test, 885 .self_test = netxen_nic_diag_test,
756 .get_strings = netxen_nic_get_strings, 886 .get_strings = netxen_nic_get_strings,
757 .get_ethtool_stats = netxen_nic_get_ethtool_stats, 887 .get_ethtool_stats = netxen_nic_get_ethtool_stats,
758 .get_sset_count = netxen_get_sset_count, 888 .get_sset_count = netxen_get_sset_count,
759 .get_rx_csum = netxen_nic_get_rx_csum, 889 .get_rx_csum = netxen_nic_get_rx_csum,
760 .set_rx_csum = netxen_nic_set_rx_csum, 890 .set_rx_csum = netxen_nic_set_rx_csum,
891 .get_coalesce = netxen_get_intr_coalesce,
892 .set_coalesce = netxen_set_intr_coalesce,
761}; 893};
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h
index 24d027e29c45..3ce13e451aac 100644
--- a/drivers/net/netxen/netxen_nic_hdr.h
+++ b/drivers/net/netxen/netxen_nic_hdr.h
@@ -126,7 +126,8 @@ enum {
126 NETXEN_HW_PEGR0_CRB_AGT_ADR, 126 NETXEN_HW_PEGR0_CRB_AGT_ADR,
127 NETXEN_HW_PEGR1_CRB_AGT_ADR, 127 NETXEN_HW_PEGR1_CRB_AGT_ADR,
128 NETXEN_HW_PEGR2_CRB_AGT_ADR, 128 NETXEN_HW_PEGR2_CRB_AGT_ADR,
129 NETXEN_HW_PEGR3_CRB_AGT_ADR 129 NETXEN_HW_PEGR3_CRB_AGT_ADR,
130 NETXEN_HW_PEGN4_CRB_AGT_ADR
130}; 131};
131 132
132/* Hub 5 */ 133/* Hub 5 */
@@ -316,6 +317,8 @@ enum {
316 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGN2_CRB_AGT_ADR) 317 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGN2_CRB_AGT_ADR)
317#define NETXEN_HW_CRB_HUB_AGT_ADR_PGN3 \ 318#define NETXEN_HW_CRB_HUB_AGT_ADR_PGN3 \
318 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGN3_CRB_AGT_ADR) 319 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGN3_CRB_AGT_ADR)
320#define NETXEN_HW_CRB_HUB_AGT_ADR_PGN4 \
321 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGN4_CRB_AGT_ADR)
319#define NETXEN_HW_CRB_HUB_AGT_ADR_PGNC \ 322#define NETXEN_HW_CRB_HUB_AGT_ADR_PGNC \
320 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGNC_CRB_AGT_ADR) 323 ((NETXEN_HW_H4_CH_HUB_ADR << 7) | NETXEN_HW_PEGNC_CRB_AGT_ADR)
321#define NETXEN_HW_CRB_HUB_AGT_ADR_PGR0 \ 324#define NETXEN_HW_CRB_HUB_AGT_ADR_PGR0 \
@@ -435,6 +438,7 @@ enum {
435#define NETXEN_CRB_ROMUSB \ 438#define NETXEN_CRB_ROMUSB \
436 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_ROMUSB) 439 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_ROMUSB)
437#define NETXEN_CRB_I2Q NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_I2Q) 440#define NETXEN_CRB_I2Q NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_I2Q)
441#define NETXEN_CRB_SMB NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_SMB)
438#define NETXEN_CRB_MAX NETXEN_PCI_CRB_WINDOW(64) 442#define NETXEN_CRB_MAX NETXEN_PCI_CRB_WINDOW(64)
439 443
440#define NETXEN_CRB_PCIX_HOST NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PH) 444#define NETXEN_CRB_PCIX_HOST NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PH)
@@ -446,6 +450,7 @@ enum {
446#define NETXEN_CRB_PEG_NET_D NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGND) 450#define NETXEN_CRB_PEG_NET_D NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGND)
447#define NETXEN_CRB_PEG_NET_I NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGNI) 451#define NETXEN_CRB_PEG_NET_I NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGNI)
448#define NETXEN_CRB_DDR_NET NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_MN) 452#define NETXEN_CRB_DDR_NET NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_MN)
453#define NETXEN_CRB_QDR_NET NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_SN)
449 454
450#define NETXEN_CRB_PCIX_MD NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PS) 455#define NETXEN_CRB_PCIX_MD NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PS)
451#define NETXEN_CRB_PCIE NETXEN_CRB_PCIX_MD 456#define NETXEN_CRB_PCIE NETXEN_CRB_PCIX_MD
@@ -461,11 +466,20 @@ enum {
461#define ISR_INT_TARGET_MASK_F2 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F2)) 466#define ISR_INT_TARGET_MASK_F2 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F2))
462#define ISR_INT_TARGET_STATUS_F3 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F3)) 467#define ISR_INT_TARGET_STATUS_F3 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F3))
463#define ISR_INT_TARGET_MASK_F3 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F3)) 468#define ISR_INT_TARGET_MASK_F3 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F3))
469#define ISR_INT_TARGET_STATUS_F4 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F4))
470#define ISR_INT_TARGET_MASK_F4 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F4))
471#define ISR_INT_TARGET_STATUS_F5 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F5))
472#define ISR_INT_TARGET_MASK_F5 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F5))
473#define ISR_INT_TARGET_STATUS_F6 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F6))
474#define ISR_INT_TARGET_MASK_F6 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F6))
475#define ISR_INT_TARGET_STATUS_F7 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F7))
476#define ISR_INT_TARGET_MASK_F7 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F7))
464 477
465#define NETXEN_PCI_MAPSIZE 128 478#define NETXEN_PCI_MAPSIZE 128
466#define NETXEN_PCI_DDR_NET (0x00000000UL) 479#define NETXEN_PCI_DDR_NET (0x00000000UL)
467#define NETXEN_PCI_QDR_NET (0x04000000UL) 480#define NETXEN_PCI_QDR_NET (0x04000000UL)
468#define NETXEN_PCI_DIRECT_CRB (0x04400000UL) 481#define NETXEN_PCI_DIRECT_CRB (0x04400000UL)
482#define NETXEN_PCI_CAMQM (0x04800000UL)
469#define NETXEN_PCI_CAMQM_MAX (0x04ffffffUL) 483#define NETXEN_PCI_CAMQM_MAX (0x04ffffffUL)
470#define NETXEN_PCI_OCM0 (0x05000000UL) 484#define NETXEN_PCI_OCM0 (0x05000000UL)
471#define NETXEN_PCI_OCM0_MAX (0x050fffffUL) 485#define NETXEN_PCI_OCM0_MAX (0x050fffffUL)
@@ -474,6 +488,13 @@ enum {
474#define NETXEN_PCI_CRBSPACE (0x06000000UL) 488#define NETXEN_PCI_CRBSPACE (0x06000000UL)
475#define NETXEN_PCI_128MB_SIZE (0x08000000UL) 489#define NETXEN_PCI_128MB_SIZE (0x08000000UL)
476#define NETXEN_PCI_32MB_SIZE (0x02000000UL) 490#define NETXEN_PCI_32MB_SIZE (0x02000000UL)
491#define NETXEN_PCI_2MB_SIZE (0x00200000UL)
492
493#define NETXEN_PCI_MN_2M (0)
494#define NETXEN_PCI_MS_2M (0x80000)
495#define NETXEN_PCI_OCM0_2M (0x000c0000UL)
496#define NETXEN_PCI_CAMQM_2M_BASE (0x000ff800UL)
497#define NETXEN_PCI_CAMQM_2M_END (0x04800800UL)
477 498
478#define NETXEN_CRB_CAM NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_CAM) 499#define NETXEN_CRB_CAM NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_CAM)
479 500
@@ -484,7 +505,14 @@ enum {
484#define NETXEN_ADDR_OCM1 (0x0000000200400000ULL) 505#define NETXEN_ADDR_OCM1 (0x0000000200400000ULL)
485#define NETXEN_ADDR_OCM1_MAX (0x00000002004fffffULL) 506#define NETXEN_ADDR_OCM1_MAX (0x00000002004fffffULL)
486#define NETXEN_ADDR_QDR_NET (0x0000000300000000ULL) 507#define NETXEN_ADDR_QDR_NET (0x0000000300000000ULL)
487#define NETXEN_ADDR_QDR_NET_MAX (0x00000003003fffffULL) 508#define NETXEN_ADDR_QDR_NET_MAX_P2 (0x00000003003fffffULL)
509#define NETXEN_ADDR_QDR_NET_MAX_P3 (0x0000000303ffffffULL)
510
511/*
512 * Register offsets for MN
513 */
514#define NETXEN_MIU_CONTROL (0x000)
515#define NETXEN_MIU_MN_CONTROL (NETXEN_CRB_DDR_NET+NETXEN_MIU_CONTROL)
488 516
489 /* 200ms delay in each loop */ 517 /* 200ms delay in each loop */
490#define NETXEN_NIU_PHY_WAITLEN 200000 518#define NETXEN_NIU_PHY_WAITLEN 200000
@@ -550,6 +578,9 @@ enum {
550#define NETXEN_MULTICAST_ADDR_HI_2 (NETXEN_CRB_NIU + 0x1018) 578#define NETXEN_MULTICAST_ADDR_HI_2 (NETXEN_CRB_NIU + 0x1018)
551#define NETXEN_MULTICAST_ADDR_HI_3 (NETXEN_CRB_NIU + 0x101c) 579#define NETXEN_MULTICAST_ADDR_HI_3 (NETXEN_CRB_NIU + 0x101c)
552 580
581#define NETXEN_UNICAST_ADDR_BASE (NETXEN_CRB_NIU + 0x1080)
582#define NETXEN_MULTICAST_ADDR_BASE (NETXEN_CRB_NIU + 0x1100)
583
553#define NETXEN_NIU_GB_MAC_CONFIG_0(I) \ 584#define NETXEN_NIU_GB_MAC_CONFIG_0(I) \
554 (NETXEN_CRB_NIU + 0x30000 + (I)*0x10000) 585 (NETXEN_CRB_NIU + 0x30000 + (I)*0x10000)
555#define NETXEN_NIU_GB_MAC_CONFIG_1(I) \ 586#define NETXEN_NIU_GB_MAC_CONFIG_1(I) \
@@ -630,16 +661,76 @@ enum {
630#define NETXEN_NIU_XG1_CONTROL_CHAR_CNT (NETXEN_CRB_NIU + 0x80054) 661#define NETXEN_NIU_XG1_CONTROL_CHAR_CNT (NETXEN_CRB_NIU + 0x80054)
631#define NETXEN_NIU_XG1_PAUSE_FRAME_CNT (NETXEN_CRB_NIU + 0x80058) 662#define NETXEN_NIU_XG1_PAUSE_FRAME_CNT (NETXEN_CRB_NIU + 0x80058)
632 663
664/* P3 802.3ap */
665#define NETXEN_NIU_AP_MAC_CONFIG_0(I) (NETXEN_CRB_NIU+0xa0000+(I)*0x10000)
666#define NETXEN_NIU_AP_MAC_CONFIG_1(I) (NETXEN_CRB_NIU+0xa0004+(I)*0x10000)
667#define NETXEN_NIU_AP_MAC_IPG_IFG(I) (NETXEN_CRB_NIU+0xa0008+(I)*0x10000)
668#define NETXEN_NIU_AP_HALF_DUPLEX_CTRL(I) (NETXEN_CRB_NIU+0xa000c+(I)*0x10000)
669#define NETXEN_NIU_AP_MAX_FRAME_SIZE(I) (NETXEN_CRB_NIU+0xa0010+(I)*0x10000)
670#define NETXEN_NIU_AP_TEST_REG(I) (NETXEN_CRB_NIU+0xa001c+(I)*0x10000)
671#define NETXEN_NIU_AP_MII_MGMT_CONFIG(I) (NETXEN_CRB_NIU+0xa0020+(I)*0x10000)
672#define NETXEN_NIU_AP_MII_MGMT_COMMAND(I) (NETXEN_CRB_NIU+0xa0024+(I)*0x10000)
673#define NETXEN_NIU_AP_MII_MGMT_ADDR(I) (NETXEN_CRB_NIU+0xa0028+(I)*0x10000)
674#define NETXEN_NIU_AP_MII_MGMT_CTRL(I) (NETXEN_CRB_NIU+0xa002c+(I)*0x10000)
675#define NETXEN_NIU_AP_MII_MGMT_STATUS(I) (NETXEN_CRB_NIU+0xa0030+(I)*0x10000)
676#define NETXEN_NIU_AP_MII_MGMT_INDICATE(I) (NETXEN_CRB_NIU+0xa0034+(I)*0x10000)
677#define NETXEN_NIU_AP_INTERFACE_CTRL(I) (NETXEN_CRB_NIU+0xa0038+(I)*0x10000)
678#define NETXEN_NIU_AP_INTERFACE_STATUS(I) (NETXEN_CRB_NIU+0xa003c+(I)*0x10000)
679#define NETXEN_NIU_AP_STATION_ADDR_0(I) (NETXEN_CRB_NIU+0xa0040+(I)*0x10000)
680#define NETXEN_NIU_AP_STATION_ADDR_1(I) (NETXEN_CRB_NIU+0xa0044+(I)*0x10000)
681
682/*
683 * Register offsets for MN
684 */
685#define MIU_CONTROL (0x000)
686#define MIU_TEST_AGT_CTRL (0x090)
687#define MIU_TEST_AGT_ADDR_LO (0x094)
688#define MIU_TEST_AGT_ADDR_HI (0x098)
689#define MIU_TEST_AGT_WRDATA_LO (0x0a0)
690#define MIU_TEST_AGT_WRDATA_HI (0x0a4)
691#define MIU_TEST_AGT_WRDATA(i) (0x0a0+(4*(i)))
692#define MIU_TEST_AGT_RDDATA_LO (0x0a8)
693#define MIU_TEST_AGT_RDDATA_HI (0x0ac)
694#define MIU_TEST_AGT_RDDATA(i) (0x0a8+(4*(i)))
695#define MIU_TEST_AGT_ADDR_MASK 0xfffffff8
696#define MIU_TEST_AGT_UPPER_ADDR(off) (0)
697
698/* MIU_TEST_AGT_CTRL flags. work for SIU as well */
699#define MIU_TA_CTL_START 1
700#define MIU_TA_CTL_ENABLE 2
701#define MIU_TA_CTL_WRITE 4
702#define MIU_TA_CTL_BUSY 8
703
704#define SIU_TEST_AGT_CTRL (0x060)
705#define SIU_TEST_AGT_ADDR_LO (0x064)
706#define SIU_TEST_AGT_ADDR_HI (0x078)
707#define SIU_TEST_AGT_WRDATA_LO (0x068)
708#define SIU_TEST_AGT_WRDATA_HI (0x06c)
709#define SIU_TEST_AGT_WRDATA(i) (0x068+(4*(i)))
710#define SIU_TEST_AGT_RDDATA_LO (0x070)
711#define SIU_TEST_AGT_RDDATA_HI (0x074)
712#define SIU_TEST_AGT_RDDATA(i) (0x070+(4*(i)))
713
714#define SIU_TEST_AGT_ADDR_MASK 0x3ffff8
715#define SIU_TEST_AGT_UPPER_ADDR(off) ((off)>>22)
716
633/* XG Link status */ 717/* XG Link status */
634#define XG_LINK_UP 0x10 718#define XG_LINK_UP 0x10
635#define XG_LINK_DOWN 0x20 719#define XG_LINK_DOWN 0x20
636 720
721#define XG_LINK_UP_P3 0x01
722#define XG_LINK_DOWN_P3 0x02
723#define XG_LINK_STATE_P3_MASK 0xf
724#define XG_LINK_STATE_P3(pcifn,val) \
725 (((val) >> ((pcifn) * 4)) & XG_LINK_STATE_P3_MASK)
726
637#define NETXEN_CAM_RAM_BASE (NETXEN_CRB_CAM + 0x02000) 727#define NETXEN_CAM_RAM_BASE (NETXEN_CRB_CAM + 0x02000)
638#define NETXEN_CAM_RAM(reg) (NETXEN_CAM_RAM_BASE + (reg)) 728#define NETXEN_CAM_RAM(reg) (NETXEN_CAM_RAM_BASE + (reg))
639#define NETXEN_FW_VERSION_MAJOR (NETXEN_CAM_RAM(0x150)) 729#define NETXEN_FW_VERSION_MAJOR (NETXEN_CAM_RAM(0x150))
640#define NETXEN_FW_VERSION_MINOR (NETXEN_CAM_RAM(0x154)) 730#define NETXEN_FW_VERSION_MINOR (NETXEN_CAM_RAM(0x154))
641#define NETXEN_FW_VERSION_SUB (NETXEN_CAM_RAM(0x158)) 731#define NETXEN_FW_VERSION_SUB (NETXEN_CAM_RAM(0x158))
642#define NETXEN_ROM_LOCK_ID (NETXEN_CAM_RAM(0x100)) 732#define NETXEN_ROM_LOCK_ID (NETXEN_CAM_RAM(0x100))
733#define NETXEN_CRB_WIN_LOCK_ID (NETXEN_CAM_RAM(0x124))
643 734
644#define NETXEN_PHY_LOCK_ID (NETXEN_CAM_RAM(0x120)) 735#define NETXEN_PHY_LOCK_ID (NETXEN_CAM_RAM(0x120))
645 736
@@ -654,30 +745,71 @@ enum {
654#define PCIX_INT_VECTOR (0x10100) 745#define PCIX_INT_VECTOR (0x10100)
655#define PCIX_INT_MASK (0x10104) 746#define PCIX_INT_MASK (0x10104)
656 747
657#define PCIX_MN_WINDOW_F0 (0x10200)
658#define PCIX_MN_WINDOW(_f) (PCIX_MN_WINDOW_F0 + (0x20 * (_f)))
659#define PCIX_MS_WINDOW (0x10204)
660#define PCIX_SN_WINDOW_F0 (0x10208)
661#define PCIX_SN_WINDOW(_f) (PCIX_SN_WINDOW_F0 + (0x20 * (_f)))
662#define PCIX_CRB_WINDOW (0x10210) 748#define PCIX_CRB_WINDOW (0x10210)
663#define PCIX_CRB_WINDOW_F0 (0x10210) 749#define PCIX_CRB_WINDOW_F0 (0x10210)
664#define PCIX_CRB_WINDOW_F1 (0x10230) 750#define PCIX_CRB_WINDOW_F1 (0x10230)
665#define PCIX_CRB_WINDOW_F2 (0x10250) 751#define PCIX_CRB_WINDOW_F2 (0x10250)
666#define PCIX_CRB_WINDOW_F3 (0x10270) 752#define PCIX_CRB_WINDOW_F3 (0x10270)
753#define PCIX_CRB_WINDOW_F4 (0x102ac)
754#define PCIX_CRB_WINDOW_F5 (0x102bc)
755#define PCIX_CRB_WINDOW_F6 (0x102cc)
756#define PCIX_CRB_WINDOW_F7 (0x102dc)
757#define PCIE_CRB_WINDOW_REG(func) (((func) < 4) ? \
758 (PCIX_CRB_WINDOW_F0 + (0x20 * (func))) :\
759 (PCIX_CRB_WINDOW_F4 + (0x10 * ((func)-4))))
760
761#define PCIX_MN_WINDOW (0x10200)
762#define PCIX_MN_WINDOW_F0 (0x10200)
763#define PCIX_MN_WINDOW_F1 (0x10220)
764#define PCIX_MN_WINDOW_F2 (0x10240)
765#define PCIX_MN_WINDOW_F3 (0x10260)
766#define PCIX_MN_WINDOW_F4 (0x102a0)
767#define PCIX_MN_WINDOW_F5 (0x102b0)
768#define PCIX_MN_WINDOW_F6 (0x102c0)
769#define PCIX_MN_WINDOW_F7 (0x102d0)
770#define PCIE_MN_WINDOW_REG(func) (((func) < 4) ? \
771 (PCIX_MN_WINDOW_F0 + (0x20 * (func))) :\
772 (PCIX_MN_WINDOW_F4 + (0x10 * ((func)-4))))
773
774#define PCIX_SN_WINDOW (0x10208)
775#define PCIX_SN_WINDOW_F0 (0x10208)
776#define PCIX_SN_WINDOW_F1 (0x10228)
777#define PCIX_SN_WINDOW_F2 (0x10248)
778#define PCIX_SN_WINDOW_F3 (0x10268)
779#define PCIX_SN_WINDOW_F4 (0x102a8)
780#define PCIX_SN_WINDOW_F5 (0x102b8)
781#define PCIX_SN_WINDOW_F6 (0x102c8)
782#define PCIX_SN_WINDOW_F7 (0x102d8)
783#define PCIE_SN_WINDOW_REG(func) (((func) < 4) ? \
784 (PCIX_SN_WINDOW_F0 + (0x20 * (func))) :\
785 (PCIX_SN_WINDOW_F4 + (0x10 * ((func)-4))))
667 786
668#define PCIX_TARGET_STATUS (0x10118) 787#define PCIX_TARGET_STATUS (0x10118)
788#define PCIX_TARGET_STATUS_F1 (0x10160)
789#define PCIX_TARGET_STATUS_F2 (0x10164)
790#define PCIX_TARGET_STATUS_F3 (0x10168)
791#define PCIX_TARGET_STATUS_F4 (0x10360)
792#define PCIX_TARGET_STATUS_F5 (0x10364)
793#define PCIX_TARGET_STATUS_F6 (0x10368)
794#define PCIX_TARGET_STATUS_F7 (0x1036c)
795
669#define PCIX_TARGET_MASK (0x10128) 796#define PCIX_TARGET_MASK (0x10128)
670#define PCIX_TARGET_STATUS_F1 (0x10160) 797#define PCIX_TARGET_MASK_F1 (0x10170)
671#define PCIX_TARGET_MASK_F1 (0x10170) 798#define PCIX_TARGET_MASK_F2 (0x10174)
672#define PCIX_TARGET_STATUS_F2 (0x10164) 799#define PCIX_TARGET_MASK_F3 (0x10178)
673#define PCIX_TARGET_MASK_F2 (0x10174) 800#define PCIX_TARGET_MASK_F4 (0x10370)
674#define PCIX_TARGET_STATUS_F3 (0x10168) 801#define PCIX_TARGET_MASK_F5 (0x10374)
675#define PCIX_TARGET_MASK_F3 (0x10178) 802#define PCIX_TARGET_MASK_F6 (0x10378)
803#define PCIX_TARGET_MASK_F7 (0x1037c)
676 804
677#define PCIX_MSI_F0 (0x13000) 805#define PCIX_MSI_F0 (0x13000)
678#define PCIX_MSI_F1 (0x13004) 806#define PCIX_MSI_F1 (0x13004)
679#define PCIX_MSI_F2 (0x13008) 807#define PCIX_MSI_F2 (0x13008)
680#define PCIX_MSI_F3 (0x1300c) 808#define PCIX_MSI_F3 (0x1300c)
809#define PCIX_MSI_F4 (0x13010)
810#define PCIX_MSI_F5 (0x13014)
811#define PCIX_MSI_F6 (0x13018)
812#define PCIX_MSI_F7 (0x1301c)
681#define PCIX_MSI_F(i) (0x13000+((i)*4)) 813#define PCIX_MSI_F(i) (0x13000+((i)*4))
682 814
683#define PCIX_PS_MEM_SPACE (0x90000) 815#define PCIX_PS_MEM_SPACE (0x90000)
@@ -695,11 +827,102 @@ enum {
695#define PCIE_SEM2_UNLOCK (0x1c014) /* Flash unlock */ 827#define PCIE_SEM2_UNLOCK (0x1c014) /* Flash unlock */
696#define PCIE_SEM3_LOCK (0x1c018) /* Phy lock */ 828#define PCIE_SEM3_LOCK (0x1c018) /* Phy lock */
697#define PCIE_SEM3_UNLOCK (0x1c01c) /* Phy unlock */ 829#define PCIE_SEM3_UNLOCK (0x1c01c) /* Phy unlock */
698 830#define PCIE_SEM5_LOCK (0x1c028) /* API lock */
831#define PCIE_SEM5_UNLOCK (0x1c02c) /* API unlock */
832#define PCIE_SEM6_LOCK (0x1c030) /* sw lock */
833#define PCIE_SEM6_UNLOCK (0x1c034) /* sw unlock */
834#define PCIE_SEM7_LOCK (0x1c038) /* crb win lock */
835#define PCIE_SEM7_UNLOCK (0x1c03c) /* crbwin unlock*/
836
837#define PCIE_SETUP_FUNCTION (0x12040)
838#define PCIE_SETUP_FUNCTION2 (0x12048)
699#define PCIE_TGT_SPLIT_CHICKEN (0x12080) 839#define PCIE_TGT_SPLIT_CHICKEN (0x12080)
840#define PCIE_CHICKEN3 (0x120c8)
700 841
701#define PCIE_MAX_MASTER_SPLIT (0x14048) 842#define PCIE_MAX_MASTER_SPLIT (0x14048)
702 843
844#define NETXEN_PORT_MODE_NONE 0
845#define NETXEN_PORT_MODE_XG 1
846#define NETXEN_PORT_MODE_GB 2
847#define NETXEN_PORT_MODE_802_3_AP 3
848#define NETXEN_PORT_MODE_AUTO_NEG 4
849#define NETXEN_PORT_MODE_AUTO_NEG_1G 5
850#define NETXEN_PORT_MODE_AUTO_NEG_XG 6
851#define NETXEN_PORT_MODE_ADDR (NETXEN_CAM_RAM(0x24))
852#define NETXEN_WOL_PORT_MODE (NETXEN_CAM_RAM(0x198))
853
703#define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL (0x14) 854#define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL (0x14)
704 855
856#define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC)))
857
858/*
859 * PCI Interrupt Vector Values.
860 */
861#define PCIX_INT_VECTOR_BIT_F0 0x0080
862#define PCIX_INT_VECTOR_BIT_F1 0x0100
863#define PCIX_INT_VECTOR_BIT_F2 0x0200
864#define PCIX_INT_VECTOR_BIT_F3 0x0400
865#define PCIX_INT_VECTOR_BIT_F4 0x0800
866#define PCIX_INT_VECTOR_BIT_F5 0x1000
867#define PCIX_INT_VECTOR_BIT_F6 0x2000
868#define PCIX_INT_VECTOR_BIT_F7 0x4000
869
870struct netxen_legacy_intr_set {
871 uint32_t int_vec_bit;
872 uint32_t tgt_status_reg;
873 uint32_t tgt_mask_reg;
874 uint32_t pci_int_reg;
875};
876
877#define NX_LEGACY_INTR_CONFIG \
878{ \
879 { \
880 .int_vec_bit = PCIX_INT_VECTOR_BIT_F0, \
881 .tgt_status_reg = ISR_INT_TARGET_STATUS, \
882 .tgt_mask_reg = ISR_INT_TARGET_MASK, \
883 .pci_int_reg = ISR_MSI_INT_TRIGGER(0) }, \
884 \
885 { \
886 .int_vec_bit = PCIX_INT_VECTOR_BIT_F1, \
887 .tgt_status_reg = ISR_INT_TARGET_STATUS_F1, \
888 .tgt_mask_reg = ISR_INT_TARGET_MASK_F1, \
889 .pci_int_reg = ISR_MSI_INT_TRIGGER(1) }, \
890 \
891 { \
892 .int_vec_bit = PCIX_INT_VECTOR_BIT_F2, \
893 .tgt_status_reg = ISR_INT_TARGET_STATUS_F2, \
894 .tgt_mask_reg = ISR_INT_TARGET_MASK_F2, \
895 .pci_int_reg = ISR_MSI_INT_TRIGGER(2) }, \
896 \
897 { \
898 .int_vec_bit = PCIX_INT_VECTOR_BIT_F3, \
899 .tgt_status_reg = ISR_INT_TARGET_STATUS_F3, \
900 .tgt_mask_reg = ISR_INT_TARGET_MASK_F3, \
901 .pci_int_reg = ISR_MSI_INT_TRIGGER(3) }, \
902 \
903 { \
904 .int_vec_bit = PCIX_INT_VECTOR_BIT_F4, \
905 .tgt_status_reg = ISR_INT_TARGET_STATUS_F4, \
906 .tgt_mask_reg = ISR_INT_TARGET_MASK_F4, \
907 .pci_int_reg = ISR_MSI_INT_TRIGGER(4) }, \
908 \
909 { \
910 .int_vec_bit = PCIX_INT_VECTOR_BIT_F5, \
911 .tgt_status_reg = ISR_INT_TARGET_STATUS_F5, \
912 .tgt_mask_reg = ISR_INT_TARGET_MASK_F5, \
913 .pci_int_reg = ISR_MSI_INT_TRIGGER(5) }, \
914 \
915 { \
916 .int_vec_bit = PCIX_INT_VECTOR_BIT_F6, \
917 .tgt_status_reg = ISR_INT_TARGET_STATUS_F6, \
918 .tgt_mask_reg = ISR_INT_TARGET_MASK_F6, \
919 .pci_int_reg = ISR_MSI_INT_TRIGGER(6) }, \
920 \
921 { \
922 .int_vec_bit = PCIX_INT_VECTOR_BIT_F7, \
923 .tgt_status_reg = ISR_INT_TARGET_STATUS_F7, \
924 .tgt_mask_reg = ISR_INT_TARGET_MASK_F7, \
925 .pci_int_reg = ISR_MSI_INT_TRIGGER(7) }, \
926}
927
705#endif /* __NETXEN_NIC_HDR_H_ */ 928#endif /* __NETXEN_NIC_HDR_H_ */
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index c43d06b8de9b..96a3bc6426e2 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -38,242 +38,262 @@
38 38
39#include <net/ip.h> 39#include <net/ip.h>
40 40
41struct netxen_recv_crb recv_crb_registers[] = { 41#define MASK(n) ((1ULL<<(n))-1)
42 /* 42#define MN_WIN(addr) (((addr & 0x1fc0000) >> 1) | ((addr >> 25) & 0x3ff))
43 * Instance 0. 43#define OCM_WIN(addr) (((addr & 0x1ff0000) >> 1) | ((addr >> 25) & 0x3ff))
44 */ 44#define MS_WIN(addr) (addr & 0x0ffc0000)
45 { 45
46 /* rcv_desc_crb: */ 46#define GET_MEM_OFFS_2M(addr) (addr & MASK(18))
47 { 47
48 { 48#define CRB_BLK(off) ((off >> 20) & 0x3f)
49 /* crb_rcv_producer_offset: */ 49#define CRB_SUBBLK(off) ((off >> 16) & 0xf)
50 NETXEN_NIC_REG(0x100), 50#define CRB_WINDOW_2M (0x130060)
51 /* crb_rcv_consumer_offset: */ 51#define CRB_HI(off) ((crb_hub_agt[CRB_BLK(off)] << 20) | ((off) & 0xf0000))
52 NETXEN_NIC_REG(0x104), 52#define CRB_INDIRECT_2M (0x1e0000UL)
53 /* crb_gloablrcv_ring: */ 53
54 NETXEN_NIC_REG(0x108), 54#define CRB_WIN_LOCK_TIMEOUT 100000000
55 /* crb_rcv_ring_size */ 55static crb_128M_2M_block_map_t crb_128M_2M_map[64] = {
56 NETXEN_NIC_REG(0x10c), 56 {{{0, 0, 0, 0} } }, /* 0: PCI */
57 57 {{{1, 0x0100000, 0x0102000, 0x120000}, /* 1: PCIE */
58 }, 58 {1, 0x0110000, 0x0120000, 0x130000},
59 /* Jumbo frames */ 59 {1, 0x0120000, 0x0122000, 0x124000},
60 { 60 {1, 0x0130000, 0x0132000, 0x126000},
61 /* crb_rcv_producer_offset: */ 61 {1, 0x0140000, 0x0142000, 0x128000},
62 NETXEN_NIC_REG(0x110), 62 {1, 0x0150000, 0x0152000, 0x12a000},
63 /* crb_rcv_consumer_offset: */ 63 {1, 0x0160000, 0x0170000, 0x110000},
64 NETXEN_NIC_REG(0x114), 64 {1, 0x0170000, 0x0172000, 0x12e000},
65 /* crb_gloablrcv_ring: */ 65 {0, 0x0000000, 0x0000000, 0x000000},
66 NETXEN_NIC_REG(0x118), 66 {0, 0x0000000, 0x0000000, 0x000000},
67 /* crb_rcv_ring_size */ 67 {0, 0x0000000, 0x0000000, 0x000000},
68 NETXEN_NIC_REG(0x11c), 68 {0, 0x0000000, 0x0000000, 0x000000},
69 }, 69 {0, 0x0000000, 0x0000000, 0x000000},
70 /* LRO */ 70 {0, 0x0000000, 0x0000000, 0x000000},
71 { 71 {1, 0x01e0000, 0x01e0800, 0x122000},
72 /* crb_rcv_producer_offset: */ 72 {0, 0x0000000, 0x0000000, 0x000000} } },
73 NETXEN_NIC_REG(0x120), 73 {{{1, 0x0200000, 0x0210000, 0x180000} } },/* 2: MN */
74 /* crb_rcv_consumer_offset: */ 74 {{{0, 0, 0, 0} } }, /* 3: */
75 NETXEN_NIC_REG(0x124), 75 {{{1, 0x0400000, 0x0401000, 0x169000} } },/* 4: P2NR1 */
76 /* crb_gloablrcv_ring: */ 76 {{{1, 0x0500000, 0x0510000, 0x140000} } },/* 5: SRE */
77 NETXEN_NIC_REG(0x128), 77 {{{1, 0x0600000, 0x0610000, 0x1c0000} } },/* 6: NIU */
78 /* crb_rcv_ring_size */ 78 {{{1, 0x0700000, 0x0704000, 0x1b8000} } },/* 7: QM */
79 NETXEN_NIC_REG(0x12c), 79 {{{1, 0x0800000, 0x0802000, 0x170000}, /* 8: SQM0 */
80 } 80 {0, 0x0000000, 0x0000000, 0x000000},
81 }, 81 {0, 0x0000000, 0x0000000, 0x000000},
82 /* crb_rcvstatus_ring: */ 82 {0, 0x0000000, 0x0000000, 0x000000},
83 NETXEN_NIC_REG(0x130), 83 {0, 0x0000000, 0x0000000, 0x000000},
84 /* crb_rcv_status_producer: */ 84 {0, 0x0000000, 0x0000000, 0x000000},
85 NETXEN_NIC_REG(0x134), 85 {0, 0x0000000, 0x0000000, 0x000000},
86 /* crb_rcv_status_consumer: */ 86 {0, 0x0000000, 0x0000000, 0x000000},
87 NETXEN_NIC_REG(0x138), 87 {0, 0x0000000, 0x0000000, 0x000000},
88 /* crb_rcvpeg_state: */ 88 {0, 0x0000000, 0x0000000, 0x000000},
89 NETXEN_NIC_REG(0x13c), 89 {0, 0x0000000, 0x0000000, 0x000000},
90 /* crb_status_ring_size */ 90 {0, 0x0000000, 0x0000000, 0x000000},
91 NETXEN_NIC_REG(0x140), 91 {0, 0x0000000, 0x0000000, 0x000000},
92 92 {0, 0x0000000, 0x0000000, 0x000000},
93 }, 93 {0, 0x0000000, 0x0000000, 0x000000},
94 /* 94 {1, 0x08f0000, 0x08f2000, 0x172000} } },
95 * Instance 1, 95 {{{1, 0x0900000, 0x0902000, 0x174000}, /* 9: SQM1*/
96 */ 96 {0, 0x0000000, 0x0000000, 0x000000},
97 { 97 {0, 0x0000000, 0x0000000, 0x000000},
98 /* rcv_desc_crb: */ 98 {0, 0x0000000, 0x0000000, 0x000000},
99 { 99 {0, 0x0000000, 0x0000000, 0x000000},
100 { 100 {0, 0x0000000, 0x0000000, 0x000000},
101 /* crb_rcv_producer_offset: */ 101 {0, 0x0000000, 0x0000000, 0x000000},
102 NETXEN_NIC_REG(0x144), 102 {0, 0x0000000, 0x0000000, 0x000000},
103 /* crb_rcv_consumer_offset: */ 103 {0, 0x0000000, 0x0000000, 0x000000},
104 NETXEN_NIC_REG(0x148), 104 {0, 0x0000000, 0x0000000, 0x000000},
105 /* crb_globalrcv_ring: */ 105 {0, 0x0000000, 0x0000000, 0x000000},
106 NETXEN_NIC_REG(0x14c), 106 {0, 0x0000000, 0x0000000, 0x000000},
107 /* crb_rcv_ring_size */ 107 {0, 0x0000000, 0x0000000, 0x000000},
108 NETXEN_NIC_REG(0x150), 108 {0, 0x0000000, 0x0000000, 0x000000},
109 109 {0, 0x0000000, 0x0000000, 0x000000},
110 }, 110 {1, 0x09f0000, 0x09f2000, 0x176000} } },
111 /* Jumbo frames */ 111 {{{0, 0x0a00000, 0x0a02000, 0x178000}, /* 10: SQM2*/
112 { 112 {0, 0x0000000, 0x0000000, 0x000000},
113 /* crb_rcv_producer_offset: */ 113 {0, 0x0000000, 0x0000000, 0x000000},
114 NETXEN_NIC_REG(0x154), 114 {0, 0x0000000, 0x0000000, 0x000000},
115 /* crb_rcv_consumer_offset: */ 115 {0, 0x0000000, 0x0000000, 0x000000},
116 NETXEN_NIC_REG(0x158), 116 {0, 0x0000000, 0x0000000, 0x000000},
117 /* crb_globalrcv_ring: */ 117 {0, 0x0000000, 0x0000000, 0x000000},
118 NETXEN_NIC_REG(0x15c), 118 {0, 0x0000000, 0x0000000, 0x000000},
119 /* crb_rcv_ring_size */ 119 {0, 0x0000000, 0x0000000, 0x000000},
120 NETXEN_NIC_REG(0x160), 120 {0, 0x0000000, 0x0000000, 0x000000},
121 }, 121 {0, 0x0000000, 0x0000000, 0x000000},
122 /* LRO */ 122 {0, 0x0000000, 0x0000000, 0x000000},
123 { 123 {0, 0x0000000, 0x0000000, 0x000000},
124 /* crb_rcv_producer_offset: */ 124 {0, 0x0000000, 0x0000000, 0x000000},
125 NETXEN_NIC_REG(0x164), 125 {0, 0x0000000, 0x0000000, 0x000000},
126 /* crb_rcv_consumer_offset: */ 126 {1, 0x0af0000, 0x0af2000, 0x17a000} } },
127 NETXEN_NIC_REG(0x168), 127 {{{0, 0x0b00000, 0x0b02000, 0x17c000}, /* 11: SQM3*/
128 /* crb_globalrcv_ring: */ 128 {0, 0x0000000, 0x0000000, 0x000000},
129 NETXEN_NIC_REG(0x16c), 129 {0, 0x0000000, 0x0000000, 0x000000},
130 /* crb_rcv_ring_size */ 130 {0, 0x0000000, 0x0000000, 0x000000},
131 NETXEN_NIC_REG(0x170), 131 {0, 0x0000000, 0x0000000, 0x000000},
132 } 132 {0, 0x0000000, 0x0000000, 0x000000},
133 133 {0, 0x0000000, 0x0000000, 0x000000},
134 }, 134 {0, 0x0000000, 0x0000000, 0x000000},
135 /* crb_rcvstatus_ring: */ 135 {0, 0x0000000, 0x0000000, 0x000000},
136 NETXEN_NIC_REG(0x174), 136 {0, 0x0000000, 0x0000000, 0x000000},
137 /* crb_rcv_status_producer: */ 137 {0, 0x0000000, 0x0000000, 0x000000},
138 NETXEN_NIC_REG(0x178), 138 {0, 0x0000000, 0x0000000, 0x000000},
139 /* crb_rcv_status_consumer: */ 139 {0, 0x0000000, 0x0000000, 0x000000},
140 NETXEN_NIC_REG(0x17c), 140 {0, 0x0000000, 0x0000000, 0x000000},
141 /* crb_rcvpeg_state: */ 141 {0, 0x0000000, 0x0000000, 0x000000},
142 NETXEN_NIC_REG(0x180), 142 {1, 0x0bf0000, 0x0bf2000, 0x17e000} } },
143 /* crb_status_ring_size */ 143 {{{1, 0x0c00000, 0x0c04000, 0x1d4000} } },/* 12: I2Q */
144 NETXEN_NIC_REG(0x184), 144 {{{1, 0x0d00000, 0x0d04000, 0x1a4000} } },/* 13: TMR */
145 }, 145 {{{1, 0x0e00000, 0x0e04000, 0x1a0000} } },/* 14: ROMUSB */
146 /* 146 {{{1, 0x0f00000, 0x0f01000, 0x164000} } },/* 15: PEG4 */
147 * Instance 2, 147 {{{0, 0x1000000, 0x1004000, 0x1a8000} } },/* 16: XDMA */
148 */ 148 {{{1, 0x1100000, 0x1101000, 0x160000} } },/* 17: PEG0 */
149 { 149 {{{1, 0x1200000, 0x1201000, 0x161000} } },/* 18: PEG1 */
150 { 150 {{{1, 0x1300000, 0x1301000, 0x162000} } },/* 19: PEG2 */
151 { 151 {{{1, 0x1400000, 0x1401000, 0x163000} } },/* 20: PEG3 */
152 /* crb_rcv_producer_offset: */ 152 {{{1, 0x1500000, 0x1501000, 0x165000} } },/* 21: P2ND */
153 NETXEN_NIC_REG(0x1d8), 153 {{{1, 0x1600000, 0x1601000, 0x166000} } },/* 22: P2NI */
154 /* crb_rcv_consumer_offset: */ 154 {{{0, 0, 0, 0} } }, /* 23: */
155 NETXEN_NIC_REG(0x1dc), 155 {{{0, 0, 0, 0} } }, /* 24: */
156 /* crb_gloablrcv_ring: */ 156 {{{0, 0, 0, 0} } }, /* 25: */
157 NETXEN_NIC_REG(0x1f0), 157 {{{0, 0, 0, 0} } }, /* 26: */
158 /* crb_rcv_ring_size */ 158 {{{0, 0, 0, 0} } }, /* 27: */
159 NETXEN_NIC_REG(0x1f4), 159 {{{0, 0, 0, 0} } }, /* 28: */
160 }, 160 {{{1, 0x1d00000, 0x1d10000, 0x190000} } },/* 29: MS */
161 /* Jumbo frames */ 161 {{{1, 0x1e00000, 0x1e01000, 0x16a000} } },/* 30: P2NR2 */
162 { 162 {{{1, 0x1f00000, 0x1f10000, 0x150000} } },/* 31: EPG */
163 /* crb_rcv_producer_offset: */ 163 {{{0} } }, /* 32: PCI */
164 NETXEN_NIC_REG(0x1f8), 164 {{{1, 0x2100000, 0x2102000, 0x120000}, /* 33: PCIE */
165 /* crb_rcv_consumer_offset: */ 165 {1, 0x2110000, 0x2120000, 0x130000},
166 NETXEN_NIC_REG(0x1fc), 166 {1, 0x2120000, 0x2122000, 0x124000},
167 /* crb_gloablrcv_ring: */ 167 {1, 0x2130000, 0x2132000, 0x126000},
168 NETXEN_NIC_REG(0x200), 168 {1, 0x2140000, 0x2142000, 0x128000},
169 /* crb_rcv_ring_size */ 169 {1, 0x2150000, 0x2152000, 0x12a000},
170 NETXEN_NIC_REG(0x204), 170 {1, 0x2160000, 0x2170000, 0x110000},
171 }, 171 {1, 0x2170000, 0x2172000, 0x12e000},
172 /* LRO */ 172 {0, 0x0000000, 0x0000000, 0x000000},
173 { 173 {0, 0x0000000, 0x0000000, 0x000000},
174 /* crb_rcv_producer_offset: */ 174 {0, 0x0000000, 0x0000000, 0x000000},
175 NETXEN_NIC_REG(0x208), 175 {0, 0x0000000, 0x0000000, 0x000000},
176 /* crb_rcv_consumer_offset: */ 176 {0, 0x0000000, 0x0000000, 0x000000},
177 NETXEN_NIC_REG(0x20c), 177 {0, 0x0000000, 0x0000000, 0x000000},
178 /* crb_gloablrcv_ring: */ 178 {0, 0x0000000, 0x0000000, 0x000000},
179 NETXEN_NIC_REG(0x210), 179 {0, 0x0000000, 0x0000000, 0x000000} } },
180 /* crb_rcv_ring_size */ 180 {{{1, 0x2200000, 0x2204000, 0x1b0000} } },/* 34: CAM */
181 NETXEN_NIC_REG(0x214), 181 {{{0} } }, /* 35: */
182 } 182 {{{0} } }, /* 36: */
183 }, 183 {{{0} } }, /* 37: */
184 /* crb_rcvstatus_ring: */ 184 {{{0} } }, /* 38: */
185 NETXEN_NIC_REG(0x218), 185 {{{0} } }, /* 39: */
186 /* crb_rcv_status_producer: */ 186 {{{1, 0x2800000, 0x2804000, 0x1a4000} } },/* 40: TMR */
187 NETXEN_NIC_REG(0x21c), 187 {{{1, 0x2900000, 0x2901000, 0x16b000} } },/* 41: P2NR3 */
188 /* crb_rcv_status_consumer: */ 188 {{{1, 0x2a00000, 0x2a00400, 0x1ac400} } },/* 42: RPMX1 */
189 NETXEN_NIC_REG(0x220), 189 {{{1, 0x2b00000, 0x2b00400, 0x1ac800} } },/* 43: RPMX2 */
190 /* crb_rcvpeg_state: */ 190 {{{1, 0x2c00000, 0x2c00400, 0x1acc00} } },/* 44: RPMX3 */
191 NETXEN_NIC_REG(0x224), 191 {{{1, 0x2d00000, 0x2d00400, 0x1ad000} } },/* 45: RPMX4 */
192 /* crb_status_ring_size */ 192 {{{1, 0x2e00000, 0x2e00400, 0x1ad400} } },/* 46: RPMX5 */
193 NETXEN_NIC_REG(0x228), 193 {{{1, 0x2f00000, 0x2f00400, 0x1ad800} } },/* 47: RPMX6 */
194 }, 194 {{{1, 0x3000000, 0x3000400, 0x1adc00} } },/* 48: RPMX7 */
195 /* 195 {{{0, 0x3100000, 0x3104000, 0x1a8000} } },/* 49: XDMA */
196 * Instance 3, 196 {{{1, 0x3200000, 0x3204000, 0x1d4000} } },/* 50: I2Q */
197 */ 197 {{{1, 0x3300000, 0x3304000, 0x1a0000} } },/* 51: ROMUSB */
198 { 198 {{{0} } }, /* 52: */
199 { 199 {{{1, 0x3500000, 0x3500400, 0x1ac000} } },/* 53: RPMX0 */
200 { 200 {{{1, 0x3600000, 0x3600400, 0x1ae000} } },/* 54: RPMX8 */
201 /* crb_rcv_producer_offset: */ 201 {{{1, 0x3700000, 0x3700400, 0x1ae400} } },/* 55: RPMX9 */
202 NETXEN_NIC_REG(0x22c), 202 {{{1, 0x3800000, 0x3804000, 0x1d0000} } },/* 56: OCM0 */
203 /* crb_rcv_consumer_offset: */ 203 {{{1, 0x3900000, 0x3904000, 0x1b4000} } },/* 57: CRYPTO */
204 NETXEN_NIC_REG(0x230), 204 {{{1, 0x3a00000, 0x3a04000, 0x1d8000} } },/* 58: SMB */
205 /* crb_gloablrcv_ring: */ 205 {{{0} } }, /* 59: I2C0 */
206 NETXEN_NIC_REG(0x234), 206 {{{0} } }, /* 60: I2C1 */
207 /* crb_rcv_ring_size */ 207 {{{1, 0x3d00000, 0x3d04000, 0x1d8000} } },/* 61: LPC */
208 NETXEN_NIC_REG(0x238), 208 {{{1, 0x3e00000, 0x3e01000, 0x167000} } },/* 62: P2NC */
209 }, 209 {{{1, 0x3f00000, 0x3f01000, 0x168000} } } /* 63: P2NR0 */
210 /* Jumbo frames */
211 {
212 /* crb_rcv_producer_offset: */
213 NETXEN_NIC_REG(0x23c),
214 /* crb_rcv_consumer_offset: */
215 NETXEN_NIC_REG(0x240),
216 /* crb_gloablrcv_ring: */
217 NETXEN_NIC_REG(0x244),
218 /* crb_rcv_ring_size */
219 NETXEN_NIC_REG(0x248),
220 },
221 /* LRO */
222 {
223 /* crb_rcv_producer_offset: */
224 NETXEN_NIC_REG(0x24c),
225 /* crb_rcv_consumer_offset: */
226 NETXEN_NIC_REG(0x250),
227 /* crb_gloablrcv_ring: */
228 NETXEN_NIC_REG(0x254),
229 /* crb_rcv_ring_size */
230 NETXEN_NIC_REG(0x258),
231 }
232 },
233 /* crb_rcvstatus_ring: */
234 NETXEN_NIC_REG(0x25c),
235 /* crb_rcv_status_producer: */
236 NETXEN_NIC_REG(0x260),
237 /* crb_rcv_status_consumer: */
238 NETXEN_NIC_REG(0x264),
239 /* crb_rcvpeg_state: */
240 NETXEN_NIC_REG(0x268),
241 /* crb_status_ring_size */
242 NETXEN_NIC_REG(0x26c),
243 },
244}; 210};
245 211
246static u64 ctx_addr_sig_regs[][3] = { 212/*
247 {NETXEN_NIC_REG(0x188), NETXEN_NIC_REG(0x18c), NETXEN_NIC_REG(0x1c0)}, 213 * top 12 bits of crb internal address (hub, agent)
248 {NETXEN_NIC_REG(0x190), NETXEN_NIC_REG(0x194), NETXEN_NIC_REG(0x1c4)}, 214 */
249 {NETXEN_NIC_REG(0x198), NETXEN_NIC_REG(0x19c), NETXEN_NIC_REG(0x1c8)}, 215static unsigned crb_hub_agt[64] =
250 {NETXEN_NIC_REG(0x1a0), NETXEN_NIC_REG(0x1a4), NETXEN_NIC_REG(0x1cc)} 216{
217 0,
218 NETXEN_HW_CRB_HUB_AGT_ADR_PS,
219 NETXEN_HW_CRB_HUB_AGT_ADR_MN,
220 NETXEN_HW_CRB_HUB_AGT_ADR_MS,
221 0,
222 NETXEN_HW_CRB_HUB_AGT_ADR_SRE,
223 NETXEN_HW_CRB_HUB_AGT_ADR_NIU,
224 NETXEN_HW_CRB_HUB_AGT_ADR_QMN,
225 NETXEN_HW_CRB_HUB_AGT_ADR_SQN0,
226 NETXEN_HW_CRB_HUB_AGT_ADR_SQN1,
227 NETXEN_HW_CRB_HUB_AGT_ADR_SQN2,
228 NETXEN_HW_CRB_HUB_AGT_ADR_SQN3,
229 NETXEN_HW_CRB_HUB_AGT_ADR_I2Q,
230 NETXEN_HW_CRB_HUB_AGT_ADR_TIMR,
231 NETXEN_HW_CRB_HUB_AGT_ADR_ROMUSB,
232 NETXEN_HW_CRB_HUB_AGT_ADR_PGN4,
233 NETXEN_HW_CRB_HUB_AGT_ADR_XDMA,
234 NETXEN_HW_CRB_HUB_AGT_ADR_PGN0,
235 NETXEN_HW_CRB_HUB_AGT_ADR_PGN1,
236 NETXEN_HW_CRB_HUB_AGT_ADR_PGN2,
237 NETXEN_HW_CRB_HUB_AGT_ADR_PGN3,
238 NETXEN_HW_CRB_HUB_AGT_ADR_PGND,
239 NETXEN_HW_CRB_HUB_AGT_ADR_PGNI,
240 NETXEN_HW_CRB_HUB_AGT_ADR_PGS0,
241 NETXEN_HW_CRB_HUB_AGT_ADR_PGS1,
242 NETXEN_HW_CRB_HUB_AGT_ADR_PGS2,
243 NETXEN_HW_CRB_HUB_AGT_ADR_PGS3,
244 0,
245 NETXEN_HW_CRB_HUB_AGT_ADR_PGSI,
246 NETXEN_HW_CRB_HUB_AGT_ADR_SN,
247 0,
248 NETXEN_HW_CRB_HUB_AGT_ADR_EG,
249 0,
250 NETXEN_HW_CRB_HUB_AGT_ADR_PS,
251 NETXEN_HW_CRB_HUB_AGT_ADR_CAM,
252 0,
253 0,
254 0,
255 0,
256 0,
257 NETXEN_HW_CRB_HUB_AGT_ADR_TIMR,
258 0,
259 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX1,
260 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX2,
261 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX3,
262 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX4,
263 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX5,
264 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX6,
265 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX7,
266 NETXEN_HW_CRB_HUB_AGT_ADR_XDMA,
267 NETXEN_HW_CRB_HUB_AGT_ADR_I2Q,
268 NETXEN_HW_CRB_HUB_AGT_ADR_ROMUSB,
269 0,
270 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX0,
271 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX8,
272 NETXEN_HW_CRB_HUB_AGT_ADR_RPMX9,
273 NETXEN_HW_CRB_HUB_AGT_ADR_OCM0,
274 0,
275 NETXEN_HW_CRB_HUB_AGT_ADR_SMB,
276 NETXEN_HW_CRB_HUB_AGT_ADR_I2C0,
277 NETXEN_HW_CRB_HUB_AGT_ADR_I2C1,
278 0,
279 NETXEN_HW_CRB_HUB_AGT_ADR_PGNC,
280 0,
251}; 281};
252#define CRB_CTX_ADDR_REG_LO(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][0])
253#define CRB_CTX_ADDR_REG_HI(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][2])
254#define CRB_CTX_SIGNATURE_REG(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][1])
255
256 282
257/* PCI Windowing for DDR regions. */ 283/* PCI Windowing for DDR regions. */
258 284
259#define ADDR_IN_RANGE(addr, low, high) \ 285#define ADDR_IN_RANGE(addr, low, high) \
260 (((addr) <= (high)) && ((addr) >= (low))) 286 (((addr) <= (high)) && ((addr) >= (low)))
261 287
262#define NETXEN_FLASH_BASE (NETXEN_BOOTLD_START)
263#define NETXEN_PHANTOM_MEM_BASE (NETXEN_FLASH_BASE)
264#define NETXEN_MAX_MTU 8000 + NETXEN_ENET_HEADER_SIZE + NETXEN_ETH_FCS_SIZE 288#define NETXEN_MAX_MTU 8000 + NETXEN_ENET_HEADER_SIZE + NETXEN_ETH_FCS_SIZE
265#define NETXEN_MIN_MTU 64 289#define NETXEN_MIN_MTU 64
266#define NETXEN_ETH_FCS_SIZE 4 290#define NETXEN_ETH_FCS_SIZE 4
267#define NETXEN_ENET_HEADER_SIZE 14 291#define NETXEN_ENET_HEADER_SIZE 14
268#define NETXEN_WINDOW_ONE 0x2000000 /*CRB Window: bit 25 of CRB address */ 292#define NETXEN_WINDOW_ONE 0x2000000 /*CRB Window: bit 25 of CRB address */
269#define NETXEN_FIRMWARE_LEN ((16 * 1024) / 4) 293#define NETXEN_FIRMWARE_LEN ((16 * 1024) / 4)
270#define NETXEN_NIU_HDRSIZE (0x1 << 6) 294#define NETXEN_NIU_HDRSIZE (0x1 << 6)
271#define NETXEN_NIU_TLRSIZE (0x1 << 5) 295#define NETXEN_NIU_TLRSIZE (0x1 << 5)
272 296
273#define lower32(x) ((u32)((x) & 0xffffffff))
274#define upper32(x) \
275 ((u32)(((unsigned long long)(x) >> 32) & 0xffffffff))
276
277#define NETXEN_NIC_ZERO_PAUSE_ADDR 0ULL 297#define NETXEN_NIC_ZERO_PAUSE_ADDR 0ULL
278#define NETXEN_NIC_UNIT_PAUSE_ADDR 0x200ULL 298#define NETXEN_NIC_UNIT_PAUSE_ADDR 0x200ULL
279#define NETXEN_NIC_EPG_PAUSE_ADDR1 0x2200010000c28001ULL 299#define NETXEN_NIC_EPG_PAUSE_ADDR1 0x2200010000c28001ULL
@@ -281,10 +301,6 @@ static u64 ctx_addr_sig_regs[][3] = {
281 301
282#define NETXEN_NIC_WINDOW_MARGIN 0x100000 302#define NETXEN_NIC_WINDOW_MARGIN 0x100000
283 303
284static unsigned long netxen_nic_pci_set_window(struct netxen_adapter *adapter,
285 unsigned long long addr);
286void netxen_free_hw_resources(struct netxen_adapter *adapter);
287
288int netxen_nic_set_mac(struct net_device *netdev, void *p) 304int netxen_nic_set_mac(struct net_device *netdev, void *p)
289{ 305{
290 struct netxen_adapter *adapter = netdev_priv(netdev); 306 struct netxen_adapter *adapter = netdev_priv(netdev);
@@ -296,266 +312,370 @@ int netxen_nic_set_mac(struct net_device *netdev, void *p)
296 if (!is_valid_ether_addr(addr->sa_data)) 312 if (!is_valid_ether_addr(addr->sa_data))
297 return -EADDRNOTAVAIL; 313 return -EADDRNOTAVAIL;
298 314
299 DPRINTK(INFO, "valid ether addr\n");
300 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); 315 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
301 316
302 if (adapter->macaddr_set) 317 /* For P3, MAC addr is not set in NIU */
303 adapter->macaddr_set(adapter, addr->sa_data); 318 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
319 if (adapter->macaddr_set)
320 adapter->macaddr_set(adapter, addr->sa_data);
304 321
305 return 0; 322 return 0;
306} 323}
307 324
308/* 325#define NETXEN_UNICAST_ADDR(port, index) \
309 * netxen_nic_set_multi - Multicast 326 (NETXEN_UNICAST_ADDR_BASE+(port*32)+(index*8))
310 */ 327#define NETXEN_MCAST_ADDR(port, index) \
311void netxen_nic_set_multi(struct net_device *netdev) 328 (NETXEN_MULTICAST_ADDR_BASE+(port*0x80)+(index*8))
329#define MAC_HI(addr) \
330 ((addr[2] << 16) | (addr[1] << 8) | (addr[0]))
331#define MAC_LO(addr) \
332 ((addr[5] << 16) | (addr[4] << 8) | (addr[3]))
333
334static int
335netxen_nic_enable_mcast_filter(struct netxen_adapter *adapter)
336{
337 u32 val = 0;
338 u16 port = adapter->physical_port;
339 u8 *addr = adapter->netdev->dev_addr;
340
341 if (adapter->mc_enabled)
342 return 0;
343
344 adapter->hw_read_wx(adapter, NETXEN_MAC_ADDR_CNTL_REG, &val, 4);
345 val |= (1UL << (28+port));
346 adapter->hw_write_wx(adapter, NETXEN_MAC_ADDR_CNTL_REG, &val, 4);
347
348 /* add broadcast addr to filter */
349 val = 0xffffff;
350 netxen_crb_writelit_adapter(adapter, NETXEN_UNICAST_ADDR(port, 0), val);
351 netxen_crb_writelit_adapter(adapter,
352 NETXEN_UNICAST_ADDR(port, 0)+4, val);
353
354 /* add station addr to filter */
355 val = MAC_HI(addr);
356 netxen_crb_writelit_adapter(adapter, NETXEN_UNICAST_ADDR(port, 1), val);
357 val = MAC_LO(addr);
358 netxen_crb_writelit_adapter(adapter,
359 NETXEN_UNICAST_ADDR(port, 1)+4, val);
360
361 adapter->mc_enabled = 1;
362 return 0;
363}
364
365static int
366netxen_nic_disable_mcast_filter(struct netxen_adapter *adapter)
367{
368 u32 val = 0;
369 u16 port = adapter->physical_port;
370 u8 *addr = adapter->netdev->dev_addr;
371
372 if (!adapter->mc_enabled)
373 return 0;
374
375 adapter->hw_read_wx(adapter, NETXEN_MAC_ADDR_CNTL_REG, &val, 4);
376 val &= ~(1UL << (28+port));
377 adapter->hw_write_wx(adapter, NETXEN_MAC_ADDR_CNTL_REG, &val, 4);
378
379 val = MAC_HI(addr);
380 netxen_crb_writelit_adapter(adapter, NETXEN_UNICAST_ADDR(port, 0), val);
381 val = MAC_LO(addr);
382 netxen_crb_writelit_adapter(adapter,
383 NETXEN_UNICAST_ADDR(port, 0)+4, val);
384
385 netxen_crb_writelit_adapter(adapter, NETXEN_UNICAST_ADDR(port, 1), 0);
386 netxen_crb_writelit_adapter(adapter, NETXEN_UNICAST_ADDR(port, 1)+4, 0);
387
388 adapter->mc_enabled = 0;
389 return 0;
390}
391
392static int
393netxen_nic_set_mcast_addr(struct netxen_adapter *adapter,
394 int index, u8 *addr)
395{
396 u32 hi = 0, lo = 0;
397 u16 port = adapter->physical_port;
398
399 lo = MAC_LO(addr);
400 hi = MAC_HI(addr);
401
402 netxen_crb_writelit_adapter(adapter,
403 NETXEN_MCAST_ADDR(port, index), hi);
404 netxen_crb_writelit_adapter(adapter,
405 NETXEN_MCAST_ADDR(port, index)+4, lo);
406
407 return 0;
408}
409
410void netxen_p2_nic_set_multi(struct net_device *netdev)
312{ 411{
313 struct netxen_adapter *adapter = netdev_priv(netdev); 412 struct netxen_adapter *adapter = netdev_priv(netdev);
314 struct dev_mc_list *mc_ptr; 413 struct dev_mc_list *mc_ptr;
414 u8 null_addr[6];
415 int index = 0;
416
417 memset(null_addr, 0, 6);
315 418
316 mc_ptr = netdev->mc_list;
317 if (netdev->flags & IFF_PROMISC) { 419 if (netdev->flags & IFF_PROMISC) {
318 if (adapter->set_promisc) 420
319 adapter->set_promisc(adapter, 421 adapter->set_promisc(adapter,
320 NETXEN_NIU_PROMISC_MODE); 422 NETXEN_NIU_PROMISC_MODE);
321 } else { 423
322 if (adapter->unset_promisc) 424 /* Full promiscuous mode */
323 adapter->unset_promisc(adapter, 425 netxen_nic_disable_mcast_filter(adapter);
324 NETXEN_NIU_NON_PROMISC_MODE); 426
427 return;
428 }
429
430 if (netdev->mc_count == 0) {
431 adapter->set_promisc(adapter,
432 NETXEN_NIU_NON_PROMISC_MODE);
433 netxen_nic_disable_mcast_filter(adapter);
434 return;
325 } 435 }
436
437 adapter->set_promisc(adapter, NETXEN_NIU_ALLMULTI_MODE);
438 if (netdev->flags & IFF_ALLMULTI ||
439 netdev->mc_count > adapter->max_mc_count) {
440 netxen_nic_disable_mcast_filter(adapter);
441 return;
442 }
443
444 netxen_nic_enable_mcast_filter(adapter);
445
446 for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next, index++)
447 netxen_nic_set_mcast_addr(adapter, index, mc_ptr->dmi_addr);
448
449 if (index != netdev->mc_count)
450 printk(KERN_WARNING "%s: %s multicast address count mismatch\n",
451 netxen_nic_driver_name, netdev->name);
452
453 /* Clear out remaining addresses */
454 for (; index < adapter->max_mc_count; index++)
455 netxen_nic_set_mcast_addr(adapter, index, null_addr);
326} 456}
327 457
328/* 458static int nx_p3_nic_add_mac(struct netxen_adapter *adapter,
329 * netxen_nic_change_mtu - Change the Maximum Transfer Unit 459 u8 *addr, nx_mac_list_t **add_list, nx_mac_list_t **del_list)
330 * @returns 0 on success, negative on failure
331 */
332int netxen_nic_change_mtu(struct net_device *netdev, int mtu)
333{ 460{
334 struct netxen_adapter *adapter = netdev_priv(netdev); 461 nx_mac_list_t *cur, *prev;
335 int eff_mtu = mtu + NETXEN_ENET_HEADER_SIZE + NETXEN_ETH_FCS_SIZE; 462
463 /* if in del_list, move it to adapter->mac_list */
464 for (cur = *del_list, prev = NULL; cur;) {
465 if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) {
466 if (prev == NULL)
467 *del_list = cur->next;
468 else
469 prev->next = cur->next;
470 cur->next = adapter->mac_list;
471 adapter->mac_list = cur;
472 return 0;
473 }
474 prev = cur;
475 cur = cur->next;
476 }
477
478 /* make sure to add each mac address only once */
479 for (cur = adapter->mac_list; cur; cur = cur->next) {
480 if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0)
481 return 0;
482 }
483 /* not in del_list, create new entry and add to add_list */
484 cur = kmalloc(sizeof(*cur), in_atomic()? GFP_ATOMIC : GFP_KERNEL);
485 if (cur == NULL) {
486 printk(KERN_ERR "%s: cannot allocate memory. MAC filtering may"
487 "not work properly from now.\n", __func__);
488 return -1;
489 }
336 490
337 if ((eff_mtu > NETXEN_MAX_MTU) || (eff_mtu < NETXEN_MIN_MTU)) { 491 memcpy(cur->mac_addr, addr, ETH_ALEN);
338 printk(KERN_ERR "%s: %s %d is not supported.\n", 492 cur->next = *add_list;
339 netxen_nic_driver_name, netdev->name, mtu); 493 *add_list = cur;
494 return 0;
495}
496
497static int
498netxen_send_cmd_descs(struct netxen_adapter *adapter,
499 struct cmd_desc_type0 *cmd_desc_arr, int nr_elements)
500{
501 uint32_t i, producer;
502 struct netxen_cmd_buffer *pbuf;
503 struct cmd_desc_type0 *cmd_desc;
504
505 if (nr_elements > MAX_PENDING_DESC_BLOCK_SIZE || nr_elements == 0) {
506 printk(KERN_WARNING "%s: Too many command descriptors in a "
507 "request\n", __func__);
340 return -EINVAL; 508 return -EINVAL;
341 } 509 }
342 510
343 if (adapter->set_mtu) 511 i = 0;
344 adapter->set_mtu(adapter, mtu); 512
345 netdev->mtu = mtu; 513 producer = adapter->cmd_producer;
514 do {
515 cmd_desc = &cmd_desc_arr[i];
516
517 pbuf = &adapter->cmd_buf_arr[producer];
518 pbuf->mss = 0;
519 pbuf->total_length = 0;
520 pbuf->skb = NULL;
521 pbuf->cmd = 0;
522 pbuf->frag_count = 0;
523 pbuf->port = 0;
524
525 /* adapter->ahw.cmd_desc_head[producer] = *cmd_desc; */
526 memcpy(&adapter->ahw.cmd_desc_head[producer],
527 &cmd_desc_arr[i], sizeof(struct cmd_desc_type0));
528
529 producer = get_next_index(producer,
530 adapter->max_tx_desc_count);
531 i++;
532
533 } while (i != nr_elements);
534
535 adapter->cmd_producer = producer;
536
537 /* write producer index to start the xmit */
538
539 netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer);
346 540
347 return 0; 541 return 0;
348} 542}
349 543
350/* 544#define NIC_REQUEST 0x14
351 * check if the firmware has been downloaded and ready to run and 545#define NETXEN_MAC_EVENT 0x1
352 * setup the address for the descriptors in the adapter 546
353 */ 547static int nx_p3_sre_macaddr_change(struct net_device *dev,
354int netxen_nic_hw_resources(struct netxen_adapter *adapter) 548 u8 *addr, unsigned op)
355{ 549{
356 struct netxen_hardware_context *hw = &adapter->ahw; 550 struct netxen_adapter *adapter = (struct netxen_adapter *)dev->priv;
357 u32 state = 0; 551 nx_nic_req_t req;
358 void *addr; 552 nx_mac_req_t mac_req;
359 int loops = 0, err = 0; 553 int rv;
360 int ctx, ring; 554
361 struct netxen_recv_context *recv_ctx; 555 memset(&req, 0, sizeof(nx_nic_req_t));
362 struct netxen_rcv_desc_ctx *rcv_desc; 556 req.qhdr |= (NIC_REQUEST << 23);
363 int func_id = adapter->portnum; 557 req.req_hdr |= NETXEN_MAC_EVENT;
364 558 req.req_hdr |= ((u64)adapter->portnum << 16);
365 DPRINTK(INFO, "crb_base: %lx %x", NETXEN_PCI_CRBSPACE, 559 mac_req.op = op;
366 PCI_OFFSET_SECOND_RANGE(adapter, NETXEN_PCI_CRBSPACE)); 560 memcpy(&mac_req.mac_addr, addr, 6);
367 DPRINTK(INFO, "cam base: %lx %x", NETXEN_CRB_CAM, 561 req.words[0] = cpu_to_le64(*(u64 *)&mac_req);
368 pci_base_offset(adapter, NETXEN_CRB_CAM)); 562
369 DPRINTK(INFO, "cam RAM: %lx %x", NETXEN_CAM_RAM_BASE, 563 rv = netxen_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1);
370 pci_base_offset(adapter, NETXEN_CAM_RAM_BASE)); 564 if (rv != 0) {
371 565 printk(KERN_ERR "ERROR. Could not send mac update\n");
372 566 return rv;
373 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
374 DPRINTK(INFO, "Command Peg ready..waiting for rcv peg\n");
375 loops = 0;
376 state = 0;
377 /* Window 1 call */
378 state = readl(NETXEN_CRB_NORMALIZE(adapter,
379 recv_crb_registers[ctx].
380 crb_rcvpeg_state));
381 while (state != PHAN_PEG_RCV_INITIALIZED && loops < 20) {
382 msleep(1);
383 /* Window 1 call */
384 state = readl(NETXEN_CRB_NORMALIZE(adapter,
385 recv_crb_registers
386 [ctx].
387 crb_rcvpeg_state));
388 loops++;
389 }
390 if (loops >= 20) {
391 printk(KERN_ERR "Rcv Peg initialization not complete:"
392 "%x.\n", state);
393 err = -EIO;
394 return err;
395 }
396 } 567 }
397 adapter->intr_scheme = readl(
398 NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW));
399 adapter->msi_mode = readl(
400 NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW));
401
402 addr = netxen_alloc(adapter->ahw.pdev,
403 sizeof(struct netxen_ring_ctx) +
404 sizeof(uint32_t),
405 (dma_addr_t *) & adapter->ctx_desc_phys_addr,
406 &adapter->ctx_desc_pdev);
407
408 if (addr == NULL) {
409 DPRINTK(ERR, "bad return from pci_alloc_consistent\n");
410 err = -ENOMEM;
411 return err;
412 }
413 memset(addr, 0, sizeof(struct netxen_ring_ctx));
414 adapter->ctx_desc = (struct netxen_ring_ctx *)addr;
415 adapter->ctx_desc->ctx_id = cpu_to_le32(adapter->portnum);
416 adapter->ctx_desc->cmd_consumer_offset =
417 cpu_to_le64(adapter->ctx_desc_phys_addr +
418 sizeof(struct netxen_ring_ctx));
419 adapter->cmd_consumer = (__le32 *) (((char *)addr) +
420 sizeof(struct netxen_ring_ctx));
421
422 addr = netxen_alloc(adapter->ahw.pdev,
423 sizeof(struct cmd_desc_type0) *
424 adapter->max_tx_desc_count,
425 (dma_addr_t *) & hw->cmd_desc_phys_addr,
426 &adapter->ahw.cmd_desc_pdev);
427
428 if (addr == NULL) {
429 DPRINTK(ERR, "bad return from pci_alloc_consistent\n");
430 netxen_free_hw_resources(adapter);
431 return -ENOMEM;
432 }
433
434 adapter->ctx_desc->cmd_ring_addr =
435 cpu_to_le64(hw->cmd_desc_phys_addr);
436 adapter->ctx_desc->cmd_ring_size =
437 cpu_to_le32(adapter->max_tx_desc_count);
438
439 hw->cmd_desc_head = (struct cmd_desc_type0 *)addr;
440
441 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
442 recv_ctx = &adapter->recv_ctx[ctx];
443
444 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
445 rcv_desc = &recv_ctx->rcv_desc[ring];
446 addr = netxen_alloc(adapter->ahw.pdev,
447 RCV_DESC_RINGSIZE,
448 &rcv_desc->phys_addr,
449 &rcv_desc->phys_pdev);
450 if (addr == NULL) {
451 DPRINTK(ERR, "bad return from "
452 "pci_alloc_consistent\n");
453 netxen_free_hw_resources(adapter);
454 err = -ENOMEM;
455 return err;
456 }
457 rcv_desc->desc_head = (struct rcv_desc *)addr;
458 adapter->ctx_desc->rcv_ctx[ring].rcv_ring_addr =
459 cpu_to_le64(rcv_desc->phys_addr);
460 adapter->ctx_desc->rcv_ctx[ring].rcv_ring_size =
461 cpu_to_le32(rcv_desc->max_rx_desc_count);
462 }
463 568
464 addr = netxen_alloc(adapter->ahw.pdev, STATUS_DESC_RINGSIZE, 569 return 0;
465 &recv_ctx->rcv_status_desc_phys_addr,
466 &recv_ctx->rcv_status_desc_pdev);
467 if (addr == NULL) {
468 DPRINTK(ERR, "bad return from"
469 " pci_alloc_consistent\n");
470 netxen_free_hw_resources(adapter);
471 err = -ENOMEM;
472 return err;
473 }
474 recv_ctx->rcv_status_desc_head = (struct status_desc *)addr;
475 adapter->ctx_desc->sts_ring_addr =
476 cpu_to_le64(recv_ctx->rcv_status_desc_phys_addr);
477 adapter->ctx_desc->sts_ring_size =
478 cpu_to_le32(adapter->max_rx_desc_count);
479
480 }
481 /* Window = 1 */
482
483 writel(lower32(adapter->ctx_desc_phys_addr),
484 NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_ADDR_REG_LO(func_id)));
485 writel(upper32(adapter->ctx_desc_phys_addr),
486 NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_ADDR_REG_HI(func_id)));
487 writel(NETXEN_CTX_SIGNATURE | func_id,
488 NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_SIGNATURE_REG(func_id)));
489 return err;
490} 570}
491 571
492void netxen_free_hw_resources(struct netxen_adapter *adapter) 572void netxen_p3_nic_set_multi(struct net_device *netdev)
493{ 573{
494 struct netxen_recv_context *recv_ctx; 574 struct netxen_adapter *adapter = netdev_priv(netdev);
495 struct netxen_rcv_desc_ctx *rcv_desc; 575 nx_mac_list_t *cur, *next, *del_list, *add_list = NULL;
496 int ctx, ring; 576 struct dev_mc_list *mc_ptr;
497 577 u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
498 if (adapter->ctx_desc != NULL) { 578
499 pci_free_consistent(adapter->ctx_desc_pdev, 579 adapter->set_promisc(adapter, NETXEN_NIU_PROMISC_MODE);
500 sizeof(struct netxen_ring_ctx) +
501 sizeof(uint32_t),
502 adapter->ctx_desc,
503 adapter->ctx_desc_phys_addr);
504 adapter->ctx_desc = NULL;
505 }
506
507 if (adapter->ahw.cmd_desc_head != NULL) {
508 pci_free_consistent(adapter->ahw.cmd_desc_pdev,
509 sizeof(struct cmd_desc_type0) *
510 adapter->max_tx_desc_count,
511 adapter->ahw.cmd_desc_head,
512 adapter->ahw.cmd_desc_phys_addr);
513 adapter->ahw.cmd_desc_head = NULL;
514 }
515
516 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
517 recv_ctx = &adapter->recv_ctx[ctx];
518 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
519 rcv_desc = &recv_ctx->rcv_desc[ring];
520
521 if (rcv_desc->desc_head != NULL) {
522 pci_free_consistent(rcv_desc->phys_pdev,
523 RCV_DESC_RINGSIZE,
524 rcv_desc->desc_head,
525 rcv_desc->phys_addr);
526 rcv_desc->desc_head = NULL;
527 }
528 }
529 580
530 if (recv_ctx->rcv_status_desc_head != NULL) { 581 /*
531 pci_free_consistent(recv_ctx->rcv_status_desc_pdev, 582 * Programming mac addresses will automaticly enabling L2 filtering.
532 STATUS_DESC_RINGSIZE, 583 * HW will replace timestamp with L2 conid when L2 filtering is
533 recv_ctx->rcv_status_desc_head, 584 * enabled. This causes problem for LSA. Do not enabling L2 filtering
534 recv_ctx-> 585 * until that problem is fixed.
535 rcv_status_desc_phys_addr); 586 */
536 recv_ctx->rcv_status_desc_head = NULL; 587 if ((netdev->flags & IFF_PROMISC) ||
588 (netdev->mc_count > adapter->max_mc_count))
589 return;
590
591 del_list = adapter->mac_list;
592 adapter->mac_list = NULL;
593
594 nx_p3_nic_add_mac(adapter, netdev->dev_addr, &add_list, &del_list);
595 if (netdev->mc_count > 0) {
596 nx_p3_nic_add_mac(adapter, bcast_addr, &add_list, &del_list);
597 for (mc_ptr = netdev->mc_list; mc_ptr;
598 mc_ptr = mc_ptr->next) {
599 nx_p3_nic_add_mac(adapter, mc_ptr->dmi_addr,
600 &add_list, &del_list);
537 } 601 }
538 } 602 }
603 for (cur = del_list; cur;) {
604 nx_p3_sre_macaddr_change(netdev, cur->mac_addr, NETXEN_MAC_DEL);
605 next = cur->next;
606 kfree(cur);
607 cur = next;
608 }
609 for (cur = add_list; cur;) {
610 nx_p3_sre_macaddr_change(netdev, cur->mac_addr, NETXEN_MAC_ADD);
611 next = cur->next;
612 cur->next = adapter->mac_list;
613 adapter->mac_list = cur;
614 cur = next;
615 }
539} 616}
540 617
541void netxen_tso_check(struct netxen_adapter *adapter, 618#define NETXEN_CONFIG_INTR_COALESCE 3
542 struct cmd_desc_type0 *desc, struct sk_buff *skb) 619
620/*
621 * Send the interrupt coalescing parameter set by ethtool to the card.
622 */
623int netxen_config_intr_coalesce(struct netxen_adapter *adapter)
543{ 624{
544 if (desc->mss) { 625 nx_nic_req_t req;
545 desc->total_hdr_length = (sizeof(struct ethhdr) + 626 int rv;
546 ip_hdrlen(skb) + tcp_hdrlen(skb)); 627
547 netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); 628 memset(&req, 0, sizeof(nx_nic_req_t));
548 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { 629
549 if (ip_hdr(skb)->protocol == IPPROTO_TCP) { 630 req.qhdr |= (NIC_REQUEST << 23);
550 netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT); 631 req.req_hdr |= NETXEN_CONFIG_INTR_COALESCE;
551 } else if (ip_hdr(skb)->protocol == IPPROTO_UDP) { 632 req.req_hdr |= ((u64)adapter->portnum << 16);
552 netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT); 633
553 } else { 634 memcpy(&req.words[0], &adapter->coal, sizeof(adapter->coal));
554 return; 635
555 } 636 rv = netxen_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1);
637 if (rv != 0) {
638 printk(KERN_ERR "ERROR. Could not send "
639 "interrupt coalescing parameters\n");
556 } 640 }
557 desc->tcp_hdr_offset = skb_transport_offset(skb); 641
558 desc->ip_hdr_offset = skb_network_offset(skb); 642 return rv;
643}
644
645/*
646 * netxen_nic_change_mtu - Change the Maximum Transfer Unit
647 * @returns 0 on success, negative on failure
648 */
649
650#define MTU_FUDGE_FACTOR 100
651
652int netxen_nic_change_mtu(struct net_device *netdev, int mtu)
653{
654 struct netxen_adapter *adapter = netdev_priv(netdev);
655 int max_mtu;
656
657 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
658 max_mtu = P3_MAX_MTU;
659 else
660 max_mtu = P2_MAX_MTU;
661
662 if (mtu > max_mtu) {
663 printk(KERN_ERR "%s: mtu > %d bytes unsupported\n",
664 netdev->name, max_mtu);
665 return -EINVAL;
666 }
667
668 if (adapter->set_mtu)
669 adapter->set_mtu(adapter, mtu);
670 netdev->mtu = mtu;
671
672 mtu += MTU_FUDGE_FACTOR;
673 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
674 nx_fw_cmd_set_mtu(adapter, mtu);
675 else if (adapter->set_mtu)
676 adapter->set_mtu(adapter, mtu);
677
678 return 0;
559} 679}
560 680
561int netxen_is_flash_supported(struct netxen_adapter *adapter) 681int netxen_is_flash_supported(struct netxen_adapter *adapter)
@@ -632,41 +752,49 @@ int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 mac[])
632 return 0; 752 return 0;
633} 753}
634 754
755#define CRB_WIN_LOCK_TIMEOUT 100000000
756
757static int crb_win_lock(struct netxen_adapter *adapter)
758{
759 int done = 0, timeout = 0;
760
761 while (!done) {
762 /* acquire semaphore3 from PCI HW block */
763 adapter->hw_read_wx(adapter,
764 NETXEN_PCIE_REG(PCIE_SEM7_LOCK), &done, 4);
765 if (done == 1)
766 break;
767 if (timeout >= CRB_WIN_LOCK_TIMEOUT)
768 return -1;
769 timeout++;
770 udelay(1);
771 }
772 netxen_crb_writelit_adapter(adapter,
773 NETXEN_CRB_WIN_LOCK_ID, adapter->portnum);
774 return 0;
775}
776
777static void crb_win_unlock(struct netxen_adapter *adapter)
778{
779 int val;
780
781 adapter->hw_read_wx(adapter,
782 NETXEN_PCIE_REG(PCIE_SEM7_UNLOCK), &val, 4);
783}
784
635/* 785/*
636 * Changes the CRB window to the specified window. 786 * Changes the CRB window to the specified window.
637 */ 787 */
638void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw) 788void
789netxen_nic_pci_change_crbwindow_128M(struct netxen_adapter *adapter, u32 wndw)
639{ 790{
640 void __iomem *offset; 791 void __iomem *offset;
641 u32 tmp; 792 u32 tmp;
642 int count = 0; 793 int count = 0;
794 uint8_t func = adapter->ahw.pci_func;
643 795
644 if (adapter->curr_window == wndw) 796 if (adapter->curr_window == wndw)
645 return; 797 return;
646 switch(adapter->ahw.pci_func) {
647 case 0:
648 offset = PCI_OFFSET_SECOND_RANGE(adapter,
649 NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW));
650 break;
651 case 1:
652 offset = PCI_OFFSET_SECOND_RANGE(adapter,
653 NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW_F1));
654 break;
655 case 2:
656 offset = PCI_OFFSET_SECOND_RANGE(adapter,
657 NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW_F2));
658 break;
659 case 3:
660 offset = PCI_OFFSET_SECOND_RANGE(adapter,
661 NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW_F3));
662 break;
663 default:
664 printk(KERN_INFO "Changing the window for PCI function "
665 "%d\n", adapter->ahw.pci_func);
666 offset = PCI_OFFSET_SECOND_RANGE(adapter,
667 NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW));
668 break;
669 }
670 /* 798 /*
671 * Move the CRB window. 799 * Move the CRB window.
672 * We need to write to the "direct access" region of PCI 800 * We need to write to the "direct access" region of PCI
@@ -675,6 +803,8 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw)
675 * register address is received by PCI. The direct region bypasses 803 * register address is received by PCI. The direct region bypasses
676 * the CRB bus. 804 * the CRB bus.
677 */ 805 */
806 offset = PCI_OFFSET_SECOND_RANGE(adapter,
807 NETXEN_PCIX_PH_REG(PCIE_CRB_WINDOW_REG(func)));
678 808
679 if (wndw & 0x1) 809 if (wndw & 0x1)
680 wndw = NETXEN_WINDOW_ONE; 810 wndw = NETXEN_WINDOW_ONE;
@@ -685,7 +815,7 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw)
685 while ((tmp = readl(offset)) != wndw) { 815 while ((tmp = readl(offset)) != wndw) {
686 printk(KERN_WARNING "%s: %s WARNING: CRB window value not " 816 printk(KERN_WARNING "%s: %s WARNING: CRB window value not "
687 "registered properly: 0x%08x.\n", 817 "registered properly: 0x%08x.\n",
688 netxen_nic_driver_name, __FUNCTION__, tmp); 818 netxen_nic_driver_name, __func__, tmp);
689 mdelay(1); 819 mdelay(1);
690 if (count >= 10) 820 if (count >= 10)
691 break; 821 break;
@@ -698,51 +828,119 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw)
698 adapter->curr_window = 0; 828 adapter->curr_window = 0;
699} 829}
700 830
831/*
832 * Return -1 if off is not valid,
833 * 1 if window access is needed. 'off' is set to offset from
834 * CRB space in 128M pci map
835 * 0 if no window access is needed. 'off' is set to 2M addr
836 * In: 'off' is offset from base in 128M pci map
837 */
838static int
839netxen_nic_pci_get_crb_addr_2M(struct netxen_adapter *adapter,
840 ulong *off, int len)
841{
842 unsigned long end = *off + len;
843 crb_128M_2M_sub_block_map_t *m;
844
845
846 if (*off >= NETXEN_CRB_MAX)
847 return -1;
848
849 if (*off >= NETXEN_PCI_CAMQM && (end <= NETXEN_PCI_CAMQM_2M_END)) {
850 *off = (*off - NETXEN_PCI_CAMQM) + NETXEN_PCI_CAMQM_2M_BASE +
851 (ulong)adapter->ahw.pci_base0;
852 return 0;
853 }
854
855 if (*off < NETXEN_PCI_CRBSPACE)
856 return -1;
857
858 *off -= NETXEN_PCI_CRBSPACE;
859 end = *off + len;
860
861 /*
862 * Try direct map
863 */
864 m = &crb_128M_2M_map[CRB_BLK(*off)].sub_block[CRB_SUBBLK(*off)];
865
866 if (m->valid && (m->start_128M <= *off) && (m->end_128M >= end)) {
867 *off = *off + m->start_2M - m->start_128M +
868 (ulong)adapter->ahw.pci_base0;
869 return 0;
870 }
871
872 /*
873 * Not in direct map, use crb window
874 */
875 return 1;
876}
877
878/*
879 * In: 'off' is offset from CRB space in 128M pci map
880 * Out: 'off' is 2M pci map addr
881 * side effect: lock crb window
882 */
883static void
884netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong *off)
885{
886 u32 win_read;
887
888 adapter->crb_win = CRB_HI(*off);
889 writel(adapter->crb_win, (void *)(CRB_WINDOW_2M +
890 adapter->ahw.pci_base0));
891 /*
892 * Read back value to make sure write has gone through before trying
893 * to use it.
894 */
895 win_read = readl((void *)(CRB_WINDOW_2M + adapter->ahw.pci_base0));
896 if (win_read != adapter->crb_win) {
897 printk(KERN_ERR "%s: Written crbwin (0x%x) != "
898 "Read crbwin (0x%x), off=0x%lx\n",
899 __func__, adapter->crb_win, win_read, *off);
900 }
901 *off = (*off & MASK(16)) + CRB_INDIRECT_2M +
902 (ulong)adapter->ahw.pci_base0;
903}
904
701int netxen_load_firmware(struct netxen_adapter *adapter) 905int netxen_load_firmware(struct netxen_adapter *adapter)
702{ 906{
703 int i; 907 int i;
704 u32 data, size = 0; 908 u32 data, size = 0;
705 u32 flashaddr = NETXEN_FLASH_BASE, memaddr = NETXEN_PHANTOM_MEM_BASE; 909 u32 flashaddr = NETXEN_BOOTLD_START, memaddr = NETXEN_BOOTLD_START;
706 u64 off;
707 void __iomem *addr;
708 910
709 size = NETXEN_FIRMWARE_LEN; 911 size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4;
710 writel(1, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST)); 912
913 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
914 adapter->pci_write_normalize(adapter,
915 NETXEN_ROMUSB_GLB_CAS_RST, 1);
711 916
712 for (i = 0; i < size; i++) { 917 for (i = 0; i < size; i++) {
713 int retries = 10;
714 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) 918 if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
715 return -EIO; 919 return -EIO;
716 920
717 off = netxen_nic_pci_set_window(adapter, memaddr); 921 adapter->pci_mem_write(adapter, memaddr, &data, 4);
718 addr = pci_base_offset(adapter, off);
719 writel(data, addr);
720 do {
721 if (readl(addr) == data)
722 break;
723 msleep(100);
724 writel(data, addr);
725 } while (--retries);
726 if (!retries) {
727 printk(KERN_ERR "%s: firmware load aborted, write failed at 0x%x\n",
728 netxen_nic_driver_name, memaddr);
729 return -EIO;
730 }
731 flashaddr += 4; 922 flashaddr += 4;
732 memaddr += 4; 923 memaddr += 4;
924 cond_resched();
925 }
926 msleep(1);
927
928 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
929 adapter->pci_write_normalize(adapter,
930 NETXEN_ROMUSB_GLB_SW_RESET, 0x80001d);
931 else {
932 adapter->pci_write_normalize(adapter,
933 NETXEN_ROMUSB_GLB_CHIP_CLK_CTRL, 0x3fff);
934 adapter->pci_write_normalize(adapter,
935 NETXEN_ROMUSB_GLB_CAS_RST, 0);
733 } 936 }
734 udelay(100);
735 /* make sure Casper is powered on */
736 writel(0x3fff,
737 NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CHIP_CLK_CTRL));
738 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST));
739 937
740 return 0; 938 return 0;
741} 939}
742 940
743int 941int
744netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data, 942netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter,
745 int len) 943 ulong off, void *data, int len)
746{ 944{
747 void __iomem *addr; 945 void __iomem *addr;
748 946
@@ -750,7 +948,7 @@ netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data,
750 addr = NETXEN_CRB_NORMALIZE(adapter, off); 948 addr = NETXEN_CRB_NORMALIZE(adapter, off);
751 } else { /* Window 0 */ 949 } else { /* Window 0 */
752 addr = pci_base_offset(adapter, off); 950 addr = pci_base_offset(adapter, off);
753 netxen_nic_pci_change_crbwindow(adapter, 0); 951 netxen_nic_pci_change_crbwindow_128M(adapter, 0);
754 } 952 }
755 953
756 DPRINTK(INFO, "writing to base %lx offset %llx addr %p" 954 DPRINTK(INFO, "writing to base %lx offset %llx addr %p"
@@ -758,7 +956,7 @@ netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data,
758 pci_base(adapter, off), off, addr, 956 pci_base(adapter, off), off, addr,
759 *(unsigned long long *)data, len); 957 *(unsigned long long *)data, len);
760 if (!addr) { 958 if (!addr) {
761 netxen_nic_pci_change_crbwindow(adapter, 1); 959 netxen_nic_pci_change_crbwindow_128M(adapter, 1);
762 return 1; 960 return 1;
763 } 961 }
764 962
@@ -785,14 +983,14 @@ netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data,
785 break; 983 break;
786 } 984 }
787 if (!ADDR_IN_WINDOW1(off)) 985 if (!ADDR_IN_WINDOW1(off))
788 netxen_nic_pci_change_crbwindow(adapter, 1); 986 netxen_nic_pci_change_crbwindow_128M(adapter, 1);
789 987
790 return 0; 988 return 0;
791} 989}
792 990
793int 991int
794netxen_nic_hw_read_wx(struct netxen_adapter *adapter, u64 off, void *data, 992netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter,
795 int len) 993 ulong off, void *data, int len)
796{ 994{
797 void __iomem *addr; 995 void __iomem *addr;
798 996
@@ -800,13 +998,13 @@ netxen_nic_hw_read_wx(struct netxen_adapter *adapter, u64 off, void *data,
800 addr = NETXEN_CRB_NORMALIZE(adapter, off); 998 addr = NETXEN_CRB_NORMALIZE(adapter, off);
801 } else { /* Window 0 */ 999 } else { /* Window 0 */
802 addr = pci_base_offset(adapter, off); 1000 addr = pci_base_offset(adapter, off);
803 netxen_nic_pci_change_crbwindow(adapter, 0); 1001 netxen_nic_pci_change_crbwindow_128M(adapter, 0);
804 } 1002 }
805 1003
806 DPRINTK(INFO, "reading from base %lx offset %llx addr %p\n", 1004 DPRINTK(INFO, "reading from base %lx offset %llx addr %p\n",
807 pci_base(adapter, off), off, addr); 1005 pci_base(adapter, off), off, addr);
808 if (!addr) { 1006 if (!addr) {
809 netxen_nic_pci_change_crbwindow(adapter, 1); 1007 netxen_nic_pci_change_crbwindow_128M(adapter, 1);
810 return 1; 1008 return 1;
811 } 1009 }
812 switch (len) { 1010 switch (len) {
@@ -830,81 +1028,195 @@ netxen_nic_hw_read_wx(struct netxen_adapter *adapter, u64 off, void *data,
830 DPRINTK(INFO, "read %lx\n", *(unsigned long *)data); 1028 DPRINTK(INFO, "read %lx\n", *(unsigned long *)data);
831 1029
832 if (!ADDR_IN_WINDOW1(off)) 1030 if (!ADDR_IN_WINDOW1(off))
833 netxen_nic_pci_change_crbwindow(adapter, 1); 1031 netxen_nic_pci_change_crbwindow_128M(adapter, 1);
834 1032
835 return 0; 1033 return 0;
836} 1034}
837 1035
838void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val) 1036int
839{ /* Only for window 1 */ 1037netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter,
840 void __iomem *addr; 1038 ulong off, void *data, int len)
1039{
1040 unsigned long flags = 0;
1041 int rv;
1042
1043 rv = netxen_nic_pci_get_crb_addr_2M(adapter, &off, len);
1044
1045 if (rv == -1) {
1046 printk(KERN_ERR "%s: invalid offset: 0x%016lx\n",
1047 __func__, off);
1048 dump_stack();
1049 return -1;
1050 }
1051
1052 if (rv == 1) {
1053 write_lock_irqsave(&adapter->adapter_lock, flags);
1054 crb_win_lock(adapter);
1055 netxen_nic_pci_set_crbwindow_2M(adapter, &off);
1056 }
841 1057
842 addr = NETXEN_CRB_NORMALIZE(adapter, off); 1058 DPRINTK(1, INFO, "write data %lx to offset %llx, len=%d\n",
843 DPRINTK(INFO, "writing to base %lx offset %llx addr %p data %x\n", 1059 *(unsigned long *)data, off, len);
844 pci_base(adapter, off), off, addr, val);
845 writel(val, addr);
846 1060
1061 switch (len) {
1062 case 1:
1063 writeb(*(uint8_t *)data, (void *)off);
1064 break;
1065 case 2:
1066 writew(*(uint16_t *)data, (void *)off);
1067 break;
1068 case 4:
1069 writel(*(uint32_t *)data, (void *)off);
1070 break;
1071 case 8:
1072 writeq(*(uint64_t *)data, (void *)off);
1073 break;
1074 default:
1075 DPRINTK(1, INFO,
1076 "writing data %lx to offset %llx, num words=%d\n",
1077 *(unsigned long *)data, off, (len>>3));
1078 break;
1079 }
1080 if (rv == 1) {
1081 crb_win_unlock(adapter);
1082 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1083 }
1084
1085 return 0;
847} 1086}
848 1087
849int netxen_nic_reg_read(struct netxen_adapter *adapter, u64 off) 1088int
850{ /* Only for window 1 */ 1089netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter,
851 void __iomem *addr; 1090 ulong off, void *data, int len)
852 int val; 1091{
1092 unsigned long flags = 0;
1093 int rv;
853 1094
854 addr = NETXEN_CRB_NORMALIZE(adapter, off); 1095 rv = netxen_nic_pci_get_crb_addr_2M(adapter, &off, len);
855 DPRINTK(INFO, "reading from base %lx offset %llx addr %p\n", 1096
856 pci_base(adapter, off), off, addr); 1097 if (rv == -1) {
857 val = readl(addr); 1098 printk(KERN_ERR "%s: invalid offset: 0x%016lx\n",
858 writel(val, addr); 1099 __func__, off);
1100 dump_stack();
1101 return -1;
1102 }
1103
1104 if (rv == 1) {
1105 write_lock_irqsave(&adapter->adapter_lock, flags);
1106 crb_win_lock(adapter);
1107 netxen_nic_pci_set_crbwindow_2M(adapter, &off);
1108 }
1109
1110 DPRINTK(1, INFO, "read from offset %lx, len=%d\n", off, len);
1111
1112 switch (len) {
1113 case 1:
1114 *(uint8_t *)data = readb((void *)off);
1115 break;
1116 case 2:
1117 *(uint16_t *)data = readw((void *)off);
1118 break;
1119 case 4:
1120 *(uint32_t *)data = readl((void *)off);
1121 break;
1122 case 8:
1123 *(uint64_t *)data = readq((void *)off);
1124 break;
1125 default:
1126 break;
1127 }
859 1128
1129 DPRINTK(1, INFO, "read %lx\n", *(unsigned long *)data);
1130
1131 if (rv == 1) {
1132 crb_win_unlock(adapter);
1133 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1134 }
1135
1136 return 0;
1137}
1138
1139void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val)
1140{
1141 adapter->hw_write_wx(adapter, off, &val, 4);
1142}
1143
1144int netxen_nic_reg_read(struct netxen_adapter *adapter, u64 off)
1145{
1146 int val;
1147 adapter->hw_read_wx(adapter, off, &val, 4);
860 return val; 1148 return val;
861} 1149}
862 1150
863/* Change the window to 0, write and change back to window 1. */ 1151/* Change the window to 0, write and change back to window 1. */
864void netxen_nic_write_w0(struct netxen_adapter *adapter, u32 index, u32 value) 1152void netxen_nic_write_w0(struct netxen_adapter *adapter, u32 index, u32 value)
865{ 1153{
866 void __iomem *addr; 1154 adapter->hw_write_wx(adapter, index, &value, 4);
867
868 netxen_nic_pci_change_crbwindow(adapter, 0);
869 addr = pci_base_offset(adapter, index);
870 writel(value, addr);
871 netxen_nic_pci_change_crbwindow(adapter, 1);
872} 1155}
873 1156
874/* Change the window to 0, read and change back to window 1. */ 1157/* Change the window to 0, read and change back to window 1. */
875void netxen_nic_read_w0(struct netxen_adapter *adapter, u32 index, u32 * value) 1158void netxen_nic_read_w0(struct netxen_adapter *adapter, u32 index, u32 *value)
876{ 1159{
877 void __iomem *addr; 1160 adapter->hw_read_wx(adapter, index, value, 4);
1161}
878 1162
879 addr = pci_base_offset(adapter, index); 1163void netxen_nic_write_w1(struct netxen_adapter *adapter, u32 index, u32 value)
1164{
1165 adapter->hw_write_wx(adapter, index, &value, 4);
1166}
1167
1168void netxen_nic_read_w1(struct netxen_adapter *adapter, u32 index, u32 *value)
1169{
1170 adapter->hw_read_wx(adapter, index, value, 4);
1171}
1172
1173/*
1174 * check memory access boundary.
1175 * used by test agent. support ddr access only for now
1176 */
1177static unsigned long
1178netxen_nic_pci_mem_bound_check(struct netxen_adapter *adapter,
1179 unsigned long long addr, int size)
1180{
1181 if (!ADDR_IN_RANGE(addr,
1182 NETXEN_ADDR_DDR_NET, NETXEN_ADDR_DDR_NET_MAX) ||
1183 !ADDR_IN_RANGE(addr+size-1,
1184 NETXEN_ADDR_DDR_NET, NETXEN_ADDR_DDR_NET_MAX) ||
1185 ((size != 1) && (size != 2) && (size != 4) && (size != 8))) {
1186 return 0;
1187 }
880 1188
881 netxen_nic_pci_change_crbwindow(adapter, 0); 1189 return 1;
882 *value = readl(addr);
883 netxen_nic_pci_change_crbwindow(adapter, 1);
884} 1190}
885 1191
886static int netxen_pci_set_window_warning_count; 1192static int netxen_pci_set_window_warning_count;
887 1193
888static unsigned long netxen_nic_pci_set_window(struct netxen_adapter *adapter, 1194unsigned long
889 unsigned long long addr) 1195netxen_nic_pci_set_window_128M(struct netxen_adapter *adapter,
1196 unsigned long long addr)
890{ 1197{
891 static int ddr_mn_window = -1; 1198 void __iomem *offset;
892 static int qdr_sn_window = -1;
893 int window; 1199 int window;
1200 unsigned long long qdr_max;
1201 uint8_t func = adapter->ahw.pci_func;
1202
1203 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1204 qdr_max = NETXEN_ADDR_QDR_NET_MAX_P2;
1205 } else {
1206 qdr_max = NETXEN_ADDR_QDR_NET_MAX_P3;
1207 }
894 1208
895 if (ADDR_IN_RANGE(addr, NETXEN_ADDR_DDR_NET, NETXEN_ADDR_DDR_NET_MAX)) { 1209 if (ADDR_IN_RANGE(addr, NETXEN_ADDR_DDR_NET, NETXEN_ADDR_DDR_NET_MAX)) {
896 /* DDR network side */ 1210 /* DDR network side */
897 addr -= NETXEN_ADDR_DDR_NET; 1211 addr -= NETXEN_ADDR_DDR_NET;
898 window = (addr >> 25) & 0x3ff; 1212 window = (addr >> 25) & 0x3ff;
899 if (ddr_mn_window != window) { 1213 if (adapter->ahw.ddr_mn_window != window) {
900 ddr_mn_window = window; 1214 adapter->ahw.ddr_mn_window = window;
901 writel(window, PCI_OFFSET_SECOND_RANGE(adapter, 1215 offset = PCI_OFFSET_SECOND_RANGE(adapter,
902 NETXEN_PCIX_PH_REG 1216 NETXEN_PCIX_PH_REG(PCIE_MN_WINDOW_REG(func)));
903 (PCIX_MN_WINDOW(adapter->ahw.pci_func)))); 1217 writel(window, offset);
904 /* MUST make sure window is set before we forge on... */ 1218 /* MUST make sure window is set before we forge on... */
905 readl(PCI_OFFSET_SECOND_RANGE(adapter, 1219 readl(offset);
906 NETXEN_PCIX_PH_REG
907 (PCIX_MN_WINDOW(adapter->ahw.pci_func))));
908 } 1220 }
909 addr -= (window * NETXEN_WINDOW_ONE); 1221 addr -= (window * NETXEN_WINDOW_ONE);
910 addr += NETXEN_PCI_DDR_NET; 1222 addr += NETXEN_PCI_DDR_NET;
@@ -914,22 +1226,17 @@ static unsigned long netxen_nic_pci_set_window(struct netxen_adapter *adapter,
914 } else if (ADDR_IN_RANGE(addr, NETXEN_ADDR_OCM1, NETXEN_ADDR_OCM1_MAX)) { 1226 } else if (ADDR_IN_RANGE(addr, NETXEN_ADDR_OCM1, NETXEN_ADDR_OCM1_MAX)) {
915 addr -= NETXEN_ADDR_OCM1; 1227 addr -= NETXEN_ADDR_OCM1;
916 addr += NETXEN_PCI_OCM1; 1228 addr += NETXEN_PCI_OCM1;
917 } else 1229 } else if (ADDR_IN_RANGE(addr, NETXEN_ADDR_QDR_NET, qdr_max)) {
918 if (ADDR_IN_RANGE
919 (addr, NETXEN_ADDR_QDR_NET, NETXEN_ADDR_QDR_NET_MAX)) {
920 /* QDR network side */ 1230 /* QDR network side */
921 addr -= NETXEN_ADDR_QDR_NET; 1231 addr -= NETXEN_ADDR_QDR_NET;
922 window = (addr >> 22) & 0x3f; 1232 window = (addr >> 22) & 0x3f;
923 if (qdr_sn_window != window) { 1233 if (adapter->ahw.qdr_sn_window != window) {
924 qdr_sn_window = window; 1234 adapter->ahw.qdr_sn_window = window;
925 writel((window << 22), 1235 offset = PCI_OFFSET_SECOND_RANGE(adapter,
926 PCI_OFFSET_SECOND_RANGE(adapter, 1236 NETXEN_PCIX_PH_REG(PCIE_SN_WINDOW_REG(func)));
927 NETXEN_PCIX_PH_REG 1237 writel((window << 22), offset);
928 (PCIX_SN_WINDOW(adapter->ahw.pci_func))));
929 /* MUST make sure window is set before we forge on... */ 1238 /* MUST make sure window is set before we forge on... */
930 readl(PCI_OFFSET_SECOND_RANGE(adapter, 1239 readl(offset);
931 NETXEN_PCIX_PH_REG
932 (PCIX_SN_WINDOW(adapter->ahw.pci_func))));
933 } 1240 }
934 addr -= (window * 0x400000); 1241 addr -= (window * 0x400000);
935 addr += NETXEN_PCI_QDR_NET; 1242 addr += NETXEN_PCI_QDR_NET;
@@ -943,11 +1250,711 @@ static unsigned long netxen_nic_pci_set_window(struct netxen_adapter *adapter,
943 printk("%s: Warning:netxen_nic_pci_set_window()" 1250 printk("%s: Warning:netxen_nic_pci_set_window()"
944 " Unknown address range!\n", 1251 " Unknown address range!\n",
945 netxen_nic_driver_name); 1252 netxen_nic_driver_name);
1253 addr = -1UL;
1254 }
1255 return addr;
1256}
1257
1258/*
1259 * Note : only 32-bit writes!
1260 */
1261int netxen_nic_pci_write_immediate_128M(struct netxen_adapter *adapter,
1262 u64 off, u32 data)
1263{
1264 writel(data, (void __iomem *)(PCI_OFFSET_SECOND_RANGE(adapter, off)));
1265 return 0;
1266}
1267
1268u32 netxen_nic_pci_read_immediate_128M(struct netxen_adapter *adapter, u64 off)
1269{
1270 return readl((void __iomem *)(pci_base_offset(adapter, off)));
1271}
1272
1273void netxen_nic_pci_write_normalize_128M(struct netxen_adapter *adapter,
1274 u64 off, u32 data)
1275{
1276 writel(data, NETXEN_CRB_NORMALIZE(adapter, off));
1277}
1278
1279u32 netxen_nic_pci_read_normalize_128M(struct netxen_adapter *adapter, u64 off)
1280{
1281 return readl(NETXEN_CRB_NORMALIZE(adapter, off));
1282}
1283
1284unsigned long
1285netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter,
1286 unsigned long long addr)
1287{
1288 int window;
1289 u32 win_read;
1290
1291 if (ADDR_IN_RANGE(addr, NETXEN_ADDR_DDR_NET, NETXEN_ADDR_DDR_NET_MAX)) {
1292 /* DDR network side */
1293 window = MN_WIN(addr);
1294 adapter->ahw.ddr_mn_window = window;
1295 adapter->hw_write_wx(adapter,
1296 adapter->ahw.mn_win_crb | NETXEN_PCI_CRBSPACE,
1297 &window, 4);
1298 adapter->hw_read_wx(adapter,
1299 adapter->ahw.mn_win_crb | NETXEN_PCI_CRBSPACE,
1300 &win_read, 4);
1301 if ((win_read << 17) != window) {
1302 printk(KERN_INFO "Written MNwin (0x%x) != "
1303 "Read MNwin (0x%x)\n", window, win_read);
1304 }
1305 addr = GET_MEM_OFFS_2M(addr) + NETXEN_PCI_DDR_NET;
1306 } else if (ADDR_IN_RANGE(addr,
1307 NETXEN_ADDR_OCM0, NETXEN_ADDR_OCM0_MAX)) {
1308 if ((addr & 0x00ff800) == 0xff800) {
1309 printk("%s: QM access not handled.\n", __func__);
1310 addr = -1UL;
1311 }
1312
1313 window = OCM_WIN(addr);
1314 adapter->ahw.ddr_mn_window = window;
1315 adapter->hw_write_wx(adapter,
1316 adapter->ahw.mn_win_crb | NETXEN_PCI_CRBSPACE,
1317 &window, 4);
1318 adapter->hw_read_wx(adapter,
1319 adapter->ahw.mn_win_crb | NETXEN_PCI_CRBSPACE,
1320 &win_read, 4);
1321 if ((win_read >> 7) != window) {
1322 printk(KERN_INFO "%s: Written OCMwin (0x%x) != "
1323 "Read OCMwin (0x%x)\n",
1324 __func__, window, win_read);
1325 }
1326 addr = GET_MEM_OFFS_2M(addr) + NETXEN_PCI_OCM0_2M;
1327
1328 } else if (ADDR_IN_RANGE(addr,
1329 NETXEN_ADDR_QDR_NET, NETXEN_ADDR_QDR_NET_MAX_P3)) {
1330 /* QDR network side */
1331 window = MS_WIN(addr);
1332 adapter->ahw.qdr_sn_window = window;
1333 adapter->hw_write_wx(adapter,
1334 adapter->ahw.ms_win_crb | NETXEN_PCI_CRBSPACE,
1335 &window, 4);
1336 adapter->hw_read_wx(adapter,
1337 adapter->ahw.ms_win_crb | NETXEN_PCI_CRBSPACE,
1338 &win_read, 4);
1339 if (win_read != window) {
1340 printk(KERN_INFO "%s: Written MSwin (0x%x) != "
1341 "Read MSwin (0x%x)\n",
1342 __func__, window, win_read);
1343 }
1344 addr = GET_MEM_OFFS_2M(addr) + NETXEN_PCI_QDR_NET;
946 1345
1346 } else {
1347 /*
1348 * peg gdb frequently accesses memory that doesn't exist,
1349 * this limits the chit chat so debugging isn't slowed down.
1350 */
1351 if ((netxen_pci_set_window_warning_count++ < 8)
1352 || (netxen_pci_set_window_warning_count%64 == 0)) {
1353 printk("%s: Warning:%s Unknown address range!\n",
1354 __func__, netxen_nic_driver_name);
1355}
1356 addr = -1UL;
947 } 1357 }
948 return addr; 1358 return addr;
949} 1359}
950 1360
1361static int netxen_nic_pci_is_same_window(struct netxen_adapter *adapter,
1362 unsigned long long addr)
1363{
1364 int window;
1365 unsigned long long qdr_max;
1366
1367 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
1368 qdr_max = NETXEN_ADDR_QDR_NET_MAX_P2;
1369 else
1370 qdr_max = NETXEN_ADDR_QDR_NET_MAX_P3;
1371
1372 if (ADDR_IN_RANGE(addr,
1373 NETXEN_ADDR_DDR_NET, NETXEN_ADDR_DDR_NET_MAX)) {
1374 /* DDR network side */
1375 BUG(); /* MN access can not come here */
1376 } else if (ADDR_IN_RANGE(addr,
1377 NETXEN_ADDR_OCM0, NETXEN_ADDR_OCM0_MAX)) {
1378 return 1;
1379 } else if (ADDR_IN_RANGE(addr,
1380 NETXEN_ADDR_OCM1, NETXEN_ADDR_OCM1_MAX)) {
1381 return 1;
1382 } else if (ADDR_IN_RANGE(addr, NETXEN_ADDR_QDR_NET, qdr_max)) {
1383 /* QDR network side */
1384 window = ((addr - NETXEN_ADDR_QDR_NET) >> 22) & 0x3f;
1385 if (adapter->ahw.qdr_sn_window == window)
1386 return 1;
1387 }
1388
1389 return 0;
1390}
1391
1392static int netxen_nic_pci_mem_read_direct(struct netxen_adapter *adapter,
1393 u64 off, void *data, int size)
1394{
1395 unsigned long flags;
1396 void *addr;
1397 int ret = 0;
1398 u64 start;
1399 uint8_t *mem_ptr = NULL;
1400 unsigned long mem_base;
1401 unsigned long mem_page;
1402
1403 write_lock_irqsave(&adapter->adapter_lock, flags);
1404
1405 /*
1406 * If attempting to access unknown address or straddle hw windows,
1407 * do not access.
1408 */
1409 start = adapter->pci_set_window(adapter, off);
1410 if ((start == -1UL) ||
1411 (netxen_nic_pci_is_same_window(adapter, off+size-1) == 0)) {
1412 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1413 printk(KERN_ERR "%s out of bound pci memory access. "
1414 "offset is 0x%llx\n", netxen_nic_driver_name, off);
1415 return -1;
1416 }
1417
1418 addr = (void *)(pci_base_offset(adapter, start));
1419 if (!addr) {
1420 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1421 mem_base = pci_resource_start(adapter->pdev, 0);
1422 mem_page = start & PAGE_MASK;
1423 /* Map two pages whenever user tries to access addresses in two
1424 consecutive pages.
1425 */
1426 if (mem_page != ((start + size - 1) & PAGE_MASK))
1427 mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2);
1428 else
1429 mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE);
1430 if (mem_ptr == 0UL) {
1431 *(uint8_t *)data = 0;
1432 return -1;
1433 }
1434 addr = mem_ptr;
1435 addr += start & (PAGE_SIZE - 1);
1436 write_lock_irqsave(&adapter->adapter_lock, flags);
1437 }
1438
1439 switch (size) {
1440 case 1:
1441 *(uint8_t *)data = readb(addr);
1442 break;
1443 case 2:
1444 *(uint16_t *)data = readw(addr);
1445 break;
1446 case 4:
1447 *(uint32_t *)data = readl(addr);
1448 break;
1449 case 8:
1450 *(uint64_t *)data = readq(addr);
1451 break;
1452 default:
1453 ret = -1;
1454 break;
1455 }
1456 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1457 DPRINTK(1, INFO, "read %llx\n", *(unsigned long long *)data);
1458
1459 if (mem_ptr)
1460 iounmap(mem_ptr);
1461 return ret;
1462}
1463
1464static int
1465netxen_nic_pci_mem_write_direct(struct netxen_adapter *adapter, u64 off,
1466 void *data, int size)
1467{
1468 unsigned long flags;
1469 void *addr;
1470 int ret = 0;
1471 u64 start;
1472 uint8_t *mem_ptr = NULL;
1473 unsigned long mem_base;
1474 unsigned long mem_page;
1475
1476 write_lock_irqsave(&adapter->adapter_lock, flags);
1477
1478 /*
1479 * If attempting to access unknown address or straddle hw windows,
1480 * do not access.
1481 */
1482 start = adapter->pci_set_window(adapter, off);
1483 if ((start == -1UL) ||
1484 (netxen_nic_pci_is_same_window(adapter, off+size-1) == 0)) {
1485 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1486 printk(KERN_ERR "%s out of bound pci memory access. "
1487 "offset is 0x%llx\n", netxen_nic_driver_name, off);
1488 return -1;
1489 }
1490
1491 addr = (void *)(pci_base_offset(adapter, start));
1492 if (!addr) {
1493 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1494 mem_base = pci_resource_start(adapter->pdev, 0);
1495 mem_page = start & PAGE_MASK;
1496 /* Map two pages whenever user tries to access addresses in two
1497 * consecutive pages.
1498 */
1499 if (mem_page != ((start + size - 1) & PAGE_MASK))
1500 mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE*2);
1501 else
1502 mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE);
1503 if (mem_ptr == 0UL)
1504 return -1;
1505 addr = mem_ptr;
1506 addr += start & (PAGE_SIZE - 1);
1507 write_lock_irqsave(&adapter->adapter_lock, flags);
1508 }
1509
1510 switch (size) {
1511 case 1:
1512 writeb(*(uint8_t *)data, addr);
1513 break;
1514 case 2:
1515 writew(*(uint16_t *)data, addr);
1516 break;
1517 case 4:
1518 writel(*(uint32_t *)data, addr);
1519 break;
1520 case 8:
1521 writeq(*(uint64_t *)data, addr);
1522 break;
1523 default:
1524 ret = -1;
1525 break;
1526 }
1527 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1528 DPRINTK(1, INFO, "writing data %llx to offset %llx\n",
1529 *(unsigned long long *)data, start);
1530 if (mem_ptr)
1531 iounmap(mem_ptr);
1532 return ret;
1533}
1534
1535#define MAX_CTL_CHECK 1000
1536
1537int
1538netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter,
1539 u64 off, void *data, int size)
1540{
1541 unsigned long flags, mem_crb;
1542 int i, j, ret = 0, loop, sz[2], off0;
1543 uint32_t temp;
1544 uint64_t off8, tmpw, word[2] = {0, 0};
1545
1546 /*
1547 * If not MN, go check for MS or invalid.
1548 */
1549 if (netxen_nic_pci_mem_bound_check(adapter, off, size) == 0)
1550 return netxen_nic_pci_mem_write_direct(adapter,
1551 off, data, size);
1552
1553 off8 = off & 0xfffffff8;
1554 off0 = off & 0x7;
1555 sz[0] = (size < (8 - off0)) ? size : (8 - off0);
1556 sz[1] = size - sz[0];
1557 loop = ((off0 + size - 1) >> 3) + 1;
1558 mem_crb = (unsigned long)pci_base_offset(adapter, NETXEN_CRB_DDR_NET);
1559
1560 if ((size != 8) || (off0 != 0)) {
1561 for (i = 0; i < loop; i++) {
1562 if (adapter->pci_mem_read(adapter,
1563 off8 + (i << 3), &word[i], 8))
1564 return -1;
1565 }
1566 }
1567
1568 switch (size) {
1569 case 1:
1570 tmpw = *((uint8_t *)data);
1571 break;
1572 case 2:
1573 tmpw = *((uint16_t *)data);
1574 break;
1575 case 4:
1576 tmpw = *((uint32_t *)data);
1577 break;
1578 case 8:
1579 default:
1580 tmpw = *((uint64_t *)data);
1581 break;
1582 }
1583 word[0] &= ~((~(~0ULL << (sz[0] * 8))) << (off0 * 8));
1584 word[0] |= tmpw << (off0 * 8);
1585
1586 if (loop == 2) {
1587 word[1] &= ~(~0ULL << (sz[1] * 8));
1588 word[1] |= tmpw >> (sz[0] * 8);
1589 }
1590
1591 write_lock_irqsave(&adapter->adapter_lock, flags);
1592 netxen_nic_pci_change_crbwindow_128M(adapter, 0);
1593
1594 for (i = 0; i < loop; i++) {
1595 writel((uint32_t)(off8 + (i << 3)),
1596 (void *)(mem_crb+MIU_TEST_AGT_ADDR_LO));
1597 writel(0,
1598 (void *)(mem_crb+MIU_TEST_AGT_ADDR_HI));
1599 writel(word[i] & 0xffffffff,
1600 (void *)(mem_crb+MIU_TEST_AGT_WRDATA_LO));
1601 writel((word[i] >> 32) & 0xffffffff,
1602 (void *)(mem_crb+MIU_TEST_AGT_WRDATA_HI));
1603 writel(MIU_TA_CTL_ENABLE|MIU_TA_CTL_WRITE,
1604 (void *)(mem_crb+MIU_TEST_AGT_CTRL));
1605 writel(MIU_TA_CTL_START|MIU_TA_CTL_ENABLE|MIU_TA_CTL_WRITE,
1606 (void *)(mem_crb+MIU_TEST_AGT_CTRL));
1607
1608 for (j = 0; j < MAX_CTL_CHECK; j++) {
1609 temp = readl(
1610 (void *)(mem_crb+MIU_TEST_AGT_CTRL));
1611 if ((temp & MIU_TA_CTL_BUSY) == 0)
1612 break;
1613 }
1614
1615 if (j >= MAX_CTL_CHECK) {
1616 printk("%s: %s Fail to write through agent\n",
1617 __func__, netxen_nic_driver_name);
1618 ret = -1;
1619 break;
1620 }
1621 }
1622
1623 netxen_nic_pci_change_crbwindow_128M(adapter, 1);
1624 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1625 return ret;
1626}
1627
1628int
1629netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter,
1630 u64 off, void *data, int size)
1631{
1632 unsigned long flags, mem_crb;
1633 int i, j = 0, k, start, end, loop, sz[2], off0[2];
1634 uint32_t temp;
1635 uint64_t off8, val, word[2] = {0, 0};
1636
1637
1638 /*
1639 * If not MN, go check for MS or invalid.
1640 */
1641 if (netxen_nic_pci_mem_bound_check(adapter, off, size) == 0)
1642 return netxen_nic_pci_mem_read_direct(adapter, off, data, size);
1643
1644 off8 = off & 0xfffffff8;
1645 off0[0] = off & 0x7;
1646 off0[1] = 0;
1647 sz[0] = (size < (8 - off0[0])) ? size : (8 - off0[0]);
1648 sz[1] = size - sz[0];
1649 loop = ((off0[0] + size - 1) >> 3) + 1;
1650 mem_crb = (unsigned long)pci_base_offset(adapter, NETXEN_CRB_DDR_NET);
1651
1652 write_lock_irqsave(&adapter->adapter_lock, flags);
1653 netxen_nic_pci_change_crbwindow_128M(adapter, 0);
1654
1655 for (i = 0; i < loop; i++) {
1656 writel((uint32_t)(off8 + (i << 3)),
1657 (void *)(mem_crb+MIU_TEST_AGT_ADDR_LO));
1658 writel(0,
1659 (void *)(mem_crb+MIU_TEST_AGT_ADDR_HI));
1660 writel(MIU_TA_CTL_ENABLE,
1661 (void *)(mem_crb+MIU_TEST_AGT_CTRL));
1662 writel(MIU_TA_CTL_START|MIU_TA_CTL_ENABLE,
1663 (void *)(mem_crb+MIU_TEST_AGT_CTRL));
1664
1665 for (j = 0; j < MAX_CTL_CHECK; j++) {
1666 temp = readl(
1667 (void *)(mem_crb+MIU_TEST_AGT_CTRL));
1668 if ((temp & MIU_TA_CTL_BUSY) == 0)
1669 break;
1670 }
1671
1672 if (j >= MAX_CTL_CHECK) {
1673 printk(KERN_ERR "%s: %s Fail to read through agent\n",
1674 __func__, netxen_nic_driver_name);
1675 break;
1676 }
1677
1678 start = off0[i] >> 2;
1679 end = (off0[i] + sz[i] - 1) >> 2;
1680 for (k = start; k <= end; k++) {
1681 word[i] |= ((uint64_t) readl(
1682 (void *)(mem_crb +
1683 MIU_TEST_AGT_RDDATA(k))) << (32*k));
1684 }
1685 }
1686
1687 netxen_nic_pci_change_crbwindow_128M(adapter, 1);
1688 write_unlock_irqrestore(&adapter->adapter_lock, flags);
1689
1690 if (j >= MAX_CTL_CHECK)
1691 return -1;
1692
1693 if (sz[0] == 8) {
1694 val = word[0];
1695 } else {
1696 val = ((word[0] >> (off0[0] * 8)) & (~(~0ULL << (sz[0] * 8)))) |
1697 ((word[1] & (~(~0ULL << (sz[1] * 8)))) << (sz[0] * 8));
1698 }
1699
1700 switch (size) {
1701 case 1:
1702 *(uint8_t *)data = val;
1703 break;
1704 case 2:
1705 *(uint16_t *)data = val;
1706 break;
1707 case 4:
1708 *(uint32_t *)data = val;
1709 break;
1710 case 8:
1711 *(uint64_t *)data = val;
1712 break;
1713 }
1714 DPRINTK(1, INFO, "read %llx\n", *(unsigned long long *)data);
1715 return 0;
1716}
1717
1718int
1719netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter,
1720 u64 off, void *data, int size)
1721{
1722 int i, j, ret = 0, loop, sz[2], off0;
1723 uint32_t temp;
1724 uint64_t off8, mem_crb, tmpw, word[2] = {0, 0};
1725
1726 /*
1727 * If not MN, go check for MS or invalid.
1728 */
1729 if (off >= NETXEN_ADDR_QDR_NET && off <= NETXEN_ADDR_QDR_NET_MAX_P3)
1730 mem_crb = NETXEN_CRB_QDR_NET;
1731 else {
1732 mem_crb = NETXEN_CRB_DDR_NET;
1733 if (netxen_nic_pci_mem_bound_check(adapter, off, size) == 0)
1734 return netxen_nic_pci_mem_write_direct(adapter,
1735 off, data, size);
1736 }
1737
1738 off8 = off & 0xfffffff8;
1739 off0 = off & 0x7;
1740 sz[0] = (size < (8 - off0)) ? size : (8 - off0);
1741 sz[1] = size - sz[0];
1742 loop = ((off0 + size - 1) >> 3) + 1;
1743
1744 if ((size != 8) || (off0 != 0)) {
1745 for (i = 0; i < loop; i++) {
1746 if (adapter->pci_mem_read(adapter, off8 + (i << 3),
1747 &word[i], 8))
1748 return -1;
1749 }
1750 }
1751
1752 switch (size) {
1753 case 1:
1754 tmpw = *((uint8_t *)data);
1755 break;
1756 case 2:
1757 tmpw = *((uint16_t *)data);
1758 break;
1759 case 4:
1760 tmpw = *((uint32_t *)data);
1761 break;
1762 case 8:
1763 default:
1764 tmpw = *((uint64_t *)data);
1765 break;
1766 }
1767
1768 word[0] &= ~((~(~0ULL << (sz[0] * 8))) << (off0 * 8));
1769 word[0] |= tmpw << (off0 * 8);
1770
1771 if (loop == 2) {
1772 word[1] &= ~(~0ULL << (sz[1] * 8));
1773 word[1] |= tmpw >> (sz[0] * 8);
1774 }
1775
1776 /*
1777 * don't lock here - write_wx gets the lock if each time
1778 * write_lock_irqsave(&adapter->adapter_lock, flags);
1779 * netxen_nic_pci_change_crbwindow_128M(adapter, 0);
1780 */
1781
1782 for (i = 0; i < loop; i++) {
1783 temp = off8 + (i << 3);
1784 adapter->hw_write_wx(adapter,
1785 mem_crb+MIU_TEST_AGT_ADDR_LO, &temp, 4);
1786 temp = 0;
1787 adapter->hw_write_wx(adapter,
1788 mem_crb+MIU_TEST_AGT_ADDR_HI, &temp, 4);
1789 temp = word[i] & 0xffffffff;
1790 adapter->hw_write_wx(adapter,
1791 mem_crb+MIU_TEST_AGT_WRDATA_LO, &temp, 4);
1792 temp = (word[i] >> 32) & 0xffffffff;
1793 adapter->hw_write_wx(adapter,
1794 mem_crb+MIU_TEST_AGT_WRDATA_HI, &temp, 4);
1795 temp = MIU_TA_CTL_ENABLE | MIU_TA_CTL_WRITE;
1796 adapter->hw_write_wx(adapter,
1797 mem_crb+MIU_TEST_AGT_CTRL, &temp, 4);
1798 temp = MIU_TA_CTL_START | MIU_TA_CTL_ENABLE | MIU_TA_CTL_WRITE;
1799 adapter->hw_write_wx(adapter,
1800 mem_crb+MIU_TEST_AGT_CTRL, &temp, 4);
1801
1802 for (j = 0; j < MAX_CTL_CHECK; j++) {
1803 adapter->hw_read_wx(adapter,
1804 mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
1805 if ((temp & MIU_TA_CTL_BUSY) == 0)
1806 break;
1807 }
1808
1809 if (j >= MAX_CTL_CHECK) {
1810 printk(KERN_ERR "%s: Fail to write through agent\n",
1811 netxen_nic_driver_name);
1812 ret = -1;
1813 break;
1814 }
1815 }
1816
1817 /*
1818 * netxen_nic_pci_change_crbwindow_128M(adapter, 1);
1819 * write_unlock_irqrestore(&adapter->adapter_lock, flags);
1820 */
1821 return ret;
1822}
1823
1824int
1825netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter,
1826 u64 off, void *data, int size)
1827{
1828 int i, j = 0, k, start, end, loop, sz[2], off0[2];
1829 uint32_t temp;
1830 uint64_t off8, val, mem_crb, word[2] = {0, 0};
1831
1832 /*
1833 * If not MN, go check for MS or invalid.
1834 */
1835
1836 if (off >= NETXEN_ADDR_QDR_NET && off <= NETXEN_ADDR_QDR_NET_MAX_P3)
1837 mem_crb = NETXEN_CRB_QDR_NET;
1838 else {
1839 mem_crb = NETXEN_CRB_DDR_NET;
1840 if (netxen_nic_pci_mem_bound_check(adapter, off, size) == 0)
1841 return netxen_nic_pci_mem_read_direct(adapter,
1842 off, data, size);
1843 }
1844
1845 off8 = off & 0xfffffff8;
1846 off0[0] = off & 0x7;
1847 off0[1] = 0;
1848 sz[0] = (size < (8 - off0[0])) ? size : (8 - off0[0]);
1849 sz[1] = size - sz[0];
1850 loop = ((off0[0] + size - 1) >> 3) + 1;
1851
1852 /*
1853 * don't lock here - write_wx gets the lock if each time
1854 * write_lock_irqsave(&adapter->adapter_lock, flags);
1855 * netxen_nic_pci_change_crbwindow_128M(adapter, 0);
1856 */
1857
1858 for (i = 0; i < loop; i++) {
1859 temp = off8 + (i << 3);
1860 adapter->hw_write_wx(adapter,
1861 mem_crb + MIU_TEST_AGT_ADDR_LO, &temp, 4);
1862 temp = 0;
1863 adapter->hw_write_wx(adapter,
1864 mem_crb + MIU_TEST_AGT_ADDR_HI, &temp, 4);
1865 temp = MIU_TA_CTL_ENABLE;
1866 adapter->hw_write_wx(adapter,
1867 mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
1868 temp = MIU_TA_CTL_START | MIU_TA_CTL_ENABLE;
1869 adapter->hw_write_wx(adapter,
1870 mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
1871
1872 for (j = 0; j < MAX_CTL_CHECK; j++) {
1873 adapter->hw_read_wx(adapter,
1874 mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
1875 if ((temp & MIU_TA_CTL_BUSY) == 0)
1876 break;
1877 }
1878
1879 if (j >= MAX_CTL_CHECK) {
1880 printk(KERN_ERR "%s: Fail to read through agent\n",
1881 netxen_nic_driver_name);
1882 break;
1883 }
1884
1885 start = off0[i] >> 2;
1886 end = (off0[i] + sz[i] - 1) >> 2;
1887 for (k = start; k <= end; k++) {
1888 adapter->hw_read_wx(adapter,
1889 mem_crb + MIU_TEST_AGT_RDDATA(k), &temp, 4);
1890 word[i] |= ((uint64_t)temp << (32 * k));
1891 }
1892 }
1893
1894 /*
1895 * netxen_nic_pci_change_crbwindow_128M(adapter, 1);
1896 * write_unlock_irqrestore(&adapter->adapter_lock, flags);
1897 */
1898
1899 if (j >= MAX_CTL_CHECK)
1900 return -1;
1901
1902 if (sz[0] == 8) {
1903 val = word[0];
1904 } else {
1905 val = ((word[0] >> (off0[0] * 8)) & (~(~0ULL << (sz[0] * 8)))) |
1906 ((word[1] & (~(~0ULL << (sz[1] * 8)))) << (sz[0] * 8));
1907 }
1908
1909 switch (size) {
1910 case 1:
1911 *(uint8_t *)data = val;
1912 break;
1913 case 2:
1914 *(uint16_t *)data = val;
1915 break;
1916 case 4:
1917 *(uint32_t *)data = val;
1918 break;
1919 case 8:
1920 *(uint64_t *)data = val;
1921 break;
1922 }
1923 DPRINTK(1, INFO, "read %llx\n", *(unsigned long long *)data);
1924 return 0;
1925}
1926
1927/*
1928 * Note : only 32-bit writes!
1929 */
1930int netxen_nic_pci_write_immediate_2M(struct netxen_adapter *adapter,
1931 u64 off, u32 data)
1932{
1933 adapter->hw_write_wx(adapter, off, &data, 4);
1934
1935 return 0;
1936}
1937
1938u32 netxen_nic_pci_read_immediate_2M(struct netxen_adapter *adapter, u64 off)
1939{
1940 u32 temp;
1941 adapter->hw_read_wx(adapter, off, &temp, 4);
1942 return temp;
1943}
1944
1945void netxen_nic_pci_write_normalize_2M(struct netxen_adapter *adapter,
1946 u64 off, u32 data)
1947{
1948 adapter->hw_write_wx(adapter, off, &data, 4);
1949}
1950
1951u32 netxen_nic_pci_read_normalize_2M(struct netxen_adapter *adapter, u64 off)
1952{
1953 u32 temp;
1954 adapter->hw_read_wx(adapter, off, &temp, 4);
1955 return temp;
1956}
1957
951#if 0 1958#if 0
952int 1959int
953netxen_nic_erase_pxe(struct netxen_adapter *adapter) 1960netxen_nic_erase_pxe(struct netxen_adapter *adapter)
@@ -1003,12 +2010,25 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
1003 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: 2010 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
1004 case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: 2011 case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
1005 case NETXEN_BRDTYPE_P2_SB31_10G_CX4: 2012 case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
2013 case NETXEN_BRDTYPE_P3_HMEZ:
2014 case NETXEN_BRDTYPE_P3_XG_LOM:
2015 case NETXEN_BRDTYPE_P3_10G_CX4:
2016 case NETXEN_BRDTYPE_P3_10G_CX4_LP:
2017 case NETXEN_BRDTYPE_P3_IMEZ:
2018 case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
2019 case NETXEN_BRDTYPE_P3_10G_XFP:
2020 case NETXEN_BRDTYPE_P3_10000_BASE_T:
2021
1006 adapter->ahw.board_type = NETXEN_NIC_XGBE; 2022 adapter->ahw.board_type = NETXEN_NIC_XGBE;
1007 break; 2023 break;
1008 case NETXEN_BRDTYPE_P1_BD: 2024 case NETXEN_BRDTYPE_P1_BD:
1009 case NETXEN_BRDTYPE_P1_SB: 2025 case NETXEN_BRDTYPE_P1_SB:
1010 case NETXEN_BRDTYPE_P1_SMAX: 2026 case NETXEN_BRDTYPE_P1_SMAX:
1011 case NETXEN_BRDTYPE_P1_SOCK: 2027 case NETXEN_BRDTYPE_P1_SOCK:
2028 case NETXEN_BRDTYPE_P3_REF_QG:
2029 case NETXEN_BRDTYPE_P3_4_GB:
2030 case NETXEN_BRDTYPE_P3_4_GB_MM:
2031
1012 adapter->ahw.board_type = NETXEN_NIC_GBE; 2032 adapter->ahw.board_type = NETXEN_NIC_GBE;
1013 break; 2033 break;
1014 default: 2034 default:
@@ -1042,25 +2062,11 @@ int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu)
1042 return 0; 2062 return 0;
1043} 2063}
1044 2064
1045void netxen_nic_init_niu_gb(struct netxen_adapter *adapter)
1046{
1047 netxen_niu_gbe_init_port(adapter, adapter->physical_port);
1048}
1049
1050void 2065void
1051netxen_crb_writelit_adapter(struct netxen_adapter *adapter, unsigned long off, 2066netxen_crb_writelit_adapter(struct netxen_adapter *adapter,
1052 int data) 2067 unsigned long off, int data)
1053{ 2068{
1054 void __iomem *addr; 2069 adapter->hw_write_wx(adapter, off, &data, 4);
1055
1056 if (ADDR_IN_WINDOW1(off)) {
1057 writel(data, NETXEN_CRB_NORMALIZE(adapter, off));
1058 } else {
1059 netxen_nic_pci_change_crbwindow(adapter, 0);
1060 addr = pci_base_offset(adapter, off);
1061 writel(data, addr);
1062 netxen_nic_pci_change_crbwindow(adapter, 1);
1063 }
1064} 2070}
1065 2071
1066void netxen_nic_set_link_parameters(struct netxen_adapter *adapter) 2072void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
@@ -1147,12 +2153,11 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter)
1147 addr += sizeof(u32); 2153 addr += sizeof(u32);
1148 } 2154 }
1149 2155
1150 fw_major = readl(NETXEN_CRB_NORMALIZE(adapter, 2156 adapter->hw_read_wx(adapter, NETXEN_FW_VERSION_MAJOR, &fw_major, 4);
1151 NETXEN_FW_VERSION_MAJOR)); 2157 adapter->hw_read_wx(adapter, NETXEN_FW_VERSION_MINOR, &fw_minor, 4);
1152 fw_minor = readl(NETXEN_CRB_NORMALIZE(adapter, 2158 adapter->hw_read_wx(adapter, NETXEN_FW_VERSION_SUB, &fw_build, 4);
1153 NETXEN_FW_VERSION_MINOR)); 2159
1154 fw_build = 2160 adapter->fw_major = fw_major;
1155 readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB));
1156 2161
1157 if (adapter->portnum == 0) { 2162 if (adapter->portnum == 0) {
1158 get_brd_name_by_type(board_info->board_type, brd_name); 2163 get_brd_name_by_type(board_info->board_type, brd_name);
@@ -1163,28 +2168,13 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter)
1163 fw_minor, fw_build); 2168 fw_minor, fw_build);
1164 } 2169 }
1165 2170
1166 if (fw_major != _NETXEN_NIC_LINUX_MAJOR) { 2171 if (NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build) <
1167 adapter->driver_mismatch = 1; 2172 NETXEN_VERSION_CODE(3, 4, 216)) {
1168 }
1169 if (fw_minor != _NETXEN_NIC_LINUX_MINOR &&
1170 fw_minor != (_NETXEN_NIC_LINUX_MINOR + 1)) {
1171 adapter->driver_mismatch = 1; 2173 adapter->driver_mismatch = 1;
1172 } 2174 printk(KERN_ERR "%s: firmware version %d.%d.%d unsupported\n",
1173 if (adapter->driver_mismatch) { 2175 netxen_nic_driver_name,
1174 printk(KERN_ERR "%s: driver and firmware version mismatch\n", 2176 fw_major, fw_minor, fw_build);
1175 adapter->netdev->name);
1176 return; 2177 return;
1177 } 2178 }
1178
1179 switch (adapter->ahw.board_type) {
1180 case NETXEN_NIC_GBE:
1181 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
1182 adapter->netdev->name);
1183 break;
1184 case NETXEN_NIC_XGBE:
1185 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
1186 adapter->netdev->name);
1187 break;
1188 }
1189} 2179}
1190 2180
diff --git a/drivers/net/netxen/netxen_nic_hw.h b/drivers/net/netxen/netxen_nic_hw.h
index a3ea1dd98c41..b8e0030f03d7 100644
--- a/drivers/net/netxen/netxen_nic_hw.h
+++ b/drivers/net/netxen/netxen_nic_hw.h
@@ -82,19 +82,9 @@ struct netxen_adapter;
82 82
83#define NETXEN_PCI_MAPSIZE_BYTES (NETXEN_PCI_MAPSIZE << 20) 83#define NETXEN_PCI_MAPSIZE_BYTES (NETXEN_PCI_MAPSIZE << 20)
84 84
85#define NETXEN_NIC_LOCKED_READ_REG(X, Y) \
86 addr = pci_base_offset(adapter, X); \
87 *(u32 *)Y = readl((void __iomem*) addr);
88
89struct netxen_port; 85struct netxen_port;
90void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); 86void netxen_nic_set_link_parameters(struct netxen_adapter *adapter);
91void netxen_nic_flash_print(struct netxen_adapter *adapter); 87void netxen_nic_flash_print(struct netxen_adapter *adapter);
92int netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off,
93 void *data, int len);
94void netxen_crb_writelit_adapter(struct netxen_adapter *adapter,
95 unsigned long off, int data);
96int netxen_nic_hw_read_wx(struct netxen_adapter *adapter, u64 off,
97 void *data, int len);
98 88
99typedef u8 netxen_ethernet_macaddr_t[6]; 89typedef u8 netxen_ethernet_macaddr_t[6];
100 90
@@ -432,7 +422,8 @@ typedef enum {
432/* Promiscous mode options (GbE mode only) */ 422/* Promiscous mode options (GbE mode only) */
433typedef enum { 423typedef enum {
434 NETXEN_NIU_PROMISC_MODE = 0, 424 NETXEN_NIU_PROMISC_MODE = 0,
435 NETXEN_NIU_NON_PROMISC_MODE 425 NETXEN_NIU_NON_PROMISC_MODE,
426 NETXEN_NIU_ALLMULTI_MODE
436} netxen_niu_prom_mode_t; 427} netxen_niu_prom_mode_t;
437 428
438/* 429/*
@@ -478,42 +469,6 @@ typedef enum {
478#define netxen_xg_soft_reset(config_word) \ 469#define netxen_xg_soft_reset(config_word) \
479 ((config_word) |= 1 << 4) 470 ((config_word) |= 1 << 4)
480 471
481/*
482 * MAC Control Register
483 *
484 * Bit 0-1 : id_pool0
485 * Bit 2 : enable_xtnd0
486 * Bit 4-5 : id_pool1
487 * Bit 6 : enable_xtnd1
488 * Bit 8-9 : id_pool2
489 * Bit 10 : enable_xtnd2
490 * Bit 12-13 : id_pool3
491 * Bit 14 : enable_xtnd3
492 * Bit 24-25 : mode_select
493 * Bit 28-31 : enable_pool
494 */
495
496#define netxen_nic_mcr_set_id_pool0(config, val) \
497 ((config) |= ((val) &0x03))
498#define netxen_nic_mcr_set_enable_xtnd0(config) \
499 ((config) |= 1 << 3)
500#define netxen_nic_mcr_set_id_pool1(config, val) \
501 ((config) |= (((val) & 0x03) << 4))
502#define netxen_nic_mcr_set_enable_xtnd1(config) \
503 ((config) |= 1 << 6)
504#define netxen_nic_mcr_set_id_pool2(config, val) \
505 ((config) |= (((val) & 0x03) << 8))
506#define netxen_nic_mcr_set_enable_xtnd2(config) \
507 ((config) |= 1 << 10)
508#define netxen_nic_mcr_set_id_pool3(config, val) \
509 ((config) |= (((val) & 0x03) << 12))
510#define netxen_nic_mcr_set_enable_xtnd3(config) \
511 ((config) |= 1 << 14)
512#define netxen_nic_mcr_set_mode_select(config, val) \
513 ((config) |= (((val) & 0x03) << 24))
514#define netxen_nic_mcr_set_enable_pool(config, val) \
515 ((config) |= (((val) & 0x0f) << 28))
516
517/* Set promiscuous mode for a GbE interface */ 472/* Set promiscuous mode for a GbE interface */
518int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, 473int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter,
519 netxen_niu_prom_mode_t mode); 474 netxen_niu_prom_mode_t mode);
@@ -538,4 +493,15 @@ int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter);
538 493
539int netxen_niu_disable_xg_port(struct netxen_adapter *adapter); 494int netxen_niu_disable_xg_port(struct netxen_adapter *adapter);
540 495
496typedef struct {
497 unsigned valid;
498 unsigned start_128M;
499 unsigned end_128M;
500 unsigned start_2M;
501} crb_128M_2M_sub_block_map_t;
502
503typedef struct {
504 crb_128M_2M_sub_block_map_t sub_block[16];
505} crb_128M_2M_block_map_t;
506
541#endif /* __NETXEN_NIC_HW_H_ */ 507#endif /* __NETXEN_NIC_HW_H_ */
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index 70d1b22ced22..01ab31b34a85 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -42,8 +42,6 @@ struct crb_addr_pair {
42 u32 data; 42 u32 data;
43}; 43};
44 44
45unsigned long last_schedule_time;
46
47#define NETXEN_MAX_CRB_XFORM 60 45#define NETXEN_MAX_CRB_XFORM 60
48static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; 46static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM];
49#define NETXEN_ADDR_ERROR (0xffffffff) 47#define NETXEN_ADDR_ERROR (0xffffffff)
@@ -117,6 +115,8 @@ static void crb_addr_transform_setup(void)
117 crb_addr_transform(C2C1); 115 crb_addr_transform(C2C1);
118 crb_addr_transform(C2C0); 116 crb_addr_transform(C2C0);
119 crb_addr_transform(SMB); 117 crb_addr_transform(SMB);
118 crb_addr_transform(OCM0);
119 crb_addr_transform(I2C0);
120} 120}
121 121
122int netxen_init_firmware(struct netxen_adapter *adapter) 122int netxen_init_firmware(struct netxen_adapter *adapter)
@@ -124,15 +124,15 @@ int netxen_init_firmware(struct netxen_adapter *adapter)
124 u32 state = 0, loops = 0, err = 0; 124 u32 state = 0, loops = 0, err = 0;
125 125
126 /* Window 1 call */ 126 /* Window 1 call */
127 state = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); 127 state = adapter->pci_read_normalize(adapter, CRB_CMDPEG_STATE);
128 128
129 if (state == PHAN_INITIALIZE_ACK) 129 if (state == PHAN_INITIALIZE_ACK)
130 return 0; 130 return 0;
131 131
132 while (state != PHAN_INITIALIZE_COMPLETE && loops < 2000) { 132 while (state != PHAN_INITIALIZE_COMPLETE && loops < 2000) {
133 udelay(100); 133 msleep(1);
134 /* Window 1 call */ 134 /* Window 1 call */
135 state = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); 135 state = adapter->pci_read_normalize(adapter, CRB_CMDPEG_STATE);
136 136
137 loops++; 137 loops++;
138 } 138 }
@@ -143,64 +143,193 @@ int netxen_init_firmware(struct netxen_adapter *adapter)
143 return err; 143 return err;
144 } 144 }
145 /* Window 1 call */ 145 /* Window 1 call */
146 writel(INTR_SCHEME_PERPORT, 146 adapter->pci_write_normalize(adapter,
147 NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_HOST)); 147 CRB_NIC_CAPABILITIES_HOST, INTR_SCHEME_PERPORT);
148 writel(MSI_MODE_MULTIFUNC, 148 adapter->pci_write_normalize(adapter,
149 NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_HOST)); 149 CRB_NIC_MSI_MODE_HOST, MSI_MODE_MULTIFUNC);
150 writel(MPORT_MULTI_FUNCTION_MODE, 150 adapter->pci_write_normalize(adapter,
151 NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE)); 151 CRB_MPORT_MODE, MPORT_MULTI_FUNCTION_MODE);
152 writel(PHAN_INITIALIZE_ACK, 152 adapter->pci_write_normalize(adapter,
153 NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); 153 CRB_CMDPEG_STATE, PHAN_INITIALIZE_ACK);
154 154
155 return err; 155 return err;
156} 156}
157 157
158#define NETXEN_ADDR_LIMIT 0xffffffffULL 158void netxen_release_rx_buffers(struct netxen_adapter *adapter)
159{
160 struct netxen_recv_context *recv_ctx;
161 struct nx_host_rds_ring *rds_ring;
162 struct netxen_rx_buffer *rx_buf;
163 int i, ctxid, ring;
164
165 for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) {
166 recv_ctx = &adapter->recv_ctx[ctxid];
167 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
168 rds_ring = &recv_ctx->rds_rings[ring];
169 for (i = 0; i < rds_ring->max_rx_desc_count; ++i) {
170 rx_buf = &(rds_ring->rx_buf_arr[i]);
171 if (rx_buf->state == NETXEN_BUFFER_FREE)
172 continue;
173 pci_unmap_single(adapter->pdev,
174 rx_buf->dma,
175 rds_ring->dma_size,
176 PCI_DMA_FROMDEVICE);
177 if (rx_buf->skb != NULL)
178 dev_kfree_skb_any(rx_buf->skb);
179 }
180 }
181 }
182}
159 183
160void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, 184void netxen_release_tx_buffers(struct netxen_adapter *adapter)
161 struct pci_dev **used_dev)
162{ 185{
163 void *addr; 186 struct netxen_cmd_buffer *cmd_buf;
187 struct netxen_skb_frag *buffrag;
188 int i, j;
189
190 cmd_buf = adapter->cmd_buf_arr;
191 for (i = 0; i < adapter->max_tx_desc_count; i++) {
192 buffrag = cmd_buf->frag_array;
193 if (buffrag->dma) {
194 pci_unmap_single(adapter->pdev, buffrag->dma,
195 buffrag->length, PCI_DMA_TODEVICE);
196 buffrag->dma = 0ULL;
197 }
198 for (j = 0; j < cmd_buf->frag_count; j++) {
199 buffrag++;
200 if (buffrag->dma) {
201 pci_unmap_page(adapter->pdev, buffrag->dma,
202 buffrag->length,
203 PCI_DMA_TODEVICE);
204 buffrag->dma = 0ULL;
205 }
206 }
207 /* Free the skb we received in netxen_nic_xmit_frame */
208 if (cmd_buf->skb) {
209 dev_kfree_skb_any(cmd_buf->skb);
210 cmd_buf->skb = NULL;
211 }
212 cmd_buf++;
213 }
214}
164 215
165 addr = pci_alloc_consistent(pdev, sz, ptr); 216void netxen_free_sw_resources(struct netxen_adapter *adapter)
166 if ((unsigned long long)(*ptr) < NETXEN_ADDR_LIMIT) { 217{
167 *used_dev = pdev; 218 struct netxen_recv_context *recv_ctx;
168 return addr; 219 struct nx_host_rds_ring *rds_ring;
220 int ctx, ring;
221
222 for (ctx = 0; ctx < MAX_RCV_CTX; ctx++) {
223 recv_ctx = &adapter->recv_ctx[ctx];
224 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
225 rds_ring = &recv_ctx->rds_rings[ring];
226 if (rds_ring->rx_buf_arr) {
227 vfree(rds_ring->rx_buf_arr);
228 rds_ring->rx_buf_arr = NULL;
229 }
230 }
169 } 231 }
170 pci_free_consistent(pdev, sz, addr, *ptr); 232 if (adapter->cmd_buf_arr)
171 addr = pci_alloc_consistent(NULL, sz, ptr); 233 vfree(adapter->cmd_buf_arr);
172 *used_dev = NULL; 234 return;
173 return addr;
174} 235}
175 236
176void netxen_initialize_adapter_sw(struct netxen_adapter *adapter) 237int netxen_alloc_sw_resources(struct netxen_adapter *adapter)
177{ 238{
178 int ctxid, ring; 239 struct netxen_recv_context *recv_ctx;
179 u32 i; 240 struct nx_host_rds_ring *rds_ring;
180 u32 num_rx_bufs = 0; 241 struct netxen_rx_buffer *rx_buf;
181 struct netxen_rcv_desc_ctx *rcv_desc; 242 int ctx, ring, i, num_rx_bufs;
182 243
183 DPRINTK(INFO, "initializing some queues: %p\n", adapter); 244 struct netxen_cmd_buffer *cmd_buf_arr;
184 for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) { 245 struct net_device *netdev = adapter->netdev;
185 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) { 246
186 struct netxen_rx_buffer *rx_buf; 247 cmd_buf_arr = (struct netxen_cmd_buffer *)vmalloc(TX_RINGSIZE);
187 rcv_desc = &adapter->recv_ctx[ctxid].rcv_desc[ring]; 248 if (cmd_buf_arr == NULL) {
188 rcv_desc->begin_alloc = 0; 249 printk(KERN_ERR "%s: Failed to allocate cmd buffer ring\n",
189 rx_buf = rcv_desc->rx_buf_arr; 250 netdev->name);
190 num_rx_bufs = rcv_desc->max_rx_desc_count; 251 return -ENOMEM;
252 }
253 memset(cmd_buf_arr, 0, TX_RINGSIZE);
254 adapter->cmd_buf_arr = cmd_buf_arr;
255
256 for (ctx = 0; ctx < MAX_RCV_CTX; ctx++) {
257 recv_ctx = &adapter->recv_ctx[ctx];
258 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
259 rds_ring = &recv_ctx->rds_rings[ring];
260 switch (RCV_DESC_TYPE(ring)) {
261 case RCV_DESC_NORMAL:
262 rds_ring->max_rx_desc_count =
263 adapter->max_rx_desc_count;
264 rds_ring->flags = RCV_DESC_NORMAL;
265 if (adapter->ahw.cut_through) {
266 rds_ring->dma_size =
267 NX_CT_DEFAULT_RX_BUF_LEN;
268 rds_ring->skb_size =
269 NX_CT_DEFAULT_RX_BUF_LEN;
270 } else {
271 rds_ring->dma_size = RX_DMA_MAP_LEN;
272 rds_ring->skb_size =
273 MAX_RX_BUFFER_LENGTH;
274 }
275 break;
276
277 case RCV_DESC_JUMBO:
278 rds_ring->max_rx_desc_count =
279 adapter->max_jumbo_rx_desc_count;
280 rds_ring->flags = RCV_DESC_JUMBO;
281 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
282 rds_ring->dma_size =
283 NX_P3_RX_JUMBO_BUF_MAX_LEN;
284 else
285 rds_ring->dma_size =
286 NX_P2_RX_JUMBO_BUF_MAX_LEN;
287 rds_ring->skb_size =
288 rds_ring->dma_size + NET_IP_ALIGN;
289 break;
290
291 case RCV_RING_LRO:
292 rds_ring->max_rx_desc_count =
293 adapter->max_lro_rx_desc_count;
294 rds_ring->flags = RCV_DESC_LRO;
295 rds_ring->dma_size = RX_LRO_DMA_MAP_LEN;
296 rds_ring->skb_size = MAX_RX_LRO_BUFFER_LENGTH;
297 break;
298
299 }
300 rds_ring->rx_buf_arr = (struct netxen_rx_buffer *)
301 vmalloc(RCV_BUFFSIZE);
302 if (rds_ring->rx_buf_arr == NULL) {
303 printk(KERN_ERR "%s: Failed to allocate "
304 "rx buffer ring %d\n",
305 netdev->name, ring);
306 /* free whatever was already allocated */
307 goto err_out;
308 }
309 memset(rds_ring->rx_buf_arr, 0, RCV_BUFFSIZE);
310 INIT_LIST_HEAD(&rds_ring->free_list);
311 rds_ring->begin_alloc = 0;
191 /* 312 /*
192 * Now go through all of them, set reference handles 313 * Now go through all of them, set reference handles
193 * and put them in the queues. 314 * and put them in the queues.
194 */ 315 */
316 num_rx_bufs = rds_ring->max_rx_desc_count;
317 rx_buf = rds_ring->rx_buf_arr;
195 for (i = 0; i < num_rx_bufs; i++) { 318 for (i = 0; i < num_rx_bufs; i++) {
319 list_add_tail(&rx_buf->list,
320 &rds_ring->free_list);
196 rx_buf->ref_handle = i; 321 rx_buf->ref_handle = i;
197 rx_buf->state = NETXEN_BUFFER_FREE; 322 rx_buf->state = NETXEN_BUFFER_FREE;
198 DPRINTK(INFO, "Rx buf:ctx%d i(%d) rx_buf:"
199 "%p\n", ctxid, i, rx_buf);
200 rx_buf++; 323 rx_buf++;
201 } 324 }
202 } 325 }
203 } 326 }
327
328 return 0;
329
330err_out:
331 netxen_free_sw_resources(adapter);
332 return -ENOMEM;
204} 333}
205 334
206void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) 335void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
@@ -211,14 +340,12 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
211 netxen_niu_gbe_enable_phy_interrupts; 340 netxen_niu_gbe_enable_phy_interrupts;
212 adapter->disable_phy_interrupts = 341 adapter->disable_phy_interrupts =
213 netxen_niu_gbe_disable_phy_interrupts; 342 netxen_niu_gbe_disable_phy_interrupts;
214 adapter->handle_phy_intr = netxen_nic_gbe_handle_phy_intr;
215 adapter->macaddr_set = netxen_niu_macaddr_set; 343 adapter->macaddr_set = netxen_niu_macaddr_set;
216 adapter->set_mtu = netxen_nic_set_mtu_gb; 344 adapter->set_mtu = netxen_nic_set_mtu_gb;
217 adapter->set_promisc = netxen_niu_set_promiscuous_mode; 345 adapter->set_promisc = netxen_niu_set_promiscuous_mode;
218 adapter->unset_promisc = netxen_niu_set_promiscuous_mode;
219 adapter->phy_read = netxen_niu_gbe_phy_read; 346 adapter->phy_read = netxen_niu_gbe_phy_read;
220 adapter->phy_write = netxen_niu_gbe_phy_write; 347 adapter->phy_write = netxen_niu_gbe_phy_write;
221 adapter->init_niu = netxen_nic_init_niu_gb; 348 adapter->init_port = netxen_niu_gbe_init_port;
222 adapter->stop_port = netxen_niu_disable_gbe_port; 349 adapter->stop_port = netxen_niu_disable_gbe_port;
223 break; 350 break;
224 351
@@ -227,12 +354,10 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
227 netxen_niu_xgbe_enable_phy_interrupts; 354 netxen_niu_xgbe_enable_phy_interrupts;
228 adapter->disable_phy_interrupts = 355 adapter->disable_phy_interrupts =
229 netxen_niu_xgbe_disable_phy_interrupts; 356 netxen_niu_xgbe_disable_phy_interrupts;
230 adapter->handle_phy_intr = netxen_nic_xgbe_handle_phy_intr;
231 adapter->macaddr_set = netxen_niu_xg_macaddr_set; 357 adapter->macaddr_set = netxen_niu_xg_macaddr_set;
232 adapter->set_mtu = netxen_nic_set_mtu_xgb; 358 adapter->set_mtu = netxen_nic_set_mtu_xgb;
233 adapter->init_port = netxen_niu_xg_init_port; 359 adapter->init_port = netxen_niu_xg_init_port;
234 adapter->set_promisc = netxen_niu_xg_set_promiscuous_mode; 360 adapter->set_promisc = netxen_niu_xg_set_promiscuous_mode;
235 adapter->unset_promisc = netxen_niu_xg_set_promiscuous_mode;
236 adapter->stop_port = netxen_niu_disable_xg_port; 361 adapter->stop_port = netxen_niu_disable_xg_port;
237 break; 362 break;
238 363
@@ -270,7 +395,9 @@ static u32 netxen_decode_crb_addr(u32 addr)
270 395
271static long rom_max_timeout = 100; 396static long rom_max_timeout = 100;
272static long rom_lock_timeout = 10000; 397static long rom_lock_timeout = 10000;
398#if 0
273static long rom_write_timeout = 700; 399static long rom_write_timeout = 700;
400#endif
274 401
275static int rom_lock(struct netxen_adapter *adapter) 402static int rom_lock(struct netxen_adapter *adapter)
276{ 403{
@@ -319,6 +446,7 @@ static int netxen_wait_rom_done(struct netxen_adapter *adapter)
319 return 0; 446 return 0;
320} 447}
321 448
449#if 0
322static int netxen_rom_wren(struct netxen_adapter *adapter) 450static int netxen_rom_wren(struct netxen_adapter *adapter)
323{ 451{
324 /* Set write enable latch in ROM status register */ 452 /* Set write enable latch in ROM status register */
@@ -348,6 +476,7 @@ static int netxen_do_rom_rdsr(struct netxen_adapter *adapter)
348 } 476 }
349 return netxen_rdcrbreg(adapter, NETXEN_ROMUSB_ROM_RDATA); 477 return netxen_rdcrbreg(adapter, NETXEN_ROMUSB_ROM_RDATA);
350} 478}
479#endif
351 480
352static void netxen_rom_unlock(struct netxen_adapter *adapter) 481static void netxen_rom_unlock(struct netxen_adapter *adapter)
353{ 482{
@@ -358,6 +487,7 @@ static void netxen_rom_unlock(struct netxen_adapter *adapter)
358 487
359} 488}
360 489
490#if 0
361static int netxen_rom_wip_poll(struct netxen_adapter *adapter) 491static int netxen_rom_wip_poll(struct netxen_adapter *adapter)
362{ 492{
363 long timeout = 0; 493 long timeout = 0;
@@ -393,6 +523,7 @@ static int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
393 523
394 return netxen_rom_wip_poll(adapter); 524 return netxen_rom_wip_poll(adapter);
395} 525}
526#endif
396 527
397static int do_rom_fast_read(struct netxen_adapter *adapter, 528static int do_rom_fast_read(struct netxen_adapter *adapter,
398 int addr, int *valp) 529 int addr, int *valp)
@@ -475,7 +606,6 @@ int netxen_rom_fast_write(struct netxen_adapter *adapter, int addr, int data)
475 netxen_rom_unlock(adapter); 606 netxen_rom_unlock(adapter);
476 return ret; 607 return ret;
477} 608}
478#endif /* 0 */
479 609
480static int do_rom_fast_write_words(struct netxen_adapter *adapter, 610static int do_rom_fast_write_words(struct netxen_adapter *adapter,
481 int addr, u8 *bytes, size_t size) 611 int addr, u8 *bytes, size_t size)
@@ -740,28 +870,25 @@ int netxen_flash_unlock(struct netxen_adapter *adapter)
740 870
741 return ret; 871 return ret;
742} 872}
873#endif /* 0 */
743 874
744#define NETXEN_BOARDTYPE 0x4008 875#define NETXEN_BOARDTYPE 0x4008
745#define NETXEN_BOARDNUM 0x400c 876#define NETXEN_BOARDNUM 0x400c
746#define NETXEN_CHIPNUM 0x4010 877#define NETXEN_CHIPNUM 0x4010
747#define NETXEN_ROMBUS_RESET 0xFFFFFFFF
748#define NETXEN_ROM_FIRST_BARRIER 0x800000000ULL
749#define NETXEN_ROM_FOUND_INIT 0x400
750 878
751int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) 879int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
752{ 880{
753 int addr, val; 881 int addr, val;
754 int n, i; 882 int i, init_delay = 0;
755 int init_delay = 0;
756 struct crb_addr_pair *buf; 883 struct crb_addr_pair *buf;
884 unsigned offset, n;
757 u32 off; 885 u32 off;
758 886
759 /* resetall */ 887 /* resetall */
760 netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 888 netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET,
761 NETXEN_ROMBUS_RESET); 889 0xffffffff);
762 890
763 if (verbose) { 891 if (verbose) {
764 int val;
765 if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0) 892 if (netxen_rom_fast_read(adapter, NETXEN_BOARDTYPE, &val) == 0)
766 printk("P2 ROM board type: 0x%08x\n", val); 893 printk("P2 ROM board type: 0x%08x\n", val);
767 else 894 else
@@ -776,117 +903,141 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
776 printk("Could not read chip number\n"); 903 printk("Could not read chip number\n");
777 } 904 }
778 905
779 if (netxen_rom_fast_read(adapter, 0, &n) == 0 906 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
780 && (n & NETXEN_ROM_FIRST_BARRIER)) { 907 if (netxen_rom_fast_read(adapter, 0, &n) != 0 ||
781 n &= ~NETXEN_ROM_ROUNDUP; 908 (n != 0xcafecafeUL) ||
782 if (n < NETXEN_ROM_FOUND_INIT) { 909 netxen_rom_fast_read(adapter, 4, &n) != 0) {
783 if (verbose) 910 printk(KERN_ERR "%s: ERROR Reading crb_init area: "
784 printk("%s: %d CRB init values found" 911 "n: %08x\n", netxen_nic_driver_name, n);
785 " in ROM.\n", netxen_nic_driver_name, n);
786 } else {
787 printk("%s:n=0x%x Error! NetXen card flash not"
788 " initialized.\n", __FUNCTION__, n);
789 return -EIO; 912 return -EIO;
790 } 913 }
791 buf = kcalloc(n, sizeof(struct crb_addr_pair), GFP_KERNEL); 914 offset = n & 0xffffU;
792 if (buf == NULL) { 915 n = (n >> 16) & 0xffffU;
793 printk("%s: netxen_pinit_from_rom: Unable to calloc " 916 } else {
794 "memory.\n", netxen_nic_driver_name); 917 if (netxen_rom_fast_read(adapter, 0, &n) != 0 ||
795 return -ENOMEM; 918 !(n & 0x80000000)) {
796 } 919 printk(KERN_ERR "%s: ERROR Reading crb_init area: "
797 for (i = 0; i < n; i++) { 920 "n: %08x\n", netxen_nic_driver_name, n);
798 if (netxen_rom_fast_read(adapter, 8 * i + 4, &val) != 0 921 return -EIO;
799 || netxen_rom_fast_read(adapter, 8 * i + 8,
800 &addr) != 0)
801 return -EIO;
802
803 buf[i].addr = addr;
804 buf[i].data = val;
805
806 if (verbose)
807 printk("%s: PCI: 0x%08x == 0x%08x\n",
808 netxen_nic_driver_name, (unsigned int)
809 netxen_decode_crb_addr(addr), val);
810 } 922 }
811 for (i = 0; i < n; i++) { 923 offset = 1;
924 n &= ~0x80000000;
925 }
926
927 if (n < 1024) {
928 if (verbose)
929 printk(KERN_DEBUG "%s: %d CRB init values found"
930 " in ROM.\n", netxen_nic_driver_name, n);
931 } else {
932 printk(KERN_ERR "%s:n=0x%x Error! NetXen card flash not"
933 " initialized.\n", __func__, n);
934 return -EIO;
935 }
936
937 buf = kcalloc(n, sizeof(struct crb_addr_pair), GFP_KERNEL);
938 if (buf == NULL) {
939 printk("%s: netxen_pinit_from_rom: Unable to calloc memory.\n",
940 netxen_nic_driver_name);
941 return -ENOMEM;
942 }
943 for (i = 0; i < n; i++) {
944 if (netxen_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
945 netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0)
946 return -EIO;
947
948 buf[i].addr = addr;
949 buf[i].data = val;
812 950
813 off = netxen_decode_crb_addr(buf[i].addr); 951 if (verbose)
814 if (off == NETXEN_ADDR_ERROR) { 952 printk(KERN_DEBUG "%s: PCI: 0x%08x == 0x%08x\n",
815 printk(KERN_ERR"CRB init value out of range %x\n", 953 netxen_nic_driver_name,
954 (u32)netxen_decode_crb_addr(addr), val);
955 }
956 for (i = 0; i < n; i++) {
957
958 off = netxen_decode_crb_addr(buf[i].addr);
959 if (off == NETXEN_ADDR_ERROR) {
960 printk(KERN_ERR"CRB init value out of range %x\n",
816 buf[i].addr); 961 buf[i].addr);
962 continue;
963 }
964 off += NETXEN_PCI_CRBSPACE;
965 /* skipping cold reboot MAGIC */
966 if (off == NETXEN_CAM_RAM(0x1fc))
967 continue;
968
969 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
970 /* do not reset PCI */
971 if (off == (ROMUSB_GLB + 0xbc))
817 continue; 972 continue;
818 } 973 if (off == (NETXEN_CRB_PEG_NET_1 + 0x18))
819 off += NETXEN_PCI_CRBSPACE; 974 buf[i].data = 0x1020;
820 /* skipping cold reboot MAGIC */ 975 /* skip the function enable register */
821 if (off == NETXEN_CAM_RAM(0x1fc)) 976 if (off == NETXEN_PCIE_REG(PCIE_SETUP_FUNCTION))
977 continue;
978 if (off == NETXEN_PCIE_REG(PCIE_SETUP_FUNCTION2))
822 continue; 979 continue;
980 if ((off & 0x0ff00000) == NETXEN_CRB_SMB)
981 continue;
982 }
823 983
824 /* After writing this register, HW needs time for CRB */ 984 if (off == NETXEN_ADDR_ERROR) {
825 /* to quiet down (else crb_window returns 0xffffffff) */ 985 printk(KERN_ERR "%s: Err: Unknown addr: 0x%08x\n",
826 if (off == NETXEN_ROMUSB_GLB_SW_RESET) { 986 netxen_nic_driver_name, buf[i].addr);
827 init_delay = 1; 987 continue;
988 }
989
990 /* After writing this register, HW needs time for CRB */
991 /* to quiet down (else crb_window returns 0xffffffff) */
992 if (off == NETXEN_ROMUSB_GLB_SW_RESET) {
993 init_delay = 1;
994 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
828 /* hold xdma in reset also */ 995 /* hold xdma in reset also */
829 buf[i].data = NETXEN_NIC_XDMA_RESET; 996 buf[i].data = NETXEN_NIC_XDMA_RESET;
830 } 997 }
998 }
831 999
832 if (ADDR_IN_WINDOW1(off)) { 1000 adapter->hw_write_wx(adapter, off, &buf[i].data, 4);
833 writel(buf[i].data,
834 NETXEN_CRB_NORMALIZE(adapter, off));
835 } else {
836 netxen_nic_pci_change_crbwindow(adapter, 0);
837 writel(buf[i].data,
838 pci_base_offset(adapter, off));
839 1001
840 netxen_nic_pci_change_crbwindow(adapter, 1); 1002 if (init_delay == 1) {
841 } 1003 msleep(1000);
842 if (init_delay == 1) { 1004 init_delay = 0;
843 msleep(1000);
844 init_delay = 0;
845 }
846 msleep(1);
847 } 1005 }
848 kfree(buf); 1006 msleep(1);
1007 }
1008 kfree(buf);
849 1009
850 /* disable_peg_cache_all */ 1010 /* disable_peg_cache_all */
851 1011
852 /* unreset_net_cache */ 1012 /* unreset_net_cache */
853 netxen_nic_hw_read_wx(adapter, NETXEN_ROMUSB_GLB_SW_RESET, &val, 1013 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
854 4); 1014 adapter->hw_read_wx(adapter,
855 netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 1015 NETXEN_ROMUSB_GLB_SW_RESET, &val, 4);
856 (val & 0xffffff0f));
857 /* p2dn replyCount */
858 netxen_crb_writelit_adapter(adapter,
859 NETXEN_CRB_PEG_NET_D + 0xec, 0x1e);
860 /* disable_peg_cache 0 */
861 netxen_crb_writelit_adapter(adapter, 1016 netxen_crb_writelit_adapter(adapter,
862 NETXEN_CRB_PEG_NET_D + 0x4c, 8); 1017 NETXEN_ROMUSB_GLB_SW_RESET, (val & 0xffffff0f));
863 /* disable_peg_cache 1 */
864 netxen_crb_writelit_adapter(adapter,
865 NETXEN_CRB_PEG_NET_I + 0x4c, 8);
866
867 /* peg_clr_all */
868
869 /* peg_clr 0 */
870 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_0 + 0x8,
871 0);
872 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_0 + 0xc,
873 0);
874 /* peg_clr 1 */
875 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_1 + 0x8,
876 0);
877 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_1 + 0xc,
878 0);
879 /* peg_clr 2 */
880 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_2 + 0x8,
881 0);
882 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_2 + 0xc,
883 0);
884 /* peg_clr 3 */
885 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_3 + 0x8,
886 0);
887 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_3 + 0xc,
888 0);
889 } 1018 }
1019
1020 /* p2dn replyCount */
1021 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_D + 0xec, 0x1e);
1022 /* disable_peg_cache 0 */
1023 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_D + 0x4c, 8);
1024 /* disable_peg_cache 1 */
1025 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_I + 0x4c, 8);
1026
1027 /* peg_clr_all */
1028
1029 /* peg_clr 0 */
1030 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_0 + 0x8, 0);
1031 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_0 + 0xc, 0);
1032 /* peg_clr 1 */
1033 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_1 + 0x8, 0);
1034 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_1 + 0xc, 0);
1035 /* peg_clr 2 */
1036 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_2 + 0x8, 0);
1037 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_2 + 0xc, 0);
1038 /* peg_clr 3 */
1039 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_3 + 0x8, 0);
1040 netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_3 + 0xc, 0);
890 return 0; 1041 return 0;
891} 1042}
892 1043
@@ -897,12 +1048,12 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter)
897 uint32_t lo; 1048 uint32_t lo;
898 1049
899 adapter->dummy_dma.addr = 1050 adapter->dummy_dma.addr =
900 pci_alloc_consistent(adapter->ahw.pdev, 1051 pci_alloc_consistent(adapter->pdev,
901 NETXEN_HOST_DUMMY_DMA_SIZE, 1052 NETXEN_HOST_DUMMY_DMA_SIZE,
902 &adapter->dummy_dma.phys_addr); 1053 &adapter->dummy_dma.phys_addr);
903 if (adapter->dummy_dma.addr == NULL) { 1054 if (adapter->dummy_dma.addr == NULL) {
904 printk("%s: ERROR: Could not allocate dummy DMA memory\n", 1055 printk("%s: ERROR: Could not allocate dummy DMA memory\n",
905 __FUNCTION__); 1056 __func__);
906 return -ENOMEM; 1057 return -ENOMEM;
907 } 1058 }
908 1059
@@ -910,8 +1061,13 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter)
910 hi = (addr >> 32) & 0xffffffff; 1061 hi = (addr >> 32) & 0xffffffff;
911 lo = addr & 0xffffffff; 1062 lo = addr & 0xffffffff;
912 1063
913 writel(hi, NETXEN_CRB_NORMALIZE(adapter, CRB_HOST_DUMMY_BUF_ADDR_HI)); 1064 adapter->pci_write_normalize(adapter, CRB_HOST_DUMMY_BUF_ADDR_HI, hi);
914 writel(lo, NETXEN_CRB_NORMALIZE(adapter, CRB_HOST_DUMMY_BUF_ADDR_LO)); 1065 adapter->pci_write_normalize(adapter, CRB_HOST_DUMMY_BUF_ADDR_LO, lo);
1066
1067 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1068 uint32_t temp = 0;
1069 adapter->hw_write_wx(adapter, CRB_HOST_DUMMY_BUF, &temp, 4);
1070 }
915 1071
916 return 0; 1072 return 0;
917} 1073}
@@ -931,7 +1087,7 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter)
931 } while (--i); 1087 } while (--i);
932 1088
933 if (i) { 1089 if (i) {
934 pci_free_consistent(adapter->ahw.pdev, 1090 pci_free_consistent(adapter->pdev,
935 NETXEN_HOST_DUMMY_DMA_SIZE, 1091 NETXEN_HOST_DUMMY_DMA_SIZE,
936 adapter->dummy_dma.addr, 1092 adapter->dummy_dma.addr,
937 adapter->dummy_dma.phys_addr); 1093 adapter->dummy_dma.phys_addr);
@@ -946,22 +1102,24 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter)
946int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val) 1102int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
947{ 1103{
948 u32 val = 0; 1104 u32 val = 0;
949 int retries = 30; 1105 int retries = 60;
950 1106
951 if (!pegtune_val) { 1107 if (!pegtune_val) {
952 do { 1108 do {
953 val = readl(NETXEN_CRB_NORMALIZE 1109 val = adapter->pci_read_normalize(adapter,
954 (adapter, CRB_CMDPEG_STATE)); 1110 CRB_CMDPEG_STATE);
955 pegtune_val = readl(NETXEN_CRB_NORMALIZE
956 (adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE));
957 1111
958 if (val == PHAN_INITIALIZE_COMPLETE || 1112 if (val == PHAN_INITIALIZE_COMPLETE ||
959 val == PHAN_INITIALIZE_ACK) 1113 val == PHAN_INITIALIZE_ACK)
960 return 0; 1114 return 0;
961 1115
962 msleep(1000); 1116 msleep(500);
1117
963 } while (--retries); 1118 } while (--retries);
1119
964 if (!retries) { 1120 if (!retries) {
1121 pegtune_val = adapter->pci_read_normalize(adapter,
1122 NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
965 printk(KERN_WARNING "netxen_phantom_init: init failed, " 1123 printk(KERN_WARNING "netxen_phantom_init: init failed, "
966 "pegtune_val=%x\n", pegtune_val); 1124 "pegtune_val=%x\n", pegtune_val);
967 return -1; 1125 return -1;
@@ -971,58 +1129,61 @@ int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
971 return 0; 1129 return 0;
972} 1130}
973 1131
974static int netxen_nic_check_temp(struct netxen_adapter *adapter) 1132int netxen_receive_peg_ready(struct netxen_adapter *adapter)
975{ 1133{
976 struct net_device *netdev = adapter->netdev; 1134 u32 val = 0;
977 uint32_t temp, temp_state, temp_val; 1135 int retries = 2000;
978 int rv = 0; 1136
979 1137 do {
980 temp = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_TEMP_STATE)); 1138 val = adapter->pci_read_normalize(adapter, CRB_RCVPEG_STATE);
981 1139
982 temp_state = nx_get_temp_state(temp); 1140 if (val == PHAN_PEG_RCV_INITIALIZED)
983 temp_val = nx_get_temp_val(temp); 1141 return 0;
984 1142
985 if (temp_state == NX_TEMP_PANIC) { 1143 msleep(10);
986 printk(KERN_ALERT 1144
987 "%s: Device temperature %d degrees C exceeds" 1145 } while (--retries);
988 " maximum allowed. Hardware has been shut down.\n", 1146
989 netxen_nic_driver_name, temp_val); 1147 if (!retries) {
990 1148 printk(KERN_ERR "Receive Peg initialization not "
991 netif_carrier_off(netdev); 1149 "complete, state: 0x%x.\n", val);
992 netif_stop_queue(netdev); 1150 return -EIO;
993 rv = 1;
994 } else if (temp_state == NX_TEMP_WARN) {
995 if (adapter->temp == NX_TEMP_NORMAL) {
996 printk(KERN_ALERT
997 "%s: Device temperature %d degrees C "
998 "exceeds operating range."
999 " Immediate action needed.\n",
1000 netxen_nic_driver_name, temp_val);
1001 }
1002 } else {
1003 if (adapter->temp == NX_TEMP_WARN) {
1004 printk(KERN_INFO
1005 "%s: Device temperature is now %d degrees C"
1006 " in normal range.\n", netxen_nic_driver_name,
1007 temp_val);
1008 }
1009 } 1151 }
1010 adapter->temp = temp_state; 1152
1011 return rv; 1153 return 0;
1012} 1154}
1013 1155
1014void netxen_watchdog_task(struct work_struct *work) 1156static struct sk_buff *netxen_process_rxbuf(struct netxen_adapter *adapter,
1157 struct nx_host_rds_ring *rds_ring, u16 index, u16 cksum)
1015{ 1158{
1016 struct netxen_adapter *adapter = 1159 struct netxen_rx_buffer *buffer;
1017 container_of(work, struct netxen_adapter, watchdog_task); 1160 struct sk_buff *skb;
1018 1161
1019 if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter)) 1162 buffer = &rds_ring->rx_buf_arr[index];
1020 return; 1163
1164 pci_unmap_single(adapter->pdev, buffer->dma, rds_ring->dma_size,
1165 PCI_DMA_FROMDEVICE);
1021 1166
1022 if (adapter->handle_phy_intr) 1167 skb = buffer->skb;
1023 adapter->handle_phy_intr(adapter); 1168 if (!skb)
1169 goto no_skb;
1024 1170
1025 mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); 1171 if (likely(adapter->rx_csum && cksum == STATUS_CKSUM_OK)) {
1172 adapter->stats.csummed++;
1173 skb->ip_summed = CHECKSUM_UNNECESSARY;
1174 } else
1175 skb->ip_summed = CHECKSUM_NONE;
1176
1177 skb->dev = adapter->netdev;
1178
1179 buffer->skb = NULL;
1180
1181no_skb:
1182 buffer->state = NETXEN_BUFFER_FREE;
1183 buffer->lro_current_frags = 0;
1184 buffer->lro_expected_frags = 0;
1185 list_add_tail(&buffer->list, &rds_ring->free_list);
1186 return skb;
1026} 1187}
1027 1188
1028/* 1189/*
@@ -1031,9 +1192,8 @@ void netxen_watchdog_task(struct work_struct *work)
1031 * invoke the routine to send more rx buffers to the Phantom... 1192 * invoke the routine to send more rx buffers to the Phantom...
1032 */ 1193 */
1033static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, 1194static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
1034 struct status_desc *desc) 1195 struct status_desc *desc, struct status_desc *frag_desc)
1035{ 1196{
1036 struct pci_dev *pdev = adapter->pdev;
1037 struct net_device *netdev = adapter->netdev; 1197 struct net_device *netdev = adapter->netdev;
1038 u64 sts_data = le64_to_cpu(desc->status_desc_data); 1198 u64 sts_data = le64_to_cpu(desc->status_desc_data);
1039 int index = netxen_get_sts_refhandle(sts_data); 1199 int index = netxen_get_sts_refhandle(sts_data);
@@ -1042,8 +1202,8 @@ static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
1042 struct sk_buff *skb; 1202 struct sk_buff *skb;
1043 u32 length = netxen_get_sts_totallength(sts_data); 1203 u32 length = netxen_get_sts_totallength(sts_data);
1044 u32 desc_ctx; 1204 u32 desc_ctx;
1045 struct netxen_rcv_desc_ctx *rcv_desc; 1205 u16 pkt_offset = 0, cksum;
1046 int ret; 1206 struct nx_host_rds_ring *rds_ring;
1047 1207
1048 desc_ctx = netxen_get_sts_type(sts_data); 1208 desc_ctx = netxen_get_sts_type(sts_data);
1049 if (unlikely(desc_ctx >= NUM_RCV_DESC_RINGS)) { 1209 if (unlikely(desc_ctx >= NUM_RCV_DESC_RINGS)) {
@@ -1052,13 +1212,13 @@ static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
1052 return; 1212 return;
1053 } 1213 }
1054 1214
1055 rcv_desc = &recv_ctx->rcv_desc[desc_ctx]; 1215 rds_ring = &recv_ctx->rds_rings[desc_ctx];
1056 if (unlikely(index > rcv_desc->max_rx_desc_count)) { 1216 if (unlikely(index > rds_ring->max_rx_desc_count)) {
1057 DPRINTK(ERR, "Got a buffer index:%x Max is %x\n", 1217 DPRINTK(ERR, "Got a buffer index:%x Max is %x\n",
1058 index, rcv_desc->max_rx_desc_count); 1218 index, rds_ring->max_rx_desc_count);
1059 return; 1219 return;
1060 } 1220 }
1061 buffer = &rcv_desc->rx_buf_arr[index]; 1221 buffer = &rds_ring->rx_buf_arr[index];
1062 if (desc_ctx == RCV_DESC_LRO_CTXID) { 1222 if (desc_ctx == RCV_DESC_LRO_CTXID) {
1063 buffer->lro_current_frags++; 1223 buffer->lro_current_frags++;
1064 if (netxen_get_sts_desc_lro_last_frag(desc)) { 1224 if (netxen_get_sts_desc_lro_last_frag(desc)) {
@@ -1079,43 +1239,52 @@ static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
1079 } 1239 }
1080 } 1240 }
1081 1241
1082 pci_unmap_single(pdev, buffer->dma, rcv_desc->dma_size, 1242 cksum = netxen_get_sts_status(sts_data);
1083 PCI_DMA_FROMDEVICE);
1084 1243
1085 skb = (struct sk_buff *)buffer->skb; 1244 skb = netxen_process_rxbuf(adapter, rds_ring, index, cksum);
1086 1245 if (!skb)
1087 if (likely(adapter->rx_csum && 1246 return;
1088 netxen_get_sts_status(sts_data) == STATUS_CKSUM_OK)) {
1089 adapter->stats.csummed++;
1090 skb->ip_summed = CHECKSUM_UNNECESSARY;
1091 } else
1092 skb->ip_summed = CHECKSUM_NONE;
1093 1247
1094 skb->dev = netdev;
1095 if (desc_ctx == RCV_DESC_LRO_CTXID) { 1248 if (desc_ctx == RCV_DESC_LRO_CTXID) {
1096 /* True length was only available on the last pkt */ 1249 /* True length was only available on the last pkt */
1097 skb_put(skb, buffer->lro_length); 1250 skb_put(skb, buffer->lro_length);
1098 } else { 1251 } else {
1099 skb_put(skb, length); 1252 if (length > rds_ring->skb_size)
1253 skb_put(skb, rds_ring->skb_size);
1254 else
1255 skb_put(skb, length);
1256
1257 pkt_offset = netxen_get_sts_pkt_offset(sts_data);
1258 if (pkt_offset)
1259 skb_pull(skb, pkt_offset);
1100 } 1260 }
1101 1261
1102 skb->protocol = eth_type_trans(skb, netdev); 1262 skb->protocol = eth_type_trans(skb, netdev);
1103 1263
1104 ret = netif_receive_skb(skb);
1105 netdev->last_rx = jiffies;
1106
1107 rcv_desc->rcv_pending--;
1108
1109 /* 1264 /*
1110 * We just consumed one buffer so post a buffer. 1265 * rx buffer chaining is disabled, walk and free
1266 * any spurious rx buffer chain.
1111 */ 1267 */
1112 buffer->skb = NULL; 1268 if (frag_desc) {
1113 buffer->state = NETXEN_BUFFER_FREE; 1269 u16 i, nr_frags = desc->nr_frags;
1114 buffer->lro_current_frags = 0; 1270
1115 buffer->lro_expected_frags = 0; 1271 dev_kfree_skb_any(skb);
1272 for (i = 0; i < nr_frags; i++) {
1273 index = frag_desc->frag_handles[i];
1274 skb = netxen_process_rxbuf(adapter,
1275 rds_ring, index, cksum);
1276 if (skb)
1277 dev_kfree_skb_any(skb);
1278 }
1279 adapter->stats.rxdropped++;
1280 } else {
1116 1281
1117 adapter->stats.no_rcv++; 1282 netif_receive_skb(skb);
1118 adapter->stats.rxbytes += length; 1283 netdev->last_rx = jiffies;
1284
1285 adapter->stats.no_rcv++;
1286 adapter->stats.rxbytes += length;
1287 }
1119} 1288}
1120 1289
1121/* Process Receive status ring */ 1290/* Process Receive status ring */
@@ -1123,10 +1292,11 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
1123{ 1292{
1124 struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]); 1293 struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]);
1125 struct status_desc *desc_head = recv_ctx->rcv_status_desc_head; 1294 struct status_desc *desc_head = recv_ctx->rcv_status_desc_head;
1126 struct status_desc *desc; /* used to read status desc here */ 1295 struct status_desc *desc, *frag_desc;
1127 u32 consumer = recv_ctx->status_rx_consumer; 1296 u32 consumer = recv_ctx->status_rx_consumer;
1128 u32 producer = 0;
1129 int count = 0, ring; 1297 int count = 0, ring;
1298 u64 sts_data;
1299 u16 opcode;
1130 1300
1131 while (count < max) { 1301 while (count < max) {
1132 desc = &desc_head[consumer]; 1302 desc = &desc_head[consumer];
@@ -1135,24 +1305,38 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
1135 netxen_get_sts_owner(desc)); 1305 netxen_get_sts_owner(desc));
1136 break; 1306 break;
1137 } 1307 }
1138 netxen_process_rcv(adapter, ctxid, desc); 1308
1309 sts_data = le64_to_cpu(desc->status_desc_data);
1310 opcode = netxen_get_sts_opcode(sts_data);
1311 frag_desc = NULL;
1312 if (opcode == NETXEN_NIC_RXPKT_DESC) {
1313 if (desc->nr_frags) {
1314 consumer = get_next_index(consumer,
1315 adapter->max_rx_desc_count);
1316 frag_desc = &desc_head[consumer];
1317 netxen_set_sts_owner(frag_desc,
1318 STATUS_OWNER_PHANTOM);
1319 }
1320 }
1321
1322 netxen_process_rcv(adapter, ctxid, desc, frag_desc);
1323
1139 netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM); 1324 netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM);
1140 consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1); 1325
1326 consumer = get_next_index(consumer,
1327 adapter->max_rx_desc_count);
1141 count++; 1328 count++;
1142 } 1329 }
1143 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) 1330 for (ring = 0; ring < adapter->max_rds_rings; ring++)
1144 netxen_post_rx_buffers_nodb(adapter, ctxid, ring); 1331 netxen_post_rx_buffers_nodb(adapter, ctxid, ring);
1145 1332
1146 /* update the consumer index in phantom */ 1333 /* update the consumer index in phantom */
1147 if (count) { 1334 if (count) {
1148 recv_ctx->status_rx_consumer = consumer; 1335 recv_ctx->status_rx_consumer = consumer;
1149 recv_ctx->status_rx_producer = producer;
1150 1336
1151 /* Window = 1 */ 1337 /* Window = 1 */
1152 writel(consumer, 1338 adapter->pci_write_normalize(adapter,
1153 NETXEN_CRB_NORMALIZE(adapter, 1339 recv_ctx->crb_sts_consumer, consumer);
1154 recv_crb_registers[adapter->portnum].
1155 crb_rcv_status_consumer));
1156 } 1340 }
1157 1341
1158 return count; 1342 return count;
@@ -1231,10 +1415,10 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter)
1231 */ 1415 */
1232void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) 1416void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
1233{ 1417{
1234 struct pci_dev *pdev = adapter->ahw.pdev; 1418 struct pci_dev *pdev = adapter->pdev;
1235 struct sk_buff *skb; 1419 struct sk_buff *skb;
1236 struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctx]); 1420 struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctx]);
1237 struct netxen_rcv_desc_ctx *rcv_desc = NULL; 1421 struct nx_host_rds_ring *rds_ring = NULL;
1238 uint producer; 1422 uint producer;
1239 struct rcv_desc *pdesc; 1423 struct rcv_desc *pdesc;
1240 struct netxen_rx_buffer *buffer; 1424 struct netxen_rx_buffer *buffer;
@@ -1242,41 +1426,36 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
1242 int index = 0; 1426 int index = 0;
1243 netxen_ctx_msg msg = 0; 1427 netxen_ctx_msg msg = 0;
1244 dma_addr_t dma; 1428 dma_addr_t dma;
1429 struct list_head *head;
1245 1430
1246 rcv_desc = &recv_ctx->rcv_desc[ringid]; 1431 rds_ring = &recv_ctx->rds_rings[ringid];
1432
1433 producer = rds_ring->producer;
1434 index = rds_ring->begin_alloc;
1435 head = &rds_ring->free_list;
1247 1436
1248 producer = rcv_desc->producer;
1249 index = rcv_desc->begin_alloc;
1250 buffer = &rcv_desc->rx_buf_arr[index];
1251 /* We can start writing rx descriptors into the phantom memory. */ 1437 /* We can start writing rx descriptors into the phantom memory. */
1252 while (buffer->state == NETXEN_BUFFER_FREE) { 1438 while (!list_empty(head)) {
1253 skb = dev_alloc_skb(rcv_desc->skb_size); 1439
1440 skb = dev_alloc_skb(rds_ring->skb_size);
1254 if (unlikely(!skb)) { 1441 if (unlikely(!skb)) {
1255 /* 1442 rds_ring->begin_alloc = index;
1256 * TODO
1257 * We need to schedule the posting of buffers to the pegs.
1258 */
1259 rcv_desc->begin_alloc = index;
1260 DPRINTK(ERR, "netxen_post_rx_buffers: "
1261 " allocated only %d buffers\n", count);
1262 break; 1443 break;
1263 } 1444 }
1264 1445
1446 buffer = list_entry(head->next, struct netxen_rx_buffer, list);
1447 list_del(&buffer->list);
1448
1265 count++; /* now there should be no failure */ 1449 count++; /* now there should be no failure */
1266 pdesc = &rcv_desc->desc_head[producer]; 1450 pdesc = &rds_ring->desc_head[producer];
1267 1451
1268#if defined(XGB_DEBUG) 1452 if (!adapter->ahw.cut_through)
1269 *(unsigned long *)(skb->head) = 0xc0debabe; 1453 skb_reserve(skb, 2);
1270 if (skb_is_nonlinear(skb)) {
1271 printk("Allocated SKB @%p is nonlinear\n");
1272 }
1273#endif
1274 skb_reserve(skb, 2);
1275 /* This will be setup when we receive the 1454 /* This will be setup when we receive the
1276 * buffer after it has been filled FSL TBD TBD 1455 * buffer after it has been filled FSL TBD TBD
1277 * skb->dev = netdev; 1456 * skb->dev = netdev;
1278 */ 1457 */
1279 dma = pci_map_single(pdev, skb->data, rcv_desc->dma_size, 1458 dma = pci_map_single(pdev, skb->data, rds_ring->dma_size,
1280 PCI_DMA_FROMDEVICE); 1459 PCI_DMA_FROMDEVICE);
1281 pdesc->addr_buffer = cpu_to_le64(dma); 1460 pdesc->addr_buffer = cpu_to_le64(dma);
1282 buffer->skb = skb; 1461 buffer->skb = skb;
@@ -1284,112 +1463,101 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
1284 buffer->dma = dma; 1463 buffer->dma = dma;
1285 /* make a rcv descriptor */ 1464 /* make a rcv descriptor */
1286 pdesc->reference_handle = cpu_to_le16(buffer->ref_handle); 1465 pdesc->reference_handle = cpu_to_le16(buffer->ref_handle);
1287 pdesc->buffer_length = cpu_to_le32(rcv_desc->dma_size); 1466 pdesc->buffer_length = cpu_to_le32(rds_ring->dma_size);
1288 DPRINTK(INFO, "done writing descripter\n"); 1467 DPRINTK(INFO, "done writing descripter\n");
1289 producer = 1468 producer =
1290 get_next_index(producer, rcv_desc->max_rx_desc_count); 1469 get_next_index(producer, rds_ring->max_rx_desc_count);
1291 index = get_next_index(index, rcv_desc->max_rx_desc_count); 1470 index = get_next_index(index, rds_ring->max_rx_desc_count);
1292 buffer = &rcv_desc->rx_buf_arr[index];
1293 } 1471 }
1294 /* if we did allocate buffers, then write the count to Phantom */ 1472 /* if we did allocate buffers, then write the count to Phantom */
1295 if (count) { 1473 if (count) {
1296 rcv_desc->begin_alloc = index; 1474 rds_ring->begin_alloc = index;
1297 rcv_desc->rcv_pending += count; 1475 rds_ring->producer = producer;
1298 rcv_desc->producer = producer;
1299 /* Window = 1 */ 1476 /* Window = 1 */
1300 writel((producer - 1) & 1477 adapter->pci_write_normalize(adapter,
1301 (rcv_desc->max_rx_desc_count - 1), 1478 rds_ring->crb_rcv_producer,
1302 NETXEN_CRB_NORMALIZE(adapter, 1479 (producer-1) & (rds_ring->max_rx_desc_count-1));
1303 recv_crb_registers[ 1480
1304 adapter->portnum]. 1481 if (adapter->fw_major < 4) {
1305 rcv_desc_crb[ringid].
1306 crb_rcv_producer_offset));
1307 /* 1482 /*
1308 * Write a doorbell msg to tell phanmon of change in 1483 * Write a doorbell msg to tell phanmon of change in
1309 * receive ring producer 1484 * receive ring producer
1485 * Only for firmware version < 4.0.0
1310 */ 1486 */
1311 netxen_set_msg_peg_id(msg, NETXEN_RCV_PEG_DB_ID); 1487 netxen_set_msg_peg_id(msg, NETXEN_RCV_PEG_DB_ID);
1312 netxen_set_msg_privid(msg); 1488 netxen_set_msg_privid(msg);
1313 netxen_set_msg_count(msg, 1489 netxen_set_msg_count(msg,
1314 ((producer - 1490 ((producer -
1315 1) & (rcv_desc-> 1491 1) & (rds_ring->
1316 max_rx_desc_count - 1))); 1492 max_rx_desc_count - 1)));
1317 netxen_set_msg_ctxid(msg, adapter->portnum); 1493 netxen_set_msg_ctxid(msg, adapter->portnum);
1318 netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid)); 1494 netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid));
1319 writel(msg, 1495 writel(msg,
1320 DB_NORMALIZE(adapter, 1496 DB_NORMALIZE(adapter,
1321 NETXEN_RCV_PRODUCER_OFFSET)); 1497 NETXEN_RCV_PRODUCER_OFFSET));
1498 }
1322 } 1499 }
1323} 1500}
1324 1501
1325static void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, 1502static void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter,
1326 uint32_t ctx, uint32_t ringid) 1503 uint32_t ctx, uint32_t ringid)
1327{ 1504{
1328 struct pci_dev *pdev = adapter->ahw.pdev; 1505 struct pci_dev *pdev = adapter->pdev;
1329 struct sk_buff *skb; 1506 struct sk_buff *skb;
1330 struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctx]); 1507 struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctx]);
1331 struct netxen_rcv_desc_ctx *rcv_desc = NULL; 1508 struct nx_host_rds_ring *rds_ring = NULL;
1332 u32 producer; 1509 u32 producer;
1333 struct rcv_desc *pdesc; 1510 struct rcv_desc *pdesc;
1334 struct netxen_rx_buffer *buffer; 1511 struct netxen_rx_buffer *buffer;
1335 int count = 0; 1512 int count = 0;
1336 int index = 0; 1513 int index = 0;
1514 struct list_head *head;
1337 1515
1338 rcv_desc = &recv_ctx->rcv_desc[ringid]; 1516 rds_ring = &recv_ctx->rds_rings[ringid];
1339 1517
1340 producer = rcv_desc->producer; 1518 producer = rds_ring->producer;
1341 index = rcv_desc->begin_alloc; 1519 index = rds_ring->begin_alloc;
1342 buffer = &rcv_desc->rx_buf_arr[index]; 1520 head = &rds_ring->free_list;
1343 /* We can start writing rx descriptors into the phantom memory. */ 1521 /* We can start writing rx descriptors into the phantom memory. */
1344 while (buffer->state == NETXEN_BUFFER_FREE) { 1522 while (!list_empty(head)) {
1345 skb = dev_alloc_skb(rcv_desc->skb_size); 1523
1524 skb = dev_alloc_skb(rds_ring->skb_size);
1346 if (unlikely(!skb)) { 1525 if (unlikely(!skb)) {
1347 /* 1526 rds_ring->begin_alloc = index;
1348 * We need to schedule the posting of buffers to the pegs.
1349 */
1350 rcv_desc->begin_alloc = index;
1351 DPRINTK(ERR, "netxen_post_rx_buffers_nodb: "
1352 " allocated only %d buffers\n", count);
1353 break; 1527 break;
1354 } 1528 }
1529
1530 buffer = list_entry(head->next, struct netxen_rx_buffer, list);
1531 list_del(&buffer->list);
1532
1355 count++; /* now there should be no failure */ 1533 count++; /* now there should be no failure */
1356 pdesc = &rcv_desc->desc_head[producer]; 1534 pdesc = &rds_ring->desc_head[producer];
1357 skb_reserve(skb, 2); 1535 if (!adapter->ahw.cut_through)
1358 /* 1536 skb_reserve(skb, 2);
1359 * This will be setup when we receive the
1360 * buffer after it has been filled
1361 * skb->dev = netdev;
1362 */
1363 buffer->skb = skb; 1537 buffer->skb = skb;
1364 buffer->state = NETXEN_BUFFER_BUSY; 1538 buffer->state = NETXEN_BUFFER_BUSY;
1365 buffer->dma = pci_map_single(pdev, skb->data, 1539 buffer->dma = pci_map_single(pdev, skb->data,
1366 rcv_desc->dma_size, 1540 rds_ring->dma_size,
1367 PCI_DMA_FROMDEVICE); 1541 PCI_DMA_FROMDEVICE);
1368 1542
1369 /* make a rcv descriptor */ 1543 /* make a rcv descriptor */
1370 pdesc->reference_handle = cpu_to_le16(buffer->ref_handle); 1544 pdesc->reference_handle = cpu_to_le16(buffer->ref_handle);
1371 pdesc->buffer_length = cpu_to_le32(rcv_desc->dma_size); 1545 pdesc->buffer_length = cpu_to_le32(rds_ring->dma_size);
1372 pdesc->addr_buffer = cpu_to_le64(buffer->dma); 1546 pdesc->addr_buffer = cpu_to_le64(buffer->dma);
1373 DPRINTK(INFO, "done writing descripter\n");
1374 producer = 1547 producer =
1375 get_next_index(producer, rcv_desc->max_rx_desc_count); 1548 get_next_index(producer, rds_ring->max_rx_desc_count);
1376 index = get_next_index(index, rcv_desc->max_rx_desc_count); 1549 index = get_next_index(index, rds_ring->max_rx_desc_count);
1377 buffer = &rcv_desc->rx_buf_arr[index]; 1550 buffer = &rds_ring->rx_buf_arr[index];
1378 } 1551 }
1379 1552
1380 /* if we did allocate buffers, then write the count to Phantom */ 1553 /* if we did allocate buffers, then write the count to Phantom */
1381 if (count) { 1554 if (count) {
1382 rcv_desc->begin_alloc = index; 1555 rds_ring->begin_alloc = index;
1383 rcv_desc->rcv_pending += count; 1556 rds_ring->producer = producer;
1384 rcv_desc->producer = producer;
1385 /* Window = 1 */ 1557 /* Window = 1 */
1386 writel((producer - 1) & 1558 adapter->pci_write_normalize(adapter,
1387 (rcv_desc->max_rx_desc_count - 1), 1559 rds_ring->crb_rcv_producer,
1388 NETXEN_CRB_NORMALIZE(adapter, 1560 (producer-1) & (rds_ring->max_rx_desc_count-1));
1389 recv_crb_registers[
1390 adapter->portnum].
1391 rcv_desc_crb[ringid].
1392 crb_rcv_producer_offset));
1393 wmb(); 1561 wmb();
1394 } 1562 }
1395} 1563}
diff --git a/drivers/net/netxen/netxen_nic_isr.c b/drivers/net/netxen/netxen_nic_isr.c
deleted file mode 100644
index 96cec41f9019..000000000000
--- a/drivers/net/netxen/netxen_nic_isr.c
+++ /dev/null
@@ -1,220 +0,0 @@
1/*
2 * Copyright (C) 2003 - 2006 NetXen, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18 * MA 02111-1307, USA.
19 *
20 * The full GNU General Public License is included in this distribution
21 * in the file called LICENSE.
22 *
23 * Contact Information:
24 * info@netxen.com
25 * NetXen,
26 * 3965 Freedom Circle, Fourth floor,
27 * Santa Clara, CA 95054
28 */
29
30#include <linux/netdevice.h>
31#include <linux/delay.h>
32
33#include "netxen_nic.h"
34#include "netxen_nic_hw.h"
35#include "netxen_nic_phan_reg.h"
36
37/*
38 * netxen_nic_get_stats - Get System Network Statistics
39 * @netdev: network interface device structure
40 */
41struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
42{
43 struct netxen_adapter *adapter = netdev_priv(netdev);
44 struct net_device_stats *stats = &adapter->net_stats;
45
46 memset(stats, 0, sizeof(*stats));
47
48 /* total packets received */
49 stats->rx_packets = adapter->stats.no_rcv;
50 /* total packets transmitted */
51 stats->tx_packets = adapter->stats.xmitedframes +
52 adapter->stats.xmitfinished;
53 /* total bytes received */
54 stats->rx_bytes = adapter->stats.rxbytes;
55 /* total bytes transmitted */
56 stats->tx_bytes = adapter->stats.txbytes;
57 /* bad packets received */
58 stats->rx_errors = adapter->stats.rcvdbadskb;
59 /* packet transmit problems */
60 stats->tx_errors = adapter->stats.nocmddescriptor;
61 /* no space in linux buffers */
62 stats->rx_dropped = adapter->stats.rxdropped;
63 /* no space available in linux */
64 stats->tx_dropped = adapter->stats.txdropped;
65
66 return stats;
67}
68
69static void netxen_indicate_link_status(struct netxen_adapter *adapter,
70 u32 link)
71{
72 struct net_device *netdev = adapter->netdev;
73
74 if (link)
75 netif_carrier_on(netdev);
76 else
77 netif_carrier_off(netdev);
78}
79
80#if 0
81void netxen_handle_port_int(struct netxen_adapter *adapter, u32 enable)
82{
83 __u32 int_src;
84
85 /* This should clear the interrupt source */
86 if (adapter->phy_read)
87 adapter->phy_read(adapter,
88 NETXEN_NIU_GB_MII_MGMT_ADDR_INT_STATUS,
89 &int_src);
90 if (int_src == 0) {
91 DPRINTK(INFO, "No phy interrupts for port #%d\n", portno);
92 return;
93 }
94 if (adapter->disable_phy_interrupts)
95 adapter->disable_phy_interrupts(adapter);
96
97 if (netxen_get_phy_int_jabber(int_src))
98 DPRINTK(INFO, "Jabber interrupt \n");
99
100 if (netxen_get_phy_int_polarity_changed(int_src))
101 DPRINTK(INFO, "POLARITY CHANGED int \n");
102
103 if (netxen_get_phy_int_energy_detect(int_src))
104 DPRINTK(INFO, "ENERGY DETECT INT \n");
105
106 if (netxen_get_phy_int_downshift(int_src))
107 DPRINTK(INFO, "DOWNSHIFT INT \n");
108 /* write it down later.. */
109 if ((netxen_get_phy_int_speed_changed(int_src))
110 || (netxen_get_phy_int_link_status_changed(int_src))) {
111 __u32 status;
112
113 DPRINTK(INFO, "SPEED CHANGED OR LINK STATUS CHANGED \n");
114
115 if (adapter->phy_read
116 && adapter->phy_read(adapter,
117 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
118 &status) == 0) {
119 if (netxen_get_phy_int_link_status_changed(int_src)) {
120 if (netxen_get_phy_link(status)) {
121 printk(KERN_INFO "%s: %s Link UP\n",
122 netxen_nic_driver_name,
123 adapter->netdev->name);
124
125 } else {
126 printk(KERN_INFO "%s: %s Link DOWN\n",
127 netxen_nic_driver_name,
128 adapter->netdev->name);
129 }
130 netxen_indicate_link_status(adapter,
131 netxen_get_phy_link
132 (status));
133 }
134 }
135 }
136 if (adapter->enable_phy_interrupts)
137 adapter->enable_phy_interrupts(adapter);
138}
139#endif /* 0 */
140
141static void netxen_nic_isr_other(struct netxen_adapter *adapter)
142{
143 int portno = adapter->portnum;
144 u32 val, linkup, qg_linksup;
145
146 /* verify the offset */
147 val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE));
148 val = val >> adapter->physical_port;
149 if (val == adapter->ahw.qg_linksup)
150 return;
151
152 qg_linksup = adapter->ahw.qg_linksup;
153 adapter->ahw.qg_linksup = val;
154 DPRINTK(INFO, "link update 0x%08x\n", val);
155
156 linkup = val & 1;
157
158 if (linkup != (qg_linksup & 1)) {
159 printk(KERN_INFO "%s: %s PORT %d link %s\n",
160 adapter->netdev->name,
161 netxen_nic_driver_name, portno,
162 ((linkup == 0) ? "down" : "up"));
163 netxen_indicate_link_status(adapter, linkup);
164 if (linkup)
165 netxen_nic_set_link_parameters(adapter);
166
167 }
168}
169
170void netxen_nic_gbe_handle_phy_intr(struct netxen_adapter *adapter)
171{
172 netxen_nic_isr_other(adapter);
173}
174
175#if 0
176int netxen_nic_link_ok(struct netxen_adapter *adapter)
177{
178 switch (adapter->ahw.board_type) {
179 case NETXEN_NIC_GBE:
180 return ((adapter->ahw.qg_linksup) & 1);
181
182 case NETXEN_NIC_XGBE:
183 return ((adapter->ahw.xg_linkup) & 1);
184
185 default:
186 printk(KERN_ERR"%s: Function: %s, Unknown board type\n",
187 netxen_nic_driver_name, __FUNCTION__);
188 break;
189 }
190
191 return 0;
192}
193#endif /* 0 */
194
195void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter)
196{
197 struct net_device *netdev = adapter->netdev;
198 u32 val;
199
200 /* WINDOW = 1 */
201 val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE));
202 val >>= (adapter->physical_port * 8);
203 val &= 0xff;
204
205 if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) {
206 printk(KERN_INFO "%s: %s NIC Link is down\n",
207 netxen_nic_driver_name, netdev->name);
208 adapter->ahw.xg_linkup = 0;
209 if (netif_running(netdev)) {
210 netif_carrier_off(netdev);
211 netif_stop_queue(netdev);
212 }
213 } else if (adapter->ahw.xg_linkup == 0 && val == XG_LINK_UP) {
214 printk(KERN_INFO "%s: %s NIC Link is up\n",
215 netxen_nic_driver_name, netdev->name);
216 adapter->ahw.xg_linkup = 1;
217 netif_carrier_on(netdev);
218 netif_wake_queue(netdev);
219 }
220}
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 63cd67b931e7..91d209a8f6cb 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -49,13 +49,18 @@ char netxen_nic_driver_name[] = "netxen_nic";
49static char netxen_nic_driver_string[] = "NetXen Network Driver version " 49static char netxen_nic_driver_string[] = "NetXen Network Driver version "
50 NETXEN_NIC_LINUX_VERSIONID; 50 NETXEN_NIC_LINUX_VERSIONID;
51 51
52#define NETXEN_NETDEV_WEIGHT 120 52static int port_mode = NETXEN_PORT_MODE_AUTO_NEG;
53#define NETXEN_ADAPTER_UP_MAGIC 777 53
54#define NETXEN_NIC_PEG_TUNE 0 54/* Default to restricted 1G auto-neg mode */
55static int wol_port_mode = 5;
56
57static int use_msi = 1;
58
59static int use_msi_x = 1;
55 60
56/* Local functions to NetXen NIC driver */ 61/* Local functions to NetXen NIC driver */
57static int __devinit netxen_nic_probe(struct pci_dev *pdev, 62static int __devinit netxen_nic_probe(struct pci_dev *pdev,
58 const struct pci_device_id *ent); 63 const struct pci_device_id *ent);
59static void __devexit netxen_nic_remove(struct pci_dev *pdev); 64static void __devexit netxen_nic_remove(struct pci_dev *pdev);
60static int netxen_nic_open(struct net_device *netdev); 65static int netxen_nic_open(struct net_device *netdev);
61static int netxen_nic_close(struct net_device *netdev); 66static int netxen_nic_close(struct net_device *netdev);
@@ -83,6 +88,7 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
83 ENTRY(0x0005), 88 ENTRY(0x0005),
84 ENTRY(0x0024), 89 ENTRY(0x0024),
85 ENTRY(0x0025), 90 ENTRY(0x0025),
91 ENTRY(0x0100),
86 {0,} 92 {0,}
87}; 93};
88 94
@@ -108,95 +114,61 @@ static struct workqueue_struct *netxen_workq;
108 114
109static void netxen_watchdog(unsigned long); 115static void netxen_watchdog(unsigned long);
110 116
111static void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, 117static uint32_t crb_cmd_producer[4] = {
112 uint32_t crb_producer) 118 CRB_CMD_PRODUCER_OFFSET, CRB_CMD_PRODUCER_OFFSET_1,
119 CRB_CMD_PRODUCER_OFFSET_2, CRB_CMD_PRODUCER_OFFSET_3
120};
121
122void
123netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
124 uint32_t crb_producer)
113{ 125{
114 switch (adapter->portnum) { 126 adapter->pci_write_normalize(adapter,
115 case 0: 127 adapter->crb_addr_cmd_producer, crb_producer);
116 writel(crb_producer, NETXEN_CRB_NORMALIZE
117 (adapter, CRB_CMD_PRODUCER_OFFSET));
118 return;
119 case 1:
120 writel(crb_producer, NETXEN_CRB_NORMALIZE
121 (adapter, CRB_CMD_PRODUCER_OFFSET_1));
122 return;
123 case 2:
124 writel(crb_producer, NETXEN_CRB_NORMALIZE
125 (adapter, CRB_CMD_PRODUCER_OFFSET_2));
126 return;
127 case 3:
128 writel(crb_producer, NETXEN_CRB_NORMALIZE
129 (adapter, CRB_CMD_PRODUCER_OFFSET_3));
130 return;
131 default:
132 printk(KERN_WARNING "We tried to update "
133 "CRB_CMD_PRODUCER_OFFSET for invalid "
134 "PCI function id %d\n",
135 adapter->portnum);
136 return;
137 }
138} 128}
139 129
140static void netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, 130static uint32_t crb_cmd_consumer[4] = {
141 u32 crb_consumer) 131 CRB_CMD_CONSUMER_OFFSET, CRB_CMD_CONSUMER_OFFSET_1,
132 CRB_CMD_CONSUMER_OFFSET_2, CRB_CMD_CONSUMER_OFFSET_3
133};
134
135static inline void
136netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
137 u32 crb_consumer)
142{ 138{
143 switch (adapter->portnum) { 139 adapter->pci_write_normalize(adapter,
144 case 0: 140 adapter->crb_addr_cmd_consumer, crb_consumer);
145 writel(crb_consumer, NETXEN_CRB_NORMALIZE
146 (adapter, CRB_CMD_CONSUMER_OFFSET));
147 return;
148 case 1:
149 writel(crb_consumer, NETXEN_CRB_NORMALIZE
150 (adapter, CRB_CMD_CONSUMER_OFFSET_1));
151 return;
152 case 2:
153 writel(crb_consumer, NETXEN_CRB_NORMALIZE
154 (adapter, CRB_CMD_CONSUMER_OFFSET_2));
155 return;
156 case 3:
157 writel(crb_consumer, NETXEN_CRB_NORMALIZE
158 (adapter, CRB_CMD_CONSUMER_OFFSET_3));
159 return;
160 default:
161 printk(KERN_WARNING "We tried to update "
162 "CRB_CMD_PRODUCER_OFFSET for invalid "
163 "PCI function id %d\n",
164 adapter->portnum);
165 return;
166 }
167} 141}
168 142
169#define ADAPTER_LIST_SIZE 12 143static uint32_t msi_tgt_status[8] = {
170
171static uint32_t msi_tgt_status[4] = {
172 ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1, 144 ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
173 ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3 145 ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
146 ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
147 ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
174}; 148};
175 149
176static uint32_t sw_int_mask[4] = { 150static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG;
177 CRB_SW_INT_MASK_0, CRB_SW_INT_MASK_1,
178 CRB_SW_INT_MASK_2, CRB_SW_INT_MASK_3
179};
180 151
181static void netxen_nic_disable_int(struct netxen_adapter *adapter) 152static void netxen_nic_disable_int(struct netxen_adapter *adapter)
182{ 153{
183 u32 mask = 0x7ff; 154 u32 mask = 0x7ff;
184 int retries = 32; 155 int retries = 32;
185 int port = adapter->portnum;
186 int pci_fn = adapter->ahw.pci_func; 156 int pci_fn = adapter->ahw.pci_func;
187 157
188 if (adapter->msi_mode != MSI_MODE_MULTIFUNC) 158 if (adapter->msi_mode != MSI_MODE_MULTIFUNC)
189 writel(0x0, NETXEN_CRB_NORMALIZE(adapter, sw_int_mask[port])); 159 adapter->pci_write_normalize(adapter,
160 adapter->crb_intr_mask, 0);
190 161
191 if (adapter->intr_scheme != -1 && 162 if (adapter->intr_scheme != -1 &&
192 adapter->intr_scheme != INTR_SCHEME_PERPORT) 163 adapter->intr_scheme != INTR_SCHEME_PERPORT)
193 writel(mask,PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)); 164 adapter->pci_write_immediate(adapter, ISR_INT_MASK, mask);
194 165
195 if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { 166 if (!NETXEN_IS_MSI_FAMILY(adapter)) {
196 do { 167 do {
197 writel(0xffffffff, 168 adapter->pci_write_immediate(adapter,
198 PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_TARGET_STATUS)); 169 ISR_INT_TARGET_STATUS, 0xffffffff);
199 mask = readl(pci_base_offset(adapter, ISR_INT_VECTOR)); 170 mask = adapter->pci_read_immediate(adapter,
171 ISR_INT_VECTOR);
200 if (!(mask & 0x80)) 172 if (!(mask & 0x80))
201 break; 173 break;
202 udelay(10); 174 udelay(10);
@@ -208,8 +180,8 @@ static void netxen_nic_disable_int(struct netxen_adapter *adapter)
208 } 180 }
209 } else { 181 } else {
210 if (adapter->msi_mode == MSI_MODE_MULTIFUNC) { 182 if (adapter->msi_mode == MSI_MODE_MULTIFUNC) {
211 writel(0xffffffff, PCI_OFFSET_SECOND_RANGE(adapter, 183 adapter->pci_write_immediate(adapter,
212 msi_tgt_status[pci_fn])); 184 msi_tgt_status[pci_fn], 0xffffffff);
213 } 185 }
214 } 186 }
215} 187}
@@ -217,7 +189,6 @@ static void netxen_nic_disable_int(struct netxen_adapter *adapter)
217static void netxen_nic_enable_int(struct netxen_adapter *adapter) 189static void netxen_nic_enable_int(struct netxen_adapter *adapter)
218{ 190{
219 u32 mask; 191 u32 mask;
220 int port = adapter->portnum;
221 192
222 DPRINTK(1, INFO, "Entered ISR Enable \n"); 193 DPRINTK(1, INFO, "Entered ISR Enable \n");
223 194
@@ -235,24 +206,299 @@ static void netxen_nic_enable_int(struct netxen_adapter *adapter)
235 break; 206 break;
236 } 207 }
237 208
238 writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)); 209 adapter->pci_write_immediate(adapter, ISR_INT_MASK, mask);
239 } 210 }
240 211
241 writel(0x1, NETXEN_CRB_NORMALIZE(adapter, sw_int_mask[port])); 212 adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0x1);
242 213
243 if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { 214 if (!NETXEN_IS_MSI_FAMILY(adapter)) {
244 mask = 0xbff; 215 mask = 0xbff;
245 if (adapter->intr_scheme != -1 && 216 if (adapter->intr_scheme != -1 &&
246 adapter->intr_scheme != INTR_SCHEME_PERPORT) { 217 adapter->intr_scheme != INTR_SCHEME_PERPORT) {
247 writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); 218 adapter->pci_write_normalize(adapter,
219 CRB_INT_VECTOR, 0);
248 } 220 }
249 writel(mask, 221 adapter->pci_write_immediate(adapter,
250 PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_TARGET_MASK)); 222 ISR_INT_TARGET_MASK, mask);
251 } 223 }
252 224
253 DPRINTK(1, INFO, "Done with enable Int\n"); 225 DPRINTK(1, INFO, "Done with enable Int\n");
254} 226}
255 227
228static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
229{
230 struct pci_dev *pdev = adapter->pdev;
231 int err;
232 uint64_t mask;
233
234#ifdef CONFIG_IA64
235 adapter->dma_mask = DMA_32BIT_MASK;
236#else
237 if (revision_id >= NX_P3_B0) {
238 /* should go to DMA_64BIT_MASK */
239 adapter->dma_mask = DMA_39BIT_MASK;
240 mask = DMA_39BIT_MASK;
241 } else if (revision_id == NX_P3_A2) {
242 adapter->dma_mask = DMA_39BIT_MASK;
243 mask = DMA_39BIT_MASK;
244 } else if (revision_id == NX_P2_C1) {
245 adapter->dma_mask = DMA_35BIT_MASK;
246 mask = DMA_35BIT_MASK;
247 } else {
248 adapter->dma_mask = DMA_32BIT_MASK;
249 mask = DMA_32BIT_MASK;
250 goto set_32_bit_mask;
251 }
252
253 /*
254 * Consistent DMA mask is set to 32 bit because it cannot be set to
255 * 35 bits. For P3 also leave it at 32 bits for now. Only the rings
256 * come off this pool.
257 */
258 if (pci_set_dma_mask(pdev, mask) == 0 &&
259 pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) == 0) {
260 adapter->pci_using_dac = 1;
261 return 0;
262 }
263#endif /* CONFIG_IA64 */
264
265set_32_bit_mask:
266 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
267 if (!err)
268 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
269 if (err) {
270 DPRINTK(ERR, "No usable DMA configuration, aborting:%d\n", err);
271 return err;
272 }
273
274 adapter->pci_using_dac = 0;
275 return 0;
276}
277
278static void netxen_check_options(struct netxen_adapter *adapter)
279{
280 switch (adapter->ahw.boardcfg.board_type) {
281 case NETXEN_BRDTYPE_P3_HMEZ:
282 case NETXEN_BRDTYPE_P3_XG_LOM:
283 case NETXEN_BRDTYPE_P3_10G_CX4:
284 case NETXEN_BRDTYPE_P3_10G_CX4_LP:
285 case NETXEN_BRDTYPE_P3_IMEZ:
286 case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
287 case NETXEN_BRDTYPE_P3_10G_XFP:
288 case NETXEN_BRDTYPE_P3_10000_BASE_T:
289 adapter->msix_supported = !!use_msi_x;
290 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
291 break;
292
293 case NETXEN_BRDTYPE_P2_SB31_10G:
294 case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
295 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
296 case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
297 adapter->msix_supported = 0;
298 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
299 break;
300
301 case NETXEN_BRDTYPE_P3_REF_QG:
302 case NETXEN_BRDTYPE_P3_4_GB:
303 case NETXEN_BRDTYPE_P3_4_GB_MM:
304 case NETXEN_BRDTYPE_P2_SB35_4G:
305 case NETXEN_BRDTYPE_P2_SB31_2G:
306 adapter->msix_supported = 0;
307 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
308 break;
309
310 default:
311 adapter->msix_supported = 0;
312 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
313
314 printk(KERN_WARNING "Unknown board type(0x%x)\n",
315 adapter->ahw.boardcfg.board_type);
316 break;
317 }
318
319 adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS_HOST;
320 adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
321 adapter->max_lro_rx_desc_count = MAX_LRO_RCV_DESCRIPTORS;
322
323 adapter->max_possible_rss_rings = 1;
324 return;
325}
326
327static int
328netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
329{
330 int ret = 0;
331
332 if (first_boot == 0x55555555) {
333 /* This is the first boot after power up */
334
335 /* PCI bus master workaround */
336 adapter->hw_read_wx(adapter,
337 NETXEN_PCIE_REG(0x4), &first_boot, 4);
338 if (!(first_boot & 0x4)) {
339 first_boot |= 0x4;
340 adapter->hw_write_wx(adapter,
341 NETXEN_PCIE_REG(0x4), &first_boot, 4);
342 adapter->hw_read_wx(adapter,
343 NETXEN_PCIE_REG(0x4), &first_boot, 4);
344 }
345
346 /* This is the first boot after power up */
347 adapter->hw_read_wx(adapter,
348 NETXEN_ROMUSB_GLB_SW_RESET, &first_boot, 4);
349 if (first_boot != 0x80000f) {
350 /* clear the register for future unloads/loads */
351 adapter->pci_write_normalize(adapter,
352 NETXEN_CAM_RAM(0x1fc), 0);
353 ret = -1;
354 }
355
356 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
357 /* Start P2 boot loader */
358 adapter->pci_write_normalize(adapter,
359 NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
360 adapter->pci_write_normalize(adapter,
361 NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
362 }
363 }
364 return ret;
365}
366
367static void netxen_set_port_mode(struct netxen_adapter *adapter)
368{
369 u32 val, data;
370
371 val = adapter->ahw.boardcfg.board_type;
372 if ((val == NETXEN_BRDTYPE_P3_HMEZ) ||
373 (val == NETXEN_BRDTYPE_P3_XG_LOM)) {
374 if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
375 data = NETXEN_PORT_MODE_802_3_AP;
376 adapter->hw_write_wx(adapter,
377 NETXEN_PORT_MODE_ADDR, &data, 4);
378 } else if (port_mode == NETXEN_PORT_MODE_XG) {
379 data = NETXEN_PORT_MODE_XG;
380 adapter->hw_write_wx(adapter,
381 NETXEN_PORT_MODE_ADDR, &data, 4);
382 } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_1G) {
383 data = NETXEN_PORT_MODE_AUTO_NEG_1G;
384 adapter->hw_write_wx(adapter,
385 NETXEN_PORT_MODE_ADDR, &data, 4);
386 } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_XG) {
387 data = NETXEN_PORT_MODE_AUTO_NEG_XG;
388 adapter->hw_write_wx(adapter,
389 NETXEN_PORT_MODE_ADDR, &data, 4);
390 } else {
391 data = NETXEN_PORT_MODE_AUTO_NEG;
392 adapter->hw_write_wx(adapter,
393 NETXEN_PORT_MODE_ADDR, &data, 4);
394 }
395
396 if ((wol_port_mode != NETXEN_PORT_MODE_802_3_AP) &&
397 (wol_port_mode != NETXEN_PORT_MODE_XG) &&
398 (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_1G) &&
399 (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_XG)) {
400 wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG;
401 }
402 adapter->hw_write_wx(adapter, NETXEN_WOL_PORT_MODE,
403 &wol_port_mode, 4);
404 }
405}
406
407#define PCI_CAP_ID_GEN 0x10
408
409static void netxen_pcie_strap_init(struct netxen_adapter *adapter)
410{
411 u32 pdevfuncsave;
412 u32 c8c9value = 0;
413 u32 chicken = 0;
414 u32 control = 0;
415 int i, pos;
416 struct pci_dev *pdev;
417
418 pdev = pci_get_device(0x1166, 0x0140, NULL);
419 if (pdev) {
420 pci_dev_put(pdev);
421 adapter->hw_read_wx(adapter,
422 NETXEN_PCIE_REG(PCIE_TGT_SPLIT_CHICKEN), &chicken, 4);
423 chicken |= 0x4000;
424 adapter->hw_write_wx(adapter,
425 NETXEN_PCIE_REG(PCIE_TGT_SPLIT_CHICKEN), &chicken, 4);
426 }
427
428 pdev = adapter->pdev;
429
430 adapter->hw_read_wx(adapter,
431 NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
432 /* clear chicken3.25:24 */
433 chicken &= 0xFCFFFFFF;
434 /*
435 * if gen1 and B0, set F1020 - if gen 2, do nothing
436 * if gen2 set to F1000
437 */
438 pos = pci_find_capability(pdev, PCI_CAP_ID_GEN);
439 if (pos == 0xC0) {
440 pci_read_config_dword(pdev, pos + 0x10, &control);
441 if ((control & 0x000F0000) != 0x00020000) {
442 /* set chicken3.24 if gen1 */
443 chicken |= 0x01000000;
444 }
445 printk(KERN_INFO "%s Gen2 strapping detected\n",
446 netxen_nic_driver_name);
447 c8c9value = 0xF1000;
448 } else {
449 /* set chicken3.24 if gen1 */
450 chicken |= 0x01000000;
451 printk(KERN_INFO "%s Gen1 strapping detected\n",
452 netxen_nic_driver_name);
453 if (adapter->ahw.revision_id == NX_P3_B0)
454 c8c9value = 0xF1020;
455 else
456 c8c9value = 0;
457
458 }
459 adapter->hw_write_wx(adapter,
460 NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
461
462 if (!c8c9value)
463 return;
464
465 pdevfuncsave = pdev->devfn;
466 if (pdevfuncsave & 0x07)
467 return;
468
469 for (i = 0; i < 8; i++) {
470 pci_read_config_dword(pdev, pos + 8, &control);
471 pci_read_config_dword(pdev, pos + 8, &control);
472 pci_write_config_dword(pdev, pos + 8, c8c9value);
473 pdev->devfn++;
474 }
475 pdev->devfn = pdevfuncsave;
476}
477
478static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
479{
480 u32 control;
481 int pos;
482
483 pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
484 if (pos) {
485 pci_read_config_dword(pdev, pos, &control);
486 if (enable)
487 control |= PCI_MSIX_FLAGS_ENABLE;
488 else
489 control = 0;
490 pci_write_config_dword(pdev, pos, control);
491 }
492}
493
494static void netxen_init_msix_entries(struct netxen_adapter *adapter)
495{
496 int i;
497
498 for (i = 0; i < MSIX_ENTRIES_PER_ADAPTER; i++)
499 adapter->msix_entries[i].entry = i;
500}
501
256/* 502/*
257 * netxen_nic_probe() 503 * netxen_nic_probe()
258 * 504 *
@@ -278,28 +524,28 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
278 524
279 525
280 u8 __iomem *db_ptr = NULL; 526 u8 __iomem *db_ptr = NULL;
281 unsigned long mem_base, mem_len, db_base, db_len; 527 unsigned long mem_base, mem_len, db_base, db_len, pci_len0 = 0;
282 int pci_using_dac, i = 0, err; 528 int i = 0, err;
283 int ring; 529 int first_driver, first_boot;
284 struct netxen_recv_context *recv_ctx = NULL;
285 struct netxen_rcv_desc_ctx *rcv_desc = NULL;
286 struct netxen_cmd_buffer *cmd_buf_arr = NULL;
287 __le64 mac_addr[FLASH_NUM_PORTS + 1]; 530 __le64 mac_addr[FLASH_NUM_PORTS + 1];
288 int valid_mac = 0;
289 u32 val; 531 u32 val;
290 int pci_func_id = PCI_FUNC(pdev->devfn); 532 int pci_func_id = PCI_FUNC(pdev->devfn);
291 DECLARE_MAC_BUF(mac); 533 DECLARE_MAC_BUF(mac);
534 struct netxen_legacy_intr_set *legacy_intrp;
535 uint8_t revision_id;
292 536
293 if (pci_func_id == 0) 537 if (pci_func_id == 0)
294 printk(KERN_INFO "%s \n", netxen_nic_driver_string); 538 printk(KERN_INFO "%s\n", netxen_nic_driver_string);
295 539
296 if (pdev->class != 0x020000) { 540 if (pdev->class != 0x020000) {
297 printk(KERN_DEBUG "NetXen function %d, class %x will not " 541 printk(KERN_DEBUG "NetXen function %d, class %x will not "
298 "be enabled.\n",pci_func_id, pdev->class); 542 "be enabled.\n",pci_func_id, pdev->class);
299 return -ENODEV; 543 return -ENODEV;
300 } 544 }
545
301 if ((err = pci_enable_device(pdev))) 546 if ((err = pci_enable_device(pdev)))
302 return err; 547 return err;
548
303 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 549 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
304 err = -ENODEV; 550 err = -ENODEV;
305 goto err_out_disable_pdev; 551 goto err_out_disable_pdev;
@@ -309,18 +555,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
309 goto err_out_disable_pdev; 555 goto err_out_disable_pdev;
310 556
311 pci_set_master(pdev); 557 pci_set_master(pdev);
312 if (pdev->revision == NX_P2_C1 &&
313 (pci_set_dma_mask(pdev, DMA_35BIT_MASK) == 0) &&
314 (pci_set_consistent_dma_mask(pdev, DMA_35BIT_MASK) == 0)) {
315 pci_using_dac = 1;
316 } else {
317 if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) ||
318 (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)))
319 goto err_out_free_res;
320
321 pci_using_dac = 0;
322 }
323
324 558
325 netdev = alloc_etherdev(sizeof(struct netxen_adapter)); 559 netdev = alloc_etherdev(sizeof(struct netxen_adapter));
326 if(!netdev) { 560 if(!netdev) {
@@ -333,13 +567,35 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
333 SET_NETDEV_DEV(netdev, &pdev->dev); 567 SET_NETDEV_DEV(netdev, &pdev->dev);
334 568
335 adapter = netdev->priv; 569 adapter = netdev->priv;
336 570 adapter->netdev = netdev;
337 adapter->ahw.pdev = pdev; 571 adapter->pdev = pdev;
338 adapter->ahw.pci_func = pci_func_id; 572 adapter->ahw.pci_func = pci_func_id;
339 573
574 revision_id = pdev->revision;
575 adapter->ahw.revision_id = revision_id;
576
577 err = nx_set_dma_mask(adapter, revision_id);
578 if (err)
579 goto err_out_free_netdev;
580
581 rwlock_init(&adapter->adapter_lock);
582 adapter->ahw.qdr_sn_window = -1;
583 adapter->ahw.ddr_mn_window = -1;
584
340 /* remap phys address */ 585 /* remap phys address */
341 mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */ 586 mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
342 mem_len = pci_resource_len(pdev, 0); 587 mem_len = pci_resource_len(pdev, 0);
588 pci_len0 = 0;
589
590 adapter->hw_write_wx = netxen_nic_hw_write_wx_128M;
591 adapter->hw_read_wx = netxen_nic_hw_read_wx_128M;
592 adapter->pci_read_immediate = netxen_nic_pci_read_immediate_128M;
593 adapter->pci_write_immediate = netxen_nic_pci_write_immediate_128M;
594 adapter->pci_read_normalize = netxen_nic_pci_read_normalize_128M;
595 adapter->pci_write_normalize = netxen_nic_pci_write_normalize_128M;
596 adapter->pci_set_window = netxen_nic_pci_set_window_128M;
597 adapter->pci_mem_read = netxen_nic_pci_mem_read_128M;
598 adapter->pci_mem_write = netxen_nic_pci_mem_write_128M;
343 599
344 /* 128 Meg of memory */ 600 /* 128 Meg of memory */
345 if (mem_len == NETXEN_PCI_128MB_SIZE) { 601 if (mem_len == NETXEN_PCI_128MB_SIZE) {
@@ -356,27 +612,48 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
356 SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE); 612 SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE);
357 first_page_group_start = 0; 613 first_page_group_start = 0;
358 first_page_group_end = 0; 614 first_page_group_end = 0;
615 } else if (mem_len == NETXEN_PCI_2MB_SIZE) {
616 adapter->hw_write_wx = netxen_nic_hw_write_wx_2M;
617 adapter->hw_read_wx = netxen_nic_hw_read_wx_2M;
618 adapter->pci_read_immediate = netxen_nic_pci_read_immediate_2M;
619 adapter->pci_write_immediate =
620 netxen_nic_pci_write_immediate_2M;
621 adapter->pci_read_normalize = netxen_nic_pci_read_normalize_2M;
622 adapter->pci_write_normalize =
623 netxen_nic_pci_write_normalize_2M;
624 adapter->pci_set_window = netxen_nic_pci_set_window_2M;
625 adapter->pci_mem_read = netxen_nic_pci_mem_read_2M;
626 adapter->pci_mem_write = netxen_nic_pci_mem_write_2M;
627
628 mem_ptr0 = ioremap(mem_base, mem_len);
629 pci_len0 = mem_len;
630 first_page_group_start = 0;
631 first_page_group_end = 0;
632
633 adapter->ahw.ddr_mn_window = 0;
634 adapter->ahw.qdr_sn_window = 0;
635
636 adapter->ahw.mn_win_crb = 0x100000 + PCIX_MN_WINDOW +
637 (pci_func_id * 0x20);
638 adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW;
639 if (pci_func_id < 4)
640 adapter->ahw.ms_win_crb += (pci_func_id * 0x20);
641 else
642 adapter->ahw.ms_win_crb +=
643 0xA0 + ((pci_func_id - 4) * 0x10);
359 } else { 644 } else {
360 err = -EIO; 645 err = -EIO;
361 goto err_out_free_netdev; 646 goto err_out_free_netdev;
362 } 647 }
363 648
364 if ((!mem_ptr0 && mem_len == NETXEN_PCI_128MB_SIZE) || 649 dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20));
365 !mem_ptr1 || !mem_ptr2) {
366 DPRINTK(ERR,
367 "Cannot remap adapter memory aborting.:"
368 "0 -> %p, 1 -> %p, 2 -> %p\n",
369 mem_ptr0, mem_ptr1, mem_ptr2);
370 650
371 err = -EIO;
372 goto err_out_iounmap;
373 }
374 db_base = pci_resource_start(pdev, 4); /* doorbell is on bar 4 */ 651 db_base = pci_resource_start(pdev, 4); /* doorbell is on bar 4 */
375 db_len = pci_resource_len(pdev, 4); 652 db_len = pci_resource_len(pdev, 4);
376 653
377 if (db_len == 0) { 654 if (db_len == 0) {
378 printk(KERN_ERR "%s: doorbell is disabled\n", 655 printk(KERN_ERR "%s: doorbell is disabled\n",
379 netxen_nic_driver_name); 656 netxen_nic_driver_name);
380 err = -EIO; 657 err = -EIO;
381 goto err_out_iounmap; 658 goto err_out_iounmap;
382 } 659 }
@@ -386,13 +663,14 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
386 db_ptr = ioremap(db_base, NETXEN_DB_MAPSIZE_BYTES); 663 db_ptr = ioremap(db_base, NETXEN_DB_MAPSIZE_BYTES);
387 if (!db_ptr) { 664 if (!db_ptr) {
388 printk(KERN_ERR "%s: Failed to allocate doorbell map.", 665 printk(KERN_ERR "%s: Failed to allocate doorbell map.",
389 netxen_nic_driver_name); 666 netxen_nic_driver_name);
390 err = -EIO; 667 err = -EIO;
391 goto err_out_iounmap; 668 goto err_out_iounmap;
392 } 669 }
393 DPRINTK(INFO, "doorbell ioremaped at %p\n", db_ptr); 670 DPRINTK(INFO, "doorbell ioremaped at %p\n", db_ptr);
394 671
395 adapter->ahw.pci_base0 = mem_ptr0; 672 adapter->ahw.pci_base0 = mem_ptr0;
673 adapter->ahw.pci_len0 = pci_len0;
396 adapter->ahw.first_page_group_start = first_page_group_start; 674 adapter->ahw.first_page_group_start = first_page_group_start;
397 adapter->ahw.first_page_group_end = first_page_group_end; 675 adapter->ahw.first_page_group_end = first_page_group_end;
398 adapter->ahw.pci_base1 = mem_ptr1; 676 adapter->ahw.pci_base1 = mem_ptr1;
@@ -400,11 +678,18 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
400 adapter->ahw.db_base = db_ptr; 678 adapter->ahw.db_base = db_ptr;
401 adapter->ahw.db_len = db_len; 679 adapter->ahw.db_len = db_len;
402 680
403 adapter->netdev = netdev;
404 adapter->pdev = pdev;
405
406 netif_napi_add(netdev, &adapter->napi, 681 netif_napi_add(netdev, &adapter->napi,
407 netxen_nic_poll, NETXEN_NETDEV_WEIGHT); 682 netxen_nic_poll, NETXEN_NETDEV_WEIGHT);
683
684 if (revision_id >= NX_P3_B0)
685 legacy_intrp = &legacy_intr[pci_func_id];
686 else
687 legacy_intrp = &legacy_intr[0];
688
689 adapter->legacy_intr.int_vec_bit = legacy_intrp->int_vec_bit;
690 adapter->legacy_intr.tgt_status_reg = legacy_intrp->tgt_status_reg;
691 adapter->legacy_intr.tgt_mask_reg = legacy_intrp->tgt_mask_reg;
692 adapter->legacy_intr.pci_int_reg = legacy_intrp->pci_int_reg;
408 693
409 /* this will be read from FW later */ 694 /* this will be read from FW later */
410 adapter->intr_scheme = -1; 695 adapter->intr_scheme = -1;
@@ -414,12 +699,23 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
414 adapter->portnum = pci_func_id; 699 adapter->portnum = pci_func_id;
415 adapter->status &= ~NETXEN_NETDEV_STATUS; 700 adapter->status &= ~NETXEN_NETDEV_STATUS;
416 adapter->rx_csum = 1; 701 adapter->rx_csum = 1;
702 adapter->mc_enabled = 0;
703 if (NX_IS_REVISION_P3(revision_id)) {
704 adapter->max_mc_count = 38;
705 adapter->max_rds_rings = 2;
706 } else {
707 adapter->max_mc_count = 16;
708 adapter->max_rds_rings = 3;
709 }
417 710
418 netdev->open = netxen_nic_open; 711 netdev->open = netxen_nic_open;
419 netdev->stop = netxen_nic_close; 712 netdev->stop = netxen_nic_close;
420 netdev->hard_start_xmit = netxen_nic_xmit_frame; 713 netdev->hard_start_xmit = netxen_nic_xmit_frame;
421 netdev->get_stats = netxen_nic_get_stats; 714 netdev->get_stats = netxen_nic_get_stats;
422 netdev->set_multicast_list = netxen_nic_set_multi; 715 if (NX_IS_REVISION_P3(revision_id))
716 netdev->set_multicast_list = netxen_p3_nic_set_multi;
717 else
718 netdev->set_multicast_list = netxen_p2_nic_set_multi;
423 netdev->set_mac_address = netxen_nic_set_mac; 719 netdev->set_mac_address = netxen_nic_set_mac;
424 netdev->change_mtu = netxen_nic_change_mtu; 720 netdev->change_mtu = netxen_nic_change_mtu;
425 netdev->tx_timeout = netxen_tx_timeout; 721 netdev->tx_timeout = netxen_tx_timeout;
@@ -435,18 +731,14 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
435 netdev->features = NETIF_F_SG; 731 netdev->features = NETIF_F_SG;
436 netdev->features |= NETIF_F_IP_CSUM; 732 netdev->features |= NETIF_F_IP_CSUM;
437 netdev->features |= NETIF_F_TSO; 733 netdev->features |= NETIF_F_TSO;
734 if (NX_IS_REVISION_P3(revision_id)) {
735 netdev->features |= NETIF_F_IPV6_CSUM;
736 netdev->features |= NETIF_F_TSO6;
737 }
438 738
439 if (pci_using_dac) 739 if (adapter->pci_using_dac)
440 netdev->features |= NETIF_F_HIGHDMA; 740 netdev->features |= NETIF_F_HIGHDMA;
441 741
442 if (pci_enable_msi(pdev))
443 adapter->flags &= ~NETXEN_NIC_MSI_ENABLED;
444 else
445 adapter->flags |= NETXEN_NIC_MSI_ENABLED;
446
447 netdev->irq = pdev->irq;
448 INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
449
450 /* 742 /*
451 * Set the CRB window to invalid. If any register in window 0 is 743 * Set the CRB window to invalid. If any register in window 0 is
452 * accessed it should set the window to 0 and then reset it to 1. 744 * accessed it should set the window to 0 and then reset it to 1.
@@ -455,87 +747,13 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
455 747
456 if (netxen_nic_get_board_info(adapter) != 0) { 748 if (netxen_nic_get_board_info(adapter) != 0) {
457 printk("%s: Error getting board config info.\n", 749 printk("%s: Error getting board config info.\n",
458 netxen_nic_driver_name); 750 netxen_nic_driver_name);
459 err = -EIO; 751 err = -EIO;
460 goto err_out_iounmap; 752 goto err_out_iounmap;
461 } 753 }
462 754
463 /*
464 * Adapter in our case is quad port so initialize it before
465 * initializing the ports
466 */
467
468 netxen_initialize_adapter_ops(adapter); 755 netxen_initialize_adapter_ops(adapter);
469 756
470 adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS_HOST;
471 if ((adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB35_4G) ||
472 (adapter->ahw.boardcfg.board_type ==
473 NETXEN_BRDTYPE_P2_SB31_2G))
474 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
475 else
476 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS;
477 adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
478 adapter->max_lro_rx_desc_count = MAX_LRO_RCV_DESCRIPTORS;
479
480 cmd_buf_arr = (struct netxen_cmd_buffer *)vmalloc(TX_RINGSIZE);
481 if (cmd_buf_arr == NULL) {
482 printk(KERN_ERR
483 "%s: Could not allocate cmd_buf_arr memory:%d\n",
484 netxen_nic_driver_name, (int)TX_RINGSIZE);
485 err = -ENOMEM;
486 goto err_out_free_adapter;
487 }
488 memset(cmd_buf_arr, 0, TX_RINGSIZE);
489 adapter->cmd_buf_arr = cmd_buf_arr;
490
491 for (i = 0; i < MAX_RCV_CTX; ++i) {
492 recv_ctx = &adapter->recv_ctx[i];
493 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
494 rcv_desc = &recv_ctx->rcv_desc[ring];
495 switch (RCV_DESC_TYPE(ring)) {
496 case RCV_DESC_NORMAL:
497 rcv_desc->max_rx_desc_count =
498 adapter->max_rx_desc_count;
499 rcv_desc->flags = RCV_DESC_NORMAL;
500 rcv_desc->dma_size = RX_DMA_MAP_LEN;
501 rcv_desc->skb_size = MAX_RX_BUFFER_LENGTH;
502 break;
503
504 case RCV_DESC_JUMBO:
505 rcv_desc->max_rx_desc_count =
506 adapter->max_jumbo_rx_desc_count;
507 rcv_desc->flags = RCV_DESC_JUMBO;
508 rcv_desc->dma_size = RX_JUMBO_DMA_MAP_LEN;
509 rcv_desc->skb_size = MAX_RX_JUMBO_BUFFER_LENGTH;
510 break;
511
512 case RCV_RING_LRO:
513 rcv_desc->max_rx_desc_count =
514 adapter->max_lro_rx_desc_count;
515 rcv_desc->flags = RCV_DESC_LRO;
516 rcv_desc->dma_size = RX_LRO_DMA_MAP_LEN;
517 rcv_desc->skb_size = MAX_RX_LRO_BUFFER_LENGTH;
518 break;
519
520 }
521 rcv_desc->rx_buf_arr = (struct netxen_rx_buffer *)
522 vmalloc(RCV_BUFFSIZE);
523
524 if (rcv_desc->rx_buf_arr == NULL) {
525 printk(KERN_ERR "%s: Could not allocate "
526 "rcv_desc->rx_buf_arr memory:%d\n",
527 netxen_nic_driver_name,
528 (int)RCV_BUFFSIZE);
529 err = -ENOMEM;
530 goto err_out_free_rx_buffer;
531 }
532 memset(rcv_desc->rx_buf_arr, 0, RCV_BUFFSIZE);
533 }
534
535 }
536
537 netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */
538
539 /* Mezz cards have PCI function 0,2,3 enabled */ 757 /* Mezz cards have PCI function 0,2,3 enabled */
540 switch (adapter->ahw.boardcfg.board_type) { 758 switch (adapter->ahw.boardcfg.board_type) {
541 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: 759 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
@@ -547,90 +765,71 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
547 break; 765 break;
548 } 766 }
549 767
550 init_timer(&adapter->watchdog_timer); 768 /*
551 adapter->ahw.xg_linkup = 0; 769 * This call will setup various max rx/tx counts.
552 adapter->watchdog_timer.function = &netxen_watchdog; 770 * It must be done before any buffer/ring allocations.
553 adapter->watchdog_timer.data = (unsigned long)adapter; 771 */
554 INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task); 772 netxen_check_options(adapter);
555 adapter->ahw.pdev = pdev;
556 adapter->ahw.revision_id = pdev->revision;
557
558 /* make sure Window == 1 */
559 netxen_nic_pci_change_crbwindow(adapter, 1);
560 773
774 first_driver = 0;
775 if (NX_IS_REVISION_P3(revision_id)) {
776 if (adapter->ahw.pci_func == 0)
777 first_driver = 1;
778 } else {
779 if (adapter->portnum == 0)
780 first_driver = 1;
781 }
782 adapter->crb_addr_cmd_producer = crb_cmd_producer[adapter->portnum];
783 adapter->crb_addr_cmd_consumer = crb_cmd_consumer[adapter->portnum];
561 netxen_nic_update_cmd_producer(adapter, 0); 784 netxen_nic_update_cmd_producer(adapter, 0);
562 netxen_nic_update_cmd_consumer(adapter, 0); 785 netxen_nic_update_cmd_consumer(adapter, 0);
563 writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_HOST_CMD_ADDR_LO));
564 786
565 if (netxen_is_flash_supported(adapter) == 0 && 787 if (first_driver) {
566 netxen_get_flash_mac_addr(adapter, mac_addr) == 0) 788 first_boot = adapter->pci_read_normalize(adapter,
567 valid_mac = 1; 789 NETXEN_CAM_RAM(0x1fc));
568 else
569 valid_mac = 0;
570
571 if (valid_mac) {
572 unsigned char *p = (unsigned char *)&mac_addr[adapter->portnum];
573 netdev->dev_addr[0] = *(p + 5);
574 netdev->dev_addr[1] = *(p + 4);
575 netdev->dev_addr[2] = *(p + 3);
576 netdev->dev_addr[3] = *(p + 2);
577 netdev->dev_addr[4] = *(p + 1);
578 netdev->dev_addr[5] = *(p + 0);
579 790
580 memcpy(netdev->perm_addr, netdev->dev_addr, 791 err = netxen_check_hw_init(adapter, first_boot);
581 netdev->addr_len); 792 if (err) {
582 if (!is_valid_ether_addr(netdev->perm_addr)) { 793 printk(KERN_ERR "%s: error in init HW init sequence\n",
583 printk(KERN_ERR "%s: Bad MAC address %s.\n", 794 netxen_nic_driver_name);
584 netxen_nic_driver_name, 795 goto err_out_iounmap;
585 print_mac(mac, netdev->dev_addr));
586 } else {
587 if (adapter->macaddr_set)
588 adapter->macaddr_set(adapter,
589 netdev->dev_addr);
590 } 796 }
591 }
592 797
593 if (adapter->portnum == 0) { 798 if (NX_IS_REVISION_P3(revision_id))
594 err = netxen_initialize_adapter_offload(adapter); 799 netxen_set_port_mode(adapter);
595 if (err) 800
596 goto err_out_free_rx_buffer; 801 if (first_boot != 0x55555555) {
597 val = readl(NETXEN_CRB_NORMALIZE(adapter, 802 adapter->pci_write_normalize(adapter,
598 NETXEN_CAM_RAM(0x1fc))); 803 CRB_CMDPEG_STATE, 0);
599 if (val == 0x55555555) {
600 /* This is the first boot after power up */
601 netxen_nic_read_w0(adapter, NETXEN_PCIE_REG(0x4), &val);
602 if (!(val & 0x4)) {
603 val |= 0x4;
604 netxen_nic_write_w0(adapter, NETXEN_PCIE_REG(0x4), val);
605 netxen_nic_read_w0(adapter, NETXEN_PCIE_REG(0x4), &val);
606 if (!(val & 0x4))
607 printk(KERN_ERR "%s: failed to set MSI bit in PCI-e reg\n",
608 netxen_nic_driver_name);
609 }
610 val = readl(NETXEN_CRB_NORMALIZE(adapter,
611 NETXEN_ROMUSB_GLB_SW_RESET));
612 printk(KERN_INFO"NetXen: read 0x%08x for reset reg.\n",val);
613 if (val != 0x80000f) {
614 /* clear the register for future unloads/loads */
615 writel(0, NETXEN_CRB_NORMALIZE(adapter,
616 NETXEN_CAM_RAM(0x1fc)));
617 printk(KERN_ERR "ERROR in NetXen HW init sequence.\n");
618 err = -ENODEV;
619 goto err_out_free_dev;
620 }
621 } else {
622 writel(0, NETXEN_CRB_NORMALIZE(adapter,
623 CRB_CMDPEG_STATE));
624 netxen_pinit_from_rom(adapter, 0); 804 netxen_pinit_from_rom(adapter, 0);
625 msleep(1); 805 msleep(1);
626 netxen_load_firmware(adapter); 806 netxen_load_firmware(adapter);
627 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
628 } 807 }
629 808
630 /* clear the register for future unloads/loads */ 809 if (NX_IS_REVISION_P3(revision_id))
631 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); 810 netxen_pcie_strap_init(adapter);
632 dev_info(&pdev->dev, "cmdpeg state: 0x%0x\n", 811
633 readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); 812 if (NX_IS_REVISION_P2(revision_id)) {
813
814 /* Initialize multicast addr pool owners */
815 val = 0x7654;
816 if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
817 val |= 0x0f000000;
818 netxen_crb_writelit_adapter(adapter,
819 NETXEN_MAC_ADDR_CNTL_REG, val);
820
821 }
822
823 if ((first_boot == 0x55555555) &&
824 (NX_IS_REVISION_P2(revision_id))) {
825 /* Unlock the HW, prompting the boot sequence */
826 adapter->pci_write_normalize(adapter,
827 NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
828 }
829
830 err = netxen_initialize_adapter_offload(adapter);
831 if (err)
832 goto err_out_iounmap;
634 833
635 /* 834 /*
636 * Tell the hardware our version number. 835 * Tell the hardware our version number.
@@ -638,24 +837,101 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
638 i = (_NETXEN_NIC_LINUX_MAJOR << 16) 837 i = (_NETXEN_NIC_LINUX_MAJOR << 16)
639 | ((_NETXEN_NIC_LINUX_MINOR << 8)) 838 | ((_NETXEN_NIC_LINUX_MINOR << 8))
640 | (_NETXEN_NIC_LINUX_SUBVERSION); 839 | (_NETXEN_NIC_LINUX_SUBVERSION);
641 writel(i, NETXEN_CRB_NORMALIZE(adapter, CRB_DRIVER_VERSION)); 840 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
642 841
643 /* Unlock the HW, prompting the boot sequence */
644 writel(1,
645 NETXEN_CRB_NORMALIZE(adapter,
646 NETXEN_ROMUSB_GLB_PEGTUNE_DONE));
647 /* Handshake with the card before we register the devices. */ 842 /* Handshake with the card before we register the devices. */
648 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); 843 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
844
845 } /* first_driver */
846
847 netxen_nic_flash_print(adapter);
848
849 if (NX_IS_REVISION_P3(revision_id)) {
850 adapter->hw_read_wx(adapter,
851 NETXEN_MIU_MN_CONTROL, &val, 4);
852 adapter->ahw.cut_through = (val & 0x4) ? 1 : 0;
853 dev_info(&pdev->dev, "firmware running in %s mode\n",
854 adapter->ahw.cut_through ? "cut through" : "legacy");
649 } 855 }
650 856
651 /* 857 /*
652 * See if the firmware gave us a virtual-physical port mapping. 858 * See if the firmware gave us a virtual-physical port mapping.
653 */ 859 */
654 adapter->physical_port = adapter->portnum; 860 adapter->physical_port = adapter->portnum;
655 i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); 861 i = adapter->pci_read_normalize(adapter, CRB_V2P(adapter->portnum));
656 if (i != 0x55555555) 862 if (i != 0x55555555)
657 adapter->physical_port = i; 863 adapter->physical_port = i;
658 864
865 adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
866
867 netxen_set_msix_bit(pdev, 0);
868
869 if (NX_IS_REVISION_P3(revision_id)) {
870 if ((mem_len != NETXEN_PCI_128MB_SIZE) &&
871 mem_len != NETXEN_PCI_2MB_SIZE)
872 adapter->msix_supported = 0;
873 }
874
875 if (adapter->msix_supported) {
876
877 netxen_init_msix_entries(adapter);
878
879 if (pci_enable_msix(pdev, adapter->msix_entries,
880 MSIX_ENTRIES_PER_ADAPTER))
881 goto request_msi;
882
883 adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
884 netxen_set_msix_bit(pdev, 1);
885 dev_info(&pdev->dev, "using msi-x interrupts\n");
886
887 } else {
888request_msi:
889 if (use_msi && !pci_enable_msi(pdev)) {
890 adapter->flags |= NETXEN_NIC_MSI_ENABLED;
891 dev_info(&pdev->dev, "using msi interrupts\n");
892 } else
893 dev_info(&pdev->dev, "using legacy interrupts\n");
894 }
895
896 if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
897 netdev->irq = adapter->msix_entries[0].vector;
898 else
899 netdev->irq = pdev->irq;
900
901 err = netxen_receive_peg_ready(adapter);
902 if (err)
903 goto err_out_disable_msi;
904
905 init_timer(&adapter->watchdog_timer);
906 adapter->ahw.linkup = 0;
907 adapter->watchdog_timer.function = &netxen_watchdog;
908 adapter->watchdog_timer.data = (unsigned long)adapter;
909 INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task);
910 INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
911
912 if (netxen_is_flash_supported(adapter) == 0 &&
913 netxen_get_flash_mac_addr(adapter, mac_addr) == 0) {
914 unsigned char *p;
915
916 p = (unsigned char *)&mac_addr[adapter->portnum];
917 netdev->dev_addr[0] = *(p + 5);
918 netdev->dev_addr[1] = *(p + 4);
919 netdev->dev_addr[2] = *(p + 3);
920 netdev->dev_addr[3] = *(p + 2);
921 netdev->dev_addr[4] = *(p + 1);
922 netdev->dev_addr[5] = *(p + 0);
923
924 memcpy(netdev->perm_addr, netdev->dev_addr,
925 netdev->addr_len);
926 if (!is_valid_ether_addr(netdev->perm_addr)) {
927 printk(KERN_ERR "%s: Bad MAC address %s.\n",
928 netxen_nic_driver_name,
929 print_mac(mac, netdev->dev_addr));
930 } else {
931 adapter->macaddr_set(adapter, netdev->dev_addr);
932 }
933 }
934
659 netif_carrier_off(netdev); 935 netif_carrier_off(netdev);
660 netif_stop_queue(netdev); 936 netif_stop_queue(netdev);
661 937
@@ -664,41 +940,37 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
664 " aborting\n", netxen_nic_driver_name, 940 " aborting\n", netxen_nic_driver_name,
665 adapter->portnum); 941 adapter->portnum);
666 err = -EIO; 942 err = -EIO;
667 goto err_out_free_dev; 943 goto err_out_disable_msi;
668 } 944 }
669 945
670 netxen_nic_flash_print(adapter);
671 pci_set_drvdata(pdev, adapter); 946 pci_set_drvdata(pdev, adapter);
672 947
673 return 0; 948 switch (adapter->ahw.board_type) {
674 949 case NETXEN_NIC_GBE:
675err_out_free_dev: 950 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
676 if (adapter->portnum == 0) 951 adapter->netdev->name);
677 netxen_free_adapter_offload(adapter); 952 break;
678 953 case NETXEN_NIC_XGBE:
679err_out_free_rx_buffer: 954 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
680 for (i = 0; i < MAX_RCV_CTX; ++i) { 955 adapter->netdev->name);
681 recv_ctx = &adapter->recv_ctx[i]; 956 break;
682 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
683 rcv_desc = &recv_ctx->rcv_desc[ring];
684 if (rcv_desc->rx_buf_arr != NULL) {
685 vfree(rcv_desc->rx_buf_arr);
686 rcv_desc->rx_buf_arr = NULL;
687 }
688 }
689 } 957 }
690 vfree(cmd_buf_arr);
691 958
692err_out_free_adapter: 959 return 0;
960
961err_out_disable_msi:
962 if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
963 pci_disable_msix(pdev);
693 if (adapter->flags & NETXEN_NIC_MSI_ENABLED) 964 if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
694 pci_disable_msi(pdev); 965 pci_disable_msi(pdev);
695 966
696 pci_set_drvdata(pdev, NULL); 967 if (first_driver)
968 netxen_free_adapter_offload(adapter);
697 969
970err_out_iounmap:
698 if (db_ptr) 971 if (db_ptr)
699 iounmap(db_ptr); 972 iounmap(db_ptr);
700 973
701err_out_iounmap:
702 if (mem_ptr0) 974 if (mem_ptr0)
703 iounmap(mem_ptr0); 975 iounmap(mem_ptr0);
704 if (mem_ptr1) 976 if (mem_ptr1)
@@ -713,6 +985,7 @@ err_out_free_res:
713 pci_release_regions(pdev); 985 pci_release_regions(pdev);
714 986
715err_out_disable_pdev: 987err_out_disable_pdev:
988 pci_set_drvdata(pdev, NULL);
716 pci_disable_device(pdev); 989 pci_disable_device(pdev);
717 return err; 990 return err;
718} 991}
@@ -721,11 +994,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
721{ 994{
722 struct netxen_adapter *adapter; 995 struct netxen_adapter *adapter;
723 struct net_device *netdev; 996 struct net_device *netdev;
724 struct netxen_rx_buffer *buffer;
725 struct netxen_recv_context *recv_ctx;
726 struct netxen_rcv_desc_ctx *rcv_desc;
727 int i, ctxid, ring;
728 static int init_firmware_done = 0;
729 997
730 adapter = pci_get_drvdata(pdev); 998 adapter = pci_get_drvdata(pdev);
731 if (adapter == NULL) 999 if (adapter == NULL)
@@ -736,36 +1004,18 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
736 unregister_netdev(netdev); 1004 unregister_netdev(netdev);
737 1005
738 if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { 1006 if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
739 init_firmware_done++;
740 netxen_free_hw_resources(adapter); 1007 netxen_free_hw_resources(adapter);
1008 netxen_free_sw_resources(adapter);
741 } 1009 }
742 1010
743 for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) {
744 recv_ctx = &adapter->recv_ctx[ctxid];
745 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
746 rcv_desc = &recv_ctx->rcv_desc[ring];
747 for (i = 0; i < rcv_desc->max_rx_desc_count; ++i) {
748 buffer = &(rcv_desc->rx_buf_arr[i]);
749 if (buffer->state == NETXEN_BUFFER_FREE)
750 continue;
751 pci_unmap_single(pdev, buffer->dma,
752 rcv_desc->dma_size,
753 PCI_DMA_FROMDEVICE);
754 if (buffer->skb != NULL)
755 dev_kfree_skb_any(buffer->skb);
756 }
757 vfree(rcv_desc->rx_buf_arr);
758 }
759 }
760
761 vfree(adapter->cmd_buf_arr);
762
763 if (adapter->portnum == 0) 1011 if (adapter->portnum == 0)
764 netxen_free_adapter_offload(adapter); 1012 netxen_free_adapter_offload(adapter);
765 1013
766 if (adapter->irq) 1014 if (adapter->irq)
767 free_irq(adapter->irq, adapter); 1015 free_irq(adapter->irq, adapter);
768 1016
1017 if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
1018 pci_disable_msix(pdev);
769 if (adapter->flags & NETXEN_NIC_MSI_ENABLED) 1019 if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
770 pci_disable_msi(pdev); 1020 pci_disable_msi(pdev);
771 1021
@@ -803,51 +1053,69 @@ static int netxen_nic_open(struct net_device *netdev)
803 return -EIO; 1053 return -EIO;
804 } 1054 }
805 1055
806 /* setup all the resources for the Phantom... */ 1056 err = netxen_alloc_sw_resources(adapter);
807 /* this include the descriptors for rcv, tx, and status */
808 netxen_nic_clear_stats(adapter);
809 err = netxen_nic_hw_resources(adapter);
810 if (err) { 1057 if (err) {
811 printk(KERN_ERR "Error in setting hw resources:%d\n", 1058 printk(KERN_ERR "%s: Error in setting sw resources\n",
812 err); 1059 netdev->name);
813 return err; 1060 return err;
814 } 1061 }
1062
1063 netxen_nic_clear_stats(adapter);
1064
1065 err = netxen_alloc_hw_resources(adapter);
1066 if (err) {
1067 printk(KERN_ERR "%s: Error in setting hw resources\n",
1068 netdev->name);
1069 goto err_out_free_sw;
1070 }
1071
1072 if (adapter->fw_major < 4) {
1073 adapter->crb_addr_cmd_producer =
1074 crb_cmd_producer[adapter->portnum];
1075 adapter->crb_addr_cmd_consumer =
1076 crb_cmd_consumer[adapter->portnum];
1077 }
1078
1079 netxen_nic_update_cmd_producer(adapter, 0);
1080 netxen_nic_update_cmd_consumer(adapter, 0);
1081
815 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { 1082 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
816 for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) 1083 for (ring = 0; ring < adapter->max_rds_rings; ring++)
817 netxen_post_rx_buffers(adapter, ctx, ring); 1084 netxen_post_rx_buffers(adapter, ctx, ring);
818 } 1085 }
819 adapter->irq = adapter->ahw.pdev->irq; 1086 if (NETXEN_IS_MSI_FAMILY(adapter))
820 if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
821 handler = netxen_msi_intr; 1087 handler = netxen_msi_intr;
822 else { 1088 else {
823 flags |= IRQF_SHARED; 1089 flags |= IRQF_SHARED;
824 handler = netxen_intr; 1090 handler = netxen_intr;
825 } 1091 }
1092 adapter->irq = netdev->irq;
826 err = request_irq(adapter->irq, handler, 1093 err = request_irq(adapter->irq, handler,
827 flags, netdev->name, adapter); 1094 flags, netdev->name, adapter);
828 if (err) { 1095 if (err) {
829 printk(KERN_ERR "request_irq failed with: %d\n", err); 1096 printk(KERN_ERR "request_irq failed with: %d\n", err);
830 netxen_free_hw_resources(adapter); 1097 goto err_out_free_hw;
831 return err;
832 } 1098 }
833 1099
834 adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; 1100 adapter->is_up = NETXEN_ADAPTER_UP_MAGIC;
835 } 1101 }
1102
836 /* Done here again so that even if phantom sw overwrote it, 1103 /* Done here again so that even if phantom sw overwrote it,
837 * we set it */ 1104 * we set it */
838 if (adapter->init_port 1105 err = adapter->init_port(adapter, adapter->physical_port);
839 && adapter->init_port(adapter, adapter->portnum) != 0) { 1106 if (err) {
840 printk(KERN_ERR "%s: Failed to initialize port %d\n", 1107 printk(KERN_ERR "%s: Failed to initialize port %d\n",
841 netxen_nic_driver_name, adapter->portnum); 1108 netxen_nic_driver_name, adapter->portnum);
842 return -EIO; 1109 goto err_out_free_irq;
843 } 1110 }
844 if (adapter->macaddr_set) 1111 adapter->macaddr_set(adapter, netdev->dev_addr);
845 adapter->macaddr_set(adapter, netdev->dev_addr);
846 1112
847 netxen_nic_set_link_parameters(adapter); 1113 netxen_nic_set_link_parameters(adapter);
848 1114
849 netxen_nic_set_multi(netdev); 1115 netdev->set_multicast_list(netdev);
850 if (adapter->set_mtu) 1116 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1117 nx_fw_cmd_set_mtu(adapter, netdev->mtu);
1118 else
851 adapter->set_mtu(adapter, netdev->mtu); 1119 adapter->set_mtu(adapter, netdev->mtu);
852 1120
853 mod_timer(&adapter->watchdog_timer, jiffies); 1121 mod_timer(&adapter->watchdog_timer, jiffies);
@@ -858,6 +1126,14 @@ static int netxen_nic_open(struct net_device *netdev)
858 netif_start_queue(netdev); 1126 netif_start_queue(netdev);
859 1127
860 return 0; 1128 return 0;
1129
1130err_out_free_irq:
1131 free_irq(adapter->irq, adapter);
1132err_out_free_hw:
1133 netxen_free_hw_resources(adapter);
1134err_out_free_sw:
1135 netxen_free_sw_resources(adapter);
1136 return err;
861} 1137}
862 1138
863/* 1139/*
@@ -866,9 +1142,6 @@ static int netxen_nic_open(struct net_device *netdev)
866static int netxen_nic_close(struct net_device *netdev) 1142static int netxen_nic_close(struct net_device *netdev)
867{ 1143{
868 struct netxen_adapter *adapter = netdev_priv(netdev); 1144 struct netxen_adapter *adapter = netdev_priv(netdev);
869 int i, j;
870 struct netxen_cmd_buffer *cmd_buff;
871 struct netxen_skb_frag *buffrag;
872 1145
873 netif_carrier_off(netdev); 1146 netif_carrier_off(netdev);
874 netif_stop_queue(netdev); 1147 netif_stop_queue(netdev);
@@ -879,30 +1152,8 @@ static int netxen_nic_close(struct net_device *netdev)
879 1152
880 netxen_nic_disable_int(adapter); 1153 netxen_nic_disable_int(adapter);
881 1154
882 cmd_buff = adapter->cmd_buf_arr; 1155 netxen_release_tx_buffers(adapter);
883 for (i = 0; i < adapter->max_tx_desc_count; i++) { 1156
884 buffrag = cmd_buff->frag_array;
885 if (buffrag->dma) {
886 pci_unmap_single(adapter->pdev, buffrag->dma,
887 buffrag->length, PCI_DMA_TODEVICE);
888 buffrag->dma = 0ULL;
889 }
890 for (j = 0; j < cmd_buff->frag_count; j++) {
891 buffrag++;
892 if (buffrag->dma) {
893 pci_unmap_page(adapter->pdev, buffrag->dma,
894 buffrag->length,
895 PCI_DMA_TODEVICE);
896 buffrag->dma = 0ULL;
897 }
898 }
899 /* Free the skb we received in netxen_nic_xmit_frame */
900 if (cmd_buff->skb) {
901 dev_kfree_skb_any(cmd_buff->skb);
902 cmd_buff->skb = NULL;
903 }
904 cmd_buff++;
905 }
906 if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { 1157 if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
907 FLUSH_SCHEDULED_WORK(); 1158 FLUSH_SCHEDULED_WORK();
908 del_timer_sync(&adapter->watchdog_timer); 1159 del_timer_sync(&adapter->watchdog_timer);
@@ -911,6 +1162,31 @@ static int netxen_nic_close(struct net_device *netdev)
911 return 0; 1162 return 0;
912} 1163}
913 1164
1165void netxen_tso_check(struct netxen_adapter *adapter,
1166 struct cmd_desc_type0 *desc, struct sk_buff *skb)
1167{
1168 if (desc->mss) {
1169 desc->total_hdr_length = (sizeof(struct ethhdr) +
1170 ip_hdrlen(skb) + tcp_hdrlen(skb));
1171
1172 if ((NX_IS_REVISION_P3(adapter->ahw.revision_id)) &&
1173 (skb->protocol == htons(ETH_P_IPV6)))
1174 netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO6);
1175 else
1176 netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO);
1177
1178 } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
1179 if (ip_hdr(skb)->protocol == IPPROTO_TCP)
1180 netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT);
1181 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
1182 netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT);
1183 else
1184 return;
1185 }
1186 desc->tcp_hdr_offset = skb_transport_offset(skb);
1187 desc->ip_hdr_offset = skb_network_offset(skb);
1188}
1189
914static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) 1190static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
915{ 1191{
916 struct netxen_adapter *adapter = netdev_priv(netdev); 1192 struct netxen_adapter *adapter = netdev_priv(netdev);
@@ -932,7 +1208,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
932 1208
933 /* There 4 fragments per descriptor */ 1209 /* There 4 fragments per descriptor */
934 no_of_desc = (frag_count + 3) >> 2; 1210 no_of_desc = (frag_count + 3) >> 2;
935 if (netdev->features & NETIF_F_TSO) { 1211 if (netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) {
936 if (skb_shinfo(skb)->gso_size > 0) { 1212 if (skb_shinfo(skb)->gso_size > 0) {
937 1213
938 no_of_desc++; 1214 no_of_desc++;
@@ -959,7 +1235,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
959 memset(hwdesc, 0, sizeof(struct cmd_desc_type0)); 1235 memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
960 /* Take skb->data itself */ 1236 /* Take skb->data itself */
961 pbuf = &adapter->cmd_buf_arr[producer]; 1237 pbuf = &adapter->cmd_buf_arr[producer];
962 if ((netdev->features & NETIF_F_TSO) && skb_shinfo(skb)->gso_size > 0) { 1238 if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) &&
1239 skb_shinfo(skb)->gso_size > 0) {
963 pbuf->mss = skb_shinfo(skb)->gso_size; 1240 pbuf->mss = skb_shinfo(skb)->gso_size;
964 hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size); 1241 hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
965 } else { 1242 } else {
@@ -1086,6 +1363,89 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
1086 return NETDEV_TX_OK; 1363 return NETDEV_TX_OK;
1087} 1364}
1088 1365
1366static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1367{
1368 struct net_device *netdev = adapter->netdev;
1369 uint32_t temp, temp_state, temp_val;
1370 int rv = 0;
1371
1372 temp = adapter->pci_read_normalize(adapter, CRB_TEMP_STATE);
1373
1374 temp_state = nx_get_temp_state(temp);
1375 temp_val = nx_get_temp_val(temp);
1376
1377 if (temp_state == NX_TEMP_PANIC) {
1378 printk(KERN_ALERT
1379 "%s: Device temperature %d degrees C exceeds"
1380 " maximum allowed. Hardware has been shut down.\n",
1381 netxen_nic_driver_name, temp_val);
1382
1383 netif_carrier_off(netdev);
1384 netif_stop_queue(netdev);
1385 rv = 1;
1386 } else if (temp_state == NX_TEMP_WARN) {
1387 if (adapter->temp == NX_TEMP_NORMAL) {
1388 printk(KERN_ALERT
1389 "%s: Device temperature %d degrees C "
1390 "exceeds operating range."
1391 " Immediate action needed.\n",
1392 netxen_nic_driver_name, temp_val);
1393 }
1394 } else {
1395 if (adapter->temp == NX_TEMP_WARN) {
1396 printk(KERN_INFO
1397 "%s: Device temperature is now %d degrees C"
1398 " in normal range.\n", netxen_nic_driver_name,
1399 temp_val);
1400 }
1401 }
1402 adapter->temp = temp_state;
1403 return rv;
1404}
1405
1406static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1407{
1408 struct net_device *netdev = adapter->netdev;
1409 u32 val, port, linkup;
1410
1411 port = adapter->physical_port;
1412
1413 if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
1414 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE);
1415 linkup = (val >> port) & 1;
1416 } else {
1417 if (adapter->fw_major < 4) {
1418 val = adapter->pci_read_normalize(adapter,
1419 CRB_XG_STATE);
1420 val = (val >> port*8) & 0xff;
1421 linkup = (val == XG_LINK_UP);
1422 } else {
1423 val = adapter->pci_read_normalize(adapter,
1424 CRB_XG_STATE_P3);
1425 val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
1426 linkup = (val == XG_LINK_UP_P3);
1427 }
1428 }
1429
1430 if (adapter->ahw.linkup && !linkup) {
1431 printk(KERN_INFO "%s: %s NIC Link is down\n",
1432 netxen_nic_driver_name, netdev->name);
1433 adapter->ahw.linkup = 0;
1434 if (netif_running(netdev)) {
1435 netif_carrier_off(netdev);
1436 netif_stop_queue(netdev);
1437 }
1438 } else if (!adapter->ahw.linkup && linkup) {
1439 printk(KERN_INFO "%s: %s NIC Link is up\n",
1440 netxen_nic_driver_name, netdev->name);
1441 adapter->ahw.linkup = 1;
1442 if (netif_running(netdev)) {
1443 netif_carrier_on(netdev);
1444 netif_wake_queue(netdev);
1445 }
1446 }
1447}
1448
1089static void netxen_watchdog(unsigned long v) 1449static void netxen_watchdog(unsigned long v)
1090{ 1450{
1091 struct netxen_adapter *adapter = (struct netxen_adapter *)v; 1451 struct netxen_adapter *adapter = (struct netxen_adapter *)v;
@@ -1093,6 +1453,19 @@ static void netxen_watchdog(unsigned long v)
1093 SCHEDULE_WORK(&adapter->watchdog_task); 1453 SCHEDULE_WORK(&adapter->watchdog_task);
1094} 1454}
1095 1455
1456void netxen_watchdog_task(struct work_struct *work)
1457{
1458 struct netxen_adapter *adapter =
1459 container_of(work, struct netxen_adapter, watchdog_task);
1460
1461 if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter))
1462 return;
1463
1464 netxen_nic_handle_phy_intr(adapter);
1465
1466 mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
1467}
1468
1096static void netxen_tx_timeout(struct net_device *netdev) 1469static void netxen_tx_timeout(struct net_device *netdev)
1097{ 1470{
1098 struct netxen_adapter *adapter = (struct netxen_adapter *) 1471 struct netxen_adapter *adapter = (struct netxen_adapter *)
@@ -1118,6 +1491,38 @@ static void netxen_tx_timeout_task(struct work_struct *work)
1118 netif_wake_queue(adapter->netdev); 1491 netif_wake_queue(adapter->netdev);
1119} 1492}
1120 1493
1494/*
1495 * netxen_nic_get_stats - Get System Network Statistics
1496 * @netdev: network interface device structure
1497 */
1498struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
1499{
1500 struct netxen_adapter *adapter = netdev_priv(netdev);
1501 struct net_device_stats *stats = &adapter->net_stats;
1502
1503 memset(stats, 0, sizeof(*stats));
1504
1505 /* total packets received */
1506 stats->rx_packets = adapter->stats.no_rcv;
1507 /* total packets transmitted */
1508 stats->tx_packets = adapter->stats.xmitedframes +
1509 adapter->stats.xmitfinished;
1510 /* total bytes received */
1511 stats->rx_bytes = adapter->stats.rxbytes;
1512 /* total bytes transmitted */
1513 stats->tx_bytes = adapter->stats.txbytes;
1514 /* bad packets received */
1515 stats->rx_errors = adapter->stats.rcvdbadskb;
1516 /* packet transmit problems */
1517 stats->tx_errors = adapter->stats.nocmddescriptor;
1518 /* no space in linux buffers */
1519 stats->rx_dropped = adapter->stats.rxdropped;
1520 /* no space available in linux */
1521 stats->tx_dropped = adapter->stats.txdropped;
1522
1523 return stats;
1524}
1525
1121static inline void 1526static inline void
1122netxen_handle_int(struct netxen_adapter *adapter) 1527netxen_handle_int(struct netxen_adapter *adapter)
1123{ 1528{
@@ -1125,20 +1530,20 @@ netxen_handle_int(struct netxen_adapter *adapter)
1125 napi_schedule(&adapter->napi); 1530 napi_schedule(&adapter->napi);
1126} 1531}
1127 1532
1128irqreturn_t netxen_intr(int irq, void *data) 1533static irqreturn_t netxen_intr(int irq, void *data)
1129{ 1534{
1130 struct netxen_adapter *adapter = data; 1535 struct netxen_adapter *adapter = data;
1131 u32 our_int = 0; 1536 u32 our_int = 0;
1132 1537
1133 our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); 1538 our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR);
1134 /* not our interrupt */ 1539 /* not our interrupt */
1135 if ((our_int & (0x80 << adapter->portnum)) == 0) 1540 if ((our_int & (0x80 << adapter->portnum)) == 0)
1136 return IRQ_NONE; 1541 return IRQ_NONE;
1137 1542
1138 if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { 1543 if (adapter->intr_scheme == INTR_SCHEME_PERPORT) {
1139 /* claim interrupt */ 1544 /* claim interrupt */
1140 writel(our_int & ~((u32)(0x80 << adapter->portnum)), 1545 adapter->pci_write_normalize(adapter, CRB_INT_VECTOR,
1141 NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); 1546 our_int & ~((u32)(0x80 << adapter->portnum)));
1142 } 1547 }
1143 1548
1144 netxen_handle_int(adapter); 1549 netxen_handle_int(adapter);
@@ -1146,7 +1551,7 @@ irqreturn_t netxen_intr(int irq, void *data)
1146 return IRQ_HANDLED; 1551 return IRQ_HANDLED;
1147} 1552}
1148 1553
1149irqreturn_t netxen_msi_intr(int irq, void *data) 1554static irqreturn_t netxen_msi_intr(int irq, void *data)
1150{ 1555{
1151 struct netxen_adapter *adapter = data; 1556 struct netxen_adapter *adapter = data;
1152 1557
@@ -1220,10 +1625,6 @@ module_init(netxen_init_module);
1220 1625
1221static void __exit netxen_exit_module(void) 1626static void __exit netxen_exit_module(void)
1222{ 1627{
1223 /*
1224 * Wait for some time to allow the dma to drain, if any.
1225 */
1226 msleep(100);
1227 pci_unregister_driver(&netxen_driver); 1628 pci_unregister_driver(&netxen_driver);
1228 destroy_workqueue(netxen_workq); 1629 destroy_workqueue(netxen_workq);
1229} 1630}
diff --git a/drivers/net/netxen/netxen_nic_niu.c b/drivers/net/netxen/netxen_nic_niu.c
index a3bc7cc67a6f..4cb8f4a1cf4b 100644
--- a/drivers/net/netxen/netxen_nic_niu.c
+++ b/drivers/net/netxen/netxen_nic_niu.c
@@ -46,9 +46,8 @@ static int phy_lock(struct netxen_adapter *adapter)
46 int done = 0, timeout = 0; 46 int done = 0, timeout = 0;
47 47
48 while (!done) { 48 while (!done) {
49 done = 49 done = netxen_nic_reg_read(adapter,
50 readl(pci_base_offset 50 NETXEN_PCIE_REG(PCIE_SEM3_LOCK));
51 (adapter, NETXEN_PCIE_REG(PCIE_SEM3_LOCK)));
52 if (done == 1) 51 if (done == 1)
53 break; 52 break;
54 if (timeout >= phy_lock_timeout) { 53 if (timeout >= phy_lock_timeout) {
@@ -63,14 +62,14 @@ static int phy_lock(struct netxen_adapter *adapter)
63 } 62 }
64 } 63 }
65 64
66 writel(PHY_LOCK_DRIVER, 65 netxen_crb_writelit_adapter(adapter,
67 NETXEN_CRB_NORMALIZE(adapter, NETXEN_PHY_LOCK_ID)); 66 NETXEN_PHY_LOCK_ID, PHY_LOCK_DRIVER);
68 return 0; 67 return 0;
69} 68}
70 69
71static int phy_unlock(struct netxen_adapter *adapter) 70static int phy_unlock(struct netxen_adapter *adapter)
72{ 71{
73 readl(pci_base_offset(adapter, NETXEN_PCIE_REG(PCIE_SEM3_UNLOCK))); 72 adapter->pci_read_immediate(adapter, NETXEN_PCIE_REG(PCIE_SEM3_UNLOCK));
74 73
75 return 0; 74 return 0;
76} 75}
@@ -109,7 +108,7 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg,
109 * so it cannot be in reset 108 * so it cannot be in reset
110 */ 109 */
111 110
112 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), 111 if (adapter->hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0),
113 &mac_cfg0, 4)) 112 &mac_cfg0, 4))
114 return -EIO; 113 return -EIO;
115 if (netxen_gb_get_soft_reset(mac_cfg0)) { 114 if (netxen_gb_get_soft_reset(mac_cfg0)) {
@@ -119,7 +118,7 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg,
119 netxen_gb_rx_reset_pb(temp); 118 netxen_gb_rx_reset_pb(temp);
120 netxen_gb_tx_reset_mac(temp); 119 netxen_gb_tx_reset_mac(temp);
121 netxen_gb_rx_reset_mac(temp); 120 netxen_gb_rx_reset_mac(temp);
122 if (netxen_nic_hw_write_wx(adapter, 121 if (adapter->hw_write_wx(adapter,
123 NETXEN_NIU_GB_MAC_CONFIG_0(0), 122 NETXEN_NIU_GB_MAC_CONFIG_0(0),
124 &temp, 4)) 123 &temp, 4))
125 return -EIO; 124 return -EIO;
@@ -129,22 +128,22 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg,
129 address = 0; 128 address = 0;
130 netxen_gb_mii_mgmt_reg_addr(address, reg); 129 netxen_gb_mii_mgmt_reg_addr(address, reg);
131 netxen_gb_mii_mgmt_phy_addr(address, phy); 130 netxen_gb_mii_mgmt_phy_addr(address, phy);
132 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0), 131 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0),
133 &address, 4)) 132 &address, 4))
134 return -EIO; 133 return -EIO;
135 command = 0; /* turn off any prior activity */ 134 command = 0; /* turn off any prior activity */
136 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), 135 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
137 &command, 4)) 136 &command, 4))
138 return -EIO; 137 return -EIO;
139 /* send read command */ 138 /* send read command */
140 netxen_gb_mii_mgmt_set_read_cycle(command); 139 netxen_gb_mii_mgmt_set_read_cycle(command);
141 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), 140 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
142 &command, 4)) 141 &command, 4))
143 return -EIO; 142 return -EIO;
144 143
145 status = 0; 144 status = 0;
146 do { 145 do {
147 if (netxen_nic_hw_read_wx(adapter, 146 if (adapter->hw_read_wx(adapter,
148 NETXEN_NIU_GB_MII_MGMT_INDICATE(0), 147 NETXEN_NIU_GB_MII_MGMT_INDICATE(0),
149 &status, 4)) 148 &status, 4))
150 return -EIO; 149 return -EIO;
@@ -154,7 +153,7 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg,
154 && (timeout++ < NETXEN_NIU_PHY_WAITMAX)); 153 && (timeout++ < NETXEN_NIU_PHY_WAITMAX));
155 154
156 if (timeout < NETXEN_NIU_PHY_WAITMAX) { 155 if (timeout < NETXEN_NIU_PHY_WAITMAX) {
157 if (netxen_nic_hw_read_wx(adapter, 156 if (adapter->hw_read_wx(adapter,
158 NETXEN_NIU_GB_MII_MGMT_STATUS(0), 157 NETXEN_NIU_GB_MII_MGMT_STATUS(0),
159 readval, 4)) 158 readval, 4))
160 return -EIO; 159 return -EIO;
@@ -163,7 +162,7 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg,
163 result = -1; 162 result = -1;
164 163
165 if (restore) 164 if (restore)
166 if (netxen_nic_hw_write_wx(adapter, 165 if (adapter->hw_write_wx(adapter,
167 NETXEN_NIU_GB_MAC_CONFIG_0(0), 166 NETXEN_NIU_GB_MAC_CONFIG_0(0),
168 &mac_cfg0, 4)) 167 &mac_cfg0, 4))
169 return -EIO; 168 return -EIO;
@@ -201,7 +200,7 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg,
201 * cannot be in reset 200 * cannot be in reset
202 */ 201 */
203 202
204 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), 203 if (adapter->hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0),
205 &mac_cfg0, 4)) 204 &mac_cfg0, 4))
206 return -EIO; 205 return -EIO;
207 if (netxen_gb_get_soft_reset(mac_cfg0)) { 206 if (netxen_gb_get_soft_reset(mac_cfg0)) {
@@ -212,7 +211,7 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg,
212 netxen_gb_tx_reset_mac(temp); 211 netxen_gb_tx_reset_mac(temp);
213 netxen_gb_rx_reset_mac(temp); 212 netxen_gb_rx_reset_mac(temp);
214 213
215 if (netxen_nic_hw_write_wx(adapter, 214 if (adapter->hw_write_wx(adapter,
216 NETXEN_NIU_GB_MAC_CONFIG_0(0), 215 NETXEN_NIU_GB_MAC_CONFIG_0(0),
217 &temp, 4)) 216 &temp, 4))
218 return -EIO; 217 return -EIO;
@@ -220,24 +219,24 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg,
220 } 219 }
221 220
222 command = 0; /* turn off any prior activity */ 221 command = 0; /* turn off any prior activity */
223 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), 222 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
224 &command, 4)) 223 &command, 4))
225 return -EIO; 224 return -EIO;
226 225
227 address = 0; 226 address = 0;
228 netxen_gb_mii_mgmt_reg_addr(address, reg); 227 netxen_gb_mii_mgmt_reg_addr(address, reg);
229 netxen_gb_mii_mgmt_phy_addr(address, phy); 228 netxen_gb_mii_mgmt_phy_addr(address, phy);
230 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0), 229 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0),
231 &address, 4)) 230 &address, 4))
232 return -EIO; 231 return -EIO;
233 232
234 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CTRL(0), 233 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CTRL(0),
235 &val, 4)) 234 &val, 4))
236 return -EIO; 235 return -EIO;
237 236
238 status = 0; 237 status = 0;
239 do { 238 do {
240 if (netxen_nic_hw_read_wx(adapter, 239 if (adapter->hw_read_wx(adapter,
241 NETXEN_NIU_GB_MII_MGMT_INDICATE(0), 240 NETXEN_NIU_GB_MII_MGMT_INDICATE(0),
242 &status, 4)) 241 &status, 4))
243 return -EIO; 242 return -EIO;
@@ -252,7 +251,7 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg,
252 251
253 /* restore the state of port 0 MAC in case we tampered with it */ 252 /* restore the state of port 0 MAC in case we tampered with it */
254 if (restore) 253 if (restore)
255 if (netxen_nic_hw_write_wx(adapter, 254 if (adapter->hw_write_wx(adapter,
256 NETXEN_NIU_GB_MAC_CONFIG_0(0), 255 NETXEN_NIU_GB_MAC_CONFIG_0(0),
257 &mac_cfg0, 4)) 256 &mac_cfg0, 4))
258 return -EIO; 257 return -EIO;
@@ -401,14 +400,16 @@ int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port)
401{ 400{
402 int result = 0; 401 int result = 0;
403 __u32 status; 402 __u32 status;
403
404 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
405 return 0;
406
404 if (adapter->disable_phy_interrupts) 407 if (adapter->disable_phy_interrupts)
405 adapter->disable_phy_interrupts(adapter); 408 adapter->disable_phy_interrupts(adapter);
406 mdelay(2); 409 mdelay(2);
407 410
408 if (0 == 411 if (0 == netxen_niu_gbe_phy_read(adapter,
409 netxen_niu_gbe_phy_read(adapter, 412 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, &status)) {
410 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
411 &status)) {
412 if (netxen_get_phy_link(status)) { 413 if (netxen_get_phy_link(status)) {
413 if (netxen_get_phy_speed(status) == 2) { 414 if (netxen_get_phy_speed(status) == 2) {
414 netxen_niu_gbe_set_gmii_mode(adapter, port, 1); 415 netxen_niu_gbe_set_gmii_mode(adapter, port, 1);
@@ -456,12 +457,12 @@ int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port)
456 457
457int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) 458int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port)
458{ 459{
459 u32 portnum = adapter->physical_port; 460 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
460 461 netxen_crb_writelit_adapter(adapter,
461 netxen_crb_writelit_adapter(adapter, 462 NETXEN_NIU_XGE_CONFIG_1+(0x10000*port), 0x1447);
462 NETXEN_NIU_XGE_CONFIG_1+(0x10000*portnum), 0x1447); 463 netxen_crb_writelit_adapter(adapter,
463 netxen_crb_writelit_adapter(adapter, 464 NETXEN_NIU_XGE_CONFIG_0+(0x10000*port), 0x5);
464 NETXEN_NIU_XGE_CONFIG_0+(0x10000*portnum), 0x5); 465 }
465 466
466 return 0; 467 return 0;
467} 468}
@@ -581,10 +582,10 @@ static int netxen_niu_macaddr_get(struct netxen_adapter *adapter,
581 if ((phy < 0) || (phy > 3)) 582 if ((phy < 0) || (phy > 3))
582 return -EINVAL; 583 return -EINVAL;
583 584
584 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_0(phy), 585 if (adapter->hw_read_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_0(phy),
585 &stationhigh, 4)) 586 &stationhigh, 4))
586 return -EIO; 587 return -EIO;
587 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_1(phy), 588 if (adapter->hw_read_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_1(phy),
588 &stationlow, 4)) 589 &stationlow, 4))
589 return -EIO; 590 return -EIO;
590 ((__le32 *)val)[1] = cpu_to_le32(stationhigh); 591 ((__le32 *)val)[1] = cpu_to_le32(stationhigh);
@@ -613,14 +614,14 @@ int netxen_niu_macaddr_set(struct netxen_adapter *adapter,
613 temp[0] = temp[1] = 0; 614 temp[0] = temp[1] = 0;
614 memcpy(temp + 2, addr, 2); 615 memcpy(temp + 2, addr, 2);
615 val = le32_to_cpu(*(__le32 *)temp); 616 val = le32_to_cpu(*(__le32 *)temp);
616 if (netxen_nic_hw_write_wx 617 if (adapter->hw_write_wx(adapter,
617 (adapter, NETXEN_NIU_GB_STATION_ADDR_1(phy), &val, 4)) 618 NETXEN_NIU_GB_STATION_ADDR_1(phy), &val, 4))
618 return -EIO; 619 return -EIO;
619 620
620 memcpy(temp, ((u8 *) addr) + 2, sizeof(__le32)); 621 memcpy(temp, ((u8 *) addr) + 2, sizeof(__le32));
621 val = le32_to_cpu(*(__le32 *)temp); 622 val = le32_to_cpu(*(__le32 *)temp);
622 if (netxen_nic_hw_write_wx 623 if (adapter->hw_write_wx(adapter,
623 (adapter, NETXEN_NIU_GB_STATION_ADDR_0(phy), &val, 4)) 624 NETXEN_NIU_GB_STATION_ADDR_0(phy), &val, 4))
624 return -2; 625 return -2;
625 626
626 netxen_niu_macaddr_get(adapter, 627 netxen_niu_macaddr_get(adapter,
@@ -654,7 +655,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
654 655
655 mac_cfg0 = 0; 656 mac_cfg0 = 0;
656 netxen_gb_soft_reset(mac_cfg0); 657 netxen_gb_soft_reset(mac_cfg0);
657 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 658 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
658 &mac_cfg0, 4)) 659 &mac_cfg0, 4))
659 return -EIO; 660 return -EIO;
660 mac_cfg0 = 0; 661 mac_cfg0 = 0;
@@ -666,7 +667,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
666 netxen_gb_tx_reset_mac(mac_cfg0); 667 netxen_gb_tx_reset_mac(mac_cfg0);
667 netxen_gb_rx_reset_mac(mac_cfg0); 668 netxen_gb_rx_reset_mac(mac_cfg0);
668 669
669 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 670 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
670 &mac_cfg0, 4)) 671 &mac_cfg0, 4))
671 return -EIO; 672 return -EIO;
672 mac_cfg1 = 0; 673 mac_cfg1 = 0;
@@ -679,7 +680,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
679 680
680 if (mode == NETXEN_NIU_10_100_MB) { 681 if (mode == NETXEN_NIU_10_100_MB) {
681 netxen_gb_set_intfmode(mac_cfg1, 1); 682 netxen_gb_set_intfmode(mac_cfg1, 1);
682 if (netxen_nic_hw_write_wx(adapter, 683 if (adapter->hw_write_wx(adapter,
683 NETXEN_NIU_GB_MAC_CONFIG_1(port), 684 NETXEN_NIU_GB_MAC_CONFIG_1(port),
684 &mac_cfg1, 4)) 685 &mac_cfg1, 4))
685 return -EIO; 686 return -EIO;
@@ -692,7 +693,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
692 693
693 } else if (mode == NETXEN_NIU_1000_MB) { 694 } else if (mode == NETXEN_NIU_1000_MB) {
694 netxen_gb_set_intfmode(mac_cfg1, 2); 695 netxen_gb_set_intfmode(mac_cfg1, 2);
695 if (netxen_nic_hw_write_wx(adapter, 696 if (adapter->hw_write_wx(adapter,
696 NETXEN_NIU_GB_MAC_CONFIG_1(port), 697 NETXEN_NIU_GB_MAC_CONFIG_1(port),
697 &mac_cfg1, 4)) 698 &mac_cfg1, 4))
698 return -EIO; 699 return -EIO;
@@ -704,7 +705,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
704 } 705 }
705 mii_cfg = 0; 706 mii_cfg = 0;
706 netxen_gb_set_mii_mgmt_clockselect(mii_cfg, 7); 707 netxen_gb_set_mii_mgmt_clockselect(mii_cfg, 7);
707 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(port), 708 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(port),
708 &mii_cfg, 4)) 709 &mii_cfg, 4))
709 return -EIO; 710 return -EIO;
710 mac_cfg0 = 0; 711 mac_cfg0 = 0;
@@ -713,7 +714,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
713 netxen_gb_unset_rx_flowctl(mac_cfg0); 714 netxen_gb_unset_rx_flowctl(mac_cfg0);
714 netxen_gb_unset_tx_flowctl(mac_cfg0); 715 netxen_gb_unset_tx_flowctl(mac_cfg0);
715 716
716 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 717 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
717 &mac_cfg0, 4)) 718 &mac_cfg0, 4))
718 return -EIO; 719 return -EIO;
719 return 0; 720 return 0;
@@ -730,7 +731,7 @@ int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter)
730 return -EINVAL; 731 return -EINVAL;
731 mac_cfg0 = 0; 732 mac_cfg0 = 0;
732 netxen_gb_soft_reset(mac_cfg0); 733 netxen_gb_soft_reset(mac_cfg0);
733 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 734 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
734 &mac_cfg0, 4)) 735 &mac_cfg0, 4))
735 return -EIO; 736 return -EIO;
736 return 0; 737 return 0;
@@ -746,7 +747,7 @@ int netxen_niu_disable_xg_port(struct netxen_adapter *adapter)
746 return -EINVAL; 747 return -EINVAL;
747 748
748 mac_cfg = 0; 749 mac_cfg = 0;
749 if (netxen_nic_hw_write_wx(adapter, 750 if (adapter->hw_write_wx(adapter,
750 NETXEN_NIU_XGE_CONFIG_0 + (0x10000 * port), &mac_cfg, 4)) 751 NETXEN_NIU_XGE_CONFIG_0 + (0x10000 * port), &mac_cfg, 4))
751 return -EIO; 752 return -EIO;
752 return 0; 753 return 0;
@@ -763,7 +764,7 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter,
763 return -EINVAL; 764 return -EINVAL;
764 765
765 /* save previous contents */ 766 /* save previous contents */
766 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_DROP_WRONGADDR, 767 if (adapter->hw_read_wx(adapter, NETXEN_NIU_GB_DROP_WRONGADDR,
767 &reg, 4)) 768 &reg, 4))
768 return -EIO; 769 return -EIO;
769 if (mode == NETXEN_NIU_PROMISC_MODE) { 770 if (mode == NETXEN_NIU_PROMISC_MODE) {
@@ -801,7 +802,7 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter,
801 return -EIO; 802 return -EIO;
802 } 803 }
803 } 804 }
804 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_DROP_WRONGADDR, 805 if (adapter->hw_write_wx(adapter, NETXEN_NIU_GB_DROP_WRONGADDR,
805 &reg, 4)) 806 &reg, 4))
806 return -EIO; 807 return -EIO;
807 return 0; 808 return 0;
@@ -826,13 +827,13 @@ int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter,
826 case 0: 827 case 0:
827 memcpy(temp + 2, addr, 2); 828 memcpy(temp + 2, addr, 2);
828 val = le32_to_cpu(*(__le32 *)temp); 829 val = le32_to_cpu(*(__le32 *)temp);
829 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_1, 830 if (adapter->hw_write_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_1,
830 &val, 4)) 831 &val, 4))
831 return -EIO; 832 return -EIO;
832 833
833 memcpy(&temp, ((u8 *) addr) + 2, sizeof(__le32)); 834 memcpy(&temp, ((u8 *) addr) + 2, sizeof(__le32));
834 val = le32_to_cpu(*(__le32 *)temp); 835 val = le32_to_cpu(*(__le32 *)temp);
835 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_HI, 836 if (adapter->hw_write_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_HI,
836 &val, 4)) 837 &val, 4))
837 return -EIO; 838 return -EIO;
838 break; 839 break;
@@ -840,13 +841,13 @@ int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter,
840 case 1: 841 case 1:
841 memcpy(temp + 2, addr, 2); 842 memcpy(temp + 2, addr, 2);
842 val = le32_to_cpu(*(__le32 *)temp); 843 val = le32_to_cpu(*(__le32 *)temp);
843 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XG1_STATION_ADDR_0_1, 844 if (adapter->hw_write_wx(adapter, NETXEN_NIU_XG1_STATION_ADDR_0_1,
844 &val, 4)) 845 &val, 4))
845 return -EIO; 846 return -EIO;
846 847
847 memcpy(&temp, ((u8 *) addr) + 2, sizeof(__le32)); 848 memcpy(&temp, ((u8 *) addr) + 2, sizeof(__le32));
848 val = le32_to_cpu(*(__le32 *)temp); 849 val = le32_to_cpu(*(__le32 *)temp);
849 if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XG1_STATION_ADDR_0_HI, 850 if (adapter->hw_write_wx(adapter, NETXEN_NIU_XG1_STATION_ADDR_0_HI,
850 &val, 4)) 851 &val, 4))
851 return -EIO; 852 return -EIO;
852 break; 853 break;
@@ -877,10 +878,10 @@ int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter,
877 if (phy != 0) 878 if (phy != 0)
878 return -EINVAL; 879 return -EINVAL;
879 880
880 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_HI, 881 if (adapter->hw_read_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_HI,
881 &stationhigh, 4)) 882 &stationhigh, 4))
882 return -EIO; 883 return -EIO;
883 if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_1, 884 if (adapter->hw_read_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_1,
884 &stationlow, 4)) 885 &stationlow, 4))
885 return -EIO; 886 return -EIO;
886 ((__le32 *)val)[1] = cpu_to_le32(stationhigh); 887 ((__le32 *)val)[1] = cpu_to_le32(stationhigh);
@@ -901,7 +902,7 @@ int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter,
901 if (port > NETXEN_NIU_MAX_XG_PORTS) 902 if (port > NETXEN_NIU_MAX_XG_PORTS)
902 return -EINVAL; 903 return -EINVAL;
903 904
904 if (netxen_nic_hw_read_wx(adapter, 905 if (adapter->hw_read_wx(adapter,
905 NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), &reg, 4)) 906 NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), &reg, 4))
906 return -EIO; 907 return -EIO;
907 if (mode == NETXEN_NIU_PROMISC_MODE) 908 if (mode == NETXEN_NIU_PROMISC_MODE)
@@ -909,6 +910,11 @@ int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter,
909 else 910 else
910 reg = (reg & ~0x2000UL); 911 reg = (reg & ~0x2000UL);
911 912
913 if (mode == NETXEN_NIU_ALLMULTI_MODE)
914 reg = (reg | 0x1000UL);
915 else
916 reg = (reg & ~0x1000UL);
917
912 netxen_crb_writelit_adapter(adapter, 918 netxen_crb_writelit_adapter(adapter,
913 NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), reg); 919 NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), reg);
914 920
diff --git a/drivers/net/netxen/netxen_nic_phan_reg.h b/drivers/net/netxen/netxen_nic_phan_reg.h
index a566b50f36f5..3bfa51b62a4f 100644
--- a/drivers/net/netxen/netxen_nic_phan_reg.h
+++ b/drivers/net/netxen/netxen_nic_phan_reg.h
@@ -42,8 +42,11 @@
42#define CRB_CMD_CONSUMER_OFFSET NETXEN_NIC_REG(0x0c) 42#define CRB_CMD_CONSUMER_OFFSET NETXEN_NIC_REG(0x0c)
43#define CRB_PAUSE_ADDR_LO NETXEN_NIC_REG(0x10) /* C0 EPG BUG */ 43#define CRB_PAUSE_ADDR_LO NETXEN_NIC_REG(0x10) /* C0 EPG BUG */
44#define CRB_PAUSE_ADDR_HI NETXEN_NIC_REG(0x14) 44#define CRB_PAUSE_ADDR_HI NETXEN_NIC_REG(0x14)
45#define CRB_HOST_CMD_ADDR_HI NETXEN_NIC_REG(0x18) /* host add:cmd ring */ 45#define NX_CDRP_CRB_OFFSET NETXEN_NIC_REG(0x18)
46#define CRB_HOST_CMD_ADDR_LO NETXEN_NIC_REG(0x1c) 46#define NX_ARG1_CRB_OFFSET NETXEN_NIC_REG(0x1c)
47#define NX_ARG2_CRB_OFFSET NETXEN_NIC_REG(0x20)
48#define NX_ARG3_CRB_OFFSET NETXEN_NIC_REG(0x24)
49#define NX_SIGN_CRB_OFFSET NETXEN_NIC_REG(0x28)
47#define CRB_CMD_INTR_LOOP NETXEN_NIC_REG(0x20) /* 4 regs for perf */ 50#define CRB_CMD_INTR_LOOP NETXEN_NIC_REG(0x20) /* 4 regs for perf */
48#define CRB_CMD_DMA_LOOP NETXEN_NIC_REG(0x24) 51#define CRB_CMD_DMA_LOOP NETXEN_NIC_REG(0x24)
49#define CRB_RCV_INTR_LOOP NETXEN_NIC_REG(0x28) 52#define CRB_RCV_INTR_LOOP NETXEN_NIC_REG(0x28)
@@ -73,8 +76,8 @@
73#define CRB_RX_LRO_MID_TIMER NETXEN_NIC_REG(0x88) 76#define CRB_RX_LRO_MID_TIMER NETXEN_NIC_REG(0x88)
74#define CRB_DMA_MAX_RCV_BUFS NETXEN_NIC_REG(0x8c) 77#define CRB_DMA_MAX_RCV_BUFS NETXEN_NIC_REG(0x8c)
75#define CRB_MAX_DMA_ENTRIES NETXEN_NIC_REG(0x90) 78#define CRB_MAX_DMA_ENTRIES NETXEN_NIC_REG(0x90)
76#define CRB_XG_STATE NETXEN_NIC_REG(0x94) /* XG Link status */ 79#define CRB_XG_STATE NETXEN_NIC_REG(0x94) /* XG Link status */
77#define CRB_AGENT_GO NETXEN_NIC_REG(0x98) /* NIC pkt gen agent */ 80#define CRB_XG_STATE_P3 NETXEN_NIC_REG(0x98) /* XG PF Link status */
78#define CRB_AGENT_TX_SIZE NETXEN_NIC_REG(0x9c) 81#define CRB_AGENT_TX_SIZE NETXEN_NIC_REG(0x9c)
79#define CRB_AGENT_TX_TYPE NETXEN_NIC_REG(0xa0) 82#define CRB_AGENT_TX_TYPE NETXEN_NIC_REG(0xa0)
80#define CRB_AGENT_TX_ADDR NETXEN_NIC_REG(0xa4) 83#define CRB_AGENT_TX_ADDR NETXEN_NIC_REG(0xa4)
@@ -97,7 +100,9 @@
97#define CRB_HOST_BUFFER_CONS NETXEN_NIC_REG(0xf0) 100#define CRB_HOST_BUFFER_CONS NETXEN_NIC_REG(0xf0)
98#define CRB_JUMBO_BUFFER_PROD NETXEN_NIC_REG(0xf4) 101#define CRB_JUMBO_BUFFER_PROD NETXEN_NIC_REG(0xf4)
99#define CRB_JUMBO_BUFFER_CONS NETXEN_NIC_REG(0xf8) 102#define CRB_JUMBO_BUFFER_CONS NETXEN_NIC_REG(0xf8)
103#define CRB_HOST_DUMMY_BUF NETXEN_NIC_REG(0xfc)
100 104
105#define CRB_RCVPEG_STATE NETXEN_NIC_REG(0x13c)
101#define CRB_CMD_PRODUCER_OFFSET_1 NETXEN_NIC_REG(0x1ac) 106#define CRB_CMD_PRODUCER_OFFSET_1 NETXEN_NIC_REG(0x1ac)
102#define CRB_CMD_CONSUMER_OFFSET_1 NETXEN_NIC_REG(0x1b0) 107#define CRB_CMD_CONSUMER_OFFSET_1 NETXEN_NIC_REG(0x1b0)
103#define CRB_CMD_PRODUCER_OFFSET_2 NETXEN_NIC_REG(0x1b8) 108#define CRB_CMD_PRODUCER_OFFSET_2 NETXEN_NIC_REG(0x1b8)
@@ -147,29 +152,15 @@
147#define nx_get_temp_state(x) ((x) & 0xffff) 152#define nx_get_temp_state(x) ((x) & 0xffff)
148#define nx_encode_temp(val, state) (((val) << 16) | (state)) 153#define nx_encode_temp(val, state) (((val) << 16) | (state))
149 154
150/* CRB registers per Rcv Descriptor ring */
151struct netxen_rcv_desc_crb {
152 u32 crb_rcv_producer_offset __attribute__ ((aligned(512)));
153 u32 crb_rcv_consumer_offset;
154 u32 crb_globalrcv_ring;
155 u32 crb_rcv_ring_size;
156};
157
158/* 155/*
159 * CRB registers used by the receive peg logic. 156 * CRB registers used by the receive peg logic.
160 */ 157 */
161 158
162struct netxen_recv_crb { 159struct netxen_recv_crb {
163 struct netxen_rcv_desc_crb rcv_desc_crb[NUM_RCV_DESC_RINGS]; 160 u32 crb_rcv_producer[NUM_RCV_DESC_RINGS];
164 u32 crb_rcvstatus_ring; 161 u32 crb_sts_consumer;
165 u32 crb_rcv_status_producer;
166 u32 crb_rcv_status_consumer;
167 u32 crb_rcvpeg_state;
168 u32 crb_status_ring_size;
169}; 162};
170 163
171extern struct netxen_recv_crb recv_crb_registers[];
172
173/* 164/*
174 * Temperature control. 165 * Temperature control.
175 */ 166 */
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 32a8503a7acd..4aa547947040 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -158,11 +158,10 @@ static int m88e1111_config_init(struct phy_device *phydev)
158{ 158{
159 int err; 159 int err;
160 int temp; 160 int temp;
161 int mode;
162 161
163 /* Enable Fiber/Copper auto selection */ 162 /* Enable Fiber/Copper auto selection */
164 temp = phy_read(phydev, MII_M1111_PHY_EXT_SR); 163 temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
165 temp |= MII_M1111_HWCFG_FIBER_COPPER_AUTO; 164 temp &= ~MII_M1111_HWCFG_FIBER_COPPER_AUTO;
166 phy_write(phydev, MII_M1111_PHY_EXT_SR, temp); 165 phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
167 166
168 temp = phy_read(phydev, MII_BMCR); 167 temp = phy_read(phydev, MII_BMCR);
@@ -198,9 +197,7 @@ static int m88e1111_config_init(struct phy_device *phydev)
198 197
199 temp &= ~(MII_M1111_HWCFG_MODE_MASK); 198 temp &= ~(MII_M1111_HWCFG_MODE_MASK);
200 199
201 mode = phy_read(phydev, MII_M1111_PHY_EXT_CR); 200 if (temp & MII_M1111_HWCFG_FIBER_COPPER_RES)
202
203 if (mode & MII_M1111_HWCFG_FIBER_COPPER_RES)
204 temp |= MII_M1111_HWCFG_MODE_FIBER_RGMII; 201 temp |= MII_M1111_HWCFG_MODE_FIBER_RGMII;
205 else 202 else
206 temp |= MII_M1111_HWCFG_MODE_COPPER_RGMII; 203 temp |= MII_M1111_HWCFG_MODE_COPPER_RGMII;
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c
index 6b1d7a8edf15..739b3ab7bccc 100644
--- a/drivers/net/ppp_generic.c
+++ b/drivers/net/ppp_generic.c
@@ -866,7 +866,8 @@ static int __init ppp_init(void)
866 err = PTR_ERR(ppp_class); 866 err = PTR_ERR(ppp_class);
867 goto out_chrdev; 867 goto out_chrdev;
868 } 868 }
869 device_create(ppp_class, NULL, MKDEV(PPP_MAJOR, 0), "ppp"); 869 device_create_drvdata(ppp_class, NULL, MKDEV(PPP_MAJOR, 0),
870 NULL, "ppp");
870 } 871 }
871 872
872out: 873out:
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
index 504a48ff73c8..6531ff565c54 100644
--- a/drivers/net/r6040.c
+++ b/drivers/net/r6040.c
@@ -50,8 +50,8 @@
50#include <asm/processor.h> 50#include <asm/processor.h>
51 51
52#define DRV_NAME "r6040" 52#define DRV_NAME "r6040"
53#define DRV_VERSION "0.16" 53#define DRV_VERSION "0.18"
54#define DRV_RELDATE "10Nov2007" 54#define DRV_RELDATE "13Jul2008"
55 55
56/* PHY CHIP Address */ 56/* PHY CHIP Address */
57#define PHY1_ADDR 1 /* For MAC1 */ 57#define PHY1_ADDR 1 /* For MAC1 */
@@ -91,6 +91,14 @@
91#define MISR 0x3C /* Status register */ 91#define MISR 0x3C /* Status register */
92#define MIER 0x40 /* INT enable register */ 92#define MIER 0x40 /* INT enable register */
93#define MSK_INT 0x0000 /* Mask off interrupts */ 93#define MSK_INT 0x0000 /* Mask off interrupts */
94#define RX_FINISH 0x0001 /* RX finished */
95#define RX_NO_DESC 0x0002 /* No RX descriptor available */
96#define RX_FIFO_FULL 0x0004 /* RX FIFO full */
97#define RX_EARLY 0x0008 /* RX early */
98#define TX_FINISH 0x0010 /* TX finished */
99#define TX_EARLY 0x0080 /* TX early */
100#define EVENT_OVRFL 0x0100 /* Event counter overflow */
101#define LINK_CHANGED 0x0200 /* PHY link changed */
94#define ME_CISR 0x44 /* Event counter INT status */ 102#define ME_CISR 0x44 /* Event counter INT status */
95#define ME_CIER 0x48 /* Event counter INT enable */ 103#define ME_CIER 0x48 /* Event counter INT enable */
96#define MR_CNT 0x50 /* Successfully received packet counter */ 104#define MR_CNT 0x50 /* Successfully received packet counter */
@@ -130,6 +138,21 @@
130#define MBCR_DEFAULT 0x012A /* MAC Bus Control Register */ 138#define MBCR_DEFAULT 0x012A /* MAC Bus Control Register */
131#define MCAST_MAX 4 /* Max number multicast addresses to filter */ 139#define MCAST_MAX 4 /* Max number multicast addresses to filter */
132 140
141/* Descriptor status */
142#define DSC_OWNER_MAC 0x8000 /* MAC is the owner of this descriptor */
143#define DSC_RX_OK 0x4000 /* RX was successful */
144#define DSC_RX_ERR 0x0800 /* RX PHY error */
145#define DSC_RX_ERR_DRI 0x0400 /* RX dribble packet */
146#define DSC_RX_ERR_BUF 0x0200 /* RX length exceeds buffer size */
147#define DSC_RX_ERR_LONG 0x0100 /* RX length > maximum packet length */
148#define DSC_RX_ERR_RUNT 0x0080 /* RX packet length < 64 byte */
149#define DSC_RX_ERR_CRC 0x0040 /* RX CRC error */
150#define DSC_RX_BCAST 0x0020 /* RX broadcast (no error) */
151#define DSC_RX_MCAST 0x0010 /* RX multicast (no error) */
152#define DSC_RX_MCH_HIT 0x0008 /* RX multicast hit in hash table (no error) */
153#define DSC_RX_MIDH_HIT 0x0004 /* RX MID table hit (no error) */
154#define DSC_RX_IDX_MID_MASK 3 /* RX mask for the index of matched MIDx */
155
133/* PHY settings */ 156/* PHY settings */
134#define ICPLUS_PHY_ID 0x0243 157#define ICPLUS_PHY_ID 0x0243
135 158
@@ -139,10 +162,10 @@ MODULE_AUTHOR("Sten Wang <sten.wang@rdc.com.tw>,"
139MODULE_LICENSE("GPL"); 162MODULE_LICENSE("GPL");
140MODULE_DESCRIPTION("RDC R6040 NAPI PCI FastEthernet driver"); 163MODULE_DESCRIPTION("RDC R6040 NAPI PCI FastEthernet driver");
141 164
142#define RX_INT 0x0001 165/* RX and TX interrupts that we handle */
143#define TX_INT 0x0010 166#define RX_INTS (RX_FIFO_FULL | RX_NO_DESC | RX_FINISH)
144#define RX_NO_DESC_INT 0x0002 167#define TX_INTS (TX_FINISH)
145#define INT_MASK (RX_INT | TX_INT) 168#define INT_MASK (RX_INTS | TX_INTS)
146 169
147struct r6040_descriptor { 170struct r6040_descriptor {
148 u16 status, len; /* 0-3 */ 171 u16 status, len; /* 0-3 */
@@ -167,7 +190,7 @@ struct r6040_private {
167 struct r6040_descriptor *tx_ring; 190 struct r6040_descriptor *tx_ring;
168 dma_addr_t rx_ring_dma; 191 dma_addr_t rx_ring_dma;
169 dma_addr_t tx_ring_dma; 192 dma_addr_t tx_ring_dma;
170 u16 tx_free_desc, rx_free_desc, phy_addr, phy_mode; 193 u16 tx_free_desc, phy_addr, phy_mode;
171 u16 mcr0, mcr1; 194 u16 mcr0, mcr1;
172 u16 switch_sig; 195 u16 switch_sig;
173 struct net_device *dev; 196 struct net_device *dev;
@@ -183,7 +206,7 @@ static char version[] __devinitdata = KERN_INFO DRV_NAME
183static int phy_table[] = { PHY1_ADDR, PHY2_ADDR }; 206static int phy_table[] = { PHY1_ADDR, PHY2_ADDR };
184 207
185/* Read a word data from PHY Chip */ 208/* Read a word data from PHY Chip */
186static int phy_read(void __iomem *ioaddr, int phy_addr, int reg) 209static int r6040_phy_read(void __iomem *ioaddr, int phy_addr, int reg)
187{ 210{
188 int limit = 2048; 211 int limit = 2048;
189 u16 cmd; 212 u16 cmd;
@@ -200,7 +223,7 @@ static int phy_read(void __iomem *ioaddr, int phy_addr, int reg)
200} 223}
201 224
202/* Write a word data from PHY Chip */ 225/* Write a word data from PHY Chip */
203static void phy_write(void __iomem *ioaddr, int phy_addr, int reg, u16 val) 226static void r6040_phy_write(void __iomem *ioaddr, int phy_addr, int reg, u16 val)
204{ 227{
205 int limit = 2048; 228 int limit = 2048;
206 u16 cmd; 229 u16 cmd;
@@ -216,20 +239,20 @@ static void phy_write(void __iomem *ioaddr, int phy_addr, int reg, u16 val)
216 } 239 }
217} 240}
218 241
219static int mdio_read(struct net_device *dev, int mii_id, int reg) 242static int r6040_mdio_read(struct net_device *dev, int mii_id, int reg)
220{ 243{
221 struct r6040_private *lp = netdev_priv(dev); 244 struct r6040_private *lp = netdev_priv(dev);
222 void __iomem *ioaddr = lp->base; 245 void __iomem *ioaddr = lp->base;
223 246
224 return (phy_read(ioaddr, lp->phy_addr, reg)); 247 return (r6040_phy_read(ioaddr, lp->phy_addr, reg));
225} 248}
226 249
227static void mdio_write(struct net_device *dev, int mii_id, int reg, int val) 250static void r6040_mdio_write(struct net_device *dev, int mii_id, int reg, int val)
228{ 251{
229 struct r6040_private *lp = netdev_priv(dev); 252 struct r6040_private *lp = netdev_priv(dev);
230 void __iomem *ioaddr = lp->base; 253 void __iomem *ioaddr = lp->base;
231 254
232 phy_write(ioaddr, lp->phy_addr, reg, val); 255 r6040_phy_write(ioaddr, lp->phy_addr, reg, val);
233} 256}
234 257
235static void r6040_free_txbufs(struct net_device *dev) 258static void r6040_free_txbufs(struct net_device *dev)
@@ -283,58 +306,101 @@ static void r6040_init_ring_desc(struct r6040_descriptor *desc_ring,
283 desc->vndescp = desc_ring; 306 desc->vndescp = desc_ring;
284} 307}
285 308
286/* Allocate skb buffer for rx descriptor */ 309static void r6040_init_txbufs(struct net_device *dev)
287static void rx_buf_alloc(struct r6040_private *lp, struct net_device *dev)
288{ 310{
289 struct r6040_descriptor *descptr; 311 struct r6040_private *lp = netdev_priv(dev);
290 void __iomem *ioaddr = lp->base;
291 312
292 descptr = lp->rx_insert_ptr; 313 lp->tx_free_desc = TX_DCNT;
293 while (lp->rx_free_desc < RX_DCNT) {
294 descptr->skb_ptr = netdev_alloc_skb(dev, MAX_BUF_SIZE);
295 314
296 if (!descptr->skb_ptr) 315 lp->tx_remove_ptr = lp->tx_insert_ptr = lp->tx_ring;
297 break; 316 r6040_init_ring_desc(lp->tx_ring, lp->tx_ring_dma, TX_DCNT);
298 descptr->buf = cpu_to_le32(pci_map_single(lp->pdev,
299 descptr->skb_ptr->data,
300 MAX_BUF_SIZE, PCI_DMA_FROMDEVICE));
301 descptr->status = 0x8000;
302 descptr = descptr->vndescp;
303 lp->rx_free_desc++;
304 /* Trigger RX DMA */
305 iowrite16(lp->mcr0 | 0x0002, ioaddr);
306 }
307 lp->rx_insert_ptr = descptr;
308} 317}
309 318
310static void r6040_alloc_txbufs(struct net_device *dev) 319static int r6040_alloc_rxbufs(struct net_device *dev)
311{ 320{
312 struct r6040_private *lp = netdev_priv(dev); 321 struct r6040_private *lp = netdev_priv(dev);
313 void __iomem *ioaddr = lp->base; 322 struct r6040_descriptor *desc;
323 struct sk_buff *skb;
324 int rc;
314 325
315 lp->tx_free_desc = TX_DCNT; 326 lp->rx_remove_ptr = lp->rx_insert_ptr = lp->rx_ring;
327 r6040_init_ring_desc(lp->rx_ring, lp->rx_ring_dma, RX_DCNT);
316 328
317 lp->tx_remove_ptr = lp->tx_insert_ptr = lp->tx_ring; 329 /* Allocate skbs for the rx descriptors */
318 r6040_init_ring_desc(lp->tx_ring, lp->tx_ring_dma, TX_DCNT); 330 desc = lp->rx_ring;
331 do {
332 skb = netdev_alloc_skb(dev, MAX_BUF_SIZE);
333 if (!skb) {
334 printk(KERN_ERR "%s: failed to alloc skb for rx\n", dev->name);
335 rc = -ENOMEM;
336 goto err_exit;
337 }
338 desc->skb_ptr = skb;
339 desc->buf = cpu_to_le32(pci_map_single(lp->pdev,
340 desc->skb_ptr->data,
341 MAX_BUF_SIZE, PCI_DMA_FROMDEVICE));
342 desc->status = DSC_OWNER_MAC;
343 desc = desc->vndescp;
344 } while (desc != lp->rx_ring);
319 345
320 iowrite16(lp->tx_ring_dma, ioaddr + MTD_SA0); 346 return 0;
321 iowrite16(lp->tx_ring_dma >> 16, ioaddr + MTD_SA1); 347
348err_exit:
349 /* Deallocate all previously allocated skbs */
350 r6040_free_rxbufs(dev);
351 return rc;
322} 352}
323 353
324static void r6040_alloc_rxbufs(struct net_device *dev) 354static void r6040_init_mac_regs(struct net_device *dev)
325{ 355{
326 struct r6040_private *lp = netdev_priv(dev); 356 struct r6040_private *lp = netdev_priv(dev);
327 void __iomem *ioaddr = lp->base; 357 void __iomem *ioaddr = lp->base;
358 int limit = 2048;
359 u16 cmd;
328 360
329 lp->rx_free_desc = 0; 361 /* Mask Off Interrupt */
362 iowrite16(MSK_INT, ioaddr + MIER);
330 363
331 lp->rx_remove_ptr = lp->rx_insert_ptr = lp->rx_ring; 364 /* Reset RDC MAC */
332 r6040_init_ring_desc(lp->rx_ring, lp->rx_ring_dma, RX_DCNT); 365 iowrite16(MAC_RST, ioaddr + MCR1);
366 while (limit--) {
367 cmd = ioread16(ioaddr + MCR1);
368 if (cmd & 0x1)
369 break;
370 }
371 /* Reset internal state machine */
372 iowrite16(2, ioaddr + MAC_SM);
373 iowrite16(0, ioaddr + MAC_SM);
374 udelay(5000);
333 375
334 rx_buf_alloc(lp, dev); 376 /* MAC Bus Control Register */
377 iowrite16(MBCR_DEFAULT, ioaddr + MBCR);
378
379 /* Buffer Size Register */
380 iowrite16(MAX_BUF_SIZE, ioaddr + MR_BSR);
381
382 /* Write TX ring start address */
383 iowrite16(lp->tx_ring_dma, ioaddr + MTD_SA0);
384 iowrite16(lp->tx_ring_dma >> 16, ioaddr + MTD_SA1);
335 385
386 /* Write RX ring start address */
336 iowrite16(lp->rx_ring_dma, ioaddr + MRD_SA0); 387 iowrite16(lp->rx_ring_dma, ioaddr + MRD_SA0);
337 iowrite16(lp->rx_ring_dma >> 16, ioaddr + MRD_SA1); 388 iowrite16(lp->rx_ring_dma >> 16, ioaddr + MRD_SA1);
389
390 /* Set interrupt waiting time and packet numbers */
391 iowrite16(0, ioaddr + MT_ICR);
392 iowrite16(0, ioaddr + MR_ICR);
393
394 /* Enable interrupts */
395 iowrite16(INT_MASK, ioaddr + MIER);
396
397 /* Enable TX and RX */
398 iowrite16(lp->mcr0 | 0x0002, ioaddr);
399
400 /* Let TX poll the descriptors
401 * we may got called by r6040_tx_timeout which has left
402 * some unsent tx buffers */
403 iowrite16(0x01, ioaddr + MTPR);
338} 404}
339 405
340static void r6040_tx_timeout(struct net_device *dev) 406static void r6040_tx_timeout(struct net_device *dev)
@@ -342,27 +408,16 @@ static void r6040_tx_timeout(struct net_device *dev)
342 struct r6040_private *priv = netdev_priv(dev); 408 struct r6040_private *priv = netdev_priv(dev);
343 void __iomem *ioaddr = priv->base; 409 void __iomem *ioaddr = priv->base;
344 410
345 printk(KERN_WARNING "%s: transmit timed out, status %4.4x, PHY status " 411 printk(KERN_WARNING "%s: transmit timed out, int enable %4.4x "
346 "%4.4x\n", 412 "status %4.4x, PHY status %4.4x\n",
347 dev->name, ioread16(ioaddr + MIER), 413 dev->name, ioread16(ioaddr + MIER),
348 mdio_read(dev, priv->mii_if.phy_id, MII_BMSR)); 414 ioread16(ioaddr + MISR),
349 415 r6040_mdio_read(dev, priv->mii_if.phy_id, MII_BMSR));
350 disable_irq(dev->irq);
351 napi_disable(&priv->napi);
352 spin_lock(&priv->lock);
353 /* Clear all descriptors */
354 r6040_free_txbufs(dev);
355 r6040_free_rxbufs(dev);
356 r6040_alloc_txbufs(dev);
357 r6040_alloc_rxbufs(dev);
358
359 /* Reset MAC */
360 iowrite16(MAC_RST, ioaddr + MCR1);
361 spin_unlock(&priv->lock);
362 enable_irq(dev->irq);
363 416
364 dev->stats.tx_errors++; 417 dev->stats.tx_errors++;
365 netif_wake_queue(dev); 418
419 /* Reset MAC and re-init all registers */
420 r6040_init_mac_regs(dev);
366} 421}
367 422
368static struct net_device_stats *r6040_get_stats(struct net_device *dev) 423static struct net_device_stats *r6040_get_stats(struct net_device *dev)
@@ -424,6 +479,7 @@ static int r6040_close(struct net_device *dev)
424 del_timer_sync(&lp->timer); 479 del_timer_sync(&lp->timer);
425 480
426 spin_lock_irq(&lp->lock); 481 spin_lock_irq(&lp->lock);
482 napi_disable(&lp->napi);
427 netif_stop_queue(dev); 483 netif_stop_queue(dev);
428 r6040_down(dev); 484 r6040_down(dev);
429 spin_unlock_irq(&lp->lock); 485 spin_unlock_irq(&lp->lock);
@@ -432,23 +488,23 @@ static int r6040_close(struct net_device *dev)
432} 488}
433 489
434/* Status of PHY CHIP */ 490/* Status of PHY CHIP */
435static int phy_mode_chk(struct net_device *dev) 491static int r6040_phy_mode_chk(struct net_device *dev)
436{ 492{
437 struct r6040_private *lp = netdev_priv(dev); 493 struct r6040_private *lp = netdev_priv(dev);
438 void __iomem *ioaddr = lp->base; 494 void __iomem *ioaddr = lp->base;
439 int phy_dat; 495 int phy_dat;
440 496
441 /* PHY Link Status Check */ 497 /* PHY Link Status Check */
442 phy_dat = phy_read(ioaddr, lp->phy_addr, 1); 498 phy_dat = r6040_phy_read(ioaddr, lp->phy_addr, 1);
443 if (!(phy_dat & 0x4)) 499 if (!(phy_dat & 0x4))
444 phy_dat = 0x8000; /* Link Failed, full duplex */ 500 phy_dat = 0x8000; /* Link Failed, full duplex */
445 501
446 /* PHY Chip Auto-Negotiation Status */ 502 /* PHY Chip Auto-Negotiation Status */
447 phy_dat = phy_read(ioaddr, lp->phy_addr, 1); 503 phy_dat = r6040_phy_read(ioaddr, lp->phy_addr, 1);
448 if (phy_dat & 0x0020) { 504 if (phy_dat & 0x0020) {
449 /* Auto Negotiation Mode */ 505 /* Auto Negotiation Mode */
450 phy_dat = phy_read(ioaddr, lp->phy_addr, 5); 506 phy_dat = r6040_phy_read(ioaddr, lp->phy_addr, 5);
451 phy_dat &= phy_read(ioaddr, lp->phy_addr, 4); 507 phy_dat &= r6040_phy_read(ioaddr, lp->phy_addr, 4);
452 if (phy_dat & 0x140) 508 if (phy_dat & 0x140)
453 /* Force full duplex */ 509 /* Force full duplex */
454 phy_dat = 0x8000; 510 phy_dat = 0x8000;
@@ -456,7 +512,7 @@ static int phy_mode_chk(struct net_device *dev)
456 phy_dat = 0; 512 phy_dat = 0;
457 } else { 513 } else {
458 /* Force Mode */ 514 /* Force Mode */
459 phy_dat = phy_read(ioaddr, lp->phy_addr, 0); 515 phy_dat = r6040_phy_read(ioaddr, lp->phy_addr, 0);
460 if (phy_dat & 0x100) 516 if (phy_dat & 0x100)
461 phy_dat = 0x8000; 517 phy_dat = 0x8000;
462 else 518 else
@@ -468,12 +524,12 @@ static int phy_mode_chk(struct net_device *dev)
468 524
469static void r6040_set_carrier(struct mii_if_info *mii) 525static void r6040_set_carrier(struct mii_if_info *mii)
470{ 526{
471 if (phy_mode_chk(mii->dev)) { 527 if (r6040_phy_mode_chk(mii->dev)) {
472 /* autoneg is off: Link is always assumed to be up */ 528 /* autoneg is off: Link is always assumed to be up */
473 if (!netif_carrier_ok(mii->dev)) 529 if (!netif_carrier_ok(mii->dev))
474 netif_carrier_on(mii->dev); 530 netif_carrier_on(mii->dev);
475 } else 531 } else
476 phy_mode_chk(mii->dev); 532 r6040_phy_mode_chk(mii->dev);
477} 533}
478 534
479static int r6040_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 535static int r6040_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
@@ -494,73 +550,72 @@ static int r6040_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
494static int r6040_rx(struct net_device *dev, int limit) 550static int r6040_rx(struct net_device *dev, int limit)
495{ 551{
496 struct r6040_private *priv = netdev_priv(dev); 552 struct r6040_private *priv = netdev_priv(dev);
497 int count; 553 struct r6040_descriptor *descptr = priv->rx_remove_ptr;
498 void __iomem *ioaddr = priv->base; 554 struct sk_buff *skb_ptr, *new_skb;
555 int count = 0;
499 u16 err; 556 u16 err;
500 557
501 for (count = 0; count < limit; ++count) { 558 /* Limit not reached and the descriptor belongs to the CPU */
502 struct r6040_descriptor *descptr = priv->rx_remove_ptr; 559 while (count < limit && !(descptr->status & DSC_OWNER_MAC)) {
503 struct sk_buff *skb_ptr; 560 /* Read the descriptor status */
504 561 err = descptr->status;
505 /* Disable RX interrupt */ 562 /* Global error status set */
506 iowrite16(ioread16(ioaddr + MIER) & (~RX_INT), ioaddr + MIER); 563 if (err & DSC_RX_ERR) {
507 descptr = priv->rx_remove_ptr; 564 /* RX dribble */
508 565 if (err & DSC_RX_ERR_DRI)
509 /* Check for errors */ 566 dev->stats.rx_frame_errors++;
510 err = ioread16(ioaddr + MLSR); 567 /* Buffer lenght exceeded */
511 if (err & 0x0400) 568 if (err & DSC_RX_ERR_BUF)
512 dev->stats.rx_errors++; 569 dev->stats.rx_length_errors++;
513 /* RX FIFO over-run */ 570 /* Packet too long */
514 if (err & 0x8000) 571 if (err & DSC_RX_ERR_LONG)
515 dev->stats.rx_fifo_errors++; 572 dev->stats.rx_length_errors++;
516 /* RX descriptor unavailable */ 573 /* Packet < 64 bytes */
517 if (err & 0x0080) 574 if (err & DSC_RX_ERR_RUNT)
518 dev->stats.rx_frame_errors++; 575 dev->stats.rx_length_errors++;
519 /* Received packet with length over buffer lenght */ 576 /* CRC error */
520 if (err & 0x0020) 577 if (err & DSC_RX_ERR_CRC) {
521 dev->stats.rx_over_errors++; 578 spin_lock(&priv->lock);
522 /* Received packet with too long or short */ 579 dev->stats.rx_crc_errors++;
523 if (err & (0x0010 | 0x0008)) 580 spin_unlock(&priv->lock);
524 dev->stats.rx_length_errors++;
525 /* Received packet with CRC errors */
526 if (err & 0x0004) {
527 spin_lock(&priv->lock);
528 dev->stats.rx_crc_errors++;
529 spin_unlock(&priv->lock);
530 }
531
532 while (priv->rx_free_desc) {
533 /* No RX packet */
534 if (descptr->status & 0x8000)
535 break;
536 skb_ptr = descptr->skb_ptr;
537 if (!skb_ptr) {
538 printk(KERN_ERR "%s: Inconsistent RX"
539 "descriptor chain\n",
540 dev->name);
541 break;
542 } 581 }
543 descptr->skb_ptr = NULL; 582 goto next_descr;
544 skb_ptr->dev = priv->dev; 583 }
545 /* Do not count the CRC */ 584
546 skb_put(skb_ptr, descptr->len - 4); 585 /* Packet successfully received */
547 pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf), 586 new_skb = netdev_alloc_skb(dev, MAX_BUF_SIZE);
548 MAX_BUF_SIZE, PCI_DMA_FROMDEVICE); 587 if (!new_skb) {
549 skb_ptr->protocol = eth_type_trans(skb_ptr, priv->dev); 588 dev->stats.rx_dropped++;
550 /* Send to upper layer */ 589 goto next_descr;
551 netif_receive_skb(skb_ptr);
552 dev->last_rx = jiffies;
553 dev->stats.rx_packets++;
554 dev->stats.rx_bytes += descptr->len;
555 /* To next descriptor */
556 descptr = descptr->vndescp;
557 priv->rx_free_desc--;
558 } 590 }
559 priv->rx_remove_ptr = descptr; 591 skb_ptr = descptr->skb_ptr;
592 skb_ptr->dev = priv->dev;
593
594 /* Do not count the CRC */
595 skb_put(skb_ptr, descptr->len - 4);
596 pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf),
597 MAX_BUF_SIZE, PCI_DMA_FROMDEVICE);
598 skb_ptr->protocol = eth_type_trans(skb_ptr, priv->dev);
599
600 /* Send to upper layer */
601 netif_receive_skb(skb_ptr);
602 dev->last_rx = jiffies;
603 dev->stats.rx_packets++;
604 dev->stats.rx_bytes += descptr->len - 4;
605
606 /* put new skb into descriptor */
607 descptr->skb_ptr = new_skb;
608 descptr->buf = cpu_to_le32(pci_map_single(priv->pdev,
609 descptr->skb_ptr->data,
610 MAX_BUF_SIZE, PCI_DMA_FROMDEVICE));
611
612next_descr:
613 /* put the descriptor back to the MAC */
614 descptr->status = DSC_OWNER_MAC;
615 descptr = descptr->vndescp;
616 count++;
560 } 617 }
561 /* Allocate new RX buffer */ 618 priv->rx_remove_ptr = descptr;
562 if (priv->rx_free_desc < RX_DCNT)
563 rx_buf_alloc(priv, priv->dev);
564 619
565 return count; 620 return count;
566} 621}
@@ -584,7 +639,7 @@ static void r6040_tx(struct net_device *dev)
584 if (err & (0x2000 | 0x4000)) 639 if (err & (0x2000 | 0x4000))
585 dev->stats.tx_carrier_errors++; 640 dev->stats.tx_carrier_errors++;
586 641
587 if (descptr->status & 0x8000) 642 if (descptr->status & DSC_OWNER_MAC)
588 break; /* Not complete */ 643 break; /* Not complete */
589 skb_ptr = descptr->skb_ptr; 644 skb_ptr = descptr->skb_ptr;
590 pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf), 645 pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf),
@@ -616,7 +671,7 @@ static int r6040_poll(struct napi_struct *napi, int budget)
616 if (work_done < budget) { 671 if (work_done < budget) {
617 netif_rx_complete(dev, napi); 672 netif_rx_complete(dev, napi);
618 /* Enable RX interrupt */ 673 /* Enable RX interrupt */
619 iowrite16(ioread16(ioaddr + MIER) | RX_INT, ioaddr + MIER); 674 iowrite16(ioread16(ioaddr + MIER) | RX_INTS, ioaddr + MIER);
620 } 675 }
621 return work_done; 676 return work_done;
622} 677}
@@ -638,13 +693,22 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
638 return IRQ_NONE; 693 return IRQ_NONE;
639 694
640 /* RX interrupt request */ 695 /* RX interrupt request */
641 if (status & 0x01) { 696 if (status & RX_INTS) {
697 if (status & RX_NO_DESC) {
698 /* RX descriptor unavailable */
699 dev->stats.rx_dropped++;
700 dev->stats.rx_missed_errors++;
701 }
702 if (status & RX_FIFO_FULL)
703 dev->stats.rx_fifo_errors++;
704
705 /* Mask off RX interrupt */
706 iowrite16(ioread16(ioaddr + MIER) & ~RX_INTS, ioaddr + MIER);
642 netif_rx_schedule(dev, &lp->napi); 707 netif_rx_schedule(dev, &lp->napi);
643 iowrite16(TX_INT, ioaddr + MIER);
644 } 708 }
645 709
646 /* TX interrupt request */ 710 /* TX interrupt request */
647 if (status & 0x10) 711 if (status & TX_INTS)
648 r6040_tx(dev); 712 r6040_tx(dev);
649 713
650 return IRQ_HANDLED; 714 return IRQ_HANDLED;
@@ -660,52 +724,48 @@ static void r6040_poll_controller(struct net_device *dev)
660#endif 724#endif
661 725
662/* Init RDC MAC */ 726/* Init RDC MAC */
663static void r6040_up(struct net_device *dev) 727static int r6040_up(struct net_device *dev)
664{ 728{
665 struct r6040_private *lp = netdev_priv(dev); 729 struct r6040_private *lp = netdev_priv(dev);
666 void __iomem *ioaddr = lp->base; 730 void __iomem *ioaddr = lp->base;
731 int ret;
667 732
668 /* Initialise and alloc RX/TX buffers */ 733 /* Initialise and alloc RX/TX buffers */
669 r6040_alloc_txbufs(dev); 734 r6040_init_txbufs(dev);
670 r6040_alloc_rxbufs(dev); 735 ret = r6040_alloc_rxbufs(dev);
736 if (ret)
737 return ret;
671 738
672 /* Buffer Size Register */
673 iowrite16(MAX_BUF_SIZE, ioaddr + MR_BSR);
674 /* Read the PHY ID */ 739 /* Read the PHY ID */
675 lp->switch_sig = phy_read(ioaddr, 0, 2); 740 lp->switch_sig = r6040_phy_read(ioaddr, 0, 2);
676 741
677 if (lp->switch_sig == ICPLUS_PHY_ID) { 742 if (lp->switch_sig == ICPLUS_PHY_ID) {
678 phy_write(ioaddr, 29, 31, 0x175C); /* Enable registers */ 743 r6040_phy_write(ioaddr, 29, 31, 0x175C); /* Enable registers */
679 lp->phy_mode = 0x8000; 744 lp->phy_mode = 0x8000;
680 } else { 745 } else {
681 /* PHY Mode Check */ 746 /* PHY Mode Check */
682 phy_write(ioaddr, lp->phy_addr, 4, PHY_CAP); 747 r6040_phy_write(ioaddr, lp->phy_addr, 4, PHY_CAP);
683 phy_write(ioaddr, lp->phy_addr, 0, PHY_MODE); 748 r6040_phy_write(ioaddr, lp->phy_addr, 0, PHY_MODE);
684 749
685 if (PHY_MODE == 0x3100) 750 if (PHY_MODE == 0x3100)
686 lp->phy_mode = phy_mode_chk(dev); 751 lp->phy_mode = r6040_phy_mode_chk(dev);
687 else 752 else
688 lp->phy_mode = (PHY_MODE & 0x0100) ? 0x8000:0x0; 753 lp->phy_mode = (PHY_MODE & 0x0100) ? 0x8000:0x0;
689 } 754 }
690 /* MAC Bus Control Register */
691 iowrite16(MBCR_DEFAULT, ioaddr + MBCR);
692 755
693 /* MAC TX/RX Enable */ 756 /* Set duplex mode */
694 lp->mcr0 |= lp->phy_mode; 757 lp->mcr0 |= lp->phy_mode;
695 iowrite16(lp->mcr0, ioaddr);
696
697 /* set interrupt waiting time and packet numbers */
698 iowrite16(0x0F06, ioaddr + MT_ICR);
699 iowrite16(0x0F06, ioaddr + MR_ICR);
700 758
701 /* improve performance (by RDC guys) */ 759 /* improve performance (by RDC guys) */
702 phy_write(ioaddr, 30, 17, (phy_read(ioaddr, 30, 17) | 0x4000)); 760 r6040_phy_write(ioaddr, 30, 17, (r6040_phy_read(ioaddr, 30, 17) | 0x4000));
703 phy_write(ioaddr, 30, 17, ~((~phy_read(ioaddr, 30, 17)) | 0x2000)); 761 r6040_phy_write(ioaddr, 30, 17, ~((~r6040_phy_read(ioaddr, 30, 17)) | 0x2000));
704 phy_write(ioaddr, 0, 19, 0x0000); 762 r6040_phy_write(ioaddr, 0, 19, 0x0000);
705 phy_write(ioaddr, 0, 30, 0x01F0); 763 r6040_phy_write(ioaddr, 0, 30, 0x01F0);
706 764
707 /* Interrupt Mask Register */ 765 /* Initialize all MAC registers */
708 iowrite16(INT_MASK, ioaddr + MIER); 766 r6040_init_mac_regs(dev);
767
768 return 0;
709} 769}
710 770
711/* 771/*
@@ -721,7 +781,7 @@ static void r6040_timer(unsigned long data)
721 781
722 /* Polling PHY Chip Status */ 782 /* Polling PHY Chip Status */
723 if (PHY_MODE == 0x3100) 783 if (PHY_MODE == 0x3100)
724 phy_mode = phy_mode_chk(dev); 784 phy_mode = r6040_phy_mode_chk(dev);
725 else 785 else
726 phy_mode = (PHY_MODE & 0x0100) ? 0x8000:0x0; 786 phy_mode = (PHY_MODE & 0x0100) ? 0x8000:0x0;
727 787
@@ -784,7 +844,14 @@ static int r6040_open(struct net_device *dev)
784 return -ENOMEM; 844 return -ENOMEM;
785 } 845 }
786 846
787 r6040_up(dev); 847 ret = r6040_up(dev);
848 if (ret) {
849 pci_free_consistent(lp->pdev, TX_DESC_SIZE, lp->tx_ring,
850 lp->tx_ring_dma);
851 pci_free_consistent(lp->pdev, RX_DESC_SIZE, lp->rx_ring,
852 lp->rx_ring_dma);
853 return ret;
854 }
788 855
789 napi_enable(&lp->napi); 856 napi_enable(&lp->napi);
790 netif_start_queue(dev); 857 netif_start_queue(dev);
@@ -830,7 +897,7 @@ static int r6040_start_xmit(struct sk_buff *skb, struct net_device *dev)
830 descptr->skb_ptr = skb; 897 descptr->skb_ptr = skb;
831 descptr->buf = cpu_to_le32(pci_map_single(lp->pdev, 898 descptr->buf = cpu_to_le32(pci_map_single(lp->pdev,
832 skb->data, skb->len, PCI_DMA_TODEVICE)); 899 skb->data, skb->len, PCI_DMA_TODEVICE));
833 descptr->status = 0x8000; 900 descptr->status = DSC_OWNER_MAC;
834 /* Trigger the MAC to check the TX descriptor */ 901 /* Trigger the MAC to check the TX descriptor */
835 iowrite16(0x01, ioaddr + MTPR); 902 iowrite16(0x01, ioaddr + MTPR);
836 lp->tx_insert_ptr = descptr->vndescp; 903 lp->tx_insert_ptr = descptr->vndescp;
@@ -987,24 +1054,27 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
987 1054
988 err = pci_enable_device(pdev); 1055 err = pci_enable_device(pdev);
989 if (err) 1056 if (err)
990 return err; 1057 goto err_out;
991 1058
992 /* this should always be supported */ 1059 /* this should always be supported */
993 if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { 1060 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
1061 if (err) {
994 printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses" 1062 printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses"
995 "not supported by the card\n"); 1063 "not supported by the card\n");
996 return -ENODEV; 1064 goto err_out;
997 } 1065 }
998 if (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { 1066 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
1067 if (err) {
999 printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses" 1068 printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses"
1000 "not supported by the card\n"); 1069 "not supported by the card\n");
1001 return -ENODEV; 1070 goto err_out;
1002 } 1071 }
1003 1072
1004 /* IO Size check */ 1073 /* IO Size check */
1005 if (pci_resource_len(pdev, 0) < io_size) { 1074 if (pci_resource_len(pdev, 0) < io_size) {
1006 printk(KERN_ERR "Insufficient PCI resources, aborting\n"); 1075 printk(KERN_ERR DRV_NAME "Insufficient PCI resources, aborting\n");
1007 return -EIO; 1076 err = -EIO;
1077 goto err_out;
1008 } 1078 }
1009 1079
1010 pioaddr = pci_resource_start(pdev, 0); /* IO map base address */ 1080 pioaddr = pci_resource_start(pdev, 0); /* IO map base address */
@@ -1012,24 +1082,26 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
1012 1082
1013 dev = alloc_etherdev(sizeof(struct r6040_private)); 1083 dev = alloc_etherdev(sizeof(struct r6040_private));
1014 if (!dev) { 1084 if (!dev) {
1015 printk(KERN_ERR "Failed to allocate etherdev\n"); 1085 printk(KERN_ERR DRV_NAME "Failed to allocate etherdev\n");
1016 return -ENOMEM; 1086 err = -ENOMEM;
1087 goto err_out;
1017 } 1088 }
1018 SET_NETDEV_DEV(dev, &pdev->dev); 1089 SET_NETDEV_DEV(dev, &pdev->dev);
1019 lp = netdev_priv(dev); 1090 lp = netdev_priv(dev);
1020 lp->pdev = pdev;
1021 1091
1022 if (pci_request_regions(pdev, DRV_NAME)) { 1092 err = pci_request_regions(pdev, DRV_NAME);
1093
1094 if (err) {
1023 printk(KERN_ERR DRV_NAME ": Failed to request PCI regions\n"); 1095 printk(KERN_ERR DRV_NAME ": Failed to request PCI regions\n");
1024 err = -ENODEV; 1096 goto err_out_free_dev;
1025 goto err_out_disable;
1026 } 1097 }
1027 1098
1028 ioaddr = pci_iomap(pdev, bar, io_size); 1099 ioaddr = pci_iomap(pdev, bar, io_size);
1029 if (!ioaddr) { 1100 if (!ioaddr) {
1030 printk(KERN_ERR "ioremap failed for device %s\n", 1101 printk(KERN_ERR "ioremap failed for device %s\n",
1031 pci_name(pdev)); 1102 pci_name(pdev));
1032 return -EIO; 1103 err = -EIO;
1104 goto err_out_free_res;
1033 } 1105 }
1034 1106
1035 /* Init system & device */ 1107 /* Init system & device */
@@ -1049,6 +1121,7 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
1049 1121
1050 /* Link new device into r6040_root_dev */ 1122 /* Link new device into r6040_root_dev */
1051 lp->pdev = pdev; 1123 lp->pdev = pdev;
1124 lp->dev = dev;
1052 1125
1053 /* Init RDC private data */ 1126 /* Init RDC private data */
1054 lp->mcr0 = 0x1002; 1127 lp->mcr0 = 0x1002;
@@ -1070,8 +1143,8 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
1070#endif 1143#endif
1071 netif_napi_add(dev, &lp->napi, r6040_poll, 64); 1144 netif_napi_add(dev, &lp->napi, r6040_poll, 64);
1072 lp->mii_if.dev = dev; 1145 lp->mii_if.dev = dev;
1073 lp->mii_if.mdio_read = mdio_read; 1146 lp->mii_if.mdio_read = r6040_mdio_read;
1074 lp->mii_if.mdio_write = mdio_write; 1147 lp->mii_if.mdio_write = r6040_mdio_write;
1075 lp->mii_if.phy_id = lp->phy_addr; 1148 lp->mii_if.phy_id = lp->phy_addr;
1076 lp->mii_if.phy_id_mask = 0x1f; 1149 lp->mii_if.phy_id_mask = 0x1f;
1077 lp->mii_if.reg_num_mask = 0x1f; 1150 lp->mii_if.reg_num_mask = 0x1f;
@@ -1080,17 +1153,17 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
1080 err = register_netdev(dev); 1153 err = register_netdev(dev);
1081 if (err) { 1154 if (err) {
1082 printk(KERN_ERR DRV_NAME ": Failed to register net device\n"); 1155 printk(KERN_ERR DRV_NAME ": Failed to register net device\n");
1083 goto err_out_res; 1156 goto err_out_unmap;
1084 } 1157 }
1085 return 0; 1158 return 0;
1086 1159
1087err_out_res: 1160err_out_unmap:
1161 pci_iounmap(pdev, ioaddr);
1162err_out_free_res:
1088 pci_release_regions(pdev); 1163 pci_release_regions(pdev);
1089err_out_disable: 1164err_out_free_dev:
1090 pci_disable_device(pdev);
1091 pci_set_drvdata(pdev, NULL);
1092 free_netdev(dev); 1165 free_netdev(dev);
1093 1166err_out:
1094 return err; 1167 return err;
1095} 1168}
1096 1169
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index cfe8829ed31f..a3e3895e5032 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -1418,8 +1418,10 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
1418 1418
1419 rtl_hw_phy_config(dev); 1419 rtl_hw_phy_config(dev);
1420 1420
1421 dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n"); 1421 if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
1422 RTL_W8(0x82, 0x01); 1422 dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
1423 RTL_W8(0x82, 0x01);
1424 }
1423 1425
1424 pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40); 1426 pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
1425 1427
@@ -3032,13 +3034,7 @@ static void rtl_set_rx_mode(struct net_device *dev)
3032 tmp = rtl8169_rx_config | rx_mode | 3034 tmp = rtl8169_rx_config | rx_mode |
3033 (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask); 3035 (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
3034 3036
3035 if ((tp->mac_version == RTL_GIGA_MAC_VER_11) || 3037 if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
3036 (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
3037 (tp->mac_version == RTL_GIGA_MAC_VER_13) ||
3038 (tp->mac_version == RTL_GIGA_MAC_VER_14) ||
3039 (tp->mac_version == RTL_GIGA_MAC_VER_15) ||
3040 (tp->mac_version == RTL_GIGA_MAC_VER_16) ||
3041 (tp->mac_version == RTL_GIGA_MAC_VER_17)) {
3042 u32 data = mc_filter[0]; 3038 u32 data = mc_filter[0];
3043 3039
3044 mc_filter[0] = swab32(mc_filter[1]); 3040 mc_filter[0] = swab32(mc_filter[1]);
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
index 7b2015f9e469..45c72eebb3a7 100644
--- a/drivers/net/sfc/efx.c
+++ b/drivers/net/sfc/efx.c
@@ -19,6 +19,7 @@
19#include <linux/in.h> 19#include <linux/in.h>
20#include <linux/crc32.h> 20#include <linux/crc32.h>
21#include <linux/ethtool.h> 21#include <linux/ethtool.h>
22#include <linux/topology.h>
22#include "net_driver.h" 23#include "net_driver.h"
23#include "gmii.h" 24#include "gmii.h"
24#include "ethtool.h" 25#include "ethtool.h"
@@ -832,7 +833,23 @@ static void efx_probe_interrupts(struct efx_nic *efx)
832 if (efx->interrupt_mode == EFX_INT_MODE_MSIX) { 833 if (efx->interrupt_mode == EFX_INT_MODE_MSIX) {
833 BUG_ON(!pci_find_capability(efx->pci_dev, PCI_CAP_ID_MSIX)); 834 BUG_ON(!pci_find_capability(efx->pci_dev, PCI_CAP_ID_MSIX));
834 835
835 efx->rss_queues = rss_cpus ? rss_cpus : num_online_cpus(); 836 if (rss_cpus == 0) {
837 cpumask_t core_mask;
838 int cpu;
839
840 cpus_clear(core_mask);
841 efx->rss_queues = 0;
842 for_each_online_cpu(cpu) {
843 if (!cpu_isset(cpu, core_mask)) {
844 ++efx->rss_queues;
845 cpus_or(core_mask, core_mask,
846 topology_core_siblings(cpu));
847 }
848 }
849 } else {
850 efx->rss_queues = rss_cpus;
851 }
852
836 efx->rss_queues = min(efx->rss_queues, max_channel + 1); 853 efx->rss_queues = min(efx->rss_queues, max_channel + 1);
837 efx->rss_queues = min(efx->rss_queues, EFX_MAX_CHANNELS); 854 efx->rss_queues = min(efx->rss_queues, EFX_MAX_CHANNELS);
838 855
@@ -1762,7 +1779,7 @@ void efx_schedule_reset(struct efx_nic *efx, enum reset_type type)
1762 1779
1763 efx->reset_pending = method; 1780 efx->reset_pending = method;
1764 1781
1765 queue_work(efx->workqueue, &efx->reset_work); 1782 queue_work(efx->reset_workqueue, &efx->reset_work);
1766} 1783}
1767 1784
1768/************************************************************************** 1785/**************************************************************************
@@ -1907,14 +1924,28 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type,
1907 goto fail1; 1924 goto fail1;
1908 } 1925 }
1909 1926
1927 efx->reset_workqueue = create_singlethread_workqueue("sfc_reset");
1928 if (!efx->reset_workqueue) {
1929 rc = -ENOMEM;
1930 goto fail2;
1931 }
1932
1910 return 0; 1933 return 0;
1911 1934
1935 fail2:
1936 destroy_workqueue(efx->workqueue);
1937 efx->workqueue = NULL;
1938
1912 fail1: 1939 fail1:
1913 return rc; 1940 return rc;
1914} 1941}
1915 1942
1916static void efx_fini_struct(struct efx_nic *efx) 1943static void efx_fini_struct(struct efx_nic *efx)
1917{ 1944{
1945 if (efx->reset_workqueue) {
1946 destroy_workqueue(efx->reset_workqueue);
1947 efx->reset_workqueue = NULL;
1948 }
1918 if (efx->workqueue) { 1949 if (efx->workqueue) {
1919 destroy_workqueue(efx->workqueue); 1950 destroy_workqueue(efx->workqueue);
1920 efx->workqueue = NULL; 1951 efx->workqueue = NULL;
@@ -1977,7 +2008,7 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
1977 * scheduled from this point because efx_stop_all() has been 2008 * scheduled from this point because efx_stop_all() has been
1978 * called, we are no longer registered with driverlink, and 2009 * called, we are no longer registered with driverlink, and
1979 * the net_device's have been removed. */ 2010 * the net_device's have been removed. */
1980 flush_workqueue(efx->workqueue); 2011 flush_workqueue(efx->reset_workqueue);
1981 2012
1982 efx_pci_remove_main(efx); 2013 efx_pci_remove_main(efx);
1983 2014
@@ -2098,7 +2129,7 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
2098 * scheduled since efx_stop_all() has been called, and we 2129 * scheduled since efx_stop_all() has been called, and we
2099 * have not and never have been registered with either 2130 * have not and never have been registered with either
2100 * the rtnetlink or driverlink layers. */ 2131 * the rtnetlink or driverlink layers. */
2101 cancel_work_sync(&efx->reset_work); 2132 flush_workqueue(efx->reset_workqueue);
2102 2133
2103 /* Retry if a recoverably reset event has been scheduled */ 2134 /* Retry if a recoverably reset event has been scheduled */
2104 if ((efx->reset_pending != RESET_TYPE_INVISIBLE) && 2135 if ((efx->reset_pending != RESET_TYPE_INVISIBLE) &&
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c
index 630406e142e5..9138ee5b7b7b 100644
--- a/drivers/net/sfc/falcon.c
+++ b/drivers/net/sfc/falcon.c
@@ -223,13 +223,8 @@ static struct i2c_algo_bit_data falcon_i2c_bit_operations = {
223 .getsda = falcon_getsda, 223 .getsda = falcon_getsda,
224 .getscl = falcon_getscl, 224 .getscl = falcon_getscl,
225 .udelay = 5, 225 .udelay = 5,
226 /* 226 /* Wait up to 50 ms for slave to let us pull SCL high */
227 * This is the number of system clock ticks after which 227 .timeout = DIV_ROUND_UP(HZ, 20),
228 * i2c-algo-bit gives up waiting for SCL to become high.
229 * It must be at least 2 since the first tick can happen
230 * immediately after it starts waiting.
231 */
232 .timeout = 2,
233}; 228};
234 229
235/************************************************************************** 230/**************************************************************************
@@ -2479,12 +2474,11 @@ int falcon_probe_nic(struct efx_nic *efx)
2479 2474
2480 /* Initialise I2C adapter */ 2475 /* Initialise I2C adapter */
2481 efx->i2c_adap.owner = THIS_MODULE; 2476 efx->i2c_adap.owner = THIS_MODULE;
2482 efx->i2c_adap.class = I2C_CLASS_HWMON;
2483 nic_data->i2c_data = falcon_i2c_bit_operations; 2477 nic_data->i2c_data = falcon_i2c_bit_operations;
2484 nic_data->i2c_data.data = efx; 2478 nic_data->i2c_data.data = efx;
2485 efx->i2c_adap.algo_data = &nic_data->i2c_data; 2479 efx->i2c_adap.algo_data = &nic_data->i2c_data;
2486 efx->i2c_adap.dev.parent = &efx->pci_dev->dev; 2480 efx->i2c_adap.dev.parent = &efx->pci_dev->dev;
2487 strcpy(efx->i2c_adap.name, "SFC4000 GPIO"); 2481 strlcpy(efx->i2c_adap.name, "SFC4000 GPIO", sizeof(efx->i2c_adap.name));
2488 rc = i2c_bit_add_bus(&efx->i2c_adap); 2482 rc = i2c_bit_add_bus(&efx->i2c_adap);
2489 if (rc) 2483 if (rc)
2490 goto fail5; 2484 goto fail5;
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h
index d803b86c647c..219c74a772c3 100644
--- a/drivers/net/sfc/net_driver.h
+++ b/drivers/net/sfc/net_driver.h
@@ -616,7 +616,9 @@ union efx_multicast_hash {
616 * @pci_dev: The PCI device 616 * @pci_dev: The PCI device
617 * @type: Controller type attributes 617 * @type: Controller type attributes
618 * @legacy_irq: IRQ number 618 * @legacy_irq: IRQ number
619 * @workqueue: Workqueue for resets, port reconfigures and the HW monitor 619 * @workqueue: Workqueue for port reconfigures and the HW monitor.
620 * Work items do not hold and must not acquire RTNL.
621 * @reset_workqueue: Workqueue for resets. Work item will acquire RTNL.
620 * @reset_work: Scheduled reset workitem 622 * @reset_work: Scheduled reset workitem
621 * @monitor_work: Hardware monitor workitem 623 * @monitor_work: Hardware monitor workitem
622 * @membase_phys: Memory BAR value as physical address 624 * @membase_phys: Memory BAR value as physical address
@@ -684,6 +686,7 @@ struct efx_nic {
684 const struct efx_nic_type *type; 686 const struct efx_nic_type *type;
685 int legacy_irq; 687 int legacy_irq;
686 struct workqueue_struct *workqueue; 688 struct workqueue_struct *workqueue;
689 struct workqueue_struct *reset_workqueue;
687 struct work_struct reset_work; 690 struct work_struct reset_work;
688 struct delayed_work monitor_work; 691 struct delayed_work monitor_work;
689 resource_size_t membase_phys; 692 resource_size_t membase_phys;
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c
index a4bc812aa999..c69ba1395fa9 100644
--- a/drivers/net/sh_eth.c
+++ b/drivers/net/sh_eth.c
@@ -642,17 +642,12 @@ static void sh_eth_adjust_link(struct net_device *ndev)
642 | ECMR_DM, ioaddr + ECMR); 642 | ECMR_DM, ioaddr + ECMR);
643 new_state = 1; 643 new_state = 1;
644 mdp->link = phydev->link; 644 mdp->link = phydev->link;
645 netif_tx_schedule_all(ndev);
646 netif_carrier_on(ndev);
647 netif_start_queue(ndev);
648 } 645 }
649 } else if (mdp->link) { 646 } else if (mdp->link) {
650 new_state = 1; 647 new_state = 1;
651 mdp->link = PHY_DOWN; 648 mdp->link = PHY_DOWN;
652 mdp->speed = 0; 649 mdp->speed = 0;
653 mdp->duplex = -1; 650 mdp->duplex = -1;
654 netif_stop_queue(ndev);
655 netif_carrier_off(ndev);
656 } 651 }
657 652
658 if (new_state) 653 if (new_state)
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index 711e4a8948e0..5257cf464f1a 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -1829,9 +1829,6 @@ static int sky2_down(struct net_device *dev)
1829 if (netif_msg_ifdown(sky2)) 1829 if (netif_msg_ifdown(sky2))
1830 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 1830 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
1831 1831
1832 /* Stop more packets from being queued */
1833 netif_stop_queue(dev);
1834
1835 /* Disable port IRQ */ 1832 /* Disable port IRQ */
1836 imask = sky2_read32(hw, B0_IMSK); 1833 imask = sky2_read32(hw, B0_IMSK);
1837 imask &= ~portirq_msk[port]; 1834 imask &= ~portirq_msk[port];
@@ -1887,8 +1884,6 @@ static int sky2_down(struct net_device *dev)
1887 1884
1888 sky2_phy_power_down(hw, port); 1885 sky2_phy_power_down(hw, port);
1889 1886
1890 netif_carrier_off(dev);
1891
1892 /* turn off LED's */ 1887 /* turn off LED's */
1893 sky2_write16(hw, B0_Y2LED, LED_STAT_OFF); 1888 sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
1894 1889
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c
index f2051b209da2..2040965d7724 100644
--- a/drivers/net/smc91x.c
+++ b/drivers/net/smc91x.c
@@ -308,7 +308,7 @@ static void smc_reset(struct net_device *dev)
308 * can't handle it then there will be no recovery except for 308 * can't handle it then there will be no recovery except for
309 * a hard reset or power cycle 309 * a hard reset or power cycle
310 */ 310 */
311 if (nowait) 311 if (lp->cfg.flags & SMC91X_NOWAIT)
312 cfg |= CONFIG_NO_WAIT; 312 cfg |= CONFIG_NO_WAIT;
313 313
314 /* 314 /*
@@ -1939,8 +1939,11 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr,
1939 if (retval) 1939 if (retval)
1940 goto err_out; 1940 goto err_out;
1941 1941
1942#ifdef SMC_USE_PXA_DMA 1942#ifdef CONFIG_ARCH_PXA
1943 { 1943# ifdef SMC_USE_PXA_DMA
1944 lp->cfg.flags |= SMC91X_USE_DMA;
1945# endif
1946 if (lp->cfg.flags & SMC91X_USE_DMA) {
1944 int dma = pxa_request_dma(dev->name, DMA_PRIO_LOW, 1947 int dma = pxa_request_dma(dev->name, DMA_PRIO_LOW,
1945 smc_pxa_dma_irq, NULL); 1948 smc_pxa_dma_irq, NULL);
1946 if (dma >= 0) 1949 if (dma >= 0)
@@ -1980,7 +1983,7 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr,
1980 } 1983 }
1981 1984
1982err_out: 1985err_out:
1983#ifdef SMC_USE_PXA_DMA 1986#ifdef CONFIG_ARCH_PXA
1984 if (retval && dev->dma != (unsigned char)-1) 1987 if (retval && dev->dma != (unsigned char)-1)
1985 pxa_free_dma(dev->dma); 1988 pxa_free_dma(dev->dma);
1986#endif 1989#endif
@@ -2050,9 +2053,11 @@ static int smc_enable_device(struct platform_device *pdev)
2050 return 0; 2053 return 0;
2051} 2054}
2052 2055
2053static int smc_request_attrib(struct platform_device *pdev) 2056static int smc_request_attrib(struct platform_device *pdev,
2057 struct net_device *ndev)
2054{ 2058{
2055 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); 2059 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib");
2060 struct smc_local *lp = netdev_priv(ndev);
2056 2061
2057 if (!res) 2062 if (!res)
2058 return 0; 2063 return 0;
@@ -2063,9 +2068,11 @@ static int smc_request_attrib(struct platform_device *pdev)
2063 return 0; 2068 return 0;
2064} 2069}
2065 2070
2066static void smc_release_attrib(struct platform_device *pdev) 2071static void smc_release_attrib(struct platform_device *pdev,
2072 struct net_device *ndev)
2067{ 2073{
2068 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); 2074 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib");
2075 struct smc_local *lp = netdev_priv(ndev);
2069 2076
2070 if (res) 2077 if (res)
2071 release_mem_region(res->start, ATTRIB_SIZE); 2078 release_mem_region(res->start, ATTRIB_SIZE);
@@ -2123,27 +2130,14 @@ static int smc_drv_probe(struct platform_device *pdev)
2123 struct net_device *ndev; 2130 struct net_device *ndev;
2124 struct resource *res, *ires; 2131 struct resource *res, *ires;
2125 unsigned int __iomem *addr; 2132 unsigned int __iomem *addr;
2133 unsigned long irq_flags = SMC_IRQ_FLAGS;
2126 int ret; 2134 int ret;
2127 2135
2128 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs");
2129 if (!res)
2130 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2131 if (!res) {
2132 ret = -ENODEV;
2133 goto out;
2134 }
2135
2136
2137 if (!request_mem_region(res->start, SMC_IO_EXTENT, CARDNAME)) {
2138 ret = -EBUSY;
2139 goto out;
2140 }
2141
2142 ndev = alloc_etherdev(sizeof(struct smc_local)); 2136 ndev = alloc_etherdev(sizeof(struct smc_local));
2143 if (!ndev) { 2137 if (!ndev) {
2144 printk("%s: could not allocate device.\n", CARDNAME); 2138 printk("%s: could not allocate device.\n", CARDNAME);
2145 ret = -ENOMEM; 2139 ret = -ENOMEM;
2146 goto out_release_io; 2140 goto out;
2147 } 2141 }
2148 SET_NETDEV_DEV(ndev, &pdev->dev); 2142 SET_NETDEV_DEV(ndev, &pdev->dev);
2149 2143
@@ -2152,37 +2146,47 @@ static int smc_drv_probe(struct platform_device *pdev)
2152 */ 2146 */
2153 2147
2154 lp = netdev_priv(ndev); 2148 lp = netdev_priv(ndev);
2155 lp->cfg.irq_flags = SMC_IRQ_FLAGS;
2156 2149
2157#ifdef SMC_DYNAMIC_BUS_CONFIG 2150 if (pd) {
2158 if (pd)
2159 memcpy(&lp->cfg, pd, sizeof(lp->cfg)); 2151 memcpy(&lp->cfg, pd, sizeof(lp->cfg));
2160 else { 2152 lp->io_shift = SMC91X_IO_SHIFT(lp->cfg.flags);
2161 lp->cfg.flags = SMC91X_USE_8BIT; 2153 } else {
2162 lp->cfg.flags |= SMC91X_USE_16BIT; 2154 lp->cfg.flags |= (SMC_CAN_USE_8BIT) ? SMC91X_USE_8BIT : 0;
2163 lp->cfg.flags |= SMC91X_USE_32BIT; 2155 lp->cfg.flags |= (SMC_CAN_USE_16BIT) ? SMC91X_USE_16BIT : 0;
2156 lp->cfg.flags |= (SMC_CAN_USE_32BIT) ? SMC91X_USE_32BIT : 0;
2157 lp->cfg.flags |= (nowait) ? SMC91X_NOWAIT : 0;
2164 } 2158 }
2165 2159
2166 lp->cfg.flags &= ~(SMC_CAN_USE_8BIT ? 0 : SMC91X_USE_8BIT);
2167 lp->cfg.flags &= ~(SMC_CAN_USE_16BIT ? 0 : SMC91X_USE_16BIT);
2168 lp->cfg.flags &= ~(SMC_CAN_USE_32BIT ? 0 : SMC91X_USE_32BIT);
2169#endif
2170
2171 ndev->dma = (unsigned char)-1; 2160 ndev->dma = (unsigned char)-1;
2172 2161
2162 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs");
2163 if (!res)
2164 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2165 if (!res) {
2166 ret = -ENODEV;
2167 goto out_free_netdev;
2168 }
2169
2170
2171 if (!request_mem_region(res->start, SMC_IO_EXTENT, CARDNAME)) {
2172 ret = -EBUSY;
2173 goto out_free_netdev;
2174 }
2175
2173 ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 2176 ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
2174 if (!ires) { 2177 if (!ires) {
2175 ret = -ENODEV; 2178 ret = -ENODEV;
2176 goto out_free_netdev; 2179 goto out_release_io;
2177 } 2180 }
2178 2181
2179 ndev->irq = ires->start; 2182 ndev->irq = ires->start;
2180 if (SMC_IRQ_FLAGS == -1)
2181 lp->cfg.irq_flags = ires->flags & IRQF_TRIGGER_MASK;
2182 2183
2183 ret = smc_request_attrib(pdev); 2184 if (ires->flags & IRQF_TRIGGER_MASK)
2185 irq_flags = ires->flags & IRQF_TRIGGER_MASK;
2186
2187 ret = smc_request_attrib(pdev, ndev);
2184 if (ret) 2188 if (ret)
2185 goto out_free_netdev; 2189 goto out_release_io;
2186#if defined(CONFIG_SA1100_ASSABET) 2190#if defined(CONFIG_SA1100_ASSABET)
2187 NCR_0 |= NCR_ENET_OSC_EN; 2191 NCR_0 |= NCR_ENET_OSC_EN;
2188#endif 2192#endif
@@ -2197,7 +2201,7 @@ static int smc_drv_probe(struct platform_device *pdev)
2197 goto out_release_attrib; 2201 goto out_release_attrib;
2198 } 2202 }
2199 2203
2200#ifdef SMC_USE_PXA_DMA 2204#ifdef CONFIG_ARCH_PXA
2201 { 2205 {
2202 struct smc_local *lp = netdev_priv(ndev); 2206 struct smc_local *lp = netdev_priv(ndev);
2203 lp->device = &pdev->dev; 2207 lp->device = &pdev->dev;
@@ -2205,7 +2209,7 @@ static int smc_drv_probe(struct platform_device *pdev)
2205 } 2209 }
2206#endif 2210#endif
2207 2211
2208 ret = smc_probe(ndev, addr, lp->cfg.irq_flags); 2212 ret = smc_probe(ndev, addr, irq_flags);
2209 if (ret != 0) 2213 if (ret != 0)
2210 goto out_iounmap; 2214 goto out_iounmap;
2211 2215
@@ -2217,11 +2221,11 @@ static int smc_drv_probe(struct platform_device *pdev)
2217 platform_set_drvdata(pdev, NULL); 2221 platform_set_drvdata(pdev, NULL);
2218 iounmap(addr); 2222 iounmap(addr);
2219 out_release_attrib: 2223 out_release_attrib:
2220 smc_release_attrib(pdev); 2224 smc_release_attrib(pdev, ndev);
2221 out_free_netdev:
2222 free_netdev(ndev);
2223 out_release_io: 2225 out_release_io:
2224 release_mem_region(res->start, SMC_IO_EXTENT); 2226 release_mem_region(res->start, SMC_IO_EXTENT);
2227 out_free_netdev:
2228 free_netdev(ndev);
2225 out: 2229 out:
2226 printk("%s: not found (%d).\n", CARDNAME, ret); 2230 printk("%s: not found (%d).\n", CARDNAME, ret);
2227 2231
@@ -2240,14 +2244,14 @@ static int smc_drv_remove(struct platform_device *pdev)
2240 2244
2241 free_irq(ndev->irq, ndev); 2245 free_irq(ndev->irq, ndev);
2242 2246
2243#ifdef SMC_USE_PXA_DMA 2247#ifdef CONFIG_ARCH_PXA
2244 if (ndev->dma != (unsigned char)-1) 2248 if (ndev->dma != (unsigned char)-1)
2245 pxa_free_dma(ndev->dma); 2249 pxa_free_dma(ndev->dma);
2246#endif 2250#endif
2247 iounmap(lp->base); 2251 iounmap(lp->base);
2248 2252
2249 smc_release_datacs(pdev,ndev); 2253 smc_release_datacs(pdev,ndev);
2250 smc_release_attrib(pdev); 2254 smc_release_attrib(pdev,ndev);
2251 2255
2252 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs"); 2256 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs");
2253 if (!res) 2257 if (!res)
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h
index 8606818653f8..22209b6f1405 100644
--- a/drivers/net/smc91x.h
+++ b/drivers/net/smc91x.h
@@ -40,23 +40,46 @@
40 * Define your architecture specific bus configuration parameters here. 40 * Define your architecture specific bus configuration parameters here.
41 */ 41 */
42 42
43#if defined(CONFIG_ARCH_LUBBOCK) 43#if defined(CONFIG_ARCH_LUBBOCK) ||\
44 defined(CONFIG_MACH_MAINSTONE) ||\
45 defined(CONFIG_MACH_ZYLONITE) ||\
46 defined(CONFIG_MACH_LITTLETON)
44 47
45/* We can only do 16-bit reads and writes in the static memory space. */ 48#include <asm/mach-types.h>
46#define SMC_CAN_USE_8BIT 0 49
50/* Now the bus width is specified in the platform data
51 * pretend here to support all I/O access types
52 */
53#define SMC_CAN_USE_8BIT 1
47#define SMC_CAN_USE_16BIT 1 54#define SMC_CAN_USE_16BIT 1
48#define SMC_CAN_USE_32BIT 0 55#define SMC_CAN_USE_32BIT 1
49#define SMC_NOWAIT 1 56#define SMC_NOWAIT 1
50 57
51/* The first two address lines aren't connected... */ 58#define SMC_IO_SHIFT (lp->io_shift)
52#define SMC_IO_SHIFT 2
53 59
60#define SMC_inb(a, r) readb((a) + (r))
54#define SMC_inw(a, r) readw((a) + (r)) 61#define SMC_inw(a, r) readw((a) + (r))
55#define SMC_outw(v, a, r) writew(v, (a) + (r)) 62#define SMC_inl(a, r) readl((a) + (r))
63#define SMC_outb(v, a, r) writeb(v, (a) + (r))
64#define SMC_outl(v, a, r) writel(v, (a) + (r))
56#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) 65#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l)
57#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) 66#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l)
67#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l)
68#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l)
58#define SMC_IRQ_FLAGS (-1) /* from resource */ 69#define SMC_IRQ_FLAGS (-1) /* from resource */
59 70
71/* We actually can't write halfwords properly if not word aligned */
72static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg)
73{
74 if (machine_is_mainstone() && reg & 2) {
75 unsigned int v = val << 16;
76 v |= readl(ioaddr + (reg & ~2)) & 0xffff;
77 writel(v, ioaddr + (reg & ~2));
78 } else {
79 writew(val, ioaddr + reg);
80 }
81}
82
60#elif defined(CONFIG_BLACKFIN) 83#elif defined(CONFIG_BLACKFIN)
61 84
62#define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH 85#define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH
@@ -195,7 +218,6 @@
195#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) 218#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l)
196 219
197#elif defined(CONFIG_ARCH_INNOKOM) || \ 220#elif defined(CONFIG_ARCH_INNOKOM) || \
198 defined(CONFIG_MACH_MAINSTONE) || \
199 defined(CONFIG_ARCH_PXA_IDP) || \ 221 defined(CONFIG_ARCH_PXA_IDP) || \
200 defined(CONFIG_ARCH_RAMSES) || \ 222 defined(CONFIG_ARCH_RAMSES) || \
201 defined(CONFIG_ARCH_PCM027) 223 defined(CONFIG_ARCH_PCM027)
@@ -229,22 +251,6 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
229 } 251 }
230} 252}
231 253
232#elif defined(CONFIG_MACH_ZYLONITE)
233
234#define SMC_CAN_USE_8BIT 1
235#define SMC_CAN_USE_16BIT 1
236#define SMC_CAN_USE_32BIT 0
237#define SMC_IO_SHIFT 0
238#define SMC_NOWAIT 1
239#define SMC_USE_PXA_DMA 1
240#define SMC_inb(a, r) readb((a) + (r))
241#define SMC_inw(a, r) readw((a) + (r))
242#define SMC_insw(a, r, p, l) insw((a) + (r), p, l)
243#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l)
244#define SMC_outb(v, a, r) writeb(v, (a) + (r))
245#define SMC_outw(v, a, r) writew(v, (a) + (r))
246#define SMC_IRQ_FLAGS (-1) /* from resource */
247
248#elif defined(CONFIG_ARCH_OMAP) 254#elif defined(CONFIG_ARCH_OMAP)
249 255
250/* We can only do 16-bit reads and writes in the static memory space. */ 256/* We can only do 16-bit reads and writes in the static memory space. */
@@ -454,7 +460,6 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r,
454#define RPC_LSA_DEFAULT RPC_LED_100_10 460#define RPC_LSA_DEFAULT RPC_LED_100_10
455#define RPC_LSB_DEFAULT RPC_LED_TX_RX 461#define RPC_LSB_DEFAULT RPC_LED_TX_RX
456 462
457#define SMC_DYNAMIC_BUS_CONFIG
458#endif 463#endif
459 464
460 465
@@ -493,7 +498,7 @@ struct smc_local {
493 498
494 spinlock_t lock; 499 spinlock_t lock;
495 500
496#ifdef SMC_USE_PXA_DMA 501#ifdef CONFIG_ARCH_PXA
497 /* DMA needs the physical address of the chip */ 502 /* DMA needs the physical address of the chip */
498 u_long physaddr; 503 u_long physaddr;
499 struct device *device; 504 struct device *device;
@@ -501,20 +506,17 @@ struct smc_local {
501 void __iomem *base; 506 void __iomem *base;
502 void __iomem *datacs; 507 void __iomem *datacs;
503 508
509 /* the low address lines on some platforms aren't connected... */
510 int io_shift;
511
504 struct smc91x_platdata cfg; 512 struct smc91x_platdata cfg;
505}; 513};
506 514
507#ifdef SMC_DYNAMIC_BUS_CONFIG 515#define SMC_8BIT(p) ((p)->cfg.flags & SMC91X_USE_8BIT)
508#define SMC_8BIT(p) (((p)->cfg.flags & SMC91X_USE_8BIT) && SMC_CAN_USE_8BIT) 516#define SMC_16BIT(p) ((p)->cfg.flags & SMC91X_USE_16BIT)
509#define SMC_16BIT(p) (((p)->cfg.flags & SMC91X_USE_16BIT) && SMC_CAN_USE_16BIT) 517#define SMC_32BIT(p) ((p)->cfg.flags & SMC91X_USE_32BIT)
510#define SMC_32BIT(p) (((p)->cfg.flags & SMC91X_USE_32BIT) && SMC_CAN_USE_32BIT)
511#else
512#define SMC_8BIT(p) SMC_CAN_USE_8BIT
513#define SMC_16BIT(p) SMC_CAN_USE_16BIT
514#define SMC_32BIT(p) SMC_CAN_USE_32BIT
515#endif
516 518
517#ifdef SMC_USE_PXA_DMA 519#ifdef CONFIG_ARCH_PXA
518/* 520/*
519 * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is 521 * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is
520 * always happening in irq context so no need to worry about races. TX is 522 * always happening in irq context so no need to worry about races. TX is
@@ -608,7 +610,7 @@ smc_pxa_dma_irq(int dma, void *dummy)
608{ 610{
609 DCSR(dma) = 0; 611 DCSR(dma) = 0;
610} 612}
611#endif /* SMC_USE_PXA_DMA */ 613#endif /* CONFIG_ARCH_PXA */
612 614
613 615
614/* 616/*
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c
index 1aa425be3067..b79d5f018f79 100644
--- a/drivers/net/sunhme.c
+++ b/drivers/net/sunhme.c
@@ -2377,8 +2377,6 @@ static void happy_meal_set_multicast(struct net_device *dev)
2377 2377
2378 spin_lock_irq(&hp->happy_lock); 2378 spin_lock_irq(&hp->happy_lock);
2379 2379
2380 netif_stop_queue(dev);
2381
2382 if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) { 2380 if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) {
2383 hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff); 2381 hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff);
2384 hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff); 2382 hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff);
@@ -2410,8 +2408,6 @@ static void happy_meal_set_multicast(struct net_device *dev)
2410 hme_write32(hp, bregs + BMAC_HTABLE3, hash_table[3]); 2408 hme_write32(hp, bregs + BMAC_HTABLE3, hash_table[3]);
2411 } 2409 }
2412 2410
2413 netif_wake_queue(dev);
2414
2415 spin_unlock_irq(&hp->happy_lock); 2411 spin_unlock_irq(&hp->happy_lock);
2416} 2412}
2417 2413
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c
index 41d3ac45685f..a645e5028c14 100644
--- a/drivers/net/tc35815.c
+++ b/drivers/net/tc35815.c
@@ -672,7 +672,6 @@ static void tc_handle_link_change(struct net_device *dev)
672 if (dev->flags & IFF_PROMISC) 672 if (dev->flags & IFF_PROMISC)
673 tc35815_set_multicast_list(dev); 673 tc35815_set_multicast_list(dev);
674#endif 674#endif
675 netif_tx_schedule_all(dev);
676 } else { 675 } else {
677 lp->speed = 0; 676 lp->speed = 0;
678 lp->duplex = -1; 677 lp->duplex = -1;
diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c
index bc30c6e8fea2..617ef41bdfea 100644
--- a/drivers/net/tulip/de4x5.c
+++ b/drivers/net/tulip/de4x5.c
@@ -5514,22 +5514,6 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5514 netif_wake_queue(dev); /* Unlock the TX ring */ 5514 netif_wake_queue(dev); /* Unlock the TX ring */
5515 break; 5515 break;
5516 5516
5517 case DE4X5_SET_PROM: /* Set Promiscuous Mode */
5518 if (!capable(CAP_NET_ADMIN)) return -EPERM;
5519 omr = inl(DE4X5_OMR);
5520 omr |= OMR_PR;
5521 outl(omr, DE4X5_OMR);
5522 dev->flags |= IFF_PROMISC;
5523 break;
5524
5525 case DE4X5_CLR_PROM: /* Clear Promiscuous Mode */
5526 if (!capable(CAP_NET_ADMIN)) return -EPERM;
5527 omr = inl(DE4X5_OMR);
5528 omr &= ~OMR_PR;
5529 outl(omr, DE4X5_OMR);
5530 dev->flags &= ~IFF_PROMISC;
5531 break;
5532
5533 case DE4X5_SAY_BOO: /* Say "Boo!" to the kernel log file */ 5517 case DE4X5_SAY_BOO: /* Say "Boo!" to the kernel log file */
5534 if (!capable(CAP_NET_ADMIN)) return -EPERM; 5518 if (!capable(CAP_NET_ADMIN)) return -EPERM;
5535 printk("%s: Boo!\n", dev->name); 5519 printk("%s: Boo!\n", dev->name);
diff --git a/drivers/net/tulip/de4x5.h b/drivers/net/tulip/de4x5.h
index f5f33b3eb067..9f2877438fb0 100644
--- a/drivers/net/tulip/de4x5.h
+++ b/drivers/net/tulip/de4x5.h
@@ -1004,8 +1004,7 @@ struct de4x5_ioctl {
1004*/ 1004*/
1005#define DE4X5_GET_HWADDR 0x01 /* Get the hardware address */ 1005#define DE4X5_GET_HWADDR 0x01 /* Get the hardware address */
1006#define DE4X5_SET_HWADDR 0x02 /* Set the hardware address */ 1006#define DE4X5_SET_HWADDR 0x02 /* Set the hardware address */
1007#define DE4X5_SET_PROM 0x03 /* Set Promiscuous Mode */ 1007/* 0x03 and 0x04 were used before and are obsoleted now. Don't use them. */
1008#define DE4X5_CLR_PROM 0x04 /* Clear Promiscuous Mode */
1009#define DE4X5_SAY_BOO 0x05 /* Say "Boo!" to the kernel log file */ 1008#define DE4X5_SAY_BOO 0x05 /* Say "Boo!" to the kernel log file */
1010#define DE4X5_GET_MCA 0x06 /* Get a multicast address */ 1009#define DE4X5_GET_MCA 0x06 /* Get a multicast address */
1011#define DE4X5_SET_MCA 0x07 /* Set a multicast address */ 1010#define DE4X5_SET_MCA 0x07 /* Set a multicast address */
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index a82b32b40131..e6bbc639c2d0 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -900,7 +900,7 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
900 if ((tun->flags & TUN_TYPE_MASK) != TUN_TAP_DEV) 900 if ((tun->flags & TUN_TYPE_MASK) != TUN_TAP_DEV)
901 return -EINVAL; 901 return -EINVAL;
902 rtnl_lock(); 902 rtnl_lock();
903 ret = update_filter(&tun->txflt, (void *) __user arg); 903 ret = update_filter(&tun->txflt, (void __user *)arg);
904 rtnl_unlock(); 904 rtnl_unlock();
905 return ret; 905 return ret;
906 906
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c
index 756ba10b79d6..8f944e57fd55 100644
--- a/drivers/net/ucc_geth.c
+++ b/drivers/net/ucc_geth.c
@@ -1588,7 +1588,6 @@ static void adjust_link(struct net_device *dev)
1588 if (!ugeth->oldlink) { 1588 if (!ugeth->oldlink) {
1589 new_state = 1; 1589 new_state = 1;
1590 ugeth->oldlink = 1; 1590 ugeth->oldlink = 1;
1591 netif_tx_schedule_all(dev);
1592 } 1591 }
1593 } else if (ugeth->oldlink) { 1592 } else if (ugeth->oldlink) {
1594 new_state = 1; 1593 new_state = 1;
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index a934428a5890..0e061dfea78d 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -50,10 +50,18 @@ static int is_activesync(struct usb_interface_descriptor *desc)
50 && desc->bInterfaceProtocol == 1; 50 && desc->bInterfaceProtocol == 1;
51} 51}
52 52
53static int is_wireless_rndis(struct usb_interface_descriptor *desc)
54{
55 return desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER
56 && desc->bInterfaceSubClass == 1
57 && desc->bInterfaceProtocol == 3;
58}
59
53#else 60#else
54 61
55#define is_rndis(desc) 0 62#define is_rndis(desc) 0
56#define is_activesync(desc) 0 63#define is_activesync(desc) 0
64#define is_wireless_rndis(desc) 0
57 65
58#endif 66#endif
59 67
@@ -110,7 +118,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
110 * of cdc-acm, it'll fail RNDIS requests cleanly. 118 * of cdc-acm, it'll fail RNDIS requests cleanly.
111 */ 119 */
112 rndis = is_rndis(&intf->cur_altsetting->desc) 120 rndis = is_rndis(&intf->cur_altsetting->desc)
113 || is_activesync(&intf->cur_altsetting->desc); 121 || is_activesync(&intf->cur_altsetting->desc)
122 || is_wireless_rndis(&intf->cur_altsetting->desc);
114 123
115 memset(info, 0, sizeof *info); 124 memset(info, 0, sizeof *info);
116 info->control = intf; 125 info->control = intf;
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
index 61c98beb4d17..bcd858c567e0 100644
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
@@ -576,6 +576,10 @@ static const struct usb_device_id products [] = {
576 /* "ActiveSync" is an undocumented variant of RNDIS, used in WM5 */ 576 /* "ActiveSync" is an undocumented variant of RNDIS, used in WM5 */
577 USB_INTERFACE_INFO(USB_CLASS_MISC, 1, 1), 577 USB_INTERFACE_INFO(USB_CLASS_MISC, 1, 1),
578 .driver_info = (unsigned long) &rndis_info, 578 .driver_info = (unsigned long) &rndis_info,
579}, {
580 /* RNDIS for tethering */
581 USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
582 .driver_info = (unsigned long) &rndis_info,
579}, 583},
580 { }, // END 584 { }, // END
581}; 585};
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c
index 5827324e9d9f..f7d3349dc3ec 100644
--- a/drivers/net/wan/cosa.c
+++ b/drivers/net/wan/cosa.c
@@ -397,9 +397,9 @@ static int __init cosa_init(void)
397 err = PTR_ERR(cosa_class); 397 err = PTR_ERR(cosa_class);
398 goto out_chrdev; 398 goto out_chrdev;
399 } 399 }
400 for (i=0; i<nr_cards; i++) { 400 for (i = 0; i < nr_cards; i++)
401 device_create(cosa_class, NULL, MKDEV(cosa_major, i), "cosa%d", i); 401 device_create_drvdata(cosa_class, NULL, MKDEV(cosa_major, i),
402 } 402 NULL, "cosa%d", i);
403 err = 0; 403 err = 0;
404 goto out; 404 goto out;
405 405
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c
index 13d5882f1f21..3153fe9d7ce0 100644
--- a/drivers/net/wireless/hostap/hostap_hw.c
+++ b/drivers/net/wireless/hostap/hostap_hw.c
@@ -3101,6 +3101,7 @@ static void prism2_clear_set_tim_queue(local_info_t *local)
3101 * This is a natural nesting, which needs a split lock type. 3101 * This is a natural nesting, which needs a split lock type.
3102 */ 3102 */
3103static struct lock_class_key hostap_netdev_xmit_lock_key; 3103static struct lock_class_key hostap_netdev_xmit_lock_key;
3104static struct lock_class_key hostap_netdev_addr_lock_key;
3104 3105
3105static void prism2_set_lockdep_class_one(struct net_device *dev, 3106static void prism2_set_lockdep_class_one(struct net_device *dev,
3106 struct netdev_queue *txq, 3107 struct netdev_queue *txq,
@@ -3112,6 +3113,8 @@ static void prism2_set_lockdep_class_one(struct net_device *dev,
3112 3113
3113static void prism2_set_lockdep_class(struct net_device *dev) 3114static void prism2_set_lockdep_class(struct net_device *dev)
3114{ 3115{
3116 lockdep_set_class(&dev->addr_list_lock,
3117 &hostap_netdev_addr_lock_key);
3115 netdev_for_each_tx_queue(dev, prism2_set_lockdep_class_one, NULL); 3118 netdev_for_each_tx_queue(dev, prism2_set_lockdep_class_one, NULL);
3116} 3119}
3117 3120
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index 6e704608947c..1acfbcd3703c 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -4972,8 +4972,7 @@ static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
4972 } 4972 }
4973 done: 4973 done:
4974 if ((ipw_tx_queue_space(q) > q->low_mark) && 4974 if ((ipw_tx_queue_space(q) > q->low_mark) &&
4975 (qindex >= 0) && 4975 (qindex >= 0))
4976 (priv->status & STATUS_ASSOCIATED) && netif_running(priv->net_dev))
4977 netif_wake_queue(priv->net_dev); 4976 netif_wake_queue(priv->net_dev);
4978 used = q->first_empty - q->last_used; 4977 used = q->first_empty - q->last_used;
4979 if (used < 0) 4978 if (used < 0)
@@ -10154,14 +10153,8 @@ static void init_sys_config(struct ipw_sys_config *sys_config)
10154 10153
10155static int ipw_net_open(struct net_device *dev) 10154static int ipw_net_open(struct net_device *dev)
10156{ 10155{
10157 struct ipw_priv *priv = ieee80211_priv(dev);
10158 IPW_DEBUG_INFO("dev->open\n"); 10156 IPW_DEBUG_INFO("dev->open\n");
10159 /* we should be verifying the device is ready to be opened */ 10157 netif_start_queue(dev);
10160 mutex_lock(&priv->mutex);
10161 if (!(priv->status & STATUS_RF_KILL_MASK) &&
10162 (priv->status & STATUS_ASSOCIATED))
10163 netif_start_queue(dev);
10164 mutex_unlock(&priv->mutex);
10165 return 0; 10158 return 0;
10166} 10159}
10167 10160
@@ -10481,13 +10474,6 @@ static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
10481 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size); 10474 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size);
10482 spin_lock_irqsave(&priv->lock, flags); 10475 spin_lock_irqsave(&priv->lock, flags);
10483 10476
10484 if (!(priv->status & STATUS_ASSOCIATED)) {
10485 IPW_DEBUG_INFO("Tx attempt while not associated.\n");
10486 priv->ieee->stats.tx_carrier_errors++;
10487 netif_stop_queue(dev);
10488 goto fail_unlock;
10489 }
10490
10491#ifdef CONFIG_IPW2200_PROMISCUOUS 10477#ifdef CONFIG_IPW2200_PROMISCUOUS
10492 if (rtap_iface && netif_running(priv->prom_net_dev)) 10478 if (rtap_iface && netif_running(priv->prom_net_dev))
10493 ipw_handle_promiscuous_tx(priv, txb); 10479 ipw_handle_promiscuous_tx(priv, txb);
@@ -10499,10 +10485,6 @@ static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
10499 spin_unlock_irqrestore(&priv->lock, flags); 10485 spin_unlock_irqrestore(&priv->lock, flags);
10500 10486
10501 return ret; 10487 return ret;
10502
10503 fail_unlock:
10504 spin_unlock_irqrestore(&priv->lock, flags);
10505 return 1;
10506} 10488}
10507 10489
10508static struct net_device_stats *ipw_net_get_stats(struct net_device *dev) 10490static struct net_device_stats *ipw_net_get_stats(struct net_device *dev)
@@ -10703,13 +10685,6 @@ static void ipw_link_up(struct ipw_priv *priv)
10703 priv->last_packet_time = 0; 10685 priv->last_packet_time = 0;
10704 10686
10705 netif_carrier_on(priv->net_dev); 10687 netif_carrier_on(priv->net_dev);
10706 if (netif_queue_stopped(priv->net_dev)) {
10707 IPW_DEBUG_NOTIF("waking queue\n");
10708 netif_wake_queue(priv->net_dev);
10709 } else {
10710 IPW_DEBUG_NOTIF("starting queue\n");
10711 netif_start_queue(priv->net_dev);
10712 }
10713 10688
10714 cancel_delayed_work(&priv->request_scan); 10689 cancel_delayed_work(&priv->request_scan);
10715 cancel_delayed_work(&priv->request_direct_scan); 10690 cancel_delayed_work(&priv->request_direct_scan);
@@ -10739,7 +10714,6 @@ static void ipw_link_down(struct ipw_priv *priv)
10739{ 10714{
10740 ipw_led_link_down(priv); 10715 ipw_led_link_down(priv);
10741 netif_carrier_off(priv->net_dev); 10716 netif_carrier_off(priv->net_dev);
10742 netif_stop_queue(priv->net_dev);
10743 notify_wx_assoc_event(priv); 10717 notify_wx_assoc_event(priv);
10744 10718
10745 /* Cancel any queued work ... */ 10719 /* Cancel any queued work ... */
@@ -11419,7 +11393,6 @@ static void ipw_down(struct ipw_priv *priv)
11419 /* Clear all bits but the RF Kill */ 11393 /* Clear all bits but the RF Kill */
11420 priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING; 11394 priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING;
11421 netif_carrier_off(priv->net_dev); 11395 netif_carrier_off(priv->net_dev);
11422 netif_stop_queue(priv->net_dev);
11423 11396
11424 ipw_stop_nic(priv); 11397 ipw_stop_nic(priv);
11425 11398
@@ -11522,7 +11495,6 @@ static int ipw_prom_open(struct net_device *dev)
11522 11495
11523 IPW_DEBUG_INFO("prom dev->open\n"); 11496 IPW_DEBUG_INFO("prom dev->open\n");
11524 netif_carrier_off(dev); 11497 netif_carrier_off(dev);
11525 netif_stop_queue(dev);
11526 11498
11527 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { 11499 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
11528 priv->sys_config.accept_all_data_frames = 1; 11500 priv->sys_config.accept_all_data_frames = 1;
@@ -11558,7 +11530,6 @@ static int ipw_prom_stop(struct net_device *dev)
11558static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) 11530static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
11559{ 11531{
11560 IPW_DEBUG_INFO("prom dev->xmit\n"); 11532 IPW_DEBUG_INFO("prom dev->xmit\n");
11561 netif_stop_queue(dev);
11562 return -EOPNOTSUPP; 11533 return -EOPNOTSUPP;
11563} 11534}
11564 11535
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 913dc9fe08f9..5816230d58f8 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -364,8 +364,7 @@ static void mac80211_hwsim_free(void)
364 struct mac80211_hwsim_data *data; 364 struct mac80211_hwsim_data *data;
365 data = hwsim_radios[i]->priv; 365 data = hwsim_radios[i]->priv;
366 ieee80211_unregister_hw(hwsim_radios[i]); 366 ieee80211_unregister_hw(hwsim_radios[i]);
367 if (!IS_ERR(data->dev)) 367 device_unregister(data->dev);
368 device_unregister(data->dev);
369 ieee80211_free_hw(hwsim_radios[i]); 368 ieee80211_free_hw(hwsim_radios[i]);
370 } 369 }
371 } 370 }
@@ -437,7 +436,7 @@ static int __init init_mac80211_hwsim(void)
437 "mac80211_hwsim: device_create_drvdata " 436 "mac80211_hwsim: device_create_drvdata "
438 "failed (%ld)\n", PTR_ERR(data->dev)); 437 "failed (%ld)\n", PTR_ERR(data->dev));
439 err = -ENOMEM; 438 err = -ENOMEM;
440 goto failed; 439 goto failed_drvdata;
441 } 440 }
442 data->dev->driver = &mac80211_hwsim_driver; 441 data->dev->driver = &mac80211_hwsim_driver;
443 442
@@ -461,7 +460,7 @@ static int __init init_mac80211_hwsim(void)
461 if (err < 0) { 460 if (err < 0) {
462 printk(KERN_DEBUG "mac80211_hwsim: " 461 printk(KERN_DEBUG "mac80211_hwsim: "
463 "ieee80211_register_hw failed (%d)\n", err); 462 "ieee80211_register_hw failed (%d)\n", err);
464 goto failed; 463 goto failed_hw;
465 } 464 }
466 465
467 printk(KERN_DEBUG "%s: hwaddr %s registered\n", 466 printk(KERN_DEBUG "%s: hwaddr %s registered\n",
@@ -479,9 +478,9 @@ static int __init init_mac80211_hwsim(void)
479 rtnl_lock(); 478 rtnl_lock();
480 479
481 err = dev_alloc_name(hwsim_mon, hwsim_mon->name); 480 err = dev_alloc_name(hwsim_mon, hwsim_mon->name);
482 if (err < 0) { 481 if (err < 0)
483 goto failed_mon; 482 goto failed_mon;
484 } 483
485 484
486 err = register_netdevice(hwsim_mon); 485 err = register_netdevice(hwsim_mon);
487 if (err < 0) 486 if (err < 0)
@@ -494,7 +493,14 @@ static int __init init_mac80211_hwsim(void)
494failed_mon: 493failed_mon:
495 rtnl_unlock(); 494 rtnl_unlock();
496 free_netdev(hwsim_mon); 495 free_netdev(hwsim_mon);
496 mac80211_hwsim_free();
497 return err;
497 498
499failed_hw:
500 device_unregister(data->dev);
501failed_drvdata:
502 ieee80211_free_hw(hw);
503 hwsim_radios[i] = 0;
498failed: 504failed:
499 mac80211_hwsim_free(); 505 mac80211_hwsim_free();
500 return err; 506 return err;
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index ef671d1a3bf0..902bbe788215 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -92,7 +92,7 @@ struct netfront_info {
92 */ 92 */
93 union skb_entry { 93 union skb_entry {
94 struct sk_buff *skb; 94 struct sk_buff *skb;
95 unsigned link; 95 unsigned long link;
96 } tx_skbs[NET_TX_RING_SIZE]; 96 } tx_skbs[NET_TX_RING_SIZE];
97 grant_ref_t gref_tx_head; 97 grant_ref_t gref_tx_head;
98 grant_ref_t grant_tx_ref[NET_TX_RING_SIZE]; 98 grant_ref_t grant_tx_ref[NET_TX_RING_SIZE];
@@ -125,6 +125,17 @@ struct netfront_rx_info {
125 struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1]; 125 struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
126}; 126};
127 127
128static void skb_entry_set_link(union skb_entry *list, unsigned short id)
129{
130 list->link = id;
131}
132
133static int skb_entry_is_link(const union skb_entry *list)
134{
135 BUILD_BUG_ON(sizeof(list->skb) != sizeof(list->link));
136 return ((unsigned long)list->skb < PAGE_OFFSET);
137}
138
128/* 139/*
129 * Access macros for acquiring freeing slots in tx_skbs[]. 140 * Access macros for acquiring freeing slots in tx_skbs[].
130 */ 141 */
@@ -132,7 +143,7 @@ struct netfront_rx_info {
132static void add_id_to_freelist(unsigned *head, union skb_entry *list, 143static void add_id_to_freelist(unsigned *head, union skb_entry *list,
133 unsigned short id) 144 unsigned short id)
134{ 145{
135 list[id].link = *head; 146 skb_entry_set_link(&list[id], *head);
136 *head = id; 147 *head = id;
137} 148}
138 149
@@ -993,7 +1004,7 @@ static void xennet_release_tx_bufs(struct netfront_info *np)
993 1004
994 for (i = 0; i < NET_TX_RING_SIZE; i++) { 1005 for (i = 0; i < NET_TX_RING_SIZE; i++) {
995 /* Skip over entries which are actually freelist references */ 1006 /* Skip over entries which are actually freelist references */
996 if ((unsigned long)np->tx_skbs[i].skb < PAGE_OFFSET) 1007 if (skb_entry_is_link(&np->tx_skbs[i]))
997 continue; 1008 continue;
998 1009
999 skb = np->tx_skbs[i].skb; 1010 skb = np->tx_skbs[i].skb;
@@ -1123,7 +1134,7 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev
1123 /* Initialise tx_skbs as a free chain containing every entry. */ 1134 /* Initialise tx_skbs as a free chain containing every entry. */
1124 np->tx_skb_freelist = 0; 1135 np->tx_skb_freelist = 0;
1125 for (i = 0; i < NET_TX_RING_SIZE; i++) { 1136 for (i = 0; i < NET_TX_RING_SIZE; i++) {
1126 np->tx_skbs[i].link = i+1; 1137 skb_entry_set_link(&np->tx_skbs[i], i+1);
1127 np->grant_tx_ref[i] = GRANT_INVALID_REF; 1138 np->grant_tx_ref[i] = GRANT_INVALID_REF;
1128 } 1139 }
1129 1140
diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c
index f941f609dbf3..8bf86ae2333f 100644
--- a/drivers/pci/dmar.c
+++ b/drivers/pci/dmar.c
@@ -317,10 +317,8 @@ int __init dmar_table_init(void)
317 return -ENODEV; 317 return -ENODEV;
318 } 318 }
319 319
320 if (list_empty(&dmar_rmrr_units)) { 320 if (list_empty(&dmar_rmrr_units))
321 printk(KERN_INFO PREFIX "No RMRR found\n"); 321 printk(KERN_INFO PREFIX "No RMRR found\n");
322 return -ENODEV;
323 }
324 322
325 return 0; 323 return 0;
326} 324}
diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h
index eecf7cbf4139..5a58b075dd8d 100644
--- a/drivers/pci/hotplug/acpiphp.h
+++ b/drivers/pci/hotplug/acpiphp.h
@@ -36,7 +36,7 @@
36#define _ACPIPHP_H 36#define _ACPIPHP_H
37 37
38#include <linux/acpi.h> 38#include <linux/acpi.h>
39#include <linux/kobject.h> /* for KOBJ_NAME_LEN */ 39#include <linux/kobject.h>
40#include <linux/mutex.h> 40#include <linux/mutex.h>
41#include <linux/pci_hotplug.h> 41#include <linux/pci_hotplug.h>
42 42
@@ -51,7 +51,7 @@
51#define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) 51#define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg)
52 52
53/* name size which is used for entries in pcihpfs */ 53/* name size which is used for entries in pcihpfs */
54#define SLOT_NAME_SIZE KOBJ_NAME_LEN /* {_SUN} */ 54#define SLOT_NAME_SIZE 20 /* {_SUN} */
55 55
56struct acpiphp_bridge; 56struct acpiphp_bridge;
57struct acpiphp_slot; 57struct acpiphp_slot;
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index 3f7b81c065d2..8d0e60ac849c 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -37,7 +37,7 @@
37#include "intel-iommu.h" 37#include "intel-iommu.h"
38#include <asm/proto.h> /* force_iommu in this header in x86-64*/ 38#include <asm/proto.h> /* force_iommu in this header in x86-64*/
39#include <asm/cacheflush.h> 39#include <asm/cacheflush.h>
40#include <asm/gart.h> 40#include <asm/iommu.h>
41#include "pci.h" 41#include "pci.h"
42 42
43#define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) 43#define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 44a46c92b721..e9c356236d27 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1040,7 +1040,7 @@ int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state)
1040 * @dev: PCI device to handle. 1040 * @dev: PCI device to handle.
1041 * @state: PCI state from which device will issue PME#. 1041 * @state: PCI state from which device will issue PME#.
1042 */ 1042 */
1043static bool pci_pme_capable(struct pci_dev *dev, pci_power_t state) 1043bool pci_pme_capable(struct pci_dev *dev, pci_power_t state)
1044{ 1044{
1045 if (!dev->pm_cap) 1045 if (!dev->pm_cap)
1046 return false; 1046 return false;
@@ -1123,18 +1123,10 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable)
1123} 1123}
1124 1124
1125/** 1125/**
1126 * pci_prepare_to_sleep - prepare PCI device for system-wide transition into
1127 * a sleep state
1128 * @dev: Device to handle.
1129 *
1130 * Choose the power state appropriate for the device depending on whether
1131 * it can wake up the system and/or is power manageable by the platform
1132 * (PCI_D3hot is the default) and put the device into that state.
1133 */ 1126 */
1134int pci_prepare_to_sleep(struct pci_dev *dev) 1127pci_power_t pci_target_state(struct pci_dev *dev)
1135{ 1128{
1136 pci_power_t target_state = PCI_D3hot; 1129 pci_power_t target_state = PCI_D3hot;
1137 int error;
1138 1130
1139 if (platform_pci_power_manageable(dev)) { 1131 if (platform_pci_power_manageable(dev)) {
1140 /* 1132 /*
@@ -1161,7 +1153,7 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
1161 * to generate PME#. 1153 * to generate PME#.
1162 */ 1154 */
1163 if (!dev->pm_cap) 1155 if (!dev->pm_cap)
1164 return -EIO; 1156 return PCI_POWER_ERROR;
1165 1157
1166 if (dev->pme_support) { 1158 if (dev->pme_support) {
1167 while (target_state 1159 while (target_state
@@ -1170,6 +1162,25 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
1170 } 1162 }
1171 } 1163 }
1172 1164
1165 return target_state;
1166}
1167
1168/**
1169 * pci_prepare_to_sleep - prepare PCI device for system-wide transition into a sleep state
1170 * @dev: Device to handle.
1171 *
1172 * Choose the power state appropriate for the device depending on whether
1173 * it can wake up the system and/or is power manageable by the platform
1174 * (PCI_D3hot is the default) and put the device into that state.
1175 */
1176int pci_prepare_to_sleep(struct pci_dev *dev)
1177{
1178 pci_power_t target_state = pci_target_state(dev);
1179 int error;
1180
1181 if (target_state == PCI_POWER_ERROR)
1182 return -EIO;
1183
1173 pci_enable_wake(dev, target_state, true); 1184 pci_enable_wake(dev, target_state, true);
1174 1185
1175 error = pci_set_power_state(dev, target_state); 1186 error = pci_set_power_state(dev, target_state);
@@ -1181,8 +1192,7 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
1181} 1192}
1182 1193
1183/** 1194/**
1184 * pci_back_from_sleep - turn PCI device on during system-wide transition into 1195 * pci_back_from_sleep - turn PCI device on during system-wide transition into working state
1185 * the working state a sleep state
1186 * @dev: Device to handle. 1196 * @dev: Device to handle.
1187 * 1197 *
1188 * Disable device's sytem wake-up capability and put it into D0. 1198 * Disable device's sytem wake-up capability and put it into D0.
@@ -1920,7 +1930,9 @@ EXPORT_SYMBOL(pci_select_bars);
1920EXPORT_SYMBOL(pci_set_power_state); 1930EXPORT_SYMBOL(pci_set_power_state);
1921EXPORT_SYMBOL(pci_save_state); 1931EXPORT_SYMBOL(pci_save_state);
1922EXPORT_SYMBOL(pci_restore_state); 1932EXPORT_SYMBOL(pci_restore_state);
1933EXPORT_SYMBOL(pci_pme_capable);
1923EXPORT_SYMBOL(pci_enable_wake); 1934EXPORT_SYMBOL(pci_enable_wake);
1935EXPORT_SYMBOL(pci_target_state);
1924EXPORT_SYMBOL(pci_prepare_to_sleep); 1936EXPORT_SYMBOL(pci_prepare_to_sleep);
1925EXPORT_SYMBOL(pci_back_from_sleep); 1937EXPORT_SYMBOL(pci_back_from_sleep);
1926EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state); 1938EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state);
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
index 4400dffbd93a..e1098c302c45 100644
--- a/drivers/pci/proc.c
+++ b/drivers/pci/proc.c
@@ -88,7 +88,7 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp
88 if ((pos & 3) && cnt > 2) { 88 if ((pos & 3) && cnt > 2) {
89 unsigned short val; 89 unsigned short val;
90 pci_user_read_config_word(dev, pos, &val); 90 pci_user_read_config_word(dev, pos, &val);
91 __put_user(cpu_to_le16(val), (unsigned short __user *) buf); 91 __put_user(cpu_to_le16(val), (__le16 __user *) buf);
92 buf += 2; 92 buf += 2;
93 pos += 2; 93 pos += 2;
94 cnt -= 2; 94 cnt -= 2;
@@ -97,7 +97,7 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp
97 while (cnt >= 4) { 97 while (cnt >= 4) {
98 unsigned int val; 98 unsigned int val;
99 pci_user_read_config_dword(dev, pos, &val); 99 pci_user_read_config_dword(dev, pos, &val);
100 __put_user(cpu_to_le32(val), (unsigned int __user *) buf); 100 __put_user(cpu_to_le32(val), (__le32 __user *) buf);
101 buf += 4; 101 buf += 4;
102 pos += 4; 102 pos += 4;
103 cnt -= 4; 103 cnt -= 4;
@@ -106,7 +106,7 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp
106 if (cnt >= 2) { 106 if (cnt >= 2) {
107 unsigned short val; 107 unsigned short val;
108 pci_user_read_config_word(dev, pos, &val); 108 pci_user_read_config_word(dev, pos, &val);
109 __put_user(cpu_to_le16(val), (unsigned short __user *) buf); 109 __put_user(cpu_to_le16(val), (__le16 __user *) buf);
110 buf += 2; 110 buf += 2;
111 pos += 2; 111 pos += 2;
112 cnt -= 2; 112 cnt -= 2;
@@ -156,8 +156,8 @@ proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, lof
156 } 156 }
157 157
158 if ((pos & 3) && cnt > 2) { 158 if ((pos & 3) && cnt > 2) {
159 unsigned short val; 159 __le16 val;
160 __get_user(val, (unsigned short __user *) buf); 160 __get_user(val, (__le16 __user *) buf);
161 pci_user_write_config_word(dev, pos, le16_to_cpu(val)); 161 pci_user_write_config_word(dev, pos, le16_to_cpu(val));
162 buf += 2; 162 buf += 2;
163 pos += 2; 163 pos += 2;
@@ -165,8 +165,8 @@ proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, lof
165 } 165 }
166 166
167 while (cnt >= 4) { 167 while (cnt >= 4) {
168 unsigned int val; 168 __le32 val;
169 __get_user(val, (unsigned int __user *) buf); 169 __get_user(val, (__le32 __user *) buf);
170 pci_user_write_config_dword(dev, pos, le32_to_cpu(val)); 170 pci_user_write_config_dword(dev, pos, le32_to_cpu(val));
171 buf += 4; 171 buf += 4;
172 pos += 4; 172 pos += 4;
@@ -174,8 +174,8 @@ proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, lof
174 } 174 }
175 175
176 if (cnt >= 2) { 176 if (cnt >= 2) {
177 unsigned short val; 177 __le16 val;
178 __get_user(val, (unsigned short __user *) buf); 178 __get_user(val, (__le16 __user *) buf);
179 pci_user_write_config_word(dev, pos, le16_to_cpu(val)); 179 pci_user_write_config_word(dev, pos, le16_to_cpu(val));
180 buf += 2; 180 buf += 2;
181 pos += 2; 181 pos += 2;
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
index e45402adac3f..e0f884034c9f 100644
--- a/drivers/pcmcia/Kconfig
+++ b/drivers/pcmcia/Kconfig
@@ -219,7 +219,8 @@ config PCMCIA_SA1111
219config PCMCIA_PXA2XX 219config PCMCIA_PXA2XX
220 tristate "PXA2xx support" 220 tristate "PXA2xx support"
221 depends on ARM && ARCH_PXA && PCMCIA 221 depends on ARM && ARCH_PXA && PCMCIA
222 depends on ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL || MACH_ARMCORE 222 depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
223 || MACH_ARMCORE || ARCH_PXA_PALM)
223 help 224 help
224 Say Y here to include support for the PXA2xx PCMCIA controller 225 Say Y here to include support for the PXA2xx PCMCIA controller
225 226
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
index 85c6cc931f97..269a9e913ba2 100644
--- a/drivers/pcmcia/Makefile
+++ b/drivers/pcmcia/Makefile
@@ -72,4 +72,5 @@ pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o
72pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o 72pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o
73pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o 73pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o
74pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x270.o 74pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x270.o
75pxa2xx_cs-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o
75 76
diff --git a/drivers/pcmcia/electra_cf.c b/drivers/pcmcia/electra_cf.c
index c21f9a9c3e3f..a34284b1482a 100644
--- a/drivers/pcmcia/electra_cf.c
+++ b/drivers/pcmcia/electra_cf.c
@@ -28,6 +28,7 @@
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/delay.h> 29#include <linux/delay.h>
30#include <linux/interrupt.h> 30#include <linux/interrupt.h>
31#include <linux/mm.h>
31#include <linux/vmalloc.h> 32#include <linux/vmalloc.h>
32#include <linux/of_platform.h> 33#include <linux/of_platform.h>
33 34
diff --git a/drivers/pcmcia/pxa2xx_cm_x270.c b/drivers/pcmcia/pxa2xx_cm_x270.c
index f123fce65f2e..bb95db7d2b76 100644
--- a/drivers/pcmcia/pxa2xx_cm_x270.c
+++ b/drivers/pcmcia/pxa2xx_cm_x270.c
@@ -5,83 +5,60 @@
5 * it under the terms of the GNU General Public License version 2 as 5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation. 6 * published by the Free Software Foundation.
7 * 7 *
8 * Compulab Ltd., 2003, 2007 8 * Compulab Ltd., 2003, 2007, 2008
9 * Mike Rapoport <mike@compulab.co.il> 9 * Mike Rapoport <mike@compulab.co.il>
10 * 10 *
11 */ 11 */
12 12
13#include <linux/kernel.h>
14#include <linux/sched.h>
15#include <linux/platform_device.h> 13#include <linux/platform_device.h>
16#include <linux/irq.h> 14#include <linux/irq.h>
17#include <linux/delay.h> 15#include <linux/delay.h>
16#include <linux/gpio.h>
18 17
19#include <pcmcia/ss.h>
20#include <asm/hardware.h>
21#include <asm/mach-types.h> 18#include <asm/mach-types.h>
22
23#include <asm/arch/pxa-regs.h> 19#include <asm/arch/pxa-regs.h>
24#include <asm/arch/pxa2xx-gpio.h>
25#include <asm/arch/cm-x270.h>
26 20
27#include "soc_common.h" 21#include "soc_common.h"
28 22
23#define GPIO_PCMCIA_S0_CD_VALID (84)
24#define GPIO_PCMCIA_S0_RDYINT (82)
25#define GPIO_PCMCIA_RESET (53)
26
27#define PCMCIA_S0_CD_VALID IRQ_GPIO(GPIO_PCMCIA_S0_CD_VALID)
28#define PCMCIA_S0_RDYINT IRQ_GPIO(GPIO_PCMCIA_S0_RDYINT)
29
30
29static struct pcmcia_irqs irqs[] = { 31static struct pcmcia_irqs irqs[] = {
30 { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD" }, 32 { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD" },
31 { 1, PCMCIA_S1_CD_VALID, "PCMCIA1 CD" },
32}; 33};
33 34
34static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 35static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
35{ 36{
36 GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | 37 int ret = gpio_request(GPIO_PCMCIA_RESET, "PCCard reset");
37 GPIO_bit(GPIO49_nPWE) | 38 if (ret)
38 GPIO_bit(GPIO50_nPIOR) | 39 return ret;
39 GPIO_bit(GPIO51_nPIOW) | 40 gpio_direction_output(GPIO_PCMCIA_RESET, 0);
40 GPIO_bit(GPIO85_nPCE_1) | 41
41 GPIO_bit(GPIO54_nPCE_2); 42 skt->irq = PCMCIA_S0_RDYINT;
42 43 ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
43 pxa_gpio_mode(GPIO48_nPOE_MD); 44 if (!ret)
44 pxa_gpio_mode(GPIO49_nPWE_MD); 45 gpio_free(GPIO_PCMCIA_RESET);
45 pxa_gpio_mode(GPIO50_nPIOR_MD); 46
46 pxa_gpio_mode(GPIO51_nPIOW_MD); 47 return ret;
47 pxa_gpio_mode(GPIO85_nPCE_1_MD);
48 pxa_gpio_mode(GPIO54_nPCE_2_MD);
49 pxa_gpio_mode(GPIO55_nPREG_MD);
50 pxa_gpio_mode(GPIO56_nPWAIT_MD);
51 pxa_gpio_mode(GPIO57_nIOIS16_MD);
52
53 /* Reset signal */
54 pxa_gpio_mode(GPIO53_nPCE_2 | GPIO_OUT);
55 GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
56
57 set_irq_type(PCMCIA_S0_CD_VALID, IRQ_TYPE_EDGE_BOTH);
58 set_irq_type(PCMCIA_S1_CD_VALID, IRQ_TYPE_EDGE_BOTH);
59
60 /* irq's for slots: */
61 set_irq_type(PCMCIA_S0_RDYINT, IRQ_TYPE_EDGE_FALLING);
62 set_irq_type(PCMCIA_S1_RDYINT, IRQ_TYPE_EDGE_FALLING);
63
64 skt->irq = (skt->nr == 0) ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
65 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
66} 48}
67 49
68static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt) 50static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
69{ 51{
70 soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); 52 soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
71 53 gpio_free(GPIO_PCMCIA_RESET);
72 set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID), IRQ_TYPE_NONE);
73 set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID), IRQ_TYPE_NONE);
74
75 set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_RDYINT), IRQ_TYPE_NONE);
76 set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_RDYINT), IRQ_TYPE_NONE);
77} 54}
78 55
79 56
80static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt, 57static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
81 struct pcmcia_state *state) 58 struct pcmcia_state *state)
82{ 59{
83 state->detect = (PCC_DETECT(skt->nr) == 0) ? 1 : 0; 60 state->detect = (gpio_get_value(GPIO_PCMCIA_S0_CD_VALID) == 0) ? 1 : 0;
84 state->ready = (PCC_READY(skt->nr) == 0) ? 0 : 1; 61 state->ready = (gpio_get_value(GPIO_PCMCIA_S0_RDYINT) == 0) ? 0 : 1;
85 state->bvd1 = 1; 62 state->bvd1 = 1;
86 state->bvd2 = 1; 63 state->bvd2 = 1;
87 state->vs_3v = 0; 64 state->vs_3v = 0;
@@ -93,32 +70,16 @@ static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
93static int cmx270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, 70static int cmx270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
94 const socket_state_t *state) 71 const socket_state_t *state)
95{ 72{
96 GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
97 pxa_gpio_mode(GPIO49_nPWE | GPIO_OUT);
98
99 switch (skt->nr) { 73 switch (skt->nr) {
100 case 0: 74 case 0:
101 if (state->flags & SS_RESET) { 75 if (state->flags & SS_RESET) {
102 GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); 76 gpio_set_value(GPIO_PCMCIA_RESET, 1);
103 GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
104 udelay(10);
105 GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
106 GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
107 }
108 break;
109 case 1:
110 if (state->flags & SS_RESET) {
111 GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
112 GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
113 udelay(10); 77 udelay(10);
114 GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); 78 gpio_set_value(GPIO_PCMCIA_RESET, 0);
115 GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
116 } 79 }
117 break; 80 break;
118 } 81 }
119 82
120 pxa_gpio_mode(GPIO49_nPWE_MD);
121
122 return 0; 83 return 0;
123} 84}
124 85
@@ -139,7 +100,7 @@ static struct pcmcia_low_level cmx270_pcmcia_ops __initdata = {
139 .configure_socket = cmx270_pcmcia_configure_socket, 100 .configure_socket = cmx270_pcmcia_configure_socket,
140 .socket_init = cmx270_pcmcia_socket_init, 101 .socket_init = cmx270_pcmcia_socket_init,
141 .socket_suspend = cmx270_pcmcia_socket_suspend, 102 .socket_suspend = cmx270_pcmcia_socket_suspend,
142 .nr = 2, 103 .nr = 1,
143}; 104};
144 105
145static struct platform_device *cmx270_pcmcia_device; 106static struct platform_device *cmx270_pcmcia_device;
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c
new file mode 100644
index 000000000000..4abde190c1f5
--- /dev/null
+++ b/drivers/pcmcia/pxa2xx_palmtx.c
@@ -0,0 +1,118 @@
1/*
2 * linux/drivers/pcmcia/pxa2xx_palmtx.c
3 *
4 * Driver for Palm T|X PCMCIA
5 *
6 * Copyright (C) 2007-2008 Marek Vasut <marek.vasut@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/platform_device.h>
16
17#include <asm/mach-types.h>
18
19#include <asm/arch/gpio.h>
20#include <asm/arch/palmtx.h>
21
22#include "soc_common.h"
23
24static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
25{
26 skt->irq = IRQ_GPIO(GPIO_NR_PALMTX_PCMCIA_READY);
27 return 0;
28}
29
30static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
31{
32}
33
34static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
35 struct pcmcia_state *state)
36{
37 state->detect = 1; /* always inserted */
38 state->ready = !!gpio_get_value(GPIO_NR_PALMTX_PCMCIA_READY);
39 state->bvd1 = 1;
40 state->bvd2 = 1;
41 state->wrprot = 0;
42 state->vs_3v = 1;
43 state->vs_Xv = 0;
44}
45
46static int
47palmtx_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
48 const socket_state_t *state)
49{
50 gpio_set_value(GPIO_NR_PALMTX_PCMCIA_POWER1, 1);
51 gpio_set_value(GPIO_NR_PALMTX_PCMCIA_POWER2, 1);
52 gpio_set_value(GPIO_NR_PALMTX_PCMCIA_RESET,
53 !!(state->flags & SS_RESET));
54
55 return 0;
56}
57
58static void palmtx_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
59{
60}
61
62static void palmtx_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
63{
64}
65
66static struct pcmcia_low_level palmtx_pcmcia_ops = {
67 .owner = THIS_MODULE,
68
69 .first = 0,
70 .nr = 1,
71
72 .hw_init = palmtx_pcmcia_hw_init,
73 .hw_shutdown = palmtx_pcmcia_hw_shutdown,
74
75 .socket_state = palmtx_pcmcia_socket_state,
76 .configure_socket = palmtx_pcmcia_configure_socket,
77
78 .socket_init = palmtx_pcmcia_socket_init,
79 .socket_suspend = palmtx_pcmcia_socket_suspend,
80};
81
82static struct platform_device *palmtx_pcmcia_device;
83
84static int __init palmtx_pcmcia_init(void)
85{
86 int ret;
87
88 if (!machine_is_palmtx())
89 return -ENODEV;
90
91 palmtx_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
92 if (!palmtx_pcmcia_device)
93 return -ENOMEM;
94
95 ret = platform_device_add_data(palmtx_pcmcia_device, &palmtx_pcmcia_ops,
96 sizeof(palmtx_pcmcia_ops));
97
98 if (!ret)
99 ret = platform_device_add(palmtx_pcmcia_device);
100
101 if (ret)
102 platform_device_put(palmtx_pcmcia_device);
103
104 return ret;
105}
106
107static void __exit palmtx_pcmcia_exit(void)
108{
109 platform_device_unregister(palmtx_pcmcia_device);
110}
111
112fs_initcall(palmtx_pcmcia_init);
113module_exit(palmtx_pcmcia_exit);
114
115MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
116MODULE_DESCRIPTION("PCMCIA support for Palm T|X");
117MODULE_ALIAS("platform:pxa2xx-pcmcia");
118MODULE_LICENSE("GPL");
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index 58c806e9c58a..4d17d384578d 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -49,4 +49,10 @@ config BATTERY_OLPC
49 help 49 help
50 Say Y to enable support for the battery on the OLPC laptop. 50 Say Y to enable support for the battery on the OLPC laptop.
51 51
52config BATTERY_PALMTX
53 tristate "Palm T|X battery"
54 depends on MACH_PALMTX
55 help
56 Say Y to enable support for the battery in Palm T|X.
57
52endif # POWER_SUPPLY 58endif # POWER_SUPPLY
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 6413ded5fe5f..6f43a54ee420 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -20,3 +20,4 @@ obj-$(CONFIG_APM_POWER) += apm_power.o
20obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o 20obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o
21obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o 21obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o
22obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o 22obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o
23obj-$(CONFIG_BATTERY_PALMTX) += palmtx_battery.o
diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c
index a4892275659d..936bae560fa1 100644
--- a/drivers/power/apm_power.c
+++ b/drivers/power/apm_power.c
@@ -78,7 +78,7 @@ static void find_main_battery(void)
78 main_battery = NULL; 78 main_battery = NULL;
79 bp.main = main_battery; 79 bp.main = main_battery;
80 80
81 error = class_for_each_device(power_supply_class, &bp, 81 error = class_for_each_device(power_supply_class, NULL, &bp,
82 __find_main_battery); 82 __find_main_battery);
83 if (error) { 83 if (error) {
84 main_battery = bp.main; 84 main_battery = bp.main;
diff --git a/drivers/power/palmtx_battery.c b/drivers/power/palmtx_battery.c
new file mode 100644
index 000000000000..244bb273a637
--- /dev/null
+++ b/drivers/power/palmtx_battery.c
@@ -0,0 +1,198 @@
1/*
2 * linux/drivers/power/palmtx_battery.c
3 *
4 * Battery measurement code for Palm T|X Handheld computer
5 *
6 * based on tosa_battery.c
7 *
8 * Copyright (C) 2008 Marek Vasut <marek.vasut@gmail.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 */
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/power_supply.h>
18#include <linux/wm97xx.h>
19#include <linux/delay.h>
20#include <linux/spinlock.h>
21#include <linux/interrupt.h>
22#include <linux/gpio.h>
23
24#include <asm/mach-types.h>
25#include <asm/arch/palmtx.h>
26
27static DEFINE_MUTEX(bat_lock);
28static struct work_struct bat_work;
29struct mutex work_lock;
30int bat_status = POWER_SUPPLY_STATUS_DISCHARGING;
31
32static unsigned long palmtx_read_bat(struct power_supply *bat_ps)
33{
34 return wm97xx_read_aux_adc(bat_ps->dev->parent->driver_data,
35 WM97XX_AUX_ID3) * 1000 / 414;
36}
37
38static unsigned long palmtx_read_temp(struct power_supply *bat_ps)
39{
40 return wm97xx_read_aux_adc(bat_ps->dev->parent->driver_data,
41 WM97XX_AUX_ID2);
42}
43
44static int palmtx_bat_get_property(struct power_supply *bat_ps,
45 enum power_supply_property psp,
46 union power_supply_propval *val)
47{
48 switch (psp) {
49 case POWER_SUPPLY_PROP_STATUS:
50 val->intval = bat_status;
51 break;
52 case POWER_SUPPLY_PROP_TECHNOLOGY:
53 val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO;
54 break;
55 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
56 val->intval = palmtx_read_bat(bat_ps);
57 break;
58 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
59 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
60 val->intval = PALMTX_BAT_MAX_VOLTAGE;
61 break;
62 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
63 val->intval = PALMTX_BAT_MIN_VOLTAGE;
64 break;
65 case POWER_SUPPLY_PROP_TEMP:
66 val->intval = palmtx_read_temp(bat_ps);
67 break;
68 case POWER_SUPPLY_PROP_PRESENT:
69 val->intval = 1;
70 break;
71 default:
72 return -EINVAL;
73 }
74 return 0;
75}
76
77static void palmtx_bat_external_power_changed(struct power_supply *bat_ps)
78{
79 schedule_work(&bat_work);
80}
81
82static char *status_text[] = {
83 [POWER_SUPPLY_STATUS_UNKNOWN] = "Unknown",
84 [POWER_SUPPLY_STATUS_CHARGING] = "Charging",
85 [POWER_SUPPLY_STATUS_DISCHARGING] = "Discharging",
86};
87
88static void palmtx_bat_update(struct power_supply *bat_ps)
89{
90 int old_status = bat_status;
91
92 mutex_lock(&work_lock);
93
94 bat_status = gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT) ?
95 POWER_SUPPLY_STATUS_CHARGING :
96 POWER_SUPPLY_STATUS_DISCHARGING;
97
98 if (old_status != bat_status) {
99 pr_debug("%s %s -> %s\n", bat_ps->name,
100 status_text[old_status],
101 status_text[bat_status]);
102 power_supply_changed(bat_ps);
103 }
104
105 mutex_unlock(&work_lock);
106}
107
108static enum power_supply_property palmtx_bat_main_props[] = {
109 POWER_SUPPLY_PROP_STATUS,
110 POWER_SUPPLY_PROP_TECHNOLOGY,
111 POWER_SUPPLY_PROP_VOLTAGE_NOW,
112 POWER_SUPPLY_PROP_VOLTAGE_MAX,
113 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
114 POWER_SUPPLY_PROP_TEMP,
115 POWER_SUPPLY_PROP_PRESENT,
116};
117
118struct power_supply bat_ps = {
119 .name = "main-battery",
120 .type = POWER_SUPPLY_TYPE_BATTERY,
121 .properties = palmtx_bat_main_props,
122 .num_properties = ARRAY_SIZE(palmtx_bat_main_props),
123 .get_property = palmtx_bat_get_property,
124 .external_power_changed = palmtx_bat_external_power_changed,
125 .use_for_apm = 1,
126};
127
128static void palmtx_bat_work(struct work_struct *work)
129{
130 palmtx_bat_update(&bat_ps);
131}
132
133#ifdef CONFIG_PM
134static int palmtx_bat_suspend(struct platform_device *dev, pm_message_t state)
135{
136 flush_scheduled_work();
137 return 0;
138}
139
140static int palmtx_bat_resume(struct platform_device *dev)
141{
142 schedule_work(&bat_work);
143 return 0;
144}
145#else
146#define palmtx_bat_suspend NULL
147#define palmtx_bat_resume NULL
148#endif
149
150static int __devinit palmtx_bat_probe(struct platform_device *dev)
151{
152 int ret = 0;
153
154 if (!machine_is_palmtx())
155 return -ENODEV;
156
157 mutex_init(&work_lock);
158
159 INIT_WORK(&bat_work, palmtx_bat_work);
160
161 ret = power_supply_register(&dev->dev, &bat_ps);
162 if (!ret)
163 schedule_work(&bat_work);
164
165 return ret;
166}
167
168static int __devexit palmtx_bat_remove(struct platform_device *dev)
169{
170 power_supply_unregister(&bat_ps);
171 return 0;
172}
173
174static struct platform_driver palmtx_bat_driver = {
175 .driver.name = "wm97xx-battery",
176 .driver.owner = THIS_MODULE,
177 .probe = palmtx_bat_probe,
178 .remove = __devexit_p(palmtx_bat_remove),
179 .suspend = palmtx_bat_suspend,
180 .resume = palmtx_bat_resume,
181};
182
183static int __init palmtx_bat_init(void)
184{
185 return platform_driver_register(&palmtx_bat_driver);
186}
187
188static void __exit palmtx_bat_exit(void)
189{
190 platform_driver_unregister(&palmtx_bat_driver);
191}
192
193module_init(palmtx_bat_init);
194module_exit(palmtx_bat_exit);
195
196MODULE_LICENSE("GPL");
197MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
198MODULE_DESCRIPTION("Palm T|X battery driver");
diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c
index af1633eb3b70..cb1ccb472921 100644
--- a/drivers/power/power_supply_core.c
+++ b/drivers/power/power_supply_core.c
@@ -41,7 +41,7 @@ static void power_supply_changed_work(struct work_struct *work)
41 41
42 dev_dbg(psy->dev, "%s\n", __func__); 42 dev_dbg(psy->dev, "%s\n", __func__);
43 43
44 class_for_each_device(power_supply_class, psy, 44 class_for_each_device(power_supply_class, NULL, psy,
45 __power_supply_changed_work); 45 __power_supply_changed_work);
46 46
47 power_supply_update_leds(psy); 47 power_supply_update_leds(psy);
@@ -79,7 +79,7 @@ int power_supply_am_i_supplied(struct power_supply *psy)
79{ 79{
80 int error; 80 int error;
81 81
82 error = class_for_each_device(power_supply_class, psy, 82 error = class_for_each_device(power_supply_class, NULL, psy,
83 __power_supply_am_i_supplied); 83 __power_supply_am_i_supplied);
84 84
85 dev_dbg(psy->dev, "%s %d\n", __func__, error); 85 dev_dbg(psy->dev, "%s %d\n", __func__, error);
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index fc85bf2e4a97..90ab73825401 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -273,6 +273,25 @@ comment "SPI RTC drivers"
273 273
274if SPI_MASTER 274if SPI_MASTER
275 275
276config RTC_DRV_M41T94
277 tristate "ST M41T94"
278 help
279 If you say yes here you will get support for the
280 ST M41T94 SPI RTC chip.
281
282 This driver can also be built as a module. If so, the module
283 will be called rtc-m41t94.
284
285config RTC_DRV_DS1305
286 tristate "Dallas/Maxim DS1305/DS1306"
287 help
288 Select this driver to get support for the Dallas/Maxim DS1305
289 and DS1306 real time clock chips. These support a trickle
290 charger, alarms, and NVRAM in addition to the clock.
291
292 This driver can also be built as a module. If so, the module
293 will be called rtc-ds1305.
294
276config RTC_DRV_MAX6902 295config RTC_DRV_MAX6902
277 tristate "Maxim MAX6902" 296 tristate "Maxim MAX6902"
278 help 297 help
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index b5d9d67df887..18622ef84cab 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_RTC_DRV_BFIN) += rtc-bfin.o
24obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o 24obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o
25obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o 25obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o
26obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o 26obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o
27obj-$(CONFIG_RTC_DRV_DS1305) += rtc-ds1305.o
27obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o 28obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o
28obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o 29obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o
29obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o 30obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o
@@ -34,6 +35,7 @@ obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o
34obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o 35obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o
35obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o 36obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o
36obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o 37obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o
38obj-$(CONFIG_RTC_DRV_M41T94) += rtc-m41t94.o
37obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o 39obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o
38obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o 40obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o
39obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o 41obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 58b7336640ff..d397fa5f3a91 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -345,7 +345,7 @@ struct rtc_device *rtc_class_open(char *name)
345 struct device *dev; 345 struct device *dev;
346 struct rtc_device *rtc = NULL; 346 struct rtc_device *rtc = NULL;
347 347
348 dev = class_find_device(rtc_class, name, __rtc_match); 348 dev = class_find_device(rtc_class, NULL, name, __rtc_match);
349 if (dev) 349 if (dev)
350 rtc = to_rtc_device(dev); 350 rtc = to_rtc_device(dev);
351 351
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c
index 9c3db934cc24..cd32d05db773 100644
--- a/drivers/rtc/rtc-at91rm9200.c
+++ b/drivers/rtc/rtc-at91rm9200.c
@@ -171,8 +171,10 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
171 | BIN2BCD(tm.tm_mday) << 24 171 | BIN2BCD(tm.tm_mday) << 24
172 | AT91_RTC_DATEEN | AT91_RTC_MTHEN); 172 | AT91_RTC_DATEEN | AT91_RTC_MTHEN);
173 173
174 if (alrm->enabled) 174 if (alrm->enabled) {
175 at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
175 at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM); 176 at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
177 }
176 178
177 pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, 179 pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
178 at91_alarm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, 180 at91_alarm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour,
@@ -191,28 +193,22 @@ static int at91_rtc_ioctl(struct device *dev, unsigned int cmd,
191 193
192 pr_debug("%s(): cmd=%08x, arg=%08lx.\n", __func__, cmd, arg); 194 pr_debug("%s(): cmd=%08x, arg=%08lx.\n", __func__, cmd, arg);
193 195
196 /* important: scrub old status before enabling IRQs */
194 switch (cmd) { 197 switch (cmd) {
195 case RTC_AIE_OFF: /* alarm off */ 198 case RTC_AIE_OFF: /* alarm off */
196 at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM); 199 at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM);
197 break; 200 break;
198 case RTC_AIE_ON: /* alarm on */ 201 case RTC_AIE_ON: /* alarm on */
202 at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
199 at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM); 203 at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
200 break; 204 break;
201 case RTC_UIE_OFF: /* update off */ 205 case RTC_UIE_OFF: /* update off */
202 case RTC_PIE_OFF: /* periodic off */
203 at91_sys_write(AT91_RTC_IDR, AT91_RTC_SECEV); 206 at91_sys_write(AT91_RTC_IDR, AT91_RTC_SECEV);
204 break; 207 break;
205 case RTC_UIE_ON: /* update on */ 208 case RTC_UIE_ON: /* update on */
206 case RTC_PIE_ON: /* periodic on */ 209 at91_sys_write(AT91_RTC_SCCR, AT91_RTC_SECEV);
207 at91_sys_write(AT91_RTC_IER, AT91_RTC_SECEV); 210 at91_sys_write(AT91_RTC_IER, AT91_RTC_SECEV);
208 break; 211 break;
209 case RTC_IRQP_READ: /* read periodic alarm frequency */
210 ret = put_user(AT91_RTC_FREQ, (unsigned long *) arg);
211 break;
212 case RTC_IRQP_SET: /* set periodic alarm frequency */
213 if (arg != AT91_RTC_FREQ)
214 ret = -EINVAL;
215 break;
216 default: 212 default:
217 ret = -ENOIOCTLCMD; 213 ret = -ENOIOCTLCMD;
218 break; 214 break;
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index d7bb9bac71df..6ea349aba3ba 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -36,25 +36,9 @@
36#include <linux/platform_device.h> 36#include <linux/platform_device.h>
37#include <linux/mod_devicetable.h> 37#include <linux/mod_devicetable.h>
38 38
39#ifdef CONFIG_HPET_EMULATE_RTC
40#include <asm/hpet.h>
41#endif
42
43/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */ 39/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
44#include <asm-generic/rtc.h> 40#include <asm-generic/rtc.h>
45 41
46#ifndef CONFIG_HPET_EMULATE_RTC
47#define is_hpet_enabled() 0
48#define hpet_set_alarm_time(hrs, min, sec) do { } while (0)
49#define hpet_set_periodic_freq(arg) 0
50#define hpet_mask_rtc_irq_bit(arg) do { } while (0)
51#define hpet_set_rtc_irq_bit(arg) do { } while (0)
52#define hpet_rtc_timer_init() do { } while (0)
53#define hpet_register_irq_handler(h) 0
54#define hpet_unregister_irq_handler(h) do { } while (0)
55extern irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id);
56#endif
57
58struct cmos_rtc { 42struct cmos_rtc {
59 struct rtc_device *rtc; 43 struct rtc_device *rtc;
60 struct device *dev; 44 struct device *dev;
@@ -93,6 +77,72 @@ static inline int is_intr(u8 rtc_intr)
93 77
94/*----------------------------------------------------------------*/ 78/*----------------------------------------------------------------*/
95 79
80/* Much modern x86 hardware has HPETs (10+ MHz timers) which, because
81 * many BIOS programmers don't set up "sane mode" IRQ routing, are mostly
82 * used in a broken "legacy replacement" mode. The breakage includes
83 * HPET #1 hijacking the IRQ for this RTC, and being unavailable for
84 * other (better) use.
85 *
86 * When that broken mode is in use, platform glue provides a partial
87 * emulation of hardware RTC IRQ facilities using HPET #1. We don't
88 * want to use HPET for anything except those IRQs though...
89 */
90#ifdef CONFIG_HPET_EMULATE_RTC
91#include <asm/hpet.h>
92#else
93
94static inline int is_hpet_enabled(void)
95{
96 return 0;
97}
98
99static inline int hpet_mask_rtc_irq_bit(unsigned long mask)
100{
101 return 0;
102}
103
104static inline int hpet_set_rtc_irq_bit(unsigned long mask)
105{
106 return 0;
107}
108
109static inline int
110hpet_set_alarm_time(unsigned char hrs, unsigned char min, unsigned char sec)
111{
112 return 0;
113}
114
115static inline int hpet_set_periodic_freq(unsigned long freq)
116{
117 return 0;
118}
119
120static inline int hpet_rtc_dropped_irq(void)
121{
122 return 0;
123}
124
125static inline int hpet_rtc_timer_init(void)
126{
127 return 0;
128}
129
130extern irq_handler_t hpet_rtc_interrupt;
131
132static inline int hpet_register_irq_handler(irq_handler_t handler)
133{
134 return 0;
135}
136
137static inline int hpet_unregister_irq_handler(irq_handler_t handler)
138{
139 return 0;
140}
141
142#endif
143
144/*----------------------------------------------------------------*/
145
96static int cmos_read_time(struct device *dev, struct rtc_time *t) 146static int cmos_read_time(struct device *dev, struct rtc_time *t)
97{ 147{
98 /* REVISIT: if the clock has a "century" register, use 148 /* REVISIT: if the clock has a "century" register, use
@@ -185,11 +235,56 @@ static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)
185 return 0; 235 return 0;
186} 236}
187 237
238static void cmos_checkintr(struct cmos_rtc *cmos, unsigned char rtc_control)
239{
240 unsigned char rtc_intr;
241
242 /* NOTE after changing RTC_xIE bits we always read INTR_FLAGS;
243 * allegedly some older rtcs need that to handle irqs properly
244 */
245 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
246
247 if (is_hpet_enabled())
248 return;
249
250 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
251 if (is_intr(rtc_intr))
252 rtc_update_irq(cmos->rtc, 1, rtc_intr);
253}
254
255static void cmos_irq_enable(struct cmos_rtc *cmos, unsigned char mask)
256{
257 unsigned char rtc_control;
258
259 /* flush any pending IRQ status, notably for update irqs,
260 * before we enable new IRQs
261 */
262 rtc_control = CMOS_READ(RTC_CONTROL);
263 cmos_checkintr(cmos, rtc_control);
264
265 rtc_control |= mask;
266 CMOS_WRITE(rtc_control, RTC_CONTROL);
267 hpet_set_rtc_irq_bit(mask);
268
269 cmos_checkintr(cmos, rtc_control);
270}
271
272static void cmos_irq_disable(struct cmos_rtc *cmos, unsigned char mask)
273{
274 unsigned char rtc_control;
275
276 rtc_control = CMOS_READ(RTC_CONTROL);
277 rtc_control &= ~mask;
278 CMOS_WRITE(rtc_control, RTC_CONTROL);
279 hpet_mask_rtc_irq_bit(mask);
280
281 cmos_checkintr(cmos, rtc_control);
282}
283
188static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t) 284static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
189{ 285{
190 struct cmos_rtc *cmos = dev_get_drvdata(dev); 286 struct cmos_rtc *cmos = dev_get_drvdata(dev);
191 unsigned char mon, mday, hrs, min, sec; 287 unsigned char mon, mday, hrs, min, sec;
192 unsigned char rtc_control, rtc_intr;
193 288
194 if (!is_valid_irq(cmos->irq)) 289 if (!is_valid_irq(cmos->irq))
195 return -EIO; 290 return -EIO;
@@ -213,17 +308,10 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
213 sec = t->time.tm_sec; 308 sec = t->time.tm_sec;
214 sec = (sec < 60) ? BIN2BCD(sec) : 0xff; 309 sec = (sec < 60) ? BIN2BCD(sec) : 0xff;
215 310
216 hpet_set_alarm_time(t->time.tm_hour, t->time.tm_min, t->time.tm_sec);
217 spin_lock_irq(&rtc_lock); 311 spin_lock_irq(&rtc_lock);
218 312
219 /* next rtc irq must not be from previous alarm setting */ 313 /* next rtc irq must not be from previous alarm setting */
220 rtc_control = CMOS_READ(RTC_CONTROL); 314 cmos_irq_disable(cmos, RTC_AIE);
221 rtc_control &= ~RTC_AIE;
222 CMOS_WRITE(rtc_control, RTC_CONTROL);
223 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
224 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
225 if (is_intr(rtc_intr))
226 rtc_update_irq(cmos->rtc, 1, rtc_intr);
227 315
228 /* update alarm */ 316 /* update alarm */
229 CMOS_WRITE(hrs, RTC_HOURS_ALARM); 317 CMOS_WRITE(hrs, RTC_HOURS_ALARM);
@@ -237,14 +325,13 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
237 CMOS_WRITE(mon, cmos->mon_alrm); 325 CMOS_WRITE(mon, cmos->mon_alrm);
238 } 326 }
239 327
240 if (t->enabled) { 328 /* FIXME the HPET alarm glue currently ignores day_alrm
241 rtc_control |= RTC_AIE; 329 * and mon_alrm ...
242 CMOS_WRITE(rtc_control, RTC_CONTROL); 330 */
243 rtc_intr = CMOS_READ(RTC_INTR_FLAGS); 331 hpet_set_alarm_time(t->time.tm_hour, t->time.tm_min, t->time.tm_sec);
244 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; 332
245 if (is_intr(rtc_intr)) 333 if (t->enabled)
246 rtc_update_irq(cmos->rtc, 1, rtc_intr); 334 cmos_irq_enable(cmos, RTC_AIE);
247 }
248 335
249 spin_unlock_irq(&rtc_lock); 336 spin_unlock_irq(&rtc_lock);
250 337
@@ -267,8 +354,8 @@ static int cmos_irq_set_freq(struct device *dev, int freq)
267 f = 16 - f; 354 f = 16 - f;
268 355
269 spin_lock_irqsave(&rtc_lock, flags); 356 spin_lock_irqsave(&rtc_lock, flags);
270 if (!hpet_set_periodic_freq(freq)) 357 hpet_set_periodic_freq(freq);
271 CMOS_WRITE(RTC_REF_CLCK_32KHZ | f, RTC_FREQ_SELECT); 358 CMOS_WRITE(RTC_REF_CLCK_32KHZ | f, RTC_FREQ_SELECT);
272 spin_unlock_irqrestore(&rtc_lock, flags); 359 spin_unlock_irqrestore(&rtc_lock, flags);
273 360
274 return 0; 361 return 0;
@@ -277,26 +364,17 @@ static int cmos_irq_set_freq(struct device *dev, int freq)
277static int cmos_irq_set_state(struct device *dev, int enabled) 364static int cmos_irq_set_state(struct device *dev, int enabled)
278{ 365{
279 struct cmos_rtc *cmos = dev_get_drvdata(dev); 366 struct cmos_rtc *cmos = dev_get_drvdata(dev);
280 unsigned char rtc_control, rtc_intr;
281 unsigned long flags; 367 unsigned long flags;
282 368
283 if (!is_valid_irq(cmos->irq)) 369 if (!is_valid_irq(cmos->irq))
284 return -ENXIO; 370 return -ENXIO;
285 371
286 spin_lock_irqsave(&rtc_lock, flags); 372 spin_lock_irqsave(&rtc_lock, flags);
287 rtc_control = CMOS_READ(RTC_CONTROL);
288 373
289 if (enabled) 374 if (enabled)
290 rtc_control |= RTC_PIE; 375 cmos_irq_enable(cmos, RTC_PIE);
291 else 376 else
292 rtc_control &= ~RTC_PIE; 377 cmos_irq_disable(cmos, RTC_PIE);
293
294 CMOS_WRITE(rtc_control, RTC_CONTROL);
295
296 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
297 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
298 if (is_intr(rtc_intr))
299 rtc_update_irq(cmos->rtc, 1, rtc_intr);
300 378
301 spin_unlock_irqrestore(&rtc_lock, flags); 379 spin_unlock_irqrestore(&rtc_lock, flags);
302 return 0; 380 return 0;
@@ -308,7 +386,6 @@ static int
308cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) 386cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
309{ 387{
310 struct cmos_rtc *cmos = dev_get_drvdata(dev); 388 struct cmos_rtc *cmos = dev_get_drvdata(dev);
311 unsigned char rtc_control, rtc_intr;
312 unsigned long flags; 389 unsigned long flags;
313 390
314 switch (cmd) { 391 switch (cmd) {
@@ -316,51 +393,29 @@ cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
316 case RTC_AIE_ON: 393 case RTC_AIE_ON:
317 case RTC_UIE_OFF: 394 case RTC_UIE_OFF:
318 case RTC_UIE_ON: 395 case RTC_UIE_ON:
319 case RTC_PIE_OFF:
320 case RTC_PIE_ON:
321 if (!is_valid_irq(cmos->irq)) 396 if (!is_valid_irq(cmos->irq))
322 return -EINVAL; 397 return -EINVAL;
323 break; 398 break;
399 /* PIE ON/OFF is handled by cmos_irq_set_state() */
324 default: 400 default:
325 return -ENOIOCTLCMD; 401 return -ENOIOCTLCMD;
326 } 402 }
327 403
328 spin_lock_irqsave(&rtc_lock, flags); 404 spin_lock_irqsave(&rtc_lock, flags);
329 rtc_control = CMOS_READ(RTC_CONTROL);
330 switch (cmd) { 405 switch (cmd) {
331 case RTC_AIE_OFF: /* alarm off */ 406 case RTC_AIE_OFF: /* alarm off */
332 rtc_control &= ~RTC_AIE; 407 cmos_irq_disable(cmos, RTC_AIE);
333 hpet_mask_rtc_irq_bit(RTC_AIE);
334 break; 408 break;
335 case RTC_AIE_ON: /* alarm on */ 409 case RTC_AIE_ON: /* alarm on */
336 rtc_control |= RTC_AIE; 410 cmos_irq_enable(cmos, RTC_AIE);
337 hpet_set_rtc_irq_bit(RTC_AIE);
338 break; 411 break;
339 case RTC_UIE_OFF: /* update off */ 412 case RTC_UIE_OFF: /* update off */
340 rtc_control &= ~RTC_UIE; 413 cmos_irq_disable(cmos, RTC_UIE);
341 hpet_mask_rtc_irq_bit(RTC_UIE);
342 break; 414 break;
343 case RTC_UIE_ON: /* update on */ 415 case RTC_UIE_ON: /* update on */
344 rtc_control |= RTC_UIE; 416 cmos_irq_enable(cmos, RTC_UIE);
345 hpet_set_rtc_irq_bit(RTC_UIE);
346 break;
347 case RTC_PIE_OFF: /* periodic off */
348 rtc_control &= ~RTC_PIE;
349 hpet_mask_rtc_irq_bit(RTC_PIE);
350 break;
351 case RTC_PIE_ON: /* periodic on */
352 rtc_control |= RTC_PIE;
353 hpet_set_rtc_irq_bit(RTC_PIE);
354 break; 417 break;
355 } 418 }
356 if (!is_hpet_enabled())
357 CMOS_WRITE(rtc_control, RTC_CONTROL);
358
359 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
360 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
361 if (is_intr(rtc_intr))
362 rtc_update_irq(cmos->rtc, 1, rtc_intr);
363
364 spin_unlock_irqrestore(&rtc_lock, flags); 419 spin_unlock_irqrestore(&rtc_lock, flags);
365 return 0; 420 return 0;
366} 421}
@@ -502,27 +557,29 @@ static irqreturn_t cmos_interrupt(int irq, void *p)
502 u8 rtc_control; 557 u8 rtc_control;
503 558
504 spin_lock(&rtc_lock); 559 spin_lock(&rtc_lock);
505 /* 560
506 * In this case it is HPET RTC interrupt handler 561 /* When the HPET interrupt handler calls us, the interrupt
507 * calling us, with the interrupt information 562 * status is passed as arg1 instead of the irq number. But
508 * passed as arg1, instead of irq. 563 * always clear irq status, even when HPET is in the way.
564 *
565 * Note that HPET and RTC are almost certainly out of phase,
566 * giving different IRQ status ...
509 */ 567 */
568 irqstat = CMOS_READ(RTC_INTR_FLAGS);
569 rtc_control = CMOS_READ(RTC_CONTROL);
510 if (is_hpet_enabled()) 570 if (is_hpet_enabled())
511 irqstat = (unsigned long)irq & 0xF0; 571 irqstat = (unsigned long)irq & 0xF0;
512 else { 572 irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
513 irqstat = CMOS_READ(RTC_INTR_FLAGS);
514 rtc_control = CMOS_READ(RTC_CONTROL);
515 irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
516 }
517 573
518 /* All Linux RTC alarms should be treated as if they were oneshot. 574 /* All Linux RTC alarms should be treated as if they were oneshot.
519 * Similar code may be needed in system wakeup paths, in case the 575 * Similar code may be needed in system wakeup paths, in case the
520 * alarm woke the system. 576 * alarm woke the system.
521 */ 577 */
522 if (irqstat & RTC_AIE) { 578 if (irqstat & RTC_AIE) {
523 rtc_control = CMOS_READ(RTC_CONTROL);
524 rtc_control &= ~RTC_AIE; 579 rtc_control &= ~RTC_AIE;
525 CMOS_WRITE(rtc_control, RTC_CONTROL); 580 CMOS_WRITE(rtc_control, RTC_CONTROL);
581 hpet_mask_rtc_irq_bit(RTC_AIE);
582
526 CMOS_READ(RTC_INTR_FLAGS); 583 CMOS_READ(RTC_INTR_FLAGS);
527 } 584 }
528 spin_unlock(&rtc_lock); 585 spin_unlock(&rtc_lock);
@@ -629,18 +686,13 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
629 * do something about other clock frequencies. 686 * do something about other clock frequencies.
630 */ 687 */
631 cmos_rtc.rtc->irq_freq = 1024; 688 cmos_rtc.rtc->irq_freq = 1024;
632 if (!hpet_set_periodic_freq(cmos_rtc.rtc->irq_freq)) 689 hpet_set_periodic_freq(cmos_rtc.rtc->irq_freq);
633 CMOS_WRITE(RTC_REF_CLCK_32KHZ | 0x06, RTC_FREQ_SELECT); 690 CMOS_WRITE(RTC_REF_CLCK_32KHZ | 0x06, RTC_FREQ_SELECT);
691
692 /* disable irqs */
693 cmos_irq_disable(&cmos_rtc, RTC_PIE | RTC_AIE | RTC_UIE);
634 694
635 /* disable irqs.
636 *
637 * NOTE after changing RTC_xIE bits we always read INTR_FLAGS;
638 * allegedly some older rtcs need that to handle irqs properly
639 */
640 rtc_control = CMOS_READ(RTC_CONTROL); 695 rtc_control = CMOS_READ(RTC_CONTROL);
641 rtc_control &= ~(RTC_PIE | RTC_AIE | RTC_UIE);
642 CMOS_WRITE(rtc_control, RTC_CONTROL);
643 CMOS_READ(RTC_INTR_FLAGS);
644 696
645 spin_unlock_irq(&rtc_lock); 697 spin_unlock_irq(&rtc_lock);
646 698
@@ -687,7 +739,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
687 goto cleanup2; 739 goto cleanup2;
688 } 740 }
689 741
690 pr_info("%s: alarms up to one %s%s\n", 742 pr_info("%s: alarms up to one %s%s%s\n",
691 cmos_rtc.rtc->dev.bus_id, 743 cmos_rtc.rtc->dev.bus_id,
692 is_valid_irq(rtc_irq) 744 is_valid_irq(rtc_irq)
693 ? (cmos_rtc.mon_alrm 745 ? (cmos_rtc.mon_alrm
@@ -695,8 +747,8 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
695 : (cmos_rtc.day_alrm 747 : (cmos_rtc.day_alrm
696 ? "month" : "day")) 748 ? "month" : "day"))
697 : "no", 749 : "no",
698 cmos_rtc.century ? ", y3k" : "" 750 cmos_rtc.century ? ", y3k" : "",
699 ); 751 is_hpet_enabled() ? ", hpet irqs" : "");
700 752
701 return 0; 753 return 0;
702 754
@@ -713,13 +765,8 @@ cleanup0:
713 765
714static void cmos_do_shutdown(void) 766static void cmos_do_shutdown(void)
715{ 767{
716 unsigned char rtc_control;
717
718 spin_lock_irq(&rtc_lock); 768 spin_lock_irq(&rtc_lock);
719 rtc_control = CMOS_READ(RTC_CONTROL); 769 cmos_irq_disable(&cmos_rtc, RTC_IRQMASK);
720 rtc_control &= ~(RTC_PIE|RTC_AIE|RTC_UIE);
721 CMOS_WRITE(rtc_control, RTC_CONTROL);
722 CMOS_READ(RTC_INTR_FLAGS);
723 spin_unlock_irq(&rtc_lock); 770 spin_unlock_irq(&rtc_lock);
724} 771}
725 772
@@ -760,17 +807,17 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg)
760 spin_lock_irq(&rtc_lock); 807 spin_lock_irq(&rtc_lock);
761 cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL); 808 cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL);
762 if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) { 809 if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
763 unsigned char irqstat; 810 unsigned char mask;
764 811
765 if (do_wake) 812 if (do_wake)
766 tmp &= ~(RTC_PIE|RTC_UIE); 813 mask = RTC_IRQMASK & ~RTC_AIE;
767 else 814 else
768 tmp &= ~(RTC_PIE|RTC_AIE|RTC_UIE); 815 mask = RTC_IRQMASK;
816 tmp &= ~mask;
769 CMOS_WRITE(tmp, RTC_CONTROL); 817 CMOS_WRITE(tmp, RTC_CONTROL);
770 irqstat = CMOS_READ(RTC_INTR_FLAGS); 818 hpet_mask_rtc_irq_bit(mask);
771 irqstat &= (tmp & RTC_IRQMASK) | RTC_IRQF; 819
772 if (is_intr(irqstat)) 820 cmos_checkintr(cmos, tmp);
773 rtc_update_irq(cmos->rtc, 1, irqstat);
774 } 821 }
775 spin_unlock_irq(&rtc_lock); 822 spin_unlock_irq(&rtc_lock);
776 823
@@ -796,7 +843,8 @@ static int cmos_resume(struct device *dev)
796 unsigned char tmp = cmos->suspend_ctrl; 843 unsigned char tmp = cmos->suspend_ctrl;
797 844
798 /* re-enable any irqs previously active */ 845 /* re-enable any irqs previously active */
799 if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) { 846 if (tmp & RTC_IRQMASK) {
847 unsigned char mask;
800 848
801 if (cmos->enabled_wake) { 849 if (cmos->enabled_wake) {
802 if (cmos->wake_off) 850 if (cmos->wake_off)
@@ -807,18 +855,28 @@ static int cmos_resume(struct device *dev)
807 } 855 }
808 856
809 spin_lock_irq(&rtc_lock); 857 spin_lock_irq(&rtc_lock);
810 CMOS_WRITE(tmp, RTC_CONTROL); 858 do {
811 tmp = CMOS_READ(RTC_INTR_FLAGS); 859 CMOS_WRITE(tmp, RTC_CONTROL);
812 tmp &= (cmos->suspend_ctrl & RTC_IRQMASK) | RTC_IRQF; 860 hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK);
813 if (is_intr(tmp)) 861
814 rtc_update_irq(cmos->rtc, 1, tmp); 862 mask = CMOS_READ(RTC_INTR_FLAGS);
863 mask &= (tmp & RTC_IRQMASK) | RTC_IRQF;
864 if (!is_hpet_enabled() || !is_intr(mask))
865 break;
866
867 /* force one-shot behavior if HPET blocked
868 * the wake alarm's irq
869 */
870 rtc_update_irq(cmos->rtc, 1, mask);
871 tmp &= ~RTC_AIE;
872 hpet_mask_rtc_irq_bit(RTC_AIE);
873 } while (mask & RTC_AIE);
815 spin_unlock_irq(&rtc_lock); 874 spin_unlock_irq(&rtc_lock);
816 } 875 }
817 876
818 pr_debug("%s: resume, ctrl %02x\n", 877 pr_debug("%s: resume, ctrl %02x\n",
819 cmos_rtc.rtc->dev.bus_id, 878 cmos_rtc.rtc->dev.bus_id,
820 cmos->suspend_ctrl); 879 tmp);
821
822 880
823 return 0; 881 return 0;
824} 882}
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c
index 0114a78b7cbb..0a870b7e5c32 100644
--- a/drivers/rtc/rtc-dev.c
+++ b/drivers/rtc/rtc-dev.c
@@ -209,7 +209,7 @@ static unsigned int rtc_dev_poll(struct file *file, poll_table *wait)
209 return (data != 0) ? (POLLIN | POLLRDNORM) : 0; 209 return (data != 0) ? (POLLIN | POLLRDNORM) : 0;
210} 210}
211 211
212static int rtc_dev_ioctl(struct inode *inode, struct file *file, 212static long rtc_dev_ioctl(struct file *file,
213 unsigned int cmd, unsigned long arg) 213 unsigned int cmd, unsigned long arg)
214{ 214{
215 int err = 0; 215 int err = 0;
@@ -219,6 +219,10 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
219 struct rtc_wkalrm alarm; 219 struct rtc_wkalrm alarm;
220 void __user *uarg = (void __user *) arg; 220 void __user *uarg = (void __user *) arg;
221 221
222 err = mutex_lock_interruptible(&rtc->ops_lock);
223 if (err)
224 return -EBUSY;
225
222 /* check that the calling task has appropriate permissions 226 /* check that the calling task has appropriate permissions
223 * for certain ioctls. doing this check here is useful 227 * for certain ioctls. doing this check here is useful
224 * to avoid duplicate code in each driver. 228 * to avoid duplicate code in each driver.
@@ -227,26 +231,31 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
227 case RTC_EPOCH_SET: 231 case RTC_EPOCH_SET:
228 case RTC_SET_TIME: 232 case RTC_SET_TIME:
229 if (!capable(CAP_SYS_TIME)) 233 if (!capable(CAP_SYS_TIME))
230 return -EACCES; 234 err = -EACCES;
231 break; 235 break;
232 236
233 case RTC_IRQP_SET: 237 case RTC_IRQP_SET:
234 if (arg > rtc->max_user_freq && !capable(CAP_SYS_RESOURCE)) 238 if (arg > rtc->max_user_freq && !capable(CAP_SYS_RESOURCE))
235 return -EACCES; 239 err = -EACCES;
236 break; 240 break;
237 241
238 case RTC_PIE_ON: 242 case RTC_PIE_ON:
239 if (rtc->irq_freq > rtc->max_user_freq && 243 if (rtc->irq_freq > rtc->max_user_freq &&
240 !capable(CAP_SYS_RESOURCE)) 244 !capable(CAP_SYS_RESOURCE))
241 return -EACCES; 245 err = -EACCES;
242 break; 246 break;
243 } 247 }
244 248
249 if (err)
250 goto done;
251
245 /* try the driver's ioctl interface */ 252 /* try the driver's ioctl interface */
246 if (ops->ioctl) { 253 if (ops->ioctl) {
247 err = ops->ioctl(rtc->dev.parent, cmd, arg); 254 err = ops->ioctl(rtc->dev.parent, cmd, arg);
248 if (err != -ENOIOCTLCMD) 255 if (err != -ENOIOCTLCMD) {
256 mutex_unlock(&rtc->ops_lock);
249 return err; 257 return err;
258 }
250 } 259 }
251 260
252 /* if the driver does not provide the ioctl interface 261 /* if the driver does not provide the ioctl interface
@@ -265,15 +274,19 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
265 274
266 switch (cmd) { 275 switch (cmd) {
267 case RTC_ALM_READ: 276 case RTC_ALM_READ:
277 mutex_unlock(&rtc->ops_lock);
278
268 err = rtc_read_alarm(rtc, &alarm); 279 err = rtc_read_alarm(rtc, &alarm);
269 if (err < 0) 280 if (err < 0)
270 return err; 281 return err;
271 282
272 if (copy_to_user(uarg, &alarm.time, sizeof(tm))) 283 if (copy_to_user(uarg, &alarm.time, sizeof(tm)))
273 return -EFAULT; 284 err = -EFAULT;
274 break; 285 return err;
275 286
276 case RTC_ALM_SET: 287 case RTC_ALM_SET:
288 mutex_unlock(&rtc->ops_lock);
289
277 if (copy_from_user(&alarm.time, uarg, sizeof(tm))) 290 if (copy_from_user(&alarm.time, uarg, sizeof(tm)))
278 return -EFAULT; 291 return -EFAULT;
279 292
@@ -321,24 +334,26 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
321 } 334 }
322 } 335 }
323 336
324 err = rtc_set_alarm(rtc, &alarm); 337 return rtc_set_alarm(rtc, &alarm);
325 break;
326 338
327 case RTC_RD_TIME: 339 case RTC_RD_TIME:
340 mutex_unlock(&rtc->ops_lock);
341
328 err = rtc_read_time(rtc, &tm); 342 err = rtc_read_time(rtc, &tm);
329 if (err < 0) 343 if (err < 0)
330 return err; 344 return err;
331 345
332 if (copy_to_user(uarg, &tm, sizeof(tm))) 346 if (copy_to_user(uarg, &tm, sizeof(tm)))
333 return -EFAULT; 347 err = -EFAULT;
334 break; 348 return err;
335 349
336 case RTC_SET_TIME: 350 case RTC_SET_TIME:
351 mutex_unlock(&rtc->ops_lock);
352
337 if (copy_from_user(&tm, uarg, sizeof(tm))) 353 if (copy_from_user(&tm, uarg, sizeof(tm)))
338 return -EFAULT; 354 return -EFAULT;
339 355
340 err = rtc_set_time(rtc, &tm); 356 return rtc_set_time(rtc, &tm);
341 break;
342 357
343 case RTC_PIE_ON: 358 case RTC_PIE_ON:
344 err = rtc_irq_set_state(rtc, NULL, 1); 359 err = rtc_irq_set_state(rtc, NULL, 1);
@@ -376,34 +391,37 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
376 break; 391 break;
377#endif 392#endif
378 case RTC_WKALM_SET: 393 case RTC_WKALM_SET:
394 mutex_unlock(&rtc->ops_lock);
379 if (copy_from_user(&alarm, uarg, sizeof(alarm))) 395 if (copy_from_user(&alarm, uarg, sizeof(alarm)))
380 return -EFAULT; 396 return -EFAULT;
381 397
382 err = rtc_set_alarm(rtc, &alarm); 398 return rtc_set_alarm(rtc, &alarm);
383 break;
384 399
385 case RTC_WKALM_RD: 400 case RTC_WKALM_RD:
401 mutex_unlock(&rtc->ops_lock);
386 err = rtc_read_alarm(rtc, &alarm); 402 err = rtc_read_alarm(rtc, &alarm);
387 if (err < 0) 403 if (err < 0)
388 return err; 404 return err;
389 405
390 if (copy_to_user(uarg, &alarm, sizeof(alarm))) 406 if (copy_to_user(uarg, &alarm, sizeof(alarm)))
391 return -EFAULT; 407 err = -EFAULT;
392 break; 408 return err;
393 409
394#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL 410#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
395 case RTC_UIE_OFF: 411 case RTC_UIE_OFF:
396 clear_uie(rtc); 412 clear_uie(rtc);
397 return 0; 413 break;
398 414
399 case RTC_UIE_ON: 415 case RTC_UIE_ON:
400 return set_uie(rtc); 416 err = set_uie(rtc);
401#endif 417#endif
402 default: 418 default:
403 err = -ENOTTY; 419 err = -ENOTTY;
404 break; 420 break;
405 } 421 }
406 422
423done:
424 mutex_unlock(&rtc->ops_lock);
407 return err; 425 return err;
408} 426}
409 427
@@ -432,7 +450,7 @@ static const struct file_operations rtc_dev_fops = {
432 .llseek = no_llseek, 450 .llseek = no_llseek,
433 .read = rtc_dev_read, 451 .read = rtc_dev_read,
434 .poll = rtc_dev_poll, 452 .poll = rtc_dev_poll,
435 .ioctl = rtc_dev_ioctl, 453 .unlocked_ioctl = rtc_dev_ioctl,
436 .open = rtc_dev_open, 454 .open = rtc_dev_open,
437 .release = rtc_dev_release, 455 .release = rtc_dev_release,
438 .fasync = rtc_dev_fasync, 456 .fasync = rtc_dev_fasync,
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c
new file mode 100644
index 000000000000..b91d02a3ace9
--- /dev/null
+++ b/drivers/rtc/rtc-ds1305.c
@@ -0,0 +1,847 @@
1/*
2 * rtc-ds1305.c -- driver for DS1305 and DS1306 SPI RTC chips
3 *
4 * Copyright (C) 2008 David Brownell
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 */
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/bcd.h>
14#include <linux/rtc.h>
15#include <linux/workqueue.h>
16
17#include <linux/spi/spi.h>
18#include <linux/spi/ds1305.h>
19
20
21/*
22 * Registers ... mask DS1305_WRITE into register address to write,
23 * otherwise you're reading it. All non-bitmask values are BCD.
24 */
25#define DS1305_WRITE 0x80
26
27
28/* RTC date/time ... the main special cases are that we:
29 * - Need fancy "hours" encoding in 12hour mode
30 * - Don't rely on the "day-of-week" field (or tm_wday)
31 * - Are a 21st-century clock (2000 <= year < 2100)
32 */
33#define DS1305_RTC_LEN 7 /* bytes for RTC regs */
34
35#define DS1305_SEC 0x00 /* register addresses */
36#define DS1305_MIN 0x01
37#define DS1305_HOUR 0x02
38# define DS1305_HR_12 0x40 /* set == 12 hr mode */
39# define DS1305_HR_PM 0x20 /* set == PM (12hr mode) */
40#define DS1305_WDAY 0x03
41#define DS1305_MDAY 0x04
42#define DS1305_MON 0x05
43#define DS1305_YEAR 0x06
44
45
46/* The two alarms have only sec/min/hour/wday fields (ALM_LEN).
47 * DS1305_ALM_DISABLE disables a match field (some combos are bad).
48 *
49 * NOTE that since we don't use WDAY, we limit ourselves to alarms
50 * only one day into the future (vs potentially up to a week).
51 *
52 * NOTE ALSO that while we could generate once-a-second IRQs (UIE), we
53 * don't currently support them. We'd either need to do it only when
54 * no alarm is pending (not the standard model), or to use the second
55 * alarm (implying that this is a DS1305 not DS1306, *and* that either
56 * it's wired up a second IRQ we know, or that INTCN is set)
57 */
58#define DS1305_ALM_LEN 4 /* bytes for ALM regs */
59#define DS1305_ALM_DISABLE 0x80
60
61#define DS1305_ALM0(r) (0x07 + (r)) /* register addresses */
62#define DS1305_ALM1(r) (0x0b + (r))
63
64
65/* three control registers */
66#define DS1305_CONTROL_LEN 3 /* bytes of control regs */
67
68#define DS1305_CONTROL 0x0f /* register addresses */
69# define DS1305_nEOSC 0x80 /* low enables oscillator */
70# define DS1305_WP 0x40 /* write protect */
71# define DS1305_INTCN 0x04 /* clear == only int0 used */
72# define DS1306_1HZ 0x04 /* enable 1Hz output */
73# define DS1305_AEI1 0x02 /* enable ALM1 IRQ */
74# define DS1305_AEI0 0x01 /* enable ALM0 IRQ */
75#define DS1305_STATUS 0x10
76/* status has just AEIx bits, mirrored as IRQFx */
77#define DS1305_TRICKLE 0x11
78/* trickle bits are defined in <linux/spi/ds1305.h> */
79
80/* a bunch of NVRAM */
81#define DS1305_NVRAM_LEN 96 /* bytes of NVRAM */
82
83#define DS1305_NVRAM 0x20 /* register addresses */
84
85
86struct ds1305 {
87 struct spi_device *spi;
88 struct rtc_device *rtc;
89
90 struct work_struct work;
91
92 unsigned long flags;
93#define FLAG_EXITING 0
94
95 bool hr12;
96 u8 ctrl[DS1305_CONTROL_LEN];
97};
98
99
100/*----------------------------------------------------------------------*/
101
102/*
103 * Utilities ... tolerate 12-hour AM/PM notation in case of non-Linux
104 * software (like a bootloader) which may require it.
105 */
106
107static unsigned bcd2hour(u8 bcd)
108{
109 if (bcd & DS1305_HR_12) {
110 unsigned hour = 0;
111
112 bcd &= ~DS1305_HR_12;
113 if (bcd & DS1305_HR_PM) {
114 hour = 12;
115 bcd &= ~DS1305_HR_PM;
116 }
117 hour += BCD2BIN(bcd);
118 return hour - 1;
119 }
120 return BCD2BIN(bcd);
121}
122
123static u8 hour2bcd(bool hr12, int hour)
124{
125 if (hr12) {
126 hour++;
127 if (hour <= 12)
128 return DS1305_HR_12 | BIN2BCD(hour);
129 hour -= 12;
130 return DS1305_HR_12 | DS1305_HR_PM | BIN2BCD(hour);
131 }
132 return BIN2BCD(hour);
133}
134
135/*----------------------------------------------------------------------*/
136
137/*
138 * Interface to RTC framework
139 */
140
141#ifdef CONFIG_RTC_INTF_DEV
142
143/*
144 * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl)
145 */
146static int ds1305_ioctl(struct device *dev, unsigned cmd, unsigned long arg)
147{
148 struct ds1305 *ds1305 = dev_get_drvdata(dev);
149 u8 buf[2];
150 int status = -ENOIOCTLCMD;
151
152 buf[0] = DS1305_WRITE | DS1305_CONTROL;
153 buf[1] = ds1305->ctrl[0];
154
155 switch (cmd) {
156 case RTC_AIE_OFF:
157 status = 0;
158 if (!(buf[1] & DS1305_AEI0))
159 goto done;
160 buf[1] &= ~DS1305_AEI0;
161 break;
162
163 case RTC_AIE_ON:
164 status = 0;
165 if (ds1305->ctrl[0] & DS1305_AEI0)
166 goto done;
167 buf[1] |= DS1305_AEI0;
168 break;
169 }
170 if (status == 0) {
171 status = spi_write_then_read(ds1305->spi, buf, sizeof buf,
172 NULL, 0);
173 if (status >= 0)
174 ds1305->ctrl[0] = buf[1];
175 }
176
177done:
178 return status;
179}
180
181#else
182#define ds1305_ioctl NULL
183#endif
184
185/*
186 * Get/set of date and time is pretty normal.
187 */
188
189static int ds1305_get_time(struct device *dev, struct rtc_time *time)
190{
191 struct ds1305 *ds1305 = dev_get_drvdata(dev);
192 u8 addr = DS1305_SEC;
193 u8 buf[DS1305_RTC_LEN];
194 int status;
195
196 /* Use write-then-read to get all the date/time registers
197 * since dma from stack is nonportable
198 */
199 status = spi_write_then_read(ds1305->spi, &addr, sizeof addr,
200 buf, sizeof buf);
201 if (status < 0)
202 return status;
203
204 dev_vdbg(dev, "%s: %02x %02x %02x, %02x %02x %02x %02x\n",
205 "read", buf[0], buf[1], buf[2], buf[3],
206 buf[4], buf[5], buf[6]);
207
208 /* Decode the registers */
209 time->tm_sec = BCD2BIN(buf[DS1305_SEC]);
210 time->tm_min = BCD2BIN(buf[DS1305_MIN]);
211 time->tm_hour = bcd2hour(buf[DS1305_HOUR]);
212 time->tm_wday = buf[DS1305_WDAY] - 1;
213 time->tm_mday = BCD2BIN(buf[DS1305_MDAY]);
214 time->tm_mon = BCD2BIN(buf[DS1305_MON]) - 1;
215 time->tm_year = BCD2BIN(buf[DS1305_YEAR]) + 100;
216
217 dev_vdbg(dev, "%s secs=%d, mins=%d, "
218 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
219 "read", time->tm_sec, time->tm_min,
220 time->tm_hour, time->tm_mday,
221 time->tm_mon, time->tm_year, time->tm_wday);
222
223 /* Time may not be set */
224 return rtc_valid_tm(time);
225}
226
227static int ds1305_set_time(struct device *dev, struct rtc_time *time)
228{
229 struct ds1305 *ds1305 = dev_get_drvdata(dev);
230 u8 buf[1 + DS1305_RTC_LEN];
231 u8 *bp = buf;
232
233 dev_vdbg(dev, "%s secs=%d, mins=%d, "
234 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
235 "write", time->tm_sec, time->tm_min,
236 time->tm_hour, time->tm_mday,
237 time->tm_mon, time->tm_year, time->tm_wday);
238
239 /* Write registers starting at the first time/date address. */
240 *bp++ = DS1305_WRITE | DS1305_SEC;
241
242 *bp++ = BIN2BCD(time->tm_sec);
243 *bp++ = BIN2BCD(time->tm_min);
244 *bp++ = hour2bcd(ds1305->hr12, time->tm_hour);
245 *bp++ = (time->tm_wday < 7) ? (time->tm_wday + 1) : 1;
246 *bp++ = BIN2BCD(time->tm_mday);
247 *bp++ = BIN2BCD(time->tm_mon + 1);
248 *bp++ = BIN2BCD(time->tm_year - 100);
249
250 dev_dbg(dev, "%s: %02x %02x %02x, %02x %02x %02x %02x\n",
251 "write", buf[1], buf[2], buf[3],
252 buf[4], buf[5], buf[6], buf[7]);
253
254 /* use write-then-read since dma from stack is nonportable */
255 return spi_write_then_read(ds1305->spi, buf, sizeof buf,
256 NULL, 0);
257}
258
259/*
260 * Get/set of alarm is a bit funky:
261 *
262 * - First there's the inherent raciness of getting the (partitioned)
263 * status of an alarm that could trigger while we're reading parts
264 * of that status.
265 *
266 * - Second there's its limited range (we could increase it a bit by
267 * relying on WDAY), which means it will easily roll over.
268 *
269 * - Third there's the choice of two alarms and alarm signals.
270 * Here we use ALM0 and expect that nINT0 (open drain) is used;
271 * that's the only real option for DS1306 runtime alarms, and is
272 * natural on DS1305.
273 *
274 * - Fourth, there's also ALM1, and a second interrupt signal:
275 * + On DS1305 ALM1 uses nINT1 (when INTCN=1) else nINT0;
276 * + On DS1306 ALM1 only uses INT1 (an active high pulse)
277 * and it won't work when VCC1 is active.
278 *
279 * So to be most general, we should probably set both alarms to the
280 * same value, letting ALM1 be the wakeup event source on DS1306
281 * and handling several wiring options on DS1305.
282 *
283 * - Fifth, we support the polled mode (as well as possible; why not?)
284 * even when no interrupt line is wired to an IRQ.
285 */
286
287/*
288 * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl)
289 */
290static int ds1305_get_alarm(struct device *dev, struct rtc_wkalrm *alm)
291{
292 struct ds1305 *ds1305 = dev_get_drvdata(dev);
293 struct spi_device *spi = ds1305->spi;
294 u8 addr;
295 int status;
296 u8 buf[DS1305_ALM_LEN];
297
298 /* Refresh control register cache BEFORE reading ALM0 registers,
299 * since reading alarm registers acks any pending IRQ. That
300 * makes returning "pending" status a bit of a lie, but that bit
301 * of EFI status is at best fragile anyway (given IRQ handlers).
302 */
303 addr = DS1305_CONTROL;
304 status = spi_write_then_read(spi, &addr, sizeof addr,
305 ds1305->ctrl, sizeof ds1305->ctrl);
306 if (status < 0)
307 return status;
308
309 alm->enabled = !!(ds1305->ctrl[0] & DS1305_AEI0);
310 alm->pending = !!(ds1305->ctrl[1] & DS1305_AEI0);
311
312 /* get and check ALM0 registers */
313 addr = DS1305_ALM0(DS1305_SEC);
314 status = spi_write_then_read(spi, &addr, sizeof addr,
315 buf, sizeof buf);
316 if (status < 0)
317 return status;
318
319 dev_vdbg(dev, "%s: %02x %02x %02x %02x\n",
320 "alm0 read", buf[DS1305_SEC], buf[DS1305_MIN],
321 buf[DS1305_HOUR], buf[DS1305_WDAY]);
322
323 if ((DS1305_ALM_DISABLE & buf[DS1305_SEC])
324 || (DS1305_ALM_DISABLE & buf[DS1305_MIN])
325 || (DS1305_ALM_DISABLE & buf[DS1305_HOUR]))
326 return -EIO;
327
328 /* Stuff these values into alm->time and let RTC framework code
329 * fill in the rest ... and also handle rollover to tomorrow when
330 * that's needed.
331 */
332 alm->time.tm_sec = BCD2BIN(buf[DS1305_SEC]);
333 alm->time.tm_min = BCD2BIN(buf[DS1305_MIN]);
334 alm->time.tm_hour = bcd2hour(buf[DS1305_HOUR]);
335 alm->time.tm_mday = -1;
336 alm->time.tm_mon = -1;
337 alm->time.tm_year = -1;
338 /* next three fields are unused by Linux */
339 alm->time.tm_wday = -1;
340 alm->time.tm_mday = -1;
341 alm->time.tm_isdst = -1;
342
343 return 0;
344}
345
346/*
347 * Context: caller holds rtc->ops_lock (to protect ds1305->ctrl)
348 */
349static int ds1305_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
350{
351 struct ds1305 *ds1305 = dev_get_drvdata(dev);
352 struct spi_device *spi = ds1305->spi;
353 unsigned long now, later;
354 struct rtc_time tm;
355 int status;
356 u8 buf[1 + DS1305_ALM_LEN];
357
358 /* convert desired alarm to time_t */
359 status = rtc_tm_to_time(&alm->time, &later);
360 if (status < 0)
361 return status;
362
363 /* Read current time as time_t */
364 status = ds1305_get_time(dev, &tm);
365 if (status < 0)
366 return status;
367 status = rtc_tm_to_time(&tm, &now);
368 if (status < 0)
369 return status;
370
371 /* make sure alarm fires within the next 24 hours */
372 if (later <= now)
373 return -EINVAL;
374 if ((later - now) > 24 * 60 * 60)
375 return -EDOM;
376
377 /* disable alarm if needed */
378 if (ds1305->ctrl[0] & DS1305_AEI0) {
379 ds1305->ctrl[0] &= ~DS1305_AEI0;
380
381 buf[0] = DS1305_WRITE | DS1305_CONTROL;
382 buf[1] = ds1305->ctrl[0];
383 status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0);
384 if (status < 0)
385 return status;
386 }
387
388 /* write alarm */
389 buf[0] = DS1305_WRITE | DS1305_ALM0(DS1305_SEC);
390 buf[1 + DS1305_SEC] = BIN2BCD(alm->time.tm_sec);
391 buf[1 + DS1305_MIN] = BIN2BCD(alm->time.tm_min);
392 buf[1 + DS1305_HOUR] = hour2bcd(ds1305->hr12, alm->time.tm_hour);
393 buf[1 + DS1305_WDAY] = DS1305_ALM_DISABLE;
394
395 dev_dbg(dev, "%s: %02x %02x %02x %02x\n",
396 "alm0 write", buf[1 + DS1305_SEC], buf[1 + DS1305_MIN],
397 buf[1 + DS1305_HOUR], buf[1 + DS1305_WDAY]);
398
399 status = spi_write_then_read(spi, buf, sizeof buf, NULL, 0);
400 if (status < 0)
401 return status;
402
403 /* enable alarm if requested */
404 if (alm->enabled) {
405 ds1305->ctrl[0] |= DS1305_AEI0;
406
407 buf[0] = DS1305_WRITE | DS1305_CONTROL;
408 buf[1] = ds1305->ctrl[0];
409 status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0);
410 }
411
412 return status;
413}
414
415#ifdef CONFIG_PROC_FS
416
417static int ds1305_proc(struct device *dev, struct seq_file *seq)
418{
419 struct ds1305 *ds1305 = dev_get_drvdata(dev);
420 char *diodes = "no";
421 char *resistors = "";
422
423 /* ctrl[2] is treated as read-only; no locking needed */
424 if ((ds1305->ctrl[2] & 0xf0) == DS1305_TRICKLE_MAGIC) {
425 switch (ds1305->ctrl[2] & 0x0c) {
426 case DS1305_TRICKLE_DS2:
427 diodes = "2 diodes, ";
428 break;
429 case DS1305_TRICKLE_DS1:
430 diodes = "1 diode, ";
431 break;
432 default:
433 goto done;
434 }
435 switch (ds1305->ctrl[2] & 0x03) {
436 case DS1305_TRICKLE_2K:
437 resistors = "2k Ohm";
438 break;
439 case DS1305_TRICKLE_4K:
440 resistors = "4k Ohm";
441 break;
442 case DS1305_TRICKLE_8K:
443 resistors = "8k Ohm";
444 break;
445 default:
446 diodes = "no";
447 break;
448 }
449 }
450
451done:
452 return seq_printf(seq,
453 "trickle_charge\t: %s%s\n",
454 diodes, resistors);
455}
456
457#else
458#define ds1305_proc NULL
459#endif
460
461static const struct rtc_class_ops ds1305_ops = {
462 .ioctl = ds1305_ioctl,
463 .read_time = ds1305_get_time,
464 .set_time = ds1305_set_time,
465 .read_alarm = ds1305_get_alarm,
466 .set_alarm = ds1305_set_alarm,
467 .proc = ds1305_proc,
468};
469
470static void ds1305_work(struct work_struct *work)
471{
472 struct ds1305 *ds1305 = container_of(work, struct ds1305, work);
473 struct mutex *lock = &ds1305->rtc->ops_lock;
474 struct spi_device *spi = ds1305->spi;
475 u8 buf[3];
476 int status;
477
478 /* lock to protect ds1305->ctrl */
479 mutex_lock(lock);
480
481 /* Disable the IRQ, and clear its status ... for now, we "know"
482 * that if more than one alarm is active, they're in sync.
483 * Note that reading ALM data registers also clears IRQ status.
484 */
485 ds1305->ctrl[0] &= ~(DS1305_AEI1 | DS1305_AEI0);
486 ds1305->ctrl[1] = 0;
487
488 buf[0] = DS1305_WRITE | DS1305_CONTROL;
489 buf[1] = ds1305->ctrl[0];
490 buf[2] = 0;
491
492 status = spi_write_then_read(spi, buf, sizeof buf,
493 NULL, 0);
494 if (status < 0)
495 dev_dbg(&spi->dev, "clear irq --> %d\n", status);
496
497 mutex_unlock(lock);
498
499 if (!test_bit(FLAG_EXITING, &ds1305->flags))
500 enable_irq(spi->irq);
501
502 /* rtc_update_irq() requires an IRQ-disabled context */
503 local_irq_disable();
504 rtc_update_irq(ds1305->rtc, 1, RTC_AF | RTC_IRQF);
505 local_irq_enable();
506}
507
508/*
509 * This "real" IRQ handler hands off to a workqueue mostly to allow
510 * mutex locking for ds1305->ctrl ... unlike I2C, we could issue async
511 * I/O requests in IRQ context (to clear the IRQ status).
512 */
513static irqreturn_t ds1305_irq(int irq, void *p)
514{
515 struct ds1305 *ds1305 = p;
516
517 disable_irq(irq);
518 schedule_work(&ds1305->work);
519 return IRQ_HANDLED;
520}
521
522/*----------------------------------------------------------------------*/
523
524/*
525 * Interface for NVRAM
526 */
527
528static void msg_init(struct spi_message *m, struct spi_transfer *x,
529 u8 *addr, size_t count, char *tx, char *rx)
530{
531 spi_message_init(m);
532 memset(x, 0, 2 * sizeof(*x));
533
534 x->tx_buf = addr;
535 x->len = 1;
536 spi_message_add_tail(x, m);
537
538 x++;
539
540 x->tx_buf = tx;
541 x->rx_buf = rx;
542 x->len = count;
543 spi_message_add_tail(x, m);
544}
545
546static ssize_t
547ds1305_nvram_read(struct kobject *kobj, struct bin_attribute *attr,
548 char *buf, loff_t off, size_t count)
549{
550 struct spi_device *spi;
551 u8 addr;
552 struct spi_message m;
553 struct spi_transfer x[2];
554 int status;
555
556 spi = container_of(kobj, struct spi_device, dev.kobj);
557
558 if (unlikely(off >= DS1305_NVRAM_LEN))
559 return 0;
560 if (count >= DS1305_NVRAM_LEN)
561 count = DS1305_NVRAM_LEN;
562 if ((off + count) > DS1305_NVRAM_LEN)
563 count = DS1305_NVRAM_LEN - off;
564 if (unlikely(!count))
565 return count;
566
567 addr = DS1305_NVRAM + off;
568 msg_init(&m, x, &addr, count, NULL, buf);
569
570 status = spi_sync(spi, &m);
571 if (status < 0)
572 dev_err(&spi->dev, "nvram %s error %d\n", "read", status);
573 return (status < 0) ? status : count;
574}
575
576static ssize_t
577ds1305_nvram_write(struct kobject *kobj, struct bin_attribute *attr,
578 char *buf, loff_t off, size_t count)
579{
580 struct spi_device *spi;
581 u8 addr;
582 struct spi_message m;
583 struct spi_transfer x[2];
584 int status;
585
586 spi = container_of(kobj, struct spi_device, dev.kobj);
587
588 if (unlikely(off >= DS1305_NVRAM_LEN))
589 return -EFBIG;
590 if (count >= DS1305_NVRAM_LEN)
591 count = DS1305_NVRAM_LEN;
592 if ((off + count) > DS1305_NVRAM_LEN)
593 count = DS1305_NVRAM_LEN - off;
594 if (unlikely(!count))
595 return count;
596
597 addr = (DS1305_WRITE | DS1305_NVRAM) + off;
598 msg_init(&m, x, &addr, count, buf, NULL);
599
600 status = spi_sync(spi, &m);
601 if (status < 0)
602 dev_err(&spi->dev, "nvram %s error %d\n", "write", status);
603 return (status < 0) ? status : count;
604}
605
606static struct bin_attribute nvram = {
607 .attr.name = "nvram",
608 .attr.mode = S_IRUGO | S_IWUSR,
609 .attr.owner = THIS_MODULE,
610 .read = ds1305_nvram_read,
611 .write = ds1305_nvram_write,
612 .size = DS1305_NVRAM_LEN,
613};
614
615/*----------------------------------------------------------------------*/
616
617/*
618 * Interface to SPI stack
619 */
620
621static int __devinit ds1305_probe(struct spi_device *spi)
622{
623 struct ds1305 *ds1305;
624 struct rtc_device *rtc;
625 int status;
626 u8 addr, value;
627 struct ds1305_platform_data *pdata = spi->dev.platform_data;
628 bool write_ctrl = false;
629
630 /* Sanity check board setup data. This may be hooked up
631 * in 3wire mode, but we don't care. Note that unless
632 * there's an inverter in place, this needs SPI_CS_HIGH!
633 */
634 if ((spi->bits_per_word && spi->bits_per_word != 8)
635 || (spi->max_speed_hz > 2000000)
636 || !(spi->mode & SPI_CPHA))
637 return -EINVAL;
638
639 /* set up driver data */
640 ds1305 = kzalloc(sizeof *ds1305, GFP_KERNEL);
641 if (!ds1305)
642 return -ENOMEM;
643 ds1305->spi = spi;
644 spi_set_drvdata(spi, ds1305);
645
646 /* read and cache control registers */
647 addr = DS1305_CONTROL;
648 status = spi_write_then_read(spi, &addr, sizeof addr,
649 ds1305->ctrl, sizeof ds1305->ctrl);
650 if (status < 0) {
651 dev_dbg(&spi->dev, "can't %s, %d\n",
652 "read", status);
653 goto fail0;
654 }
655
656 dev_dbg(&spi->dev, "ctrl %s: %02x %02x %02x\n",
657 "read", ds1305->ctrl[0],
658 ds1305->ctrl[1], ds1305->ctrl[2]);
659
660 /* Sanity check register values ... partially compensating for the
661 * fact that SPI has no device handshake. A pullup on MISO would
662 * make these tests fail; but not all systems will have one. If
663 * some register is neither 0x00 nor 0xff, a chip is likely there.
664 */
665 if ((ds1305->ctrl[0] & 0x38) != 0 || (ds1305->ctrl[1] & 0xfc) != 0) {
666 dev_dbg(&spi->dev, "RTC chip is not present\n");
667 status = -ENODEV;
668 goto fail0;
669 }
670 if (ds1305->ctrl[2] == 0)
671 dev_dbg(&spi->dev, "chip may not be present\n");
672
673 /* enable writes if needed ... if we were paranoid it would
674 * make sense to enable them only when absolutely necessary.
675 */
676 if (ds1305->ctrl[0] & DS1305_WP) {
677 u8 buf[2];
678
679 ds1305->ctrl[0] &= ~DS1305_WP;
680
681 buf[0] = DS1305_WRITE | DS1305_CONTROL;
682 buf[1] = ds1305->ctrl[0];
683 status = spi_write_then_read(spi, buf, sizeof buf, NULL, 0);
684
685 dev_dbg(&spi->dev, "clear WP --> %d\n", status);
686 if (status < 0)
687 goto fail0;
688 }
689
690 /* on DS1305, maybe start oscillator; like most low power
691 * oscillators, it may take a second to stabilize
692 */
693 if (ds1305->ctrl[0] & DS1305_nEOSC) {
694 ds1305->ctrl[0] &= ~DS1305_nEOSC;
695 write_ctrl = true;
696 dev_warn(&spi->dev, "SET TIME!\n");
697 }
698
699 /* ack any pending IRQs */
700 if (ds1305->ctrl[1]) {
701 ds1305->ctrl[1] = 0;
702 write_ctrl = true;
703 }
704
705 /* this may need one-time (re)init */
706 if (pdata) {
707 /* maybe enable trickle charge */
708 if (((ds1305->ctrl[2] & 0xf0) != DS1305_TRICKLE_MAGIC)) {
709 ds1305->ctrl[2] = DS1305_TRICKLE_MAGIC
710 | pdata->trickle;
711 write_ctrl = true;
712 }
713
714 /* on DS1306, configure 1 Hz signal */
715 if (pdata->is_ds1306) {
716 if (pdata->en_1hz) {
717 if (!(ds1305->ctrl[0] & DS1306_1HZ)) {
718 ds1305->ctrl[0] |= DS1306_1HZ;
719 write_ctrl = true;
720 }
721 } else {
722 if (ds1305->ctrl[0] & DS1306_1HZ) {
723 ds1305->ctrl[0] &= ~DS1306_1HZ;
724 write_ctrl = true;
725 }
726 }
727 }
728 }
729
730 if (write_ctrl) {
731 u8 buf[4];
732
733 buf[0] = DS1305_WRITE | DS1305_CONTROL;
734 buf[1] = ds1305->ctrl[0];
735 buf[2] = ds1305->ctrl[1];
736 buf[3] = ds1305->ctrl[2];
737 status = spi_write_then_read(spi, buf, sizeof buf, NULL, 0);
738 if (status < 0) {
739 dev_dbg(&spi->dev, "can't %s, %d\n",
740 "write", status);
741 goto fail0;
742 }
743
744 dev_dbg(&spi->dev, "ctrl %s: %02x %02x %02x\n",
745 "write", ds1305->ctrl[0],
746 ds1305->ctrl[1], ds1305->ctrl[2]);
747 }
748
749 /* see if non-Linux software set up AM/PM mode */
750 addr = DS1305_HOUR;
751 status = spi_write_then_read(spi, &addr, sizeof addr,
752 &value, sizeof value);
753 if (status < 0) {
754 dev_dbg(&spi->dev, "read HOUR --> %d\n", status);
755 goto fail0;
756 }
757
758 ds1305->hr12 = (DS1305_HR_12 & value) != 0;
759 if (ds1305->hr12)
760 dev_dbg(&spi->dev, "AM/PM\n");
761
762 /* register RTC ... from here on, ds1305->ctrl needs locking */
763 rtc = rtc_device_register("ds1305", &spi->dev,
764 &ds1305_ops, THIS_MODULE);
765 if (IS_ERR(rtc)) {
766 status = PTR_ERR(rtc);
767 dev_dbg(&spi->dev, "register rtc --> %d\n", status);
768 goto fail0;
769 }
770 ds1305->rtc = rtc;
771
772 /* Maybe set up alarm IRQ; be ready to handle it triggering right
773 * away. NOTE that we don't share this. The signal is active low,
774 * and we can't ack it before a SPI message delay. We temporarily
775 * disable the IRQ until it's acked, which lets us work with more
776 * IRQ trigger modes (not all IRQ controllers can do falling edge).
777 */
778 if (spi->irq) {
779 INIT_WORK(&ds1305->work, ds1305_work);
780 status = request_irq(spi->irq, ds1305_irq,
781 0, dev_name(&rtc->dev), ds1305);
782 if (status < 0) {
783 dev_dbg(&spi->dev, "request_irq %d --> %d\n",
784 spi->irq, status);
785 goto fail1;
786 }
787 }
788
789 /* export NVRAM */
790 status = sysfs_create_bin_file(&spi->dev.kobj, &nvram);
791 if (status < 0) {
792 dev_dbg(&spi->dev, "register nvram --> %d\n", status);
793 goto fail2;
794 }
795
796 return 0;
797
798fail2:
799 free_irq(spi->irq, ds1305);
800fail1:
801 rtc_device_unregister(rtc);
802fail0:
803 kfree(ds1305);
804 return status;
805}
806
807static int __devexit ds1305_remove(struct spi_device *spi)
808{
809 struct ds1305 *ds1305 = spi_get_drvdata(spi);
810
811 sysfs_remove_bin_file(&spi->dev.kobj, &nvram);
812
813 /* carefully shut down irq and workqueue, if present */
814 if (spi->irq) {
815 set_bit(FLAG_EXITING, &ds1305->flags);
816 free_irq(spi->irq, ds1305);
817 flush_scheduled_work();
818 }
819
820 rtc_device_unregister(ds1305->rtc);
821 spi_set_drvdata(spi, NULL);
822 kfree(ds1305);
823 return 0;
824}
825
826static struct spi_driver ds1305_driver = {
827 .driver.name = "rtc-ds1305",
828 .driver.owner = THIS_MODULE,
829 .probe = ds1305_probe,
830 .remove = __devexit_p(ds1305_remove),
831 /* REVISIT add suspend/resume */
832};
833
834static int __init ds1305_init(void)
835{
836 return spi_register_driver(&ds1305_driver);
837}
838module_init(ds1305_init);
839
840static void __exit ds1305_exit(void)
841{
842 spi_unregister_driver(&ds1305_driver);
843}
844module_exit(ds1305_exit);
845
846MODULE_DESCRIPTION("RTC driver for DS1305 and DS1306 chips");
847MODULE_LICENSE("GPL");
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
index 0a19c06019be..24bc1689fc74 100644
--- a/drivers/rtc/rtc-m41t80.c
+++ b/drivers/rtc/rtc-m41t80.c
@@ -13,21 +13,21 @@
13 * 13 *
14 */ 14 */
15 15
16#include <linux/module.h> 16#include <linux/bcd.h>
17#include <linux/i2c.h>
17#include <linux/init.h> 18#include <linux/init.h>
18#include <linux/kernel.h> 19#include <linux/kernel.h>
20#include <linux/module.h>
21#include <linux/rtc.h>
19#include <linux/slab.h> 22#include <linux/slab.h>
20#include <linux/smp_lock.h> 23#include <linux/smp_lock.h>
21#include <linux/string.h> 24#include <linux/string.h>
22#include <linux/i2c.h>
23#include <linux/rtc.h>
24#include <linux/bcd.h>
25#ifdef CONFIG_RTC_DRV_M41T80_WDT 25#ifdef CONFIG_RTC_DRV_M41T80_WDT
26#include <linux/miscdevice.h>
27#include <linux/watchdog.h>
28#include <linux/reboot.h>
29#include <linux/fs.h> 26#include <linux/fs.h>
30#include <linux/ioctl.h> 27#include <linux/ioctl.h>
28#include <linux/miscdevice.h>
29#include <linux/reboot.h>
30#include <linux/watchdog.h>
31#endif 31#endif
32 32
33#define M41T80_REG_SSEC 0 33#define M41T80_REG_SSEC 0
@@ -631,14 +631,12 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
631 return -EFAULT; 631 return -EFAULT;
632 632
633 if (rv & WDIOS_DISABLECARD) { 633 if (rv & WDIOS_DISABLECARD) {
634 printk(KERN_INFO 634 pr_info("rtc-m41t80: disable watchdog\n");
635 "rtc-m41t80: disable watchdog\n");
636 wdt_disable(); 635 wdt_disable();
637 } 636 }
638 637
639 if (rv & WDIOS_ENABLECARD) { 638 if (rv & WDIOS_ENABLECARD) {
640 printk(KERN_INFO 639 pr_info("rtc-m41t80: enable watchdog\n");
641 "rtc-m41t80: enable watchdog\n");
642 wdt_ping(); 640 wdt_ping();
643 } 641 }
644 642
diff --git a/drivers/rtc/rtc-m41t94.c b/drivers/rtc/rtc-m41t94.c
new file mode 100644
index 000000000000..9b19499c829e
--- /dev/null
+++ b/drivers/rtc/rtc-m41t94.c
@@ -0,0 +1,173 @@
1/*
2 * Driver for ST M41T94 SPI RTC
3 *
4 * Copyright (C) 2008 Kim B. Heino
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/module.h>
12#include <linux/kernel.h>
13#include <linux/platform_device.h>
14#include <linux/rtc.h>
15#include <linux/spi/spi.h>
16#include <linux/bcd.h>
17
18#define M41T94_REG_SECONDS 0x01
19#define M41T94_REG_MINUTES 0x02
20#define M41T94_REG_HOURS 0x03
21#define M41T94_REG_WDAY 0x04
22#define M41T94_REG_DAY 0x05
23#define M41T94_REG_MONTH 0x06
24#define M41T94_REG_YEAR 0x07
25#define M41T94_REG_HT 0x0c
26
27#define M41T94_BIT_HALT 0x40
28#define M41T94_BIT_STOP 0x80
29#define M41T94_BIT_CB 0x40
30#define M41T94_BIT_CEB 0x80
31
32static int m41t94_set_time(struct device *dev, struct rtc_time *tm)
33{
34 struct spi_device *spi = to_spi_device(dev);
35 u8 buf[8]; /* write cmd + 7 registers */
36
37 dev_dbg(dev, "%s secs=%d, mins=%d, "
38 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
39 "write", tm->tm_sec, tm->tm_min,
40 tm->tm_hour, tm->tm_mday,
41 tm->tm_mon, tm->tm_year, tm->tm_wday);
42
43 buf[0] = 0x80 | M41T94_REG_SECONDS; /* write time + date */
44 buf[M41T94_REG_SECONDS] = BIN2BCD(tm->tm_sec);
45 buf[M41T94_REG_MINUTES] = BIN2BCD(tm->tm_min);
46 buf[M41T94_REG_HOURS] = BIN2BCD(tm->tm_hour);
47 buf[M41T94_REG_WDAY] = BIN2BCD(tm->tm_wday + 1);
48 buf[M41T94_REG_DAY] = BIN2BCD(tm->tm_mday);
49 buf[M41T94_REG_MONTH] = BIN2BCD(tm->tm_mon + 1);
50
51 buf[M41T94_REG_HOURS] |= M41T94_BIT_CEB;
52 if (tm->tm_year >= 100)
53 buf[M41T94_REG_HOURS] |= M41T94_BIT_CB;
54 buf[M41T94_REG_YEAR] = BIN2BCD(tm->tm_year % 100);
55
56 return spi_write(spi, buf, 8);
57}
58
59static int m41t94_read_time(struct device *dev, struct rtc_time *tm)
60{
61 struct spi_device *spi = to_spi_device(dev);
62 u8 buf[2];
63 int ret, hour;
64
65 /* clear halt update bit */
66 ret = spi_w8r8(spi, M41T94_REG_HT);
67 if (ret < 0)
68 return ret;
69 if (ret & M41T94_BIT_HALT) {
70 buf[0] = 0x80 | M41T94_REG_HT;
71 buf[1] = ret & ~M41T94_BIT_HALT;
72 spi_write(spi, buf, 2);
73 }
74
75 /* clear stop bit */
76 ret = spi_w8r8(spi, M41T94_REG_SECONDS);
77 if (ret < 0)
78 return ret;
79 if (ret & M41T94_BIT_STOP) {
80 buf[0] = 0x80 | M41T94_REG_SECONDS;
81 buf[1] = ret & ~M41T94_BIT_STOP;
82 spi_write(spi, buf, 2);
83 }
84
85 tm->tm_sec = BCD2BIN(spi_w8r8(spi, M41T94_REG_SECONDS));
86 tm->tm_min = BCD2BIN(spi_w8r8(spi, M41T94_REG_MINUTES));
87 hour = spi_w8r8(spi, M41T94_REG_HOURS);
88 tm->tm_hour = BCD2BIN(hour & 0x3f);
89 tm->tm_wday = BCD2BIN(spi_w8r8(spi, M41T94_REG_WDAY)) - 1;
90 tm->tm_mday = BCD2BIN(spi_w8r8(spi, M41T94_REG_DAY));
91 tm->tm_mon = BCD2BIN(spi_w8r8(spi, M41T94_REG_MONTH)) - 1;
92 tm->tm_year = BCD2BIN(spi_w8r8(spi, M41T94_REG_YEAR));
93 if ((hour & M41T94_BIT_CB) || !(hour & M41T94_BIT_CEB))
94 tm->tm_year += 100;
95
96 dev_dbg(dev, "%s secs=%d, mins=%d, "
97 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
98 "read", tm->tm_sec, tm->tm_min,
99 tm->tm_hour, tm->tm_mday,
100 tm->tm_mon, tm->tm_year, tm->tm_wday);
101
102 /* initial clock setting can be undefined */
103 return rtc_valid_tm(tm);
104}
105
106static const struct rtc_class_ops m41t94_rtc_ops = {
107 .read_time = m41t94_read_time,
108 .set_time = m41t94_set_time,
109};
110
111static struct spi_driver m41t94_driver;
112
113static int __devinit m41t94_probe(struct spi_device *spi)
114{
115 struct rtc_device *rtc;
116 int res;
117
118 spi->bits_per_word = 8;
119 spi_setup(spi);
120
121 res = spi_w8r8(spi, M41T94_REG_SECONDS);
122 if (res < 0) {
123 dev_err(&spi->dev, "not found.\n");
124 return res;
125 }
126
127 rtc = rtc_device_register(m41t94_driver.driver.name,
128 &spi->dev, &m41t94_rtc_ops, THIS_MODULE);
129 if (IS_ERR(rtc))
130 return PTR_ERR(rtc);
131
132 dev_set_drvdata(&spi->dev, rtc);
133
134 return 0;
135}
136
137static int __devexit m41t94_remove(struct spi_device *spi)
138{
139 struct rtc_device *rtc = platform_get_drvdata(spi);
140
141 if (rtc)
142 rtc_device_unregister(rtc);
143
144 return 0;
145}
146
147static struct spi_driver m41t94_driver = {
148 .driver = {
149 .name = "rtc-m41t94",
150 .bus = &spi_bus_type,
151 .owner = THIS_MODULE,
152 },
153 .probe = m41t94_probe,
154 .remove = __devexit_p(m41t94_remove),
155};
156
157static __init int m41t94_init(void)
158{
159 return spi_register_driver(&m41t94_driver);
160}
161
162module_init(m41t94_init);
163
164static __exit void m41t94_exit(void)
165{
166 spi_unregister_driver(&m41t94_driver);
167}
168
169module_exit(m41t94_exit);
170
171MODULE_AUTHOR("Kim B. Heino <Kim.Heino@bluegiga.com>");
172MODULE_DESCRIPTION("Driver for ST M41T94 SPI RTC");
173MODULE_LICENSE("GPL");
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
index eb23d8423f42..8876605d4d4b 100644
--- a/drivers/rtc/rtc-omap.c
+++ b/drivers/rtc/rtc-omap.c
@@ -92,18 +92,6 @@
92#define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr)) 92#define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr))
93 93
94 94
95/* platform_bus isn't hotpluggable, so for static linkage it'd be safe
96 * to get rid of probe() and remove() code ... too bad the driver struct
97 * remembers probe(), that's about 25% of the runtime footprint!!
98 */
99#ifndef MODULE
100#undef __devexit
101#undef __devexit_p
102#define __devexit __exit
103#define __devexit_p __exit_p
104#endif
105
106
107/* we rely on the rtc framework to handle locking (rtc->ops_lock), 95/* we rely on the rtc framework to handle locking (rtc->ops_lock),
108 * so the only other requirement is that register accesses which 96 * so the only other requirement is that register accesses which
109 * require BUSY to be clear are made with IRQs locally disabled 97 * require BUSY to be clear are made with IRQs locally disabled
@@ -324,7 +312,7 @@ static struct rtc_class_ops omap_rtc_ops = {
324static int omap_rtc_alarm; 312static int omap_rtc_alarm;
325static int omap_rtc_timer; 313static int omap_rtc_timer;
326 314
327static int __devinit omap_rtc_probe(struct platform_device *pdev) 315static int __init omap_rtc_probe(struct platform_device *pdev)
328{ 316{
329 struct resource *res, *mem; 317 struct resource *res, *mem;
330 struct rtc_device *rtc; 318 struct rtc_device *rtc;
@@ -440,7 +428,7 @@ fail:
440 return -EIO; 428 return -EIO;
441} 429}
442 430
443static int __devexit omap_rtc_remove(struct platform_device *pdev) 431static int __exit omap_rtc_remove(struct platform_device *pdev)
444{ 432{
445 struct rtc_device *rtc = platform_get_drvdata(pdev);; 433 struct rtc_device *rtc = platform_get_drvdata(pdev);;
446 434
@@ -498,8 +486,7 @@ static void omap_rtc_shutdown(struct platform_device *pdev)
498 486
499MODULE_ALIAS("platform:omap_rtc"); 487MODULE_ALIAS("platform:omap_rtc");
500static struct platform_driver omap_rtc_driver = { 488static struct platform_driver omap_rtc_driver = {
501 .probe = omap_rtc_probe, 489 .remove = __exit_p(omap_rtc_remove),
502 .remove = __devexit_p(omap_rtc_remove),
503 .suspend = omap_rtc_suspend, 490 .suspend = omap_rtc_suspend,
504 .resume = omap_rtc_resume, 491 .resume = omap_rtc_resume,
505 .shutdown = omap_rtc_shutdown, 492 .shutdown = omap_rtc_shutdown,
@@ -511,7 +498,7 @@ static struct platform_driver omap_rtc_driver = {
511 498
512static int __init rtc_init(void) 499static int __init rtc_init(void)
513{ 500{
514 return platform_driver_register(&omap_rtc_driver); 501 return platform_driver_probe(&omap_rtc_driver, omap_rtc_probe);
515} 502}
516module_init(rtc_init); 503module_init(rtc_init);
517 504
diff --git a/drivers/rtc/rtc-pcf8583.c b/drivers/rtc/rtc-pcf8583.c
index 3d09d8f0b1f0..d388c662bf4b 100644
--- a/drivers/rtc/rtc-pcf8583.c
+++ b/drivers/rtc/rtc-pcf8583.c
@@ -2,6 +2,7 @@
2 * drivers/rtc/rtc-pcf8583.c 2 * drivers/rtc/rtc-pcf8583.c
3 * 3 *
4 * Copyright (C) 2000 Russell King 4 * Copyright (C) 2000 Russell King
5 * Copyright (C) 2008 Wolfram Sang & Juergen Beisert, Pengutronix
5 * 6 *
6 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as 8 * it under the terms of the GNU General Public License version 2 as
@@ -14,7 +15,6 @@
14#include <linux/module.h> 15#include <linux/module.h>
15#include <linux/i2c.h> 16#include <linux/i2c.h>
16#include <linux/slab.h> 17#include <linux/slab.h>
17#include <linux/string.h>
18#include <linux/rtc.h> 18#include <linux/rtc.h>
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/errno.h> 20#include <linux/errno.h>
@@ -27,7 +27,6 @@ struct rtc_mem {
27}; 27};
28 28
29struct pcf8583 { 29struct pcf8583 {
30 struct i2c_client client;
31 struct rtc_device *rtc; 30 struct rtc_device *rtc;
32 unsigned char ctrl; 31 unsigned char ctrl;
33}; 32};
@@ -40,10 +39,6 @@ struct pcf8583 {
40#define CTRL_ALARM 0x02 39#define CTRL_ALARM 0x02
41#define CTRL_TIMER 0x01 40#define CTRL_TIMER 0x01
42 41
43static const unsigned short normal_i2c[] = { 0x50, I2C_CLIENT_END };
44
45/* Module parameters */
46I2C_CLIENT_INSMOD;
47 42
48static struct i2c_driver pcf8583_driver; 43static struct i2c_driver pcf8583_driver;
49 44
@@ -269,106 +264,60 @@ static const struct rtc_class_ops pcf8583_rtc_ops = {
269 .set_time = pcf8583_rtc_set_time, 264 .set_time = pcf8583_rtc_set_time,
270}; 265};
271 266
272static int pcf8583_probe(struct i2c_adapter *adap, int addr, int kind); 267static int pcf8583_probe(struct i2c_client *client,
273 268 const struct i2c_device_id *id)
274static int pcf8583_attach(struct i2c_adapter *adap)
275{
276 return i2c_probe(adap, &addr_data, pcf8583_probe);
277}
278
279static int pcf8583_detach(struct i2c_client *client)
280{
281 int err;
282 struct pcf8583 *pcf = i2c_get_clientdata(client);
283 struct rtc_device *rtc = pcf->rtc;
284
285 if (rtc)
286 rtc_device_unregister(rtc);
287
288 if ((err = i2c_detach_client(client)))
289 return err;
290
291 kfree(pcf);
292 return 0;
293}
294
295static struct i2c_driver pcf8583_driver = {
296 .driver = {
297 .name = "pcf8583",
298 },
299 .id = I2C_DRIVERID_PCF8583,
300 .attach_adapter = pcf8583_attach,
301 .detach_client = pcf8583_detach,
302};
303
304static int pcf8583_probe(struct i2c_adapter *adap, int addr, int kind)
305{ 269{
306 struct pcf8583 *pcf; 270 struct pcf8583 *pcf8583;
307 struct i2c_client *client;
308 struct rtc_device *rtc;
309 unsigned char buf[1], ad[1] = { 0 };
310 int err; 271 int err;
311 struct i2c_msg msgs[2] = {
312 {
313 .addr = addr,
314 .flags = 0,
315 .len = 1,
316 .buf = ad,
317 }, {
318 .addr = addr,
319 .flags = I2C_M_RD,
320 .len = 1,
321 .buf = buf,
322 }
323 };
324 272
325 if (!i2c_check_functionality(adap, I2C_FUNC_I2C)) 273 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
326 return 0; 274 return -ENODEV;
327 275
328 pcf = kzalloc(sizeof(*pcf), GFP_KERNEL); 276 pcf8583 = kzalloc(sizeof(struct pcf8583), GFP_KERNEL);
329 if (!pcf) 277 if (!pcf8583)
330 return -ENOMEM; 278 return -ENOMEM;
331 279
332 client = &pcf->client; 280 pcf8583->rtc = rtc_device_register(pcf8583_driver.driver.name,
281 &client->dev, &pcf8583_rtc_ops, THIS_MODULE);
333 282
334 client->addr = addr; 283 if (IS_ERR(pcf8583->rtc)) {
335 client->adapter = adap; 284 err = PTR_ERR(pcf8583->rtc);
336 client->driver = &pcf8583_driver;
337
338 strlcpy(client->name, pcf8583_driver.driver.name, I2C_NAME_SIZE);
339
340 if (i2c_transfer(client->adapter, msgs, 2) != 2) {
341 err = -EIO;
342 goto exit_kfree; 285 goto exit_kfree;
343 } 286 }
344 287
345 err = i2c_attach_client(client); 288 i2c_set_clientdata(client, pcf8583);
346 289 return 0;
347 if (err)
348 goto exit_kfree;
349
350 rtc = rtc_device_register(pcf8583_driver.driver.name, &client->dev,
351 &pcf8583_rtc_ops, THIS_MODULE);
352 290
353 if (IS_ERR(rtc)) { 291exit_kfree:
354 err = PTR_ERR(rtc); 292 kfree(pcf8583);
355 goto exit_detach; 293 return err;
356 } 294}
357 295
358 pcf->rtc = rtc; 296static int __devexit pcf8583_remove(struct i2c_client *client)
359 i2c_set_clientdata(client, pcf); 297{
360 set_ctrl(client, buf[0]); 298 struct pcf8583 *pcf8583 = i2c_get_clientdata(client);
361 299
300 if (pcf8583->rtc)
301 rtc_device_unregister(pcf8583->rtc);
302 kfree(pcf8583);
362 return 0; 303 return 0;
304}
363 305
364exit_detach: 306static const struct i2c_device_id pcf8583_id[] = {
365 i2c_detach_client(client); 307 { "pcf8583", 0 },
366 308 { }
367exit_kfree: 309};
368 kfree(pcf); 310MODULE_DEVICE_TABLE(i2c, pcf8583_id);
369 311
370 return err; 312static struct i2c_driver pcf8583_driver = {
371} 313 .driver = {
314 .name = "pcf8583",
315 .owner = THIS_MODULE,
316 },
317 .probe = pcf8583_probe,
318 .remove = __devexit_p(pcf8583_remove),
319 .id_table = pcf8583_id,
320};
372 321
373static __init int pcf8583_init(void) 322static __init int pcf8583_init(void)
374{ 323{
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index fed86e507fdf..54b1ebb01502 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -36,10 +36,8 @@ static struct resource *s3c_rtc_mem;
36static void __iomem *s3c_rtc_base; 36static void __iomem *s3c_rtc_base;
37static int s3c_rtc_alarmno = NO_IRQ; 37static int s3c_rtc_alarmno = NO_IRQ;
38static int s3c_rtc_tickno = NO_IRQ; 38static int s3c_rtc_tickno = NO_IRQ;
39static int s3c_rtc_freq = 1;
40 39
41static DEFINE_SPINLOCK(s3c_rtc_pie_lock); 40static DEFINE_SPINLOCK(s3c_rtc_pie_lock);
42static unsigned int tick_count;
43 41
44/* IRQ Handlers */ 42/* IRQ Handlers */
45 43
@@ -55,7 +53,7 @@ static irqreturn_t s3c_rtc_tickirq(int irq, void *id)
55{ 53{
56 struct rtc_device *rdev = id; 54 struct rtc_device *rdev = id;
57 55
58 rtc_update_irq(rdev, tick_count++, RTC_PF | RTC_IRQF); 56 rtc_update_irq(rdev, 1, RTC_PF | RTC_IRQF);
59 return IRQ_HANDLED; 57 return IRQ_HANDLED;
60} 58}
61 59
@@ -74,35 +72,37 @@ static void s3c_rtc_setaie(int to)
74 writeb(tmp, s3c_rtc_base + S3C2410_RTCALM); 72 writeb(tmp, s3c_rtc_base + S3C2410_RTCALM);
75} 73}
76 74
77static void s3c_rtc_setpie(int to) 75static int s3c_rtc_setpie(struct device *dev, int enabled)
78{ 76{
79 unsigned int tmp; 77 unsigned int tmp;
80 78
81 pr_debug("%s: pie=%d\n", __func__, to); 79 pr_debug("%s: pie=%d\n", __func__, enabled);
82 80
83 spin_lock_irq(&s3c_rtc_pie_lock); 81 spin_lock_irq(&s3c_rtc_pie_lock);
84 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & ~S3C2410_TICNT_ENABLE; 82 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & ~S3C2410_TICNT_ENABLE;
85 83
86 if (to) 84 if (enabled)
87 tmp |= S3C2410_TICNT_ENABLE; 85 tmp |= S3C2410_TICNT_ENABLE;
88 86
89 writeb(tmp, s3c_rtc_base + S3C2410_TICNT); 87 writeb(tmp, s3c_rtc_base + S3C2410_TICNT);
90 spin_unlock_irq(&s3c_rtc_pie_lock); 88 spin_unlock_irq(&s3c_rtc_pie_lock);
89
90 return 0;
91} 91}
92 92
93static void s3c_rtc_setfreq(int freq) 93static int s3c_rtc_setfreq(struct device *dev, int freq)
94{ 94{
95 unsigned int tmp; 95 unsigned int tmp;
96 96
97 spin_lock_irq(&s3c_rtc_pie_lock); 97 spin_lock_irq(&s3c_rtc_pie_lock);
98 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE;
99
100 s3c_rtc_freq = freq;
101 98
99 tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE;
102 tmp |= (128 / freq)-1; 100 tmp |= (128 / freq)-1;
103 101
104 writeb(tmp, s3c_rtc_base + S3C2410_TICNT); 102 writeb(tmp, s3c_rtc_base + S3C2410_TICNT);
105 spin_unlock_irq(&s3c_rtc_pie_lock); 103 spin_unlock_irq(&s3c_rtc_pie_lock);
104
105 return 0;
106} 106}
107 107
108/* Time read/write */ 108/* Time read/write */
@@ -267,12 +267,7 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
267 267
268 writeb(alrm_en, base + S3C2410_RTCALM); 268 writeb(alrm_en, base + S3C2410_RTCALM);
269 269
270 if (0) { 270 s3c_rtc_setaie(alrm->enabled);
271 alrm_en = readb(base + S3C2410_RTCALM);
272 alrm_en &= ~S3C2410_RTCALM_ALMEN;
273 writeb(alrm_en, base + S3C2410_RTCALM);
274 disable_irq_wake(s3c_rtc_alarmno);
275 }
276 271
277 if (alrm->enabled) 272 if (alrm->enabled)
278 enable_irq_wake(s3c_rtc_alarmno); 273 enable_irq_wake(s3c_rtc_alarmno);
@@ -282,59 +277,12 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
282 return 0; 277 return 0;
283} 278}
284 279
285static int s3c_rtc_ioctl(struct device *dev,
286 unsigned int cmd, unsigned long arg)
287{
288 unsigned int ret = -ENOIOCTLCMD;
289
290 switch (cmd) {
291 case RTC_AIE_OFF:
292 case RTC_AIE_ON:
293 s3c_rtc_setaie((cmd == RTC_AIE_ON) ? 1 : 0);
294 ret = 0;
295 break;
296
297 case RTC_PIE_OFF:
298 case RTC_PIE_ON:
299 tick_count = 0;
300 s3c_rtc_setpie((cmd == RTC_PIE_ON) ? 1 : 0);
301 ret = 0;
302 break;
303
304 case RTC_IRQP_READ:
305 ret = put_user(s3c_rtc_freq, (unsigned long __user *)arg);
306 break;
307
308 case RTC_IRQP_SET:
309 if (!is_power_of_2(arg)) {
310 ret = -EINVAL;
311 goto exit;
312 }
313
314 pr_debug("s3c2410_rtc: setting frequency %ld\n", arg);
315
316 s3c_rtc_setfreq(arg);
317 ret = 0;
318 break;
319
320 case RTC_UIE_ON:
321 case RTC_UIE_OFF:
322 ret = -EINVAL;
323 }
324
325 exit:
326 return ret;
327}
328
329static int s3c_rtc_proc(struct device *dev, struct seq_file *seq) 280static int s3c_rtc_proc(struct device *dev, struct seq_file *seq)
330{ 281{
331 unsigned int ticnt = readb(s3c_rtc_base + S3C2410_TICNT); 282 unsigned int ticnt = readb(s3c_rtc_base + S3C2410_TICNT);
332 283
333 seq_printf(seq, "periodic_IRQ\t: %s\n", 284 seq_printf(seq, "periodic_IRQ\t: %s\n",
334 (ticnt & S3C2410_TICNT_ENABLE) ? "yes" : "no" ); 285 (ticnt & S3C2410_TICNT_ENABLE) ? "yes" : "no" );
335
336 seq_printf(seq, "periodic_freq\t: %d\n", s3c_rtc_freq);
337
338 return 0; 286 return 0;
339} 287}
340 288
@@ -374,7 +322,7 @@ static void s3c_rtc_release(struct device *dev)
374 322
375 /* do not clear AIE here, it may be needed for wake */ 323 /* do not clear AIE here, it may be needed for wake */
376 324
377 s3c_rtc_setpie(0); 325 s3c_rtc_setpie(dev, 0);
378 free_irq(s3c_rtc_alarmno, rtc_dev); 326 free_irq(s3c_rtc_alarmno, rtc_dev);
379 free_irq(s3c_rtc_tickno, rtc_dev); 327 free_irq(s3c_rtc_tickno, rtc_dev);
380} 328}
@@ -382,11 +330,12 @@ static void s3c_rtc_release(struct device *dev)
382static const struct rtc_class_ops s3c_rtcops = { 330static const struct rtc_class_ops s3c_rtcops = {
383 .open = s3c_rtc_open, 331 .open = s3c_rtc_open,
384 .release = s3c_rtc_release, 332 .release = s3c_rtc_release,
385 .ioctl = s3c_rtc_ioctl,
386 .read_time = s3c_rtc_gettime, 333 .read_time = s3c_rtc_gettime,
387 .set_time = s3c_rtc_settime, 334 .set_time = s3c_rtc_settime,
388 .read_alarm = s3c_rtc_getalarm, 335 .read_alarm = s3c_rtc_getalarm,
389 .set_alarm = s3c_rtc_setalarm, 336 .set_alarm = s3c_rtc_setalarm,
337 .irq_set_freq = s3c_rtc_setfreq,
338 .irq_set_state = s3c_rtc_setpie,
390 .proc = s3c_rtc_proc, 339 .proc = s3c_rtc_proc,
391}; 340};
392 341
@@ -430,14 +379,14 @@ static void s3c_rtc_enable(struct platform_device *pdev, int en)
430 } 379 }
431} 380}
432 381
433static int s3c_rtc_remove(struct platform_device *dev) 382static int __devexit s3c_rtc_remove(struct platform_device *dev)
434{ 383{
435 struct rtc_device *rtc = platform_get_drvdata(dev); 384 struct rtc_device *rtc = platform_get_drvdata(dev);
436 385
437 platform_set_drvdata(dev, NULL); 386 platform_set_drvdata(dev, NULL);
438 rtc_device_unregister(rtc); 387 rtc_device_unregister(rtc);
439 388
440 s3c_rtc_setpie(0); 389 s3c_rtc_setpie(&dev->dev, 0);
441 s3c_rtc_setaie(0); 390 s3c_rtc_setaie(0);
442 391
443 iounmap(s3c_rtc_base); 392 iounmap(s3c_rtc_base);
@@ -447,7 +396,7 @@ static int s3c_rtc_remove(struct platform_device *dev)
447 return 0; 396 return 0;
448} 397}
449 398
450static int s3c_rtc_probe(struct platform_device *pdev) 399static int __devinit s3c_rtc_probe(struct platform_device *pdev)
451{ 400{
452 struct rtc_device *rtc; 401 struct rtc_device *rtc;
453 struct resource *res; 402 struct resource *res;
@@ -504,7 +453,7 @@ static int s3c_rtc_probe(struct platform_device *pdev)
504 pr_debug("s3c2410_rtc: RTCCON=%02x\n", 453 pr_debug("s3c2410_rtc: RTCCON=%02x\n",
505 readb(s3c_rtc_base + S3C2410_RTCCON)); 454 readb(s3c_rtc_base + S3C2410_RTCCON));
506 455
507 s3c_rtc_setfreq(s3c_rtc_freq); 456 s3c_rtc_setfreq(&pdev->dev, 1);
508 457
509 /* register RTC and exit */ 458 /* register RTC and exit */
510 459
@@ -560,7 +509,7 @@ static int s3c_rtc_resume(struct platform_device *pdev)
560 509
561static struct platform_driver s3c2410_rtcdrv = { 510static struct platform_driver s3c2410_rtcdrv = {
562 .probe = s3c_rtc_probe, 511 .probe = s3c_rtc_probe,
563 .remove = s3c_rtc_remove, 512 .remove = __devexit_p(s3c_rtc_remove),
564 .suspend = s3c_rtc_suspend, 513 .suspend = s3c_rtc_suspend,
565 .resume = s3c_rtc_resume, 514 .resume = s3c_rtc_resume,
566 .driver = { 515 .driver = {
diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c
index be9c70d0b193..884b635f028b 100644
--- a/drivers/rtc/rtc-vr41xx.c
+++ b/drivers/rtc/rtc-vr41xx.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Driver for NEC VR4100 series Real Time Clock unit. 2 * Driver for NEC VR4100 series Real Time Clock unit.
3 * 3 *
4 * Copyright (C) 2003-2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> 4 * Copyright (C) 2003-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by 7 * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
34 34
35MODULE_AUTHOR("Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>"); 35MODULE_AUTHOR("Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>");
36MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); 36MODULE_DESCRIPTION("NEC VR4100 series RTC driver");
37MODULE_LICENSE("GPL"); 37MODULE_LICENSE("GPL v2");
38 38
39/* RTC 1 registers */ 39/* RTC 1 registers */
40#define ETIMELREG 0x00 40#define ETIMELREG 0x00
@@ -82,7 +82,6 @@ static unsigned long epoch = 1970; /* Jan 1 1970 00:00:00 */
82 82
83static DEFINE_SPINLOCK(rtc_lock); 83static DEFINE_SPINLOCK(rtc_lock);
84static char rtc_name[] = "RTC"; 84static char rtc_name[] = "RTC";
85static unsigned long periodic_frequency;
86static unsigned long periodic_count; 85static unsigned long periodic_count;
87static unsigned int alarm_enabled; 86static unsigned int alarm_enabled;
88static int aie_irq = -1; 87static int aie_irq = -1;
@@ -207,10 +206,37 @@ static int vr41xx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
207 return 0; 206 return 0;
208} 207}
209 208
210static int vr41xx_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) 209static int vr41xx_rtc_irq_set_freq(struct device *dev, int freq)
211{ 210{
212 unsigned long count; 211 unsigned long count;
213 212
213 count = RTC_FREQUENCY;
214 do_div(count, freq);
215
216 periodic_count = count;
217
218 spin_lock_irq(&rtc_lock);
219
220 rtc1_write(RTCL1LREG, count);
221 rtc1_write(RTCL1HREG, count >> 16);
222
223 spin_unlock_irq(&rtc_lock);
224
225 return 0;
226}
227
228static int vr41xx_rtc_irq_set_state(struct device *dev, int enabled)
229{
230 if (enabled)
231 enable_irq(pie_irq);
232 else
233 disable_irq(pie_irq);
234
235 return 0;
236}
237
238static int vr41xx_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
239{
214 switch (cmd) { 240 switch (cmd) {
215 case RTC_AIE_ON: 241 case RTC_AIE_ON:
216 spin_lock_irq(&rtc_lock); 242 spin_lock_irq(&rtc_lock);
@@ -232,33 +258,6 @@ static int vr41xx_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long
232 258
233 spin_unlock_irq(&rtc_lock); 259 spin_unlock_irq(&rtc_lock);
234 break; 260 break;
235 case RTC_PIE_ON:
236 enable_irq(pie_irq);
237 break;
238 case RTC_PIE_OFF:
239 disable_irq(pie_irq);
240 break;
241 case RTC_IRQP_READ:
242 return put_user(periodic_frequency, (unsigned long __user *)arg);
243 break;
244 case RTC_IRQP_SET:
245 if (arg > MAX_PERIODIC_RATE)
246 return -EINVAL;
247
248 periodic_frequency = arg;
249
250 count = RTC_FREQUENCY;
251 do_div(count, arg);
252
253 periodic_count = count;
254
255 spin_lock_irq(&rtc_lock);
256
257 rtc1_write(RTCL1LREG, count);
258 rtc1_write(RTCL1HREG, count >> 16);
259
260 spin_unlock_irq(&rtc_lock);
261 break;
262 case RTC_EPOCH_READ: 261 case RTC_EPOCH_READ:
263 return put_user(epoch, (unsigned long __user *)arg); 262 return put_user(epoch, (unsigned long __user *)arg);
264 case RTC_EPOCH_SET: 263 case RTC_EPOCH_SET:
@@ -309,6 +308,8 @@ static const struct rtc_class_ops vr41xx_rtc_ops = {
309 .set_time = vr41xx_rtc_set_time, 308 .set_time = vr41xx_rtc_set_time,
310 .read_alarm = vr41xx_rtc_read_alarm, 309 .read_alarm = vr41xx_rtc_read_alarm,
311 .set_alarm = vr41xx_rtc_set_alarm, 310 .set_alarm = vr41xx_rtc_set_alarm,
311 .irq_set_freq = vr41xx_rtc_irq_set_freq,
312 .irq_set_state = vr41xx_rtc_irq_set_state,
312}; 313};
313 314
314static int __devinit rtc_probe(struct platform_device *pdev) 315static int __devinit rtc_probe(struct platform_device *pdev)
@@ -346,6 +347,8 @@ static int __devinit rtc_probe(struct platform_device *pdev)
346 goto err_iounmap_all; 347 goto err_iounmap_all;
347 } 348 }
348 349
350 rtc->max_user_freq = MAX_PERIODIC_RATE;
351
349 spin_lock_irq(&rtc_lock); 352 spin_lock_irq(&rtc_lock);
350 353
351 rtc1_write(ECMPLREG, 0); 354 rtc1_write(ECMPLREG, 0);
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c
index 81a96e019080..c3dee900a5c8 100644
--- a/drivers/s390/char/raw3270.c
+++ b/drivers/s390/char/raw3270.c
@@ -1168,17 +1168,19 @@ static int raw3270_create_attributes(struct raw3270 *rp)
1168 if (rc) 1168 if (rc)
1169 goto out; 1169 goto out;
1170 1170
1171 rp->clttydev = device_create(class3270, &rp->cdev->dev, 1171 rp->clttydev = device_create_drvdata(class3270, &rp->cdev->dev,
1172 MKDEV(IBM_TTY3270_MAJOR, rp->minor), 1172 MKDEV(IBM_TTY3270_MAJOR, rp->minor),
1173 "tty%s", rp->cdev->dev.bus_id); 1173 NULL,
1174 "tty%s", rp->cdev->dev.bus_id);
1174 if (IS_ERR(rp->clttydev)) { 1175 if (IS_ERR(rp->clttydev)) {
1175 rc = PTR_ERR(rp->clttydev); 1176 rc = PTR_ERR(rp->clttydev);
1176 goto out_ttydev; 1177 goto out_ttydev;
1177 } 1178 }
1178 1179
1179 rp->cltubdev = device_create(class3270, &rp->cdev->dev, 1180 rp->cltubdev = device_create_drvdata(class3270, &rp->cdev->dev,
1180 MKDEV(IBM_FS3270_MAJOR, rp->minor), 1181 MKDEV(IBM_FS3270_MAJOR, rp->minor),
1181 "tub%s", rp->cdev->dev.bus_id); 1182 NULL,
1183 "tub%s", rp->cdev->dev.bus_id);
1182 if (!IS_ERR(rp->cltubdev)) 1184 if (!IS_ERR(rp->cltubdev))
1183 goto out; 1185 goto out;
1184 1186
diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c
index 6dfdb7c17981..12c2a5aaf31b 100644
--- a/drivers/s390/char/tape_class.c
+++ b/drivers/s390/char/tape_class.c
@@ -69,10 +69,9 @@ struct tape_class_device *register_tape_dev(
69 if (rc) 69 if (rc)
70 goto fail_with_cdev; 70 goto fail_with_cdev;
71 71
72 tcd->class_device = device_create(tape_class, device, 72 tcd->class_device = device_create_drvdata(tape_class, device,
73 tcd->char_device->dev, 73 tcd->char_device->dev,
74 "%s", tcd->device_name 74 NULL, "%s", tcd->device_name);
75 );
76 rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0; 75 rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0;
77 if (rc) 76 if (rc)
78 goto fail_with_cdev; 77 goto fail_with_cdev;
diff --git a/drivers/s390/char/vmur.c b/drivers/s390/char/vmur.c
index b0ac44b27127..c1f352b84868 100644
--- a/drivers/s390/char/vmur.c
+++ b/drivers/s390/char/vmur.c
@@ -896,8 +896,9 @@ static int ur_set_online(struct ccw_device *cdev)
896 goto fail_free_cdev; 896 goto fail_free_cdev;
897 } 897 }
898 898
899 urd->device = device_create(vmur_class, NULL, urd->char_device->dev, 899 urd->device = device_create_drvdata(vmur_class, NULL,
900 "%s", node_id); 900 urd->char_device->dev, NULL,
901 "%s", node_id);
901 if (IS_ERR(urd->device)) { 902 if (IS_ERR(urd->device)) {
902 rc = PTR_ERR(urd->device); 903 rc = PTR_ERR(urd->device);
903 TRACE("ur_set_online: device_create rc=%d\n", rc); 904 TRACE("ur_set_online: device_create rc=%d\n", rc);
diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c
index c644669a75c2..a08b1682c8e8 100644
--- a/drivers/s390/net/claw.c
+++ b/drivers/s390/net/claw.c
@@ -58,13 +58,13 @@
58 * 1.10 Changes for Buffer allocation 58 * 1.10 Changes for Buffer allocation
59 * 1.15 Changed for 2.6 Kernel No longer compiles on 2.4 or lower 59 * 1.15 Changed for 2.6 Kernel No longer compiles on 2.4 or lower
60 * 1.25 Added Packing support 60 * 1.25 Added Packing support
61 * 1.5
61 */ 62 */
62#include <asm/ccwdev.h> 63#include <asm/ccwdev.h>
63#include <asm/ccwgroup.h> 64#include <asm/ccwgroup.h>
64#include <asm/debug.h> 65#include <asm/debug.h>
65#include <asm/idals.h> 66#include <asm/idals.h>
66#include <asm/io.h> 67#include <asm/io.h>
67
68#include <linux/bitops.h> 68#include <linux/bitops.h>
69#include <linux/ctype.h> 69#include <linux/ctype.h>
70#include <linux/delay.h> 70#include <linux/delay.h>
@@ -90,36 +90,10 @@
90#include "cu3088.h" 90#include "cu3088.h"
91#include "claw.h" 91#include "claw.h"
92 92
93MODULE_AUTHOR("Andy Richter <richtera@us.ibm.com>"); 93/*
94MODULE_DESCRIPTION("Linux for zSeries CLAW Driver\n" \ 94 CLAW uses the s390dbf file system see claw_trace and claw_setup
95 "Copyright 2000,2005 IBM Corporation\n");
96MODULE_LICENSE("GPL");
97
98/* Debugging is based on DEBUGMSG, IOTRACE, or FUNCTRACE options:
99 DEBUGMSG - Enables output of various debug messages in the code
100 IOTRACE - Enables output of CCW and other IO related traces
101 FUNCTRACE - Enables output of function entry/exit trace
102 Define any combination of above options to enable tracing
103
104 CLAW also uses the s390dbf file system see claw_trace and claw_setup
105*/ 95*/
106 96
107/* following enables tracing */
108//#define DEBUGMSG
109//#define IOTRACE
110//#define FUNCTRACE
111
112#ifdef DEBUGMSG
113#define DEBUG
114#endif
115
116#ifdef IOTRACE
117#define DEBUG
118#endif
119
120#ifdef FUNCTRACE
121#define DEBUG
122#endif
123 97
124static char debug_buffer[255]; 98static char debug_buffer[255];
125/** 99/**
@@ -146,7 +120,6 @@ claw_register_debug_facility(void)
146 claw_dbf_setup = debug_register("claw_setup", 2, 1, 8); 120 claw_dbf_setup = debug_register("claw_setup", 2, 1, 8);
147 claw_dbf_trace = debug_register("claw_trace", 2, 2, 8); 121 claw_dbf_trace = debug_register("claw_trace", 2, 2, 8);
148 if (claw_dbf_setup == NULL || claw_dbf_trace == NULL) { 122 if (claw_dbf_setup == NULL || claw_dbf_trace == NULL) {
149 printk(KERN_WARNING "Not enough memory for debug facility.\n");
150 claw_unregister_debug_facility(); 123 claw_unregister_debug_facility();
151 return -ENOMEM; 124 return -ENOMEM;
152 } 125 }
@@ -232,9 +205,6 @@ static void probe_error( struct ccwgroup_device *cgdev);
232static struct net_device_stats *claw_stats(struct net_device *dev); 205static struct net_device_stats *claw_stats(struct net_device *dev);
233static int pages_to_order_of_mag(int num_of_pages); 206static int pages_to_order_of_mag(int num_of_pages);
234static struct sk_buff *claw_pack_skb(struct claw_privbk *privptr); 207static struct sk_buff *claw_pack_skb(struct claw_privbk *privptr);
235#ifdef DEBUG
236static void dumpit (char *buf, int len);
237#endif
238/* sysfs Functions */ 208/* sysfs Functions */
239static ssize_t claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf); 209static ssize_t claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf);
240static ssize_t claw_hname_write(struct device *dev, struct device_attribute *attr, 210static ssize_t claw_hname_write(struct device *dev, struct device_attribute *attr,
@@ -263,12 +233,12 @@ static int claw_snd_disc(struct net_device *dev, struct clawctl * p_ctl);
263static int claw_snd_sys_validate_rsp(struct net_device *dev, 233static int claw_snd_sys_validate_rsp(struct net_device *dev,
264 struct clawctl * p_ctl, __u32 return_code); 234 struct clawctl * p_ctl, __u32 return_code);
265static int claw_strt_conn_req(struct net_device *dev ); 235static int claw_strt_conn_req(struct net_device *dev );
266static void claw_strt_read ( struct net_device *dev, int lock ); 236static void claw_strt_read(struct net_device *dev, int lock);
267static void claw_strt_out_IO( struct net_device *dev ); 237static void claw_strt_out_IO(struct net_device *dev);
268static void claw_free_wrt_buf( struct net_device *dev ); 238static void claw_free_wrt_buf(struct net_device *dev);
269 239
270/* Functions for unpack reads */ 240/* Functions for unpack reads */
271static void unpack_read (struct net_device *dev ); 241static void unpack_read(struct net_device *dev);
272 242
273/* ccwgroup table */ 243/* ccwgroup table */
274 244
@@ -284,7 +254,6 @@ static struct ccwgroup_driver claw_group_driver = {
284}; 254};
285 255
286/* 256/*
287*
288* Key functions 257* Key functions
289*/ 258*/
290 259
@@ -298,23 +267,14 @@ claw_probe(struct ccwgroup_device *cgdev)
298 int rc; 267 int rc;
299 struct claw_privbk *privptr=NULL; 268 struct claw_privbk *privptr=NULL;
300 269
301#ifdef FUNCTRACE 270 CLAW_DBF_TEXT(2, setup, "probe");
302 printk(KERN_INFO "%s Enter\n",__func__);
303#endif
304 CLAW_DBF_TEXT(2,setup,"probe");
305 if (!get_device(&cgdev->dev)) 271 if (!get_device(&cgdev->dev))
306 return -ENODEV; 272 return -ENODEV;
307#ifdef DEBUGMSG
308 printk(KERN_INFO "claw: variable cgdev =\n");
309 dumpit((char *)cgdev, sizeof(struct ccwgroup_device));
310#endif
311 privptr = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL); 273 privptr = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL);
312 if (privptr == NULL) { 274 if (privptr == NULL) {
313 probe_error(cgdev); 275 probe_error(cgdev);
314 put_device(&cgdev->dev); 276 put_device(&cgdev->dev);
315 printk(KERN_WARNING "Out of memory %s %s Exit Line %d \n", 277 CLAW_DBF_TEXT_(2, setup, "probex%d", -ENOMEM);
316 cgdev->cdev[0]->dev.bus_id,__func__,__LINE__);
317 CLAW_DBF_TEXT_(2,setup,"probex%d",-ENOMEM);
318 return -ENOMEM; 278 return -ENOMEM;
319 } 279 }
320 privptr->p_mtc_envelope= kzalloc( MAX_ENVELOPE_SIZE, GFP_KERNEL); 280 privptr->p_mtc_envelope= kzalloc( MAX_ENVELOPE_SIZE, GFP_KERNEL);
@@ -322,9 +282,7 @@ claw_probe(struct ccwgroup_device *cgdev)
322 if ((privptr->p_mtc_envelope==NULL) || (privptr->p_env==NULL)) { 282 if ((privptr->p_mtc_envelope==NULL) || (privptr->p_env==NULL)) {
323 probe_error(cgdev); 283 probe_error(cgdev);
324 put_device(&cgdev->dev); 284 put_device(&cgdev->dev);
325 printk(KERN_WARNING "Out of memory %s %s Exit Line %d \n", 285 CLAW_DBF_TEXT_(2, setup, "probex%d", -ENOMEM);
326 cgdev->cdev[0]->dev.bus_id,__func__,__LINE__);
327 CLAW_DBF_TEXT_(2,setup,"probex%d",-ENOMEM);
328 return -ENOMEM; 286 return -ENOMEM;
329 } 287 }
330 memcpy(privptr->p_env->adapter_name,WS_NAME_NOT_DEF,8); 288 memcpy(privptr->p_env->adapter_name,WS_NAME_NOT_DEF,8);
@@ -341,19 +299,14 @@ claw_probe(struct ccwgroup_device *cgdev)
341 put_device(&cgdev->dev); 299 put_device(&cgdev->dev);
342 printk(KERN_WARNING "add_files failed %s %s Exit Line %d \n", 300 printk(KERN_WARNING "add_files failed %s %s Exit Line %d \n",
343 cgdev->cdev[0]->dev.bus_id,__func__,__LINE__); 301 cgdev->cdev[0]->dev.bus_id,__func__,__LINE__);
344 CLAW_DBF_TEXT_(2,setup,"probex%d",rc); 302 CLAW_DBF_TEXT_(2, setup, "probex%d", rc);
345 return rc; 303 return rc;
346 } 304 }
347 printk(KERN_INFO "claw: sysfs files added for %s\n",cgdev->cdev[0]->dev.bus_id);
348 privptr->p_env->p_priv = privptr; 305 privptr->p_env->p_priv = privptr;
349 cgdev->cdev[0]->handler = claw_irq_handler; 306 cgdev->cdev[0]->handler = claw_irq_handler;
350 cgdev->cdev[1]->handler = claw_irq_handler; 307 cgdev->cdev[1]->handler = claw_irq_handler;
351 cgdev->dev.driver_data = privptr; 308 cgdev->dev.driver_data = privptr;
352#ifdef FUNCTRACE 309 CLAW_DBF_TEXT(2, setup, "prbext 0");
353 printk(KERN_INFO "claw:%s exit on line %d, "
354 "rc = 0\n",__func__,__LINE__);
355#endif
356 CLAW_DBF_TEXT(2,setup,"prbext 0");
357 310
358 return 0; 311 return 0;
359} /* end of claw_probe */ 312} /* end of claw_probe */
@@ -370,37 +323,18 @@ claw_tx(struct sk_buff *skb, struct net_device *dev)
370 unsigned long saveflags; 323 unsigned long saveflags;
371 struct chbk *p_ch; 324 struct chbk *p_ch;
372 325
373#ifdef FUNCTRACE 326 CLAW_DBF_TEXT(4, trace, "claw_tx");
374 printk(KERN_INFO "%s:%s enter\n",dev->name,__func__);
375#endif
376 CLAW_DBF_TEXT(4,trace,"claw_tx");
377 p_ch=&privptr->channel[WRITE]; 327 p_ch=&privptr->channel[WRITE];
378 if (skb == NULL) { 328 if (skb == NULL) {
379 printk(KERN_WARNING "%s: null pointer passed as sk_buffer\n",
380 dev->name);
381 privptr->stats.tx_dropped++; 329 privptr->stats.tx_dropped++;
382#ifdef FUNCTRACE 330 privptr->stats.tx_errors++;
383 printk(KERN_INFO "%s: %s() exit on line %d, rc = EIO\n", 331 CLAW_DBF_TEXT_(2, trace, "clawtx%d", -EIO);
384 dev->name,__func__, __LINE__);
385#endif
386 CLAW_DBF_TEXT_(2,trace,"clawtx%d",-EIO);
387 return -EIO; 332 return -EIO;
388 } 333 }
389
390#ifdef IOTRACE
391 printk(KERN_INFO "%s: variable sk_buff=\n",dev->name);
392 dumpit((char *) skb, sizeof(struct sk_buff));
393 printk(KERN_INFO "%s: variable dev=\n",dev->name);
394 dumpit((char *) dev, sizeof(struct net_device));
395#endif
396 spin_lock_irqsave(get_ccwdev_lock(p_ch->cdev), saveflags); 334 spin_lock_irqsave(get_ccwdev_lock(p_ch->cdev), saveflags);
397 rc=claw_hw_tx( skb, dev, 1 ); 335 rc=claw_hw_tx( skb, dev, 1 );
398 spin_unlock_irqrestore(get_ccwdev_lock(p_ch->cdev), saveflags); 336 spin_unlock_irqrestore(get_ccwdev_lock(p_ch->cdev), saveflags);
399#ifdef FUNCTRACE 337 CLAW_DBF_TEXT_(4, trace, "clawtx%d", rc);
400 printk(KERN_INFO "%s:%s exit on line %d, rc = %d\n",
401 dev->name, __func__, __LINE__, rc);
402#endif
403 CLAW_DBF_TEXT_(4,trace,"clawtx%d",rc);
404 return rc; 338 return rc;
405} /* end of claw_tx */ 339} /* end of claw_tx */
406 340
@@ -419,7 +353,7 @@ claw_pack_skb(struct claw_privbk *privptr)
419 353
420 new_skb = NULL; /* assume no dice */ 354 new_skb = NULL; /* assume no dice */
421 pkt_cnt = 0; 355 pkt_cnt = 0;
422 CLAW_DBF_TEXT(4,trace,"PackSKBe"); 356 CLAW_DBF_TEXT(4, trace, "PackSKBe");
423 if (!skb_queue_empty(&p_ch->collect_queue)) { 357 if (!skb_queue_empty(&p_ch->collect_queue)) {
424 /* some data */ 358 /* some data */
425 held_skb = skb_dequeue(&p_ch->collect_queue); 359 held_skb = skb_dequeue(&p_ch->collect_queue);
@@ -457,13 +391,8 @@ claw_pack_skb(struct claw_privbk *privptr)
457 skb_queue_head(&p_ch->collect_queue,held_skb); 391 skb_queue_head(&p_ch->collect_queue,held_skb);
458 } 392 }
459 } 393 }
460#ifdef IOTRACE
461 printk(KERN_INFO "%s: %s() Packed %d len %d\n",
462 p_env->ndev->name,
463 __func__,pkt_cnt,new_skb->len);
464#endif
465 } 394 }
466 CLAW_DBF_TEXT(4,trace,"PackSKBx"); 395 CLAW_DBF_TEXT(4, trace, "PackSKBx");
467 return new_skb; 396 return new_skb;
468} 397}
469 398
@@ -477,29 +406,12 @@ claw_change_mtu(struct net_device *dev, int new_mtu)
477{ 406{
478 struct claw_privbk *privptr=dev->priv; 407 struct claw_privbk *privptr=dev->priv;
479 int buff_size; 408 int buff_size;
480#ifdef FUNCTRACE 409 CLAW_DBF_TEXT(4, trace, "setmtu");
481 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
482#endif
483#ifdef DEBUGMSG
484 printk(KERN_INFO "variable dev =\n");
485 dumpit((char *) dev, sizeof(struct net_device));
486 printk(KERN_INFO "variable new_mtu = %d\n", new_mtu);
487#endif
488 CLAW_DBF_TEXT(4,trace,"setmtu");
489 buff_size = privptr->p_env->write_size; 410 buff_size = privptr->p_env->write_size;
490 if ((new_mtu < 60) || (new_mtu > buff_size)) { 411 if ((new_mtu < 60) || (new_mtu > buff_size)) {
491#ifdef FUNCTRACE
492 printk(KERN_INFO "%s:%s Exit on line %d, rc=EINVAL\n",
493 dev->name,
494 __func__, __LINE__);
495#endif
496 return -EINVAL; 412 return -EINVAL;
497 } 413 }
498 dev->mtu = new_mtu; 414 dev->mtu = new_mtu;
499#ifdef FUNCTRACE
500 printk(KERN_INFO "%s:%s Exit on line %d\n",dev->name,
501 __func__, __LINE__);
502#endif
503 return 0; 415 return 0;
504} /* end of claw_change_mtu */ 416} /* end of claw_change_mtu */
505 417
@@ -521,24 +433,13 @@ claw_open(struct net_device *dev)
521 struct timer_list timer; 433 struct timer_list timer;
522 struct ccwbk *p_buf; 434 struct ccwbk *p_buf;
523 435
524#ifdef FUNCTRACE 436 CLAW_DBF_TEXT(4, trace, "open");
525 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
526#endif
527 CLAW_DBF_TEXT(4,trace,"open");
528 if (!dev || (dev->name[0] == 0x00)) {
529 CLAW_DBF_TEXT(2,trace,"BadDev");
530 printk(KERN_WARNING "claw: Bad device at open failing \n");
531 return -ENODEV;
532 }
533 privptr = (struct claw_privbk *)dev->priv; 437 privptr = (struct claw_privbk *)dev->priv;
534 /* allocate and initialize CCW blocks */ 438 /* allocate and initialize CCW blocks */
535 if (privptr->buffs_alloc == 0) { 439 if (privptr->buffs_alloc == 0) {
536 rc=init_ccw_bk(dev); 440 rc=init_ccw_bk(dev);
537 if (rc) { 441 if (rc) {
538 printk(KERN_INFO "%s:%s Exit on line %d, rc=ENOMEM\n", 442 CLAW_DBF_TEXT(2, trace, "openmem");
539 dev->name,
540 __func__, __LINE__);
541 CLAW_DBF_TEXT(2,trace,"openmem");
542 return -ENOMEM; 443 return -ENOMEM;
543 } 444 }
544 } 445 }
@@ -557,7 +458,7 @@ claw_open(struct net_device *dev)
557 tasklet_init(&privptr->channel[READ].tasklet, claw_irq_tasklet, 458 tasklet_init(&privptr->channel[READ].tasklet, claw_irq_tasklet,
558 (unsigned long) &privptr->channel[READ]); 459 (unsigned long) &privptr->channel[READ]);
559 for ( i = 0; i < 2; i++) { 460 for ( i = 0; i < 2; i++) {
560 CLAW_DBF_TEXT_(2,trace,"opn_ch%d",i); 461 CLAW_DBF_TEXT_(2, trace, "opn_ch%d", i);
561 init_waitqueue_head(&privptr->channel[i].wait); 462 init_waitqueue_head(&privptr->channel[i].wait);
562 /* skb_queue_head_init(&p_ch->io_queue); */ 463 /* skb_queue_head_init(&p_ch->io_queue); */
563 if (i == WRITE) 464 if (i == WRITE)
@@ -595,15 +496,8 @@ claw_open(struct net_device *dev)
595 ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) != 0x00) || 496 ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) != 0x00) ||
596 (((privptr->channel[READ].flag | 497 (((privptr->channel[READ].flag |
597 privptr->channel[WRITE].flag) & CLAW_TIMER) != 0x00)) { 498 privptr->channel[WRITE].flag) & CLAW_TIMER) != 0x00)) {
598#ifdef DEBUGMSG
599 printk(KERN_INFO "%s: channel problems during open - read:"
600 " %02x - write: %02x\n",
601 dev->name,
602 privptr->channel[READ].last_dstat,
603 privptr->channel[WRITE].last_dstat);
604#endif
605 printk(KERN_INFO "%s: remote side is not ready\n", dev->name); 499 printk(KERN_INFO "%s: remote side is not ready\n", dev->name);
606 CLAW_DBF_TEXT(2,trace,"notrdy"); 500 CLAW_DBF_TEXT(2, trace, "notrdy");
607 501
608 for ( i = 0; i < 2; i++) { 502 for ( i = 0; i < 2; i++) {
609 spin_lock_irqsave( 503 spin_lock_irqsave(
@@ -659,23 +553,14 @@ claw_open(struct net_device *dev)
659 privptr->p_buff_read=NULL; 553 privptr->p_buff_read=NULL;
660 privptr->p_buff_write=NULL; 554 privptr->p_buff_write=NULL;
661 claw_clear_busy(dev); 555 claw_clear_busy(dev);
662#ifdef FUNCTRACE 556 CLAW_DBF_TEXT(2, trace, "open EIO");
663 printk(KERN_INFO "%s:%s Exit on line %d, rc=EIO\n",
664 dev->name,__func__,__LINE__);
665#endif
666 CLAW_DBF_TEXT(2,trace,"open EIO");
667 return -EIO; 557 return -EIO;
668 } 558 }
669 559
670 /* Send SystemValidate command */ 560 /* Send SystemValidate command */
671 561
672 claw_clear_busy(dev); 562 claw_clear_busy(dev);
673 563 CLAW_DBF_TEXT(4, trace, "openok");
674#ifdef FUNCTRACE
675 printk(KERN_INFO "%s:%s Exit on line %d, rc=0\n",
676 dev->name,__func__,__LINE__);
677#endif
678 CLAW_DBF_TEXT(4,trace,"openok");
679 return 0; 564 return 0;
680} /* end of claw_open */ 565} /* end of claw_open */
681 566
@@ -694,22 +579,14 @@ claw_irq_handler(struct ccw_device *cdev,
694 struct claw_env *p_env; 579 struct claw_env *p_env;
695 struct chbk *p_ch_r=NULL; 580 struct chbk *p_ch_r=NULL;
696 581
697 582 CLAW_DBF_TEXT(4, trace, "clawirq");
698#ifdef FUNCTRACE
699 printk(KERN_INFO "%s enter \n",__func__);
700#endif
701 CLAW_DBF_TEXT(4,trace,"clawirq");
702 /* Bypass all 'unsolicited interrupts' */ 583 /* Bypass all 'unsolicited interrupts' */
703 if (!cdev->dev.driver_data) { 584 if (!cdev->dev.driver_data) {
704 printk(KERN_WARNING "claw: unsolicited interrupt for device:" 585 printk(KERN_WARNING "claw: unsolicited interrupt for device:"
705 "%s received c-%02x d-%02x\n", 586 "%s received c-%02x d-%02x\n",
706 cdev->dev.bus_id, irb->scsw.cmd.cstat, 587 cdev->dev.bus_id, irb->scsw.cmd.cstat,
707 irb->scsw.cmd.dstat); 588 irb->scsw.cmd.dstat);
708#ifdef FUNCTRACE 589 CLAW_DBF_TEXT(2, trace, "badirq");
709 printk(KERN_INFO "claw: %s() "
710 "exit on line %d\n",__func__,__LINE__);
711#endif
712 CLAW_DBF_TEXT(2,trace,"badirq");
713 return; 590 return;
714 } 591 }
715 privptr = (struct claw_privbk *)cdev->dev.driver_data; 592 privptr = (struct claw_privbk *)cdev->dev.driver_data;
@@ -722,41 +599,25 @@ claw_irq_handler(struct ccw_device *cdev,
722 else { 599 else {
723 printk(KERN_WARNING "claw: Can't determine channel for " 600 printk(KERN_WARNING "claw: Can't determine channel for "
724 "interrupt, device %s\n", cdev->dev.bus_id); 601 "interrupt, device %s\n", cdev->dev.bus_id);
725 CLAW_DBF_TEXT(2,trace,"badchan"); 602 CLAW_DBF_TEXT(2, trace, "badchan");
726 return; 603 return;
727 } 604 }
728 CLAW_DBF_TEXT_(4,trace,"IRQCH=%d",p_ch->flag); 605 CLAW_DBF_TEXT_(4, trace, "IRQCH=%d", p_ch->flag);
729 606
730 dev = (struct net_device *) (p_ch->ndev); 607 dev = (struct net_device *) (p_ch->ndev);
731 p_env=privptr->p_env; 608 p_env=privptr->p_env;
732 609
733#ifdef IOTRACE
734 printk(KERN_INFO "%s: interrupt for device: %04x "
735 "received c-%02x d-%02x state-%02x\n",
736 dev->name, p_ch->devno, irb->scsw.cmd.cstat,
737 irb->scsw.cmd.dstat, p_ch->claw_state);
738#endif
739
740 /* Copy interruption response block. */ 610 /* Copy interruption response block. */
741 memcpy(p_ch->irb, irb, sizeof(struct irb)); 611 memcpy(p_ch->irb, irb, sizeof(struct irb));
742 612
743 /* Check for good subchannel return code, otherwise error message */ 613 /* Check for good subchannel return code, otherwise info message */
744 if (irb->scsw.cmd.cstat && !(irb->scsw.cmd.cstat & SCHN_STAT_PCI)) { 614 if (irb->scsw.cmd.cstat && !(irb->scsw.cmd.cstat & SCHN_STAT_PCI)) {
745 printk(KERN_INFO "%s: subchannel check for device: %04x -" 615 printk(KERN_INFO "%s: subchannel check for device: %04x -"
746 " Sch Stat %02x Dev Stat %02x CPA - %04x\n", 616 " Sch Stat %02x Dev Stat %02x CPA - %04x\n",
747 dev->name, p_ch->devno, 617 dev->name, p_ch->devno,
748 irb->scsw.cmd.cstat, irb->scsw.cmd.dstat, 618 irb->scsw.cmd.cstat, irb->scsw.cmd.dstat,
749 irb->scsw.cmd.cpa); 619 irb->scsw.cmd.cpa);
750#ifdef IOTRACE 620 CLAW_DBF_TEXT(2, trace, "chanchk");
751 dumpit((char *)irb,sizeof(struct irb));
752 dumpit((char *)(unsigned long)irb->scsw.cmd.cpa,
753 sizeof(struct ccw1));
754#endif
755#ifdef FUNCTRACE
756 printk(KERN_INFO "%s:%s Exit on line %d\n",
757 dev->name,__func__,__LINE__);
758#endif
759 CLAW_DBF_TEXT(2,trace,"chanchk");
760 /* return; */ 621 /* return; */
761 } 622 }
762 623
@@ -768,233 +629,138 @@ claw_irq_handler(struct ccw_device *cdev,
768 p_ch->last_dstat = irb->scsw.cmd.dstat; 629 p_ch->last_dstat = irb->scsw.cmd.dstat;
769 630
770 switch (p_ch->claw_state) { 631 switch (p_ch->claw_state) {
771 case CLAW_STOP:/* HALT_IO by claw_release (halt sequence) */ 632 case CLAW_STOP:/* HALT_IO by claw_release (halt sequence) */
772#ifdef DEBUGMSG 633 if (!((p_ch->irb->scsw.cmd.stctl & SCSW_STCTL_SEC_STATUS) ||
773 printk(KERN_INFO "%s: CLAW_STOP enter\n", dev->name); 634 (p_ch->irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND) ||
774#endif 635 (p_ch->irb->scsw.cmd.stctl ==
775 if (!((p_ch->irb->scsw.cmd.stctl & 636 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND))))
776 SCSW_STCTL_SEC_STATUS) || 637 return;
777 (p_ch->irb->scsw.cmd.stctl == 638 wake_up(&p_ch->wait); /* wake up claw_release */
778 SCSW_STCTL_STATUS_PEND) || 639 CLAW_DBF_TEXT(4, trace, "stop");
779 (p_ch->irb->scsw.cmd.stctl == 640 return;
780 (SCSW_STCTL_ALERT_STATUS | 641 case CLAW_START_HALT_IO: /* HALT_IO issued by claw_open */
781 SCSW_STCTL_STATUS_PEND)))) { 642 if (!((p_ch->irb->scsw.cmd.stctl & SCSW_STCTL_SEC_STATUS) ||
782#ifdef FUNCTRACE 643 (p_ch->irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND) ||
783 printk(KERN_INFO "%s:%s Exit on line %d\n", 644 (p_ch->irb->scsw.cmd.stctl ==
784 dev->name,__func__,__LINE__); 645 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
785#endif 646 CLAW_DBF_TEXT(4, trace, "haltio");
786 return; 647 return;
787 } 648 }
788 wake_up(&p_ch->wait); /* wake up claw_release */ 649 if (p_ch->flag == CLAW_READ) {
789 650 p_ch->claw_state = CLAW_START_READ;
790#ifdef DEBUGMSG 651 wake_up(&p_ch->wait); /* wake claw_open (READ)*/
791 printk(KERN_INFO "%s: CLAW_STOP exit\n", dev->name); 652 } else if (p_ch->flag == CLAW_WRITE) {
792#endif 653 p_ch->claw_state = CLAW_START_WRITE;
793#ifdef FUNCTRACE 654 /* send SYSTEM_VALIDATE */
794 printk(KERN_INFO "%s:%s Exit on line %d\n", 655 claw_strt_read(dev, LOCK_NO);
795 dev->name,__func__,__LINE__); 656 claw_send_control(dev,
796#endif 657 SYSTEM_VALIDATE_REQUEST,
797 CLAW_DBF_TEXT(4,trace,"stop"); 658 0, 0, 0,
798 return; 659 p_env->host_name,
799 660 p_env->adapter_name);
800 case CLAW_START_HALT_IO: /* HALT_IO issued by claw_open */ 661 } else {
801#ifdef DEBUGMSG 662 printk(KERN_WARNING "claw: unsolicited "
802 printk(KERN_INFO "%s: process CLAW_STAT_HALT_IO\n", 663 "interrupt for device:"
803 dev->name); 664 "%s received c-%02x d-%02x\n",
804#endif 665 cdev->dev.bus_id,
805 if (!((p_ch->irb->scsw.cmd.stctl & 666 irb->scsw.cmd.cstat,
806 SCSW_STCTL_SEC_STATUS) || 667 irb->scsw.cmd.dstat);
807 (p_ch->irb->scsw.cmd.stctl == 668 return;
808 SCSW_STCTL_STATUS_PEND) || 669 }
809 (p_ch->irb->scsw.cmd.stctl == 670 CLAW_DBF_TEXT(4, trace, "haltio");
810 (SCSW_STCTL_ALERT_STATUS | 671 return;
811 SCSW_STCTL_STATUS_PEND)))) { 672 case CLAW_START_READ:
812#ifdef FUNCTRACE 673 CLAW_DBF_TEXT(4, trace, "ReadIRQ");
813 printk(KERN_INFO "%s:%s Exit on line %d\n", 674 if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
814 dev->name,__func__,__LINE__); 675 clear_bit(0, (void *)&p_ch->IO_active);
815#endif 676 if ((p_ch->irb->ecw[0] & 0x41) == 0x41 ||
816 CLAW_DBF_TEXT(4,trace,"haltio"); 677 (p_ch->irb->ecw[0] & 0x40) == 0x40 ||
817 return; 678 (p_ch->irb->ecw[0]) == 0) {
818 } 679 privptr->stats.rx_errors++;
819 if (p_ch->flag == CLAW_READ) { 680 printk(KERN_INFO "%s: Restart is "
820 p_ch->claw_state = CLAW_START_READ; 681 "required after remote "
821 wake_up(&p_ch->wait); /* wake claw_open (READ)*/ 682 "side recovers \n",
822 } 683 dev->name);
684 }
685 CLAW_DBF_TEXT(4, trace, "notrdy");
686 return;
687 }
688 if ((p_ch->irb->scsw.cmd.cstat & SCHN_STAT_PCI) &&
689 (p_ch->irb->scsw.cmd.dstat == 0)) {
690 if (test_and_set_bit(CLAW_BH_ACTIVE,
691 (void *)&p_ch->flag_a) == 0)
692 tasklet_schedule(&p_ch->tasklet);
823 else 693 else
824 if (p_ch->flag == CLAW_WRITE) { 694 CLAW_DBF_TEXT(4, trace, "PCINoBH");
825 p_ch->claw_state = CLAW_START_WRITE; 695 CLAW_DBF_TEXT(4, trace, "PCI_read");
826 /* send SYSTEM_VALIDATE */ 696 return;
827 claw_strt_read(dev, LOCK_NO); 697 }
828 claw_send_control(dev, 698 if (!((p_ch->irb->scsw.cmd.stctl & SCSW_STCTL_SEC_STATUS) ||
829 SYSTEM_VALIDATE_REQUEST, 699 (p_ch->irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND) ||
830 0, 0, 0, 700 (p_ch->irb->scsw.cmd.stctl ==
831 p_env->host_name, 701 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
832 p_env->adapter_name ); 702 CLAW_DBF_TEXT(4, trace, "SPend_rd");
833 } else { 703 return;
834 printk(KERN_WARNING "claw: unsolicited " 704 }
835 "interrupt for device:" 705 clear_bit(0, (void *)&p_ch->IO_active);
836 "%s received c-%02x d-%02x\n", 706 claw_clearbit_busy(TB_RETRY, dev);
837 cdev->dev.bus_id, 707 if (test_and_set_bit(CLAW_BH_ACTIVE,
838 irb->scsw.cmd.cstat, 708 (void *)&p_ch->flag_a) == 0)
839 irb->scsw.cmd.dstat); 709 tasklet_schedule(&p_ch->tasklet);
840 return; 710 else
841 } 711 CLAW_DBF_TEXT(4, trace, "RdBHAct");
842#ifdef DEBUGMSG 712 CLAW_DBF_TEXT(4, trace, "RdIRQXit");
843 printk(KERN_INFO "%s: process CLAW_STAT_HALT_IO exit\n", 713 return;
844 dev->name); 714 case CLAW_START_WRITE:
845#endif 715 if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
846#ifdef FUNCTRACE 716 printk(KERN_INFO "%s: Unit Check Occured in "
847 printk(KERN_INFO "%s:%s Exit on line %d\n", 717 "write channel\n", dev->name);
848 dev->name,__func__,__LINE__); 718 clear_bit(0, (void *)&p_ch->IO_active);
849#endif 719 if (p_ch->irb->ecw[0] & 0x80) {
850 CLAW_DBF_TEXT(4,trace,"haltio"); 720 printk(KERN_INFO "%s: Resetting Event "
851 return; 721 "occurred:\n", dev->name);
852 case CLAW_START_READ: 722 init_timer(&p_ch->timer);
853 CLAW_DBF_TEXT(4,trace,"ReadIRQ"); 723 p_ch->timer.function =
854 if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) { 724 (void *)claw_write_retry;
855 clear_bit(0, (void *)&p_ch->IO_active); 725 p_ch->timer.data = (unsigned long)p_ch;
856 if ((p_ch->irb->ecw[0] & 0x41) == 0x41 || 726 p_ch->timer.expires = jiffies + 10*HZ;
857 (p_ch->irb->ecw[0] & 0x40) == 0x40 || 727 add_timer(&p_ch->timer);
858 (p_ch->irb->ecw[0]) == 0) 728 printk(KERN_INFO "%s: write connection "
859 { 729 "restarting\n", dev->name);
860 privptr->stats.rx_errors++; 730 }
861 printk(KERN_INFO "%s: Restart is " 731 CLAW_DBF_TEXT(4, trace, "rstrtwrt");
862 "required after remote " 732 return;
863 "side recovers \n", 733 }
864 dev->name); 734 if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) {
865 } 735 clear_bit(0, (void *)&p_ch->IO_active);
866#ifdef FUNCTRACE 736 printk(KERN_INFO "%s: Unit Exception "
867 printk(KERN_INFO "%s:%s Exit on line %d\n", 737 "Occured in write channel\n",
868 dev->name,__func__,__LINE__); 738 dev->name);
869#endif 739 }
870 CLAW_DBF_TEXT(4,trace,"notrdy"); 740 if (!((p_ch->irb->scsw.cmd.stctl & SCSW_STCTL_SEC_STATUS) ||
871 return; 741 (p_ch->irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND) ||
872 } 742 (p_ch->irb->scsw.cmd.stctl ==
873 if ((p_ch->irb->scsw.cmd.cstat & SCHN_STAT_PCI) && 743 (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
874 (p_ch->irb->scsw.cmd.dstat == 0)) { 744 CLAW_DBF_TEXT(4, trace, "writeUE");
875 if (test_and_set_bit(CLAW_BH_ACTIVE, 745 return;
876 (void *)&p_ch->flag_a) == 0) { 746 }
877 tasklet_schedule(&p_ch->tasklet); 747 clear_bit(0, (void *)&p_ch->IO_active);
878 } 748 if (claw_test_and_setbit_busy(TB_TX, dev) == 0) {
879 else { 749 claw_write_next(p_ch);
880 CLAW_DBF_TEXT(4,trace,"PCINoBH"); 750 claw_clearbit_busy(TB_TX, dev);
881 } 751 claw_clear_busy(dev);
882#ifdef FUNCTRACE 752 }
883 printk(KERN_INFO "%s:%s Exit on line %d\n", 753 p_ch_r = (struct chbk *)&privptr->channel[READ];
884 dev->name,__func__,__LINE__); 754 if (test_and_set_bit(CLAW_BH_ACTIVE,
885#endif 755 (void *)&p_ch_r->flag_a) == 0)
886 CLAW_DBF_TEXT(4,trace,"PCI_read"); 756 tasklet_schedule(&p_ch_r->tasklet);
887 return; 757 CLAW_DBF_TEXT(4, trace, "StWtExit");
888 } 758 return;
889 if (!((p_ch->irb->scsw.cmd.stctl & 759 default:
890 SCSW_STCTL_SEC_STATUS) || 760 printk(KERN_WARNING "%s: wrong selection code - irq "
891 (p_ch->irb->scsw.cmd.stctl == 761 "state=%d\n", dev->name, p_ch->claw_state);
892 SCSW_STCTL_STATUS_PEND) || 762 CLAW_DBF_TEXT(2, trace, "badIRQ");
893 (p_ch->irb->scsw.cmd.stctl == 763 return;
894 (SCSW_STCTL_ALERT_STATUS |
895 SCSW_STCTL_STATUS_PEND)))) {
896#ifdef FUNCTRACE
897 printk(KERN_INFO "%s:%s Exit on line %d\n",
898 dev->name,__func__,__LINE__);
899#endif
900 CLAW_DBF_TEXT(4,trace,"SPend_rd");
901 return;
902 }
903 clear_bit(0, (void *)&p_ch->IO_active);
904 claw_clearbit_busy(TB_RETRY,dev);
905 if (test_and_set_bit(CLAW_BH_ACTIVE,
906 (void *)&p_ch->flag_a) == 0) {
907 tasklet_schedule(&p_ch->tasklet);
908 }
909 else {
910 CLAW_DBF_TEXT(4,trace,"RdBHAct");
911 }
912
913#ifdef DEBUGMSG
914 printk(KERN_INFO "%s: process CLAW_START_READ exit\n",
915 dev->name);
916#endif
917#ifdef FUNCTRACE
918 printk(KERN_INFO "%s:%s Exit on line %d\n",
919 dev->name,__func__,__LINE__);
920#endif
921 CLAW_DBF_TEXT(4,trace,"RdIRQXit");
922 return;
923 case CLAW_START_WRITE:
924 if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
925 printk(KERN_INFO "%s: Unit Check Occured in "
926 "write channel\n",dev->name);
927 clear_bit(0, (void *)&p_ch->IO_active);
928 if (p_ch->irb->ecw[0] & 0x80 ) {
929 printk(KERN_INFO "%s: Resetting Event "
930 "occurred:\n",dev->name);
931 init_timer(&p_ch->timer);
932 p_ch->timer.function =
933 (void *)claw_write_retry;
934 p_ch->timer.data = (unsigned long)p_ch;
935 p_ch->timer.expires = jiffies + 10*HZ;
936 add_timer(&p_ch->timer);
937 printk(KERN_INFO "%s: write connection "
938 "restarting\n",dev->name);
939 }
940#ifdef FUNCTRACE
941 printk(KERN_INFO "%s:%s Exit on line %d\n",
942 dev->name,__func__,__LINE__);
943#endif
944 CLAW_DBF_TEXT(4,trace,"rstrtwrt");
945 return;
946 }
947 if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) {
948 clear_bit(0, (void *)&p_ch->IO_active);
949 printk(KERN_INFO "%s: Unit Exception "
950 "Occured in write channel\n",
951 dev->name);
952 }
953 if (!((p_ch->irb->scsw.cmd.stctl &
954 SCSW_STCTL_SEC_STATUS) ||
955 (p_ch->irb->scsw.cmd.stctl ==
956 SCSW_STCTL_STATUS_PEND) ||
957 (p_ch->irb->scsw.cmd.stctl ==
958 (SCSW_STCTL_ALERT_STATUS |
959 SCSW_STCTL_STATUS_PEND)))) {
960#ifdef FUNCTRACE
961 printk(KERN_INFO "%s:%s Exit on line %d\n",
962 dev->name,__func__,__LINE__);
963#endif
964 CLAW_DBF_TEXT(4,trace,"writeUE");
965 return;
966 }
967 clear_bit(0, (void *)&p_ch->IO_active);
968 if (claw_test_and_setbit_busy(TB_TX,dev)==0) {
969 claw_write_next(p_ch);
970 claw_clearbit_busy(TB_TX,dev);
971 claw_clear_busy(dev);
972 }
973 p_ch_r=(struct chbk *)&privptr->channel[READ];
974 if (test_and_set_bit(CLAW_BH_ACTIVE,
975 (void *)&p_ch_r->flag_a) == 0) {
976 tasklet_schedule(&p_ch_r->tasklet);
977 }
978
979#ifdef DEBUGMSG
980 printk(KERN_INFO "%s: process CLAW_START_WRITE exit\n",
981 dev->name);
982#endif
983#ifdef FUNCTRACE
984 printk(KERN_INFO "%s:%s Exit on line %d\n",
985 dev->name,__func__,__LINE__);
986#endif
987 CLAW_DBF_TEXT(4,trace,"StWtExit");
988 return;
989 default:
990 printk(KERN_WARNING "%s: wrong selection code - irq "
991 "state=%d\n",dev->name,p_ch->claw_state);
992#ifdef FUNCTRACE
993 printk(KERN_INFO "%s:%s Exit on line %d\n",
994 dev->name,__func__,__LINE__);
995#endif
996 CLAW_DBF_TEXT(2,trace,"badIRQ");
997 return;
998 } 764 }
999 765
1000} /* end of claw_irq_handler */ 766} /* end of claw_irq_handler */
@@ -1013,29 +779,11 @@ claw_irq_tasklet ( unsigned long data )
1013 779
1014 p_ch = (struct chbk *) data; 780 p_ch = (struct chbk *) data;
1015 dev = (struct net_device *)p_ch->ndev; 781 dev = (struct net_device *)p_ch->ndev;
1016#ifdef FUNCTRACE 782 CLAW_DBF_TEXT(4, trace, "IRQtask");
1017 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
1018#endif
1019#ifdef DEBUGMSG
1020 printk(KERN_INFO "%s: variable p_ch =\n",dev->name);
1021 dumpit((char *) p_ch, sizeof(struct chbk));
1022#endif
1023 CLAW_DBF_TEXT(4,trace,"IRQtask");
1024
1025 privptr = (struct claw_privbk *) dev->priv; 783 privptr = (struct claw_privbk *) dev->priv;
1026
1027#ifdef DEBUGMSG
1028 printk(KERN_INFO "%s: bh routine - state-%02x\n" ,
1029 dev->name, p_ch->claw_state);
1030#endif
1031
1032 unpack_read(dev); 784 unpack_read(dev);
1033 clear_bit(CLAW_BH_ACTIVE, (void *)&p_ch->flag_a); 785 clear_bit(CLAW_BH_ACTIVE, (void *)&p_ch->flag_a);
1034 CLAW_DBF_TEXT(4,trace,"TskletXt"); 786 CLAW_DBF_TEXT(4, trace, "TskletXt");
1035#ifdef FUNCTRACE
1036 printk(KERN_INFO "%s:%s Exit on line %d\n",
1037 dev->name,__func__,__LINE__);
1038#endif
1039 return; 787 return;
1040} /* end of claw_irq_bh */ 788} /* end of claw_irq_bh */
1041 789
@@ -1060,16 +808,7 @@ claw_release(struct net_device *dev)
1060 privptr = (struct claw_privbk *) dev->priv; 808 privptr = (struct claw_privbk *) dev->priv;
1061 if (!privptr) 809 if (!privptr)
1062 return 0; 810 return 0;
1063#ifdef FUNCTRACE 811 CLAW_DBF_TEXT(4, trace, "release");
1064 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
1065#endif
1066 CLAW_DBF_TEXT(4,trace,"release");
1067#ifdef DEBUGMSG
1068 printk(KERN_INFO "%s: variable dev =\n",dev->name);
1069 dumpit((char *) dev, sizeof(struct net_device));
1070 printk(KERN_INFO "Priv Buffalloc %d\n",privptr->buffs_alloc);
1071 printk(KERN_INFO "Priv p_buff_ccw = %p\n",&privptr->p_buff_ccw);
1072#endif
1073 privptr->release_pend=1; 812 privptr->release_pend=1;
1074 claw_setbit_busy(TB_STOP,dev); 813 claw_setbit_busy(TB_STOP,dev);
1075 for ( i = 1; i >=0 ; i--) { 814 for ( i = 1; i >=0 ; i--) {
@@ -1101,19 +840,15 @@ claw_release(struct net_device *dev)
1101 privptr->pk_skb = NULL; 840 privptr->pk_skb = NULL;
1102 } 841 }
1103 if(privptr->buffs_alloc != 1) { 842 if(privptr->buffs_alloc != 1) {
1104#ifdef FUNCTRACE 843 CLAW_DBF_TEXT(4, trace, "none2fre");
1105 printk(KERN_INFO "%s:%s Exit on line %d\n",
1106 dev->name,__func__,__LINE__);
1107#endif
1108 CLAW_DBF_TEXT(4,trace,"none2fre");
1109 return 0; 844 return 0;
1110 } 845 }
1111 CLAW_DBF_TEXT(4,trace,"freebufs"); 846 CLAW_DBF_TEXT(4, trace, "freebufs");
1112 if (privptr->p_buff_ccw != NULL) { 847 if (privptr->p_buff_ccw != NULL) {
1113 free_pages((unsigned long)privptr->p_buff_ccw, 848 free_pages((unsigned long)privptr->p_buff_ccw,
1114 (int)pages_to_order_of_mag(privptr->p_buff_ccw_num)); 849 (int)pages_to_order_of_mag(privptr->p_buff_ccw_num));
1115 } 850 }
1116 CLAW_DBF_TEXT(4,trace,"freeread"); 851 CLAW_DBF_TEXT(4, trace, "freeread");
1117 if (privptr->p_env->read_size < PAGE_SIZE) { 852 if (privptr->p_env->read_size < PAGE_SIZE) {
1118 if (privptr->p_buff_read != NULL) { 853 if (privptr->p_buff_read != NULL) {
1119 free_pages((unsigned long)privptr->p_buff_read, 854 free_pages((unsigned long)privptr->p_buff_read,
@@ -1129,7 +864,7 @@ claw_release(struct net_device *dev)
1129 p_buf=p_buf->next; 864 p_buf=p_buf->next;
1130 } 865 }
1131 } 866 }
1132 CLAW_DBF_TEXT(4,trace,"freewrit"); 867 CLAW_DBF_TEXT(4, trace, "freewrit");
1133 if (privptr->p_env->write_size < PAGE_SIZE ) { 868 if (privptr->p_env->write_size < PAGE_SIZE ) {
1134 free_pages((unsigned long)privptr->p_buff_write, 869 free_pages((unsigned long)privptr->p_buff_write,
1135 (int)pages_to_order_of_mag(privptr->p_buff_write_num)); 870 (int)pages_to_order_of_mag(privptr->p_buff_write_num));
@@ -1143,7 +878,7 @@ claw_release(struct net_device *dev)
1143 p_buf=p_buf->next; 878 p_buf=p_buf->next;
1144 } 879 }
1145 } 880 }
1146 CLAW_DBF_TEXT(4,trace,"clearptr"); 881 CLAW_DBF_TEXT(4, trace, "clearptr");
1147 privptr->buffs_alloc = 0; 882 privptr->buffs_alloc = 0;
1148 privptr->p_buff_ccw=NULL; 883 privptr->p_buff_ccw=NULL;
1149 privptr->p_buff_read=NULL; 884 privptr->p_buff_read=NULL;
@@ -1180,18 +915,12 @@ claw_release(struct net_device *dev)
1180 dev->name, 915 dev->name,
1181 privptr->channel[READ].last_dstat, 916 privptr->channel[READ].last_dstat,
1182 privptr->channel[WRITE].last_dstat); 917 privptr->channel[WRITE].last_dstat);
1183 CLAW_DBF_TEXT(2,trace,"badclose"); 918 CLAW_DBF_TEXT(2, trace, "badclose");
1184 } 919 }
1185#ifdef FUNCTRACE 920 CLAW_DBF_TEXT(4, trace, "rlsexit");
1186 printk(KERN_INFO "%s:%s Exit on line %d\n",
1187 dev->name,__func__,__LINE__);
1188#endif
1189 CLAW_DBF_TEXT(4,trace,"rlsexit");
1190 return 0; 921 return 0;
1191} /* end of claw_release */ 922} /* end of claw_release */
1192 923
1193
1194
1195/*-------------------------------------------------------------------* 924/*-------------------------------------------------------------------*
1196* claw_write_retry * 925* claw_write_retry *
1197* * 926* *
@@ -1203,32 +932,12 @@ claw_write_retry ( struct chbk *p_ch )
1203 932
1204 struct net_device *dev=p_ch->ndev; 933 struct net_device *dev=p_ch->ndev;
1205 934
1206 935 CLAW_DBF_TEXT(4, trace, "w_retry");
1207#ifdef FUNCTRACE
1208 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__);
1209 printk(KERN_INFO "claw: variable p_ch =\n");
1210 dumpit((char *) p_ch, sizeof(struct chbk));
1211#endif
1212 CLAW_DBF_TEXT(4,trace,"w_retry");
1213 if (p_ch->claw_state == CLAW_STOP) { 936 if (p_ch->claw_state == CLAW_STOP) {
1214#ifdef FUNCTRACE
1215 printk(KERN_INFO "%s:%s Exit on line %d\n",
1216 dev->name,__func__,__LINE__);
1217#endif
1218 return; 937 return;
1219 } 938 }
1220#ifdef DEBUGMSG
1221 printk( KERN_INFO "%s:%s state-%02x\n" ,
1222 dev->name,
1223 __func__,
1224 p_ch->claw_state);
1225#endif
1226 claw_strt_out_IO( dev ); 939 claw_strt_out_IO( dev );
1227#ifdef FUNCTRACE 940 CLAW_DBF_TEXT(4, trace, "rtry_xit");
1228 printk(KERN_INFO "%s:%s Exit on line %d\n",
1229 dev->name,__func__,__LINE__);
1230#endif
1231 CLAW_DBF_TEXT(4,trace,"rtry_xit");
1232 return; 941 return;
1233} /* end of claw_write_retry */ 942} /* end of claw_write_retry */
1234 943
@@ -1247,12 +956,7 @@ claw_write_next ( struct chbk * p_ch )
1247 struct sk_buff *pk_skb; 956 struct sk_buff *pk_skb;
1248 int rc; 957 int rc;
1249 958
1250#ifdef FUNCTRACE 959 CLAW_DBF_TEXT(4, trace, "claw_wrt");
1251 printk(KERN_INFO "%s:%s Enter \n",p_ch->ndev->name,__func__);
1252 printk(KERN_INFO "%s: variable p_ch =\n",p_ch->ndev->name);
1253 dumpit((char *) p_ch, sizeof(struct chbk));
1254#endif
1255 CLAW_DBF_TEXT(4,trace,"claw_wrt");
1256 if (p_ch->claw_state == CLAW_STOP) 960 if (p_ch->claw_state == CLAW_STOP)
1257 return; 961 return;
1258 dev = (struct net_device *) p_ch->ndev; 962 dev = (struct net_device *) p_ch->ndev;
@@ -1272,11 +976,6 @@ claw_write_next ( struct chbk * p_ch )
1272 if (privptr->p_write_active_first!=NULL) { 976 if (privptr->p_write_active_first!=NULL) {
1273 claw_strt_out_IO(dev); 977 claw_strt_out_IO(dev);
1274 } 978 }
1275
1276#ifdef FUNCTRACE
1277 printk(KERN_INFO "%s:%s Exit on line %d\n",
1278 dev->name,__func__,__LINE__);
1279#endif
1280 return; 979 return;
1281} /* end of claw_write_next */ 980} /* end of claw_write_next */
1282 981
@@ -1288,22 +987,12 @@ claw_write_next ( struct chbk * p_ch )
1288static void 987static void
1289claw_timer ( struct chbk * p_ch ) 988claw_timer ( struct chbk * p_ch )
1290{ 989{
1291#ifdef FUNCTRACE 990 CLAW_DBF_TEXT(4, trace, "timer");
1292 printk(KERN_INFO "%s:%s Entry\n",p_ch->ndev->name,__func__);
1293 printk(KERN_INFO "%s: variable p_ch =\n",p_ch->ndev->name);
1294 dumpit((char *) p_ch, sizeof(struct chbk));
1295#endif
1296 CLAW_DBF_TEXT(4,trace,"timer");
1297 p_ch->flag |= CLAW_TIMER; 991 p_ch->flag |= CLAW_TIMER;
1298 wake_up(&p_ch->wait); 992 wake_up(&p_ch->wait);
1299#ifdef FUNCTRACE
1300 printk(KERN_INFO "%s:%s Exit on line %d\n",
1301 p_ch->ndev->name,__func__,__LINE__);
1302#endif
1303 return; 993 return;
1304} /* end of claw_timer */ 994} /* end of claw_timer */
1305 995
1306
1307/* 996/*
1308* 997*
1309* functions 998* functions
@@ -1324,10 +1013,8 @@ pages_to_order_of_mag(int num_of_pages)
1324{ 1013{
1325 int order_of_mag=1; /* assume 2 pages */ 1014 int order_of_mag=1; /* assume 2 pages */
1326 int nump=2; 1015 int nump=2;
1327#ifdef FUNCTRACE 1016
1328 printk(KERN_INFO "%s Enter pages = %d \n",__func__,num_of_pages); 1017 CLAW_DBF_TEXT_(5, trace, "pages%d", num_of_pages);
1329#endif
1330 CLAW_DBF_TEXT_(5,trace,"pages%d",num_of_pages);
1331 if (num_of_pages == 1) {return 0; } /* magnitude of 0 = 1 page */ 1018 if (num_of_pages == 1) {return 0; } /* magnitude of 0 = 1 page */
1332 /* 512 pages = 2Meg on 4k page systems */ 1019 /* 512 pages = 2Meg on 4k page systems */
1333 if (num_of_pages >= 512) {return 9; } 1020 if (num_of_pages >= 512) {return 9; }
@@ -1338,11 +1025,7 @@ pages_to_order_of_mag(int num_of_pages)
1338 order_of_mag +=1; 1025 order_of_mag +=1;
1339 } 1026 }
1340 if (order_of_mag > 9) { order_of_mag = 9; } /* I know it's paranoid */ 1027 if (order_of_mag > 9) { order_of_mag = 9; } /* I know it's paranoid */
1341#ifdef FUNCTRACE 1028 CLAW_DBF_TEXT_(5, trace, "mag%d", order_of_mag);
1342 printk(KERN_INFO "%s Exit on line %d, order = %d\n",
1343 __func__,__LINE__, order_of_mag);
1344#endif
1345 CLAW_DBF_TEXT_(5,trace,"mag%d",order_of_mag);
1346 return order_of_mag; 1029 return order_of_mag;
1347} 1030}
1348 1031
@@ -1358,21 +1041,7 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
1358 struct claw_privbk *privptr; 1041 struct claw_privbk *privptr;
1359 struct ccw1 temp_ccw; 1042 struct ccw1 temp_ccw;
1360 struct endccw * p_end; 1043 struct endccw * p_end;
1361#ifdef IOTRACE 1044 CLAW_DBF_TEXT(4, trace, "addreads");
1362 struct ccwbk* p_buf;
1363#endif
1364#ifdef FUNCTRACE
1365 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
1366#endif
1367#ifdef DEBUGMSG
1368 printk(KERN_INFO "dev\n");
1369 dumpit((char *) dev, sizeof(struct net_device));
1370 printk(KERN_INFO "p_first\n");
1371 dumpit((char *) p_first, sizeof(struct ccwbk));
1372 printk(KERN_INFO "p_last\n");
1373 dumpit((char *) p_last, sizeof(struct ccwbk));
1374#endif
1375 CLAW_DBF_TEXT(4,trace,"addreads");
1376 privptr = dev->priv; 1045 privptr = dev->priv;
1377 p_end = privptr->p_end_ccw; 1046 p_end = privptr->p_end_ccw;
1378 1047
@@ -1380,11 +1049,7 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
1380 * to apend the running channel programs 1049 * to apend the running channel programs
1381 */ 1050 */
1382 if ( p_first==NULL) { 1051 if ( p_first==NULL) {
1383#ifdef FUNCTRACE 1052 CLAW_DBF_TEXT(4, trace, "addexit");
1384 printk(KERN_INFO "%s:%s Exit on line %d\n",
1385 dev->name,__func__,__LINE__);
1386#endif
1387 CLAW_DBF_TEXT(4,trace,"addexit");
1388 return 0; 1053 return 0;
1389 } 1054 }
1390 1055
@@ -1411,21 +1076,11 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
1411 } 1076 }
1412 1077
1413 if ( privptr-> p_read_active_first ==NULL ) { 1078 if ( privptr-> p_read_active_first ==NULL ) {
1414#ifdef DEBUGMSG
1415 printk(KERN_INFO "%s:%s p_read_active_first == NULL \n",
1416 dev->name,__func__);
1417 printk(KERN_INFO "%s:%s Read active first/last changed \n",
1418 dev->name,__func__);
1419#endif
1420 privptr-> p_read_active_first= p_first; /* set new first */ 1079 privptr-> p_read_active_first= p_first; /* set new first */
1421 privptr-> p_read_active_last = p_last; /* set new last */ 1080 privptr-> p_read_active_last = p_last; /* set new last */
1422 } 1081 }
1423 else { 1082 else {
1424 1083
1425#ifdef DEBUGMSG
1426 printk(KERN_INFO "%s:%s Read in progress \n",
1427 dev->name,__func__);
1428#endif
1429 /* set up TIC ccw */ 1084 /* set up TIC ccw */
1430 temp_ccw.cda= (__u32)__pa(&p_first->read); 1085 temp_ccw.cda= (__u32)__pa(&p_first->read);
1431 temp_ccw.count=0; 1086 temp_ccw.count=0;
@@ -1462,27 +1117,7 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
1462 privptr->p_read_active_last->next = p_first; 1117 privptr->p_read_active_last->next = p_first;
1463 privptr->p_read_active_last=p_last; 1118 privptr->p_read_active_last=p_last;
1464 } /* end of if ( privptr-> p_read_active_first ==NULL) */ 1119 } /* end of if ( privptr-> p_read_active_first ==NULL) */
1465#ifdef IOTRACE 1120 CLAW_DBF_TEXT(4, trace, "addexit");
1466 printk(KERN_INFO "%s:%s dump p_last CCW BK \n",dev->name,__func__);
1467 dumpit((char *)p_last, sizeof(struct ccwbk));
1468 printk(KERN_INFO "%s:%s dump p_end CCW BK \n",dev->name,__func__);
1469 dumpit((char *)p_end, sizeof(struct endccw));
1470
1471 printk(KERN_INFO "%s:%s dump p_first CCW BK \n",dev->name,__func__);
1472 dumpit((char *)p_first, sizeof(struct ccwbk));
1473 printk(KERN_INFO "%s:%s Dump Active CCW chain \n",
1474 dev->name,__func__);
1475 p_buf=privptr->p_read_active_first;
1476 while (p_buf!=NULL) {
1477 dumpit((char *)p_buf, sizeof(struct ccwbk));
1478 p_buf=p_buf->next;
1479 }
1480#endif
1481#ifdef FUNCTRACE
1482 printk(KERN_INFO "%s:%s Exit on line %d\n",
1483 dev->name,__func__,__LINE__);
1484#endif
1485 CLAW_DBF_TEXT(4,trace,"addexit");
1486 return 0; 1121 return 0;
1487} /* end of add_claw_reads */ 1122} /* end of add_claw_reads */
1488 1123
@@ -1494,44 +1129,29 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first,
1494static void 1129static void
1495ccw_check_return_code(struct ccw_device *cdev, int return_code) 1130ccw_check_return_code(struct ccw_device *cdev, int return_code)
1496{ 1131{
1497#ifdef FUNCTRACE 1132 CLAW_DBF_TEXT(4, trace, "ccwret");
1498 printk(KERN_INFO "%s: %s() > enter \n",
1499 cdev->dev.bus_id,__func__);
1500#endif
1501 CLAW_DBF_TEXT(4,trace,"ccwret");
1502#ifdef DEBUGMSG
1503 printk(KERN_INFO "variable cdev =\n");
1504 dumpit((char *) cdev, sizeof(struct ccw_device));
1505 printk(KERN_INFO "variable return_code = %d\n",return_code);
1506#endif
1507 if (return_code != 0) { 1133 if (return_code != 0) {
1508 switch (return_code) { 1134 switch (return_code) {
1509 case -EBUSY: 1135 case -EBUSY: /* BUSY is a transient state no action needed */
1510 printk(KERN_INFO "%s: Busy !\n", 1136 break;
1511 cdev->dev.bus_id); 1137 case -ENODEV:
1512 break; 1138 printk(KERN_EMERG "%s: Missing device called "
1513 case -ENODEV: 1139 "for IO ENODEV\n", cdev->dev.bus_id);
1514 printk(KERN_EMERG "%s: Missing device called " 1140 break;
1515 "for IO ENODEV\n", cdev->dev.bus_id); 1141 case -EIO:
1516 break; 1142 printk(KERN_EMERG "%s: Status pending... EIO \n",
1517 case -EIO: 1143 cdev->dev.bus_id);
1518 printk(KERN_EMERG "%s: Status pending... EIO \n", 1144 break;
1519 cdev->dev.bus_id); 1145 case -EINVAL:
1520 break; 1146 printk(KERN_EMERG "%s: Invalid Dev State EINVAL \n",
1521 case -EINVAL: 1147 cdev->dev.bus_id);
1522 printk(KERN_EMERG "%s: Invalid Dev State EINVAL \n", 1148 break;
1523 cdev->dev.bus_id); 1149 default:
1524 break; 1150 printk(KERN_EMERG "%s: Unknown error in "
1525 default:
1526 printk(KERN_EMERG "%s: Unknown error in "
1527 "Do_IO %d\n",cdev->dev.bus_id, return_code); 1151 "Do_IO %d\n",cdev->dev.bus_id, return_code);
1528 } 1152 }
1529 } 1153 }
1530#ifdef FUNCTRACE 1154 CLAW_DBF_TEXT(4, trace, "ccwret");
1531 printk(KERN_INFO "%s: %s() > exit on line %d\n",
1532 cdev->dev.bus_id,__func__,__LINE__);
1533#endif
1534 CLAW_DBF_TEXT(4,trace,"ccwret");
1535} /* end of ccw_check_return_code */ 1155} /* end of ccw_check_return_code */
1536 1156
1537/*-------------------------------------------------------------------* 1157/*-------------------------------------------------------------------*
@@ -1541,173 +1161,46 @@ ccw_check_return_code(struct ccw_device *cdev, int return_code)
1541static void 1161static void
1542ccw_check_unit_check(struct chbk * p_ch, unsigned char sense ) 1162ccw_check_unit_check(struct chbk * p_ch, unsigned char sense )
1543{ 1163{
1544 struct net_device *dev = p_ch->ndev; 1164 struct net_device *ndev = p_ch->ndev;
1545
1546#ifdef FUNCTRACE
1547 printk(KERN_INFO "%s: %s() > enter\n",dev->name,__func__);
1548#endif
1549#ifdef DEBUGMSG
1550 printk(KERN_INFO "%s: variable dev =\n",dev->name);
1551 dumpit((char *)dev, sizeof(struct net_device));
1552 printk(KERN_INFO "%s: variable sense =\n",dev->name);
1553 dumpit((char *)&sense, 2);
1554#endif
1555 CLAW_DBF_TEXT(4,trace,"unitchek");
1556 1165
1166 CLAW_DBF_TEXT(4, trace, "unitchek");
1557 printk(KERN_INFO "%s: Unit Check with sense byte:0x%04x\n", 1167 printk(KERN_INFO "%s: Unit Check with sense byte:0x%04x\n",
1558 dev->name, sense); 1168 ndev->name, sense);
1559 1169
1560 if (sense & 0x40) { 1170 if (sense & 0x40) {
1561 if (sense & 0x01) { 1171 if (sense & 0x01) {
1562 printk(KERN_WARNING "%s: Interface disconnect or " 1172 printk(KERN_WARNING "%s: Interface disconnect or "
1563 "Selective reset " 1173 "Selective reset "
1564 "occurred (remote side)\n", dev->name); 1174 "occurred (remote side)\n", ndev->name);
1565 } 1175 }
1566 else { 1176 else {
1567 printk(KERN_WARNING "%s: System reset occured" 1177 printk(KERN_WARNING "%s: System reset occured"
1568 " (remote side)\n", dev->name); 1178 " (remote side)\n", ndev->name);
1569 } 1179 }
1570 } 1180 }
1571 else if (sense & 0x20) { 1181 else if (sense & 0x20) {
1572 if (sense & 0x04) { 1182 if (sense & 0x04) {
1573 printk(KERN_WARNING "%s: Data-streaming " 1183 printk(KERN_WARNING "%s: Data-streaming "
1574 "timeout)\n", dev->name); 1184 "timeout)\n", ndev->name);
1575 } 1185 }
1576 else { 1186 else {
1577 printk(KERN_WARNING "%s: Data-transfer parity" 1187 printk(KERN_WARNING "%s: Data-transfer parity"
1578 " error\n", dev->name); 1188 " error\n", ndev->name);
1579 } 1189 }
1580 } 1190 }
1581 else if (sense & 0x10) { 1191 else if (sense & 0x10) {
1582 if (sense & 0x20) { 1192 if (sense & 0x20) {
1583 printk(KERN_WARNING "%s: Hardware malfunction " 1193 printk(KERN_WARNING "%s: Hardware malfunction "
1584 "(remote side)\n", dev->name); 1194 "(remote side)\n", ndev->name);
1585 } 1195 }
1586 else { 1196 else {
1587 printk(KERN_WARNING "%s: read-data parity error " 1197 printk(KERN_WARNING "%s: read-data parity error "
1588 "(remote side)\n", dev->name); 1198 "(remote side)\n", ndev->name);
1589 } 1199 }
1590 } 1200 }
1591 1201
1592#ifdef FUNCTRACE
1593 printk(KERN_INFO "%s: %s() exit on line %d\n",
1594 dev->name,__func__,__LINE__);
1595#endif
1596} /* end of ccw_check_unit_check */ 1202} /* end of ccw_check_unit_check */
1597 1203
1598
1599
1600/*-------------------------------------------------------------------*
1601* Dump buffer format *
1602* *
1603*--------------------------------------------------------------------*/
1604#ifdef DEBUG
1605static void
1606dumpit(char* buf, int len)
1607{
1608
1609 __u32 ct, sw, rm, dup;
1610 char *ptr, *rptr;
1611 char tbuf[82], tdup[82];
1612#if (CONFIG_64BIT)
1613 char addr[22];
1614#else
1615 char addr[12];
1616#endif
1617 char boff[12];
1618 char bhex[82], duphex[82];
1619 char basc[40];
1620
1621 sw = 0;
1622 rptr =ptr=buf;
1623 rm = 16;
1624 duphex[0] = 0x00;
1625 dup = 0;
1626 for ( ct=0; ct < len; ct++, ptr++, rptr++ ) {
1627 if (sw == 0) {
1628#if (CONFIG_64BIT)
1629 sprintf(addr, "%16.16lX",(unsigned long)rptr);
1630#else
1631 sprintf(addr, "%8.8X",(__u32)rptr);
1632#endif
1633 sprintf(boff, "%4.4X", (__u32)ct);
1634 bhex[0] = '\0';
1635 basc[0] = '\0';
1636 }
1637 if ((sw == 4) || (sw == 12)) {
1638 strcat(bhex, " ");
1639 }
1640 if (sw == 8) {
1641 strcat(bhex, " ");
1642 }
1643#if (CONFIG_64BIT)
1644 sprintf(tbuf,"%2.2lX", (unsigned long)*ptr);
1645#else
1646 sprintf(tbuf,"%2.2X", (__u32)*ptr);
1647#endif
1648 tbuf[2] = '\0';
1649 strcat(bhex, tbuf);
1650 if ((0!=isprint(*ptr)) && (*ptr >= 0x20)) {
1651 basc[sw] = *ptr;
1652 }
1653 else {
1654 basc[sw] = '.';
1655 }
1656 basc[sw+1] = '\0';
1657 sw++;
1658 rm--;
1659 if (sw==16) {
1660 if ((strcmp(duphex, bhex)) !=0) {
1661 if (dup !=0) {
1662 sprintf(tdup,"Duplicate as above to"
1663 " %s", addr);
1664 printk( KERN_INFO " "
1665 " --- %s ---\n",tdup);
1666 }
1667 printk( KERN_INFO " %s (+%s) : %s [%s]\n",
1668 addr, boff, bhex, basc);
1669 dup = 0;
1670 strcpy(duphex, bhex);
1671 }
1672 else {
1673 dup++;
1674 }
1675 sw = 0;
1676 rm = 16;
1677 }
1678 } /* endfor */
1679
1680 if (sw != 0) {
1681 for ( ; rm > 0; rm--, sw++ ) {
1682 if ((sw==4) || (sw==12)) strcat(bhex, " ");
1683 if (sw==8) strcat(bhex, " ");
1684 strcat(bhex, " ");
1685 strcat(basc, " ");
1686 }
1687 if (dup !=0) {
1688 sprintf(tdup,"Duplicate as above to %s", addr);
1689 printk( KERN_INFO " --- %s ---\n",
1690 tdup);
1691 }
1692 printk( KERN_INFO " %s (+%s) : %s [%s]\n",
1693 addr, boff, bhex, basc);
1694 }
1695 else {
1696 if (dup >=1) {
1697 sprintf(tdup,"Duplicate as above to %s", addr);
1698 printk( KERN_INFO " --- %s ---\n",
1699 tdup);
1700 }
1701 if (dup !=0) {
1702 printk( KERN_INFO " %s (+%s) : %s [%s]\n",
1703 addr, boff, bhex, basc);
1704 }
1705 }
1706 return;
1707
1708} /* end of dumpit */
1709#endif
1710
1711/*-------------------------------------------------------------------* 1204/*-------------------------------------------------------------------*
1712* find_link * 1205* find_link *
1713*--------------------------------------------------------------------*/ 1206*--------------------------------------------------------------------*/
@@ -1718,16 +1211,7 @@ find_link(struct net_device *dev, char *host_name, char *ws_name )
1718 struct claw_env *p_env; 1211 struct claw_env *p_env;
1719 int rc=0; 1212 int rc=0;
1720 1213
1721#ifdef FUNCTRACE 1214 CLAW_DBF_TEXT(2, setup, "findlink");
1722 printk(KERN_INFO "%s:%s > enter \n",dev->name,__func__);
1723#endif
1724 CLAW_DBF_TEXT(2,setup,"findlink");
1725#ifdef DEBUGMSG
1726 printk(KERN_INFO "%s: variable dev = \n",dev->name);
1727 dumpit((char *) dev, sizeof(struct net_device));
1728 printk(KERN_INFO "%s: variable host_name = %s\n",dev->name, host_name);
1729 printk(KERN_INFO "%s: variable ws_name = %s\n",dev->name, ws_name);
1730#endif
1731 privptr=dev->priv; 1215 privptr=dev->priv;
1732 p_env=privptr->p_env; 1216 p_env=privptr->p_env;
1733 switch (p_env->packing) 1217 switch (p_env->packing)
@@ -1750,10 +1234,6 @@ find_link(struct net_device *dev, char *host_name, char *ws_name )
1750 break; 1234 break;
1751 } 1235 }
1752 1236
1753#ifdef FUNCTRACE
1754 printk(KERN_INFO "%s:%s Exit on line %d\n",
1755 dev->name,__func__,__LINE__);
1756#endif
1757 return 0; 1237 return 0;
1758} /* end of find_link */ 1238} /* end of find_link */
1759 1239
@@ -1782,27 +1262,11 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
1782 int lock; 1262 int lock;
1783 struct clawph *pk_head; 1263 struct clawph *pk_head;
1784 struct chbk *ch; 1264 struct chbk *ch;
1785#ifdef IOTRACE 1265
1786 struct ccwbk *p_buf; 1266 CLAW_DBF_TEXT(4, trace, "hw_tx");
1787#endif
1788#ifdef FUNCTRACE
1789 printk(KERN_INFO "%s: %s() > enter\n",dev->name,__func__);
1790#endif
1791 CLAW_DBF_TEXT(4,trace,"hw_tx");
1792#ifdef DEBUGMSG
1793 printk(KERN_INFO "%s: variable dev skb =\n",dev->name);
1794 dumpit((char *) skb, sizeof(struct sk_buff));
1795 printk(KERN_INFO "%s: variable dev =\n",dev->name);
1796 dumpit((char *) dev, sizeof(struct net_device));
1797 printk(KERN_INFO "%s: variable linkid = %ld\n",dev->name,linkid);
1798#endif
1799 privptr = (struct claw_privbk *) (dev->priv); 1267 privptr = (struct claw_privbk *) (dev->priv);
1800 p_ch=(struct chbk *)&privptr->channel[WRITE]; 1268 p_ch=(struct chbk *)&privptr->channel[WRITE];
1801 p_env =privptr->p_env; 1269 p_env =privptr->p_env;
1802#ifdef IOTRACE
1803 printk(KERN_INFO "%s: %s() dump sk_buff \n",dev->name,__func__);
1804 dumpit((char *)skb ,sizeof(struct sk_buff));
1805#endif
1806 claw_free_wrt_buf(dev); /* Clean up free chain if posible */ 1270 claw_free_wrt_buf(dev); /* Clean up free chain if posible */
1807 /* scan the write queue to free any completed write packets */ 1271 /* scan the write queue to free any completed write packets */
1808 p_first_ccw=NULL; 1272 p_first_ccw=NULL;
@@ -1834,11 +1298,6 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
1834 claw_strt_out_IO(dev ); 1298 claw_strt_out_IO(dev );
1835 claw_free_wrt_buf( dev ); 1299 claw_free_wrt_buf( dev );
1836 if (privptr->write_free_count==0) { 1300 if (privptr->write_free_count==0) {
1837#ifdef IOTRACE
1838 printk(KERN_INFO "%s: "
1839 "(claw_check_busy) no free write "
1840 "buffers\n", dev->name);
1841#endif
1842 ch = &privptr->channel[WRITE]; 1301 ch = &privptr->channel[WRITE];
1843 atomic_inc(&skb->users); 1302 atomic_inc(&skb->users);
1844 skb_queue_tail(&ch->collect_queue, skb); 1303 skb_queue_tail(&ch->collect_queue, skb);
@@ -1851,10 +1310,6 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
1851 } 1310 }
1852 /* tx lock */ 1311 /* tx lock */
1853 if (claw_test_and_setbit_busy(TB_TX,dev)) { /* set to busy */ 1312 if (claw_test_and_setbit_busy(TB_TX,dev)) { /* set to busy */
1854#ifdef DEBUGMSG
1855 printk(KERN_INFO "%s: busy (claw_test_and_setbit_"
1856 "busy)\n", dev->name);
1857#endif
1858 ch = &privptr->channel[WRITE]; 1313 ch = &privptr->channel[WRITE];
1859 atomic_inc(&skb->users); 1314 atomic_inc(&skb->users);
1860 skb_queue_tail(&ch->collect_queue, skb); 1315 skb_queue_tail(&ch->collect_queue, skb);
@@ -1871,28 +1326,16 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
1871 privptr->p_write_free_chain == NULL ) { 1326 privptr->p_write_free_chain == NULL ) {
1872 1327
1873 claw_setbit_busy(TB_NOBUFFER,dev); 1328 claw_setbit_busy(TB_NOBUFFER,dev);
1874
1875#ifdef DEBUGMSG
1876 printk(KERN_INFO "%s: busy (claw_setbit_busy"
1877 "(TB_NOBUFFER))\n", dev->name);
1878 printk(KERN_INFO " free_count: %d, numBuffers : %d\n",
1879 (int)privptr->write_free_count,(int) numBuffers );
1880#endif
1881 ch = &privptr->channel[WRITE]; 1329 ch = &privptr->channel[WRITE];
1882 atomic_inc(&skb->users); 1330 atomic_inc(&skb->users);
1883 skb_queue_tail(&ch->collect_queue, skb); 1331 skb_queue_tail(&ch->collect_queue, skb);
1884 CLAW_DBF_TEXT(2,trace,"clawbusy"); 1332 CLAW_DBF_TEXT(2, trace, "clawbusy");
1885 goto Done2; 1333 goto Done2;
1886 } 1334 }
1887 pDataAddress=skb->data; 1335 pDataAddress=skb->data;
1888 len_of_data=skb->len; 1336 len_of_data=skb->len;
1889 1337
1890 while (len_of_data > 0) { 1338 while (len_of_data > 0) {
1891#ifdef DEBUGMSG
1892 printk(KERN_INFO "%s: %s() length-of-data is %ld \n",
1893 dev->name ,__func__,len_of_data);
1894 dumpit((char *)pDataAddress ,64);
1895#endif
1896 p_this_ccw=privptr->p_write_free_chain; /* get a block */ 1339 p_this_ccw=privptr->p_write_free_chain; /* get a block */
1897 if (p_this_ccw == NULL) { /* lost the race */ 1340 if (p_this_ccw == NULL) { /* lost the race */
1898 ch = &privptr->channel[WRITE]; 1341 ch = &privptr->channel[WRITE];
@@ -1924,12 +1367,6 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
1924 (__u32)__pa(&p_this_ccw->write); 1367 (__u32)__pa(&p_this_ccw->write);
1925 } 1368 }
1926 p_last_ccw=p_this_ccw; /* save new last block */ 1369 p_last_ccw=p_this_ccw; /* save new last block */
1927#ifdef IOTRACE
1928 printk(KERN_INFO "%s: %s() > CCW and Buffer %ld bytes long \n",
1929 dev->name,__func__,bytesInThisBuffer);
1930 dumpit((char *)p_this_ccw, sizeof(struct ccwbk));
1931 dumpit((char *)p_this_ccw->p_buffer, 64);
1932#endif
1933 } 1370 }
1934 1371
1935 /* FirstCCW and LastCCW now contain a new set of write channel 1372 /* FirstCCW and LastCCW now contain a new set of write channel
@@ -1962,13 +1399,11 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
1962 pEnd->write1_nop2.count=1; 1399 pEnd->write1_nop2.count=1;
1963 } /* end if if (pEnd->write1) */ 1400 } /* end if if (pEnd->write1) */
1964 1401
1965
1966 if (privptr->p_write_active_first==NULL ) { 1402 if (privptr->p_write_active_first==NULL ) {
1967 privptr->p_write_active_first=p_first_ccw; 1403 privptr->p_write_active_first=p_first_ccw;
1968 privptr->p_write_active_last=p_last_ccw; 1404 privptr->p_write_active_last=p_last_ccw;
1969 } 1405 }
1970 else { 1406 else {
1971
1972 /* set up Tic CCWs */ 1407 /* set up Tic CCWs */
1973 1408
1974 tempCCW.cda=(__u32)__pa(&p_first_ccw->write); 1409 tempCCW.cda=(__u32)__pa(&p_first_ccw->write);
@@ -2007,19 +1442,6 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
2007 } 1442 }
2008 1443
2009 } /* endif (p_first_ccw!=NULL) */ 1444 } /* endif (p_first_ccw!=NULL) */
2010
2011
2012#ifdef IOTRACE
2013 printk(KERN_INFO "%s: %s() > Dump Active CCW chain \n",
2014 dev->name,__func__);
2015 p_buf=privptr->p_write_active_first;
2016 while (p_buf!=NULL) {
2017 dumpit((char *)p_buf, sizeof(struct ccwbk));
2018 p_buf=p_buf->next;
2019 }
2020 p_buf=(struct ccwbk*)privptr->p_end_ccw;
2021 dumpit((char *)p_buf, sizeof(struct endccw));
2022#endif
2023 dev_kfree_skb_any(skb); 1445 dev_kfree_skb_any(skb);
2024 if (linkid==0) { 1446 if (linkid==0) {
2025 lock=LOCK_NO; 1447 lock=LOCK_NO;
@@ -2029,21 +1451,12 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
2029 } 1451 }
2030 claw_strt_out_IO(dev ); 1452 claw_strt_out_IO(dev );
2031 /* if write free count is zero , set NOBUFFER */ 1453 /* if write free count is zero , set NOBUFFER */
2032#ifdef DEBUGMSG
2033 printk(KERN_INFO "%s: %s() > free_count is %d\n",
2034 dev->name,__func__,
2035 (int) privptr->write_free_count );
2036#endif
2037 if (privptr->write_free_count==0) { 1454 if (privptr->write_free_count==0) {
2038 claw_setbit_busy(TB_NOBUFFER,dev); 1455 claw_setbit_busy(TB_NOBUFFER,dev);
2039 } 1456 }
2040Done2: 1457Done2:
2041 claw_clearbit_busy(TB_TX,dev); 1458 claw_clearbit_busy(TB_TX,dev);
2042Done: 1459Done:
2043#ifdef FUNCTRACE
2044 printk(KERN_INFO "%s: %s() > exit on line %d, rc = %d \n",
2045 dev->name,__func__,__LINE__, rc);
2046#endif
2047 return(rc); 1460 return(rc);
2048} /* end of claw_hw_tx */ 1461} /* end of claw_hw_tx */
2049 1462
@@ -2075,14 +1488,7 @@ init_ccw_bk(struct net_device *dev)
2075 struct clawh *pClawH=NULL; 1488 struct clawh *pClawH=NULL;
2076 addr_t real_TIC_address; 1489 addr_t real_TIC_address;
2077 int i,j; 1490 int i,j;
2078#ifdef FUNCTRACE 1491 CLAW_DBF_TEXT(4, trace, "init_ccw");
2079 printk(KERN_INFO "%s: %s() enter \n",dev->name,__func__);
2080#endif
2081 CLAW_DBF_TEXT(4,trace,"init_ccw");
2082#ifdef DEBUGMSG
2083 printk(KERN_INFO "%s: variable dev =\n",dev->name);
2084 dumpit((char *) dev, sizeof(struct net_device));
2085#endif
2086 1492
2087 /* initialize statistics field */ 1493 /* initialize statistics field */
2088 privptr->active_link_ID=0; 1494 privptr->active_link_ID=0;
@@ -2107,20 +1513,6 @@ init_ccw_bk(struct net_device *dev)
2107 */ 1513 */
2108 ccw_blocks_required = 1514 ccw_blocks_required =
2109 privptr->p_env->read_buffers+privptr->p_env->write_buffers+1; 1515 privptr->p_env->read_buffers+privptr->p_env->write_buffers+1;
2110#ifdef DEBUGMSG
2111 printk(KERN_INFO "%s: %s() "
2112 "ccw_blocks_required=%d\n",
2113 dev->name,__func__,
2114 ccw_blocks_required);
2115 printk(KERN_INFO "%s: %s() "
2116 "PAGE_SIZE=0x%x\n",
2117 dev->name,__func__,
2118 (unsigned int)PAGE_SIZE);
2119 printk(KERN_INFO "%s: %s() > "
2120 "PAGE_MASK=0x%x\n",
2121 dev->name,__func__,
2122 (unsigned int)PAGE_MASK);
2123#endif
2124 /* 1516 /*
2125 * compute number of CCW blocks that will fit in a page 1517 * compute number of CCW blocks that will fit in a page
2126 */ 1518 */
@@ -2128,14 +1520,6 @@ init_ccw_bk(struct net_device *dev)
2128 ccw_pages_required= 1520 ccw_pages_required=
2129 DIV_ROUND_UP(ccw_blocks_required, ccw_blocks_perpage); 1521 DIV_ROUND_UP(ccw_blocks_required, ccw_blocks_perpage);
2130 1522
2131#ifdef DEBUGMSG
2132 printk(KERN_INFO "%s: %s() > ccw_blocks_perpage=%d\n",
2133 dev->name,__func__,
2134 ccw_blocks_perpage);
2135 printk(KERN_INFO "%s: %s() > ccw_pages_required=%d\n",
2136 dev->name,__func__,
2137 ccw_pages_required);
2138#endif
2139 /* 1523 /*
2140 * read and write sizes are set by 2 constants in claw.h 1524 * read and write sizes are set by 2 constants in claw.h
2141 * 4k and 32k. Unpacked values other than 4k are not going to 1525 * 4k and 32k. Unpacked values other than 4k are not going to
@@ -2166,36 +1550,6 @@ init_ccw_bk(struct net_device *dev)
2166 claw_write_pages = privptr->p_env->write_buffers * 1550 claw_write_pages = privptr->p_env->write_buffers *
2167 privptr->p_buff_pages_perwrite; 1551 privptr->p_buff_pages_perwrite;
2168 } 1552 }
2169#ifdef DEBUGMSG
2170 if (privptr->p_env->read_size < PAGE_SIZE) {
2171 printk(KERN_INFO "%s: %s() reads_perpage=%d\n",
2172 dev->name,__func__,
2173 claw_reads_perpage);
2174 }
2175 else {
2176 printk(KERN_INFO "%s: %s() pages_perread=%d\n",
2177 dev->name,__func__,
2178 privptr->p_buff_pages_perread);
2179 }
2180 printk(KERN_INFO "%s: %s() read_pages=%d\n",
2181 dev->name,__func__,
2182 claw_read_pages);
2183 if (privptr->p_env->write_size < PAGE_SIZE) {
2184 printk(KERN_INFO "%s: %s() writes_perpage=%d\n",
2185 dev->name,__func__,
2186 claw_writes_perpage);
2187 }
2188 else {
2189 printk(KERN_INFO "%s: %s() pages_perwrite=%d\n",
2190 dev->name,__func__,
2191 privptr->p_buff_pages_perwrite);
2192 }
2193 printk(KERN_INFO "%s: %s() write_pages=%d\n",
2194 dev->name,__func__,
2195 claw_write_pages);
2196#endif
2197
2198
2199 /* 1553 /*
2200 * allocate ccw_pages_required 1554 * allocate ccw_pages_required
2201 */ 1555 */
@@ -2204,17 +1558,6 @@ init_ccw_bk(struct net_device *dev)
2204 (void *)__get_free_pages(__GFP_DMA, 1558 (void *)__get_free_pages(__GFP_DMA,
2205 (int)pages_to_order_of_mag(ccw_pages_required )); 1559 (int)pages_to_order_of_mag(ccw_pages_required ));
2206 if (privptr->p_buff_ccw==NULL) { 1560 if (privptr->p_buff_ccw==NULL) {
2207 printk(KERN_INFO "%s: %s() "
2208 "__get_free_pages for CCWs failed : "
2209 "pages is %d\n",
2210 dev->name,__func__,
2211 ccw_pages_required );
2212#ifdef FUNCTRACE
2213 printk(KERN_INFO "%s: %s() > "
2214 "exit on line %d, rc = ENOMEM\n",
2215 dev->name,__func__,
2216 __LINE__);
2217#endif
2218 return -ENOMEM; 1561 return -ENOMEM;
2219 } 1562 }
2220 privptr->p_buff_ccw_num=ccw_pages_required; 1563 privptr->p_buff_ccw_num=ccw_pages_required;
@@ -2229,11 +1572,6 @@ init_ccw_bk(struct net_device *dev)
2229 privptr->p_end_ccw = (struct endccw *)&privptr->end_ccw; 1572 privptr->p_end_ccw = (struct endccw *)&privptr->end_ccw;
2230 real_address = (__u32)__pa(privptr->p_end_ccw); 1573 real_address = (__u32)__pa(privptr->p_end_ccw);
2231 /* Initialize ending CCW block */ 1574 /* Initialize ending CCW block */
2232#ifdef DEBUGMSG
2233 printk(KERN_INFO "%s: %s() begin initialize ending CCW blocks\n",
2234 dev->name,__func__);
2235#endif
2236
2237 p_endccw=privptr->p_end_ccw; 1575 p_endccw=privptr->p_end_ccw;
2238 p_endccw->real=real_address; 1576 p_endccw->real=real_address;
2239 p_endccw->write1=0x00; 1577 p_endccw->write1=0x00;
@@ -2287,21 +1625,10 @@ init_ccw_bk(struct net_device *dev)
2287 p_endccw->read2_nop2.count = 1; 1625 p_endccw->read2_nop2.count = 1;
2288 p_endccw->read2_nop2.cda = 0; 1626 p_endccw->read2_nop2.cda = 0;
2289 1627
2290#ifdef IOTRACE
2291 printk(KERN_INFO "%s: %s() dump claw ending CCW BK \n",
2292 dev->name,__func__);
2293 dumpit((char *)p_endccw, sizeof(struct endccw));
2294#endif
2295
2296 /* 1628 /*
2297 * Build a chain of CCWs 1629 * Build a chain of CCWs
2298 * 1630 *
2299 */ 1631 */
2300
2301#ifdef DEBUGMSG
2302 printk(KERN_INFO "%s: %s() Begin build a chain of CCW buffer \n",
2303 dev->name,__func__);
2304#endif
2305 p_buff=privptr->p_buff_ccw; 1632 p_buff=privptr->p_buff_ccw;
2306 1633
2307 p_free_chain=NULL; 1634 p_free_chain=NULL;
@@ -2316,26 +1643,10 @@ init_ccw_bk(struct net_device *dev)
2316 } 1643 }
2317 p_buff+=PAGE_SIZE; 1644 p_buff+=PAGE_SIZE;
2318 } 1645 }
2319#ifdef DEBUGMSG
2320 printk(KERN_INFO "%s: %s() "
2321 "End build a chain of CCW buffer \n",
2322 dev->name,__func__);
2323 p_buf=p_free_chain;
2324 while (p_buf!=NULL) {
2325 dumpit((char *)p_buf, sizeof(struct ccwbk));
2326 p_buf=p_buf->next;
2327 }
2328#endif
2329
2330 /* 1646 /*
2331 * Initialize ClawSignalBlock 1647 * Initialize ClawSignalBlock
2332 * 1648 *
2333 */ 1649 */
2334#ifdef DEBUGMSG
2335 printk(KERN_INFO "%s: %s() "
2336 "Begin initialize ClawSignalBlock \n",
2337 dev->name,__func__);
2338#endif
2339 if (privptr->p_claw_signal_blk==NULL) { 1650 if (privptr->p_claw_signal_blk==NULL) {
2340 privptr->p_claw_signal_blk=p_free_chain; 1651 privptr->p_claw_signal_blk=p_free_chain;
2341 p_free_chain=p_free_chain->next; 1652 p_free_chain=p_free_chain->next;
@@ -2344,12 +1655,6 @@ init_ccw_bk(struct net_device *dev)
2344 pClawH->opcode=0xff; 1655 pClawH->opcode=0xff;
2345 pClawH->flag=CLAW_BUSY; 1656 pClawH->flag=CLAW_BUSY;
2346 } 1657 }
2347#ifdef DEBUGMSG
2348 printk(KERN_INFO "%s: %s() > End initialize "
2349 "ClawSignalBlock\n",
2350 dev->name,__func__);
2351 dumpit((char *)privptr->p_claw_signal_blk, sizeof(struct ccwbk));
2352#endif
2353 1658
2354 /* 1659 /*
2355 * allocate write_pages_required and add to free chain 1660 * allocate write_pages_required and add to free chain
@@ -2360,17 +1665,7 @@ init_ccw_bk(struct net_device *dev)
2360 (void *)__get_free_pages(__GFP_DMA, 1665 (void *)__get_free_pages(__GFP_DMA,
2361 (int)pages_to_order_of_mag(claw_write_pages )); 1666 (int)pages_to_order_of_mag(claw_write_pages ));
2362 if (privptr->p_buff_write==NULL) { 1667 if (privptr->p_buff_write==NULL) {
2363 printk(KERN_INFO "%s: %s() __get_free_pages for write"
2364 " bufs failed : get is for %d pages\n",
2365 dev->name,__func__,claw_write_pages );
2366 free_pages((unsigned long)privptr->p_buff_ccw,
2367 (int)pages_to_order_of_mag(privptr->p_buff_ccw_num));
2368 privptr->p_buff_ccw=NULL; 1668 privptr->p_buff_ccw=NULL;
2369#ifdef FUNCTRACE
2370 printk(KERN_INFO "%s: %s() > exit on line %d,"
2371 "rc = ENOMEM\n",
2372 dev->name,__func__,__LINE__);
2373#endif
2374 return -ENOMEM; 1669 return -ENOMEM;
2375 } 1670 }
2376 /* 1671 /*
@@ -2380,10 +1675,6 @@ init_ccw_bk(struct net_device *dev)
2380 1675
2381 memset(privptr->p_buff_write, 0x00, 1676 memset(privptr->p_buff_write, 0x00,
2382 ccw_pages_required * PAGE_SIZE); 1677 ccw_pages_required * PAGE_SIZE);
2383#ifdef DEBUGMSG
2384 printk(KERN_INFO "%s: %s() Begin build claw write free "
2385 "chain \n",dev->name,__func__);
2386#endif
2387 privptr->p_write_free_chain=NULL; 1678 privptr->p_write_free_chain=NULL;
2388 1679
2389 p_buff=privptr->p_buff_write; 1680 p_buff=privptr->p_buff_write;
@@ -2419,18 +1710,7 @@ init_ccw_bk(struct net_device *dev)
2419 p_buff=(void *)__get_free_pages(__GFP_DMA, 1710 p_buff=(void *)__get_free_pages(__GFP_DMA,
2420 (int)pages_to_order_of_mag( 1711 (int)pages_to_order_of_mag(
2421 privptr->p_buff_pages_perwrite) ); 1712 privptr->p_buff_pages_perwrite) );
2422#ifdef IOTRACE
2423 printk(KERN_INFO "%s:%s __get_free_pages "
2424 "for writes buf: get for %d pages\n",
2425 dev->name,__func__,
2426 privptr->p_buff_pages_perwrite);
2427#endif
2428 if (p_buff==NULL) { 1713 if (p_buff==NULL) {
2429 printk(KERN_INFO "%s:%s __get_free_pages "
2430 "for writes buf failed : get is for %d pages\n",
2431 dev->name,
2432 __func__,
2433 privptr->p_buff_pages_perwrite );
2434 free_pages((unsigned long)privptr->p_buff_ccw, 1714 free_pages((unsigned long)privptr->p_buff_ccw,
2435 (int)pages_to_order_of_mag( 1715 (int)pages_to_order_of_mag(
2436 privptr->p_buff_ccw_num)); 1716 privptr->p_buff_ccw_num));
@@ -2443,12 +1723,6 @@ init_ccw_bk(struct net_device *dev)
2443 privptr->p_buff_pages_perwrite)); 1723 privptr->p_buff_pages_perwrite));
2444 p_buf=p_buf->next; 1724 p_buf=p_buf->next;
2445 } 1725 }
2446#ifdef FUNCTRACE
2447 printk(KERN_INFO "%s: %s exit on line %d, rc = ENOMEM\n",
2448 dev->name,
2449 __func__,
2450 __LINE__);
2451#endif
2452 return -ENOMEM; 1726 return -ENOMEM;
2453 } /* Error on get_pages */ 1727 } /* Error on get_pages */
2454 memset(p_buff, 0x00, privptr->p_env->write_size ); 1728 memset(p_buff, 0x00, privptr->p_env->write_size );
@@ -2477,15 +1751,6 @@ init_ccw_bk(struct net_device *dev)
2477 privptr->write_free_count=privptr->p_env->write_buffers; 1751 privptr->write_free_count=privptr->p_env->write_buffers;
2478 1752
2479 1753
2480#ifdef DEBUGMSG
2481 printk(KERN_INFO "%s:%s End build claw write free chain \n",
2482 dev->name,__func__);
2483 p_buf=privptr->p_write_free_chain;
2484 while (p_buf!=NULL) {
2485 dumpit((char *)p_buf, sizeof(struct ccwbk));
2486 p_buf=p_buf->next;
2487 }
2488#endif
2489 /* 1754 /*
2490 * allocate read_pages_required and chain to free chain 1755 * allocate read_pages_required and chain to free chain
2491 */ 1756 */
@@ -2495,10 +1760,6 @@ init_ccw_bk(struct net_device *dev)
2495 (void *)__get_free_pages(__GFP_DMA, 1760 (void *)__get_free_pages(__GFP_DMA,
2496 (int)pages_to_order_of_mag(claw_read_pages) ); 1761 (int)pages_to_order_of_mag(claw_read_pages) );
2497 if (privptr->p_buff_read==NULL) { 1762 if (privptr->p_buff_read==NULL) {
2498 printk(KERN_INFO "%s: %s() "
2499 "__get_free_pages for read buf failed : "
2500 "get is for %d pages\n",
2501 dev->name,__func__,claw_read_pages );
2502 free_pages((unsigned long)privptr->p_buff_ccw, 1763 free_pages((unsigned long)privptr->p_buff_ccw,
2503 (int)pages_to_order_of_mag( 1764 (int)pages_to_order_of_mag(
2504 privptr->p_buff_ccw_num)); 1765 privptr->p_buff_ccw_num));
@@ -2508,10 +1769,6 @@ init_ccw_bk(struct net_device *dev)
2508 privptr->p_buff_write_num)); 1769 privptr->p_buff_write_num));
2509 privptr->p_buff_ccw=NULL; 1770 privptr->p_buff_ccw=NULL;
2510 privptr->p_buff_write=NULL; 1771 privptr->p_buff_write=NULL;
2511#ifdef FUNCTRACE
2512 printk(KERN_INFO "%s: %s() > exit on line %d, rc ="
2513 " ENOMEM\n",dev->name,__func__,__LINE__);
2514#endif
2515 return -ENOMEM; 1772 return -ENOMEM;
2516 } 1773 }
2517 memset(privptr->p_buff_read, 0x00, claw_read_pages * PAGE_SIZE); 1774 memset(privptr->p_buff_read, 0x00, claw_read_pages * PAGE_SIZE);
@@ -2520,10 +1777,6 @@ init_ccw_bk(struct net_device *dev)
2520 * Build CLAW read free chain 1777 * Build CLAW read free chain
2521 * 1778 *
2522 */ 1779 */
2523#ifdef DEBUGMSG
2524 printk(KERN_INFO "%s: %s() Begin build claw read free chain \n",
2525 dev->name,__func__);
2526#endif
2527 p_buff=privptr->p_buff_read; 1780 p_buff=privptr->p_buff_read;
2528 for (i=0 ; i< privptr->p_env->read_buffers ; i++) { 1781 for (i=0 ; i< privptr->p_env->read_buffers ; i++) {
2529 p_buf = p_free_chain; 1782 p_buf = p_free_chain;
@@ -2600,19 +1853,10 @@ init_ccw_bk(struct net_device *dev)
2600 } /* for read_buffers */ 1853 } /* for read_buffers */
2601 } /* read_size < PAGE_SIZE */ 1854 } /* read_size < PAGE_SIZE */
2602 else { /* read Size >= PAGE_SIZE */ 1855 else { /* read Size >= PAGE_SIZE */
2603
2604#ifdef DEBUGMSG
2605 printk(KERN_INFO "%s: %s() Begin build claw read free chain \n",
2606 dev->name,__func__);
2607#endif
2608 for (i=0 ; i< privptr->p_env->read_buffers ; i++) { 1856 for (i=0 ; i< privptr->p_env->read_buffers ; i++) {
2609 p_buff = (void *)__get_free_pages(__GFP_DMA, 1857 p_buff = (void *)__get_free_pages(__GFP_DMA,
2610 (int)pages_to_order_of_mag(privptr->p_buff_pages_perread) ); 1858 (int)pages_to_order_of_mag(privptr->p_buff_pages_perread) );
2611 if (p_buff==NULL) { 1859 if (p_buff==NULL) {
2612 printk(KERN_INFO "%s: %s() __get_free_pages for read "
2613 "buf failed : get is for %d pages\n",
2614 dev->name,__func__,
2615 privptr->p_buff_pages_perread );
2616 free_pages((unsigned long)privptr->p_buff_ccw, 1860 free_pages((unsigned long)privptr->p_buff_ccw,
2617 (int)pages_to_order_of_mag(privptr->p_buff_ccw_num)); 1861 (int)pages_to_order_of_mag(privptr->p_buff_ccw_num));
2618 /* free the write pages */ 1862 /* free the write pages */
@@ -2633,11 +1877,6 @@ init_ccw_bk(struct net_device *dev)
2633 } 1877 }
2634 privptr->p_buff_ccw=NULL; 1878 privptr->p_buff_ccw=NULL;
2635 privptr->p_buff_write=NULL; 1879 privptr->p_buff_write=NULL;
2636#ifdef FUNCTRACE
2637 printk(KERN_INFO "%s: %s() exit on line %d, rc = ENOMEM\n",
2638 dev->name,__func__,
2639 __LINE__);
2640#endif
2641 return -ENOMEM; 1880 return -ENOMEM;
2642 } 1881 }
2643 memset(p_buff, 0x00, privptr->p_env->read_size); 1882 memset(p_buff, 0x00, privptr->p_env->read_size);
@@ -2706,22 +1945,9 @@ init_ccw_bk(struct net_device *dev)
2706 } /* For read_buffers */ 1945 } /* For read_buffers */
2707 } /* read_size >= PAGE_SIZE */ 1946 } /* read_size >= PAGE_SIZE */
2708 } /* pBuffread = NULL */ 1947 } /* pBuffread = NULL */
2709#ifdef DEBUGMSG
2710 printk(KERN_INFO "%s: %s() > End build claw read free chain \n",
2711 dev->name,__func__);
2712 p_buf=p_first_CCWB;
2713 while (p_buf!=NULL) {
2714 dumpit((char *)p_buf, sizeof(struct ccwbk));
2715 p_buf=p_buf->next;
2716 }
2717
2718#endif
2719 add_claw_reads( dev ,p_first_CCWB , p_last_CCWB); 1948 add_claw_reads( dev ,p_first_CCWB , p_last_CCWB);
2720 privptr->buffs_alloc = 1; 1949 privptr->buffs_alloc = 1;
2721#ifdef FUNCTRACE 1950
2722 printk(KERN_INFO "%s: %s() exit on line %d\n",
2723 dev->name,__func__,__LINE__);
2724#endif
2725 return 0; 1951 return 0;
2726} /* end of init_ccw_bk */ 1952} /* end of init_ccw_bk */
2727 1953
@@ -2735,14 +1961,8 @@ static void
2735probe_error( struct ccwgroup_device *cgdev) 1961probe_error( struct ccwgroup_device *cgdev)
2736{ 1962{
2737 struct claw_privbk *privptr; 1963 struct claw_privbk *privptr;
2738#ifdef FUNCTRACE 1964
2739 printk(KERN_INFO "%s enter \n",__func__); 1965 CLAW_DBF_TEXT(4, trace, "proberr");
2740#endif
2741 CLAW_DBF_TEXT(4,trace,"proberr");
2742#ifdef DEBUGMSG
2743 printk(KERN_INFO "%s variable cgdev =\n",__func__);
2744 dumpit((char *) cgdev, sizeof(struct ccwgroup_device));
2745#endif
2746 privptr=(struct claw_privbk *)cgdev->dev.driver_data; 1966 privptr=(struct claw_privbk *)cgdev->dev.driver_data;
2747 if (privptr!=NULL) { 1967 if (privptr!=NULL) {
2748 kfree(privptr->p_env); 1968 kfree(privptr->p_env);
@@ -2752,16 +1972,9 @@ probe_error( struct ccwgroup_device *cgdev)
2752 kfree(privptr); 1972 kfree(privptr);
2753 privptr=NULL; 1973 privptr=NULL;
2754 } 1974 }
2755#ifdef FUNCTRACE
2756 printk(KERN_INFO "%s > exit on line %d\n",
2757 __func__,__LINE__);
2758#endif
2759
2760 return; 1975 return;
2761} /* probe_error */ 1976} /* probe_error */
2762 1977
2763
2764
2765/*-------------------------------------------------------------------* 1978/*-------------------------------------------------------------------*
2766* claw_process_control * 1979* claw_process_control *
2767* * 1980* *
@@ -2783,32 +1996,19 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
2783 struct conncmd *p_connect=NULL; 1996 struct conncmd *p_connect=NULL;
2784 int rc; 1997 int rc;
2785 struct chbk *p_ch = NULL; 1998 struct chbk *p_ch = NULL;
2786#ifdef FUNCTRACE 1999 struct device *tdev;
2787 printk(KERN_INFO "%s: %s() > enter \n", 2000 CLAW_DBF_TEXT(2, setup, "clw_cntl");
2788 dev->name,__func__);
2789#endif
2790 CLAW_DBF_TEXT(2,setup,"clw_cntl");
2791#ifdef DEBUGMSG
2792 printk(KERN_INFO "%s: variable dev =\n",dev->name);
2793 dumpit((char *) dev, sizeof(struct net_device));
2794 printk(KERN_INFO "%s: variable p_ccw =\n",dev->name);
2795 dumpit((char *) p_ccw, sizeof(struct ccwbk *));
2796#endif
2797 udelay(1000); /* Wait a ms for the control packets to 2001 udelay(1000); /* Wait a ms for the control packets to
2798 *catch up to each other */ 2002 *catch up to each other */
2799 privptr=dev->priv; 2003 privptr=dev->priv;
2800 p_env=privptr->p_env; 2004 p_env=privptr->p_env;
2005 tdev = &privptr->channel[READ].cdev->dev;
2801 memcpy( &temp_host_name, p_env->host_name, 8); 2006 memcpy( &temp_host_name, p_env->host_name, 8);
2802 memcpy( &temp_ws_name, p_env->adapter_name , 8); 2007 memcpy( &temp_ws_name, p_env->adapter_name , 8);
2803 printk(KERN_INFO "%s: CLAW device %.8s: " 2008 printk(KERN_INFO "%s: CLAW device %.8s: "
2804 "Received Control Packet\n", 2009 "Received Control Packet\n",
2805 dev->name, temp_ws_name); 2010 dev->name, temp_ws_name);
2806 if (privptr->release_pend==1) { 2011 if (privptr->release_pend==1) {
2807#ifdef FUNCTRACE
2808 printk(KERN_INFO "%s: %s() > "
2809 "exit on line %d, rc=0\n",
2810 dev->name,__func__,__LINE__);
2811#endif
2812 return 0; 2012 return 0;
2813 } 2013 }
2814 p_buf=p_ccw->p_buffer; 2014 p_buf=p_ccw->p_buffer;
@@ -2818,261 +2018,246 @@ claw_process_control( struct net_device *dev, struct ccwbk * p_ccw)
2818 } else { 2018 } else {
2819 memcpy(p_ctlbk, p_buf, sizeof(struct clawctl)); 2019 memcpy(p_ctlbk, p_buf, sizeof(struct clawctl));
2820 } 2020 }
2821#ifdef IOTRACE
2822 printk(KERN_INFO "%s: dump claw control data inbound\n",dev->name);
2823 dumpit((char *)p_ctlbk, sizeof(struct clawctl));
2824#endif
2825 switch (p_ctlbk->command) 2021 switch (p_ctlbk->command)
2826 { 2022 {
2827 case SYSTEM_VALIDATE_REQUEST: 2023 case SYSTEM_VALIDATE_REQUEST:
2828 if (p_ctlbk->version!=CLAW_VERSION_ID) { 2024 if (p_ctlbk->version != CLAW_VERSION_ID) {
2829 claw_snd_sys_validate_rsp(dev, p_ctlbk, 2025 claw_snd_sys_validate_rsp(dev, p_ctlbk,
2830 CLAW_RC_WRONG_VERSION ); 2026 CLAW_RC_WRONG_VERSION);
2831 printk("%s: %d is wrong version id. " 2027 printk("%s: %d is wrong version id. "
2832 "Expected %d\n", 2028 "Expected %d\n",
2833 dev->name, p_ctlbk->version, 2029 dev->name, p_ctlbk->version,
2834 CLAW_VERSION_ID); 2030 CLAW_VERSION_ID);
2835 } 2031 }
2836 p_sysval=(struct sysval *)&(p_ctlbk->data); 2032 p_sysval = (struct sysval *)&(p_ctlbk->data);
2837 printk( "%s: Recv Sys Validate Request: " 2033 printk("%s: Recv Sys Validate Request: "
2838 "Vers=%d,link_id=%d,Corr=%d,WS name=%." 2034 "Vers=%d,link_id=%d,Corr=%d,WS name=%."
2839 "8s,Host name=%.8s\n", 2035 "8s,Host name=%.8s\n",
2840 dev->name, p_ctlbk->version, 2036 dev->name, p_ctlbk->version,
2841 p_ctlbk->linkid, 2037 p_ctlbk->linkid,
2842 p_ctlbk->correlator, 2038 p_ctlbk->correlator,
2843 p_sysval->WS_name, 2039 p_sysval->WS_name,
2844 p_sysval->host_name); 2040 p_sysval->host_name);
2845 if (0!=memcmp(temp_host_name,p_sysval->host_name,8)) { 2041 if (memcmp(temp_host_name, p_sysval->host_name, 8)) {
2846 claw_snd_sys_validate_rsp(dev, p_ctlbk, 2042 claw_snd_sys_validate_rsp(dev, p_ctlbk,
2847 CLAW_RC_NAME_MISMATCH ); 2043 CLAW_RC_NAME_MISMATCH);
2848 CLAW_DBF_TEXT(2,setup,"HSTBAD"); 2044 CLAW_DBF_TEXT(2, setup, "HSTBAD");
2849 CLAW_DBF_TEXT_(2,setup,"%s",p_sysval->host_name); 2045 CLAW_DBF_TEXT_(2, setup, "%s", p_sysval->host_name);
2850 CLAW_DBF_TEXT_(2,setup,"%s",temp_host_name); 2046 CLAW_DBF_TEXT_(2, setup, "%s", temp_host_name);
2851 printk(KERN_INFO "%s: Host name mismatch\n", 2047 printk(KERN_INFO "%s: Host name mismatch\n",
2852 dev->name); 2048 dev->name);
2853 printk(KERN_INFO "%s: Received :%s: " 2049 printk(KERN_INFO "%s: Received :%s: "
2854 "expected :%s: \n", 2050 "expected :%s: \n",
2855 dev->name, 2051 dev->name,
2856 p_sysval->host_name, 2052 p_sysval->host_name,
2857 temp_host_name); 2053 temp_host_name);
2858 } 2054 }
2859 if (0!=memcmp(temp_ws_name,p_sysval->WS_name,8)) { 2055 if (memcmp(temp_ws_name, p_sysval->WS_name, 8)) {
2860 claw_snd_sys_validate_rsp(dev, p_ctlbk, 2056 claw_snd_sys_validate_rsp(dev, p_ctlbk,
2861 CLAW_RC_NAME_MISMATCH ); 2057 CLAW_RC_NAME_MISMATCH);
2862 CLAW_DBF_TEXT(2,setup,"WSNBAD"); 2058 CLAW_DBF_TEXT(2, setup, "WSNBAD");
2863 CLAW_DBF_TEXT_(2,setup,"%s",p_sysval->WS_name); 2059 CLAW_DBF_TEXT_(2, setup, "%s", p_sysval->WS_name);
2864 CLAW_DBF_TEXT_(2,setup,"%s",temp_ws_name); 2060 CLAW_DBF_TEXT_(2, setup, "%s", temp_ws_name);
2865 printk(KERN_INFO "%s: WS name mismatch\n", 2061 printk(KERN_INFO "%s: WS name mismatch\n",
2866 dev->name); 2062 dev->name);
2867 printk(KERN_INFO "%s: Received :%s: " 2063 printk(KERN_INFO "%s: Received :%s: "
2868 "expected :%s: \n", 2064 "expected :%s: \n",
2869 dev->name, 2065 dev->name,
2870 p_sysval->WS_name, 2066 p_sysval->WS_name,
2871 temp_ws_name); 2067 temp_ws_name);
2872 } 2068 }
2873 if (( p_sysval->write_frame_size < p_env->write_size) && 2069 if ((p_sysval->write_frame_size < p_env->write_size) &&
2874 ( p_env->packing == 0)) { 2070 (p_env->packing == 0)) {
2875 claw_snd_sys_validate_rsp(dev, p_ctlbk, 2071 claw_snd_sys_validate_rsp(dev, p_ctlbk,
2876 CLAW_RC_HOST_RCV_TOO_SMALL ); 2072 CLAW_RC_HOST_RCV_TOO_SMALL);
2877 printk(KERN_INFO "%s: host write size is too " 2073 printk(KERN_INFO "%s: host write size is too "
2878 "small\n", dev->name); 2074 "small\n", dev->name);
2879 CLAW_DBF_TEXT(2,setup,"wrtszbad"); 2075 CLAW_DBF_TEXT(2, setup, "wrtszbad");
2880 } 2076 }
2881 if (( p_sysval->read_frame_size < p_env->read_size) && 2077 if ((p_sysval->read_frame_size < p_env->read_size) &&
2882 ( p_env->packing == 0)) { 2078 (p_env->packing == 0)) {
2883 claw_snd_sys_validate_rsp(dev, p_ctlbk, 2079 claw_snd_sys_validate_rsp(dev, p_ctlbk,
2884 CLAW_RC_HOST_RCV_TOO_SMALL ); 2080 CLAW_RC_HOST_RCV_TOO_SMALL);
2885 printk(KERN_INFO "%s: host read size is too " 2081 printk(KERN_INFO "%s: host read size is too "
2886 "small\n", dev->name); 2082 "small\n", dev->name);
2887 CLAW_DBF_TEXT(2,setup,"rdsizbad"); 2083 CLAW_DBF_TEXT(2, setup, "rdsizbad");
2888 } 2084 }
2889 claw_snd_sys_validate_rsp(dev, p_ctlbk, 0 ); 2085 claw_snd_sys_validate_rsp(dev, p_ctlbk, 0);
2890 printk("%s: CLAW device %.8s: System validate" 2086 printk(KERN_INFO "%s: CLAW device %.8s: System validate "
2891 " completed.\n",dev->name, temp_ws_name); 2087 "completed.\n", dev->name, temp_ws_name);
2892 printk("%s: sys Validate Rsize:%d Wsize:%d\n",dev->name, 2088 printk("%s: sys Validate Rsize:%d Wsize:%d\n", dev->name,
2893 p_sysval->read_frame_size,p_sysval->write_frame_size); 2089 p_sysval->read_frame_size, p_sysval->write_frame_size);
2894 privptr->system_validate_comp=1; 2090 privptr->system_validate_comp = 1;
2895 if(strncmp(p_env->api_type,WS_APPL_NAME_PACKED,6) == 0) { 2091 if (strncmp(p_env->api_type, WS_APPL_NAME_PACKED, 6) == 0)
2896 p_env->packing = PACKING_ASK; 2092 p_env->packing = PACKING_ASK;
2897 } 2093 claw_strt_conn_req(dev);
2898 claw_strt_conn_req(dev); 2094 break;
2899 break; 2095 case SYSTEM_VALIDATE_RESPONSE:
2900 2096 p_sysval = (struct sysval *)&(p_ctlbk->data);
2901 case SYSTEM_VALIDATE_RESPONSE: 2097 printk("%s: Recv Sys Validate Resp: Vers=%d,Corr=%d,RC=%d,"
2902 p_sysval=(struct sysval *)&(p_ctlbk->data); 2098 "WS name=%.8s,Host name=%.8s\n",
2903 printk("%s: Recv Sys Validate Resp: Vers=%d,Corr=%d,RC=%d," 2099 dev->name,
2904 "WS name=%.8s,Host name=%.8s\n", 2100 p_ctlbk->version,
2905 dev->name, 2101 p_ctlbk->correlator,
2906 p_ctlbk->version, 2102 p_ctlbk->rc,
2907 p_ctlbk->correlator, 2103 p_sysval->WS_name,
2908 p_ctlbk->rc, 2104 p_sysval->host_name);
2909 p_sysval->WS_name, 2105 switch (p_ctlbk->rc) {
2910 p_sysval->host_name); 2106 case 0:
2911 switch (p_ctlbk->rc) 2107 printk(KERN_INFO "%s: CLAW device "
2912 { 2108 "%.8s: System validate "
2913 case 0: 2109 "completed.\n",
2914 printk(KERN_INFO "%s: CLAW device " 2110 dev->name, temp_ws_name);
2915 "%.8s: System validate " 2111 if (privptr->system_validate_comp == 0)
2916 "completed.\n", 2112 claw_strt_conn_req(dev);
2917 dev->name, temp_ws_name); 2113 privptr->system_validate_comp = 1;
2918 if (privptr->system_validate_comp == 0) 2114 break;
2919 claw_strt_conn_req(dev); 2115 case CLAW_RC_NAME_MISMATCH:
2920 privptr->system_validate_comp=1; 2116 printk(KERN_INFO "%s: Sys Validate "
2921 break; 2117 "Resp : Host, WS name is "
2922 case CLAW_RC_NAME_MISMATCH: 2118 "mismatch\n",
2923 printk(KERN_INFO "%s: Sys Validate " 2119 dev->name);
2924 "Resp : Host, WS name is " 2120 break;
2925 "mismatch\n", 2121 case CLAW_RC_WRONG_VERSION:
2926 dev->name); 2122 printk(KERN_INFO "%s: Sys Validate "
2927 break; 2123 "Resp : Wrong version\n",
2928 case CLAW_RC_WRONG_VERSION: 2124 dev->name);
2929 printk(KERN_INFO "%s: Sys Validate " 2125 break;
2930 "Resp : Wrong version\n", 2126 case CLAW_RC_HOST_RCV_TOO_SMALL:
2931 dev->name); 2127 printk(KERN_INFO "%s: Sys Validate "
2932 break; 2128 "Resp : bad frame size\n",
2933 case CLAW_RC_HOST_RCV_TOO_SMALL: 2129 dev->name);
2934 printk(KERN_INFO "%s: Sys Validate " 2130 break;
2935 "Resp : bad frame size\n", 2131 default:
2936 dev->name); 2132 printk(KERN_INFO "%s: Sys Validate "
2937 break; 2133 "error code=%d \n",
2938 default: 2134 dev->name, p_ctlbk->rc);
2939 printk(KERN_INFO "%s: Sys Validate " 2135 break;
2940 "error code=%d \n", 2136 }
2941 dev->name, p_ctlbk->rc ); 2137 break;
2942 break;
2943 }
2944 break;
2945 2138
2946 case CONNECTION_REQUEST: 2139 case CONNECTION_REQUEST:
2947 p_connect=(struct conncmd *)&(p_ctlbk->data); 2140 p_connect = (struct conncmd *)&(p_ctlbk->data);
2948 printk(KERN_INFO "%s: Recv Conn Req: Vers=%d,link_id=%d," 2141 printk(KERN_INFO "%s: Recv Conn Req: Vers=%d,link_id=%d,"
2949 "Corr=%d,HOST appl=%.8s,WS appl=%.8s\n", 2142 "Corr=%d,HOST appl=%.8s,WS appl=%.8s\n",
2950 dev->name, 2143 dev->name,
2951 p_ctlbk->version, 2144 p_ctlbk->version,
2952 p_ctlbk->linkid, 2145 p_ctlbk->linkid,
2953 p_ctlbk->correlator, 2146 p_ctlbk->correlator,
2954 p_connect->host_name, 2147 p_connect->host_name,
2955 p_connect->WS_name); 2148 p_connect->WS_name);
2956 if (privptr->active_link_ID!=0 ) { 2149 if (privptr->active_link_ID != 0) {
2957 claw_snd_disc(dev, p_ctlbk); 2150 claw_snd_disc(dev, p_ctlbk);
2958 printk(KERN_INFO "%s: Conn Req error : " 2151 printk(KERN_INFO "%s: Conn Req error : "
2959 "already logical link is active \n", 2152 "already logical link is active \n",
2960 dev->name); 2153 dev->name);
2961 } 2154 }
2962 if (p_ctlbk->linkid!=1 ) { 2155 if (p_ctlbk->linkid != 1) {
2963 claw_snd_disc(dev, p_ctlbk); 2156 claw_snd_disc(dev, p_ctlbk);
2964 printk(KERN_INFO "%s: Conn Req error : " 2157 printk(KERN_INFO "%s: Conn Req error : "
2965 "req logical link id is not 1\n", 2158 "req logical link id is not 1\n",
2159 dev->name);
2160 }
2161 rc = find_link(dev, p_connect->host_name, p_connect->WS_name);
2162 if (rc != 0) {
2163 claw_snd_disc(dev, p_ctlbk);
2164 printk(KERN_INFO "%s: Conn Resp error: "
2165 "req appl name does not match\n",
2166 dev->name);
2167 }
2168 claw_send_control(dev,
2169 CONNECTION_CONFIRM, p_ctlbk->linkid,
2170 p_ctlbk->correlator,
2171 0, p_connect->host_name,
2172 p_connect->WS_name);
2173 if (p_env->packing == PACKING_ASK) {
2174 p_env->packing = PACK_SEND;
2175 claw_snd_conn_req(dev, 0);
2176 }
2177 printk(KERN_INFO "%s: CLAW device %.8s: Connection "
2178 "completed link_id=%d.\n",
2179 dev->name, temp_ws_name,
2180 p_ctlbk->linkid);
2181 privptr->active_link_ID = p_ctlbk->linkid;
2182 p_ch = &privptr->channel[WRITE];
2183 wake_up(&p_ch->wait); /* wake up claw_open ( WRITE) */
2184 break;
2185 case CONNECTION_RESPONSE:
2186 p_connect = (struct conncmd *)&(p_ctlbk->data);
2187 printk(KERN_INFO "%s: Revc Conn Resp: Vers=%d,link_id=%d,"
2188 "Corr=%d,RC=%d,Host appl=%.8s, WS appl=%.8s\n",
2189 dev->name,
2190 p_ctlbk->version,
2191 p_ctlbk->linkid,
2192 p_ctlbk->correlator,
2193 p_ctlbk->rc,
2194 p_connect->host_name,
2195 p_connect->WS_name);
2196
2197 if (p_ctlbk->rc != 0) {
2198 printk(KERN_INFO "%s: Conn Resp error: rc=%d \n",
2199 dev->name, p_ctlbk->rc);
2200 return 1;
2201 }
2202 rc = find_link(dev,
2203 p_connect->host_name, p_connect->WS_name);
2204 if (rc != 0) {
2205 claw_snd_disc(dev, p_ctlbk);
2206 printk(KERN_INFO "%s: Conn Resp error: "
2207 "req appl name does not match\n",
2208 dev->name);
2209 }
2210 /* should be until CONNECTION_CONFIRM */
2211 privptr->active_link_ID = -(p_ctlbk->linkid);
2212 break;
2213 case CONNECTION_CONFIRM:
2214 p_connect = (struct conncmd *)&(p_ctlbk->data);
2215 printk(KERN_INFO "%s: Recv Conn Confirm:Vers=%d,link_id=%d,"
2216 "Corr=%d,Host appl=%.8s,WS appl=%.8s\n",
2217 dev->name,
2218 p_ctlbk->version,
2219 p_ctlbk->linkid,
2220 p_ctlbk->correlator,
2221 p_connect->host_name,
2222 p_connect->WS_name);
2223 if (p_ctlbk->linkid == -(privptr->active_link_ID)) {
2224 privptr->active_link_ID = p_ctlbk->linkid;
2225 if (p_env->packing > PACKING_ASK) {
2226 printk(KERN_INFO "%s: Confirmed Now packing\n",
2966 dev->name); 2227 dev->name);
2967 }
2968 rc=find_link(dev,
2969 p_connect->host_name, p_connect->WS_name);
2970 if (rc!=0) {
2971 claw_snd_disc(dev, p_ctlbk);
2972 printk(KERN_INFO "%s: Conn Req error : "
2973 "req appl name does not match\n",
2974 dev->name);
2975 }
2976 claw_send_control(dev,
2977 CONNECTION_CONFIRM, p_ctlbk->linkid,
2978 p_ctlbk->correlator,
2979 0, p_connect->host_name,
2980 p_connect->WS_name);
2981 if (p_env->packing == PACKING_ASK) {
2982 printk("%s: Now Pack ask\n",dev->name);
2983 p_env->packing = PACK_SEND;
2984 claw_snd_conn_req(dev,0);
2985 }
2986 printk(KERN_INFO "%s: CLAW device %.8s: Connection "
2987 "completed link_id=%d.\n",
2988 dev->name, temp_ws_name,
2989 p_ctlbk->linkid);
2990 privptr->active_link_ID=p_ctlbk->linkid;
2991 p_ch=&privptr->channel[WRITE];
2992 wake_up(&p_ch->wait); /* wake up claw_open ( WRITE) */
2993 break;
2994 case CONNECTION_RESPONSE:
2995 p_connect=(struct conncmd *)&(p_ctlbk->data);
2996 printk(KERN_INFO "%s: Revc Conn Resp: Vers=%d,link_id=%d,"
2997 "Corr=%d,RC=%d,Host appl=%.8s, WS appl=%.8s\n",
2998 dev->name,
2999 p_ctlbk->version,
3000 p_ctlbk->linkid,
3001 p_ctlbk->correlator,
3002 p_ctlbk->rc,
3003 p_connect->host_name,
3004 p_connect->WS_name);
3005
3006 if (p_ctlbk->rc !=0 ) {
3007 printk(KERN_INFO "%s: Conn Resp error: rc=%d \n",
3008 dev->name, p_ctlbk->rc);
3009 return 1;
3010 }
3011 rc=find_link(dev,
3012 p_connect->host_name, p_connect->WS_name);
3013 if (rc!=0) {
3014 claw_snd_disc(dev, p_ctlbk);
3015 printk(KERN_INFO "%s: Conn Resp error: "
3016 "req appl name does not match\n",
3017 dev->name);
3018 }
3019 /* should be until CONNECTION_CONFIRM */
3020 privptr->active_link_ID = - (p_ctlbk->linkid);
3021 break;
3022 case CONNECTION_CONFIRM:
3023 p_connect=(struct conncmd *)&(p_ctlbk->data);
3024 printk(KERN_INFO "%s: Recv Conn Confirm:Vers=%d,link_id=%d,"
3025 "Corr=%d,Host appl=%.8s,WS appl=%.8s\n",
3026 dev->name,
3027 p_ctlbk->version,
3028 p_ctlbk->linkid,
3029 p_ctlbk->correlator,
3030 p_connect->host_name,
3031 p_connect->WS_name);
3032 if (p_ctlbk->linkid== -(privptr->active_link_ID)) {
3033 privptr->active_link_ID=p_ctlbk->linkid;
3034 if (p_env->packing > PACKING_ASK) {
3035 printk(KERN_INFO "%s: Confirmed Now packing\n",dev->name);
3036 p_env->packing = DO_PACKED;
3037 }
3038 p_ch=&privptr->channel[WRITE];
3039 wake_up(&p_ch->wait);
3040 }
3041 else {
3042 printk(KERN_INFO "%s: Conn confirm: "
3043 "unexpected linkid=%d \n",
3044 dev->name, p_ctlbk->linkid);
3045 claw_snd_disc(dev, p_ctlbk);
3046 }
3047 break;
3048 case DISCONNECT:
3049 printk(KERN_INFO "%s: Disconnect: "
3050 "Vers=%d,link_id=%d,Corr=%d\n",
3051 dev->name, p_ctlbk->version,
3052 p_ctlbk->linkid, p_ctlbk->correlator);
3053 if ((p_ctlbk->linkid == 2) &&
3054 (p_env->packing == PACK_SEND)) {
3055 privptr->active_link_ID = 1;
3056 p_env->packing = DO_PACKED; 2228 p_env->packing = DO_PACKED;
3057 } 2229 }
3058 else 2230 p_ch = &privptr->channel[WRITE];
3059 privptr->active_link_ID=0; 2231 wake_up(&p_ch->wait);
3060 break; 2232 } else {
3061 case CLAW_ERROR: 2233 printk(KERN_INFO "%s: Conn confirm: "
3062 printk(KERN_INFO "%s: CLAW ERROR detected\n", 2234 "unexpected linkid=%d \n",
3063 dev->name); 2235 dev->name, p_ctlbk->linkid);
3064 break; 2236 claw_snd_disc(dev, p_ctlbk);
3065 default: 2237 }
3066 printk(KERN_INFO "%s: Unexpected command code=%d \n", 2238 break;
3067 dev->name, p_ctlbk->command); 2239 case DISCONNECT:
3068 break; 2240 printk(KERN_INFO "%s: Disconnect: "
2241 "Vers=%d,link_id=%d,Corr=%d\n",
2242 dev->name, p_ctlbk->version,
2243 p_ctlbk->linkid, p_ctlbk->correlator);
2244 if ((p_ctlbk->linkid == 2) &&
2245 (p_env->packing == PACK_SEND)) {
2246 privptr->active_link_ID = 1;
2247 p_env->packing = DO_PACKED;
2248 } else
2249 privptr->active_link_ID = 0;
2250 break;
2251 case CLAW_ERROR:
2252 printk(KERN_INFO "%s: CLAW ERROR detected\n",
2253 dev->name);
2254 break;
2255 default:
2256 printk(KERN_INFO "%s: Unexpected command code=%d \n",
2257 dev->name, p_ctlbk->command);
2258 break;
3069 } 2259 }
3070 2260
3071#ifdef FUNCTRACE
3072 printk(KERN_INFO "%s: %s() exit on line %d, rc = 0\n",
3073 dev->name,__func__,__LINE__);
3074#endif
3075
3076 return 0; 2261 return 0;
3077} /* end of claw_process_control */ 2262} /* end of claw_process_control */
3078 2263
@@ -3092,18 +2277,7 @@ claw_send_control(struct net_device *dev, __u8 type, __u8 link,
3092 struct conncmd *p_connect; 2277 struct conncmd *p_connect;
3093 struct sk_buff *skb; 2278 struct sk_buff *skb;
3094 2279
3095#ifdef FUNCTRACE 2280 CLAW_DBF_TEXT(2, setup, "sndcntl");
3096 printk(KERN_INFO "%s:%s > enter \n",dev->name,__func__);
3097#endif
3098 CLAW_DBF_TEXT(2,setup,"sndcntl");
3099#ifdef DEBUGMSG
3100 printk(KERN_INFO "%s: Sending Control Packet \n",dev->name);
3101 printk(KERN_INFO "%s: variable type = 0x%X, link = "
3102 "%d, correlator = %d, rc = %d\n",
3103 dev->name,type, link, correlator, rc);
3104 printk(KERN_INFO "%s: variable local_name = %s, "
3105 "remote_name = %s\n",dev->name, local_name, remote_name);
3106#endif
3107 privptr=dev->priv; 2281 privptr=dev->priv;
3108 p_ctl=(struct clawctl *)&privptr->ctl_bk; 2282 p_ctl=(struct clawctl *)&privptr->ctl_bk;
3109 2283
@@ -3125,7 +2299,7 @@ claw_send_control(struct net_device *dev, __u8 type, __u8 link,
3125 p_sysval->read_frame_size=DEF_PACK_BUFSIZE; 2299 p_sysval->read_frame_size=DEF_PACK_BUFSIZE;
3126 p_sysval->write_frame_size=DEF_PACK_BUFSIZE; 2300 p_sysval->write_frame_size=DEF_PACK_BUFSIZE;
3127 } else { 2301 } else {
3128 /* how big is the piggest group of packets */ 2302 /* how big is the biggest group of packets */
3129 p_sysval->read_frame_size=privptr->p_env->read_size; 2303 p_sysval->read_frame_size=privptr->p_env->read_size;
3130 p_sysval->write_frame_size=privptr->p_env->write_size; 2304 p_sysval->write_frame_size=privptr->p_env->write_size;
3131 } 2305 }
@@ -3155,29 +2329,14 @@ claw_send_control(struct net_device *dev, __u8 type, __u8 link,
3155 2329
3156 skb = dev_alloc_skb(sizeof(struct clawctl)); 2330 skb = dev_alloc_skb(sizeof(struct clawctl));
3157 if (!skb) { 2331 if (!skb) {
3158 printk( "%s:%s low on mem, returning...\n",
3159 dev->name,__func__);
3160#ifdef DEBUG
3161 printk(KERN_INFO "%s:%s Exit, rc = ENOMEM\n",
3162 dev->name,__func__);
3163#endif
3164 return -ENOMEM; 2332 return -ENOMEM;
3165 } 2333 }
3166 memcpy(skb_put(skb, sizeof(struct clawctl)), 2334 memcpy(skb_put(skb, sizeof(struct clawctl)),
3167 p_ctl, sizeof(struct clawctl)); 2335 p_ctl, sizeof(struct clawctl));
3168#ifdef IOTRACE
3169 printk(KERN_INFO "%s: outbnd claw cntl data \n",dev->name);
3170 dumpit((char *)p_ctl,sizeof(struct clawctl));
3171#endif
3172 if (privptr->p_env->packing >= PACK_SEND) 2336 if (privptr->p_env->packing >= PACK_SEND)
3173 claw_hw_tx(skb, dev, 1); 2337 claw_hw_tx(skb, dev, 1);
3174 else 2338 else
3175 claw_hw_tx(skb, dev, 0); 2339 claw_hw_tx(skb, dev, 0);
3176#ifdef FUNCTRACE
3177 printk(KERN_INFO "%s:%s Exit on line %d\n",
3178 dev->name,__func__,__LINE__);
3179#endif
3180
3181 return 0; 2340 return 0;
3182} /* end of claw_send_control */ 2341} /* end of claw_send_control */
3183 2342
@@ -3192,22 +2351,11 @@ claw_snd_conn_req(struct net_device *dev, __u8 link)
3192 struct claw_privbk *privptr=dev->priv; 2351 struct claw_privbk *privptr=dev->priv;
3193 struct clawctl *p_ctl; 2352 struct clawctl *p_ctl;
3194 2353
3195#ifdef FUNCTRACE 2354 CLAW_DBF_TEXT(2, setup, "snd_conn");
3196 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
3197#endif
3198 CLAW_DBF_TEXT(2,setup,"snd_conn");
3199#ifdef DEBUGMSG
3200 printk(KERN_INFO "%s: variable link = %X, dev =\n",dev->name, link);
3201 dumpit((char *) dev, sizeof(struct net_device));
3202#endif
3203 rc = 1; 2355 rc = 1;
3204 p_ctl=(struct clawctl *)&privptr->ctl_bk; 2356 p_ctl=(struct clawctl *)&privptr->ctl_bk;
3205 p_ctl->linkid = link; 2357 p_ctl->linkid = link;
3206 if ( privptr->system_validate_comp==0x00 ) { 2358 if ( privptr->system_validate_comp==0x00 ) {
3207#ifdef FUNCTRACE
3208 printk(KERN_INFO "%s:%s Exit on line %d, rc = 1\n",
3209 dev->name,__func__,__LINE__);
3210#endif
3211 return rc; 2359 return rc;
3212 } 2360 }
3213 if (privptr->p_env->packing == PACKING_ASK ) 2361 if (privptr->p_env->packing == PACKING_ASK )
@@ -3220,10 +2368,6 @@ claw_snd_conn_req(struct net_device *dev, __u8 link)
3220 if (privptr->p_env->packing == 0) 2368 if (privptr->p_env->packing == 0)
3221 rc=claw_send_control(dev, CONNECTION_REQUEST,0,0,0, 2369 rc=claw_send_control(dev, CONNECTION_REQUEST,0,0,0,
3222 HOST_APPL_NAME, privptr->p_env->api_type); 2370 HOST_APPL_NAME, privptr->p_env->api_type);
3223#ifdef FUNCTRACE
3224 printk(KERN_INFO "%s:%s Exit on line %d, rc = %d\n",
3225 dev->name,__func__,__LINE__, rc);
3226#endif
3227 return rc; 2371 return rc;
3228 2372
3229} /* end of claw_snd_conn_req */ 2373} /* end of claw_snd_conn_req */
@@ -3240,25 +2384,12 @@ claw_snd_disc(struct net_device *dev, struct clawctl * p_ctl)
3240 int rc; 2384 int rc;
3241 struct conncmd * p_connect; 2385 struct conncmd * p_connect;
3242 2386
3243#ifdef FUNCTRACE 2387 CLAW_DBF_TEXT(2, setup, "snd_dsc");
3244 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__);
3245#endif
3246 CLAW_DBF_TEXT(2,setup,"snd_dsc");
3247#ifdef DEBUGMSG
3248 printk(KERN_INFO "%s: variable dev =\n",dev->name);
3249 dumpit((char *) dev, sizeof(struct net_device));
3250 printk(KERN_INFO "%s: variable p_ctl",dev->name);
3251 dumpit((char *) p_ctl, sizeof(struct clawctl));
3252#endif
3253 p_connect=(struct conncmd *)&p_ctl->data; 2388 p_connect=(struct conncmd *)&p_ctl->data;
3254 2389
3255 rc=claw_send_control(dev, DISCONNECT, p_ctl->linkid, 2390 rc=claw_send_control(dev, DISCONNECT, p_ctl->linkid,
3256 p_ctl->correlator, 0, 2391 p_ctl->correlator, 0,
3257 p_connect->host_name, p_connect->WS_name); 2392 p_connect->host_name, p_connect->WS_name);
3258#ifdef FUNCTRACE
3259 printk(KERN_INFO "%s:%s Exit on line %d, rc = %d\n",
3260 dev->name,__func__, __LINE__, rc);
3261#endif
3262 return rc; 2393 return rc;
3263} /* end of claw_snd_disc */ 2394} /* end of claw_snd_disc */
3264 2395
@@ -3276,18 +2407,7 @@ claw_snd_sys_validate_rsp(struct net_device *dev,
3276 struct claw_privbk *privptr; 2407 struct claw_privbk *privptr;
3277 int rc; 2408 int rc;
3278 2409
3279#ifdef FUNCTRACE 2410 CLAW_DBF_TEXT(2, setup, "chkresp");
3280 printk(KERN_INFO "%s:%s Enter\n",
3281 dev->name,__func__);
3282#endif
3283 CLAW_DBF_TEXT(2,setup,"chkresp");
3284#ifdef DEBUGMSG
3285 printk(KERN_INFO "%s: variable return_code = %d, dev =\n",
3286 dev->name, return_code);
3287 dumpit((char *) dev, sizeof(struct net_device));
3288 printk(KERN_INFO "%s: variable p_ctl =\n",dev->name);
3289 dumpit((char *) p_ctl, sizeof(struct clawctl));
3290#endif
3291 privptr = dev->priv; 2411 privptr = dev->priv;
3292 p_env=privptr->p_env; 2412 p_env=privptr->p_env;
3293 rc=claw_send_control(dev, SYSTEM_VALIDATE_RESPONSE, 2413 rc=claw_send_control(dev, SYSTEM_VALIDATE_RESPONSE,
@@ -3296,10 +2416,6 @@ claw_snd_sys_validate_rsp(struct net_device *dev,
3296 return_code, 2416 return_code,
3297 p_env->host_name, 2417 p_env->host_name,
3298 p_env->adapter_name ); 2418 p_env->adapter_name );
3299#ifdef FUNCTRACE
3300 printk(KERN_INFO "%s:%s Exit on line %d, rc = %d\n",
3301 dev->name,__func__,__LINE__, rc);
3302#endif
3303 return rc; 2419 return rc;
3304} /* end of claw_snd_sys_validate_rsp */ 2420} /* end of claw_snd_sys_validate_rsp */
3305 2421
@@ -3313,19 +2429,8 @@ claw_strt_conn_req(struct net_device *dev )
3313{ 2429{
3314 int rc; 2430 int rc;
3315 2431
3316#ifdef FUNCTRACE 2432 CLAW_DBF_TEXT(2, setup, "conn_req");
3317 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__);
3318#endif
3319 CLAW_DBF_TEXT(2,setup,"conn_req");
3320#ifdef DEBUGMSG
3321 printk(KERN_INFO "%s: variable dev =\n",dev->name);
3322 dumpit((char *) dev, sizeof(struct net_device));
3323#endif
3324 rc=claw_snd_conn_req(dev, 1); 2433 rc=claw_snd_conn_req(dev, 1);
3325#ifdef FUNCTRACE
3326 printk(KERN_INFO "%s:%s Exit on line %d, rc = %d\n",
3327 dev->name,__func__,__LINE__, rc);
3328#endif
3329 return rc; 2434 return rc;
3330} /* end of claw_strt_conn_req */ 2435} /* end of claw_strt_conn_req */
3331 2436
@@ -3339,15 +2444,9 @@ static struct
3339net_device_stats *claw_stats(struct net_device *dev) 2444net_device_stats *claw_stats(struct net_device *dev)
3340{ 2445{
3341 struct claw_privbk *privptr; 2446 struct claw_privbk *privptr;
3342#ifdef FUNCTRACE 2447
3343 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__); 2448 CLAW_DBF_TEXT(4, trace, "stats");
3344#endif
3345 CLAW_DBF_TEXT(4,trace,"stats");
3346 privptr = dev->priv; 2449 privptr = dev->priv;
3347#ifdef FUNCTRACE
3348 printk(KERN_INFO "%s:%s Exit on line %d\n",
3349 dev->name,__func__,__LINE__);
3350#endif
3351 return &privptr->stats; 2450 return &privptr->stats;
3352} /* end of claw_stats */ 2451} /* end of claw_stats */
3353 2452
@@ -3368,36 +2467,28 @@ unpack_read(struct net_device *dev )
3368 struct clawph *p_packh; 2467 struct clawph *p_packh;
3369 void *p_packd; 2468 void *p_packd;
3370 struct clawctl *p_ctlrec=NULL; 2469 struct clawctl *p_ctlrec=NULL;
2470 struct device *p_dev;
3371 2471
3372 __u32 len_of_data; 2472 __u32 len_of_data;
3373 __u32 pack_off; 2473 __u32 pack_off;
3374 __u8 link_num; 2474 __u8 link_num;
3375 __u8 mtc_this_frm=0; 2475 __u8 mtc_this_frm=0;
3376 __u32 bytes_to_mov; 2476 __u32 bytes_to_mov;
3377 struct chbk *p_ch = NULL;
3378 int i=0; 2477 int i=0;
3379 int p=0; 2478 int p=0;
3380 2479
3381#ifdef FUNCTRACE 2480 CLAW_DBF_TEXT(4, trace, "unpkread");
3382 printk(KERN_INFO "%s:%s enter \n",dev->name,__func__);
3383#endif
3384 CLAW_DBF_TEXT(4,trace,"unpkread");
3385 p_first_ccw=NULL; 2481 p_first_ccw=NULL;
3386 p_last_ccw=NULL; 2482 p_last_ccw=NULL;
3387 p_packh=NULL; 2483 p_packh=NULL;
3388 p_packd=NULL; 2484 p_packd=NULL;
3389 privptr=dev->priv; 2485 privptr=dev->priv;
2486
2487 p_dev = &privptr->channel[READ].cdev->dev;
3390 p_env = privptr->p_env; 2488 p_env = privptr->p_env;
3391 p_this_ccw=privptr->p_read_active_first; 2489 p_this_ccw=privptr->p_read_active_first;
3392 i=0; 2490 i=0;
3393 while (p_this_ccw!=NULL && p_this_ccw->header.flag!=CLAW_PENDING) { 2491 while (p_this_ccw!=NULL && p_this_ccw->header.flag!=CLAW_PENDING) {
3394#ifdef IOTRACE
3395 printk(KERN_INFO "%s p_this_ccw \n",dev->name);
3396 dumpit((char*)p_this_ccw, sizeof(struct ccwbk));
3397 printk(KERN_INFO "%s Inbound p_this_ccw->p_buffer(64)"
3398 " pk=%d \n",dev->name,p_env->packing);
3399 dumpit((char *)p_this_ccw->p_buffer, 64 );
3400#endif
3401 pack_off = 0; 2492 pack_off = 0;
3402 p = 0; 2493 p = 0;
3403 p_this_ccw->header.flag=CLAW_PENDING; 2494 p_this_ccw->header.flag=CLAW_PENDING;
@@ -3419,10 +2510,6 @@ unpack_read(struct net_device *dev )
3419 else 2510 else
3420 link_num=p_this_ccw->header.opcode / 8; 2511 link_num=p_this_ccw->header.opcode / 8;
3421 if ((p_this_ccw->header.opcode & MORE_to_COME_FLAG)!=0) { 2512 if ((p_this_ccw->header.opcode & MORE_to_COME_FLAG)!=0) {
3422#ifdef DEBUGMSG
3423 printk(KERN_INFO "%s: %s > More_to_come is ON\n",
3424 dev->name,__func__);
3425#endif
3426 mtc_this_frm=1; 2513 mtc_this_frm=1;
3427 if (p_this_ccw->header.length!= 2514 if (p_this_ccw->header.length!=
3428 privptr->p_env->read_size ) { 2515 privptr->p_env->read_size ) {
@@ -3445,22 +2532,12 @@ unpack_read(struct net_device *dev )
3445 privptr->mtc_skipping=0; /* Ok, the end */ 2532 privptr->mtc_skipping=0; /* Ok, the end */
3446 privptr->mtc_logical_link=-1; 2533 privptr->mtc_logical_link=-1;
3447 } 2534 }
3448#ifdef DEBUGMSG
3449 printk(KERN_INFO "%s:%s goto next "
3450 "frame from MoretoComeSkip \n",
3451 dev->name,__func__);
3452#endif
3453 goto NextFrame; 2535 goto NextFrame;
3454 } 2536 }
3455 2537
3456 if (link_num==0) { 2538 if (link_num==0) {
3457 claw_process_control(dev, p_this_ccw); 2539 claw_process_control(dev, p_this_ccw);
3458#ifdef DEBUGMSG 2540 CLAW_DBF_TEXT(4, trace, "UnpkCntl");
3459 printk(KERN_INFO "%s:%s goto next "
3460 "frame from claw_process_control \n",
3461 dev->name,__func__);
3462#endif
3463 CLAW_DBF_TEXT(4,trace,"UnpkCntl");
3464 goto NextFrame; 2541 goto NextFrame;
3465 } 2542 }
3466unpack_next: 2543unpack_next:
@@ -3479,10 +2556,6 @@ unpack_next:
3479 bytes_to_mov=p_this_ccw->header.length; 2556 bytes_to_mov=p_this_ccw->header.length;
3480 } 2557 }
3481 if (privptr->mtc_logical_link<0) { 2558 if (privptr->mtc_logical_link<0) {
3482#ifdef DEBUGMSG
3483 printk(KERN_INFO "%s: %s mtc_logical_link < 0 \n",
3484 dev->name,__func__);
3485#endif
3486 2559
3487 /* 2560 /*
3488 * if More-To-Come is set in this frame then we don't know 2561 * if More-To-Come is set in this frame then we don't know
@@ -3496,15 +2569,6 @@ unpack_next:
3496 2569
3497 if (bytes_to_mov > (MAX_ENVELOPE_SIZE- privptr->mtc_offset) ) { 2570 if (bytes_to_mov > (MAX_ENVELOPE_SIZE- privptr->mtc_offset) ) {
3498 /* error */ 2571 /* error */
3499#ifdef DEBUGMSG
3500 printk(KERN_INFO "%s: %s > goto next "
3501 "frame from MoretoComeSkip \n",
3502 dev->name,
3503 __func__);
3504 printk(KERN_INFO " bytes_to_mov %d > (MAX_ENVELOPE_"
3505 "SIZE-privptr->mtc_offset %d)\n",
3506 bytes_to_mov,(MAX_ENVELOPE_SIZE- privptr->mtc_offset));
3507#endif
3508 privptr->stats.rx_frame_errors++; 2572 privptr->stats.rx_frame_errors++;
3509 goto NextFrame; 2573 goto NextFrame;
3510 } 2574 }
@@ -3516,16 +2580,6 @@ unpack_next:
3516 memcpy( privptr->p_mtc_envelope+ privptr->mtc_offset, 2580 memcpy( privptr->p_mtc_envelope+ privptr->mtc_offset,
3517 p_this_ccw->p_buffer, bytes_to_mov); 2581 p_this_ccw->p_buffer, bytes_to_mov);
3518 } 2582 }
3519#ifdef DEBUGMSG
3520 printk(KERN_INFO "%s: %s() received data \n",
3521 dev->name,__func__);
3522 if (p_env->packing == DO_PACKED)
3523 dumpit((char *)p_packd+sizeof(struct clawph),32);
3524 else
3525 dumpit((char *)p_this_ccw->p_buffer, 32);
3526 printk(KERN_INFO "%s: %s() bytelength %d \n",
3527 dev->name,__func__,bytes_to_mov);
3528#endif
3529 if (mtc_this_frm==0) { 2583 if (mtc_this_frm==0) {
3530 len_of_data=privptr->mtc_offset+bytes_to_mov; 2584 len_of_data=privptr->mtc_offset+bytes_to_mov;
3531 skb=dev_alloc_skb(len_of_data); 2585 skb=dev_alloc_skb(len_of_data);
@@ -3540,11 +2594,6 @@ unpack_next:
3540 privptr->stats.rx_packets++; 2594 privptr->stats.rx_packets++;
3541 privptr->stats.rx_bytes+=len_of_data; 2595 privptr->stats.rx_bytes+=len_of_data;
3542 netif_rx(skb); 2596 netif_rx(skb);
3543#ifdef DEBUGMSG
3544 printk(KERN_INFO "%s: %s() netif_"
3545 "rx(skb) completed \n",
3546 dev->name,__func__);
3547#endif
3548 } 2597 }
3549 else { 2598 else {
3550 privptr->stats.rx_dropped++; 2599 privptr->stats.rx_dropped++;
@@ -3581,28 +2630,14 @@ NextFrame:
3581 * chain to next block on active read queue 2630 * chain to next block on active read queue
3582 */ 2631 */
3583 p_this_ccw = privptr->p_read_active_first; 2632 p_this_ccw = privptr->p_read_active_first;
3584 CLAW_DBF_TEXT_(4,trace,"rxpkt %d",p); 2633 CLAW_DBF_TEXT_(4, trace, "rxpkt %d", p);
3585 } /* end of while */ 2634 } /* end of while */
3586 2635
3587 /* check validity */ 2636 /* check validity */
3588 2637
3589#ifdef IOTRACE 2638 CLAW_DBF_TEXT_(4, trace, "rxfrm %d", i);
3590 printk(KERN_INFO "%s:%s processed frame is %d \n",
3591 dev->name,__func__,i);
3592 printk(KERN_INFO "%s:%s F:%lx L:%lx\n",
3593 dev->name,
3594 __func__,
3595 (unsigned long)p_first_ccw,
3596 (unsigned long)p_last_ccw);
3597#endif
3598 CLAW_DBF_TEXT_(4,trace,"rxfrm %d",i);
3599 add_claw_reads(dev, p_first_ccw, p_last_ccw); 2639 add_claw_reads(dev, p_first_ccw, p_last_ccw);
3600 p_ch=&privptr->channel[READ];
3601 claw_strt_read(dev, LOCK_YES); 2640 claw_strt_read(dev, LOCK_YES);
3602#ifdef FUNCTRACE
3603 printk(KERN_INFO "%s: %s exit on line %d\n",
3604 dev->name, __func__, __LINE__);
3605#endif
3606 return; 2641 return;
3607} /* end of unpack_read */ 2642} /* end of unpack_read */
3608 2643
@@ -3622,12 +2657,7 @@ claw_strt_read (struct net_device *dev, int lock )
3622 struct clawh *p_clawh; 2657 struct clawh *p_clawh;
3623 p_ch=&privptr->channel[READ]; 2658 p_ch=&privptr->channel[READ];
3624 2659
3625#ifdef FUNCTRACE 2660 CLAW_DBF_TEXT(4, trace, "StRdNter");
3626 printk(KERN_INFO "%s:%s Enter \n",dev->name,__func__);
3627 printk(KERN_INFO "%s: variable lock = %d, dev =\n",dev->name, lock);
3628 dumpit((char *) dev, sizeof(struct net_device));
3629#endif
3630 CLAW_DBF_TEXT(4,trace,"StRdNter");
3631 p_clawh=(struct clawh *)privptr->p_claw_signal_blk; 2661 p_clawh=(struct clawh *)privptr->p_claw_signal_blk;
3632 p_clawh->flag=CLAW_IDLE; /* 0x00 */ 2662 p_clawh->flag=CLAW_IDLE; /* 0x00 */
3633 2663
@@ -3637,21 +2667,11 @@ claw_strt_read (struct net_device *dev, int lock )
3637 privptr->p_read_active_first->header.flag!=CLAW_PENDING )) { 2667 privptr->p_read_active_first->header.flag!=CLAW_PENDING )) {
3638 p_clawh->flag=CLAW_BUSY; /* 0xff */ 2668 p_clawh->flag=CLAW_BUSY; /* 0xff */
3639 } 2669 }
3640#ifdef DEBUGMSG
3641 printk(KERN_INFO "%s:%s state-%02x\n" ,
3642 dev->name,__func__, p_ch->claw_state);
3643#endif
3644 if (lock==LOCK_YES) { 2670 if (lock==LOCK_YES) {
3645 spin_lock_irqsave(get_ccwdev_lock(p_ch->cdev), saveflags); 2671 spin_lock_irqsave(get_ccwdev_lock(p_ch->cdev), saveflags);
3646 } 2672 }
3647 if (test_and_set_bit(0, (void *)&p_ch->IO_active) == 0) { 2673 if (test_and_set_bit(0, (void *)&p_ch->IO_active) == 0) {
3648#ifdef DEBUGMSG 2674 CLAW_DBF_TEXT(4, trace, "HotRead");
3649 printk(KERN_INFO "%s: HOT READ started in %s\n" ,
3650 dev->name,__func__);
3651 p_clawh=(struct clawh *)privptr->p_claw_signal_blk;
3652 dumpit((char *)&p_clawh->flag , 1);
3653#endif
3654 CLAW_DBF_TEXT(4,trace,"HotRead");
3655 p_ccwbk=privptr->p_read_active_first; 2675 p_ccwbk=privptr->p_read_active_first;
3656 parm = (unsigned long) p_ch; 2676 parm = (unsigned long) p_ch;
3657 rc = ccw_device_start (p_ch->cdev, &p_ccwbk->read, parm, 2677 rc = ccw_device_start (p_ch->cdev, &p_ccwbk->read, parm,
@@ -3661,21 +2681,13 @@ claw_strt_read (struct net_device *dev, int lock )
3661 } 2681 }
3662 } 2682 }
3663 else { 2683 else {
3664#ifdef DEBUGMSG 2684 CLAW_DBF_TEXT(2, trace, "ReadAct");
3665 printk(KERN_INFO "%s: No READ started by %s() In progress\n" ,
3666 dev->name,__func__);
3667#endif
3668 CLAW_DBF_TEXT(2,trace,"ReadAct");
3669 } 2685 }
3670 2686
3671 if (lock==LOCK_YES) { 2687 if (lock==LOCK_YES) {
3672 spin_unlock_irqrestore(get_ccwdev_lock(p_ch->cdev), saveflags); 2688 spin_unlock_irqrestore(get_ccwdev_lock(p_ch->cdev), saveflags);
3673 } 2689 }
3674#ifdef FUNCTRACE 2690 CLAW_DBF_TEXT(4, trace, "StRdExit");
3675 printk(KERN_INFO "%s:%s Exit on line %d\n",
3676 dev->name,__func__,__LINE__);
3677#endif
3678 CLAW_DBF_TEXT(4,trace,"StRdExit");
3679 return; 2691 return;
3680} /* end of claw_strt_read */ 2692} /* end of claw_strt_read */
3681 2693
@@ -3693,38 +2705,23 @@ claw_strt_out_IO( struct net_device *dev )
3693 struct chbk *p_ch; 2705 struct chbk *p_ch;
3694 struct ccwbk *p_first_ccw; 2706 struct ccwbk *p_first_ccw;
3695 2707
3696#ifdef FUNCTRACE
3697 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__);
3698#endif
3699 if (!dev) { 2708 if (!dev) {
3700 return; 2709 return;
3701 } 2710 }
3702 privptr=(struct claw_privbk *)dev->priv; 2711 privptr=(struct claw_privbk *)dev->priv;
3703 p_ch=&privptr->channel[WRITE]; 2712 p_ch=&privptr->channel[WRITE];
3704 2713
3705#ifdef DEBUGMSG 2714 CLAW_DBF_TEXT(4, trace, "strt_io");
3706 printk(KERN_INFO "%s:%s state-%02x\n" ,
3707 dev->name,__func__,p_ch->claw_state);
3708#endif
3709 CLAW_DBF_TEXT(4,trace,"strt_io");
3710 p_first_ccw=privptr->p_write_active_first; 2715 p_first_ccw=privptr->p_write_active_first;
3711 2716
3712 if (p_ch->claw_state == CLAW_STOP) 2717 if (p_ch->claw_state == CLAW_STOP)
3713 return; 2718 return;
3714 if (p_first_ccw == NULL) { 2719 if (p_first_ccw == NULL) {
3715#ifdef FUNCTRACE
3716 printk(KERN_INFO "%s:%s Exit on line %d\n",
3717 dev->name,__func__,__LINE__);
3718#endif
3719 return; 2720 return;
3720 } 2721 }
3721 if (test_and_set_bit(0, (void *)&p_ch->IO_active) == 0) { 2722 if (test_and_set_bit(0, (void *)&p_ch->IO_active) == 0) {
3722 parm = (unsigned long) p_ch; 2723 parm = (unsigned long) p_ch;
3723#ifdef DEBUGMSG 2724 CLAW_DBF_TEXT(2, trace, "StWrtIO");
3724 printk(KERN_INFO "%s:%s do_io \n" ,dev->name,__func__);
3725 dumpit((char *)p_first_ccw, sizeof(struct ccwbk));
3726#endif
3727 CLAW_DBF_TEXT(2,trace,"StWrtIO");
3728 rc = ccw_device_start (p_ch->cdev,&p_first_ccw->write, parm, 2725 rc = ccw_device_start (p_ch->cdev,&p_first_ccw->write, parm,
3729 0xff, 0); 2726 0xff, 0);
3730 if (rc != 0) { 2727 if (rc != 0) {
@@ -3732,11 +2729,6 @@ claw_strt_out_IO( struct net_device *dev )
3732 } 2729 }
3733 } 2730 }
3734 dev->trans_start = jiffies; 2731 dev->trans_start = jiffies;
3735#ifdef FUNCTRACE
3736 printk(KERN_INFO "%s:%s Exit on line %d\n",
3737 dev->name,__func__,__LINE__);
3738#endif
3739
3740 return; 2732 return;
3741} /* end of claw_strt_out_IO */ 2733} /* end of claw_strt_out_IO */
3742 2734
@@ -3754,32 +2746,11 @@ claw_free_wrt_buf( struct net_device *dev )
3754 struct ccwbk*p_last_ccw; 2746 struct ccwbk*p_last_ccw;
3755 struct ccwbk*p_this_ccw; 2747 struct ccwbk*p_this_ccw;
3756 struct ccwbk*p_next_ccw; 2748 struct ccwbk*p_next_ccw;
3757#ifdef IOTRACE 2749
3758 struct ccwbk*p_buf; 2750 CLAW_DBF_TEXT(4, trace, "freewrtb");
3759#endif
3760#ifdef FUNCTRACE
3761 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__);
3762 printk(KERN_INFO "%s: free count = %d variable dev =\n",
3763 dev->name,privptr->write_free_count);
3764#endif
3765 CLAW_DBF_TEXT(4,trace,"freewrtb");
3766 /* scan the write queue to free any completed write packets */ 2751 /* scan the write queue to free any completed write packets */
3767 p_first_ccw=NULL; 2752 p_first_ccw=NULL;
3768 p_last_ccw=NULL; 2753 p_last_ccw=NULL;
3769#ifdef IOTRACE
3770 printk(KERN_INFO "%s: Dump current CCW chain \n",dev->name );
3771 p_buf=privptr->p_write_active_first;
3772 while (p_buf!=NULL) {
3773 dumpit((char *)p_buf, sizeof(struct ccwbk));
3774 p_buf=p_buf->next;
3775 }
3776 if (p_buf==NULL) {
3777 printk(KERN_INFO "%s: privptr->p_write_"
3778 "active_first==NULL\n",dev->name );
3779 }
3780 p_buf=(struct ccwbk*)privptr->p_end_ccw;
3781 dumpit((char *)p_buf, sizeof(struct endccw));
3782#endif
3783 p_this_ccw=privptr->p_write_active_first; 2754 p_this_ccw=privptr->p_write_active_first;
3784 while ( (p_this_ccw!=NULL) && (p_this_ccw->header.flag!=CLAW_PENDING)) 2755 while ( (p_this_ccw!=NULL) && (p_this_ccw->header.flag!=CLAW_PENDING))
3785 { 2756 {
@@ -3809,31 +2780,8 @@ claw_free_wrt_buf( struct net_device *dev )
3809 /* whole chain removed? */ 2780 /* whole chain removed? */
3810 if (privptr->p_write_active_first==NULL) { 2781 if (privptr->p_write_active_first==NULL) {
3811 privptr->p_write_active_last=NULL; 2782 privptr->p_write_active_last=NULL;
3812#ifdef DEBUGMSG
3813 printk(KERN_INFO "%s:%s p_write_"
3814 "active_first==NULL\n",dev->name,__func__);
3815#endif
3816 }
3817#ifdef IOTRACE
3818 printk(KERN_INFO "%s: Dump arranged CCW chain \n",dev->name );
3819 p_buf=privptr->p_write_active_first;
3820 while (p_buf!=NULL) {
3821 dumpit((char *)p_buf, sizeof(struct ccwbk));
3822 p_buf=p_buf->next;
3823 } 2783 }
3824 if (p_buf==NULL) { 2784 CLAW_DBF_TEXT_(4, trace, "FWC=%d", privptr->write_free_count);
3825 printk(KERN_INFO "%s: privptr->p_write_active_"
3826 "first==NULL\n",dev->name );
3827 }
3828 p_buf=(struct ccwbk*)privptr->p_end_ccw;
3829 dumpit((char *)p_buf, sizeof(struct endccw));
3830#endif
3831
3832 CLAW_DBF_TEXT_(4,trace,"FWC=%d",privptr->write_free_count);
3833#ifdef FUNCTRACE
3834 printk(KERN_INFO "%s:%s Exit on line %d free_count =%d\n",
3835 dev->name,__func__, __LINE__,privptr->write_free_count);
3836#endif
3837 return; 2785 return;
3838} 2786}
3839 2787
@@ -3845,14 +2793,11 @@ static void
3845claw_free_netdevice(struct net_device * dev, int free_dev) 2793claw_free_netdevice(struct net_device * dev, int free_dev)
3846{ 2794{
3847 struct claw_privbk *privptr; 2795 struct claw_privbk *privptr;
3848#ifdef FUNCTRACE
3849 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__);
3850#endif
3851 CLAW_DBF_TEXT(2,setup,"free_dev");
3852 2796
2797 CLAW_DBF_TEXT(2, setup, "free_dev");
3853 if (!dev) 2798 if (!dev)
3854 return; 2799 return;
3855 CLAW_DBF_TEXT_(2,setup,"%s",dev->name); 2800 CLAW_DBF_TEXT_(2, setup, "%s", dev->name);
3856 privptr = dev->priv; 2801 privptr = dev->priv;
3857 if (dev->flags & IFF_RUNNING) 2802 if (dev->flags & IFF_RUNNING)
3858 claw_release(dev); 2803 claw_release(dev);
@@ -3865,10 +2810,7 @@ claw_free_netdevice(struct net_device * dev, int free_dev)
3865 free_netdev(dev); 2810 free_netdev(dev);
3866 } 2811 }
3867#endif 2812#endif
3868 CLAW_DBF_TEXT(2,setup,"feee_ok"); 2813 CLAW_DBF_TEXT(2, setup, "free_ok");
3869#ifdef FUNCTRACE
3870 printk(KERN_INFO "%s:%s Exit\n",dev->name,__func__);
3871#endif
3872} 2814}
3873 2815
3874/** 2816/**
@@ -3879,17 +2821,8 @@ claw_free_netdevice(struct net_device * dev, int free_dev)
3879static void 2821static void
3880claw_init_netdevice(struct net_device * dev) 2822claw_init_netdevice(struct net_device * dev)
3881{ 2823{
3882#ifdef FUNCTRACE 2824 CLAW_DBF_TEXT(2, setup, "init_dev");
3883 printk(KERN_INFO "%s:%s Enter\n",dev->name,__func__); 2825 CLAW_DBF_TEXT_(2, setup, "%s", dev->name);
3884#endif
3885 CLAW_DBF_TEXT(2,setup,"init_dev");
3886 CLAW_DBF_TEXT_(2,setup,"%s",dev->name);
3887 if (!dev) {
3888 printk(KERN_WARNING "claw:%s BAD Device exit line %d\n",
3889 __func__,__LINE__);
3890 CLAW_DBF_TEXT(2,setup,"baddev");
3891 return;
3892 }
3893 dev->mtu = CLAW_DEFAULT_MTU_SIZE; 2826 dev->mtu = CLAW_DEFAULT_MTU_SIZE;
3894 dev->hard_start_xmit = claw_tx; 2827 dev->hard_start_xmit = claw_tx;
3895 dev->open = claw_open; 2828 dev->open = claw_open;
@@ -3901,10 +2834,7 @@ claw_init_netdevice(struct net_device * dev)
3901 dev->type = ARPHRD_SLIP; 2834 dev->type = ARPHRD_SLIP;
3902 dev->tx_queue_len = 1300; 2835 dev->tx_queue_len = 1300;
3903 dev->flags = IFF_POINTOPOINT | IFF_NOARP; 2836 dev->flags = IFF_POINTOPOINT | IFF_NOARP;
3904#ifdef FUNCTRACE 2837 CLAW_DBF_TEXT(2, setup, "initok");
3905 printk(KERN_INFO "%s:%s Exit\n",dev->name,__func__);
3906#endif
3907 CLAW_DBF_TEXT(2,setup,"initok");
3908 return; 2838 return;
3909} 2839}
3910 2840
@@ -3921,10 +2851,7 @@ add_channel(struct ccw_device *cdev,int i,struct claw_privbk *privptr)
3921 struct chbk *p_ch; 2851 struct chbk *p_ch;
3922 struct ccw_dev_id dev_id; 2852 struct ccw_dev_id dev_id;
3923 2853
3924#ifdef FUNCTRACE 2854 CLAW_DBF_TEXT_(2, setup, "%s", cdev->dev.bus_id);
3925 printk(KERN_INFO "%s:%s Enter\n",cdev->dev.bus_id,__func__);
3926#endif
3927 CLAW_DBF_TEXT_(2,setup,"%s",cdev->dev.bus_id);
3928 privptr->channel[i].flag = i+1; /* Read is 1 Write is 2 */ 2855 privptr->channel[i].flag = i+1; /* Read is 1 Write is 2 */
3929 p_ch = &privptr->channel[i]; 2856 p_ch = &privptr->channel[i];
3930 p_ch->cdev = cdev; 2857 p_ch->cdev = cdev;
@@ -3932,18 +2859,8 @@ add_channel(struct ccw_device *cdev,int i,struct claw_privbk *privptr)
3932 ccw_device_get_id(cdev, &dev_id); 2859 ccw_device_get_id(cdev, &dev_id);
3933 p_ch->devno = dev_id.devno; 2860 p_ch->devno = dev_id.devno;
3934 if ((p_ch->irb = kzalloc(sizeof (struct irb),GFP_KERNEL)) == NULL) { 2861 if ((p_ch->irb = kzalloc(sizeof (struct irb),GFP_KERNEL)) == NULL) {
3935 printk(KERN_WARNING "%s Out of memory in %s for irb\n",
3936 p_ch->id,__func__);
3937#ifdef FUNCTRACE
3938 printk(KERN_INFO "%s:%s Exit on line %d\n",
3939 p_ch->id,__func__,__LINE__);
3940#endif
3941 return -ENOMEM; 2862 return -ENOMEM;
3942 } 2863 }
3943#ifdef FUNCTRACE
3944 printk(KERN_INFO "%s:%s Exit on line %d\n",
3945 cdev->dev.bus_id,__func__,__LINE__);
3946#endif
3947 return 0; 2864 return 0;
3948} 2865}
3949 2866
@@ -3965,9 +2882,8 @@ claw_new_device(struct ccwgroup_device *cgdev)
3965 int ret; 2882 int ret;
3966 struct ccw_dev_id dev_id; 2883 struct ccw_dev_id dev_id;
3967 2884
3968 pr_debug("%s() called\n", __func__);
3969 printk(KERN_INFO "claw: add for %s\n",cgdev->cdev[READ]->dev.bus_id); 2885 printk(KERN_INFO "claw: add for %s\n",cgdev->cdev[READ]->dev.bus_id);
3970 CLAW_DBF_TEXT(2,setup,"new_dev"); 2886 CLAW_DBF_TEXT(2, setup, "new_dev");
3971 privptr = cgdev->dev.driver_data; 2887 privptr = cgdev->dev.driver_data;
3972 cgdev->cdev[READ]->dev.driver_data = privptr; 2888 cgdev->cdev[READ]->dev.driver_data = privptr;
3973 cgdev->cdev[WRITE]->dev.driver_data = privptr; 2889 cgdev->cdev[WRITE]->dev.driver_data = privptr;
@@ -3982,22 +2898,21 @@ claw_new_device(struct ccwgroup_device *cgdev)
3982 if (ret == 0) 2898 if (ret == 0)
3983 ret = add_channel(cgdev->cdev[1],1,privptr); 2899 ret = add_channel(cgdev->cdev[1],1,privptr);
3984 if (ret != 0) { 2900 if (ret != 0) {
3985 printk(KERN_WARNING 2901 printk(KERN_WARNING
3986 "add channel failed " 2902 "add channel failed with ret = %d\n", ret);
3987 "with ret = %d\n", ret); 2903 goto out;
3988 goto out;
3989 } 2904 }
3990 ret = ccw_device_set_online(cgdev->cdev[READ]); 2905 ret = ccw_device_set_online(cgdev->cdev[READ]);
3991 if (ret != 0) { 2906 if (ret != 0) {
3992 printk(KERN_WARNING 2907 printk(KERN_WARNING
3993 "claw: ccw_device_set_online %s READ failed " 2908 "claw: ccw_device_set_online %s READ failed "
3994 "with ret = %d\n",cgdev->cdev[READ]->dev.bus_id,ret); 2909 "with ret = %d\n",cgdev->cdev[READ]->dev.bus_id,ret);
3995 goto out; 2910 goto out;
3996 } 2911 }
3997 ret = ccw_device_set_online(cgdev->cdev[WRITE]); 2912 ret = ccw_device_set_online(cgdev->cdev[WRITE]);
3998 if (ret != 0) { 2913 if (ret != 0) {
3999 printk(KERN_WARNING 2914 printk(KERN_WARNING
4000 "claw: ccw_device_set_online %s WRITE failed " 2915 "claw: ccw_device_set_online %s WRITE failed "
4001 "with ret = %d\n",cgdev->cdev[WRITE]->dev.bus_id, ret); 2916 "with ret = %d\n",cgdev->cdev[WRITE]->dev.bus_id, ret);
4002 goto out; 2917 goto out;
4003 } 2918 }
@@ -4014,18 +2929,16 @@ claw_new_device(struct ccwgroup_device *cgdev)
4014 SET_NETDEV_DEV(dev, &cgdev->dev); 2929 SET_NETDEV_DEV(dev, &cgdev->dev);
4015 if (register_netdev(dev) != 0) { 2930 if (register_netdev(dev) != 0) {
4016 claw_free_netdevice(dev, 1); 2931 claw_free_netdevice(dev, 1);
4017 CLAW_DBF_TEXT(2,trace,"regfail"); 2932 CLAW_DBF_TEXT(2, trace, "regfail");
4018 goto out; 2933 goto out;
4019 } 2934 }
4020 dev->flags &=~IFF_RUNNING; 2935 dev->flags &=~IFF_RUNNING;
4021 if (privptr->buffs_alloc == 0) { 2936 if (privptr->buffs_alloc == 0) {
4022 ret=init_ccw_bk(dev); 2937 ret=init_ccw_bk(dev);
4023 if (ret !=0) { 2938 if (ret !=0) {
4024 printk(KERN_WARNING
4025 "claw: init_ccw_bk failed with ret=%d\n", ret);
4026 unregister_netdev(dev); 2939 unregister_netdev(dev);
4027 claw_free_netdevice(dev,1); 2940 claw_free_netdevice(dev,1);
4028 CLAW_DBF_TEXT(2,trace,"ccwmem"); 2941 CLAW_DBF_TEXT(2, trace, "ccwmem");
4029 goto out; 2942 goto out;
4030 } 2943 }
4031 } 2944 }
@@ -4047,7 +2960,6 @@ claw_new_device(struct ccwgroup_device *cgdev)
4047out: 2960out:
4048 ccw_device_set_offline(cgdev->cdev[1]); 2961 ccw_device_set_offline(cgdev->cdev[1]);
4049 ccw_device_set_offline(cgdev->cdev[0]); 2962 ccw_device_set_offline(cgdev->cdev[0]);
4050
4051 return -ENODEV; 2963 return -ENODEV;
4052} 2964}
4053 2965
@@ -4056,8 +2968,7 @@ claw_purge_skb_queue(struct sk_buff_head *q)
4056{ 2968{
4057 struct sk_buff *skb; 2969 struct sk_buff *skb;
4058 2970
4059 CLAW_DBF_TEXT(4,trace,"purgque"); 2971 CLAW_DBF_TEXT(4, trace, "purgque");
4060
4061 while ((skb = skb_dequeue(q))) { 2972 while ((skb = skb_dequeue(q))) {
4062 atomic_dec(&skb->users); 2973 atomic_dec(&skb->users);
4063 dev_kfree_skb_any(skb); 2974 dev_kfree_skb_any(skb);
@@ -4078,8 +2989,7 @@ claw_shutdown_device(struct ccwgroup_device *cgdev)
4078 struct net_device *ndev; 2989 struct net_device *ndev;
4079 int ret; 2990 int ret;
4080 2991
4081 pr_debug("%s() called\n", __func__); 2992 CLAW_DBF_TEXT_(2, setup, "%s", cgdev->dev.bus_id);
4082 CLAW_DBF_TEXT_(2,setup,"%s",cgdev->dev.bus_id);
4083 priv = cgdev->dev.driver_data; 2993 priv = cgdev->dev.driver_data;
4084 if (!priv) 2994 if (!priv)
4085 return -ENODEV; 2995 return -ENODEV;
@@ -4108,13 +3018,10 @@ claw_remove_device(struct ccwgroup_device *cgdev)
4108{ 3018{
4109 struct claw_privbk *priv; 3019 struct claw_privbk *priv;
4110 3020
4111 pr_debug("%s() called\n", __func__); 3021 BUG_ON(!cgdev);
4112 CLAW_DBF_TEXT_(2,setup,"%s",cgdev->dev.bus_id); 3022 CLAW_DBF_TEXT_(2, setup, "%s", cgdev->dev.bus_id);
4113 priv = cgdev->dev.driver_data; 3023 priv = cgdev->dev.driver_data;
4114 if (!priv) { 3024 BUG_ON(!priv);
4115 printk(KERN_WARNING "claw: %s() no Priv exiting\n",__func__);
4116 return;
4117 }
4118 printk(KERN_INFO "claw: %s() called %s will be removed.\n", 3025 printk(KERN_INFO "claw: %s() called %s will be removed.\n",
4119 __func__,cgdev->cdev[0]->dev.bus_id); 3026 __func__,cgdev->cdev[0]->dev.bus_id);
4120 if (cgdev->state == CCWGROUP_ONLINE) 3027 if (cgdev->state == CCWGROUP_ONLINE)
@@ -4133,6 +3040,8 @@ claw_remove_device(struct ccwgroup_device *cgdev)
4133 cgdev->cdev[READ]->dev.driver_data = NULL; 3040 cgdev->cdev[READ]->dev.driver_data = NULL;
4134 cgdev->cdev[WRITE]->dev.driver_data = NULL; 3041 cgdev->cdev[WRITE]->dev.driver_data = NULL;
4135 put_device(&cgdev->dev); 3042 put_device(&cgdev->dev);
3043
3044 return;
4136} 3045}
4137 3046
4138 3047
@@ -4168,8 +3077,8 @@ claw_hname_write(struct device *dev, struct device_attribute *attr, const char *
4168 strncpy(p_env->host_name,buf, count); 3077 strncpy(p_env->host_name,buf, count);
4169 p_env->host_name[count-1] = 0x20; /* clear extra 0x0a */ 3078 p_env->host_name[count-1] = 0x20; /* clear extra 0x0a */
4170 p_env->host_name[MAX_NAME_LEN] = 0x00; 3079 p_env->host_name[MAX_NAME_LEN] = 0x00;
4171 CLAW_DBF_TEXT(2,setup,"HstnSet"); 3080 CLAW_DBF_TEXT(2, setup, "HstnSet");
4172 CLAW_DBF_TEXT_(2,setup,"%s",p_env->host_name); 3081 CLAW_DBF_TEXT_(2, setup, "%s", p_env->host_name);
4173 3082
4174 return count; 3083 return count;
4175} 3084}
@@ -4186,7 +3095,7 @@ claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf)
4186 if (!priv) 3095 if (!priv)
4187 return -ENODEV; 3096 return -ENODEV;
4188 p_env = priv->p_env; 3097 p_env = priv->p_env;
4189 return sprintf(buf, "%s\n",p_env->adapter_name); 3098 return sprintf(buf, "%s\n", p_env->adapter_name);
4190} 3099}
4191 3100
4192static ssize_t 3101static ssize_t
@@ -4205,8 +3114,8 @@ claw_adname_write(struct device *dev, struct device_attribute *attr, const char
4205 strncpy(p_env->adapter_name,buf, count); 3114 strncpy(p_env->adapter_name,buf, count);
4206 p_env->adapter_name[count-1] = 0x20; /* clear extra 0x0a */ 3115 p_env->adapter_name[count-1] = 0x20; /* clear extra 0x0a */
4207 p_env->adapter_name[MAX_NAME_LEN] = 0x00; 3116 p_env->adapter_name[MAX_NAME_LEN] = 0x00;
4208 CLAW_DBF_TEXT(2,setup,"AdnSet"); 3117 CLAW_DBF_TEXT(2, setup, "AdnSet");
4209 CLAW_DBF_TEXT_(2,setup,"%s",p_env->adapter_name); 3118 CLAW_DBF_TEXT_(2, setup, "%s", p_env->adapter_name);
4210 3119
4211 return count; 3120 return count;
4212} 3121}
@@ -4247,15 +3156,15 @@ claw_apname_write(struct device *dev, struct device_attribute *attr, const char
4247 p_env->read_size=DEF_PACK_BUFSIZE; 3156 p_env->read_size=DEF_PACK_BUFSIZE;
4248 p_env->write_size=DEF_PACK_BUFSIZE; 3157 p_env->write_size=DEF_PACK_BUFSIZE;
4249 p_env->packing=PACKING_ASK; 3158 p_env->packing=PACKING_ASK;
4250 CLAW_DBF_TEXT(2,setup,"PACKING"); 3159 CLAW_DBF_TEXT(2, setup, "PACKING");
4251 } 3160 }
4252 else { 3161 else {
4253 p_env->packing=0; 3162 p_env->packing=0;
4254 p_env->read_size=CLAW_FRAME_SIZE; 3163 p_env->read_size=CLAW_FRAME_SIZE;
4255 p_env->write_size=CLAW_FRAME_SIZE; 3164 p_env->write_size=CLAW_FRAME_SIZE;
4256 CLAW_DBF_TEXT(2,setup,"ApiSet"); 3165 CLAW_DBF_TEXT(2, setup, "ApiSet");
4257 } 3166 }
4258 CLAW_DBF_TEXT_(2,setup,"%s",p_env->api_type); 3167 CLAW_DBF_TEXT_(2, setup, "%s", p_env->api_type);
4259 return count; 3168 return count;
4260} 3169}
4261 3170
@@ -4295,8 +3204,8 @@ claw_wbuff_write(struct device *dev, struct device_attribute *attr, const char *
4295 if ((nnn > max ) || (nnn < 2)) 3204 if ((nnn > max ) || (nnn < 2))
4296 return -EINVAL; 3205 return -EINVAL;
4297 p_env->write_buffers = nnn; 3206 p_env->write_buffers = nnn;
4298 CLAW_DBF_TEXT(2,setup,"Wbufset"); 3207 CLAW_DBF_TEXT(2, setup, "Wbufset");
4299 CLAW_DBF_TEXT_(2,setup,"WB=%d",p_env->write_buffers); 3208 CLAW_DBF_TEXT_(2, setup, "WB=%d", p_env->write_buffers);
4300 return count; 3209 return count;
4301} 3210}
4302 3211
@@ -4336,8 +3245,8 @@ claw_rbuff_write(struct device *dev, struct device_attribute *attr, const char *
4336 if ((nnn > max ) || (nnn < 2)) 3245 if ((nnn > max ) || (nnn < 2))
4337 return -EINVAL; 3246 return -EINVAL;
4338 p_env->read_buffers = nnn; 3247 p_env->read_buffers = nnn;
4339 CLAW_DBF_TEXT(2,setup,"Rbufset"); 3248 CLAW_DBF_TEXT(2, setup, "Rbufset");
4340 CLAW_DBF_TEXT_(2,setup,"RB=%d",p_env->read_buffers); 3249 CLAW_DBF_TEXT_(2, setup, "RB=%d", p_env->read_buffers);
4341 return count; 3250 return count;
4342} 3251}
4343 3252
@@ -4359,16 +3268,14 @@ static struct attribute_group claw_attr_group = {
4359static int 3268static int
4360claw_add_files(struct device *dev) 3269claw_add_files(struct device *dev)
4361{ 3270{
4362 pr_debug("%s() called\n", __func__); 3271 CLAW_DBF_TEXT(2, setup, "add_file");
4363 CLAW_DBF_TEXT(2,setup,"add_file");
4364 return sysfs_create_group(&dev->kobj, &claw_attr_group); 3272 return sysfs_create_group(&dev->kobj, &claw_attr_group);
4365} 3273}
4366 3274
4367static void 3275static void
4368claw_remove_files(struct device *dev) 3276claw_remove_files(struct device *dev)
4369{ 3277{
4370 pr_debug("%s() called\n", __func__); 3278 CLAW_DBF_TEXT(2, setup, "rem_file");
4371 CLAW_DBF_TEXT(2,setup,"rem_file");
4372 sysfs_remove_group(&dev->kobj, &claw_attr_group); 3279 sysfs_remove_group(&dev->kobj, &claw_attr_group);
4373} 3280}
4374 3281
@@ -4397,35 +3304,27 @@ claw_init(void)
4397 int ret = 0; 3304 int ret = 0;
4398 printk(KERN_INFO "claw: starting driver\n"); 3305 printk(KERN_INFO "claw: starting driver\n");
4399 3306
4400#ifdef FUNCTRACE
4401 printk(KERN_INFO "claw: %s() enter \n",__func__);
4402#endif
4403 ret = claw_register_debug_facility(); 3307 ret = claw_register_debug_facility();
4404 if (ret) { 3308 if (ret) {
4405 printk(KERN_WARNING "claw: %s() debug_register failed %d\n", 3309 printk(KERN_WARNING "claw: %s() debug_register failed %d\n",
4406 __func__,ret); 3310 __func__,ret);
4407 return ret; 3311 return ret;
4408 } 3312 }
4409 CLAW_DBF_TEXT(2,setup,"init_mod"); 3313 CLAW_DBF_TEXT(2, setup, "init_mod");
4410 ret = register_cu3088_discipline(&claw_group_driver); 3314 ret = register_cu3088_discipline(&claw_group_driver);
4411 if (ret) { 3315 if (ret) {
3316 CLAW_DBF_TEXT(2, setup, "init_bad");
4412 claw_unregister_debug_facility(); 3317 claw_unregister_debug_facility();
4413 printk(KERN_WARNING "claw; %s() cu3088 register failed %d\n", 3318 printk(KERN_WARNING "claw; %s() cu3088 register failed %d\n",
4414 __func__,ret); 3319 __func__,ret);
4415 } 3320 }
4416#ifdef FUNCTRACE
4417 printk(KERN_INFO "claw: %s() exit \n",__func__);
4418#endif
4419 return ret; 3321 return ret;
4420} 3322}
4421 3323
4422module_init(claw_init); 3324module_init(claw_init);
4423module_exit(claw_cleanup); 3325module_exit(claw_cleanup);
4424 3326
4425 3327MODULE_AUTHOR("Andy Richter <richtera@us.ibm.com>");
4426 3328MODULE_DESCRIPTION("Linux for System z CLAW Driver\n" \
4427/*--------------------------------------------------------------------* 3329 "Copyright 2000,2008 IBM Corporation\n");
4428* End of File * 3330MODULE_LICENSE("GPL");
4429*---------------------------------------------------------------------*/
4430
4431
diff --git a/drivers/s390/net/ctcm_dbug.c b/drivers/s390/net/ctcm_dbug.c
index 8eb25d00b2e7..1ca58f153470 100644
--- a/drivers/s390/net/ctcm_dbug.c
+++ b/drivers/s390/net/ctcm_dbug.c
@@ -7,6 +7,7 @@
7 */ 7 */
8 8
9#include <linux/stddef.h> 9#include <linux/stddef.h>
10#include <linux/string.h>
10#include <linux/kernel.h> 11#include <linux/kernel.h>
11#include <linux/errno.h> 12#include <linux/errno.h>
12#include <linux/slab.h> 13#include <linux/slab.h>
@@ -22,15 +23,13 @@
22 * Debug Facility Stuff 23 * Debug Facility Stuff
23 */ 24 */
24 25
25DEFINE_PER_CPU(char[256], ctcm_dbf_txt_buf);
26
27struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS] = { 26struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS] = {
28 [CTCM_DBF_SETUP] = {"ctc_setup", 8, 1, 64, 5, NULL}, 27 [CTCM_DBF_SETUP] = {"ctc_setup", 8, 1, 64, CTC_DBF_INFO, NULL},
29 [CTCM_DBF_ERROR] = {"ctc_error", 8, 1, 64, 3, NULL}, 28 [CTCM_DBF_ERROR] = {"ctc_error", 8, 1, 64, CTC_DBF_ERROR, NULL},
30 [CTCM_DBF_TRACE] = {"ctc_trace", 8, 1, 64, 3, NULL}, 29 [CTCM_DBF_TRACE] = {"ctc_trace", 8, 1, 64, CTC_DBF_ERROR, NULL},
31 [CTCM_DBF_MPC_SETUP] = {"mpc_setup", 8, 1, 64, 5, NULL}, 30 [CTCM_DBF_MPC_SETUP] = {"mpc_setup", 8, 1, 80, CTC_DBF_INFO, NULL},
32 [CTCM_DBF_MPC_ERROR] = {"mpc_error", 8, 1, 64, 3, NULL}, 31 [CTCM_DBF_MPC_ERROR] = {"mpc_error", 8, 1, 80, CTC_DBF_ERROR, NULL},
33 [CTCM_DBF_MPC_TRACE] = {"mpc_trace", 8, 1, 64, 3, NULL}, 32 [CTCM_DBF_MPC_TRACE] = {"mpc_trace", 8, 1, 80, CTC_DBF_ERROR, NULL},
34}; 33};
35 34
36void ctcm_unregister_dbf_views(void) 35void ctcm_unregister_dbf_views(void)
@@ -65,3 +64,17 @@ int ctcm_register_dbf_views(void)
65 return 0; 64 return 0;
66} 65}
67 66
67void ctcm_dbf_longtext(enum ctcm_dbf_names dbf_nix, int level, char *fmt, ...)
68{
69 char dbf_txt_buf[64];
70 va_list args;
71
72 if (level > (ctcm_dbf[dbf_nix].id)->level)
73 return;
74 va_start(args, fmt);
75 vsnprintf(dbf_txt_buf, sizeof(dbf_txt_buf), fmt, args);
76 va_end(args);
77
78 debug_text_event(ctcm_dbf[dbf_nix].id, level, dbf_txt_buf);
79}
80
diff --git a/drivers/s390/net/ctcm_dbug.h b/drivers/s390/net/ctcm_dbug.h
index fdff34fe59a2..26966d0b9abd 100644
--- a/drivers/s390/net/ctcm_dbug.h
+++ b/drivers/s390/net/ctcm_dbug.h
@@ -20,16 +20,17 @@
20#else 20#else
21 #define do_debug 0 21 #define do_debug 0
22#endif 22#endif
23#ifdef DEBUGDATA
24 #define do_debug_data 1
25#else
26 #define do_debug_data 0
27#endif
28#ifdef DEBUGCCW 23#ifdef DEBUGCCW
29 #define do_debug_ccw 1 24 #define do_debug_ccw 1
25 #define DEBUGDATA 1
30#else 26#else
31 #define do_debug_ccw 0 27 #define do_debug_ccw 0
32#endif 28#endif
29#ifdef DEBUGDATA
30 #define do_debug_data 1
31#else
32 #define do_debug_data 0
33#endif
33 34
34/* define dbf debug levels similar to kernel msg levels */ 35/* define dbf debug levels similar to kernel msg levels */
35#define CTC_DBF_ALWAYS 0 /* always print this */ 36#define CTC_DBF_ALWAYS 0 /* always print this */
@@ -42,8 +43,6 @@
42#define CTC_DBF_INFO 5 /* informational */ 43#define CTC_DBF_INFO 5 /* informational */
43#define CTC_DBF_DEBUG 6 /* debug-level messages */ 44#define CTC_DBF_DEBUG 6 /* debug-level messages */
44 45
45DECLARE_PER_CPU(char[256], ctcm_dbf_txt_buf);
46
47enum ctcm_dbf_names { 46enum ctcm_dbf_names {
48 CTCM_DBF_SETUP, 47 CTCM_DBF_SETUP,
49 CTCM_DBF_ERROR, 48 CTCM_DBF_ERROR,
@@ -67,6 +66,7 @@ extern struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS];
67 66
68int ctcm_register_dbf_views(void); 67int ctcm_register_dbf_views(void);
69void ctcm_unregister_dbf_views(void); 68void ctcm_unregister_dbf_views(void);
69void ctcm_dbf_longtext(enum ctcm_dbf_names dbf_nix, int level, char *text, ...);
70 70
71static inline const char *strtail(const char *s, int n) 71static inline const char *strtail(const char *s, int n)
72{ 72{
@@ -74,12 +74,6 @@ static inline const char *strtail(const char *s, int n)
74 return (l > n) ? s + (l - n) : s; 74 return (l > n) ? s + (l - n) : s;
75} 75}
76 76
77/* sort out levels early to avoid unnecessary sprintfs */
78static inline int ctcm_dbf_passes(debug_info_t *dbf_grp, int level)
79{
80 return (dbf_grp->level >= level);
81}
82
83#define CTCM_FUNTAIL strtail((char *)__func__, 16) 77#define CTCM_FUNTAIL strtail((char *)__func__, 16)
84 78
85#define CTCM_DBF_TEXT(name, level, text) \ 79#define CTCM_DBF_TEXT(name, level, text) \
@@ -94,16 +88,7 @@ static inline int ctcm_dbf_passes(debug_info_t *dbf_grp, int level)
94 } while (0) 88 } while (0)
95 89
96#define CTCM_DBF_TEXT_(name, level, text...) \ 90#define CTCM_DBF_TEXT_(name, level, text...) \
97 do { \ 91 ctcm_dbf_longtext(CTCM_DBF_##name, level, text)
98 if (ctcm_dbf_passes(ctcm_dbf[CTCM_DBF_##name].id, level)) { \
99 char *ctcm_dbf_txt_buf = \
100 get_cpu_var(ctcm_dbf_txt_buf); \
101 sprintf(ctcm_dbf_txt_buf, text); \
102 debug_text_event(ctcm_dbf[CTCM_DBF_##name].id, \
103 level, ctcm_dbf_txt_buf); \
104 put_cpu_var(ctcm_dbf_txt_buf); \
105 } \
106 } while (0)
107 92
108/* 93/*
109 * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}. 94 * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
@@ -112,13 +97,13 @@ static inline int ctcm_dbf_passes(debug_info_t *dbf_grp, int level)
112 */ 97 */
113#define CTCM_DBF_DEV_NAME(cat, dev, text) \ 98#define CTCM_DBF_DEV_NAME(cat, dev, text) \
114 do { \ 99 do { \
115 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%s) : %s", \ 100 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%s) :- %s", \
116 CTCM_FUNTAIL, dev->name, text); \ 101 CTCM_FUNTAIL, dev->name, text); \
117 } while (0) 102 } while (0)
118 103
119#define MPC_DBF_DEV_NAME(cat, dev, text) \ 104#define MPC_DBF_DEV_NAME(cat, dev, text) \
120 do { \ 105 do { \
121 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%s) : %s", \ 106 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%s) := %s", \
122 CTCM_FUNTAIL, dev->name, text); \ 107 CTCM_FUNTAIL, dev->name, text); \
123 } while (0) 108 } while (0)
124 109
@@ -137,13 +122,13 @@ static inline int ctcm_dbf_passes(debug_info_t *dbf_grp, int level)
137 */ 122 */
138#define CTCM_DBF_DEV(cat, dev, text) \ 123#define CTCM_DBF_DEV(cat, dev, text) \
139 do { \ 124 do { \
140 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%p) : %s", \ 125 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%p) :-: %s", \
141 CTCM_FUNTAIL, dev, text); \ 126 CTCM_FUNTAIL, dev, text); \
142 } while (0) 127 } while (0)
143 128
144#define MPC_DBF_DEV(cat, dev, text) \ 129#define MPC_DBF_DEV(cat, dev, text) \
145 do { \ 130 do { \
146 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%p) : %s", \ 131 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%p) :=: %s", \
147 CTCM_FUNTAIL, dev, text); \ 132 CTCM_FUNTAIL, dev, text); \
148 } while (0) 133 } while (0)
149 134
diff --git a/drivers/s390/net/ctcm_fsms.c b/drivers/s390/net/ctcm_fsms.c
index 7e6bd387f4d8..0b4e6253abe4 100644
--- a/drivers/s390/net/ctcm_fsms.c
+++ b/drivers/s390/net/ctcm_fsms.c
@@ -190,7 +190,8 @@ static void ctcmpc_chx_send_sweep(fsm_instance *fsm, int event, void *arg);
190void ctcm_ccw_check_rc(struct channel *ch, int rc, char *msg) 190void ctcm_ccw_check_rc(struct channel *ch, int rc, char *msg)
191{ 191{
192 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR, 192 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
193 "ccw error %s (%s): %04x\n", ch->id, msg, rc); 193 "%s(%s): %s: %04x\n",
194 CTCM_FUNTAIL, ch->id, msg, rc);
194 switch (rc) { 195 switch (rc) {
195 case -EBUSY: 196 case -EBUSY:
196 ctcm_pr_warn("%s (%s): Busy !\n", ch->id, msg); 197 ctcm_pr_warn("%s (%s): Busy !\n", ch->id, msg);
@@ -212,7 +213,7 @@ void ctcm_purge_skb_queue(struct sk_buff_head *q)
212{ 213{
213 struct sk_buff *skb; 214 struct sk_buff *skb;
214 215
215 CTCM_DBF_TEXT(TRACE, 3, __FUNCTION__); 216 CTCM_DBF_TEXT(TRACE, CTC_DBF_DEBUG, __func__);
216 217
217 while ((skb = skb_dequeue(q))) { 218 while ((skb = skb_dequeue(q))) {
218 atomic_dec(&skb->users); 219 atomic_dec(&skb->users);
@@ -251,6 +252,8 @@ static void chx_txdone(fsm_instance *fi, int event, void *arg)
251 unsigned long duration; 252 unsigned long duration;
252 struct timespec done_stamp = current_kernel_time(); /* xtime */ 253 struct timespec done_stamp = current_kernel_time(); /* xtime */
253 254
255 CTCM_PR_DEBUG("%s(%s): %s\n", __func__, ch->id, dev->name);
256
254 duration = 257 duration =
255 (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 + 258 (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 +
256 (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000; 259 (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000;
@@ -258,8 +261,9 @@ static void chx_txdone(fsm_instance *fi, int event, void *arg)
258 ch->prof.tx_time = duration; 261 ch->prof.tx_time = duration;
259 262
260 if (ch->irb->scsw.cmd.count != 0) 263 if (ch->irb->scsw.cmd.count != 0)
261 ctcm_pr_debug("%s: TX not complete, remaining %d bytes\n", 264 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
262 dev->name, ch->irb->scsw.cmd.count); 265 "%s(%s): TX not complete, remaining %d bytes",
266 CTCM_FUNTAIL, dev->name, ch->irb->scsw.cmd.count);
263 fsm_deltimer(&ch->timer); 267 fsm_deltimer(&ch->timer);
264 while ((skb = skb_dequeue(&ch->io_queue))) { 268 while ((skb = skb_dequeue(&ch->io_queue))) {
265 priv->stats.tx_packets++; 269 priv->stats.tx_packets++;
@@ -334,7 +338,8 @@ void ctcm_chx_txidle(fsm_instance *fi, int event, void *arg)
334 struct net_device *dev = ch->netdev; 338 struct net_device *dev = ch->netdev;
335 struct ctcm_priv *priv = dev->priv; 339 struct ctcm_priv *priv = dev->priv;
336 340
337 CTCM_DBF_TEXT(TRACE, 6, __FUNCTION__); 341 CTCM_PR_DEBUG("%s(%s): %s\n", __func__, ch->id, dev->name);
342
338 fsm_deltimer(&ch->timer); 343 fsm_deltimer(&ch->timer);
339 fsm_newstate(fi, CTC_STATE_TXIDLE); 344 fsm_newstate(fi, CTC_STATE_TXIDLE);
340 fsm_event(priv->fsm, DEV_EVENT_TXUP, ch->netdev); 345 fsm_event(priv->fsm, DEV_EVENT_TXUP, ch->netdev);
@@ -361,15 +366,17 @@ static void chx_rx(fsm_instance *fi, int event, void *arg)
361 366
362 fsm_deltimer(&ch->timer); 367 fsm_deltimer(&ch->timer);
363 if (len < 8) { 368 if (len < 8) {
364 ctcm_pr_debug("%s: got packet with length %d < 8\n", 369 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
365 dev->name, len); 370 "%s(%s): got packet with length %d < 8\n",
371 CTCM_FUNTAIL, dev->name, len);
366 priv->stats.rx_dropped++; 372 priv->stats.rx_dropped++;
367 priv->stats.rx_length_errors++; 373 priv->stats.rx_length_errors++;
368 goto again; 374 goto again;
369 } 375 }
370 if (len > ch->max_bufsize) { 376 if (len > ch->max_bufsize) {
371 ctcm_pr_debug("%s: got packet with length %d > %d\n", 377 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
372 dev->name, len, ch->max_bufsize); 378 "%s(%s): got packet with length %d > %d\n",
379 CTCM_FUNTAIL, dev->name, len, ch->max_bufsize);
373 priv->stats.rx_dropped++; 380 priv->stats.rx_dropped++;
374 priv->stats.rx_length_errors++; 381 priv->stats.rx_length_errors++;
375 goto again; 382 goto again;
@@ -388,8 +395,9 @@ static void chx_rx(fsm_instance *fi, int event, void *arg)
388 break; 395 break;
389 } 396 }
390 if ((len < block_len) || (len > check_len)) { 397 if ((len < block_len) || (len > check_len)) {
391 ctcm_pr_debug("%s: got block length %d != rx length %d\n", 398 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
392 dev->name, block_len, len); 399 "%s(%s): got block length %d != rx length %d\n",
400 CTCM_FUNTAIL, dev->name, block_len, len);
393 if (do_debug) 401 if (do_debug)
394 ctcmpc_dump_skb(skb, 0); 402 ctcmpc_dump_skb(skb, 0);
395 403
@@ -425,17 +433,23 @@ static void chx_rx(fsm_instance *fi, int event, void *arg)
425 */ 433 */
426static void chx_firstio(fsm_instance *fi, int event, void *arg) 434static void chx_firstio(fsm_instance *fi, int event, void *arg)
427{ 435{
428 struct channel *ch = arg;
429 int rc; 436 int rc;
437 struct channel *ch = arg;
438 int fsmstate = fsm_getstate(fi);
430 439
431 CTCM_DBF_TEXT(TRACE, 6, __FUNCTION__); 440 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
441 "%s(%s) : %02x",
442 CTCM_FUNTAIL, ch->id, fsmstate);
432 443
433 if (fsm_getstate(fi) == CTC_STATE_TXIDLE) 444 ch->sense_rc = 0; /* reset unit check report control */
434 ctcm_pr_debug("%s: remote side issued READ?, init.\n", ch->id); 445 if (fsmstate == CTC_STATE_TXIDLE)
446 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
447 "%s(%s): remote side issued READ?, init.\n",
448 CTCM_FUNTAIL, ch->id);
435 fsm_deltimer(&ch->timer); 449 fsm_deltimer(&ch->timer);
436 if (ctcm_checkalloc_buffer(ch)) 450 if (ctcm_checkalloc_buffer(ch))
437 return; 451 return;
438 if ((fsm_getstate(fi) == CTC_STATE_SETUPWAIT) && 452 if ((fsmstate == CTC_STATE_SETUPWAIT) &&
439 (ch->protocol == CTCM_PROTO_OS390)) { 453 (ch->protocol == CTCM_PROTO_OS390)) {
440 /* OS/390 resp. z/OS */ 454 /* OS/390 resp. z/OS */
441 if (CHANNEL_DIRECTION(ch->flags) == READ) { 455 if (CHANNEL_DIRECTION(ch->flags) == READ) {
@@ -451,7 +465,6 @@ static void chx_firstio(fsm_instance *fi, int event, void *arg)
451 } 465 }
452 return; 466 return;
453 } 467 }
454
455 /* 468 /*
456 * Don't setup a timer for receiving the initial RX frame 469 * Don't setup a timer for receiving the initial RX frame
457 * if in compatibility mode, since VM TCP delays the initial 470 * if in compatibility mode, since VM TCP delays the initial
@@ -505,11 +518,10 @@ static void chx_rxidle(fsm_instance *fi, int event, void *arg)
505 __u16 buflen; 518 __u16 buflen;
506 int rc; 519 int rc;
507 520
508 CTCM_DBF_TEXT(TRACE, 6, __FUNCTION__);
509 fsm_deltimer(&ch->timer); 521 fsm_deltimer(&ch->timer);
510 buflen = *((__u16 *)ch->trans_skb->data); 522 buflen = *((__u16 *)ch->trans_skb->data);
511 if (do_debug) 523 CTCM_PR_DEBUG("%s: %s: Initial RX count = %d\n",
512 ctcm_pr_debug("%s: Initial RX count %d\n", dev->name, buflen); 524 __func__, dev->name, buflen);
513 525
514 if (buflen >= CTCM_INITIAL_BLOCKLEN) { 526 if (buflen >= CTCM_INITIAL_BLOCKLEN) {
515 if (ctcm_checkalloc_buffer(ch)) 527 if (ctcm_checkalloc_buffer(ch))
@@ -524,9 +536,9 @@ static void chx_rxidle(fsm_instance *fi, int event, void *arg)
524 } else 536 } else
525 fsm_event(priv->fsm, DEV_EVENT_RXUP, dev); 537 fsm_event(priv->fsm, DEV_EVENT_RXUP, dev);
526 } else { 538 } else {
527 if (do_debug) 539 CTCM_PR_DEBUG("%s: %s: Initial RX count %d not %d\n",
528 ctcm_pr_debug("%s: Initial RX count %d not %d\n", 540 __func__, dev->name,
529 dev->name, buflen, CTCM_INITIAL_BLOCKLEN); 541 buflen, CTCM_INITIAL_BLOCKLEN);
530 chx_firstio(fi, event, arg); 542 chx_firstio(fi, event, arg);
531 } 543 }
532} 544}
@@ -548,14 +560,12 @@ static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg)
548 fsm_deltimer(&ch->timer); 560 fsm_deltimer(&ch->timer);
549 if (IS_MPC(ch)) { 561 if (IS_MPC(ch)) {
550 timeout = 1500; 562 timeout = 1500;
551 if (do_debug) 563 CTCM_PR_DEBUG("enter %s: cp=%i ch=0x%p id=%s\n",
552 ctcm_pr_debug("ctcm enter: %s(): cp=%i ch=0x%p id=%s\n", 564 __func__, smp_processor_id(), ch, ch->id);
553 __FUNCTION__, smp_processor_id(), ch, ch->id);
554 } 565 }
555 fsm_addtimer(&ch->timer, timeout, CTC_EVENT_TIMER, ch); 566 fsm_addtimer(&ch->timer, timeout, CTC_EVENT_TIMER, ch);
556 fsm_newstate(fi, CTC_STATE_SETUPWAIT); 567 fsm_newstate(fi, CTC_STATE_SETUPWAIT);
557 if (do_debug_ccw && IS_MPC(ch)) 568 CTCM_CCW_DUMP((char *)&ch->ccw[6], sizeof(struct ccw1) * 2);
558 ctcmpc_dumpit((char *)&ch->ccw[6], sizeof(struct ccw1) * 2);
559 569
560 if (event == CTC_EVENT_TIMER) /* only for timer not yet locked */ 570 if (event == CTC_EVENT_TIMER) /* only for timer not yet locked */
561 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); 571 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
@@ -583,24 +593,12 @@ static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg)
583 */ 593 */
584static void ctcm_chx_start(fsm_instance *fi, int event, void *arg) 594static void ctcm_chx_start(fsm_instance *fi, int event, void *arg)
585{ 595{
586 struct channel *ch = arg; 596 struct channel *ch = arg;
587 int rc;
588 struct net_device *dev;
589 unsigned long saveflags; 597 unsigned long saveflags;
598 int rc;
590 599
591 CTCM_DBF_TEXT(TRACE, 5, __FUNCTION__); 600 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s(%s): %s",
592 if (ch == NULL) { 601 CTCM_FUNTAIL, ch->id,
593 ctcm_pr_warn("chx_start ch=NULL\n");
594 return;
595 }
596 if (ch->netdev == NULL) {
597 ctcm_pr_warn("chx_start dev=NULL, id=%s\n", ch->id);
598 return;
599 }
600 dev = ch->netdev;
601
602 if (do_debug)
603 ctcm_pr_debug("%s: %s channel start\n", dev->name,
604 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX"); 602 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
605 603
606 if (ch->trans_skb != NULL) { 604 if (ch->trans_skb != NULL) {
@@ -618,11 +616,12 @@ static void ctcm_chx_start(fsm_instance *fi, int event, void *arg)
618 ch->ccw[1].count = 0; 616 ch->ccw[1].count = 0;
619 } 617 }
620 if (ctcm_checkalloc_buffer(ch)) { 618 if (ctcm_checkalloc_buffer(ch)) {
621 ctcm_pr_notice("%s: %s trans_skb allocation delayed " 619 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
622 "until first transfer\n", dev->name, 620 "%s(%s): %s trans_skb alloc delayed "
621 "until first transfer",
622 CTCM_FUNTAIL, ch->id,
623 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX"); 623 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
624 } 624 }
625
626 ch->ccw[0].cmd_code = CCW_CMD_PREPARE; 625 ch->ccw[0].cmd_code = CCW_CMD_PREPARE;
627 ch->ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC; 626 ch->ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
628 ch->ccw[0].count = 0; 627 ch->ccw[0].count = 0;
@@ -661,7 +660,6 @@ static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg)
661 int rc; 660 int rc;
662 int oldstate; 661 int oldstate;
663 662
664 CTCM_DBF_TEXT(TRACE, 2, __FUNCTION__);
665 fsm_deltimer(&ch->timer); 663 fsm_deltimer(&ch->timer);
666 if (IS_MPC(ch)) 664 if (IS_MPC(ch))
667 fsm_deltimer(&ch->sweep_timer); 665 fsm_deltimer(&ch->sweep_timer);
@@ -684,7 +682,7 @@ static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg)
684 fsm_deltimer(&ch->timer); 682 fsm_deltimer(&ch->timer);
685 if (event != CTC_EVENT_STOP) { 683 if (event != CTC_EVENT_STOP) {
686 fsm_newstate(fi, oldstate); 684 fsm_newstate(fi, oldstate);
687 ctcm_ccw_check_rc(ch, rc, (char *)__FUNCTION__); 685 ctcm_ccw_check_rc(ch, rc, (char *)__func__);
688 } 686 }
689 } 687 }
690} 688}
@@ -703,7 +701,9 @@ static void ctcm_chx_cleanup(fsm_instance *fi, int state,
703 struct net_device *dev = ch->netdev; 701 struct net_device *dev = ch->netdev;
704 struct ctcm_priv *priv = dev->priv; 702 struct ctcm_priv *priv = dev->priv;
705 703
706 CTCM_DBF_TEXT(TRACE, 3, __FUNCTION__); 704 CTCM_DBF_TEXT_(SETUP, CTC_DBF_NOTICE,
705 "%s(%s): %s[%d]\n",
706 CTCM_FUNTAIL, dev->name, ch->id, state);
707 707
708 fsm_deltimer(&ch->timer); 708 fsm_deltimer(&ch->timer);
709 if (IS_MPC(ch)) 709 if (IS_MPC(ch))
@@ -743,7 +743,6 @@ static void ctcm_chx_cleanup(fsm_instance *fi, int state,
743 */ 743 */
744static void ctcm_chx_stopped(fsm_instance *fi, int event, void *arg) 744static void ctcm_chx_stopped(fsm_instance *fi, int event, void *arg)
745{ 745{
746 CTCM_DBF_TEXT(TRACE, 3, __FUNCTION__);
747 ctcm_chx_cleanup(fi, CTC_STATE_STOPPED, arg); 746 ctcm_chx_cleanup(fi, CTC_STATE_STOPPED, arg);
748} 747}
749 748
@@ -771,7 +770,6 @@ static void ctcm_chx_stop(fsm_instance *fi, int event, void *arg)
771 */ 770 */
772static void ctcm_chx_fail(fsm_instance *fi, int event, void *arg) 771static void ctcm_chx_fail(fsm_instance *fi, int event, void *arg)
773{ 772{
774 CTCM_DBF_TEXT(TRACE, 3, __FUNCTION__);
775 ctcm_chx_cleanup(fi, CTC_STATE_NOTOP, arg); 773 ctcm_chx_cleanup(fi, CTC_STATE_NOTOP, arg);
776} 774}
777 775
@@ -809,8 +807,8 @@ static void ctcm_chx_setuperr(fsm_instance *fi, int event, void *arg)
809 } 807 }
810 808
811 CTCM_DBF_TEXT_(ERROR, CTC_DBF_CRIT, 809 CTCM_DBF_TEXT_(ERROR, CTC_DBF_CRIT,
812 "%s : %s error during %s channel setup state=%s\n", 810 "%s(%s) : %s error during %s channel setup state=%s\n",
813 dev->name, ctc_ch_event_names[event], 811 CTCM_FUNTAIL, dev->name, ctc_ch_event_names[event],
814 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX", 812 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX",
815 fsm_getstate_str(fi)); 813 fsm_getstate_str(fi));
816 814
@@ -838,10 +836,12 @@ static void ctcm_chx_restart(fsm_instance *fi, int event, void *arg)
838 int oldstate; 836 int oldstate;
839 int rc; 837 int rc;
840 838
841 CTCM_DBF_TEXT(TRACE, CTC_DBF_NOTICE, __FUNCTION__); 839 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
840 "%s: %s[%d] of %s\n",
841 CTCM_FUNTAIL, ch->id, event, dev->name);
842
842 fsm_deltimer(&ch->timer); 843 fsm_deltimer(&ch->timer);
843 ctcm_pr_debug("%s: %s channel restart\n", dev->name, 844
844 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
845 fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch); 845 fsm_addtimer(&ch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, ch);
846 oldstate = fsm_getstate(fi); 846 oldstate = fsm_getstate(fi);
847 fsm_newstate(fi, CTC_STATE_STARTWAIT); 847 fsm_newstate(fi, CTC_STATE_STARTWAIT);
@@ -876,13 +876,10 @@ static void ctcm_chx_rxiniterr(fsm_instance *fi, int event, void *arg)
876 struct net_device *dev = ch->netdev; 876 struct net_device *dev = ch->netdev;
877 struct ctcm_priv *priv = dev->priv; 877 struct ctcm_priv *priv = dev->priv;
878 878
879 CTCM_DBF_TEXT(SETUP, 3, __FUNCTION__);
880 if (event == CTC_EVENT_TIMER) { 879 if (event == CTC_EVENT_TIMER) {
881 if (!IS_MPCDEV(dev)) 880 if (!IS_MPCDEV(dev))
882 /* TODO : check if MPC deletes timer somewhere */ 881 /* TODO : check if MPC deletes timer somewhere */
883 fsm_deltimer(&ch->timer); 882 fsm_deltimer(&ch->timer);
884 ctcm_pr_debug("%s: Timeout during RX init handshake\n",
885 dev->name);
886 if (ch->retry++ < 3) 883 if (ch->retry++ < 3)
887 ctcm_chx_restart(fi, event, arg); 884 ctcm_chx_restart(fi, event, arg);
888 else { 885 else {
@@ -907,9 +904,10 @@ static void ctcm_chx_rxinitfail(fsm_instance *fi, int event, void *arg)
907 struct net_device *dev = ch->netdev; 904 struct net_device *dev = ch->netdev;
908 struct ctcm_priv *priv = dev->priv; 905 struct ctcm_priv *priv = dev->priv;
909 906
910 CTCM_DBF_TEXT(SETUP, 3, __FUNCTION__); 907 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
908 "%s(%s): RX %s busy, init. fail",
909 CTCM_FUNTAIL, dev->name, ch->id);
911 fsm_newstate(fi, CTC_STATE_RXERR); 910 fsm_newstate(fi, CTC_STATE_RXERR);
912 ctcm_pr_warn("%s: RX busy. Initialization failed\n", dev->name);
913 fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev); 911 fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
914} 912}
915 913
@@ -927,11 +925,10 @@ static void ctcm_chx_rxdisc(fsm_instance *fi, int event, void *arg)
927 struct net_device *dev = ch->netdev; 925 struct net_device *dev = ch->netdev;
928 struct ctcm_priv *priv = dev->priv; 926 struct ctcm_priv *priv = dev->priv;
929 927
930 CTCM_DBF_DEV_NAME(TRACE, dev, "Got remote disconnect, re-initializing"); 928 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
929 "%s: %s: remote disconnect - re-init ...",
930 CTCM_FUNTAIL, dev->name);
931 fsm_deltimer(&ch->timer); 931 fsm_deltimer(&ch->timer);
932 if (do_debug)
933 ctcm_pr_debug("%s: Got remote disconnect, "
934 "re-initializing ...\n", dev->name);
935 /* 932 /*
936 * Notify device statemachine 933 * Notify device statemachine
937 */ 934 */
@@ -961,8 +958,6 @@ static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg)
961 958
962 if (event == CTC_EVENT_TIMER) { 959 if (event == CTC_EVENT_TIMER) {
963 fsm_deltimer(&ch->timer); 960 fsm_deltimer(&ch->timer);
964 CTCM_DBF_DEV_NAME(ERROR, dev,
965 "Timeout during TX init handshake");
966 if (ch->retry++ < 3) 961 if (ch->retry++ < 3)
967 ctcm_chx_restart(fi, event, arg); 962 ctcm_chx_restart(fi, event, arg);
968 else { 963 else {
@@ -971,9 +966,8 @@ static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg)
971 } 966 }
972 } else { 967 } else {
973 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR, 968 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
974 "%s : %s error during channel setup state=%s", 969 "%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
975 dev->name, ctc_ch_event_names[event], 970 ctc_ch_event_names[event], fsm_getstate_str(fi));
976 fsm_getstate_str(fi));
977 971
978 ctcm_pr_warn("%s: Error during TX init handshake\n", dev->name); 972 ctcm_pr_warn("%s: Error during TX init handshake\n", dev->name);
979 } 973 }
@@ -993,15 +987,15 @@ static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg)
993 struct ctcm_priv *priv = dev->priv; 987 struct ctcm_priv *priv = dev->priv;
994 struct sk_buff *skb; 988 struct sk_buff *skb;
995 989
996 if (do_debug) 990 CTCM_PR_DEBUG("Enter: %s: cp=%i ch=0x%p id=%s\n",
997 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n", 991 __func__, smp_processor_id(), ch, ch->id);
998 __FUNCTION__, smp_processor_id(), ch, ch->id);
999 992
1000 fsm_deltimer(&ch->timer); 993 fsm_deltimer(&ch->timer);
1001 if (ch->retry++ > 3) { 994 if (ch->retry++ > 3) {
1002 struct mpc_group *gptr = priv->mpcg; 995 struct mpc_group *gptr = priv->mpcg;
1003 ctcm_pr_debug("%s: TX retry failed, restarting channel\n", 996 CTCM_DBF_TEXT_(TRACE, CTC_DBF_INFO,
1004 dev->name); 997 "%s: %s: retries exceeded",
998 CTCM_FUNTAIL, ch->id);
1005 fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev); 999 fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
1006 /* call restart if not MPC or if MPC and mpcg fsm is ready. 1000 /* call restart if not MPC or if MPC and mpcg fsm is ready.
1007 use gptr as mpc indicator */ 1001 use gptr as mpc indicator */
@@ -1010,7 +1004,9 @@ static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg)
1010 goto done; 1004 goto done;
1011 } 1005 }
1012 1006
1013 ctcm_pr_debug("%s: TX retry %d\n", dev->name, ch->retry); 1007 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
1008 "%s : %s: retry %d",
1009 CTCM_FUNTAIL, ch->id, ch->retry);
1014 skb = skb_peek(&ch->io_queue); 1010 skb = skb_peek(&ch->io_queue);
1015 if (skb) { 1011 if (skb) {
1016 int rc = 0; 1012 int rc = 0;
@@ -1018,8 +1014,9 @@ static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg)
1018 clear_normalized_cda(&ch->ccw[4]); 1014 clear_normalized_cda(&ch->ccw[4]);
1019 ch->ccw[4].count = skb->len; 1015 ch->ccw[4].count = skb->len;
1020 if (set_normalized_cda(&ch->ccw[4], skb->data)) { 1016 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
1021 ctcm_pr_debug("%s: IDAL alloc failed, chan restart\n", 1017 CTCM_DBF_TEXT_(TRACE, CTC_DBF_INFO,
1022 dev->name); 1018 "%s: %s: IDAL alloc failed",
1019 CTCM_FUNTAIL, ch->id);
1023 fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev); 1020 fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
1024 ctcm_chx_restart(fi, event, arg); 1021 ctcm_chx_restart(fi, event, arg);
1025 goto done; 1022 goto done;
@@ -1061,22 +1058,21 @@ static void ctcm_chx_iofatal(fsm_instance *fi, int event, void *arg)
1061 struct channel *ch = arg; 1058 struct channel *ch = arg;
1062 struct net_device *dev = ch->netdev; 1059 struct net_device *dev = ch->netdev;
1063 struct ctcm_priv *priv = dev->priv; 1060 struct ctcm_priv *priv = dev->priv;
1061 int rd = CHANNEL_DIRECTION(ch->flags);
1064 1062
1065 CTCM_DBF_TEXT(TRACE, 3, __FUNCTION__);
1066 fsm_deltimer(&ch->timer); 1063 fsm_deltimer(&ch->timer);
1067 ctcm_pr_warn("%s %s : unrecoverable channel error\n", 1064 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
1068 CTC_DRIVER_NAME, dev->name); 1065 "%s: %s: %s unrecoverable channel error",
1066 CTCM_FUNTAIL, ch->id, rd == READ ? "RX" : "TX");
1067
1069 if (IS_MPC(ch)) { 1068 if (IS_MPC(ch)) {
1070 priv->stats.tx_dropped++; 1069 priv->stats.tx_dropped++;
1071 priv->stats.tx_errors++; 1070 priv->stats.tx_errors++;
1072 } 1071 }
1073 1072 if (rd == READ) {
1074 if (CHANNEL_DIRECTION(ch->flags) == READ) {
1075 ctcm_pr_debug("%s: RX I/O error\n", dev->name);
1076 fsm_newstate(fi, CTC_STATE_RXERR); 1073 fsm_newstate(fi, CTC_STATE_RXERR);
1077 fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev); 1074 fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
1078 } else { 1075 } else {
1079 ctcm_pr_debug("%s: TX I/O error\n", dev->name);
1080 fsm_newstate(fi, CTC_STATE_TXERR); 1076 fsm_newstate(fi, CTC_STATE_TXERR);
1081 fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev); 1077 fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
1082 } 1078 }
@@ -1216,27 +1212,27 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
1216 struct sk_buff *skb; 1212 struct sk_buff *skb;
1217 int first = 1; 1213 int first = 1;
1218 int i; 1214 int i;
1219 struct timespec done_stamp;
1220 __u32 data_space; 1215 __u32 data_space;
1221 unsigned long duration; 1216 unsigned long duration;
1222 struct sk_buff *peekskb; 1217 struct sk_buff *peekskb;
1223 int rc; 1218 int rc;
1224 struct th_header *header; 1219 struct th_header *header;
1225 struct pdu *p_header; 1220 struct pdu *p_header;
1221 struct timespec done_stamp = current_kernel_time(); /* xtime */
1226 1222
1227 if (do_debug) 1223 CTCM_PR_DEBUG("Enter %s: %s cp:%i\n",
1228 ctcm_pr_debug("%s cp:%i enter: %s()\n", 1224 __func__, dev->name, smp_processor_id());
1229 dev->name, smp_processor_id(), __FUNCTION__);
1230 1225
1231 done_stamp = current_kernel_time(); /* xtime */ 1226 duration =
1232 duration = (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 1227 (done_stamp.tv_sec - ch->prof.send_stamp.tv_sec) * 1000000 +
1233 + (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000; 1228 (done_stamp.tv_nsec - ch->prof.send_stamp.tv_nsec) / 1000;
1234 if (duration > ch->prof.tx_time) 1229 if (duration > ch->prof.tx_time)
1235 ch->prof.tx_time = duration; 1230 ch->prof.tx_time = duration;
1236 1231
1237 if (ch->irb->scsw.cmd.count != 0) 1232 if (ch->irb->scsw.cmd.count != 0)
1238 ctcm_pr_debug("%s: TX not complete, remaining %d bytes\n", 1233 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
1239 dev->name, ch->irb->scsw.cmd.count); 1234 "%s(%s): TX not complete, remaining %d bytes",
1235 CTCM_FUNTAIL, dev->name, ch->irb->scsw.cmd.count);
1240 fsm_deltimer(&ch->timer); 1236 fsm_deltimer(&ch->timer);
1241 while ((skb = skb_dequeue(&ch->io_queue))) { 1237 while ((skb = skb_dequeue(&ch->io_queue))) {
1242 priv->stats.tx_packets++; 1238 priv->stats.tx_packets++;
@@ -1250,7 +1246,6 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
1250 } 1246 }
1251 spin_lock(&ch->collect_lock); 1247 spin_lock(&ch->collect_lock);
1252 clear_normalized_cda(&ch->ccw[4]); 1248 clear_normalized_cda(&ch->ccw[4]);
1253
1254 if ((ch->collect_len <= 0) || (grp->in_sweep != 0)) { 1249 if ((ch->collect_len <= 0) || (grp->in_sweep != 0)) {
1255 spin_unlock(&ch->collect_lock); 1250 spin_unlock(&ch->collect_lock);
1256 fsm_newstate(fi, CTC_STATE_TXIDLE); 1251 fsm_newstate(fi, CTC_STATE_TXIDLE);
@@ -1269,17 +1264,13 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
1269 if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue)) 1264 if (ch->prof.maxcqueue < skb_queue_len(&ch->collect_queue))
1270 ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue); 1265 ch->prof.maxcqueue = skb_queue_len(&ch->collect_queue);
1271 i = 0; 1266 i = 0;
1272 1267 p_header = NULL;
1273 if (do_debug_data)
1274 ctcm_pr_debug("ctcmpc: %s() building "
1275 "trans_skb from collect_q \n", __FUNCTION__);
1276
1277 data_space = grp->group_max_buflen - TH_HEADER_LENGTH; 1268 data_space = grp->group_max_buflen - TH_HEADER_LENGTH;
1278 1269
1279 if (do_debug_data) 1270 CTCM_PR_DBGDATA("%s: building trans_skb from collect_q"
1280 ctcm_pr_debug("ctcmpc: %s() building trans_skb from collect_q" 1271 " data_space:%04x\n",
1281 " data_space:%04x\n", __FUNCTION__, data_space); 1272 __func__, data_space);
1282 p_header = NULL; 1273
1283 while ((skb = skb_dequeue(&ch->collect_queue))) { 1274 while ((skb = skb_dequeue(&ch->collect_queue))) {
1284 memcpy(skb_put(ch->trans_skb, skb->len), skb->data, skb->len); 1275 memcpy(skb_put(ch->trans_skb, skb->len), skb->data, skb->len);
1285 p_header = (struct pdu *) 1276 p_header = (struct pdu *)
@@ -1290,15 +1281,12 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
1290 else 1281 else
1291 p_header->pdu_flag |= 0x20; 1282 p_header->pdu_flag |= 0x20;
1292 1283
1293 if (do_debug_data) { 1284 CTCM_PR_DBGDATA("%s: trans_skb len:%04x \n",
1294 ctcm_pr_debug("ctcmpc: %s()trans_skb len:%04x \n", 1285 __func__, ch->trans_skb->len);
1295 __FUNCTION__, ch->trans_skb->len); 1286 CTCM_PR_DBGDATA("%s: pdu header and data for up"
1296 ctcm_pr_debug("ctcmpc: %s() pdu header and data" 1287 " to 32 bytes sent to vtam\n", __func__);
1297 " for up to 32 bytes sent to vtam\n", 1288 CTCM_D3_DUMP((char *)p_header, min_t(int, skb->len, 32));
1298 __FUNCTION__); 1289
1299 ctcmpc_dumpit((char *)p_header,
1300 min_t(int, skb->len, 32));
1301 }
1302 ch->collect_len -= skb->len; 1290 ch->collect_len -= skb->len;
1303 data_space -= skb->len; 1291 data_space -= skb->len;
1304 priv->stats.tx_packets++; 1292 priv->stats.tx_packets++;
@@ -1314,46 +1302,38 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
1314 if (p_header) 1302 if (p_header)
1315 p_header->pdu_flag |= PDU_LAST; /*Say it's the last one*/ 1303 p_header->pdu_flag |= PDU_LAST; /*Say it's the last one*/
1316 header = kzalloc(TH_HEADER_LENGTH, gfp_type()); 1304 header = kzalloc(TH_HEADER_LENGTH, gfp_type());
1317
1318 if (!header) { 1305 if (!header) {
1319 printk(KERN_WARNING "ctcmpc: OUT OF MEMORY IN %s()"
1320 ": Data Lost \n", __FUNCTION__);
1321 spin_unlock(&ch->collect_lock); 1306 spin_unlock(&ch->collect_lock);
1322 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev); 1307 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
1323 goto done; 1308 goto done;
1324 } 1309 }
1325
1326 header->th_ch_flag = TH_HAS_PDU; /* Normal data */ 1310 header->th_ch_flag = TH_HAS_PDU; /* Normal data */
1327 ch->th_seq_num++; 1311 ch->th_seq_num++;
1328 header->th_seq_num = ch->th_seq_num; 1312 header->th_seq_num = ch->th_seq_num;
1329 1313
1330 if (do_debug_data) 1314 CTCM_PR_DBGDATA("%s: ToVTAM_th_seq= %08x\n" ,
1331 ctcm_pr_debug("%s: ToVTAM_th_seq= %08x\n" , 1315 __func__, ch->th_seq_num);
1332 __FUNCTION__, ch->th_seq_num);
1333 1316
1334 memcpy(skb_push(ch->trans_skb, TH_HEADER_LENGTH), header, 1317 memcpy(skb_push(ch->trans_skb, TH_HEADER_LENGTH), header,
1335 TH_HEADER_LENGTH); /* put the TH on the packet */ 1318 TH_HEADER_LENGTH); /* put the TH on the packet */
1336 1319
1337 kfree(header); 1320 kfree(header);
1338 1321
1339 if (do_debug_data) { 1322 CTCM_PR_DBGDATA("%s: trans_skb len:%04x \n",
1340 ctcm_pr_debug("ctcmpc: %s()trans_skb len:%04x \n", 1323 __func__, ch->trans_skb->len);
1341 __FUNCTION__, ch->trans_skb->len); 1324 CTCM_PR_DBGDATA("%s: up-to-50 bytes of trans_skb "
1342 1325 "data to vtam from collect_q\n", __func__);
1343 ctcm_pr_debug("ctcmpc: %s() up-to-50 bytes of trans_skb " 1326 CTCM_D3_DUMP((char *)ch->trans_skb->data,
1344 "data to vtam from collect_q\n", __FUNCTION__);
1345 ctcmpc_dumpit((char *)ch->trans_skb->data,
1346 min_t(int, ch->trans_skb->len, 50)); 1327 min_t(int, ch->trans_skb->len, 50));
1347 }
1348 1328
1349 spin_unlock(&ch->collect_lock); 1329 spin_unlock(&ch->collect_lock);
1350 clear_normalized_cda(&ch->ccw[1]); 1330 clear_normalized_cda(&ch->ccw[1]);
1351 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) { 1331 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
1352 dev_kfree_skb_any(ch->trans_skb); 1332 dev_kfree_skb_any(ch->trans_skb);
1353 ch->trans_skb = NULL; 1333 ch->trans_skb = NULL;
1354 printk(KERN_WARNING 1334 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ERROR,
1355 "ctcmpc: %s()CCW failure - data lost\n", 1335 "%s: %s: IDAL alloc failed",
1356 __FUNCTION__); 1336 CTCM_FUNTAIL, ch->id);
1357 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev); 1337 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
1358 return; 1338 return;
1359 } 1339 }
@@ -1373,7 +1353,6 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
1373 } 1353 }
1374done: 1354done:
1375 ctcm_clear_busy(dev); 1355 ctcm_clear_busy(dev);
1376 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev->name, __FUNCTION__);
1377 return; 1356 return;
1378} 1357}
1379 1358
@@ -1393,26 +1372,25 @@ static void ctcmpc_chx_rx(fsm_instance *fi, int event, void *arg)
1393 struct mpc_group *grp = priv->mpcg; 1372 struct mpc_group *grp = priv->mpcg;
1394 struct sk_buff *skb = ch->trans_skb; 1373 struct sk_buff *skb = ch->trans_skb;
1395 struct sk_buff *new_skb; 1374 struct sk_buff *new_skb;
1396 unsigned long saveflags = 0; /* avoids compiler warning */ 1375 unsigned long saveflags = 0; /* avoids compiler warning */
1397 int len = ch->max_bufsize - ch->irb->scsw.cmd.count; 1376 int len = ch->max_bufsize - ch->irb->scsw.cmd.count;
1398 1377
1399 if (do_debug_data) { 1378 CTCM_PR_DEBUG("%s: %s: cp:%i %s maxbuf : %04x, len: %04x\n",
1400 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG, "mpc_ch_rx %s cp:%i %s\n", 1379 CTCM_FUNTAIL, dev->name, smp_processor_id(),
1401 dev->name, smp_processor_id(), ch->id); 1380 ch->id, ch->max_bufsize, len);
1402 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG, "mpc_ch_rx: maxbuf: %04x "
1403 "len: %04x\n", ch->max_bufsize, len);
1404 }
1405 fsm_deltimer(&ch->timer); 1381 fsm_deltimer(&ch->timer);
1406 1382
1407 if (skb == NULL) { 1383 if (skb == NULL) {
1408 ctcm_pr_debug("ctcmpc exit: %s() TRANS_SKB = NULL \n", 1384 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1409 __FUNCTION__); 1385 "%s(%s): TRANS_SKB = NULL",
1410 goto again; 1386 CTCM_FUNTAIL, dev->name);
1387 goto again;
1411 } 1388 }
1412 1389
1413 if (len < TH_HEADER_LENGTH) { 1390 if (len < TH_HEADER_LENGTH) {
1414 ctcm_pr_info("%s: got packet with invalid length %d\n", 1391 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1415 dev->name, len); 1392 "%s(%s): packet length %d to short",
1393 CTCM_FUNTAIL, dev->name, len);
1416 priv->stats.rx_dropped++; 1394 priv->stats.rx_dropped++;
1417 priv->stats.rx_length_errors++; 1395 priv->stats.rx_length_errors++;
1418 } else { 1396 } else {
@@ -1422,11 +1400,9 @@ static void ctcmpc_chx_rx(fsm_instance *fi, int event, void *arg)
1422 new_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC); 1400 new_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC);
1423 1401
1424 if (new_skb == NULL) { 1402 if (new_skb == NULL) {
1425 printk(KERN_INFO "ctcmpc:%s() NEW_SKB = NULL\n", 1403 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1426 __FUNCTION__); 1404 "%s(%d): skb allocation failed",
1427 printk(KERN_WARNING "ctcmpc: %s() MEMORY ALLOC FAILED" 1405 CTCM_FUNTAIL, dev->name);
1428 " - DATA LOST - MPC FAILED\n",
1429 __FUNCTION__);
1430 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev); 1406 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
1431 goto again; 1407 goto again;
1432 } 1408 }
@@ -1479,9 +1455,8 @@ again:
1479 break; 1455 break;
1480 } 1456 }
1481 1457
1482 if (do_debug) 1458 CTCM_PR_DEBUG("Exit %s: %s, ch=0x%p, id=%s\n",
1483 ctcm_pr_debug("ctcmpc exit : %s %s(): ch=0x%p id=%s\n", 1459 __func__, dev->name, ch, ch->id);
1484 dev->name, __FUNCTION__, ch, ch->id);
1485 1460
1486} 1461}
1487 1462
@@ -1497,15 +1472,16 @@ static void ctcmpc_chx_firstio(fsm_instance *fi, int event, void *arg)
1497 struct channel *ch = arg; 1472 struct channel *ch = arg;
1498 struct net_device *dev = ch->netdev; 1473 struct net_device *dev = ch->netdev;
1499 struct ctcm_priv *priv = dev->priv; 1474 struct ctcm_priv *priv = dev->priv;
1475 struct mpc_group *gptr = priv->mpcg;
1476
1477 CTCM_PR_DEBUG("Enter %s: id=%s, ch=0x%p\n",
1478 __func__, ch->id, ch);
1479
1480 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_INFO,
1481 "%s: %s: chstate:%i, grpstate:%i, prot:%i\n",
1482 CTCM_FUNTAIL, ch->id, fsm_getstate(fi),
1483 fsm_getstate(gptr->fsm), ch->protocol);
1500 1484
1501 if (do_debug) {
1502 struct mpc_group *gptr = priv->mpcg;
1503 ctcm_pr_debug("ctcmpc enter: %s(): ch=0x%p id=%s\n",
1504 __FUNCTION__, ch, ch->id);
1505 ctcm_pr_debug("%s() %s chstate:%i grpstate:%i chprotocol:%i\n",
1506 __FUNCTION__, ch->id, fsm_getstate(fi),
1507 fsm_getstate(gptr->fsm), ch->protocol);
1508 }
1509 if (fsm_getstate(fi) == CTC_STATE_TXIDLE) 1485 if (fsm_getstate(fi) == CTC_STATE_TXIDLE)
1510 MPC_DBF_DEV_NAME(TRACE, dev, "remote side issued READ? "); 1486 MPC_DBF_DEV_NAME(TRACE, dev, "remote side issued READ? ");
1511 1487
@@ -1531,9 +1507,8 @@ static void ctcmpc_chx_firstio(fsm_instance *fi, int event, void *arg)
1531 ? CTC_STATE_RXINIT : CTC_STATE_TXINIT); 1507 ? CTC_STATE_RXINIT : CTC_STATE_TXINIT);
1532 1508
1533done: 1509done:
1534 if (do_debug) 1510 CTCM_PR_DEBUG("Exit %s: id=%s, ch=0x%p\n",
1535 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n", 1511 __func__, ch->id, ch);
1536 __FUNCTION__, ch, ch->id);
1537 return; 1512 return;
1538} 1513}
1539 1514
@@ -1556,12 +1531,9 @@ void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg)
1556 unsigned long saveflags = 0; /* avoids compiler warning */ 1531 unsigned long saveflags = 0; /* avoids compiler warning */
1557 1532
1558 fsm_deltimer(&ch->timer); 1533 fsm_deltimer(&ch->timer);
1559 ctcm_pr_debug("%s cp:%i enter: %s()\n", 1534 CTCM_PR_DEBUG("%s: %s: %s: cp:%i, chstate:%i grpstate:%i\n",
1560 dev->name, smp_processor_id(), __FUNCTION__); 1535 __func__, ch->id, dev->name, smp_processor_id(),
1561 if (do_debug) 1536 fsm_getstate(fi), fsm_getstate(grp->fsm));
1562 ctcm_pr_debug("%s() %s chstate:%i grpstate:%i\n",
1563 __FUNCTION__, ch->id,
1564 fsm_getstate(fi), fsm_getstate(grp->fsm));
1565 1537
1566 fsm_newstate(fi, CTC_STATE_RXIDLE); 1538 fsm_newstate(fi, CTC_STATE_RXIDLE);
1567 /* XID processing complete */ 1539 /* XID processing complete */
@@ -1575,9 +1547,7 @@ void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg)
1575 skb_reset_tail_pointer(ch->trans_skb); 1547 skb_reset_tail_pointer(ch->trans_skb);
1576 ch->trans_skb->len = 0; 1548 ch->trans_skb->len = 0;
1577 ch->ccw[1].count = ch->max_bufsize; 1549 ch->ccw[1].count = ch->max_bufsize;
1578 if (do_debug_ccw) 1550 CTCM_CCW_DUMP((char *)&ch->ccw[0], sizeof(struct ccw1) * 3);
1579 ctcmpc_dumpit((char *)&ch->ccw[0],
1580 sizeof(struct ccw1) * 3);
1581 if (event == CTC_EVENT_START) 1551 if (event == CTC_EVENT_START)
1582 /* see remark about conditional locking */ 1552 /* see remark about conditional locking */
1583 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); 1553 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
@@ -1598,9 +1568,6 @@ void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg)
1598 1568
1599 fsm_event(priv->fsm, DEV_EVENT_RXUP, dev); 1569 fsm_event(priv->fsm, DEV_EVENT_RXUP, dev);
1600done: 1570done:
1601 if (do_debug)
1602 ctcm_pr_debug("ctcmpc exit: %s %s()\n",
1603 dev->name, __FUNCTION__);
1604 return; 1571 return;
1605} 1572}
1606 1573
@@ -1616,13 +1583,9 @@ static void ctcmpc_chx_attn(fsm_instance *fsm, int event, void *arg)
1616 struct ctcm_priv *priv = dev->priv; 1583 struct ctcm_priv *priv = dev->priv;
1617 struct mpc_group *grp = priv->mpcg; 1584 struct mpc_group *grp = priv->mpcg;
1618 1585
1619 if (do_debug) { 1586 CTCM_PR_DEBUG("%s(%s): %s(ch=0x%p), cp=%i, ChStat:%s, GrpStat:%s\n",
1620 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s" 1587 __func__, dev->name, ch->id, ch, smp_processor_id(),
1621 "GrpState:%s ChState:%s\n", 1588 fsm_getstate_str(ch->fsm), fsm_getstate_str(grp->fsm));
1622 __FUNCTION__, smp_processor_id(), ch, ch->id,
1623 fsm_getstate_str(grp->fsm),
1624 fsm_getstate_str(ch->fsm));
1625 }
1626 1589
1627 switch (fsm_getstate(grp->fsm)) { 1590 switch (fsm_getstate(grp->fsm)) {
1628 case MPCG_STATE_XID2INITW: 1591 case MPCG_STATE_XID2INITW:
@@ -1664,11 +1627,7 @@ static void ctcmpc_chx_attn(fsm_instance *fsm, int event, void *arg)
1664 break; 1627 break;
1665 } 1628 }
1666 1629
1667 if (do_debug)
1668 ctcm_pr_debug("ctcmpc exit : %s(): cp=%i ch=0x%p id=%s\n",
1669 __FUNCTION__, smp_processor_id(), ch, ch->id);
1670 return; 1630 return;
1671
1672} 1631}
1673 1632
1674/* 1633/*
@@ -1683,11 +1642,9 @@ static void ctcmpc_chx_attnbusy(fsm_instance *fsm, int event, void *arg)
1683 struct ctcm_priv *priv = dev->priv; 1642 struct ctcm_priv *priv = dev->priv;
1684 struct mpc_group *grp = priv->mpcg; 1643 struct mpc_group *grp = priv->mpcg;
1685 1644
1686 ctcm_pr_debug("ctcmpc enter: %s %s() %s \nGrpState:%s ChState:%s\n", 1645 CTCM_PR_DEBUG("%s(%s): %s\n ChState:%s GrpState:%s\n",
1687 dev->name, 1646 __func__, dev->name, ch->id,
1688 __FUNCTION__, ch->id, 1647 fsm_getstate_str(ch->fsm), fsm_getstate_str(grp->fsm));
1689 fsm_getstate_str(grp->fsm),
1690 fsm_getstate_str(ch->fsm));
1691 1648
1692 fsm_deltimer(&ch->timer); 1649 fsm_deltimer(&ch->timer);
1693 1650
@@ -1750,16 +1707,12 @@ static void ctcmpc_chx_attnbusy(fsm_instance *fsm, int event, void *arg)
1750 if (ch->in_mpcgroup) 1707 if (ch->in_mpcgroup)
1751 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch); 1708 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch);
1752 else 1709 else
1753 printk(KERN_WARNING "ctcmpc: %s() Not all channels have" 1710 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1754 " been added to group\n", __FUNCTION__); 1711 "%s(%s): channel %s not added to group",
1712 CTCM_FUNTAIL, dev->name, ch->id);
1755 1713
1756done: 1714done:
1757 if (do_debug)
1758 ctcm_pr_debug("ctcmpc exit : %s()%s ch=0x%p id=%s\n",
1759 __FUNCTION__, dev->name, ch, ch->id);
1760
1761 return; 1715 return;
1762
1763} 1716}
1764 1717
1765/* 1718/*
@@ -1774,13 +1727,7 @@ static void ctcmpc_chx_resend(fsm_instance *fsm, int event, void *arg)
1774 struct ctcm_priv *priv = dev->priv; 1727 struct ctcm_priv *priv = dev->priv;
1775 struct mpc_group *grp = priv->mpcg; 1728 struct mpc_group *grp = priv->mpcg;
1776 1729
1777 ctcm_pr_debug("ctcmpc enter: %s %s() %s \nGrpState:%s ChState:%s\n",
1778 dev->name, __FUNCTION__, ch->id,
1779 fsm_getstate_str(grp->fsm),
1780 fsm_getstate_str(ch->fsm));
1781
1782 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch); 1730 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, ch);
1783
1784 return; 1731 return;
1785} 1732}
1786 1733
@@ -1802,19 +1749,16 @@ static void ctcmpc_chx_send_sweep(fsm_instance *fsm, int event, void *arg)
1802 int rc = 0; 1749 int rc = 0;
1803 unsigned long saveflags = 0; 1750 unsigned long saveflags = 0;
1804 1751
1805 if (do_debug) 1752 CTCM_PR_DEBUG("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
1806 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n", 1753 __func__, smp_processor_id(), ach, ach->id);
1807 __FUNCTION__, smp_processor_id(), ach, ach->id);
1808 1754
1809 if (grp->in_sweep == 0) 1755 if (grp->in_sweep == 0)
1810 goto done; 1756 goto done;
1811 1757
1812 if (do_debug_data) { 1758 CTCM_PR_DBGDATA("%s: 1: ToVTAM_th_seq= %08x\n" ,
1813 ctcm_pr_debug("ctcmpc: %s() 1: ToVTAM_th_seq= %08x\n" , 1759 __func__, wch->th_seq_num);
1814 __FUNCTION__, wch->th_seq_num); 1760 CTCM_PR_DBGDATA("%s: 1: FromVTAM_th_seq= %08x\n" ,
1815 ctcm_pr_debug("ctcmpc: %s() 1: FromVTAM_th_seq= %08x\n" , 1761 __func__, rch->th_seq_num);
1816 __FUNCTION__, rch->th_seq_num);
1817 }
1818 1762
1819 if (fsm_getstate(wch->fsm) != CTC_STATE_TXIDLE) { 1763 if (fsm_getstate(wch->fsm) != CTC_STATE_TXIDLE) {
1820 /* give the previous IO time to complete */ 1764 /* give the previous IO time to complete */
@@ -1853,11 +1797,9 @@ static void ctcmpc_chx_send_sweep(fsm_instance *fsm, int event, void *arg)
1853 1797
1854 header->sw.th_last_seq = wch->th_seq_num; 1798 header->sw.th_last_seq = wch->th_seq_num;
1855 1799
1856 if (do_debug_ccw) 1800 CTCM_CCW_DUMP((char *)&wch->ccw[3], sizeof(struct ccw1) * 3);
1857 ctcmpc_dumpit((char *)&wch->ccw[3], sizeof(struct ccw1) * 3); 1801 CTCM_PR_DBGDATA("%s: sweep packet\n", __func__);
1858 1802 CTCM_D3_DUMP((char *)header, TH_SWEEP_LENGTH);
1859 ctcm_pr_debug("ctcmpc: %s() sweep packet\n", __FUNCTION__);
1860 ctcmpc_dumpit((char *)header, TH_SWEEP_LENGTH);
1861 1803
1862 fsm_addtimer(&wch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, wch); 1804 fsm_addtimer(&wch->timer, CTCM_TIME_5_SEC, CTC_EVENT_TIMER, wch);
1863 fsm_newstate(wch->fsm, CTC_STATE_TX); 1805 fsm_newstate(wch->fsm, CTC_STATE_TX);
@@ -1876,19 +1818,13 @@ static void ctcmpc_chx_send_sweep(fsm_instance *fsm, int event, void *arg)
1876 ctcm_clear_busy_do(dev); 1818 ctcm_clear_busy_do(dev);
1877 } 1819 }
1878 1820
1879 if (do_debug_data) { 1821 CTCM_PR_DBGDATA("%s: To-/From-VTAM_th_seq = %08x/%08x\n" ,
1880 ctcm_pr_debug("ctcmpc: %s()2: ToVTAM_th_seq= %08x\n" , 1822 __func__, wch->th_seq_num, rch->th_seq_num);
1881 __FUNCTION__, wch->th_seq_num);
1882 ctcm_pr_debug("ctcmpc: %s()2: FromVTAM_th_seq= %08x\n" ,
1883 __FUNCTION__, rch->th_seq_num);
1884 }
1885 1823
1886 if (rc != 0) 1824 if (rc != 0)
1887 ctcm_ccw_check_rc(wch, rc, "send sweep"); 1825 ctcm_ccw_check_rc(wch, rc, "send sweep");
1888 1826
1889done: 1827done:
1890 if (do_debug)
1891 ctcm_pr_debug("ctcmpc exit: %s() %s\n", __FUNCTION__, ach->id);
1892 return; 1828 return;
1893} 1829}
1894 1830
@@ -2149,9 +2085,8 @@ static void dev_action_stop(fsm_instance *fi, int event, void *arg)
2149 struct channel *ch = priv->channel[direction]; 2085 struct channel *ch = priv->channel[direction];
2150 fsm_event(ch->fsm, CTC_EVENT_STOP, ch); 2086 fsm_event(ch->fsm, CTC_EVENT_STOP, ch);
2151 ch->th_seq_num = 0x00; 2087 ch->th_seq_num = 0x00;
2152 if (do_debug) 2088 CTCM_PR_DEBUG("%s: CH_th_seq= %08x\n",
2153 ctcm_pr_debug("ctcm: %s() CH_th_seq= %08x\n", 2089 __func__, ch->th_seq_num);
2154 __FUNCTION__, ch->th_seq_num);
2155 } 2090 }
2156 if (IS_MPC(priv)) 2091 if (IS_MPC(priv))
2157 fsm_newstate(priv->mpcg->fsm, MPCG_STATE_RESET); 2092 fsm_newstate(priv->mpcg->fsm, MPCG_STATE_RESET);
@@ -2199,8 +2134,11 @@ static void dev_action_chup(fsm_instance *fi, int event, void *arg)
2199{ 2134{
2200 struct net_device *dev = arg; 2135 struct net_device *dev = arg;
2201 struct ctcm_priv *priv = dev->priv; 2136 struct ctcm_priv *priv = dev->priv;
2137 int dev_stat = fsm_getstate(fi);
2202 2138
2203 CTCMY_DBF_DEV_NAME(SETUP, dev, ""); 2139 CTCM_DBF_TEXT_(SETUP, CTC_DBF_NOTICE,
2140 "%s(%s): priv = %p [%d,%d]\n ", CTCM_FUNTAIL,
2141 dev->name, dev->priv, dev_stat, event);
2204 2142
2205 switch (fsm_getstate(fi)) { 2143 switch (fsm_getstate(fi)) {
2206 case DEV_STATE_STARTWAIT_RXTX: 2144 case DEV_STATE_STARTWAIT_RXTX:
diff --git a/drivers/s390/net/ctcm_main.c b/drivers/s390/net/ctcm_main.c
index 6b13c1c1beb8..126a3ebb8ab2 100644
--- a/drivers/s390/net/ctcm_main.c
+++ b/drivers/s390/net/ctcm_main.c
@@ -84,20 +84,19 @@ void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)
84 skb_pull(pskb, LL_HEADER_LENGTH); 84 skb_pull(pskb, LL_HEADER_LENGTH);
85 if ((ch->protocol == CTCM_PROTO_S390) && 85 if ((ch->protocol == CTCM_PROTO_S390) &&
86 (header->type != ETH_P_IP)) { 86 (header->type != ETH_P_IP)) {
87
88 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) { 87 if (!(ch->logflags & LOG_FLAG_ILLEGALPKT)) {
88 ch->logflags |= LOG_FLAG_ILLEGALPKT;
89 /* 89 /*
90 * Check packet type only if we stick strictly 90 * Check packet type only if we stick strictly
91 * to S/390's protocol of OS390. This only 91 * to S/390's protocol of OS390. This only
92 * supports IP. Otherwise allow any packet 92 * supports IP. Otherwise allow any packet
93 * type. 93 * type.
94 */ 94 */
95 ctcm_pr_warn("%s Illegal packet type 0x%04x " 95 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
96 "received, dropping\n", 96 "%s(%s): Illegal packet type 0x%04x"
97 dev->name, header->type); 97 " - dropping",
98 ch->logflags |= LOG_FLAG_ILLEGALPKT; 98 CTCM_FUNTAIL, dev->name, header->type);
99 } 99 }
100
101 priv->stats.rx_dropped++; 100 priv->stats.rx_dropped++;
102 priv->stats.rx_frame_errors++; 101 priv->stats.rx_frame_errors++;
103 return; 102 return;
@@ -105,11 +104,11 @@ void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)
105 pskb->protocol = ntohs(header->type); 104 pskb->protocol = ntohs(header->type);
106 if (header->length <= LL_HEADER_LENGTH) { 105 if (header->length <= LL_HEADER_LENGTH) {
107 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) { 106 if (!(ch->logflags & LOG_FLAG_ILLEGALSIZE)) {
108 ctcm_pr_warn( 107 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
109 "%s Illegal packet size %d " 108 "%s(%s): Illegal packet size %d(%d,%d)"
110 "received (MTU=%d blocklen=%d), " 109 "- dropping",
111 "dropping\n", dev->name, header->length, 110 CTCM_FUNTAIL, dev->name,
112 dev->mtu, len); 111 header->length, dev->mtu, len);
113 ch->logflags |= LOG_FLAG_ILLEGALSIZE; 112 ch->logflags |= LOG_FLAG_ILLEGALSIZE;
114 } 113 }
115 114
@@ -122,10 +121,10 @@ void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)
122 if ((header->length > skb_tailroom(pskb)) || 121 if ((header->length > skb_tailroom(pskb)) ||
123 (header->length > len)) { 122 (header->length > len)) {
124 if (!(ch->logflags & LOG_FLAG_OVERRUN)) { 123 if (!(ch->logflags & LOG_FLAG_OVERRUN)) {
125 ctcm_pr_warn( 124 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
126 "%s Illegal packet size %d (beyond the" 125 "%s(%s): Packet size %d (overrun)"
127 " end of received data), dropping\n", 126 " - dropping", CTCM_FUNTAIL,
128 dev->name, header->length); 127 dev->name, header->length);
129 ch->logflags |= LOG_FLAG_OVERRUN; 128 ch->logflags |= LOG_FLAG_OVERRUN;
130 } 129 }
131 130
@@ -139,9 +138,9 @@ void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)
139 skb = dev_alloc_skb(pskb->len); 138 skb = dev_alloc_skb(pskb->len);
140 if (!skb) { 139 if (!skb) {
141 if (!(ch->logflags & LOG_FLAG_NOMEM)) { 140 if (!(ch->logflags & LOG_FLAG_NOMEM)) {
142 ctcm_pr_warn( 141 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
143 "%s Out of memory in ctcm_unpack_skb\n", 142 "%s(%s): MEMORY allocation error",
144 dev->name); 143 CTCM_FUNTAIL, dev->name);
145 ch->logflags |= LOG_FLAG_NOMEM; 144 ch->logflags |= LOG_FLAG_NOMEM;
146 } 145 }
147 priv->stats.rx_dropped++; 146 priv->stats.rx_dropped++;
@@ -184,7 +183,7 @@ void ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb)
184 */ 183 */
185static void channel_free(struct channel *ch) 184static void channel_free(struct channel *ch)
186{ 185{
187 CTCM_DBF_TEXT(TRACE, 2, __FUNCTION__); 186 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s(%s)", CTCM_FUNTAIL, ch->id);
188 ch->flags &= ~CHANNEL_FLAGS_INUSE; 187 ch->flags &= ~CHANNEL_FLAGS_INUSE;
189 fsm_newstate(ch->fsm, CTC_STATE_IDLE); 188 fsm_newstate(ch->fsm, CTC_STATE_IDLE);
190} 189}
@@ -251,19 +250,12 @@ static struct channel *channel_get(enum channel_types type,
251{ 250{
252 struct channel *ch = channels; 251 struct channel *ch = channels;
253 252
254 if (do_debug) {
255 char buf[64];
256 sprintf(buf, "%s(%d, %s, %d)\n",
257 CTCM_FUNTAIL, type, id, direction);
258 CTCM_DBF_TEXT(TRACE, CTC_DBF_INFO, buf);
259 }
260 while (ch && (strncmp(ch->id, id, CTCM_ID_SIZE) || (ch->type != type))) 253 while (ch && (strncmp(ch->id, id, CTCM_ID_SIZE) || (ch->type != type)))
261 ch = ch->next; 254 ch = ch->next;
262 if (!ch) { 255 if (!ch) {
263 char buf[64]; 256 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
264 sprintf(buf, "%s(%d, %s, %d) not found in channel list\n", 257 "%s(%d, %s, %d) not found in channel list\n",
265 CTCM_FUNTAIL, type, id, direction); 258 CTCM_FUNTAIL, type, id, direction);
266 CTCM_DBF_TEXT(ERROR, CTC_DBF_ERROR, buf);
267 } else { 259 } else {
268 if (ch->flags & CHANNEL_FLAGS_INUSE) 260 if (ch->flags & CHANNEL_FLAGS_INUSE)
269 ch = NULL; 261 ch = NULL;
@@ -283,8 +275,9 @@ static long ctcm_check_irb_error(struct ccw_device *cdev, struct irb *irb)
283 if (!IS_ERR(irb)) 275 if (!IS_ERR(irb))
284 return 0; 276 return 0;
285 277
286 CTCM_DBF_TEXT_(ERROR, CTC_DBF_WARN, "irb error %ld on device %s\n", 278 CTCM_DBF_TEXT_(ERROR, CTC_DBF_WARN,
287 PTR_ERR(irb), cdev->dev.bus_id); 279 "irb error %ld on device %s\n",
280 PTR_ERR(irb), cdev->dev.bus_id);
288 281
289 switch (PTR_ERR(irb)) { 282 switch (PTR_ERR(irb)) {
290 case -EIO: 283 case -EIO:
@@ -307,58 +300,85 @@ static long ctcm_check_irb_error(struct ccw_device *cdev, struct irb *irb)
307 * ch The channel, the sense code belongs to. 300 * ch The channel, the sense code belongs to.
308 * sense The sense code to inspect. 301 * sense The sense code to inspect.
309 */ 302 */
310static inline void ccw_unit_check(struct channel *ch, unsigned char sense) 303static inline void ccw_unit_check(struct channel *ch, __u8 sense)
311{ 304{
312 CTCM_DBF_TEXT(TRACE, 5, __FUNCTION__); 305 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
306 "%s(%s): %02x",
307 CTCM_FUNTAIL, ch->id, sense);
308
313 if (sense & SNS0_INTERVENTION_REQ) { 309 if (sense & SNS0_INTERVENTION_REQ) {
314 if (sense & 0x01) { 310 if (sense & 0x01) {
315 ctcm_pr_debug("%s: Interface disc. or Sel. reset " 311 if (ch->sense_rc != 0x01) {
316 "(remote)\n", ch->id); 312 ctcm_pr_debug("%s: Interface disc. or Sel. "
313 "reset (remote)\n", ch->id);
314 ch->sense_rc = 0x01;
315 }
317 fsm_event(ch->fsm, CTC_EVENT_UC_RCRESET, ch); 316 fsm_event(ch->fsm, CTC_EVENT_UC_RCRESET, ch);
318 } else { 317 } else {
319 ctcm_pr_debug("%s: System reset (remote)\n", ch->id); 318 if (ch->sense_rc != SNS0_INTERVENTION_REQ) {
319 ctcm_pr_debug("%s: System reset (remote)\n",
320 ch->id);
321 ch->sense_rc = SNS0_INTERVENTION_REQ;
322 }
320 fsm_event(ch->fsm, CTC_EVENT_UC_RSRESET, ch); 323 fsm_event(ch->fsm, CTC_EVENT_UC_RSRESET, ch);
321 } 324 }
322 } else if (sense & SNS0_EQUIPMENT_CHECK) { 325 } else if (sense & SNS0_EQUIPMENT_CHECK) {
323 if (sense & SNS0_BUS_OUT_CHECK) { 326 if (sense & SNS0_BUS_OUT_CHECK) {
324 ctcm_pr_warn("%s: Hardware malfunction (remote)\n", 327 if (ch->sense_rc != SNS0_BUS_OUT_CHECK) {
325 ch->id); 328 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
329 "%s(%s): remote HW error %02x",
330 CTCM_FUNTAIL, ch->id, sense);
331 ch->sense_rc = SNS0_BUS_OUT_CHECK;
332 }
326 fsm_event(ch->fsm, CTC_EVENT_UC_HWFAIL, ch); 333 fsm_event(ch->fsm, CTC_EVENT_UC_HWFAIL, ch);
327 } else { 334 } else {
328 ctcm_pr_warn("%s: Read-data parity error (remote)\n", 335 if (ch->sense_rc != SNS0_EQUIPMENT_CHECK) {
329 ch->id); 336 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
337 "%s(%s): remote read parity error %02x",
338 CTCM_FUNTAIL, ch->id, sense);
339 ch->sense_rc = SNS0_EQUIPMENT_CHECK;
340 }
330 fsm_event(ch->fsm, CTC_EVENT_UC_RXPARITY, ch); 341 fsm_event(ch->fsm, CTC_EVENT_UC_RXPARITY, ch);
331 } 342 }
332 } else if (sense & SNS0_BUS_OUT_CHECK) { 343 } else if (sense & SNS0_BUS_OUT_CHECK) {
333 if (sense & 0x04) { 344 if (ch->sense_rc != SNS0_BUS_OUT_CHECK) {
334 ctcm_pr_warn("%s: Data-streaming timeout)\n", ch->id); 345 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
346 "%s(%s): BUS OUT error %02x",
347 CTCM_FUNTAIL, ch->id, sense);
348 ch->sense_rc = SNS0_BUS_OUT_CHECK;
349 }
350 if (sense & 0x04) /* data-streaming timeout */
335 fsm_event(ch->fsm, CTC_EVENT_UC_TXTIMEOUT, ch); 351 fsm_event(ch->fsm, CTC_EVENT_UC_TXTIMEOUT, ch);
336 } else { 352 else /* Data-transfer parity error */
337 ctcm_pr_warn("%s: Data-transfer parity error\n",
338 ch->id);
339 fsm_event(ch->fsm, CTC_EVENT_UC_TXPARITY, ch); 353 fsm_event(ch->fsm, CTC_EVENT_UC_TXPARITY, ch);
340 }
341 } else if (sense & SNS0_CMD_REJECT) { 354 } else if (sense & SNS0_CMD_REJECT) {
342 ctcm_pr_warn("%s: Command reject\n", ch->id); 355 if (ch->sense_rc != SNS0_CMD_REJECT) {
356 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
357 "%s(%s): Command rejected",
358 CTCM_FUNTAIL, ch->id);
359 ch->sense_rc = SNS0_CMD_REJECT;
360 }
343 } else if (sense == 0) { 361 } else if (sense == 0) {
344 ctcm_pr_debug("%s: Unit check ZERO\n", ch->id); 362 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
363 "%s(%s): Unit check ZERO",
364 CTCM_FUNTAIL, ch->id);
345 fsm_event(ch->fsm, CTC_EVENT_UC_ZERO, ch); 365 fsm_event(ch->fsm, CTC_EVENT_UC_ZERO, ch);
346 } else { 366 } else {
347 ctcm_pr_warn("%s: Unit Check with sense code: %02x\n", 367 CTCM_DBF_TEXT_(TRACE, CTC_DBF_WARN,
348 ch->id, sense); 368 "%s(%s): Unit check code %02x unknown",
369 CTCM_FUNTAIL, ch->id, sense);
349 fsm_event(ch->fsm, CTC_EVENT_UC_UNKNOWN, ch); 370 fsm_event(ch->fsm, CTC_EVENT_UC_UNKNOWN, ch);
350 } 371 }
351} 372}
352 373
353int ctcm_ch_alloc_buffer(struct channel *ch) 374int ctcm_ch_alloc_buffer(struct channel *ch)
354{ 375{
355 CTCM_DBF_TEXT(TRACE, 5, __FUNCTION__);
356
357 clear_normalized_cda(&ch->ccw[1]); 376 clear_normalized_cda(&ch->ccw[1]);
358 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC | GFP_DMA); 377 ch->trans_skb = __dev_alloc_skb(ch->max_bufsize, GFP_ATOMIC | GFP_DMA);
359 if (ch->trans_skb == NULL) { 378 if (ch->trans_skb == NULL) {
360 ctcm_pr_warn("%s: Couldn't alloc %s trans_skb\n", 379 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
361 ch->id, 380 "%s(%s): %s trans_skb allocation error",
381 CTCM_FUNTAIL, ch->id,
362 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX"); 382 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
363 return -ENOMEM; 383 return -ENOMEM;
364 } 384 }
@@ -367,9 +387,9 @@ int ctcm_ch_alloc_buffer(struct channel *ch)
367 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) { 387 if (set_normalized_cda(&ch->ccw[1], ch->trans_skb->data)) {
368 dev_kfree_skb(ch->trans_skb); 388 dev_kfree_skb(ch->trans_skb);
369 ch->trans_skb = NULL; 389 ch->trans_skb = NULL;
370 ctcm_pr_warn("%s: set_normalized_cda for %s " 390 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
371 "trans_skb failed, dropping packets\n", 391 "%s(%s): %s set norm_cda failed",
372 ch->id, 392 CTCM_FUNTAIL, ch->id,
373 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX"); 393 (CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
374 return -ENOMEM; 394 return -ENOMEM;
375 } 395 }
@@ -516,7 +536,7 @@ static int ctcm_transmit_skb(struct channel *ch, struct sk_buff *skb)
516 atomic_dec(&skb->users); 536 atomic_dec(&skb->users);
517 skb_pull(skb, LL_HEADER_LENGTH + 2); 537 skb_pull(skb, LL_HEADER_LENGTH + 2);
518 ctcm_clear_busy(ch->netdev); 538 ctcm_clear_busy(ch->netdev);
519 return -EBUSY; 539 return -ENOMEM;
520 } 540 }
521 541
522 skb_reset_tail_pointer(ch->trans_skb); 542 skb_reset_tail_pointer(ch->trans_skb);
@@ -570,15 +590,12 @@ static void ctcmpc_send_sweep_req(struct channel *rch)
570 struct th_sweep *header; 590 struct th_sweep *header;
571 struct sk_buff *sweep_skb; 591 struct sk_buff *sweep_skb;
572 struct channel *ch; 592 struct channel *ch;
573 int rc = 0; 593 /* int rc = 0; */
574 594
575 priv = dev->priv; 595 priv = dev->priv;
576 grp = priv->mpcg; 596 grp = priv->mpcg;
577 ch = priv->channel[WRITE]; 597 ch = priv->channel[WRITE];
578 598
579 if (do_debug)
580 MPC_DBF_DEV_NAME(TRACE, dev, ch->id);
581
582 /* sweep processing is not complete until response and request */ 599 /* sweep processing is not complete until response and request */
583 /* has completed for all read channels in group */ 600 /* has completed for all read channels in group */
584 if (grp->in_sweep == 0) { 601 if (grp->in_sweep == 0) {
@@ -590,17 +607,16 @@ static void ctcmpc_send_sweep_req(struct channel *rch)
590 sweep_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC|GFP_DMA); 607 sweep_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC|GFP_DMA);
591 608
592 if (sweep_skb == NULL) { 609 if (sweep_skb == NULL) {
593 printk(KERN_INFO "Couldn't alloc sweep_skb\n"); 610 /* rc = -ENOMEM; */
594 rc = -ENOMEM; 611 goto nomem;
595 goto done;
596 } 612 }
597 613
598 header = kmalloc(TH_SWEEP_LENGTH, gfp_type()); 614 header = kmalloc(TH_SWEEP_LENGTH, gfp_type());
599 615
600 if (!header) { 616 if (!header) {
601 dev_kfree_skb_any(sweep_skb); 617 dev_kfree_skb_any(sweep_skb);
602 rc = -ENOMEM; 618 /* rc = -ENOMEM; */
603 goto done; 619 goto nomem;
604 } 620 }
605 621
606 header->th.th_seg = 0x00 ; 622 header->th.th_seg = 0x00 ;
@@ -621,12 +637,10 @@ static void ctcmpc_send_sweep_req(struct channel *rch)
621 637
622 return; 638 return;
623 639
624done: 640nomem:
625 if (rc != 0) { 641 grp->in_sweep = 0;
626 grp->in_sweep = 0; 642 ctcm_clear_busy(dev);
627 ctcm_clear_busy(dev); 643 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
628 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
629 }
630 644
631 return; 645 return;
632} 646}
@@ -648,11 +662,9 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
648 unsigned long saveflags = 0; /* avoids compiler warning */ 662 unsigned long saveflags = 0; /* avoids compiler warning */
649 __u16 block_len; 663 __u16 block_len;
650 664
651 if (do_debug) 665 CTCM_PR_DEBUG("Enter %s: %s, cp=%i ch=0x%p id=%s state=%s\n",
652 ctcm_pr_debug( 666 __func__, dev->name, smp_processor_id(), ch,
653 "ctcm enter: %s(): %s cp=%i ch=0x%p id=%s state=%s\n", 667 ch->id, fsm_getstate_str(ch->fsm));
654 __FUNCTION__, dev->name, smp_processor_id(), ch,
655 ch->id, fsm_getstate_str(ch->fsm));
656 668
657 if ((fsm_getstate(ch->fsm) != CTC_STATE_TXIDLE) || grp->in_sweep) { 669 if ((fsm_getstate(ch->fsm) != CTC_STATE_TXIDLE) || grp->in_sweep) {
658 spin_lock_irqsave(&ch->collect_lock, saveflags); 670 spin_lock_irqsave(&ch->collect_lock, saveflags);
@@ -660,14 +672,8 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
660 p_header = kmalloc(PDU_HEADER_LENGTH, gfp_type()); 672 p_header = kmalloc(PDU_HEADER_LENGTH, gfp_type());
661 673
662 if (!p_header) { 674 if (!p_header) {
663 printk(KERN_WARNING "ctcm: OUT OF MEMORY IN %s():"
664 " Data Lost \n", __FUNCTION__);
665
666 atomic_dec(&skb->users);
667 dev_kfree_skb_any(skb);
668 spin_unlock_irqrestore(&ch->collect_lock, saveflags); 675 spin_unlock_irqrestore(&ch->collect_lock, saveflags);
669 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev); 676 goto nomem_exit;
670 goto done;
671 } 677 }
672 678
673 p_header->pdu_offset = skb->len; 679 p_header->pdu_offset = skb->len;
@@ -682,13 +688,10 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
682 memcpy(skb_push(skb, PDU_HEADER_LENGTH), p_header, 688 memcpy(skb_push(skb, PDU_HEADER_LENGTH), p_header,
683 PDU_HEADER_LENGTH); 689 PDU_HEADER_LENGTH);
684 690
685 if (do_debug_data) { 691 CTCM_PR_DEBUG("%s(%s): Put on collect_q - skb len: %04x \n"
686 ctcm_pr_debug("ctcm: %s() Putting on collect_q" 692 "pdu header and data for up to 32 bytes:\n",
687 " - skb len: %04x \n", __FUNCTION__, skb->len); 693 __func__, dev->name, skb->len);
688 ctcm_pr_debug("ctcm: %s() pdu header and data" 694 CTCM_D3_DUMP((char *)skb->data, min_t(int, 32, skb->len));
689 " for up to 32 bytes\n", __FUNCTION__);
690 ctcmpc_dump32((char *)skb->data, skb->len);
691 }
692 695
693 skb_queue_tail(&ch->collect_queue, skb); 696 skb_queue_tail(&ch->collect_queue, skb);
694 ch->collect_len += skb->len; 697 ch->collect_len += skb->len;
@@ -713,12 +716,7 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
713 if (hi) { 716 if (hi) {
714 nskb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA); 717 nskb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
715 if (!nskb) { 718 if (!nskb) {
716 printk(KERN_WARNING "ctcm: %s() OUT OF MEMORY" 719 goto nomem_exit;
717 "- Data Lost \n", __FUNCTION__);
718 atomic_dec(&skb->users);
719 dev_kfree_skb_any(skb);
720 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
721 goto done;
722 } else { 720 } else {
723 memcpy(skb_put(nskb, skb->len), skb->data, skb->len); 721 memcpy(skb_put(nskb, skb->len), skb->data, skb->len);
724 atomic_inc(&nskb->users); 722 atomic_inc(&nskb->users);
@@ -730,15 +728,8 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
730 728
731 p_header = kmalloc(PDU_HEADER_LENGTH, gfp_type()); 729 p_header = kmalloc(PDU_HEADER_LENGTH, gfp_type());
732 730
733 if (!p_header) { 731 if (!p_header)
734 printk(KERN_WARNING "ctcm: %s() OUT OF MEMORY" 732 goto nomem_exit;
735 ": Data Lost \n", __FUNCTION__);
736
737 atomic_dec(&skb->users);
738 dev_kfree_skb_any(skb);
739 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
740 goto done;
741 }
742 733
743 p_header->pdu_offset = skb->len; 734 p_header->pdu_offset = skb->len;
744 p_header->pdu_proto = 0x01; 735 p_header->pdu_proto = 0x01;
@@ -768,15 +759,8 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
768 ch->prof.txlen += skb->len - PDU_HEADER_LENGTH; 759 ch->prof.txlen += skb->len - PDU_HEADER_LENGTH;
769 760
770 header = kmalloc(TH_HEADER_LENGTH, gfp_type()); 761 header = kmalloc(TH_HEADER_LENGTH, gfp_type());
771 762 if (!header)
772 if (!header) { 763 goto nomem_exit;
773 printk(KERN_WARNING "ctcm: %s() OUT OF MEMORY: Data Lost \n",
774 __FUNCTION__);
775 atomic_dec(&skb->users);
776 dev_kfree_skb_any(skb);
777 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
778 goto done;
779 }
780 764
781 header->th_seg = 0x00; 765 header->th_seg = 0x00;
782 header->th_ch_flag = TH_HAS_PDU; /* Normal data */ 766 header->th_ch_flag = TH_HAS_PDU; /* Normal data */
@@ -785,41 +769,31 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
785 ch->th_seq_num++; 769 ch->th_seq_num++;
786 header->th_seq_num = ch->th_seq_num; 770 header->th_seq_num = ch->th_seq_num;
787 771
788 if (do_debug_data) 772 CTCM_PR_DBGDATA("%s(%s) ToVTAM_th_seq= %08x\n" ,
789 ctcm_pr_debug("ctcm: %s() ToVTAM_th_seq= %08x\n" , 773 __func__, dev->name, ch->th_seq_num);
790 __FUNCTION__, ch->th_seq_num);
791 774
792 /* put the TH on the packet */ 775 /* put the TH on the packet */
793 memcpy(skb_push(skb, TH_HEADER_LENGTH), header, TH_HEADER_LENGTH); 776 memcpy(skb_push(skb, TH_HEADER_LENGTH), header, TH_HEADER_LENGTH);
794 777
795 kfree(header); 778 kfree(header);
796 779
797 if (do_debug_data) { 780 CTCM_PR_DBGDATA("%s(%s): skb len: %04x\n - pdu header and data for "
798 ctcm_pr_debug("ctcm: %s(): skb len: %04x \n", 781 "up to 32 bytes sent to vtam:\n",
799 __FUNCTION__, skb->len); 782 __func__, dev->name, skb->len);
800 ctcm_pr_debug("ctcm: %s(): pdu header and data for up to 32 " 783 CTCM_D3_DUMP((char *)skb->data, min_t(int, 32, skb->len));
801 "bytes sent to vtam\n", __FUNCTION__);
802 ctcmpc_dump32((char *)skb->data, skb->len);
803 }
804 784
805 ch->ccw[4].count = skb->len; 785 ch->ccw[4].count = skb->len;
806 if (set_normalized_cda(&ch->ccw[4], skb->data)) { 786 if (set_normalized_cda(&ch->ccw[4], skb->data)) {
807 /* 787 /*
808 * idal allocation failed, try via copying to 788 * idal allocation failed, try via copying to trans_skb.
809 * trans_skb. trans_skb usually has a pre-allocated 789 * trans_skb usually has a pre-allocated idal.
810 * idal.
811 */ 790 */
812 if (ctcm_checkalloc_buffer(ch)) { 791 if (ctcm_checkalloc_buffer(ch)) {
813 /* 792 /*
814 * Remove our header. It gets added 793 * Remove our header.
815 * again on retransmit. 794 * It gets added again on retransmit.
816 */ 795 */
817 atomic_dec(&skb->users); 796 goto nomem_exit;
818 dev_kfree_skb_any(skb);
819 printk(KERN_WARNING "ctcm: %s()OUT OF MEMORY:"
820 " Data Lost \n", __FUNCTION__);
821 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
822 goto done;
823 } 797 }
824 798
825 skb_reset_tail_pointer(ch->trans_skb); 799 skb_reset_tail_pointer(ch->trans_skb);
@@ -829,14 +803,11 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
829 atomic_dec(&skb->users); 803 atomic_dec(&skb->users);
830 dev_kfree_skb_irq(skb); 804 dev_kfree_skb_irq(skb);
831 ccw_idx = 0; 805 ccw_idx = 0;
832 if (do_debug_data) { 806 CTCM_PR_DBGDATA("%s(%s): trans_skb len: %04x\n"
833 ctcm_pr_debug("ctcm: %s() TRANS skb len: %d \n", 807 "up to 32 bytes sent to vtam:\n",
834 __FUNCTION__, ch->trans_skb->len); 808 __func__, dev->name, ch->trans_skb->len);
835 ctcm_pr_debug("ctcm: %s up to 32 bytes of data" 809 CTCM_D3_DUMP((char *)ch->trans_skb->data,
836 " sent to vtam\n", __FUNCTION__); 810 min_t(int, 32, ch->trans_skb->len));
837 ctcmpc_dump32((char *)ch->trans_skb->data,
838 ch->trans_skb->len);
839 }
840 } else { 811 } else {
841 skb_queue_tail(&ch->io_queue, skb); 812 skb_queue_tail(&ch->io_queue, skb);
842 ccw_idx = 3; 813 ccw_idx = 3;
@@ -865,13 +836,21 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
865 priv->stats.tx_packets++; 836 priv->stats.tx_packets++;
866 priv->stats.tx_bytes += skb->len - TH_HEADER_LENGTH; 837 priv->stats.tx_bytes += skb->len - TH_HEADER_LENGTH;
867 } 838 }
868 if (ch->th_seq_num > 0xf0000000) /* Chose 4Billion at random. */ 839 if (ch->th_seq_num > 0xf0000000) /* Chose at random. */
869 ctcmpc_send_sweep_req(ch); 840 ctcmpc_send_sweep_req(ch);
870 841
842 goto done;
843nomem_exit:
844 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_CRIT,
845 "%s(%s): MEMORY allocation ERROR\n",
846 CTCM_FUNTAIL, ch->id);
847 rc = -ENOMEM;
848 atomic_dec(&skb->users);
849 dev_kfree_skb_any(skb);
850 fsm_event(priv->mpcg->fsm, MPCG_EVENT_INOP, dev);
871done: 851done:
872 if (do_debug) 852 CTCM_PR_DEBUG("Exit %s(%s)\n", __func__, dev->name);
873 ctcm_pr_debug("ctcm exit: %s %s()\n", dev->name, __FUNCTION__); 853 return rc;
874 return 0;
875} 854}
876 855
877/** 856/**
@@ -888,20 +867,19 @@ done:
888/* first merge version - leaving both functions separated */ 867/* first merge version - leaving both functions separated */
889static int ctcm_tx(struct sk_buff *skb, struct net_device *dev) 868static int ctcm_tx(struct sk_buff *skb, struct net_device *dev)
890{ 869{
891 int rc = 0; 870 struct ctcm_priv *priv = dev->priv;
892 struct ctcm_priv *priv;
893
894 CTCM_DBF_TEXT(TRACE, 5, __FUNCTION__);
895 priv = dev->priv;
896 871
897 if (skb == NULL) { 872 if (skb == NULL) {
898 ctcm_pr_warn("%s: NULL sk_buff passed\n", dev->name); 873 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
874 "%s(%s): NULL sk_buff passed",
875 CTCM_FUNTAIL, dev->name);
899 priv->stats.tx_dropped++; 876 priv->stats.tx_dropped++;
900 return 0; 877 return 0;
901 } 878 }
902 if (skb_headroom(skb) < (LL_HEADER_LENGTH + 2)) { 879 if (skb_headroom(skb) < (LL_HEADER_LENGTH + 2)) {
903 ctcm_pr_warn("%s: Got sk_buff with head room < %ld bytes\n", 880 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
904 dev->name, LL_HEADER_LENGTH + 2); 881 "%s(%s): Got sk_buff with head room < %ld bytes",
882 CTCM_FUNTAIL, dev->name, LL_HEADER_LENGTH + 2);
905 dev_kfree_skb(skb); 883 dev_kfree_skb(skb);
906 priv->stats.tx_dropped++; 884 priv->stats.tx_dropped++;
907 return 0; 885 return 0;
@@ -925,51 +903,43 @@ static int ctcm_tx(struct sk_buff *skb, struct net_device *dev)
925 903
926 dev->trans_start = jiffies; 904 dev->trans_start = jiffies;
927 if (ctcm_transmit_skb(priv->channel[WRITE], skb) != 0) 905 if (ctcm_transmit_skb(priv->channel[WRITE], skb) != 0)
928 rc = 1; 906 return 1;
929 return rc; 907 return 0;
930} 908}
931 909
932/* unmerged MPC variant of ctcm_tx */ 910/* unmerged MPC variant of ctcm_tx */
933static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev) 911static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
934{ 912{
935 int len = 0; 913 int len = 0;
936 struct ctcm_priv *priv = NULL; 914 struct ctcm_priv *priv = dev->priv;
937 struct mpc_group *grp = NULL; 915 struct mpc_group *grp = priv->mpcg;
938 struct sk_buff *newskb = NULL; 916 struct sk_buff *newskb = NULL;
939 917
940 if (do_debug)
941 ctcm_pr_debug("ctcmpc enter: %s(): skb:%0lx\n",
942 __FUNCTION__, (unsigned long)skb);
943
944 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
945 "ctcmpc enter: %s(): skb:%0lx\n",
946 __FUNCTION__, (unsigned long)skb);
947
948 priv = dev->priv;
949 grp = priv->mpcg;
950 /* 918 /*
951 * Some sanity checks ... 919 * Some sanity checks ...
952 */ 920 */
953 if (skb == NULL) { 921 if (skb == NULL) {
954 ctcm_pr_warn("ctcmpc: %s: NULL sk_buff passed\n", dev->name); 922 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
923 "%s(%s): NULL sk_buff passed",
924 CTCM_FUNTAIL, dev->name);
955 priv->stats.tx_dropped++; 925 priv->stats.tx_dropped++;
956 goto done; 926 goto done;
957 } 927 }
958 if (skb_headroom(skb) < (TH_HEADER_LENGTH + PDU_HEADER_LENGTH)) { 928 if (skb_headroom(skb) < (TH_HEADER_LENGTH + PDU_HEADER_LENGTH)) {
959 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_WARN, 929 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ERROR,
960 "%s: Got sk_buff with head room < %ld bytes\n", 930 "%s(%s): Got sk_buff with head room < %ld bytes",
961 dev->name, TH_HEADER_LENGTH + PDU_HEADER_LENGTH); 931 CTCM_FUNTAIL, dev->name,
932 TH_HEADER_LENGTH + PDU_HEADER_LENGTH);
962 933
963 if (do_debug_data) 934 CTCM_D3_DUMP((char *)skb->data, min_t(int, 32, skb->len));
964 ctcmpc_dump32((char *)skb->data, skb->len);
965 935
966 len = skb->len + TH_HEADER_LENGTH + PDU_HEADER_LENGTH; 936 len = skb->len + TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
967 newskb = __dev_alloc_skb(len, gfp_type() | GFP_DMA); 937 newskb = __dev_alloc_skb(len, gfp_type() | GFP_DMA);
968 938
969 if (!newskb) { 939 if (!newskb) {
970 printk(KERN_WARNING "ctcmpc: %s() OUT OF MEMORY-" 940 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ERROR,
971 "Data Lost\n", 941 "%s: %s: __dev_alloc_skb failed",
972 __FUNCTION__); 942 __func__, dev->name);
973 943
974 dev_kfree_skb_any(skb); 944 dev_kfree_skb_any(skb);
975 priv->stats.tx_dropped++; 945 priv->stats.tx_dropped++;
@@ -993,9 +963,9 @@ static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
993 if ((fsm_getstate(priv->fsm) != DEV_STATE_RUNNING) || 963 if ((fsm_getstate(priv->fsm) != DEV_STATE_RUNNING) ||
994 (fsm_getstate(grp->fsm) < MPCG_STATE_XID2INITW)) { 964 (fsm_getstate(grp->fsm) < MPCG_STATE_XID2INITW)) {
995 dev_kfree_skb_any(skb); 965 dev_kfree_skb_any(skb);
996 printk(KERN_INFO "ctcmpc: %s() DATA RCVD - MPC GROUP " 966 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
997 "NOT ACTIVE - DROPPED\n", 967 "%s(%s): inactive MPCGROUP - dropped",
998 __FUNCTION__); 968 CTCM_FUNTAIL, dev->name);
999 priv->stats.tx_dropped++; 969 priv->stats.tx_dropped++;
1000 priv->stats.tx_errors++; 970 priv->stats.tx_errors++;
1001 priv->stats.tx_carrier_errors++; 971 priv->stats.tx_carrier_errors++;
@@ -1003,8 +973,9 @@ static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
1003 } 973 }
1004 974
1005 if (ctcm_test_and_set_busy(dev)) { 975 if (ctcm_test_and_set_busy(dev)) {
1006 printk(KERN_WARNING "%s:DEVICE ERR - UNRECOVERABLE DATA LOSS\n", 976 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1007 __FUNCTION__); 977 "%s(%s): device busy - dropped",
978 CTCM_FUNTAIL, dev->name);
1008 dev_kfree_skb_any(skb); 979 dev_kfree_skb_any(skb);
1009 priv->stats.tx_dropped++; 980 priv->stats.tx_dropped++;
1010 priv->stats.tx_errors++; 981 priv->stats.tx_errors++;
@@ -1015,12 +986,9 @@ static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
1015 986
1016 dev->trans_start = jiffies; 987 dev->trans_start = jiffies;
1017 if (ctcmpc_transmit_skb(priv->channel[WRITE], skb) != 0) { 988 if (ctcmpc_transmit_skb(priv->channel[WRITE], skb) != 0) {
1018 printk(KERN_WARNING "ctcmpc: %s() DEVICE ERROR" 989 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1019 ": Data Lost \n", 990 "%s(%s): device error - dropped",
1020 __FUNCTION__); 991 CTCM_FUNTAIL, dev->name);
1021 printk(KERN_WARNING "ctcmpc: %s() DEVICE ERROR"
1022 " - UNRECOVERABLE DATA LOSS\n",
1023 __FUNCTION__);
1024 dev_kfree_skb_any(skb); 992 dev_kfree_skb_any(skb);
1025 priv->stats.tx_dropped++; 993 priv->stats.tx_dropped++;
1026 priv->stats.tx_errors++; 994 priv->stats.tx_errors++;
@@ -1054,8 +1022,6 @@ static int ctcm_change_mtu(struct net_device *dev, int new_mtu)
1054 struct ctcm_priv *priv; 1022 struct ctcm_priv *priv;
1055 int max_bufsize; 1023 int max_bufsize;
1056 1024
1057 CTCM_DBF_TEXT(SETUP, CTC_DBF_INFO, __FUNCTION__);
1058
1059 if (new_mtu < 576 || new_mtu > 65527) 1025 if (new_mtu < 576 || new_mtu > 65527)
1060 return -EINVAL; 1026 return -EINVAL;
1061 1027
@@ -1087,30 +1053,13 @@ static struct net_device_stats *ctcm_stats(struct net_device *dev)
1087 return &((struct ctcm_priv *)dev->priv)->stats; 1053 return &((struct ctcm_priv *)dev->priv)->stats;
1088} 1054}
1089 1055
1090
1091static void ctcm_netdev_unregister(struct net_device *dev)
1092{
1093 CTCM_DBF_TEXT(SETUP, CTC_DBF_INFO, __FUNCTION__);
1094 if (!dev)
1095 return;
1096 unregister_netdev(dev);
1097}
1098
1099static int ctcm_netdev_register(struct net_device *dev)
1100{
1101 CTCM_DBF_TEXT(SETUP, CTC_DBF_INFO, __FUNCTION__);
1102 return register_netdev(dev);
1103}
1104
1105static void ctcm_free_netdevice(struct net_device *dev) 1056static void ctcm_free_netdevice(struct net_device *dev)
1106{ 1057{
1107 struct ctcm_priv *priv; 1058 struct ctcm_priv *priv;
1108 struct mpc_group *grp; 1059 struct mpc_group *grp;
1109 1060
1110 CTCM_DBF_TEXT(SETUP, CTC_DBF_INFO, __FUNCTION__); 1061 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1111 1062 "%s(%s)", CTCM_FUNTAIL, dev->name);
1112 if (!dev)
1113 return;
1114 priv = dev->priv; 1063 priv = dev->priv;
1115 if (priv) { 1064 if (priv) {
1116 grp = priv->mpcg; 1065 grp = priv->mpcg;
@@ -1171,7 +1120,9 @@ static struct net_device *ctcm_init_netdevice(struct ctcm_priv *priv)
1171 dev = alloc_netdev(0, CTC_DEVICE_GENE, ctcm_dev_setup); 1120 dev = alloc_netdev(0, CTC_DEVICE_GENE, ctcm_dev_setup);
1172 1121
1173 if (!dev) { 1122 if (!dev) {
1174 ctcm_pr_err("%s: Out of memory\n", __FUNCTION__); 1123 CTCM_DBF_TEXT_(ERROR, CTC_DBF_CRIT,
1124 "%s: MEMORY allocation ERROR",
1125 CTCM_FUNTAIL);
1175 return NULL; 1126 return NULL;
1176 } 1127 }
1177 dev->priv = priv; 1128 dev->priv = priv;
@@ -1209,6 +1160,7 @@ static struct net_device *ctcm_init_netdevice(struct ctcm_priv *priv)
1209 } 1160 }
1210 1161
1211 CTCMY_DBF_DEV(SETUP, dev, "finished"); 1162 CTCMY_DBF_DEV(SETUP, dev, "finished");
1163
1212 return dev; 1164 return dev;
1213} 1165}
1214 1166
@@ -1226,18 +1178,24 @@ static void ctcm_irq_handler(struct ccw_device *cdev,
1226 struct net_device *dev; 1178 struct net_device *dev;
1227 struct ctcm_priv *priv; 1179 struct ctcm_priv *priv;
1228 struct ccwgroup_device *cgdev; 1180 struct ccwgroup_device *cgdev;
1181 int cstat;
1182 int dstat;
1183
1184 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
1185 "Enter %s(%s)", CTCM_FUNTAIL, &cdev->dev.bus_id);
1229 1186
1230 CTCM_DBF_TEXT(TRACE, CTC_DBF_DEBUG, __FUNCTION__);
1231 if (ctcm_check_irb_error(cdev, irb)) 1187 if (ctcm_check_irb_error(cdev, irb))
1232 return; 1188 return;
1233 1189
1234 cgdev = dev_get_drvdata(&cdev->dev); 1190 cgdev = dev_get_drvdata(&cdev->dev);
1235 1191
1192 cstat = irb->scsw.cmd.cstat;
1193 dstat = irb->scsw.cmd.dstat;
1194
1236 /* Check for unsolicited interrupts. */ 1195 /* Check for unsolicited interrupts. */
1237 if (cgdev == NULL) { 1196 if (cgdev == NULL) {
1238 ctcm_pr_warn("ctcm: Got unsolicited irq: %s c-%02x d-%02x\n", 1197 ctcm_pr_warn("ctcm: Got unsolicited irq: c-%02x d-%02x\n",
1239 cdev->dev.bus_id, irb->scsw.cmd.cstat, 1198 cstat, dstat);
1240 irb->scsw.cmd.dstat);
1241 return; 1199 return;
1242 } 1200 }
1243 1201
@@ -1254,26 +1212,22 @@ static void ctcm_irq_handler(struct ccw_device *cdev,
1254 return; 1212 return;
1255 } 1213 }
1256 1214
1257 dev = (struct net_device *)(ch->netdev); 1215 dev = ch->netdev;
1258 if (dev == NULL) { 1216 if (dev == NULL) {
1259 ctcm_pr_crit("ctcm: %s dev=NULL bus_id=%s, ch=0x%p\n", 1217 ctcm_pr_crit("ctcm: %s dev=NULL bus_id=%s, ch=0x%p\n",
1260 __FUNCTION__, cdev->dev.bus_id, ch); 1218 __func__, cdev->dev.bus_id, ch);
1261 return; 1219 return;
1262 } 1220 }
1263 1221
1264 if (do_debug) 1222 CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
1265 ctcm_pr_debug("%s: interrupt for device: %s " 1223 "%s(%s): int. for %s: cstat=%02x dstat=%02x",
1266 "received c-%02x d-%02x\n", 1224 CTCM_FUNTAIL, dev->name, ch->id, cstat, dstat);
1267 dev->name,
1268 ch->id,
1269 irb->scsw.cmd.cstat,
1270 irb->scsw.cmd.dstat);
1271 1225
1272 /* Copy interruption response block. */ 1226 /* Copy interruption response block. */
1273 memcpy(ch->irb, irb, sizeof(struct irb)); 1227 memcpy(ch->irb, irb, sizeof(struct irb));
1274 1228
1275 /* Check for good subchannel return code, otherwise error message */
1276 if (irb->scsw.cmd.cstat) { 1229 if (irb->scsw.cmd.cstat) {
1230 /* Check for good subchannel return code, otherwise error message */
1277 fsm_event(ch->fsm, CTC_EVENT_SC_UNKNOWN, ch); 1231 fsm_event(ch->fsm, CTC_EVENT_SC_UNKNOWN, ch);
1278 ctcm_pr_warn("%s: subchannel check for dev: %s - %02x %02x\n", 1232 ctcm_pr_warn("%s: subchannel check for dev: %s - %02x %02x\n",
1279 dev->name, ch->id, irb->scsw.cmd.cstat, 1233 dev->name, ch->id, irb->scsw.cmd.cstat,
@@ -1283,6 +1237,11 @@ static void ctcm_irq_handler(struct ccw_device *cdev,
1283 1237
1284 /* Check the reason-code of a unit check */ 1238 /* Check the reason-code of a unit check */
1285 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) { 1239 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
1240 if ((irb->ecw[0] & ch->sense_rc) == 0)
1241 /* print it only once */
1242 CTCM_DBF_TEXT_(TRACE, CTC_DBF_INFO,
1243 "%s(%s): sense=%02x, ds=%02x",
1244 CTCM_FUNTAIL, ch->id, irb->ecw[0], dstat);
1286 ccw_unit_check(ch, irb->ecw[0]); 1245 ccw_unit_check(ch, irb->ecw[0]);
1287 return; 1246 return;
1288 } 1247 }
@@ -1320,14 +1279,18 @@ static int ctcm_probe_device(struct ccwgroup_device *cgdev)
1320 struct ctcm_priv *priv; 1279 struct ctcm_priv *priv;
1321 int rc; 1280 int rc;
1322 1281
1323 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, "%s %p", __FUNCTION__, cgdev); 1282 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1283 "%s %p",
1284 __func__, cgdev);
1324 1285
1325 if (!get_device(&cgdev->dev)) 1286 if (!get_device(&cgdev->dev))
1326 return -ENODEV; 1287 return -ENODEV;
1327 1288
1328 priv = kzalloc(sizeof(struct ctcm_priv), GFP_KERNEL); 1289 priv = kzalloc(sizeof(struct ctcm_priv), GFP_KERNEL);
1329 if (!priv) { 1290 if (!priv) {
1330 ctcm_pr_err("%s: Out of memory\n", __FUNCTION__); 1291 CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
1292 "%s: memory allocation failure",
1293 CTCM_FUNTAIL);
1331 put_device(&cgdev->dev); 1294 put_device(&cgdev->dev);
1332 return -ENOMEM; 1295 return -ENOMEM;
1333 } 1296 }
@@ -1364,10 +1327,13 @@ static int add_channel(struct ccw_device *cdev, enum channel_types type,
1364 int ccw_num; 1327 int ccw_num;
1365 int rc = 0; 1328 int rc = 0;
1366 1329
1367 CTCM_DBF_TEXT(TRACE, 2, __FUNCTION__); 1330 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1331 "%s(%s), type %d, proto %d",
1332 __func__, cdev->dev.bus_id, type, priv->protocol);
1333
1368 ch = kzalloc(sizeof(struct channel), GFP_KERNEL); 1334 ch = kzalloc(sizeof(struct channel), GFP_KERNEL);
1369 if (ch == NULL) 1335 if (ch == NULL)
1370 goto nomem_return; 1336 return -ENOMEM;
1371 1337
1372 ch->protocol = priv->protocol; 1338 ch->protocol = priv->protocol;
1373 if (IS_MPC(priv)) { 1339 if (IS_MPC(priv)) {
@@ -1478,7 +1444,7 @@ static int add_channel(struct ccw_device *cdev, enum channel_types type,
1478 if (*c && (!strncmp((*c)->id, ch->id, CTCM_ID_SIZE))) { 1444 if (*c && (!strncmp((*c)->id, ch->id, CTCM_ID_SIZE))) {
1479 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, 1445 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1480 "%s (%s) already in list, using old entry", 1446 "%s (%s) already in list, using old entry",
1481 __FUNCTION__, (*c)->id); 1447 __func__, (*c)->id);
1482 1448
1483 goto free_return; 1449 goto free_return;
1484 } 1450 }
@@ -1498,11 +1464,10 @@ static int add_channel(struct ccw_device *cdev, enum channel_types type,
1498 return 0; 1464 return 0;
1499 1465
1500nomem_return: 1466nomem_return:
1501 ctcm_pr_warn("ctcm: Out of memory in %s\n", __FUNCTION__);
1502 rc = -ENOMEM; 1467 rc = -ENOMEM;
1503 1468
1504free_return: /* note that all channel pointers are 0 or valid */ 1469free_return: /* note that all channel pointers are 0 or valid */
1505 kfree(ch->ccw); /* TODO: check that again */ 1470 kfree(ch->ccw);
1506 kfree(ch->discontact_th); 1471 kfree(ch->discontact_th);
1507 kfree_fsm(ch->fsm); 1472 kfree_fsm(ch->fsm);
1508 kfree(ch->irb); 1473 kfree(ch->irb);
@@ -1540,48 +1505,48 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
1540 enum channel_types type; 1505 enum channel_types type;
1541 struct ctcm_priv *priv; 1506 struct ctcm_priv *priv;
1542 struct net_device *dev; 1507 struct net_device *dev;
1508 struct ccw_device *cdev0;
1509 struct ccw_device *cdev1;
1543 int ret; 1510 int ret;
1544 1511
1545 CTCM_DBF_TEXT(SETUP, CTC_DBF_INFO, __FUNCTION__);
1546
1547 priv = dev_get_drvdata(&cgdev->dev); 1512 priv = dev_get_drvdata(&cgdev->dev);
1548 if (!priv) 1513 if (!priv)
1549 return -ENODEV; 1514 return -ENODEV;
1550 1515
1551 type = get_channel_type(&cgdev->cdev[0]->id); 1516 cdev0 = cgdev->cdev[0];
1517 cdev1 = cgdev->cdev[1];
1518
1519 type = get_channel_type(&cdev0->id);
1552 1520
1553 snprintf(read_id, CTCM_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id); 1521 snprintf(read_id, CTCM_ID_SIZE, "ch-%s", cdev0->dev.bus_id);
1554 snprintf(write_id, CTCM_ID_SIZE, "ch-%s", cgdev->cdev[1]->dev.bus_id); 1522 snprintf(write_id, CTCM_ID_SIZE, "ch-%s", cdev1->dev.bus_id);
1555 1523
1556 ret = add_channel(cgdev->cdev[0], type, priv); 1524 ret = add_channel(cdev0, type, priv);
1557 if (ret) 1525 if (ret)
1558 return ret; 1526 return ret;
1559 ret = add_channel(cgdev->cdev[1], type, priv); 1527 ret = add_channel(cdev1, type, priv);
1560 if (ret) 1528 if (ret)
1561 return ret; 1529 return ret;
1562 1530
1563 ret = ccw_device_set_online(cgdev->cdev[0]); 1531 ret = ccw_device_set_online(cdev0);
1564 if (ret != 0) { 1532 if (ret != 0) {
1565 CTCM_DBF_TEXT(SETUP, CTC_DBF_WARN, 1533 /* may be ok to fail now - can be done later */
1566 "ccw_device_set_online (cdev[0]) failed "); 1534 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
1567 ctcm_pr_warn("ccw_device_set_online (cdev[0]) failed " 1535 "%s(%s) set_online rc=%d",
1568 "with ret = %d\n", ret); 1536 CTCM_FUNTAIL, read_id, ret);
1569 } 1537 }
1570 1538
1571 ret = ccw_device_set_online(cgdev->cdev[1]); 1539 ret = ccw_device_set_online(cdev1);
1572 if (ret != 0) { 1540 if (ret != 0) {
1573 CTCM_DBF_TEXT(SETUP, CTC_DBF_WARN, 1541 /* may be ok to fail now - can be done later */
1574 "ccw_device_set_online (cdev[1]) failed "); 1542 CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
1575 ctcm_pr_warn("ccw_device_set_online (cdev[1]) failed " 1543 "%s(%s) set_online rc=%d",
1576 "with ret = %d\n", ret); 1544 CTCM_FUNTAIL, write_id, ret);
1577 } 1545 }
1578 1546
1579 dev = ctcm_init_netdevice(priv); 1547 dev = ctcm_init_netdevice(priv);
1580 1548 if (dev == NULL)
1581 if (dev == NULL) { 1549 goto out;
1582 ctcm_pr_warn("ctcm_init_netdevice failed\n");
1583 goto out;
1584 }
1585 1550
1586 for (direction = READ; direction <= WRITE; direction++) { 1551 for (direction = READ; direction <= WRITE; direction++) {
1587 priv->channel[direction] = 1552 priv->channel[direction] =
@@ -1590,8 +1555,7 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
1590 if (priv->channel[direction] == NULL) { 1555 if (priv->channel[direction] == NULL) {
1591 if (direction == WRITE) 1556 if (direction == WRITE)
1592 channel_free(priv->channel[READ]); 1557 channel_free(priv->channel[READ]);
1593 ctcm_free_netdevice(dev); 1558 goto out_dev;
1594 goto out;
1595 } 1559 }
1596 priv->channel[direction]->netdev = dev; 1560 priv->channel[direction]->netdev = dev;
1597 priv->channel[direction]->protocol = priv->protocol; 1561 priv->channel[direction]->protocol = priv->protocol;
@@ -1600,26 +1564,24 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
1600 /* sysfs magic */ 1564 /* sysfs magic */
1601 SET_NETDEV_DEV(dev, &cgdev->dev); 1565 SET_NETDEV_DEV(dev, &cgdev->dev);
1602 1566
1603 if (ctcm_netdev_register(dev) != 0) { 1567 if (register_netdev(dev))
1604 ctcm_free_netdevice(dev); 1568 goto out_dev;
1605 goto out;
1606 }
1607 1569
1608 if (ctcm_add_attributes(&cgdev->dev)) { 1570 if (ctcm_add_attributes(&cgdev->dev)) {
1609 ctcm_netdev_unregister(dev); 1571 unregister_netdev(dev);
1610/* dev->priv = NULL; why that ???? */ 1572 goto out_dev;
1611 ctcm_free_netdevice(dev);
1612 goto out;
1613 } 1573 }
1614 1574
1615 strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name)); 1575 strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name));
1616 1576
1617 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO, 1577 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1618 "setup(%s) ok : r/w = %s / %s, proto : %d", 1578 "setup(%s) OK : r/w = %s/%s, protocol : %d", dev->name,
1619 dev->name, priv->channel[READ]->id, 1579 priv->channel[READ]->id,
1620 priv->channel[WRITE]->id, priv->protocol); 1580 priv->channel[WRITE]->id, priv->protocol);
1621 1581
1622 return 0; 1582 return 0;
1583out_dev:
1584 ctcm_free_netdevice(dev);
1623out: 1585out:
1624 ccw_device_set_offline(cgdev->cdev[1]); 1586 ccw_device_set_offline(cgdev->cdev[1]);
1625 ccw_device_set_offline(cgdev->cdev[0]); 1587 ccw_device_set_offline(cgdev->cdev[0]);
@@ -1658,8 +1620,7 @@ static int ctcm_shutdown_device(struct ccwgroup_device *cgdev)
1658 channel_free(priv->channel[WRITE]); 1620 channel_free(priv->channel[WRITE]);
1659 1621
1660 if (dev) { 1622 if (dev) {
1661 ctcm_netdev_unregister(dev); 1623 unregister_netdev(dev);
1662/* dev->priv = NULL; why that ??? */
1663 ctcm_free_netdevice(dev); 1624 ctcm_free_netdevice(dev);
1664 } 1625 }
1665 1626
@@ -1682,13 +1643,16 @@ static int ctcm_shutdown_device(struct ccwgroup_device *cgdev)
1682 1643
1683static void ctcm_remove_device(struct ccwgroup_device *cgdev) 1644static void ctcm_remove_device(struct ccwgroup_device *cgdev)
1684{ 1645{
1685 struct ctcm_priv *priv; 1646 struct ctcm_priv *priv = dev_get_drvdata(&cgdev->dev);
1686 1647
1687 CTCM_DBF_TEXT(SETUP, CTC_DBF_ERROR, __FUNCTION__); 1648 BUG_ON(priv == NULL);
1649
1650 CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1651 "removing device %s, r/w = %s/%s, proto : %d",
1652 priv->channel[READ]->netdev->name,
1653 priv->channel[READ]->id, priv->channel[WRITE]->id,
1654 priv->protocol);
1688 1655
1689 priv = dev_get_drvdata(&cgdev->dev);
1690 if (!priv)
1691 return;
1692 if (cgdev->state == CCWGROUP_ONLINE) 1656 if (cgdev->state == CCWGROUP_ONLINE)
1693 ctcm_shutdown_device(cgdev); 1657 ctcm_shutdown_device(cgdev);
1694 ctcm_remove_files(&cgdev->dev); 1658 ctcm_remove_files(&cgdev->dev);
@@ -1748,8 +1712,6 @@ static int __init ctcm_init(void)
1748 1712
1749 ret = ctcm_register_dbf_views(); 1713 ret = ctcm_register_dbf_views();
1750 if (ret) { 1714 if (ret) {
1751 ctcm_pr_crit("ctcm_init failed with ctcm_register_dbf_views "
1752 "rc = %d\n", ret);
1753 return ret; 1715 return ret;
1754 } 1716 }
1755 ret = register_cu3088_discipline(&ctcm_group_driver); 1717 ret = register_cu3088_discipline(&ctcm_group_driver);
diff --git a/drivers/s390/net/ctcm_main.h b/drivers/s390/net/ctcm_main.h
index 95b0c0b6ebc6..a72e0feeb27f 100644
--- a/drivers/s390/net/ctcm_main.h
+++ b/drivers/s390/net/ctcm_main.h
@@ -22,9 +22,9 @@
22 22
23#define CTC_DRIVER_NAME "ctcm" 23#define CTC_DRIVER_NAME "ctcm"
24#define CTC_DEVICE_NAME "ctc" 24#define CTC_DEVICE_NAME "ctc"
25#define CTC_DEVICE_GENE "ctc%d"
26#define MPC_DEVICE_NAME "mpc" 25#define MPC_DEVICE_NAME "mpc"
27#define MPC_DEVICE_GENE "mpc%d" 26#define CTC_DEVICE_GENE CTC_DEVICE_NAME "%d"
27#define MPC_DEVICE_GENE MPC_DEVICE_NAME "%d"
28 28
29#define CHANNEL_FLAGS_READ 0 29#define CHANNEL_FLAGS_READ 0
30#define CHANNEL_FLAGS_WRITE 1 30#define CHANNEL_FLAGS_WRITE 1
@@ -48,6 +48,30 @@
48#define ctcm_pr_err(fmt, arg...) printk(KERN_ERR fmt, ##arg) 48#define ctcm_pr_err(fmt, arg...) printk(KERN_ERR fmt, ##arg)
49#define ctcm_pr_crit(fmt, arg...) printk(KERN_CRIT fmt, ##arg) 49#define ctcm_pr_crit(fmt, arg...) printk(KERN_CRIT fmt, ##arg)
50 50
51#define CTCM_PR_DEBUG(fmt, arg...) \
52 do { \
53 if (do_debug) \
54 printk(KERN_DEBUG fmt, ##arg); \
55 } while (0)
56
57#define CTCM_PR_DBGDATA(fmt, arg...) \
58 do { \
59 if (do_debug_data) \
60 printk(KERN_DEBUG fmt, ##arg); \
61 } while (0)
62
63#define CTCM_D3_DUMP(buf, len) \
64 do { \
65 if (do_debug_data) \
66 ctcmpc_dumpit(buf, len); \
67 } while (0)
68
69#define CTCM_CCW_DUMP(buf, len) \
70 do { \
71 if (do_debug_ccw) \
72 ctcmpc_dumpit(buf, len); \
73 } while (0)
74
51/* 75/*
52 * CCW commands, used in this driver. 76 * CCW commands, used in this driver.
53 */ 77 */
@@ -161,8 +185,9 @@ struct channel {
161 fsm_instance *fsm; /* finite state machine of this channel */ 185 fsm_instance *fsm; /* finite state machine of this channel */
162 struct net_device *netdev; /* corresponding net_device */ 186 struct net_device *netdev; /* corresponding net_device */
163 struct ctcm_profile prof; 187 struct ctcm_profile prof;
164 unsigned char *trans_skb_data; 188 __u8 *trans_skb_data;
165 __u16 logflags; 189 __u16 logflags;
190 __u8 sense_rc; /* last unit check sense code report control */
166}; 191};
167 192
168struct ctcm_priv { 193struct ctcm_priv {
diff --git a/drivers/s390/net/ctcm_mpc.c b/drivers/s390/net/ctcm_mpc.c
index 044addee64a2..49ae1cd25caa 100644
--- a/drivers/s390/net/ctcm_mpc.c
+++ b/drivers/s390/net/ctcm_mpc.c
@@ -149,7 +149,7 @@ void ctcmpc_dumpit(char *buf, int len)
149 for (ct = 0; ct < len; ct++, ptr++, rptr++) { 149 for (ct = 0; ct < len; ct++, ptr++, rptr++) {
150 if (sw == 0) { 150 if (sw == 0) {
151 #if (UTS_MACHINE == s390x) 151 #if (UTS_MACHINE == s390x)
152 sprintf(addr, "%16.16lx", (unsigned long)rptr); 152 sprintf(addr, "%16.16lx", (__u64)rptr);
153 #else 153 #else
154 sprintf(addr, "%8.8X", (__u32)rptr); 154 sprintf(addr, "%8.8X", (__u32)rptr);
155 #endif 155 #endif
@@ -164,7 +164,7 @@ void ctcmpc_dumpit(char *buf, int len)
164 strcat(bhex, " "); 164 strcat(bhex, " ");
165 165
166 #if (UTS_MACHINE == s390x) 166 #if (UTS_MACHINE == s390x)
167 sprintf(tbuf, "%2.2lX", (unsigned long)*ptr); 167 sprintf(tbuf, "%2.2lX", (__u64)*ptr);
168 #else 168 #else
169 sprintf(tbuf, "%2.2X", (__u32)*ptr); 169 sprintf(tbuf, "%2.2X", (__u32)*ptr);
170 #endif 170 #endif
@@ -179,24 +179,24 @@ void ctcmpc_dumpit(char *buf, int len)
179 basc[sw+1] = '\0'; 179 basc[sw+1] = '\0';
180 sw++; 180 sw++;
181 rm--; 181 rm--;
182 if (sw == 16) { 182 if (sw != 16)
183 if ((strcmp(duphex, bhex)) != 0) { 183 continue;
184 if (dup != 0) { 184 if ((strcmp(duphex, bhex)) != 0) {
185 sprintf(tdup, "Duplicate as above " 185 if (dup != 0) {
186 "to %s", addr); 186 sprintf(tdup,
187 printk(KERN_INFO " " 187 "Duplicate as above to %s", addr);
188 " --- %s ---\n", tdup); 188 ctcm_pr_debug(" --- %s ---\n",
189 } 189 tdup);
190 printk(KERN_INFO " %s (+%s) : %s [%s]\n", 190 }
191 ctcm_pr_debug(" %s (+%s) : %s [%s]\n",
191 addr, boff, bhex, basc); 192 addr, boff, bhex, basc);
192 dup = 0; 193 dup = 0;
193 strcpy(duphex, bhex); 194 strcpy(duphex, bhex);
194 } else 195 } else
195 dup++; 196 dup++;
196 197
197 sw = 0; 198 sw = 0;
198 rm = 16; 199 rm = 16;
199 }
200 } /* endfor */ 200 } /* endfor */
201 201
202 if (sw != 0) { 202 if (sw != 0) {
@@ -210,19 +210,17 @@ void ctcmpc_dumpit(char *buf, int len)
210 } 210 }
211 if (dup != 0) { 211 if (dup != 0) {
212 sprintf(tdup, "Duplicate as above to %s", addr); 212 sprintf(tdup, "Duplicate as above to %s", addr);
213 printk(KERN_INFO " " 213 ctcm_pr_debug(" --- %s ---\n", tdup);
214 " --- %s ---\n", tdup);
215 } 214 }
216 printk(KERN_INFO " %s (+%s) : %s [%s]\n", 215 ctcm_pr_debug(" %s (+%s) : %s [%s]\n",
217 addr, boff, bhex, basc); 216 addr, boff, bhex, basc);
218 } else { 217 } else {
219 if (dup >= 1) { 218 if (dup >= 1) {
220 sprintf(tdup, "Duplicate as above to %s", addr); 219 sprintf(tdup, "Duplicate as above to %s", addr);
221 printk(KERN_INFO " " 220 ctcm_pr_debug(" --- %s ---\n", tdup);
222 " --- %s ---\n", tdup);
223 } 221 }
224 if (dup != 0) { 222 if (dup != 0) {
225 printk(KERN_INFO " %s (+%s) : %s [%s]\n", 223 ctcm_pr_debug(" %s (+%s) : %s [%s]\n",
226 addr, boff, bhex, basc); 224 addr, boff, bhex, basc);
227 } 225 }
228 } 226 }
@@ -241,7 +239,7 @@ void ctcmpc_dumpit(char *buf, int len)
241 */ 239 */
242void ctcmpc_dump_skb(struct sk_buff *skb, int offset) 240void ctcmpc_dump_skb(struct sk_buff *skb, int offset)
243{ 241{
244 unsigned char *p = skb->data; 242 __u8 *p = skb->data;
245 struct th_header *header; 243 struct th_header *header;
246 struct pdu *pheader; 244 struct pdu *pheader;
247 int bl = skb->len; 245 int bl = skb->len;
@@ -253,8 +251,8 @@ void ctcmpc_dump_skb(struct sk_buff *skb, int offset)
253 p += offset; 251 p += offset;
254 header = (struct th_header *)p; 252 header = (struct th_header *)p;
255 253
256 printk(KERN_INFO "dump:\n"); 254 ctcm_pr_debug("dump:\n");
257 printk(KERN_INFO "skb len=%d \n", skb->len); 255 ctcm_pr_debug("skb len=%d \n", skb->len);
258 if (skb->len > 2) { 256 if (skb->len > 2) {
259 switch (header->th_ch_flag) { 257 switch (header->th_ch_flag) {
260 case TH_HAS_PDU: 258 case TH_HAS_PDU:
@@ -273,32 +271,64 @@ void ctcmpc_dump_skb(struct sk_buff *skb, int offset)
273 } 271 }
274 272
275 pheader = (struct pdu *)p; 273 pheader = (struct pdu *)p;
276 printk(KERN_INFO "pdu->offset: %d hex: %04x\n", 274 ctcm_pr_debug("pdu->offset: %d hex: %04x\n",
277 pheader->pdu_offset, pheader->pdu_offset); 275 pheader->pdu_offset, pheader->pdu_offset);
278 printk(KERN_INFO "pdu->flag : %02x\n", pheader->pdu_flag); 276 ctcm_pr_debug("pdu->flag : %02x\n", pheader->pdu_flag);
279 printk(KERN_INFO "pdu->proto : %02x\n", pheader->pdu_proto); 277 ctcm_pr_debug("pdu->proto : %02x\n", pheader->pdu_proto);
280 printk(KERN_INFO "pdu->seq : %02x\n", pheader->pdu_seq); 278 ctcm_pr_debug("pdu->seq : %02x\n", pheader->pdu_seq);
281 goto dumpdata; 279 goto dumpdata;
282 280
283dumpth: 281dumpth:
284 printk(KERN_INFO "th->seg : %02x\n", header->th_seg); 282 ctcm_pr_debug("th->seg : %02x\n", header->th_seg);
285 printk(KERN_INFO "th->ch : %02x\n", header->th_ch_flag); 283 ctcm_pr_debug("th->ch : %02x\n", header->th_ch_flag);
286 printk(KERN_INFO "th->blk_flag: %02x\n", header->th_blk_flag); 284 ctcm_pr_debug("th->blk_flag: %02x\n", header->th_blk_flag);
287 printk(KERN_INFO "th->type : %s\n", 285 ctcm_pr_debug("th->type : %s\n",
288 (header->th_is_xid) ? "DATA" : "XID"); 286 (header->th_is_xid) ? "DATA" : "XID");
289 printk(KERN_INFO "th->seqnum : %04x\n", header->th_seq_num); 287 ctcm_pr_debug("th->seqnum : %04x\n", header->th_seq_num);
290 288
291 } 289 }
292dumpdata: 290dumpdata:
293 if (bl > 32) 291 if (bl > 32)
294 bl = 32; 292 bl = 32;
295 printk(KERN_INFO "data: "); 293 ctcm_pr_debug("data: ");
296 for (i = 0; i < bl; i++) 294 for (i = 0; i < bl; i++)
297 printk(KERN_INFO "%02x%s", *p++, (i % 16) ? " " : "\n<7>"); 295 ctcm_pr_debug("%02x%s", *p++, (i % 16) ? " " : "\n");
298 printk(KERN_INFO "\n"); 296 ctcm_pr_debug("\n");
299} 297}
300#endif 298#endif
301 299
300static struct net_device *ctcmpc_get_dev(int port_num)
301{
302 char device[20];
303 struct net_device *dev;
304 struct ctcm_priv *priv;
305
306 sprintf(device, "%s%i", MPC_DEVICE_NAME, port_num);
307
308 dev = __dev_get_by_name(&init_net, device);
309
310 if (dev == NULL) {
311 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
312 "%s: Device not found by name: %s",
313 CTCM_FUNTAIL, device);
314 return NULL;
315 }
316 priv = dev->priv;
317 if (priv == NULL) {
318 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
319 "%s(%s): dev->priv is NULL",
320 CTCM_FUNTAIL, device);
321 return NULL;
322 }
323 if (priv->mpcg == NULL) {
324 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
325 "%s(%s): priv->mpcg is NULL",
326 CTCM_FUNTAIL, device);
327 return NULL;
328 }
329 return dev;
330}
331
302/* 332/*
303 * ctc_mpc_alloc_channel 333 * ctc_mpc_alloc_channel
304 * (exported interface) 334 * (exported interface)
@@ -308,34 +338,23 @@ dumpdata:
308 */ 338 */
309int ctc_mpc_alloc_channel(int port_num, void (*callback)(int, int)) 339int ctc_mpc_alloc_channel(int port_num, void (*callback)(int, int))
310{ 340{
311 char device[20];
312 struct net_device *dev; 341 struct net_device *dev;
313 struct mpc_group *grp; 342 struct mpc_group *grp;
314 struct ctcm_priv *priv; 343 struct ctcm_priv *priv;
315 344
316 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__); 345 dev = ctcmpc_get_dev(port_num);
317 346 if (dev == NULL)
318 sprintf(device, "%s%i", MPC_DEVICE_NAME, port_num);
319 dev = __dev_get_by_name(&init_net, device);
320
321 if (dev == NULL) {
322 printk(KERN_INFO "ctc_mpc_alloc_channel %s dev=NULL\n", device);
323 return 1; 347 return 1;
324 }
325
326 priv = dev->priv; 348 priv = dev->priv;
327 grp = priv->mpcg; 349 grp = priv->mpcg;
328 if (!grp)
329 return 1;
330 350
331 grp->allochanfunc = callback; 351 grp->allochanfunc = callback;
332 grp->port_num = port_num; 352 grp->port_num = port_num;
333 grp->port_persist = 1; 353 grp->port_persist = 1;
334 354
335 ctcm_pr_debug("ctcmpc: %s called for device %s state=%s\n", 355 CTCM_DBF_TEXT_(MPC_SETUP, CTC_DBF_INFO,
336 __FUNCTION__, 356 "%s(%s): state=%s",
337 dev->name, 357 CTCM_FUNTAIL, dev->name, fsm_getstate_str(grp->fsm));
338 fsm_getstate_str(grp->fsm));
339 358
340 switch (fsm_getstate(grp->fsm)) { 359 switch (fsm_getstate(grp->fsm)) {
341 case MPCG_STATE_INOP: 360 case MPCG_STATE_INOP:
@@ -377,12 +396,8 @@ int ctc_mpc_alloc_channel(int port_num, void (*callback)(int, int))
377 grp->allocchan_callback_retries = 0; 396 grp->allocchan_callback_retries = 0;
378 } 397 }
379 break; 398 break;
380 default:
381 return 0;
382
383 } 399 }
384 400
385 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__);
386 return 0; 401 return 0;
387} 402}
388EXPORT_SYMBOL(ctc_mpc_alloc_channel); 403EXPORT_SYMBOL(ctc_mpc_alloc_channel);
@@ -394,31 +409,22 @@ EXPORT_SYMBOL(ctc_mpc_alloc_channel);
394void ctc_mpc_establish_connectivity(int port_num, 409void ctc_mpc_establish_connectivity(int port_num,
395 void (*callback)(int, int, int)) 410 void (*callback)(int, int, int))
396{ 411{
397 char device[20];
398 struct net_device *dev; 412 struct net_device *dev;
399 struct mpc_group *grp; 413 struct mpc_group *grp;
400 struct ctcm_priv *priv; 414 struct ctcm_priv *priv;
401 struct channel *rch, *wch; 415 struct channel *rch, *wch;
402 416
403 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__); 417 dev = ctcmpc_get_dev(port_num);
404 418 if (dev == NULL)
405 sprintf(device, "%s%i", MPC_DEVICE_NAME, port_num);
406 dev = __dev_get_by_name(&init_net, device);
407
408 if (dev == NULL) {
409 printk(KERN_INFO "ctc_mpc_establish_connectivity "
410 "%s dev=NULL\n", device);
411 return; 419 return;
412 }
413 priv = dev->priv; 420 priv = dev->priv;
421 grp = priv->mpcg;
414 rch = priv->channel[READ]; 422 rch = priv->channel[READ];
415 wch = priv->channel[WRITE]; 423 wch = priv->channel[WRITE];
416 424
417 grp = priv->mpcg; 425 CTCM_DBF_TEXT_(MPC_SETUP, CTC_DBF_INFO,
418 426 "%s(%s): state=%s",
419 ctcm_pr_debug("ctcmpc: %s() called for device %s state=%s\n", 427 CTCM_FUNTAIL, dev->name, fsm_getstate_str(grp->fsm));
420 __FUNCTION__, dev->name,
421 fsm_getstate_str(grp->fsm));
422 428
423 grp->estconnfunc = callback; 429 grp->estconnfunc = callback;
424 grp->port_num = port_num; 430 grp->port_num = port_num;
@@ -446,8 +452,10 @@ void ctc_mpc_establish_connectivity(int port_num,
446 case MPCG_STATE_RESET: 452 case MPCG_STATE_RESET:
447 /* MPC Group is not ready to start XID - min num of */ 453 /* MPC Group is not ready to start XID - min num of */
448 /* 1 read and 1 write channel have not been acquired*/ 454 /* 1 read and 1 write channel have not been acquired*/
449 printk(KERN_WARNING "ctcmpc: %s() REJECTED ACTIVE XID Req" 455
450 "uest - Channel Pair is not Active\n", __FUNCTION__); 456 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
457 "%s(%s): REJECTED - inactive channels",
458 CTCM_FUNTAIL, dev->name);
451 if (grp->estconnfunc) { 459 if (grp->estconnfunc) {
452 grp->estconnfunc(grp->port_num, -1, 0); 460 grp->estconnfunc(grp->port_num, -1, 0);
453 grp->estconnfunc = NULL; 461 grp->estconnfunc = NULL;
@@ -457,11 +465,12 @@ void ctc_mpc_establish_connectivity(int port_num,
457 /* alloc channel was called but no XID exchange */ 465 /* alloc channel was called but no XID exchange */
458 /* has occurred. initiate xside XID exchange */ 466 /* has occurred. initiate xside XID exchange */
459 /* make sure yside XID0 processing has not started */ 467 /* make sure yside XID0 processing has not started */
468
460 if ((fsm_getstate(rch->fsm) > CH_XID0_PENDING) || 469 if ((fsm_getstate(rch->fsm) > CH_XID0_PENDING) ||
461 (fsm_getstate(wch->fsm) > CH_XID0_PENDING)) { 470 (fsm_getstate(wch->fsm) > CH_XID0_PENDING)) {
462 printk(KERN_WARNING "mpc: %s() ABORT ACTIVE XID" 471 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
463 " Request- PASSIVE XID in process\n" 472 "%s(%s): ABORT - PASSIVE XID",
464 , __FUNCTION__); 473 CTCM_FUNTAIL, dev->name);
465 break; 474 break;
466 } 475 }
467 grp->send_qllc_disc = 1; 476 grp->send_qllc_disc = 1;
@@ -476,9 +485,9 @@ void ctc_mpc_establish_connectivity(int port_num,
476 (fsm_getstate(rch->fsm) == CH_XID0_PENDING)) 485 (fsm_getstate(rch->fsm) == CH_XID0_PENDING))
477 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, rch); 486 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, rch);
478 else { 487 else {
479 printk(KERN_WARNING "mpc: %s() Unable to start" 488 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
480 " ACTIVE XID0 on read channel\n", 489 "%s(%s): RX-%s not ready for ACTIVE XID0",
481 __FUNCTION__); 490 CTCM_FUNTAIL, dev->name, rch->id);
482 if (grp->estconnfunc) { 491 if (grp->estconnfunc) {
483 grp->estconnfunc(grp->port_num, -1, 0); 492 grp->estconnfunc(grp->port_num, -1, 0);
484 grp->estconnfunc = NULL; 493 grp->estconnfunc = NULL;
@@ -490,9 +499,9 @@ void ctc_mpc_establish_connectivity(int port_num,
490 (fsm_getstate(wch->fsm) == CH_XID0_PENDING)) 499 (fsm_getstate(wch->fsm) == CH_XID0_PENDING))
491 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, wch); 500 fsm_event(grp->fsm, MPCG_EVENT_XID0DO, wch);
492 else { 501 else {
493 printk(KERN_WARNING "mpc: %s() Unable to start" 502 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
494 " ACTIVE XID0 on write channel\n", 503 "%s(%s): WX-%s not ready for ACTIVE XID0",
495 __FUNCTION__); 504 CTCM_FUNTAIL, dev->name, wch->id);
496 if (grp->estconnfunc) { 505 if (grp->estconnfunc) {
497 grp->estconnfunc(grp->port_num, -1, 0); 506 grp->estconnfunc(grp->port_num, -1, 0);
498 grp->estconnfunc = NULL; 507 grp->estconnfunc = NULL;
@@ -508,7 +517,7 @@ void ctc_mpc_establish_connectivity(int port_num,
508 } 517 }
509 518
510done: 519done:
511 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__); 520 CTCM_PR_DEBUG("Exit %s()\n", __func__);
512 return; 521 return;
513} 522}
514EXPORT_SYMBOL(ctc_mpc_establish_connectivity); 523EXPORT_SYMBOL(ctc_mpc_establish_connectivity);
@@ -520,40 +529,22 @@ EXPORT_SYMBOL(ctc_mpc_establish_connectivity);
520void ctc_mpc_dealloc_ch(int port_num) 529void ctc_mpc_dealloc_ch(int port_num)
521{ 530{
522 struct net_device *dev; 531 struct net_device *dev;
523 char device[20];
524 struct ctcm_priv *priv; 532 struct ctcm_priv *priv;
525 struct mpc_group *grp; 533 struct mpc_group *grp;
526 534
527 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__); 535 dev = ctcmpc_get_dev(port_num);
528 sprintf(device, "%s%i", MPC_DEVICE_NAME, port_num); 536 if (dev == NULL)
529 dev = __dev_get_by_name(&init_net, device); 537 return;
530 538 priv = dev->priv;
531 if (dev == NULL) { 539 grp = priv->mpcg;
532 printk(KERN_INFO "%s() %s dev=NULL\n", __FUNCTION__, device);
533 goto done;
534 }
535 540
536 ctcm_pr_debug("ctcmpc:%s %s() called for device %s refcount=%d\n", 541 CTCM_DBF_TEXT_(MPC_SETUP, CTC_DBF_DEBUG,
537 dev->name, __FUNCTION__, 542 "%s: %s: refcount = %d\n",
538 dev->name, atomic_read(&dev->refcnt)); 543 CTCM_FUNTAIL, dev->name, atomic_read(&dev->refcnt));
539 544
540 priv = dev->priv;
541 if (priv == NULL) {
542 printk(KERN_INFO "%s() %s priv=NULL\n",
543 __FUNCTION__, device);
544 goto done;
545 }
546 fsm_deltimer(&priv->restart_timer); 545 fsm_deltimer(&priv->restart_timer);
547
548 grp = priv->mpcg;
549 if (grp == NULL) {
550 printk(KERN_INFO "%s() %s dev=NULL\n", __FUNCTION__, device);
551 goto done;
552 }
553 grp->channels_terminating = 0; 546 grp->channels_terminating = 0;
554
555 fsm_deltimer(&grp->timer); 547 fsm_deltimer(&grp->timer);
556
557 grp->allochanfunc = NULL; 548 grp->allochanfunc = NULL;
558 grp->estconnfunc = NULL; 549 grp->estconnfunc = NULL;
559 grp->port_persist = 0; 550 grp->port_persist = 0;
@@ -561,8 +552,6 @@ void ctc_mpc_dealloc_ch(int port_num)
561 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); 552 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
562 553
563 ctcm_close(dev); 554 ctcm_close(dev);
564done:
565 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__);
566 return; 555 return;
567} 556}
568EXPORT_SYMBOL(ctc_mpc_dealloc_ch); 557EXPORT_SYMBOL(ctc_mpc_dealloc_ch);
@@ -573,32 +562,22 @@ EXPORT_SYMBOL(ctc_mpc_dealloc_ch);
573 */ 562 */
574void ctc_mpc_flow_control(int port_num, int flowc) 563void ctc_mpc_flow_control(int port_num, int flowc)
575{ 564{
576 char device[20];
577 struct ctcm_priv *priv; 565 struct ctcm_priv *priv;
578 struct mpc_group *grp; 566 struct mpc_group *grp;
579 struct net_device *dev; 567 struct net_device *dev;
580 struct channel *rch; 568 struct channel *rch;
581 int mpcg_state; 569 int mpcg_state;
582 570
583 ctcm_pr_debug("ctcmpc enter: %s() %i\n", __FUNCTION__, flowc); 571 dev = ctcmpc_get_dev(port_num);
584 572 if (dev == NULL)
585 sprintf(device, "%s%i", MPC_DEVICE_NAME, port_num);
586 dev = __dev_get_by_name(&init_net, device);
587
588 if (dev == NULL) {
589 printk(KERN_INFO "ctc_mpc_flow_control %s dev=NULL\n", device);
590 return; 573 return;
591 } 574 priv = dev->priv;
575 grp = priv->mpcg;
592 576
593 ctcm_pr_debug("ctcmpc: %s %s called \n", dev->name, __FUNCTION__); 577 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
578 "%s: %s: flowc = %d",
579 CTCM_FUNTAIL, dev->name, flowc);
594 580
595 priv = dev->priv;
596 if (priv == NULL) {
597 printk(KERN_INFO "ctcmpc:%s() %s priv=NULL\n",
598 __FUNCTION__, device);
599 return;
600 }
601 grp = priv->mpcg;
602 rch = priv->channel[READ]; 581 rch = priv->channel[READ];
603 582
604 mpcg_state = fsm_getstate(grp->fsm); 583 mpcg_state = fsm_getstate(grp->fsm);
@@ -629,7 +608,6 @@ void ctc_mpc_flow_control(int port_num, int flowc)
629 break; 608 break;
630 } 609 }
631 610
632 ctcm_pr_debug("ctcmpc exit: %s() %i\n", __FUNCTION__, flowc);
633} 611}
634EXPORT_SYMBOL(ctc_mpc_flow_control); 612EXPORT_SYMBOL(ctc_mpc_flow_control);
635 613
@@ -646,12 +624,8 @@ static void mpc_rcvd_sweep_resp(struct mpcg_info *mpcginfo)
646 struct mpc_group *grp = priv->mpcg; 624 struct mpc_group *grp = priv->mpcg;
647 struct channel *ch = priv->channel[WRITE]; 625 struct channel *ch = priv->channel[WRITE];
648 626
649 if (do_debug) 627 CTCM_PR_DEBUG("%s: ch=0x%p id=%s\n", __func__, ch, ch->id);
650 ctcm_pr_debug("ctcmpc enter: %s(): ch=0x%p id=%s\n", 628 CTCM_D3_DUMP((char *)mpcginfo->sweep, TH_SWEEP_LENGTH);
651 __FUNCTION__, ch, ch->id);
652
653 if (do_debug_data)
654 ctcmpc_dumpit((char *)mpcginfo->sweep, TH_SWEEP_LENGTH);
655 629
656 grp->sweep_rsp_pend_num--; 630 grp->sweep_rsp_pend_num--;
657 631
@@ -684,14 +658,13 @@ static void ctcmpc_send_sweep_resp(struct channel *rch)
684 struct sk_buff *sweep_skb; 658 struct sk_buff *sweep_skb;
685 struct channel *ch = priv->channel[WRITE]; 659 struct channel *ch = priv->channel[WRITE];
686 660
687 if (do_debug) 661 CTCM_PR_DEBUG("%s: ch=0x%p id=%s\n", __func__, rch, rch->id);
688 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
689 __FUNCTION__, rch, rch->id);
690 662
691 sweep_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, 663 sweep_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC | GFP_DMA);
692 GFP_ATOMIC|GFP_DMA);
693 if (sweep_skb == NULL) { 664 if (sweep_skb == NULL) {
694 printk(KERN_INFO "Couldn't alloc sweep_skb\n"); 665 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
666 "%s(%s): sweep_skb allocation ERROR\n",
667 CTCM_FUNTAIL, rch->id);
695 rc = -ENOMEM; 668 rc = -ENOMEM;
696 goto done; 669 goto done;
697 } 670 }
@@ -746,7 +719,7 @@ static void mpc_rcvd_sweep_req(struct mpcg_info *mpcginfo)
746 719
747 if (do_debug) 720 if (do_debug)
748 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG, 721 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
749 " %s(): ch=0x%p id=%s\n", __FUNCTION__, ch, ch->id); 722 " %s(): ch=0x%p id=%s\n", __func__, ch, ch->id);
750 723
751 if (grp->in_sweep == 0) { 724 if (grp->in_sweep == 0) {
752 grp->in_sweep = 1; 725 grp->in_sweep = 1;
@@ -755,8 +728,7 @@ static void mpc_rcvd_sweep_req(struct mpcg_info *mpcginfo)
755 grp->sweep_rsp_pend_num = grp->active_channels[READ]; 728 grp->sweep_rsp_pend_num = grp->active_channels[READ];
756 } 729 }
757 730
758 if (do_debug_data) 731 CTCM_D3_DUMP((char *)mpcginfo->sweep, TH_SWEEP_LENGTH);
759 ctcmpc_dumpit((char *)mpcginfo->sweep, TH_SWEEP_LENGTH);
760 732
761 grp->sweep_req_pend_num--; 733 grp->sweep_req_pend_num--;
762 ctcmpc_send_sweep_resp(ch); 734 ctcmpc_send_sweep_resp(ch);
@@ -875,25 +847,13 @@ static int mpcg_fsm_len = ARRAY_SIZE(mpcg_fsm);
875static void mpc_action_go_ready(fsm_instance *fsm, int event, void *arg) 847static void mpc_action_go_ready(fsm_instance *fsm, int event, void *arg)
876{ 848{
877 struct net_device *dev = arg; 849 struct net_device *dev = arg;
878 struct ctcm_priv *priv = NULL; 850 struct ctcm_priv *priv = dev->priv;
879 struct mpc_group *grp = NULL; 851 struct mpc_group *grp = priv->mpcg;
880
881 if (dev == NULL) {
882 printk(KERN_INFO "%s() dev=NULL\n", __FUNCTION__);
883 return;
884 }
885
886 ctcm_pr_debug("ctcmpc enter: %s %s()\n", dev->name, __FUNCTION__);
887
888 priv = dev->priv;
889 if (priv == NULL) {
890 printk(KERN_INFO "%s() priv=NULL\n", __FUNCTION__);
891 return;
892 }
893 852
894 grp = priv->mpcg;
895 if (grp == NULL) { 853 if (grp == NULL) {
896 printk(KERN_INFO "%s() grp=NULL\n", __FUNCTION__); 854 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
855 "%s(%s): No MPC group",
856 CTCM_FUNTAIL, dev->name);
897 return; 857 return;
898 } 858 }
899 859
@@ -907,7 +867,12 @@ static void mpc_action_go_ready(fsm_instance *fsm, int event, void *arg)
907 grp->estconnfunc = NULL; 867 grp->estconnfunc = NULL;
908 } else if (grp->allochanfunc) 868 } else if (grp->allochanfunc)
909 grp->send_qllc_disc = 1; 869 grp->send_qllc_disc = 1;
910 goto done; 870
871 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
872 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
873 "%s(%s): fails",
874 CTCM_FUNTAIL, dev->name);
875 return;
911 } 876 }
912 877
913 grp->port_persist = 1; 878 grp->port_persist = 1;
@@ -916,14 +881,7 @@ static void mpc_action_go_ready(fsm_instance *fsm, int event, void *arg)
916 881
917 tasklet_hi_schedule(&grp->mpc_tasklet2); 882 tasklet_hi_schedule(&grp->mpc_tasklet2);
918 883
919 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev->name, __FUNCTION__);
920 return; 884 return;
921
922done:
923 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
924
925
926 ctcm_pr_info("ctcmpc: %s()failure occurred\n", __FUNCTION__);
927} 885}
928 886
929/* 887/*
@@ -933,42 +891,28 @@ done:
933void mpc_group_ready(unsigned long adev) 891void mpc_group_ready(unsigned long adev)
934{ 892{
935 struct net_device *dev = (struct net_device *)adev; 893 struct net_device *dev = (struct net_device *)adev;
936 struct ctcm_priv *priv = NULL; 894 struct ctcm_priv *priv = dev->priv;
937 struct mpc_group *grp = NULL; 895 struct mpc_group *grp = priv->mpcg;
938 struct channel *ch = NULL; 896 struct channel *ch = NULL;
939 897
940
941 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__);
942
943 if (dev == NULL) {
944 printk(KERN_INFO "%s() dev=NULL\n", __FUNCTION__);
945 return;
946 }
947
948 priv = dev->priv;
949 if (priv == NULL) {
950 printk(KERN_INFO "%s() priv=NULL\n", __FUNCTION__);
951 return;
952 }
953
954 grp = priv->mpcg;
955 if (grp == NULL) { 898 if (grp == NULL) {
956 printk(KERN_INFO "ctcmpc:%s() grp=NULL\n", __FUNCTION__); 899 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
900 "%s(%s): No MPC group",
901 CTCM_FUNTAIL, dev->name);
957 return; 902 return;
958 } 903 }
959 904
960 printk(KERN_NOTICE "ctcmpc: %s GROUP TRANSITIONED TO READY" 905 CTCM_DBF_TEXT_(MPC_SETUP, CTC_DBF_NOTICE,
961 " maxbuf:%d\n", 906 "%s: %s: GROUP TRANSITIONED TO READY, maxbuf = %d\n",
962 dev->name, grp->group_max_buflen); 907 CTCM_FUNTAIL, dev->name, grp->group_max_buflen);
963 908
964 fsm_newstate(grp->fsm, MPCG_STATE_READY); 909 fsm_newstate(grp->fsm, MPCG_STATE_READY);
965 910
966 /* Put up a read on the channel */ 911 /* Put up a read on the channel */
967 ch = priv->channel[READ]; 912 ch = priv->channel[READ];
968 ch->pdu_seq = 0; 913 ch->pdu_seq = 0;
969 if (do_debug_data) 914 CTCM_PR_DBGDATA("ctcmpc: %s() ToDCM_pdu_seq= %08x\n" ,
970 ctcm_pr_debug("ctcmpc: %s() ToDCM_pdu_seq= %08x\n" , 915 __func__, ch->pdu_seq);
971 __FUNCTION__, ch->pdu_seq);
972 916
973 ctcmpc_chx_rxidle(ch->fsm, CTC_EVENT_START, ch); 917 ctcmpc_chx_rxidle(ch->fsm, CTC_EVENT_START, ch);
974 /* Put the write channel in idle state */ 918 /* Put the write channel in idle state */
@@ -980,22 +924,18 @@ void mpc_group_ready(unsigned long adev)
980 spin_unlock(&ch->collect_lock); 924 spin_unlock(&ch->collect_lock);
981 } 925 }
982 ctcm_chx_txidle(ch->fsm, CTC_EVENT_START, ch); 926 ctcm_chx_txidle(ch->fsm, CTC_EVENT_START, ch);
983
984 ctcm_clear_busy(dev); 927 ctcm_clear_busy(dev);
985 928
986 if (grp->estconnfunc) { 929 if (grp->estconnfunc) {
987 grp->estconnfunc(grp->port_num, 0, 930 grp->estconnfunc(grp->port_num, 0,
988 grp->group_max_buflen); 931 grp->group_max_buflen);
989 grp->estconnfunc = NULL; 932 grp->estconnfunc = NULL;
990 } else 933 } else if (grp->allochanfunc)
991 if (grp->allochanfunc) 934 grp->allochanfunc(grp->port_num, grp->group_max_buflen);
992 grp->allochanfunc(grp->port_num,
993 grp->group_max_buflen);
994 935
995 grp->send_qllc_disc = 1; 936 grp->send_qllc_disc = 1;
996 grp->changed_side = 0; 937 grp->changed_side = 0;
997 938
998 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__);
999 return; 939 return;
1000 940
1001} 941}
@@ -1004,51 +944,26 @@ void mpc_group_ready(unsigned long adev)
1004 * Increment the MPC Group Active Channel Counts 944 * Increment the MPC Group Active Channel Counts
1005 * helper of dev_action (called from channel fsm) 945 * helper of dev_action (called from channel fsm)
1006 */ 946 */
1007int mpc_channel_action(struct channel *ch, int direction, int action) 947void mpc_channel_action(struct channel *ch, int direction, int action)
1008{ 948{
1009 struct net_device *dev = ch->netdev; 949 struct net_device *dev = ch->netdev;
1010 struct ctcm_priv *priv; 950 struct ctcm_priv *priv = dev->priv;
1011 struct mpc_group *grp = NULL; 951 struct mpc_group *grp = priv->mpcg;
1012 int rc = 0;
1013
1014 if (do_debug)
1015 ctcm_pr_debug("ctcmpc enter: %s(): ch=0x%p id=%s\n",
1016 __FUNCTION__, ch, ch->id);
1017
1018 if (dev == NULL) {
1019 printk(KERN_INFO "ctcmpc_channel_action %i dev=NULL\n",
1020 action);
1021 rc = 1;
1022 goto done;
1023 }
1024
1025 priv = dev->priv;
1026 if (priv == NULL) {
1027 printk(KERN_INFO
1028 "ctcmpc_channel_action%i priv=NULL, dev=%s\n",
1029 action, dev->name);
1030 rc = 2;
1031 goto done;
1032 }
1033
1034 grp = priv->mpcg;
1035 952
1036 if (grp == NULL) { 953 if (grp == NULL) {
1037 printk(KERN_INFO "ctcmpc: %s()%i mpcgroup=NULL, dev=%s\n", 954 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1038 __FUNCTION__, action, dev->name); 955 "%s(%s): No MPC group",
1039 rc = 3; 956 CTCM_FUNTAIL, dev->name);
1040 goto done; 957 return;
1041 } 958 }
1042 959
1043 ctcm_pr_info( 960 CTCM_PR_DEBUG("enter %s: ch=0x%p id=%s\n", __func__, ch, ch->id);
1044 "ctcmpc: %s() %i(): Grp:%s total_channel_paths=%i " 961
1045 "active_channels read=%i, write=%i\n", 962 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_NOTICE,
1046 __FUNCTION__, 963 "%s: %i / Grp:%s total_channels=%i, active_channels: "
1047 action, 964 "read=%i, write=%i\n", __func__, action,
1048 fsm_getstate_str(grp->fsm), 965 fsm_getstate_str(grp->fsm), grp->num_channel_paths,
1049 grp->num_channel_paths, 966 grp->active_channels[READ], grp->active_channels[WRITE]);
1050 grp->active_channels[READ],
1051 grp->active_channels[WRITE]);
1052 967
1053 if ((action == MPC_CHANNEL_ADD) && (ch->in_mpcgroup == 0)) { 968 if ((action == MPC_CHANNEL_ADD) && (ch->in_mpcgroup == 0)) {
1054 grp->num_channel_paths++; 969 grp->num_channel_paths++;
@@ -1062,10 +977,11 @@ int mpc_channel_action(struct channel *ch, int direction, int action)
1062 ch->xid_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, 977 ch->xid_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT,
1063 GFP_ATOMIC | GFP_DMA); 978 GFP_ATOMIC | GFP_DMA);
1064 if (ch->xid_skb == NULL) { 979 if (ch->xid_skb == NULL) {
1065 printk(KERN_INFO "ctcmpc: %s()" 980 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1066 "Couldn't alloc ch xid_skb\n", __FUNCTION__); 981 "%s(%s): Couldn't alloc ch xid_skb\n",
982 CTCM_FUNTAIL, dev->name);
1067 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); 983 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1068 return 1; 984 return;
1069 } 985 }
1070 ch->xid_skb_data = ch->xid_skb->data; 986 ch->xid_skb_data = ch->xid_skb->data;
1071 ch->xid_th = (struct th_header *)ch->xid_skb->data; 987 ch->xid_th = (struct th_header *)ch->xid_skb->data;
@@ -1097,8 +1013,9 @@ int mpc_channel_action(struct channel *ch, int direction, int action)
1097 (grp->active_channels[WRITE] > 0) && 1013 (grp->active_channels[WRITE] > 0) &&
1098 (fsm_getstate(grp->fsm) < MPCG_STATE_XID2INITW)) { 1014 (fsm_getstate(grp->fsm) < MPCG_STATE_XID2INITW)) {
1099 fsm_newstate(grp->fsm, MPCG_STATE_XID2INITW); 1015 fsm_newstate(grp->fsm, MPCG_STATE_XID2INITW);
1100 printk(KERN_NOTICE "ctcmpc: %s MPC GROUP " 1016 CTCM_DBF_TEXT_(MPC_SETUP, CTC_DBF_NOTICE,
1101 "CHANNELS ACTIVE\n", dev->name); 1017 "%s: %s: MPC GROUP CHANNELS ACTIVE\n",
1018 __func__, dev->name);
1102 } 1019 }
1103 } else if ((action == MPC_CHANNEL_REMOVE) && 1020 } else if ((action == MPC_CHANNEL_REMOVE) &&
1104 (ch->in_mpcgroup == 1)) { 1021 (ch->in_mpcgroup == 1)) {
@@ -1119,25 +1036,14 @@ int mpc_channel_action(struct channel *ch, int direction, int action)
1119 (grp->active_channels[READ] > 0))) 1036 (grp->active_channels[READ] > 0)))
1120 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); 1037 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1121 } 1038 }
1122
1123done: 1039done:
1040 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
1041 "exit %s: %i / Grp:%s total_channels=%i, active_channels: "
1042 "read=%i, write=%i\n", __func__, action,
1043 fsm_getstate_str(grp->fsm), grp->num_channel_paths,
1044 grp->active_channels[READ], grp->active_channels[WRITE]);
1124 1045
1125 if (do_debug) { 1046 CTCM_PR_DEBUG("exit %s: ch=0x%p id=%s\n", __func__, ch, ch->id);
1126 ctcm_pr_debug(
1127 "ctcmpc: %s() %i Grp:%s ttl_chan_paths=%i "
1128 "active_chans read=%i, write=%i\n",
1129 __FUNCTION__,
1130 action,
1131 fsm_getstate_str(grp->fsm),
1132 grp->num_channel_paths,
1133 grp->active_channels[READ],
1134 grp->active_channels[WRITE]);
1135
1136 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
1137 __FUNCTION__, ch, ch->id);
1138 }
1139 return rc;
1140
1141} 1047}
1142 1048
1143/** 1049/**
@@ -1163,9 +1069,8 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1163 int skblen; 1069 int skblen;
1164 int sendrc = 0; 1070 int sendrc = 0;
1165 1071
1166 if (do_debug) 1072 CTCM_PR_DEBUG("ctcmpc enter: %s() %s cp:%i ch:%s\n",
1167 ctcm_pr_debug("ctcmpc enter: %s() %s cp:%i ch:%s\n", 1073 __func__, dev->name, smp_processor_id(), ch->id);
1168 __FUNCTION__, dev->name, smp_processor_id(), ch->id);
1169 1074
1170 header = (struct th_header *)pskb->data; 1075 header = (struct th_header *)pskb->data;
1171 if ((header->th_seg == 0) && 1076 if ((header->th_seg == 0) &&
@@ -1174,21 +1079,16 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1174 (header->th_seq_num == 0)) 1079 (header->th_seq_num == 0))
1175 /* nothing for us */ goto done; 1080 /* nothing for us */ goto done;
1176 1081
1177 if (do_debug_data) { 1082 CTCM_PR_DBGDATA("%s: th_header\n", __func__);
1178 ctcm_pr_debug("ctcmpc: %s() th_header\n", __FUNCTION__); 1083 CTCM_D3_DUMP((char *)header, TH_HEADER_LENGTH);
1179 ctcmpc_dumpit((char *)header, TH_HEADER_LENGTH); 1084 CTCM_PR_DBGDATA("%s: pskb len: %04x \n", __func__, pskb->len);
1180 ctcm_pr_debug("ctcmpc: %s() pskb len: %04x \n",
1181 __FUNCTION__, pskb->len);
1182 }
1183 1085
1184 pskb->dev = dev; 1086 pskb->dev = dev;
1185 pskb->ip_summed = CHECKSUM_UNNECESSARY; 1087 pskb->ip_summed = CHECKSUM_UNNECESSARY;
1186 skb_pull(pskb, TH_HEADER_LENGTH); 1088 skb_pull(pskb, TH_HEADER_LENGTH);
1187 1089
1188 if (likely(header->th_ch_flag == TH_HAS_PDU)) { 1090 if (likely(header->th_ch_flag == TH_HAS_PDU)) {
1189 if (do_debug_data) 1091 CTCM_PR_DBGDATA("%s: came into th_has_pdu\n", __func__);
1190 ctcm_pr_debug("ctcmpc: %s() came into th_has_pdu\n",
1191 __FUNCTION__);
1192 if ((fsm_getstate(grp->fsm) == MPCG_STATE_FLOWC) || 1092 if ((fsm_getstate(grp->fsm) == MPCG_STATE_FLOWC) ||
1193 ((fsm_getstate(grp->fsm) == MPCG_STATE_READY) && 1093 ((fsm_getstate(grp->fsm) == MPCG_STATE_READY) &&
1194 (header->th_seq_num != ch->th_seq_num + 1) && 1094 (header->th_seq_num != ch->th_seq_num + 1) &&
@@ -1202,33 +1102,29 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1202 grp->out_of_sequence += 1; 1102 grp->out_of_sequence += 1;
1203 __skb_push(pskb, TH_HEADER_LENGTH); 1103 __skb_push(pskb, TH_HEADER_LENGTH);
1204 skb_queue_tail(&ch->io_queue, pskb); 1104 skb_queue_tail(&ch->io_queue, pskb);
1205 if (do_debug_data) 1105 CTCM_PR_DBGDATA("%s: th_seq_num expect:%08x "
1206 ctcm_pr_debug("ctcmpc: %s() th_seq_num " 1106 "got:%08x\n", __func__,
1207 "expect:%08x got:%08x\n", __FUNCTION__, 1107 ch->th_seq_num + 1, header->th_seq_num);
1208 ch->th_seq_num + 1, header->th_seq_num);
1209 1108
1210 return; 1109 return;
1211 } 1110 }
1212 grp->out_of_sequence = 0; 1111 grp->out_of_sequence = 0;
1213 ch->th_seq_num = header->th_seq_num; 1112 ch->th_seq_num = header->th_seq_num;
1214 1113
1215 if (do_debug_data) 1114 CTCM_PR_DBGDATA("ctcmpc: %s() FromVTAM_th_seq=%08x\n",
1216 ctcm_pr_debug("ctcmpc: %s() FromVTAM_th_seq=%08x\n", 1115 __func__, ch->th_seq_num);
1217 __FUNCTION__, ch->th_seq_num);
1218 1116
1219 if (unlikely(fsm_getstate(grp->fsm) != MPCG_STATE_READY)) 1117 if (unlikely(fsm_getstate(grp->fsm) != MPCG_STATE_READY))
1220 goto done; 1118 goto done;
1221 pdu_last_seen = 0; 1119 pdu_last_seen = 0;
1222 while ((pskb->len > 0) && !pdu_last_seen) { 1120 while ((pskb->len > 0) && !pdu_last_seen) {
1223 curr_pdu = (struct pdu *)pskb->data; 1121 curr_pdu = (struct pdu *)pskb->data;
1224 if (do_debug_data) { 1122
1225 ctcm_pr_debug("ctcm: %s() pdu_header\n", 1123 CTCM_PR_DBGDATA("%s: pdu_header\n", __func__);
1226 __FUNCTION__); 1124 CTCM_D3_DUMP((char *)pskb->data, PDU_HEADER_LENGTH);
1227 ctcmpc_dumpit((char *)pskb->data, 1125 CTCM_PR_DBGDATA("%s: pskb len: %04x \n",
1228 PDU_HEADER_LENGTH); 1126 __func__, pskb->len);
1229 ctcm_pr_debug("ctcm: %s() pskb len: %04x \n", 1127
1230 __FUNCTION__, pskb->len);
1231 }
1232 skb_pull(pskb, PDU_HEADER_LENGTH); 1128 skb_pull(pskb, PDU_HEADER_LENGTH);
1233 1129
1234 if (curr_pdu->pdu_flag & PDU_LAST) 1130 if (curr_pdu->pdu_flag & PDU_LAST)
@@ -1239,46 +1135,39 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1239 pskb->protocol = htons(ETH_P_SNA_DIX); 1135 pskb->protocol = htons(ETH_P_SNA_DIX);
1240 1136
1241 if ((pskb->len <= 0) || (pskb->len > ch->max_bufsize)) { 1137 if ((pskb->len <= 0) || (pskb->len > ch->max_bufsize)) {
1242 printk(KERN_INFO 1138 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1243 "%s Illegal packet size %d " 1139 "%s(%s): Dropping packet with "
1244 "received " 1140 "illegal siize %d",
1245 "dropping\n", dev->name, 1141 CTCM_FUNTAIL, dev->name, pskb->len);
1246 pskb->len); 1142
1247 priv->stats.rx_dropped++; 1143 priv->stats.rx_dropped++;
1248 priv->stats.rx_length_errors++; 1144 priv->stats.rx_length_errors++;
1249 goto done; 1145 goto done;
1250 } 1146 }
1251 skb_reset_mac_header(pskb); 1147 skb_reset_mac_header(pskb);
1252 new_len = curr_pdu->pdu_offset; 1148 new_len = curr_pdu->pdu_offset;
1253 if (do_debug_data) 1149 CTCM_PR_DBGDATA("%s: new_len: %04x \n",
1254 ctcm_pr_debug("ctcmpc: %s() new_len: %04x \n", 1150 __func__, new_len);
1255 __FUNCTION__, new_len);
1256 if ((new_len == 0) || (new_len > pskb->len)) { 1151 if ((new_len == 0) || (new_len > pskb->len)) {
1257 /* should never happen */ 1152 /* should never happen */
1258 /* pskb len must be hosed...bail out */ 1153 /* pskb len must be hosed...bail out */
1259 printk(KERN_INFO 1154 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1260 "ctcmpc: %s(): invalid pdu" 1155 "%s(%s): non valid pdu_offset: %04x",
1261 " offset of %04x - data may be" 1156 /* "data may be lost", */
1262 "lost\n", __FUNCTION__, new_len); 1157 CTCM_FUNTAIL, dev->name, new_len);
1263 goto done; 1158 goto done;
1264 } 1159 }
1265 skb = __dev_alloc_skb(new_len+4, GFP_ATOMIC); 1160 skb = __dev_alloc_skb(new_len+4, GFP_ATOMIC);
1266 1161
1267 if (!skb) { 1162 if (!skb) {
1268 printk(KERN_INFO 1163 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1269 "ctcm: %s Out of memory in " 1164 "%s(%s): MEMORY allocation error",
1270 "%s()- request-len:%04x \n", 1165 CTCM_FUNTAIL, dev->name);
1271 dev->name,
1272 __FUNCTION__,
1273 new_len+4);
1274 priv->stats.rx_dropped++; 1166 priv->stats.rx_dropped++;
1275 fsm_event(grp->fsm, 1167 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1276 MPCG_EVENT_INOP, dev);
1277 goto done; 1168 goto done;
1278 } 1169 }
1279 1170 memcpy(skb_put(skb, new_len), pskb->data, new_len);
1280 memcpy(skb_put(skb, new_len),
1281 pskb->data, new_len);
1282 1171
1283 skb_reset_mac_header(skb); 1172 skb_reset_mac_header(skb);
1284 skb->dev = pskb->dev; 1173 skb->dev = pskb->dev;
@@ -1287,17 +1176,14 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1287 *((__u32 *) skb_push(skb, 4)) = ch->pdu_seq; 1176 *((__u32 *) skb_push(skb, 4)) = ch->pdu_seq;
1288 ch->pdu_seq++; 1177 ch->pdu_seq++;
1289 1178
1290 if (do_debug_data)
1291 ctcm_pr_debug("%s: ToDCM_pdu_seq= %08x\n",
1292 __FUNCTION__, ch->pdu_seq);
1293
1294 ctcm_pr_debug("ctcm: %s() skb:%0lx "
1295 "skb len: %d \n", __FUNCTION__,
1296 (unsigned long)skb, skb->len);
1297 if (do_debug_data) { 1179 if (do_debug_data) {
1298 ctcm_pr_debug("ctcmpc: %s() up to 32 bytes" 1180 ctcm_pr_debug("%s: ToDCM_pdu_seq= %08x\n",
1299 " of pdu_data sent\n", 1181 __func__, ch->pdu_seq);
1300 __FUNCTION__); 1182 ctcm_pr_debug("%s: skb:%0lx "
1183 "skb len: %d \n", __func__,
1184 (unsigned long)skb, skb->len);
1185 ctcm_pr_debug("%s: up to 32 bytes "
1186 "of pdu_data sent\n", __func__);
1301 ctcmpc_dump32((char *)skb->data, skb->len); 1187 ctcmpc_dump32((char *)skb->data, skb->len);
1302 } 1188 }
1303 1189
@@ -1316,8 +1202,8 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1316 mpcginfo->ch = ch; 1202 mpcginfo->ch = ch;
1317 mpcginfo->th = header; 1203 mpcginfo->th = header;
1318 mpcginfo->skb = pskb; 1204 mpcginfo->skb = pskb;
1319 ctcm_pr_debug("ctcmpc: %s() Not PDU - may be control pkt\n", 1205 CTCM_PR_DEBUG("%s: Not PDU - may be control pkt\n",
1320 __FUNCTION__); 1206 __func__);
1321 /* it's a sweep? */ 1207 /* it's a sweep? */
1322 sweep = (struct th_sweep *)pskb->data; 1208 sweep = (struct th_sweep *)pskb->data;
1323 mpcginfo->sweep = sweep; 1209 mpcginfo->sweep = sweep;
@@ -1333,8 +1219,9 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
1333 } else if (header->th_blk_flag == TH_DISCONTACT) 1219 } else if (header->th_blk_flag == TH_DISCONTACT)
1334 fsm_event(grp->fsm, MPCG_EVENT_DISCONC, mpcginfo); 1220 fsm_event(grp->fsm, MPCG_EVENT_DISCONC, mpcginfo);
1335 else if (header->th_seq_num != 0) { 1221 else if (header->th_seq_num != 0) {
1336 printk(KERN_INFO "%s unexpected packet" 1222 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1337 " expected control pkt\n", dev->name); 1223 "%s(%s): control pkt expected\n",
1224 CTCM_FUNTAIL, dev->name);
1338 priv->stats.rx_dropped++; 1225 priv->stats.rx_dropped++;
1339 /* mpcginfo only used for non-data transfers */ 1226 /* mpcginfo only used for non-data transfers */
1340 kfree(mpcginfo); 1227 kfree(mpcginfo);
@@ -1347,13 +1234,12 @@ done:
1347 dev_kfree_skb_any(pskb); 1234 dev_kfree_skb_any(pskb);
1348 if (sendrc == NET_RX_DROP) { 1235 if (sendrc == NET_RX_DROP) {
1349 printk(KERN_WARNING "%s %s() NETWORK BACKLOG EXCEEDED" 1236 printk(KERN_WARNING "%s %s() NETWORK BACKLOG EXCEEDED"
1350 " - PACKET DROPPED\n", dev->name, __FUNCTION__); 1237 " - PACKET DROPPED\n", dev->name, __func__);
1351 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); 1238 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1352 } 1239 }
1353 1240
1354 if (do_debug) 1241 CTCM_PR_DEBUG("exit %s: %s: ch=0x%p id=%s\n",
1355 ctcm_pr_debug("ctcmpc exit : %s %s(): ch=0x%p id=%s\n", 1242 __func__, dev->name, ch, ch->id);
1356 dev->name, __FUNCTION__, ch, ch->id);
1357} 1243}
1358 1244
1359/** 1245/**
@@ -1366,15 +1252,14 @@ done:
1366 */ 1252 */
1367void ctcmpc_bh(unsigned long thischan) 1253void ctcmpc_bh(unsigned long thischan)
1368{ 1254{
1369 struct channel *ch = (struct channel *)thischan; 1255 struct channel *ch = (struct channel *)thischan;
1370 struct sk_buff *skb; 1256 struct sk_buff *skb;
1371 struct net_device *dev = ch->netdev; 1257 struct net_device *dev = ch->netdev;
1372 struct ctcm_priv *priv = dev->priv; 1258 struct ctcm_priv *priv = dev->priv;
1373 struct mpc_group *grp = priv->mpcg; 1259 struct mpc_group *grp = priv->mpcg;
1374 1260
1375 if (do_debug) 1261 CTCM_PR_DEBUG("%s cp:%i enter: %s() %s\n",
1376 ctcm_pr_debug("%s cp:%i enter: %s() %s\n", 1262 dev->name, smp_processor_id(), __func__, ch->id);
1377 dev->name, smp_processor_id(), __FUNCTION__, ch->id);
1378 /* caller has requested driver to throttle back */ 1263 /* caller has requested driver to throttle back */
1379 while ((fsm_getstate(grp->fsm) != MPCG_STATE_FLOWC) && 1264 while ((fsm_getstate(grp->fsm) != MPCG_STATE_FLOWC) &&
1380 (skb = skb_dequeue(&ch->io_queue))) { 1265 (skb = skb_dequeue(&ch->io_queue))) {
@@ -1390,9 +1275,8 @@ void ctcmpc_bh(unsigned long thischan)
1390 if (skb == skb_peek(&ch->io_queue)) 1275 if (skb == skb_peek(&ch->io_queue))
1391 break; 1276 break;
1392 } 1277 }
1393 if (do_debug) 1278 CTCM_PR_DEBUG("exit %s: %s: ch=0x%p id=%s\n",
1394 ctcm_pr_debug("ctcmpc exit : %s %s(): ch=0x%p id=%s\n", 1279 __func__, dev->name, ch, ch->id);
1395 dev->name, __FUNCTION__, ch, ch->id);
1396 return; 1280 return;
1397} 1281}
1398 1282
@@ -1403,16 +1287,16 @@ struct mpc_group *ctcmpc_init_mpc_group(struct ctcm_priv *priv)
1403{ 1287{
1404 struct mpc_group *grp; 1288 struct mpc_group *grp;
1405 1289
1406 CTCM_DBF_TEXT(MPC_SETUP, 3, __FUNCTION__); 1290 CTCM_DBF_TEXT_(MPC_SETUP, CTC_DBF_INFO,
1291 "Enter %s(%p)", CTCM_FUNTAIL, priv);
1407 1292
1408 grp = kzalloc(sizeof(struct mpc_group), GFP_KERNEL); 1293 grp = kzalloc(sizeof(struct mpc_group), GFP_KERNEL);
1409 if (grp == NULL) 1294 if (grp == NULL)
1410 return NULL; 1295 return NULL;
1411 1296
1412 grp->fsm = 1297 grp->fsm = init_fsm("mpcg", mpcg_state_names, mpcg_event_names,
1413 init_fsm("mpcg", mpcg_state_names, mpcg_event_names, 1298 MPCG_NR_STATES, MPCG_NR_EVENTS, mpcg_fsm,
1414 MPCG_NR_STATES, MPCG_NR_EVENTS, mpcg_fsm, 1299 mpcg_fsm_len, GFP_KERNEL);
1415 mpcg_fsm_len, GFP_KERNEL);
1416 if (grp->fsm == NULL) { 1300 if (grp->fsm == NULL) {
1417 kfree(grp); 1301 kfree(grp);
1418 return NULL; 1302 return NULL;
@@ -1424,7 +1308,6 @@ struct mpc_group *ctcmpc_init_mpc_group(struct ctcm_priv *priv)
1424 grp->xid_skb = 1308 grp->xid_skb =
1425 __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC | GFP_DMA); 1309 __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC | GFP_DMA);
1426 if (grp->xid_skb == NULL) { 1310 if (grp->xid_skb == NULL) {
1427 printk(KERN_INFO "Couldn't alloc MPCgroup xid_skb\n");
1428 kfree_fsm(grp->fsm); 1311 kfree_fsm(grp->fsm);
1429 kfree(grp); 1312 kfree(grp);
1430 return NULL; 1313 return NULL;
@@ -1435,7 +1318,7 @@ struct mpc_group *ctcmpc_init_mpc_group(struct ctcm_priv *priv)
1435 memcpy(skb_put(grp->xid_skb, TH_HEADER_LENGTH), 1318 memcpy(skb_put(grp->xid_skb, TH_HEADER_LENGTH),
1436 &thnorm, TH_HEADER_LENGTH); 1319 &thnorm, TH_HEADER_LENGTH);
1437 1320
1438 grp->xid = (struct xid2 *) skb_tail_pointer(grp->xid_skb); 1321 grp->xid = (struct xid2 *)skb_tail_pointer(grp->xid_skb);
1439 memcpy(skb_put(grp->xid_skb, XID2_LENGTH), &init_xid, XID2_LENGTH); 1322 memcpy(skb_put(grp->xid_skb, XID2_LENGTH), &init_xid, XID2_LENGTH);
1440 grp->xid->xid2_adj_id = jiffies | 0xfff00000; 1323 grp->xid->xid2_adj_id = jiffies | 0xfff00000;
1441 grp->xid->xid2_sender_id = jiffies; 1324 grp->xid->xid2_sender_id = jiffies;
@@ -1446,7 +1329,6 @@ struct mpc_group *ctcmpc_init_mpc_group(struct ctcm_priv *priv)
1446 grp->rcvd_xid_skb = 1329 grp->rcvd_xid_skb =
1447 __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC|GFP_DMA); 1330 __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC|GFP_DMA);
1448 if (grp->rcvd_xid_skb == NULL) { 1331 if (grp->rcvd_xid_skb == NULL) {
1449 printk(KERN_INFO "Couldn't alloc MPCgroup rcvd_xid_skb\n");
1450 kfree_fsm(grp->fsm); 1332 kfree_fsm(grp->fsm);
1451 dev_kfree_skb(grp->xid_skb); 1333 dev_kfree_skb(grp->xid_skb);
1452 kfree(grp); 1334 kfree(grp);
@@ -1492,32 +1374,27 @@ static void mpc_action_go_inop(fsm_instance *fi, int event, void *arg)
1492 int rc = 0; 1374 int rc = 0;
1493 struct channel *wch, *rch; 1375 struct channel *wch, *rch;
1494 1376
1495 if (dev == NULL) { 1377 BUG_ON(dev == NULL);
1496 printk(KERN_INFO "%s() dev=NULL\n", __FUNCTION__); 1378 CTCM_PR_DEBUG("Enter %s: %s\n", __func__, dev->name);
1497 return;
1498 }
1499
1500 ctcm_pr_debug("ctcmpc enter: %s %s()\n", dev->name, __FUNCTION__);
1501 1379
1502 priv = dev->priv; 1380 priv = dev->priv;
1503 grp = priv->mpcg; 1381 grp = priv->mpcg;
1504 grp->flow_off_called = 0; 1382 grp->flow_off_called = 0;
1505
1506 fsm_deltimer(&grp->timer); 1383 fsm_deltimer(&grp->timer);
1507
1508 if (grp->channels_terminating) 1384 if (grp->channels_terminating)
1509 goto done; 1385 return;
1510 1386
1511 grp->channels_terminating = 1; 1387 grp->channels_terminating = 1;
1512
1513 grp->saved_state = fsm_getstate(grp->fsm); 1388 grp->saved_state = fsm_getstate(grp->fsm);
1514 fsm_newstate(grp->fsm, MPCG_STATE_INOP); 1389 fsm_newstate(grp->fsm, MPCG_STATE_INOP);
1515 if (grp->saved_state > MPCG_STATE_XID7INITF) 1390 if (grp->saved_state > MPCG_STATE_XID7INITF)
1516 printk(KERN_NOTICE "%s:MPC GROUP INOPERATIVE\n", dev->name); 1391 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_NOTICE,
1392 "%s(%s): MPC GROUP INOPERATIVE",
1393 CTCM_FUNTAIL, dev->name);
1517 if ((grp->saved_state != MPCG_STATE_RESET) || 1394 if ((grp->saved_state != MPCG_STATE_RESET) ||
1518 /* dealloc_channel has been called */ 1395 /* dealloc_channel has been called */
1519 ((grp->saved_state == MPCG_STATE_RESET) && 1396 ((grp->saved_state == MPCG_STATE_RESET) &&
1520 (grp->port_persist == 0))) 1397 (grp->port_persist == 0)))
1521 fsm_deltimer(&priv->restart_timer); 1398 fsm_deltimer(&priv->restart_timer);
1522 1399
1523 wch = priv->channel[WRITE]; 1400 wch = priv->channel[WRITE];
@@ -1567,29 +1444,24 @@ static void mpc_action_go_inop(fsm_instance *fi, int event, void *arg)
1567 /* This can result in INOP of VTAM PU due to halting of */ 1444 /* This can result in INOP of VTAM PU due to halting of */
1568 /* outstanding IO which causes a sense to be returned */ 1445 /* outstanding IO which causes a sense to be returned */
1569 /* Only about 3 senses are allowed and then IOS/VTAM will*/ 1446 /* Only about 3 senses are allowed and then IOS/VTAM will*/
1570 /* ebcome unreachable without manual intervention */ 1447 /* become unreachable without manual intervention */
1571 if ((grp->port_persist == 1) || (grp->alloc_called)) { 1448 if ((grp->port_persist == 1) || (grp->alloc_called)) {
1572 grp->alloc_called = 0; 1449 grp->alloc_called = 0;
1573 fsm_deltimer(&priv->restart_timer); 1450 fsm_deltimer(&priv->restart_timer);
1574 fsm_addtimer(&priv->restart_timer, 1451 fsm_addtimer(&priv->restart_timer, 500, DEV_EVENT_RESTART, dev);
1575 500,
1576 DEV_EVENT_RESTART,
1577 dev);
1578 fsm_newstate(grp->fsm, MPCG_STATE_RESET); 1452 fsm_newstate(grp->fsm, MPCG_STATE_RESET);
1579 if (grp->saved_state > MPCG_STATE_XID7INITF) 1453 if (grp->saved_state > MPCG_STATE_XID7INITF)
1580 printk(KERN_NOTICE "%s:MPC GROUP RECOVERY SCHEDULED\n", 1454 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ALWAYS,
1581 dev->name); 1455 "%s(%s): MPC GROUP RECOVERY SCHEDULED",
1456 CTCM_FUNTAIL, dev->name);
1582 } else { 1457 } else {
1583 fsm_deltimer(&priv->restart_timer); 1458 fsm_deltimer(&priv->restart_timer);
1584 fsm_addtimer(&priv->restart_timer, 500, DEV_EVENT_STOP, dev); 1459 fsm_addtimer(&priv->restart_timer, 500, DEV_EVENT_STOP, dev);
1585 fsm_newstate(grp->fsm, MPCG_STATE_RESET); 1460 fsm_newstate(grp->fsm, MPCG_STATE_RESET);
1586 printk(KERN_NOTICE "%s:MPC GROUP RECOVERY NOT ATTEMPTED\n", 1461 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_ALWAYS,
1587 dev->name); 1462 "%s(%s): NO MPC GROUP RECOVERY ATTEMPTED",
1463 CTCM_FUNTAIL, dev->name);
1588 } 1464 }
1589
1590done:
1591 ctcm_pr_debug("ctcmpc exit:%s %s()\n", dev->name, __FUNCTION__);
1592 return;
1593} 1465}
1594 1466
1595/** 1467/**
@@ -1609,12 +1481,7 @@ static void mpc_action_timeout(fsm_instance *fi, int event, void *arg)
1609 struct channel *wch; 1481 struct channel *wch;
1610 struct channel *rch; 1482 struct channel *rch;
1611 1483
1612 CTCM_DBF_TEXT(MPC_TRACE, 6, __FUNCTION__); 1484 BUG_ON(dev == NULL);
1613
1614 if (dev == NULL) {
1615 CTCM_DBF_TEXT_(MPC_ERROR, 4, "%s: dev=NULL\n", __FUNCTION__);
1616 return;
1617 }
1618 1485
1619 priv = dev->priv; 1486 priv = dev->priv;
1620 grp = priv->mpcg; 1487 grp = priv->mpcg;
@@ -1633,8 +1500,9 @@ static void mpc_action_timeout(fsm_instance *fi, int event, void *arg)
1633 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev); 1500 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1634 } 1501 }
1635 1502
1636 CTCM_DBF_TEXT_(MPC_TRACE, 6, "%s: dev=%s exit", 1503 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_DEBUG,
1637 __FUNCTION__, dev->name); 1504 "%s: dev=%s exit",
1505 CTCM_FUNTAIL, dev->name);
1638 return; 1506 return;
1639} 1507}
1640 1508
@@ -1646,25 +1514,25 @@ void mpc_action_discontact(fsm_instance *fi, int event, void *arg)
1646{ 1514{
1647 struct mpcg_info *mpcginfo = arg; 1515 struct mpcg_info *mpcginfo = arg;
1648 struct channel *ch = mpcginfo->ch; 1516 struct channel *ch = mpcginfo->ch;
1649 struct net_device *dev = ch->netdev; 1517 struct net_device *dev;
1650 struct ctcm_priv *priv = dev->priv; 1518 struct ctcm_priv *priv;
1651 struct mpc_group *grp = priv->mpcg; 1519 struct mpc_group *grp;
1652 1520
1653 if (ch == NULL) { 1521 if (ch) {
1654 printk(KERN_INFO "%s() ch=NULL\n", __FUNCTION__); 1522 dev = ch->netdev;
1655 return; 1523 if (dev) {
1656 } 1524 priv = dev->priv;
1657 if (ch->netdev == NULL) { 1525 if (priv) {
1658 printk(KERN_INFO "%s() dev=NULL\n", __FUNCTION__); 1526 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_NOTICE,
1659 return; 1527 "%s: %s: %s\n",
1528 CTCM_FUNTAIL, dev->name, ch->id);
1529 grp = priv->mpcg;
1530 grp->send_qllc_disc = 1;
1531 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1532 }
1533 }
1660 } 1534 }
1661 1535
1662 ctcm_pr_debug("ctcmpc enter: %s %s()\n", dev->name, __FUNCTION__);
1663
1664 grp->send_qllc_disc = 1;
1665 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
1666
1667 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev->name, __FUNCTION__);
1668 return; 1536 return;
1669} 1537}
1670 1538
@@ -1675,26 +1543,9 @@ void mpc_action_discontact(fsm_instance *fi, int event, void *arg)
1675 */ 1543 */
1676void mpc_action_send_discontact(unsigned long thischan) 1544void mpc_action_send_discontact(unsigned long thischan)
1677{ 1545{
1678 struct channel *ch; 1546 int rc;
1679 struct net_device *dev; 1547 struct channel *ch = (struct channel *)thischan;
1680 struct ctcm_priv *priv; 1548 unsigned long saveflags = 0;
1681 struct mpc_group *grp;
1682 int rc = 0;
1683 unsigned long saveflags;
1684
1685 ch = (struct channel *)thischan;
1686 dev = ch->netdev;
1687 priv = dev->priv;
1688 grp = priv->mpcg;
1689
1690 ctcm_pr_info("ctcmpc: %s cp:%i enter: %s() GrpState:%s ChState:%s\n",
1691 dev->name,
1692 smp_processor_id(),
1693 __FUNCTION__,
1694 fsm_getstate_str(grp->fsm),
1695 fsm_getstate_str(ch->fsm));
1696 saveflags = 0; /* avoids compiler warning with
1697 spin_unlock_irqrestore */
1698 1549
1699 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); 1550 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
1700 rc = ccw_device_start(ch->cdev, &ch->ccw[15], 1551 rc = ccw_device_start(ch->cdev, &ch->ccw[15],
@@ -1702,16 +1553,9 @@ void mpc_action_send_discontact(unsigned long thischan)
1702 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); 1553 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
1703 1554
1704 if (rc != 0) { 1555 if (rc != 0) {
1705 ctcm_pr_info("ctcmpc: %s() ch:%s IO failed \n", 1556 ctcm_ccw_check_rc(ch, rc, (char *)__func__);
1706 __FUNCTION__,
1707 ch->id);
1708 ctcm_ccw_check_rc(ch, rc, "send discontact");
1709 /* Not checking return code value here */
1710 /* Making best effort to notify partner*/
1711 /* that MPC Group is going down */
1712 } 1557 }
1713 1558
1714 ctcm_pr_debug("ctcmpc exit: %s %s()\n", dev->name, __FUNCTION__);
1715 return; 1559 return;
1716} 1560}
1717 1561
@@ -1723,49 +1567,50 @@ void mpc_action_send_discontact(unsigned long thischan)
1723*/ 1567*/
1724static int mpc_validate_xid(struct mpcg_info *mpcginfo) 1568static int mpc_validate_xid(struct mpcg_info *mpcginfo)
1725{ 1569{
1726 struct channel *ch = mpcginfo->ch; 1570 struct channel *ch = mpcginfo->ch;
1727 struct net_device *dev = ch->netdev; 1571 struct net_device *dev = ch->netdev;
1728 struct ctcm_priv *priv = dev->priv; 1572 struct ctcm_priv *priv = dev->priv;
1729 struct mpc_group *grp = priv->mpcg; 1573 struct mpc_group *grp = priv->mpcg;
1730 struct xid2 *xid = mpcginfo->xid; 1574 struct xid2 *xid = mpcginfo->xid;
1731 int failed = 0; 1575 int rc = 0;
1732 int rc = 0; 1576 __u64 our_id = 0;
1733 __u64 our_id, their_id = 0; 1577 __u64 their_id = 0;
1734 int len; 1578 int len = TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
1735
1736 len = TH_HEADER_LENGTH + PDU_HEADER_LENGTH;
1737 1579
1738 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__); 1580 CTCM_PR_DEBUG("Enter %s: xid=%p\n", __func__, xid);
1739 1581
1740 if (mpcginfo->xid == NULL) { 1582 if (xid == NULL) {
1741 printk(KERN_INFO "%s() xid=NULL\n", __FUNCTION__);
1742 rc = 1; 1583 rc = 1;
1743 goto done; 1584 /* XID REJECTED: xid == NULL */
1585 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1586 "%s(%s): xid = NULL",
1587 CTCM_FUNTAIL, ch->id);
1588 goto done;
1744 } 1589 }
1745 1590
1746 ctcm_pr_debug("ctcmpc : %s xid received()\n", __FUNCTION__); 1591 CTCM_D3_DUMP((char *)xid, XID2_LENGTH);
1747 ctcmpc_dumpit((char *)mpcginfo->xid, XID2_LENGTH);
1748 1592
1749 /*the received direction should be the opposite of ours */ 1593 /*the received direction should be the opposite of ours */
1750 if (((CHANNEL_DIRECTION(ch->flags) == READ) ? XID2_WRITE_SIDE : 1594 if (((CHANNEL_DIRECTION(ch->flags) == READ) ? XID2_WRITE_SIDE :
1751 XID2_READ_SIDE) != xid->xid2_dlc_type) { 1595 XID2_READ_SIDE) != xid->xid2_dlc_type) {
1752 failed = 1; 1596 rc = 2;
1753 printk(KERN_INFO "ctcmpc:%s() XID REJECTED - READ-WRITE CH " 1597 /* XID REJECTED: r/w channel pairing mismatch */
1754 "Pairing Invalid \n", __FUNCTION__); 1598 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1599 "%s(%s): r/w channel pairing mismatch",
1600 CTCM_FUNTAIL, ch->id);
1601 goto done;
1755 } 1602 }
1756 1603
1757 if (xid->xid2_dlc_type == XID2_READ_SIDE) { 1604 if (xid->xid2_dlc_type == XID2_READ_SIDE) {
1758 ctcm_pr_debug("ctcmpc: %s(): grpmaxbuf:%d xid2buflen:%d\n", 1605 CTCM_PR_DEBUG("%s: grpmaxbuf:%d xid2buflen:%d\n", __func__,
1759 __FUNCTION__, grp->group_max_buflen, 1606 grp->group_max_buflen, xid->xid2_buf_len);
1760 xid->xid2_buf_len);
1761 1607
1762 if (grp->group_max_buflen == 0 || 1608 if (grp->group_max_buflen == 0 || grp->group_max_buflen >
1763 grp->group_max_buflen > xid->xid2_buf_len - len) 1609 xid->xid2_buf_len - len)
1764 grp->group_max_buflen = xid->xid2_buf_len - len; 1610 grp->group_max_buflen = xid->xid2_buf_len - len;
1765 } 1611 }
1766 1612
1767 1613 if (grp->saved_xid2 == NULL) {
1768 if (grp->saved_xid2 == NULL) {
1769 grp->saved_xid2 = 1614 grp->saved_xid2 =
1770 (struct xid2 *)skb_tail_pointer(grp->rcvd_xid_skb); 1615 (struct xid2 *)skb_tail_pointer(grp->rcvd_xid_skb);
1771 1616
@@ -1786,49 +1631,54 @@ static int mpc_validate_xid(struct mpcg_info *mpcginfo)
1786 /* lower id assume the xside role */ 1631 /* lower id assume the xside role */
1787 if (our_id < their_id) { 1632 if (our_id < their_id) {
1788 grp->roll = XSIDE; 1633 grp->roll = XSIDE;
1789 ctcm_pr_debug("ctcmpc :%s() WE HAVE LOW ID-" 1634 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_NOTICE,
1790 "TAKE XSIDE\n", __FUNCTION__); 1635 "%s(%s): WE HAVE LOW ID - TAKE XSIDE",
1636 CTCM_FUNTAIL, ch->id);
1791 } else { 1637 } else {
1792 grp->roll = YSIDE; 1638 grp->roll = YSIDE;
1793 ctcm_pr_debug("ctcmpc :%s() WE HAVE HIGH ID-" 1639 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_NOTICE,
1794 "TAKE YSIDE\n", __FUNCTION__); 1640 "%s(%s): WE HAVE HIGH ID - TAKE YSIDE",
1641 CTCM_FUNTAIL, ch->id);
1795 } 1642 }
1796 1643
1797 } else { 1644 } else {
1798 if (xid->xid2_flag4 != grp->saved_xid2->xid2_flag4) { 1645 if (xid->xid2_flag4 != grp->saved_xid2->xid2_flag4) {
1799 failed = 1; 1646 rc = 3;
1800 printk(KERN_INFO "%s XID REJECTED - XID Flag Byte4\n", 1647 /* XID REJECTED: xid flag byte4 mismatch */
1801 __FUNCTION__); 1648 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1649 "%s(%s): xid flag byte4 mismatch",
1650 CTCM_FUNTAIL, ch->id);
1802 } 1651 }
1803 if (xid->xid2_flag2 == 0x40) { 1652 if (xid->xid2_flag2 == 0x40) {
1804 failed = 1; 1653 rc = 4;
1805 printk(KERN_INFO "%s XID REJECTED - XID NOGOOD\n", 1654 /* XID REJECTED - xid NOGOOD */
1806 __FUNCTION__); 1655 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1656 "%s(%s): xid NOGOOD",
1657 CTCM_FUNTAIL, ch->id);
1807 } 1658 }
1808 if (xid->xid2_adj_id != grp->saved_xid2->xid2_adj_id) { 1659 if (xid->xid2_adj_id != grp->saved_xid2->xid2_adj_id) {
1809 failed = 1; 1660 rc = 5;
1810 printk(KERN_INFO "%s XID REJECTED - " 1661 /* XID REJECTED - Adjacent Station ID Mismatch */
1811 "Adjacent Station ID Mismatch\n", 1662 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1812 __FUNCTION__); 1663 "%s(%s): Adjacent Station ID Mismatch",
1664 CTCM_FUNTAIL, ch->id);
1813 } 1665 }
1814 if (xid->xid2_sender_id != grp->saved_xid2->xid2_sender_id) { 1666 if (xid->xid2_sender_id != grp->saved_xid2->xid2_sender_id) {
1815 failed = 1; 1667 rc = 6;
1816 printk(KERN_INFO "%s XID REJECTED - " 1668 /* XID REJECTED - Sender Address Mismatch */
1817 "Sender Address Mismatch\n", __FUNCTION__); 1669 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
1818 1670 "%s(%s): Sender Address Mismatch",
1671 CTCM_FUNTAIL, ch->id);
1819 } 1672 }
1820 } 1673 }
1821 1674
1822 if (failed) { 1675done:
1676 if (rc) {
1823 ctcm_pr_info("ctcmpc : %s() failed\n", __FUNCTION__); 1677 ctcm_pr_info("ctcmpc : %s() failed\n", __FUNCTION__);
1824 priv->xid->xid2_flag2 = 0x40; 1678 priv->xid->xid2_flag2 = 0x40;
1825 grp->saved_xid2->xid2_flag2 = 0x40; 1679 grp->saved_xid2->xid2_flag2 = 0x40;
1826 rc = 1;
1827 } 1680 }
1828 1681
1829done:
1830
1831 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__);
1832 return rc; 1682 return rc;
1833} 1683}
1834 1684
@@ -1839,46 +1689,20 @@ done:
1839static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side) 1689static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
1840{ 1690{
1841 struct channel *ch = arg; 1691 struct channel *ch = arg;
1842 struct ctcm_priv *priv;
1843 struct mpc_group *grp = NULL;
1844 struct net_device *dev = NULL;
1845 int rc = 0; 1692 int rc = 0;
1846 int gotlock = 0; 1693 int gotlock = 0;
1847 unsigned long saveflags = 0; /* avoids compiler warning with 1694 unsigned long saveflags = 0; /* avoids compiler warning with
1848 spin_unlock_irqrestore */ 1695 spin_unlock_irqrestore */
1849
1850 if (ch == NULL) {
1851 printk(KERN_INFO "%s ch=NULL\n", __FUNCTION__);
1852 goto done;
1853 }
1854
1855 if (do_debug)
1856 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
1857 __FUNCTION__, smp_processor_id(), ch, ch->id);
1858
1859 dev = ch->netdev;
1860 if (dev == NULL) {
1861 printk(KERN_INFO "%s dev=NULL\n", __FUNCTION__);
1862 goto done;
1863 }
1864
1865 priv = dev->priv;
1866 if (priv == NULL) {
1867 printk(KERN_INFO "%s priv=NULL\n", __FUNCTION__);
1868 goto done;
1869 }
1870 1696
1871 grp = priv->mpcg; 1697 CTCM_PR_DEBUG("Enter %s: cp=%i ch=0x%p id=%s\n",
1872 if (grp == NULL) { 1698 __func__, smp_processor_id(), ch, ch->id);
1873 printk(KERN_INFO "%s grp=NULL\n", __FUNCTION__);
1874 goto done;
1875 }
1876 1699
1877 if (ctcm_checkalloc_buffer(ch)) 1700 if (ctcm_checkalloc_buffer(ch))
1878 goto done; 1701 goto done;
1879 1702
1880 /* skb data-buffer referencing: */ 1703 /*
1881 1704 * skb data-buffer referencing:
1705 */
1882 ch->trans_skb->data = ch->trans_skb_data; 1706 ch->trans_skb->data = ch->trans_skb_data;
1883 skb_reset_tail_pointer(ch->trans_skb); 1707 skb_reset_tail_pointer(ch->trans_skb);
1884 ch->trans_skb->len = 0; 1708 ch->trans_skb->len = 0;
@@ -1911,22 +1735,22 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
1911 ch->ccw[8].count = 0; 1735 ch->ccw[8].count = 0;
1912 ch->ccw[8].cda = 0x00; 1736 ch->ccw[8].cda = 0x00;
1913 1737
1738 if (!(ch->xid_th && ch->xid && ch->xid_id))
1739 CTCM_DBF_TEXT_(MPC_TRACE, CTC_DBF_INFO,
1740 "%s(%s): xid_th=%p, xid=%p, xid_id=%p",
1741 CTCM_FUNTAIL, ch->id, ch->xid_th, ch->xid, ch->xid_id);
1742
1914 if (side == XSIDE) { 1743 if (side == XSIDE) {
1915 /* mpc_action_xside_xid */ 1744 /* mpc_action_xside_xid */
1916 if (ch->xid_th == NULL) { 1745 if (ch->xid_th == NULL)
1917 printk(KERN_INFO "%s ch->xid_th=NULL\n", __FUNCTION__); 1746 goto done;
1918 goto done;
1919 }
1920 ch->ccw[9].cmd_code = CCW_CMD_WRITE; 1747 ch->ccw[9].cmd_code = CCW_CMD_WRITE;
1921 ch->ccw[9].flags = CCW_FLAG_SLI | CCW_FLAG_CC; 1748 ch->ccw[9].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1922 ch->ccw[9].count = TH_HEADER_LENGTH; 1749 ch->ccw[9].count = TH_HEADER_LENGTH;
1923 ch->ccw[9].cda = virt_to_phys(ch->xid_th); 1750 ch->ccw[9].cda = virt_to_phys(ch->xid_th);
1924 1751
1925 if (ch->xid == NULL) { 1752 if (ch->xid == NULL)
1926 printk(KERN_INFO "%s ch->xid=NULL\n", __FUNCTION__); 1753 goto done;
1927 goto done;
1928 }
1929
1930 ch->ccw[10].cmd_code = CCW_CMD_WRITE; 1754 ch->ccw[10].cmd_code = CCW_CMD_WRITE;
1931 ch->ccw[10].flags = CCW_FLAG_SLI | CCW_FLAG_CC; 1755 ch->ccw[10].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1932 ch->ccw[10].count = XID2_LENGTH; 1756 ch->ccw[10].count = XID2_LENGTH;
@@ -1956,28 +1780,22 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
1956 ch->ccw[10].count = XID2_LENGTH; 1780 ch->ccw[10].count = XID2_LENGTH;
1957 ch->ccw[10].cda = virt_to_phys(ch->rcvd_xid); 1781 ch->ccw[10].cda = virt_to_phys(ch->rcvd_xid);
1958 1782
1959 if (ch->xid_th == NULL) { 1783 if (ch->xid_th == NULL)
1960 printk(KERN_INFO "%s ch->xid_th=NULL\n", __FUNCTION__); 1784 goto done;
1961 goto done;
1962 }
1963 ch->ccw[11].cmd_code = CCW_CMD_WRITE; 1785 ch->ccw[11].cmd_code = CCW_CMD_WRITE;
1964 ch->ccw[11].flags = CCW_FLAG_SLI | CCW_FLAG_CC; 1786 ch->ccw[11].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1965 ch->ccw[11].count = TH_HEADER_LENGTH; 1787 ch->ccw[11].count = TH_HEADER_LENGTH;
1966 ch->ccw[11].cda = virt_to_phys(ch->xid_th); 1788 ch->ccw[11].cda = virt_to_phys(ch->xid_th);
1967 1789
1968 if (ch->xid == NULL) { 1790 if (ch->xid == NULL)
1969 printk(KERN_INFO "%s ch->xid=NULL\n", __FUNCTION__); 1791 goto done;
1970 goto done;
1971 }
1972 ch->ccw[12].cmd_code = CCW_CMD_WRITE; 1792 ch->ccw[12].cmd_code = CCW_CMD_WRITE;
1973 ch->ccw[12].flags = CCW_FLAG_SLI | CCW_FLAG_CC; 1793 ch->ccw[12].flags = CCW_FLAG_SLI | CCW_FLAG_CC;
1974 ch->ccw[12].count = XID2_LENGTH; 1794 ch->ccw[12].count = XID2_LENGTH;
1975 ch->ccw[12].cda = virt_to_phys(ch->xid); 1795 ch->ccw[12].cda = virt_to_phys(ch->xid);
1976 1796
1977 if (ch->xid_id == NULL) { 1797 if (ch->xid_id == NULL)
1978 printk(KERN_INFO "%s ch->xid_id=NULL\n", __FUNCTION__); 1798 goto done;
1979 goto done;
1980 }
1981 ch->ccw[13].cmd_code = CCW_CMD_WRITE; 1799 ch->ccw[13].cmd_code = CCW_CMD_WRITE;
1982 ch->ccw[13].cda = virt_to_phys(ch->xid_id); 1800 ch->ccw[13].cda = virt_to_phys(ch->xid_id);
1983 1801
@@ -1990,12 +1808,11 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
1990 ch->ccw[14].count = 0; 1808 ch->ccw[14].count = 0;
1991 ch->ccw[14].cda = 0; 1809 ch->ccw[14].cda = 0;
1992 1810
1993 if (do_debug_ccw) 1811 CTCM_CCW_DUMP((char *)&ch->ccw[8], sizeof(struct ccw1) * 7);
1994 ctcmpc_dumpit((char *)&ch->ccw[8], sizeof(struct ccw1) * 7); 1812 CTCM_D3_DUMP((char *)ch->xid_th, TH_HEADER_LENGTH);
1813 CTCM_D3_DUMP((char *)ch->xid, XID2_LENGTH);
1814 CTCM_D3_DUMP((char *)ch->xid_id, 4);
1995 1815
1996 ctcmpc_dumpit((char *)ch->xid_th, TH_HEADER_LENGTH);
1997 ctcmpc_dumpit((char *)ch->xid, XID2_LENGTH);
1998 ctcmpc_dumpit((char *)ch->xid_id, 4);
1999 if (!in_irq()) { 1816 if (!in_irq()) {
2000 /* Such conditional locking is a known problem for 1817 /* Such conditional locking is a known problem for
2001 * sparse because its static undeterministic. 1818 * sparse because its static undeterministic.
@@ -2012,16 +1829,13 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
2012 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); 1829 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
2013 1830
2014 if (rc != 0) { 1831 if (rc != 0) {
2015 ctcm_pr_info("ctcmpc: %s() ch:%s IO failed \n",
2016 __FUNCTION__, ch->id);
2017 ctcm_ccw_check_rc(ch, rc, 1832 ctcm_ccw_check_rc(ch, rc,
2018 (side == XSIDE) ? "x-side XID" : "y-side XID"); 1833 (side == XSIDE) ? "x-side XID" : "y-side XID");
2019 } 1834 }
2020 1835
2021done: 1836done:
2022 if (do_debug) 1837 CTCM_PR_DEBUG("Exit %s: ch=0x%p id=%s\n",
2023 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n", 1838 __func__, ch, ch->id);
2024 __FUNCTION__, ch, ch->id);
2025 return; 1839 return;
2026 1840
2027} 1841}
@@ -2050,41 +1864,19 @@ static void mpc_action_yside_xid(fsm_instance *fsm, int event, void *arg)
2050 */ 1864 */
2051static void mpc_action_doxid0(fsm_instance *fsm, int event, void *arg) 1865static void mpc_action_doxid0(fsm_instance *fsm, int event, void *arg)
2052{ 1866{
2053 struct channel *ch = arg; 1867 struct channel *ch = arg;
2054 struct ctcm_priv *priv; 1868 struct net_device *dev = ch->netdev;
2055 struct mpc_group *grp = NULL; 1869 struct ctcm_priv *priv = dev->priv;
2056 struct net_device *dev = NULL; 1870 struct mpc_group *grp = priv->mpcg;
2057
2058 if (do_debug)
2059 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
2060 __FUNCTION__, smp_processor_id(), ch, ch->id);
2061
2062 if (ch == NULL) {
2063 printk(KERN_WARNING "%s ch=NULL\n", __FUNCTION__);
2064 goto done;
2065 }
2066
2067 dev = ch->netdev;
2068 if (dev == NULL) {
2069 printk(KERN_WARNING "%s dev=NULL\n", __FUNCTION__);
2070 goto done;
2071 }
2072
2073 priv = dev->priv;
2074 if (priv == NULL) {
2075 printk(KERN_WARNING "%s priv=NULL\n", __FUNCTION__);
2076 goto done;
2077 }
2078 1871
2079 grp = priv->mpcg; 1872 CTCM_PR_DEBUG("Enter %s: cp=%i ch=0x%p id=%s\n",
2080 if (grp == NULL) { 1873 __func__, smp_processor_id(), ch, ch->id);
2081 printk(KERN_WARNING "%s grp=NULL\n", __FUNCTION__);
2082 goto done;
2083 }
2084 1874
2085 if (ch->xid == NULL) { 1875 if (ch->xid == NULL) {
2086 printk(KERN_WARNING "%s ch-xid=NULL\n", __FUNCTION__); 1876 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
2087 goto done; 1877 "%s(%s): ch->xid == NULL",
1878 CTCM_FUNTAIL, dev->name);
1879 return;
2088 } 1880 }
2089 1881
2090 fsm_newstate(ch->fsm, CH_XID0_INPROGRESS); 1882 fsm_newstate(ch->fsm, CH_XID0_INPROGRESS);
@@ -2104,12 +1896,7 @@ static void mpc_action_doxid0(fsm_instance *fsm, int event, void *arg)
2104 1896
2105 fsm_event(grp->fsm, MPCG_EVENT_DOIO, ch); 1897 fsm_event(grp->fsm, MPCG_EVENT_DOIO, ch);
2106 1898
2107done:
2108 if (do_debug)
2109 ctcm_pr_debug("ctcmpc exit : %s(): ch=0x%p id=%s\n",
2110 __FUNCTION__, ch, ch->id);
2111 return; 1899 return;
2112
2113} 1900}
2114 1901
2115/* 1902/*
@@ -2119,32 +1906,16 @@ done:
2119static void mpc_action_doxid7(fsm_instance *fsm, int event, void *arg) 1906static void mpc_action_doxid7(fsm_instance *fsm, int event, void *arg)
2120{ 1907{
2121 struct net_device *dev = arg; 1908 struct net_device *dev = arg;
2122 struct ctcm_priv *priv = NULL; 1909 struct ctcm_priv *priv = dev->priv;
2123 struct mpc_group *grp = NULL; 1910 struct mpc_group *grp = NULL;
2124 int direction; 1911 int direction;
2125 int rc = 0;
2126 int send = 0; 1912 int send = 0;
2127 1913
2128 ctcm_pr_debug("ctcmpc enter: %s() \n", __FUNCTION__); 1914 if (priv)
2129 1915 grp = priv->mpcg;
2130 if (dev == NULL) {
2131 printk(KERN_INFO "%s dev=NULL \n", __FUNCTION__);
2132 rc = 1;
2133 goto done;
2134 }
2135
2136 priv = dev->priv;
2137 if (priv == NULL) {
2138 printk(KERN_INFO "%s priv=NULL \n", __FUNCTION__);
2139 rc = 1;
2140 goto done;
2141 }
2142
2143 grp = priv->mpcg;
2144 if (grp == NULL) { 1916 if (grp == NULL) {
2145 printk(KERN_INFO "%s grp=NULL \n", __FUNCTION__); 1917 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
2146 rc = 1; 1918 return;
2147 goto done;
2148 } 1919 }
2149 1920
2150 for (direction = READ; direction <= WRITE; direction++) { 1921 for (direction = READ; direction <= WRITE; direction++) {
@@ -2199,11 +1970,6 @@ static void mpc_action_doxid7(fsm_instance *fsm, int event, void *arg)
2199 fsm_event(grp->fsm, MPCG_EVENT_DOIO, ch); 1970 fsm_event(grp->fsm, MPCG_EVENT_DOIO, ch);
2200 } 1971 }
2201 1972
2202done:
2203
2204 if (rc != 0)
2205 fsm_event(grp->fsm, MPCG_EVENT_INOP, dev);
2206
2207 return; 1973 return;
2208} 1974}
2209 1975
@@ -2214,24 +1980,15 @@ done:
2214static void mpc_action_rcvd_xid0(fsm_instance *fsm, int event, void *arg) 1980static void mpc_action_rcvd_xid0(fsm_instance *fsm, int event, void *arg)
2215{ 1981{
2216 1982
2217 struct mpcg_info *mpcginfo = arg; 1983 struct mpcg_info *mpcginfo = arg;
2218 struct channel *ch = mpcginfo->ch; 1984 struct channel *ch = mpcginfo->ch;
2219 struct net_device *dev = ch->netdev; 1985 struct net_device *dev = ch->netdev;
2220 struct ctcm_priv *priv; 1986 struct ctcm_priv *priv = dev->priv;
2221 struct mpc_group *grp; 1987 struct mpc_group *grp = priv->mpcg;
2222
2223 if (do_debug)
2224 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n",
2225 __FUNCTION__, smp_processor_id(), ch, ch->id);
2226
2227 priv = dev->priv;
2228 grp = priv->mpcg;
2229 1988
2230 ctcm_pr_debug("ctcmpc in:%s() %s xid2:%i xid7:%i xidt_p2:%i \n", 1989 CTCM_PR_DEBUG("%s: ch-id:%s xid2:%i xid7:%i xidt_p2:%i \n",
2231 __FUNCTION__, ch->id, 1990 __func__, ch->id, grp->outstanding_xid2,
2232 grp->outstanding_xid2, 1991 grp->outstanding_xid7, grp->outstanding_xid7_p2);
2233 grp->outstanding_xid7,
2234 grp->outstanding_xid7_p2);
2235 1992
2236 if (fsm_getstate(ch->fsm) < CH_XID7_PENDING) 1993 if (fsm_getstate(ch->fsm) < CH_XID7_PENDING)
2237 fsm_newstate(ch->fsm, CH_XID7_PENDING); 1994 fsm_newstate(ch->fsm, CH_XID7_PENDING);
@@ -2268,17 +2025,12 @@ static void mpc_action_rcvd_xid0(fsm_instance *fsm, int event, void *arg)
2268 } 2025 }
2269 kfree(mpcginfo); 2026 kfree(mpcginfo);
2270 2027
2271 if (do_debug) { 2028 CTCM_PR_DEBUG("ctcmpc:%s() %s xid2:%i xid7:%i xidt_p2:%i \n",
2272 ctcm_pr_debug("ctcmpc:%s() %s xid2:%i xid7:%i xidt_p2:%i \n", 2029 __func__, ch->id, grp->outstanding_xid2,
2273 __FUNCTION__, ch->id, 2030 grp->outstanding_xid7, grp->outstanding_xid7_p2);
2274 grp->outstanding_xid2, 2031 CTCM_PR_DEBUG("ctcmpc:%s() %s grpstate: %s chanstate: %s \n",
2275 grp->outstanding_xid7, 2032 __func__, ch->id,
2276 grp->outstanding_xid7_p2); 2033 fsm_getstate_str(grp->fsm), fsm_getstate_str(ch->fsm));
2277 ctcm_pr_debug("ctcmpc:%s() %s grpstate: %s chanstate: %s \n",
2278 __FUNCTION__, ch->id,
2279 fsm_getstate_str(grp->fsm),
2280 fsm_getstate_str(ch->fsm));
2281 }
2282 return; 2034 return;
2283 2035
2284} 2036}
@@ -2296,15 +2048,10 @@ static void mpc_action_rcvd_xid7(fsm_instance *fsm, int event, void *arg)
2296 struct ctcm_priv *priv = dev->priv; 2048 struct ctcm_priv *priv = dev->priv;
2297 struct mpc_group *grp = priv->mpcg; 2049 struct mpc_group *grp = priv->mpcg;
2298 2050
2299 if (do_debug) { 2051 CTCM_PR_DEBUG("Enter %s: cp=%i ch=0x%p id=%s\n",
2300 ctcm_pr_debug("ctcmpc enter: %s(): cp=%i ch=0x%p id=%s\n", 2052 __func__, smp_processor_id(), ch, ch->id);
2301 __FUNCTION__, smp_processor_id(), ch, ch->id); 2053 CTCM_PR_DEBUG("%s: outstanding_xid7: %i, outstanding_xid7_p2: %i\n",
2302 2054 __func__, grp->outstanding_xid7, grp->outstanding_xid7_p2);
2303 ctcm_pr_debug("ctcmpc: outstanding_xid7: %i, "
2304 " outstanding_xid7_p2: %i\n",
2305 grp->outstanding_xid7,
2306 grp->outstanding_xid7_p2);
2307 }
2308 2055
2309 grp->outstanding_xid7--; 2056 grp->outstanding_xid7--;
2310 ch->xid_skb->data = ch->xid_skb_data; 2057 ch->xid_skb->data = ch->xid_skb_data;
@@ -2337,14 +2084,8 @@ static void mpc_action_rcvd_xid7(fsm_instance *fsm, int event, void *arg)
2337 mpc_validate_xid(mpcginfo); 2084 mpc_validate_xid(mpcginfo);
2338 break; 2085 break;
2339 } 2086 }
2340
2341 kfree(mpcginfo); 2087 kfree(mpcginfo);
2342
2343 if (do_debug)
2344 ctcm_pr_debug("ctcmpc exit: %s(): cp=%i ch=0x%p id=%s\n",
2345 __FUNCTION__, smp_processor_id(), ch, ch->id);
2346 return; 2088 return;
2347
2348} 2089}
2349 2090
2350/* 2091/*
@@ -2353,36 +2094,14 @@ static void mpc_action_rcvd_xid7(fsm_instance *fsm, int event, void *arg)
2353 */ 2094 */
2354static int mpc_send_qllc_discontact(struct net_device *dev) 2095static int mpc_send_qllc_discontact(struct net_device *dev)
2355{ 2096{
2356 int rc = 0;
2357 __u32 new_len = 0; 2097 __u32 new_len = 0;
2358 struct sk_buff *skb; 2098 struct sk_buff *skb;
2359 struct qllc *qllcptr; 2099 struct qllc *qllcptr;
2360 struct ctcm_priv *priv; 2100 struct ctcm_priv *priv = dev->priv;
2361 struct mpc_group *grp; 2101 struct mpc_group *grp = priv->mpcg;
2362
2363 ctcm_pr_debug("ctcmpc enter: %s()\n", __FUNCTION__);
2364
2365 if (dev == NULL) {
2366 printk(KERN_INFO "%s() dev=NULL\n", __FUNCTION__);
2367 rc = 1;
2368 goto done;
2369 }
2370
2371 priv = dev->priv;
2372 if (priv == NULL) {
2373 printk(KERN_INFO "%s() priv=NULL\n", __FUNCTION__);
2374 rc = 1;
2375 goto done;
2376 }
2377 2102
2378 grp = priv->mpcg; 2103 CTCM_PR_DEBUG("%s: GROUP STATE: %s\n",
2379 if (grp == NULL) { 2104 __func__, mpcg_state_names[grp->saved_state]);
2380 printk(KERN_INFO "%s() grp=NULL\n", __FUNCTION__);
2381 rc = 1;
2382 goto done;
2383 }
2384 ctcm_pr_info("ctcmpc: %s() GROUP STATE: %s\n", __FUNCTION__,
2385 mpcg_state_names[grp->saved_state]);
2386 2105
2387 switch (grp->saved_state) { 2106 switch (grp->saved_state) {
2388 /* 2107 /*
@@ -2408,11 +2127,10 @@ static int mpc_send_qllc_discontact(struct net_device *dev)
2408 new_len = sizeof(struct qllc); 2127 new_len = sizeof(struct qllc);
2409 qllcptr = kzalloc(new_len, gfp_type() | GFP_DMA); 2128 qllcptr = kzalloc(new_len, gfp_type() | GFP_DMA);
2410 if (qllcptr == NULL) { 2129 if (qllcptr == NULL) {
2411 printk(KERN_INFO 2130 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
2412 "ctcmpc: Out of memory in %s()\n", 2131 "%s(%s): qllcptr allocation error",
2413 dev->name); 2132 CTCM_FUNTAIL, dev->name);
2414 rc = 1; 2133 return -ENOMEM;
2415 goto done;
2416 } 2134 }
2417 2135
2418 qllcptr->qllc_address = 0xcc; 2136 qllcptr->qllc_address = 0xcc;
@@ -2421,31 +2139,29 @@ static int mpc_send_qllc_discontact(struct net_device *dev)
2421 skb = __dev_alloc_skb(new_len, GFP_ATOMIC); 2139 skb = __dev_alloc_skb(new_len, GFP_ATOMIC);
2422 2140
2423 if (skb == NULL) { 2141 if (skb == NULL) {
2424 printk(KERN_INFO "%s Out of memory in mpc_send_qllc\n", 2142 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
2425 dev->name); 2143 "%s(%s): skb allocation error",
2144 CTCM_FUNTAIL, dev->name);
2426 priv->stats.rx_dropped++; 2145 priv->stats.rx_dropped++;
2427 rc = 1;
2428 kfree(qllcptr); 2146 kfree(qllcptr);
2429 goto done; 2147 return -ENOMEM;
2430 } 2148 }
2431 2149
2432 memcpy(skb_put(skb, new_len), qllcptr, new_len); 2150 memcpy(skb_put(skb, new_len), qllcptr, new_len);
2433 kfree(qllcptr); 2151 kfree(qllcptr);
2434 2152
2435 if (skb_headroom(skb) < 4) { 2153 if (skb_headroom(skb) < 4) {
2436 printk(KERN_INFO "ctcmpc: %s() Unable to" 2154 CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
2437 " build discontact for %s\n", 2155 "%s(%s): skb_headroom error",
2438 __FUNCTION__, dev->name); 2156 CTCM_FUNTAIL, dev->name);
2439 rc = 1;
2440 dev_kfree_skb_any(skb); 2157 dev_kfree_skb_any(skb);
2441 goto done; 2158 return -ENOMEM;
2442 } 2159 }
2443 2160
2444 *((__u32 *)skb_push(skb, 4)) = priv->channel[READ]->pdu_seq; 2161 *((__u32 *)skb_push(skb, 4)) = priv->channel[READ]->pdu_seq;
2445 priv->channel[READ]->pdu_seq++; 2162 priv->channel[READ]->pdu_seq++;
2446 if (do_debug_data) 2163 CTCM_PR_DBGDATA("ctcmpc: %s ToDCM_pdu_seq= %08x\n",
2447 ctcm_pr_debug("ctcmpc: %s ToDCM_pdu_seq= %08x\n", 2164 __func__, priv->channel[READ]->pdu_seq);
2448 __FUNCTION__, priv->channel[READ]->pdu_seq);
2449 2165
2450 /* receipt of CC03 resets anticipated sequence number on 2166 /* receipt of CC03 resets anticipated sequence number on
2451 receiving side */ 2167 receiving side */
@@ -2455,7 +2171,7 @@ static int mpc_send_qllc_discontact(struct net_device *dev)
2455 skb->protocol = htons(ETH_P_SNAP); 2171 skb->protocol = htons(ETH_P_SNAP);
2456 skb->ip_summed = CHECKSUM_UNNECESSARY; 2172 skb->ip_summed = CHECKSUM_UNNECESSARY;
2457 2173
2458 ctcmpc_dumpit((char *)skb->data, (sizeof(struct qllc) + 4)); 2174 CTCM_D3_DUMP(skb->data, (sizeof(struct qllc) + 4));
2459 2175
2460 netif_rx(skb); 2176 netif_rx(skb);
2461 break; 2177 break;
@@ -2464,9 +2180,7 @@ static int mpc_send_qllc_discontact(struct net_device *dev)
2464 2180
2465 } 2181 }
2466 2182
2467done: 2183 return 0;
2468 ctcm_pr_debug("ctcmpc exit: %s()\n", __FUNCTION__);
2469 return rc;
2470} 2184}
2471/* --- This is the END my friend --- */ 2185/* --- This is the END my friend --- */
2472 2186
diff --git a/drivers/s390/net/ctcm_mpc.h b/drivers/s390/net/ctcm_mpc.h
index f99686069a91..5336120cddf1 100644
--- a/drivers/s390/net/ctcm_mpc.h
+++ b/drivers/s390/net/ctcm_mpc.h
@@ -231,7 +231,7 @@ static inline void ctcmpc_dump32(char *buf, int len)
231int ctcmpc_open(struct net_device *); 231int ctcmpc_open(struct net_device *);
232void ctcm_ccw_check_rc(struct channel *, int, char *); 232void ctcm_ccw_check_rc(struct channel *, int, char *);
233void mpc_group_ready(unsigned long adev); 233void mpc_group_ready(unsigned long adev);
234int mpc_channel_action(struct channel *ch, int direction, int action); 234void mpc_channel_action(struct channel *ch, int direction, int action);
235void mpc_action_send_discontact(unsigned long thischan); 235void mpc_action_send_discontact(unsigned long thischan);
236void mpc_action_discontact(fsm_instance *fi, int event, void *arg); 236void mpc_action_discontact(fsm_instance *fi, int event, void *arg);
237void ctcmpc_bh(unsigned long thischan); 237void ctcmpc_bh(unsigned long thischan);
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index b29afef5c7fb..38de31b55708 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -2651,7 +2651,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
2651 tag = (u16 *)(new_skb->data + 12); 2651 tag = (u16 *)(new_skb->data + 12);
2652 *tag = __constant_htons(ETH_P_8021Q); 2652 *tag = __constant_htons(ETH_P_8021Q);
2653 *(tag + 1) = htons(vlan_tx_tag_get(new_skb)); 2653 *(tag + 1) = htons(vlan_tx_tag_get(new_skb));
2654 VLAN_TX_SKB_CB(new_skb)->magic = 0; 2654 new_skb->vlan_tci = 0;
2655 } 2655 }
2656 } 2656 }
2657 2657
diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c
index 513ba61ae966..777637594acd 100644
--- a/drivers/sbus/char/uctrl.c
+++ b/drivers/sbus/char/uctrl.c
@@ -195,8 +195,8 @@ struct uctrl_driver {
195 195
196static struct uctrl_driver drv; 196static struct uctrl_driver drv;
197 197
198void uctrl_get_event_status(void); 198static void uctrl_get_event_status(void);
199void uctrl_get_external_status(void); 199static void uctrl_get_external_status(void);
200 200
201static int 201static int
202uctrl_ioctl(struct inode *inode, struct file *file, 202uctrl_ioctl(struct inode *inode, struct file *file,
@@ -266,12 +266,6 @@ static struct miscdevice uctrl_dev = {
266 driver->regs->uctrl_stat = UCTRL_STAT_RXNE_STA; \ 266 driver->regs->uctrl_stat = UCTRL_STAT_RXNE_STA; \
267} 267}
268 268
269void uctrl_set_video(int status)
270{
271 struct uctrl_driver *driver = &drv;
272
273}
274
275static void uctrl_do_txn(struct uctrl_txn *txn) 269static void uctrl_do_txn(struct uctrl_txn *txn)
276{ 270{
277 struct uctrl_driver *driver = &drv; 271 struct uctrl_driver *driver = &drv;
@@ -311,7 +305,7 @@ static void uctrl_do_txn(struct uctrl_txn *txn)
311 } 305 }
312} 306}
313 307
314void uctrl_get_event_status(void) 308static void uctrl_get_event_status(void)
315{ 309{
316 struct uctrl_driver *driver = &drv; 310 struct uctrl_driver *driver = &drv;
317 struct uctrl_txn txn; 311 struct uctrl_txn txn;
@@ -331,7 +325,7 @@ void uctrl_get_event_status(void)
331 dprintk(("ev is %x\n", driver->status.event_status)); 325 dprintk(("ev is %x\n", driver->status.event_status));
332} 326}
333 327
334void uctrl_get_external_status(void) 328static void uctrl_get_external_status(void)
335{ 329{
336 struct uctrl_driver *driver = &drv; 330 struct uctrl_driver *driver = &drv;
337 struct uctrl_txn txn; 331 struct uctrl_txn txn;
@@ -363,7 +357,7 @@ void uctrl_get_external_status(void)
363static int __init ts102_uctrl_init(void) 357static int __init ts102_uctrl_init(void)
364{ 358{
365 struct uctrl_driver *driver = &drv; 359 struct uctrl_driver *driver = &drv;
366 int len, i; 360 int len;
367 struct linux_prom_irqs tmp_irq[2]; 361 struct linux_prom_irqs tmp_irq[2];
368 unsigned int vaddr[2] = { 0, 0 }; 362 unsigned int vaddr[2] = { 0, 0 };
369 int tmpnode, uctrlnode = prom_getchild(prom_root_node); 363 int tmpnode, uctrlnode = prom_getchild(prom_root_node);
diff --git a/drivers/sbus/char/vfc.h b/drivers/sbus/char/vfc.h
index f1aa1389ea4a..a5240c52aa0b 100644
--- a/drivers/sbus/char/vfc.h
+++ b/drivers/sbus/char/vfc.h
@@ -133,8 +133,6 @@ struct vfc_dev {
133 unsigned char saa9051_state_array[VFC_SAA9051_NR]; 133 unsigned char saa9051_state_array[VFC_SAA9051_NR];
134}; 134};
135 135
136extern struct vfc_dev **vfc_dev_lst;
137
138void captstat_reset(struct vfc_dev *); 136void captstat_reset(struct vfc_dev *);
139void memptr_reset(struct vfc_dev *); 137void memptr_reset(struct vfc_dev *);
140 138
@@ -145,8 +143,6 @@ int vfc_i2c_sendbuf(struct vfc_dev *, unsigned char, char *, int) ;
145int vfc_i2c_recvbuf(struct vfc_dev *, unsigned char, char *, int) ; 143int vfc_i2c_recvbuf(struct vfc_dev *, unsigned char, char *, int) ;
146int vfc_i2c_reset_bus(struct vfc_dev *); 144int vfc_i2c_reset_bus(struct vfc_dev *);
147int vfc_init_i2c_bus(struct vfc_dev *); 145int vfc_init_i2c_bus(struct vfc_dev *);
148void vfc_lock_device(struct vfc_dev *);
149void vfc_unlock_device(struct vfc_dev *);
150 146
151#define VFC_CONTROL_DIAGMODE 0x10000000 147#define VFC_CONTROL_DIAGMODE 0x10000000
152#define VFC_CONTROL_MEMPTR 0x20000000 148#define VFC_CONTROL_MEMPTR 0x20000000
diff --git a/drivers/sbus/char/vfc_dev.c b/drivers/sbus/char/vfc_dev.c
index 1f6cb8ae2784..25181bb7d627 100644
--- a/drivers/sbus/char/vfc_dev.c
+++ b/drivers/sbus/char/vfc_dev.c
@@ -45,7 +45,7 @@
45#include <asm/vfc_ioctls.h> 45#include <asm/vfc_ioctls.h>
46 46
47static const struct file_operations vfc_fops; 47static const struct file_operations vfc_fops;
48struct vfc_dev **vfc_dev_lst; 48static struct vfc_dev **vfc_dev_lst;
49static char vfcstr[]="vfc"; 49static char vfcstr[]="vfc";
50static unsigned char saa9051_init_array[VFC_SAA9051_NR] = { 50static unsigned char saa9051_init_array[VFC_SAA9051_NR] = {
51 0x00, 0x64, 0x72, 0x52, 51 0x00, 0x64, 0x72, 0x52,
@@ -54,18 +54,18 @@ static unsigned char saa9051_init_array[VFC_SAA9051_NR] = {
54 0x3e 54 0x3e
55}; 55};
56 56
57void vfc_lock_device(struct vfc_dev *dev) 57static void vfc_lock_device(struct vfc_dev *dev)
58{ 58{
59 mutex_lock(&dev->device_lock_mtx); 59 mutex_lock(&dev->device_lock_mtx);
60} 60}
61 61
62void vfc_unlock_device(struct vfc_dev *dev) 62static void vfc_unlock_device(struct vfc_dev *dev)
63{ 63{
64 mutex_unlock(&dev->device_lock_mtx); 64 mutex_unlock(&dev->device_lock_mtx);
65} 65}
66 66
67 67
68void vfc_captstat_reset(struct vfc_dev *dev) 68static void vfc_captstat_reset(struct vfc_dev *dev)
69{ 69{
70 dev->control_reg |= VFC_CONTROL_CAPTRESET; 70 dev->control_reg |= VFC_CONTROL_CAPTRESET;
71 sbus_writel(dev->control_reg, &dev->regs->control); 71 sbus_writel(dev->control_reg, &dev->regs->control);
@@ -75,7 +75,7 @@ void vfc_captstat_reset(struct vfc_dev *dev)
75 sbus_writel(dev->control_reg, &dev->regs->control); 75 sbus_writel(dev->control_reg, &dev->regs->control);
76} 76}
77 77
78void vfc_memptr_reset(struct vfc_dev *dev) 78static void vfc_memptr_reset(struct vfc_dev *dev)
79{ 79{
80 dev->control_reg |= VFC_CONTROL_MEMPTR; 80 dev->control_reg |= VFC_CONTROL_MEMPTR;
81 sbus_writel(dev->control_reg, &dev->regs->control); 81 sbus_writel(dev->control_reg, &dev->regs->control);
@@ -85,7 +85,7 @@ void vfc_memptr_reset(struct vfc_dev *dev)
85 sbus_writel(dev->control_reg, &dev->regs->control); 85 sbus_writel(dev->control_reg, &dev->regs->control);
86} 86}
87 87
88int vfc_csr_init(struct vfc_dev *dev) 88static int vfc_csr_init(struct vfc_dev *dev)
89{ 89{
90 dev->control_reg = 0x80000000; 90 dev->control_reg = 0x80000000;
91 sbus_writel(dev->control_reg, &dev->regs->control); 91 sbus_writel(dev->control_reg, &dev->regs->control);
@@ -107,7 +107,7 @@ int vfc_csr_init(struct vfc_dev *dev)
107 return 0; 107 return 0;
108} 108}
109 109
110int vfc_saa9051_init(struct vfc_dev *dev) 110static int vfc_saa9051_init(struct vfc_dev *dev)
111{ 111{
112 int i; 112 int i;
113 113
@@ -119,7 +119,7 @@ int vfc_saa9051_init(struct vfc_dev *dev)
119 return 0; 119 return 0;
120} 120}
121 121
122int init_vfc_hw(struct vfc_dev *dev) 122static int init_vfc_hw(struct vfc_dev *dev)
123{ 123{
124 vfc_lock_device(dev); 124 vfc_lock_device(dev);
125 vfc_csr_init(dev); 125 vfc_csr_init(dev);
@@ -132,7 +132,7 @@ int init_vfc_hw(struct vfc_dev *dev)
132 return 0; 132 return 0;
133} 133}
134 134
135int init_vfc_devstruct(struct vfc_dev *dev, int instance) 135static int init_vfc_devstruct(struct vfc_dev *dev, int instance)
136{ 136{
137 dev->instance=instance; 137 dev->instance=instance;
138 mutex_init(&dev->device_lock_mtx); 138 mutex_init(&dev->device_lock_mtx);
@@ -141,7 +141,8 @@ int init_vfc_devstruct(struct vfc_dev *dev, int instance)
141 return 0; 141 return 0;
142} 142}
143 143
144int init_vfc_device(struct sbus_dev *sdev,struct vfc_dev *dev, int instance) 144static int init_vfc_device(struct sbus_dev *sdev,struct vfc_dev *dev,
145 int instance)
145{ 146{
146 if(dev == NULL) { 147 if(dev == NULL) {
147 printk(KERN_ERR "VFC: Bogus pointer passed\n"); 148 printk(KERN_ERR "VFC: Bogus pointer passed\n");
@@ -168,7 +169,7 @@ int init_vfc_device(struct sbus_dev *sdev,struct vfc_dev *dev, int instance)
168} 169}
169 170
170 171
171struct vfc_dev *vfc_get_dev_ptr(int instance) 172static struct vfc_dev *vfc_get_dev_ptr(int instance)
172{ 173{
173 return vfc_dev_lst[instance]; 174 return vfc_dev_lst[instance];
174} 175}
@@ -292,7 +293,7 @@ static int vfc_debug(struct vfc_dev *dev, int cmd, void __user *argp)
292 return 0; 293 return 0;
293} 294}
294 295
295int vfc_capture_start(struct vfc_dev *dev) 296static int vfc_capture_start(struct vfc_dev *dev)
296{ 297{
297 vfc_captstat_reset(dev); 298 vfc_captstat_reset(dev);
298 dev->control_reg = sbus_readl(&dev->regs->control); 299 dev->control_reg = sbus_readl(&dev->regs->control);
@@ -314,7 +315,7 @@ int vfc_capture_start(struct vfc_dev *dev)
314 return 0; 315 return 0;
315} 316}
316 317
317int vfc_capture_poll(struct vfc_dev *dev) 318static int vfc_capture_poll(struct vfc_dev *dev)
318{ 319{
319 int timeout = 1000; 320 int timeout = 1000;
320 321
@@ -390,8 +391,8 @@ static int vfc_set_control_ioctl(struct inode *inode, struct file *file,
390} 391}
391 392
392 393
393int vfc_port_change_ioctl(struct inode *inode, struct file *file, 394static int vfc_port_change_ioctl(struct inode *inode, struct file *file,
394 struct vfc_dev *dev, unsigned long arg) 395 struct vfc_dev *dev, unsigned long arg)
395{ 396{
396 int ret = 0; 397 int ret = 0;
397 int cmd; 398 int cmd;
@@ -460,8 +461,8 @@ int vfc_port_change_ioctl(struct inode *inode, struct file *file,
460 return ret; 461 return ret;
461} 462}
462 463
463int vfc_set_video_ioctl(struct inode *inode, struct file *file, 464static int vfc_set_video_ioctl(struct inode *inode, struct file *file,
464 struct vfc_dev *dev, unsigned long arg) 465 struct vfc_dev *dev, unsigned long arg)
465{ 466{
466 int ret = 0; 467 int ret = 0;
467 int cmd; 468 int cmd;
@@ -511,8 +512,8 @@ int vfc_set_video_ioctl(struct inode *inode, struct file *file,
511 return ret; 512 return ret;
512} 513}
513 514
514int vfc_get_video_ioctl(struct inode *inode, struct file *file, 515static int vfc_get_video_ioctl(struct inode *inode, struct file *file,
515 struct vfc_dev *dev, unsigned long arg) 516 struct vfc_dev *dev, unsigned long arg)
516{ 517{
517 int ret = 0; 518 int ret = 0;
518 unsigned int status = NO_LOCK; 519 unsigned int status = NO_LOCK;
diff --git a/drivers/sbus/char/vfc_i2c.c b/drivers/sbus/char/vfc_i2c.c
index 9efed771f6c0..32b986e0ed78 100644
--- a/drivers/sbus/char/vfc_i2c.c
+++ b/drivers/sbus/char/vfc_i2c.c
@@ -114,7 +114,7 @@ int vfc_i2c_reset_bus(struct vfc_dev *dev)
114 return 0; 114 return 0;
115} 115}
116 116
117int vfc_i2c_wait_for_bus(struct vfc_dev *dev) 117static int vfc_i2c_wait_for_bus(struct vfc_dev *dev)
118{ 118{
119 int timeout = 1000; 119 int timeout = 1000;
120 120
@@ -126,7 +126,7 @@ int vfc_i2c_wait_for_bus(struct vfc_dev *dev)
126 return 0; 126 return 0;
127} 127}
128 128
129int vfc_i2c_wait_for_pin(struct vfc_dev *dev, int ack) 129static int vfc_i2c_wait_for_pin(struct vfc_dev *dev, int ack)
130{ 130{
131 int timeout = 1000; 131 int timeout = 1000;
132 int s1; 132 int s1;
@@ -144,7 +144,8 @@ int vfc_i2c_wait_for_pin(struct vfc_dev *dev, int ack)
144} 144}
145 145
146#define SHIFT(a) ((a) << 24) 146#define SHIFT(a) ((a) << 24)
147int vfc_i2c_xmit_addr(struct vfc_dev *dev, unsigned char addr, char mode) 147static int vfc_i2c_xmit_addr(struct vfc_dev *dev, unsigned char addr,
148 char mode)
148{ 149{
149 int ret, raddr; 150 int ret, raddr;
150#if 1 151#if 1
@@ -195,7 +196,7 @@ int vfc_i2c_xmit_addr(struct vfc_dev *dev, unsigned char addr, char mode)
195 return 0; 196 return 0;
196} 197}
197 198
198int vfc_i2c_xmit_byte(struct vfc_dev *dev,unsigned char *byte) 199static int vfc_i2c_xmit_byte(struct vfc_dev *dev,unsigned char *byte)
199{ 200{
200 int ret; 201 int ret;
201 u32 val = SHIFT((unsigned int)*byte); 202 u32 val = SHIFT((unsigned int)*byte);
@@ -218,7 +219,8 @@ int vfc_i2c_xmit_byte(struct vfc_dev *dev,unsigned char *byte)
218 return ret; 219 return ret;
219} 220}
220 221
221int vfc_i2c_recv_byte(struct vfc_dev *dev, unsigned char *byte, int last) 222static int vfc_i2c_recv_byte(struct vfc_dev *dev, unsigned char *byte,
223 int last)
222{ 224{
223 int ret; 225 int ret;
224 226
diff --git a/drivers/sbus/dvma.c b/drivers/sbus/dvma.c
index 57e1526746a2..ab0d2de3324c 100644
--- a/drivers/sbus/dvma.c
+++ b/drivers/sbus/dvma.c
@@ -16,7 +16,7 @@
16 16
17struct sbus_dma *dma_chain; 17struct sbus_dma *dma_chain;
18 18
19void __init init_one_dvma(struct sbus_dma *dma, int num_dma) 19static void __init init_one_dvma(struct sbus_dma *dma, int num_dma)
20{ 20{
21 printk("dma%d: ", num_dma); 21 printk("dma%d: ", num_dma);
22 22
diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c
index c37d7c2587ff..73a86d09bba8 100644
--- a/drivers/sbus/sbus.c
+++ b/drivers/sbus/sbus.c
@@ -78,7 +78,7 @@ static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sde
78 else 78 else
79 sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; 79 sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev;
80 sdev->ofdev.dev.bus = &sbus_bus_type; 80 sdev->ofdev.dev.bus = &sbus_bus_type;
81 sprintf(sdev->ofdev.dev.bus_id, "sbus[%08x]", dp->node); 81 dev_set_name(&sdev->ofdev.dev, "sbus[%08x]", dp->node);
82 82
83 if (of_device_register(&sdev->ofdev) != 0) 83 if (of_device_register(&sdev->ofdev) != 0)
84 printk(KERN_DEBUG "sbus: device registration error for %s!\n", 84 printk(KERN_DEBUG "sbus: device registration error for %s!\n",
@@ -257,11 +257,11 @@ static void __init build_one_sbus(struct device_node *dp, int num_sbus)
257 sbus->ofdev.node = dp; 257 sbus->ofdev.node = dp;
258 sbus->ofdev.dev.parent = NULL; 258 sbus->ofdev.dev.parent = NULL;
259 sbus->ofdev.dev.bus = &sbus_bus_type; 259 sbus->ofdev.dev.bus = &sbus_bus_type;
260 sprintf(sbus->ofdev.dev.bus_id, "sbus%d", num_sbus); 260 dev_set_name(&sbus->ofdev.dev, "sbus%d", num_sbus);
261 261
262 if (of_device_register(&sbus->ofdev) != 0) 262 if (of_device_register(&sbus->ofdev) != 0)
263 printk(KERN_DEBUG "sbus: device registration error for %s!\n", 263 printk(KERN_DEBUG "sbus: device registration error for %s!\n",
264 sbus->ofdev.dev.bus_id); 264 dev_name(&sbus->ofdev.dev));
265 265
266 dev_dp = dp->child; 266 dev_dp = dp->child;
267 while (dev_dp) { 267 while (dev_dp) {
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
index 2bc30e32b67a..1fe0901e8119 100644
--- a/drivers/scsi/dpt_i2o.c
+++ b/drivers/scsi/dpt_i2o.c
@@ -271,8 +271,8 @@ rebuild_sys_tab:
271 pHba->initialized = TRUE; 271 pHba->initialized = TRUE;
272 pHba->state &= ~DPTI_STATE_RESET; 272 pHba->state &= ~DPTI_STATE_RESET;
273 if (adpt_sysfs_class) { 273 if (adpt_sysfs_class) {
274 struct device *dev = device_create(adpt_sysfs_class, 274 struct device *dev = device_create_drvdata(adpt_sysfs_class,
275 NULL, MKDEV(DPTI_I2O_MAJOR, pHba->unit), 275 NULL, MKDEV(DPTI_I2O_MAJOR, pHba->unit), NULL,
276 "dpti%d", pHba->unit); 276 "dpti%d", pHba->unit);
277 if (IS_ERR(dev)) { 277 if (IS_ERR(dev)) {
278 printk(KERN_WARNING"dpti%d: unable to " 278 printk(KERN_WARNING"dpti%d: unable to "
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 35cd892dce04..fed0b02ebc1d 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -232,8 +232,8 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev)
232 } 232 }
233 233
234 if (shost->transportt->create_work_queue) { 234 if (shost->transportt->create_work_queue) {
235 snprintf(shost->work_q_name, KOBJ_NAME_LEN, "scsi_wq_%d", 235 snprintf(shost->work_q_name, sizeof(shost->work_q_name),
236 shost->host_no); 236 "scsi_wq_%d", shost->host_no);
237 shost->work_q = create_singlethread_workqueue( 237 shost->work_q = create_singlethread_workqueue(
238 shost->work_q_name); 238 shost->work_q_name);
239 if (!shost->work_q) { 239 if (!shost->work_q) {
@@ -466,7 +466,8 @@ struct Scsi_Host *scsi_host_lookup(unsigned short hostnum)
466 struct device *cdev; 466 struct device *cdev;
467 struct Scsi_Host *shost = ERR_PTR(-ENXIO); 467 struct Scsi_Host *shost = ERR_PTR(-ENXIO);
468 468
469 cdev = class_find_device(&shost_class, &hostnum, __scsi_host_match); 469 cdev = class_find_device(&shost_class, NULL, &hostnum,
470 __scsi_host_match);
470 if (cdev) { 471 if (cdev) {
471 shost = scsi_host_get(class_to_shost(cdev)); 472 shost = scsi_host_get(class_to_shost(cdev));
472 put_device(cdev); 473 put_device(cdev);
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index f843c1383a4b..538552495d48 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -84,7 +84,6 @@ typedef struct ide_scsi_obj {
84 struct Scsi_Host *host; 84 struct Scsi_Host *host;
85 85
86 struct ide_atapi_pc *pc; /* Current packet command */ 86 struct ide_atapi_pc *pc; /* Current packet command */
87 unsigned long flags; /* Status/Action flags */
88 unsigned long transform; /* SCSI cmd translation layer */ 87 unsigned long transform; /* SCSI cmd translation layer */
89 unsigned long log; /* log flags */ 88 unsigned long log; /* log flags */
90} idescsi_scsi_t; 89} idescsi_scsi_t;
@@ -126,23 +125,14 @@ static inline idescsi_scsi_t *drive_to_idescsi(ide_drive_t *ide_drive)
126} 125}
127 126
128/* 127/*
129 * Per ATAPI device status bits.
130 */
131#define IDESCSI_DRQ_INTERRUPT 0 /* DRQ interrupt device */
132
133/*
134 * ide-scsi requests.
135 */
136#define IDESCSI_PC_RQ 90
137
138/*
139 * PIO data transfer routine using the scatter gather table. 128 * PIO data transfer routine using the scatter gather table.
140 */ 129 */
141static void ide_scsi_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, 130static void ide_scsi_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
142 unsigned int bcount, int write) 131 unsigned int bcount, int write)
143{ 132{
144 ide_hwif_t *hwif = drive->hwif; 133 ide_hwif_t *hwif = drive->hwif;
145 xfer_func_t *xf = write ? hwif->output_data : hwif->input_data; 134 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
135 xfer_func_t *xf = write ? tp_ops->output_data : tp_ops->input_data;
146 char *buf; 136 char *buf;
147 int count; 137 int count;
148 138
@@ -228,7 +218,6 @@ static int idescsi_check_condition(ide_drive_t *drive,
228 rq->cmd_type = REQ_TYPE_SENSE; 218 rq->cmd_type = REQ_TYPE_SENSE;
229 rq->cmd_flags |= REQ_PREEMPT; 219 rq->cmd_flags |= REQ_PREEMPT;
230 pc->timeout = jiffies + WAIT_READY; 220 pc->timeout = jiffies + WAIT_READY;
231 pc->callback = ide_scsi_callback;
232 /* NOTE! Save the failed packet command in "rq->buffer" */ 221 /* NOTE! Save the failed packet command in "rq->buffer" */
233 rq->buffer = (void *) failed_cmd->special; 222 rq->buffer = (void *) failed_cmd->special;
234 pc->scsi_cmd = ((struct ide_atapi_pc *) failed_cmd->special)->scsi_cmd; 223 pc->scsi_cmd = ((struct ide_atapi_pc *) failed_cmd->special)->scsi_cmd;
@@ -237,6 +226,7 @@ static int idescsi_check_condition(ide_drive_t *drive,
237 ide_scsi_hex_dump(pc->c, 6); 226 ide_scsi_hex_dump(pc->c, 6);
238 } 227 }
239 rq->rq_disk = scsi->disk; 228 rq->rq_disk = scsi->disk;
229 memcpy(rq->cmd, pc->c, 12);
240 ide_do_drive_cmd(drive, rq); 230 ide_do_drive_cmd(drive, rq);
241 return 0; 231 return 0;
242} 232}
@@ -246,10 +236,9 @@ idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err)
246{ 236{
247 ide_hwif_t *hwif = drive->hwif; 237 ide_hwif_t *hwif = drive->hwif;
248 238
249 if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) 239 if (hwif->tp_ops->read_status(hwif) & (BUSY_STAT | DRQ_STAT))
250 /* force an abort */ 240 /* force an abort */
251 hwif->OUTBSYNC(hwif, WIN_IDLEIMMEDIATE, 241 hwif->tp_ops->exec_command(hwif, WIN_IDLEIMMEDIATE);
252 hwif->io_ports.command_addr);
253 242
254 rq->errors++; 243 rq->errors++;
255 244
@@ -421,10 +410,6 @@ static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *r
421 410
422 if (blk_sense_request(rq) || blk_special_request(rq)) { 411 if (blk_sense_request(rq) || blk_special_request(rq)) {
423 struct ide_atapi_pc *pc = (struct ide_atapi_pc *)rq->special; 412 struct ide_atapi_pc *pc = (struct ide_atapi_pc *)rq->special;
424 idescsi_scsi_t *scsi = drive_to_idescsi(drive);
425
426 if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags))
427 pc->flags |= PC_FLAG_DRQ_INTERRUPT;
428 413
429 if (drive->using_dma && !idescsi_map_sg(drive, pc)) 414 if (drive->using_dma && !idescsi_map_sg(drive, pc))
430 pc->flags |= PC_FLAG_DMA_OK; 415 pc->flags |= PC_FLAG_DMA_OK;
@@ -460,11 +445,14 @@ static inline void idescsi_add_settings(ide_drive_t *drive) { ; }
460static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi) 445static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
461{ 446{
462 if (drive->id && (drive->id->config & 0x0060) == 0x20) 447 if (drive->id && (drive->id->config & 0x0060) == 0x20)
463 set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags); 448 set_bit(IDE_AFLAG_DRQ_INTERRUPT, &drive->atapi_flags);
464 clear_bit(IDESCSI_SG_TRANSFORM, &scsi->transform); 449 clear_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
465#if IDESCSI_DEBUG_LOG 450#if IDESCSI_DEBUG_LOG
466 set_bit(IDESCSI_LOG_CMD, &scsi->log); 451 set_bit(IDESCSI_LOG_CMD, &scsi->log);
467#endif /* IDESCSI_DEBUG_LOG */ 452#endif /* IDESCSI_DEBUG_LOG */
453
454 drive->pc_callback = ide_scsi_callback;
455
468 idescsi_add_settings(drive); 456 idescsi_add_settings(drive);
469} 457}
470 458
@@ -616,7 +604,6 @@ static int idescsi_queue (struct scsi_cmnd *cmd,
616 pc->scsi_cmd = cmd; 604 pc->scsi_cmd = cmd;
617 pc->done = done; 605 pc->done = done;
618 pc->timeout = jiffies + cmd->timeout_per_command; 606 pc->timeout = jiffies + cmd->timeout_per_command;
619 pc->callback = ide_scsi_callback;
620 607
621 if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) { 608 if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) {
622 printk ("ide-scsi: %s: que %lu, cmd = ", drive->name, cmd->serial_number); 609 printk ("ide-scsi: %s: que %lu, cmd = ", drive->name, cmd->serial_number);
@@ -631,6 +618,7 @@ static int idescsi_queue (struct scsi_cmnd *cmd,
631 rq->special = (char *) pc; 618 rq->special = (char *) pc;
632 rq->cmd_type = REQ_TYPE_SPECIAL; 619 rq->cmd_type = REQ_TYPE_SPECIAL;
633 spin_unlock_irq(host->host_lock); 620 spin_unlock_irq(host->host_lock);
621 memcpy(rq->cmd, pc->c, 12);
634 blk_execute_rq_nowait(drive->queue, scsi->disk, rq, 0, NULL); 622 blk_execute_rq_nowait(drive->queue, scsi->disk, rq, 0, NULL);
635 spin_lock_irq(host->host_lock); 623 spin_lock_irq(host->host_lock);
636 return 0; 624 return 0;
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 5fd64e70029d..a272b9a2c869 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -417,15 +417,16 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,
417 fc_host->next_vport_number = 0; 417 fc_host->next_vport_number = 0;
418 fc_host->npiv_vports_inuse = 0; 418 fc_host->npiv_vports_inuse = 0;
419 419
420 snprintf(fc_host->work_q_name, KOBJ_NAME_LEN, "fc_wq_%d", 420 snprintf(fc_host->work_q_name, sizeof(fc_host->work_q_name),
421 shost->host_no); 421 "fc_wq_%d", shost->host_no);
422 fc_host->work_q = create_singlethread_workqueue( 422 fc_host->work_q = create_singlethread_workqueue(
423 fc_host->work_q_name); 423 fc_host->work_q_name);
424 if (!fc_host->work_q) 424 if (!fc_host->work_q)
425 return -ENOMEM; 425 return -ENOMEM;
426 426
427 snprintf(fc_host->devloss_work_q_name, KOBJ_NAME_LEN, "fc_dl_%d", 427 snprintf(fc_host->devloss_work_q_name,
428 shost->host_no); 428 sizeof(fc_host->devloss_work_q_name),
429 "fc_dl_%d", shost->host_no);
429 fc_host->devloss_work_q = create_singlethread_workqueue( 430 fc_host->devloss_work_q = create_singlethread_workqueue(
430 fc_host->devloss_work_q_name); 431 fc_host->devloss_work_q_name);
431 if (!fc_host->devloss_work_q) { 432 if (!fc_host->devloss_work_q) {
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 3af7cbcc5c5d..043c3921164f 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -170,7 +170,7 @@ iscsi_create_endpoint(int dd_size)
170 int err; 170 int err;
171 171
172 for (id = 1; id < ISCSI_MAX_EPID; id++) { 172 for (id = 1; id < ISCSI_MAX_EPID; id++) {
173 dev = class_find_device(&iscsi_endpoint_class, &id, 173 dev = class_find_device(&iscsi_endpoint_class, NULL, &id,
174 iscsi_match_epid); 174 iscsi_match_epid);
175 if (!dev) 175 if (!dev)
176 break; 176 break;
@@ -222,7 +222,7 @@ struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)
222 struct iscsi_endpoint *ep; 222 struct iscsi_endpoint *ep;
223 struct device *dev; 223 struct device *dev;
224 224
225 dev = class_find_device(&iscsi_endpoint_class, &handle, 225 dev = class_find_device(&iscsi_endpoint_class, NULL, &handle,
226 iscsi_match_epid); 226 iscsi_match_epid);
227 if (!dev) 227 if (!dev)
228 return NULL; 228 return NULL;
@@ -247,8 +247,8 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
247 atomic_set(&ihost->nr_scans, 0); 247 atomic_set(&ihost->nr_scans, 0);
248 mutex_init(&ihost->mutex); 248 mutex_init(&ihost->mutex);
249 249
250 snprintf(ihost->scan_workq_name, KOBJ_NAME_LEN, "iscsi_scan_%d", 250 snprintf(ihost->scan_workq_name, sizeof(ihost->scan_workq_name),
251 shost->host_no); 251 "iscsi_scan_%d", shost->host_no);
252 ihost->scan_workq = create_singlethread_workqueue( 252 ihost->scan_workq = create_singlethread_workqueue(
253 ihost->scan_workq_name); 253 ihost->scan_workq_name);
254 if (!ihost->scan_workq) 254 if (!ihost->scan_workq)
diff --git a/drivers/scsi/sun_esp.c b/drivers/scsi/sun_esp.c
index 2c87db98cdfb..f9cf70151366 100644
--- a/drivers/scsi/sun_esp.c
+++ b/drivers/scsi/sun_esp.c
@@ -7,6 +7,7 @@
7#include <linux/types.h> 7#include <linux/types.h>
8#include <linux/delay.h> 8#include <linux/delay.h>
9#include <linux/module.h> 9#include <linux/module.h>
10#include <linux/mm.h>
10#include <linux/init.h> 11#include <linux/init.h>
11 12
12#include <asm/irq.h> 13#include <asm/irq.h>
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index ce948b66bbd4..a97f1ae11f78 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -1293,7 +1293,18 @@ receive_chars(struct uart_8250_port *up, unsigned int *status)
1293 char flag; 1293 char flag;
1294 1294
1295 do { 1295 do {
1296 ch = serial_inp(up, UART_RX); 1296 if (likely(lsr & UART_LSR_DR))
1297 ch = serial_inp(up, UART_RX);
1298 else
1299 /*
1300 * Intel 82571 has a Serial Over Lan device that will
1301 * set UART_LSR_BI without setting UART_LSR_DR when
1302 * it receives a break. To avoid reading from the
1303 * receive buffer without UART_LSR_DR bit set, we
1304 * just force the read character to be 0
1305 */
1306 ch = 0;
1307
1297 flag = TTY_NORMAL; 1308 flag = TTY_NORMAL;
1298 up->port.icount.rx++; 1309 up->port.icount.rx++;
1299 1310
@@ -1342,7 +1353,7 @@ receive_chars(struct uart_8250_port *up, unsigned int *status)
1342 1353
1343ignore_char: 1354ignore_char:
1344 lsr = serial_inp(up, UART_LSR); 1355 lsr = serial_inp(up, UART_LSR);
1345 } while ((lsr & UART_LSR_DR) && (max_count-- > 0)); 1356 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
1346 spin_unlock(&up->port.lock); 1357 spin_unlock(&up->port.lock);
1347 tty_flip_buffer_push(tty); 1358 tty_flip_buffer_push(tty);
1348 spin_lock(&up->port.lock); 1359 spin_lock(&up->port.lock);
@@ -1425,7 +1436,7 @@ serial8250_handle_port(struct uart_8250_port *up)
1425 1436
1426 DEBUG_INTR("status = %x...", status); 1437 DEBUG_INTR("status = %x...", status);
1427 1438
1428 if (status & UART_LSR_DR) 1439 if (status & (UART_LSR_DR | UART_LSR_BI))
1429 receive_chars(up, &status); 1440 receive_chars(up, &status);
1430 check_modem_status(up); 1441 check_modem_status(up);
1431 if (status & UART_LSR_THRE) 1442 if (status & UART_LSR_THRE)
@@ -1874,7 +1885,9 @@ static int serial8250_startup(struct uart_port *port)
1874 * the interrupt is enabled. Delays are necessary to 1885 * the interrupt is enabled. Delays are necessary to
1875 * allow register changes to become visible. 1886 * allow register changes to become visible.
1876 */ 1887 */
1877 spin_lock_irqsave(&up->port.lock, flags); 1888 spin_lock(&up->port.lock);
1889 if (up->port.flags & UPF_SHARE_IRQ)
1890 disable_irq_nosync(up->port.irq);
1878 1891
1879 wait_for_xmitr(up, UART_LSR_THRE); 1892 wait_for_xmitr(up, UART_LSR_THRE);
1880 serial_out_sync(up, UART_IER, UART_IER_THRI); 1893 serial_out_sync(up, UART_IER, UART_IER_THRI);
@@ -1886,7 +1899,9 @@ static int serial8250_startup(struct uart_port *port)
1886 iir = serial_in(up, UART_IIR); 1899 iir = serial_in(up, UART_IIR);
1887 serial_out(up, UART_IER, 0); 1900 serial_out(up, UART_IER, 0);
1888 1901
1889 spin_unlock_irqrestore(&up->port.lock, flags); 1902 if (up->port.flags & UPF_SHARE_IRQ)
1903 enable_irq(up->port.irq);
1904 spin_unlock(&up->port.lock);
1890 1905
1891 /* 1906 /*
1892 * If the interrupt is not reasserted, setup a timer to 1907 * If the interrupt is not reasserted, setup a timer to
diff --git a/drivers/serial/8250_gsc.c b/drivers/serial/8250_gsc.c
index 4eb7437a404a..0416ad3bc127 100644
--- a/drivers/serial/8250_gsc.c
+++ b/drivers/serial/8250_gsc.c
@@ -119,3 +119,5 @@ int __init probe_serial_gsc(void)
119} 119}
120 120
121module_init(probe_serial_gsc); 121module_init(probe_serial_gsc);
122
123MODULE_LICENSE("GPL");
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
index 1b36087665a2..c2f23933155b 100644
--- a/drivers/serial/8250_pci.c
+++ b/drivers/serial/8250_pci.c
@@ -767,6 +767,9 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
767#define PCI_SUBDEVICE_ID_POCTAL232 0x0308 767#define PCI_SUBDEVICE_ID_POCTAL232 0x0308
768#define PCI_SUBDEVICE_ID_POCTAL422 0x0408 768#define PCI_SUBDEVICE_ID_POCTAL422 0x0408
769 769
770/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
771#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
772
770/* 773/*
771 * Master list of serial port init/setup/exit quirks. 774 * Master list of serial port init/setup/exit quirks.
772 * This does not describe the general nature of the port. 775 * This does not describe the general nature of the port.
@@ -882,6 +885,15 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
882 }, 885 },
883 { 886 {
884 .vendor = PCI_VENDOR_ID_PLX, 887 .vendor = PCI_VENDOR_ID_PLX,
888 .device = PCI_DEVICE_ID_PLX_9050,
889 .subvendor = PCI_VENDOR_ID_PLX,
890 .subdevice = PCI_SUBDEVICE_ID_UNKNOWN_0x1584,
891 .init = pci_plx9050_init,
892 .setup = pci_default_setup,
893 .exit = __devexit_p(pci_plx9050_exit),
894 },
895 {
896 .vendor = PCI_VENDOR_ID_PLX,
885 .device = PCI_DEVICE_ID_PLX_ROMULUS, 897 .device = PCI_DEVICE_ID_PLX_ROMULUS,
886 .subvendor = PCI_VENDOR_ID_PLX, 898 .subvendor = PCI_VENDOR_ID_PLX,
887 .subdevice = PCI_DEVICE_ID_PLX_ROMULUS, 899 .subdevice = PCI_DEVICE_ID_PLX_ROMULUS,
@@ -2197,6 +2209,11 @@ static struct pci_device_id serial_pci_tbl[] = {
2197 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_1077, 2209 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_1077,
2198 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2210 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
2199 pbn_b2_4_921600 }, 2211 pbn_b2_4_921600 },
2212 /* Unknown card - subdevice 0x1584 */
2213 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
2214 PCI_VENDOR_ID_PLX,
2215 PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0,
2216 pbn_b0_4_115200 },
2200 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, 2217 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
2201 PCI_SUBVENDOR_ID_KEYSPAN, 2218 PCI_SUBVENDOR_ID_KEYSPAN,
2202 PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0, 2219 PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0,
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 8fc7451c0049..3b4a14e355c1 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -942,22 +942,6 @@ config SERIAL_IP22_ZILOG_CONSOLE
942 depends on SERIAL_IP22_ZILOG=y 942 depends on SERIAL_IP22_ZILOG=y
943 select SERIAL_CORE_CONSOLE 943 select SERIAL_CORE_CONSOLE
944 944
945config V850E_UART
946 bool "NEC V850E on-chip UART support"
947 depends on V850E_MA1 || V850E_ME2 || V850E_TEG || V850E2_ANNA || V850E_AS85EP1
948 select SERIAL_CORE
949 default y
950
951config V850E_UARTB
952 bool
953 depends on V850E_UART && V850E_ME2
954 default y
955
956config V850E_UART_CONSOLE
957 bool "Use NEC V850E on-chip UART for console"
958 depends on V850E_UART
959 select SERIAL_CORE_CONSOLE
960
961config SERIAL_SH_SCI 945config SERIAL_SH_SCI
962 tristate "SuperH SCI(F) serial port support" 946 tristate "SuperH SCI(F) serial port support"
963 depends on SUPERH || H8300 947 depends on SUPERH || H8300
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c
index abe129cc927a..a4f86927a74b 100644
--- a/drivers/serial/cpm_uart/cpm_uart_core.c
+++ b/drivers/serial/cpm_uart/cpm_uart_core.c
@@ -201,6 +201,10 @@ static void cpm_uart_int_tx(struct uart_port *port)
201 cpm_uart_tx_pump(port); 201 cpm_uart_tx_pump(port);
202} 202}
203 203
204#ifdef CONFIG_CONSOLE_POLL
205static int serial_polled;
206#endif
207
204/* 208/*
205 * Receive characters 209 * Receive characters
206 */ 210 */
@@ -209,7 +213,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
209 int i; 213 int i;
210 unsigned char ch; 214 unsigned char ch;
211 u8 *cp; 215 u8 *cp;
212 struct tty_struct *tty = port->info->tty; 216 struct tty_struct *tty = port->info->port.tty;
213 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; 217 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
214 cbd_t __iomem *bdp; 218 cbd_t __iomem *bdp;
215 u16 status; 219 u16 status;
@@ -222,6 +226,12 @@ static void cpm_uart_int_rx(struct uart_port *port)
222 */ 226 */
223 bdp = pinfo->rx_cur; 227 bdp = pinfo->rx_cur;
224 for (;;) { 228 for (;;) {
229#ifdef CONFIG_CONSOLE_POLL
230 if (unlikely(serial_polled)) {
231 serial_polled = 0;
232 return;
233 }
234#endif
225 /* get status */ 235 /* get status */
226 status = in_be16(&bdp->cbd_sc); 236 status = in_be16(&bdp->cbd_sc);
227 /* If this one is empty, return happy */ 237 /* If this one is empty, return happy */
@@ -253,7 +263,12 @@ static void cpm_uart_int_rx(struct uart_port *port)
253 goto handle_error; 263 goto handle_error;
254 if (uart_handle_sysrq_char(port, ch)) 264 if (uart_handle_sysrq_char(port, ch))
255 continue; 265 continue;
256 266#ifdef CONFIG_CONSOLE_POLL
267 if (unlikely(serial_polled)) {
268 serial_polled = 0;
269 return;
270 }
271#endif
257 error_return: 272 error_return:
258 tty_insert_flip_char(tty, ch, flg); 273 tty_insert_flip_char(tty, ch, flg);
259 274
@@ -420,10 +435,13 @@ static void cpm_uart_shutdown(struct uart_port *port)
420 } 435 }
421 436
422 /* Shut them really down and reinit buffer descriptors */ 437 /* Shut them really down and reinit buffer descriptors */
423 if (IS_SMC(pinfo)) 438 if (IS_SMC(pinfo)) {
439 out_be16(&pinfo->smcup->smc_brkcr, 0);
424 cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX); 440 cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
425 else 441 } else {
442 out_be16(&pinfo->sccup->scc_brkcr, 0);
426 cpm_line_cr_cmd(pinfo, CPM_CR_GRA_STOP_TX); 443 cpm_line_cr_cmd(pinfo, CPM_CR_GRA_STOP_TX);
444 }
427 445
428 cpm_uart_initbd(pinfo); 446 cpm_uart_initbd(pinfo);
429 } 447 }
@@ -539,9 +557,11 @@ static void cpm_uart_set_termios(struct uart_port *port,
539 * enables, because we want to put them back if they were 557 * enables, because we want to put them back if they were
540 * present. 558 * present.
541 */ 559 */
542 prev_mode = in_be16(&smcp->smc_smcmr); 560 prev_mode = in_be16(&smcp->smc_smcmr) & (SMCMR_REN | SMCMR_TEN);
543 out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits) | cval | SMCMR_SM_UART); 561 /* Output in *one* operation, so we don't interrupt RX/TX if they
544 setbits16(&smcp->smc_smcmr, (prev_mode & (SMCMR_REN | SMCMR_TEN))); 562 * were already enabled. */
563 out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits) | cval |
564 SMCMR_SM_UART | prev_mode);
545 } else { 565 } else {
546 out_be16(&sccp->scc_psmr, (sbits << 12) | scval); 566 out_be16(&sccp->scc_psmr, (sbits << 12) | scval);
547 } 567 }
@@ -865,6 +885,80 @@ static void cpm_uart_config_port(struct uart_port *port, int flags)
865 cpm_uart_request_port(port); 885 cpm_uart_request_port(port);
866 } 886 }
867} 887}
888
889#ifdef CONFIG_CONSOLE_POLL
890/* Serial polling routines for writing and reading from the uart while
891 * in an interrupt or debug context.
892 */
893
894#define GDB_BUF_SIZE 512 /* power of 2, please */
895
896static char poll_buf[GDB_BUF_SIZE];
897static char *pollp;
898static int poll_chars;
899
900static int poll_wait_key(char *obuf, struct uart_cpm_port *pinfo)
901{
902 u_char c, *cp;
903 volatile cbd_t *bdp;
904 int i;
905
906 /* Get the address of the host memory buffer.
907 */
908 bdp = pinfo->rx_cur;
909 while (bdp->cbd_sc & BD_SC_EMPTY)
910 ;
911
912 /* If the buffer address is in the CPM DPRAM, don't
913 * convert it.
914 */
915 cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo);
916
917 if (obuf) {
918 i = c = bdp->cbd_datlen;
919 while (i-- > 0)
920 *obuf++ = *cp++;
921 } else
922 c = *cp;
923 bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV | BD_SC_ID);
924 bdp->cbd_sc |= BD_SC_EMPTY;
925
926 if (bdp->cbd_sc & BD_SC_WRAP)
927 bdp = pinfo->rx_bd_base;
928 else
929 bdp++;
930 pinfo->rx_cur = (cbd_t *)bdp;
931
932 return (int)c;
933}
934
935static int cpm_get_poll_char(struct uart_port *port)
936{
937 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
938
939 if (!serial_polled) {
940 serial_polled = 1;
941 poll_chars = 0;
942 }
943 if (poll_chars <= 0) {
944 poll_chars = poll_wait_key(poll_buf, pinfo);
945 pollp = poll_buf;
946 }
947 poll_chars--;
948 return *pollp++;
949}
950
951static void cpm_put_poll_char(struct uart_port *port,
952 unsigned char c)
953{
954 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
955 static char ch[2];
956
957 ch[0] = (char)c;
958 cpm_uart_early_write(pinfo->port.line, ch, 1);
959}
960#endif /* CONFIG_CONSOLE_POLL */
961
868static struct uart_ops cpm_uart_pops = { 962static struct uart_ops cpm_uart_pops = {
869 .tx_empty = cpm_uart_tx_empty, 963 .tx_empty = cpm_uart_tx_empty,
870 .set_mctrl = cpm_uart_set_mctrl, 964 .set_mctrl = cpm_uart_set_mctrl,
@@ -882,6 +976,10 @@ static struct uart_ops cpm_uart_pops = {
882 .request_port = cpm_uart_request_port, 976 .request_port = cpm_uart_request_port,
883 .config_port = cpm_uart_config_port, 977 .config_port = cpm_uart_config_port,
884 .verify_port = cpm_uart_verify_port, 978 .verify_port = cpm_uart_verify_port,
979#ifdef CONFIG_CONSOLE_POLL
980 .poll_get_char = cpm_get_poll_char,
981 .poll_put_char = cpm_put_poll_char,
982#endif
885}; 983};
886 984
887struct uart_cpm_port cpm_uart_ports[UART_NR]; 985struct uart_cpm_port cpm_uart_ports[UART_NR];
@@ -1105,12 +1203,14 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
1105 udbg_putc = NULL; 1203 udbg_putc = NULL;
1106#endif 1204#endif
1107 1205
1108 cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
1109
1110 if (IS_SMC(pinfo)) { 1206 if (IS_SMC(pinfo)) {
1207 out_be16(&pinfo->smcup->smc_brkcr, 0);
1208 cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
1111 clrbits8(&pinfo->smcp->smc_smcm, SMCM_RX | SMCM_TX); 1209 clrbits8(&pinfo->smcp->smc_smcm, SMCM_RX | SMCM_TX);
1112 clrbits16(&pinfo->smcp->smc_smcmr, SMCMR_REN | SMCMR_TEN); 1210 clrbits16(&pinfo->smcp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
1113 } else { 1211 } else {
1212 out_be16(&pinfo->sccup->scc_brkcr, 0);
1213 cpm_line_cr_cmd(pinfo, CPM_CR_GRA_STOP_TX);
1114 clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_TX | UART_SCCM_RX); 1214 clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_TX | UART_SCCM_RX);
1115 clrbits32(&pinfo->sccp->scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT); 1215 clrbits32(&pinfo->sccp->scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
1116 } 1216 }
diff --git a/drivers/serial/dz.c b/drivers/serial/dz.c
index a81d2c2ff8a2..6042b87797a1 100644
--- a/drivers/serial/dz.c
+++ b/drivers/serial/dz.c
@@ -642,6 +642,26 @@ static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
642 spin_unlock_irqrestore(&dport->port.lock, flags); 642 spin_unlock_irqrestore(&dport->port.lock, flags);
643} 643}
644 644
645/*
646 * Hack alert!
647 * Required solely so that the initial PROM-based console
648 * works undisturbed in parallel with this one.
649 */
650static void dz_pm(struct uart_port *uport, unsigned int state,
651 unsigned int oldstate)
652{
653 struct dz_port *dport = to_dport(uport);
654 unsigned long flags;
655
656 spin_lock_irqsave(&dport->port.lock, flags);
657 if (state < 3)
658 dz_start_tx(&dport->port);
659 else
660 dz_stop_tx(&dport->port);
661 spin_unlock_irqrestore(&dport->port.lock, flags);
662}
663
664
645static const char *dz_type(struct uart_port *uport) 665static const char *dz_type(struct uart_port *uport)
646{ 666{
647 return "DZ"; 667 return "DZ";
@@ -738,6 +758,7 @@ static struct uart_ops dz_ops = {
738 .startup = dz_startup, 758 .startup = dz_startup,
739 .shutdown = dz_shutdown, 759 .shutdown = dz_shutdown,
740 .set_termios = dz_set_termios, 760 .set_termios = dz_set_termios,
761 .pm = dz_pm,
741 .type = dz_type, 762 .type = dz_type,
742 .release_port = dz_release_port, 763 .release_port = dz_release_port,
743 .request_port = dz_request_port, 764 .request_port = dz_request_port,
@@ -861,7 +882,10 @@ static int __init dz_console_setup(struct console *co, char *options)
861 if (ret) 882 if (ret)
862 return ret; 883 return ret;
863 884
885 spin_lock_init(&dport->port.lock); /* For dz_pm(). */
886
864 dz_reset(dport); 887 dz_reset(dport);
888 dz_pm(uport, 0, -1);
865 889
866 if (options) 890 if (options)
867 uart_parse_options(options, &baud, &parity, &bits, &flow); 891 uart_parse_options(options, &baud, &parity, &bits, &flow);
diff --git a/drivers/serial/icom.c b/drivers/serial/icom.c
index 9c2df5c857cf..2b7531d9f6ab 100644
--- a/drivers/serial/icom.c
+++ b/drivers/serial/icom.c
@@ -730,7 +730,7 @@ static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
730static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port) 730static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
731{ 731{
732 short int count, rcv_buff; 732 short int count, rcv_buff;
733 struct tty_struct *tty = icom_port->uart_port.info->tty; 733 struct tty_struct *tty = icom_port->uart_port.info->port.tty;
734 unsigned short int status; 734 unsigned short int status;
735 struct uart_icount *icount; 735 struct uart_icount *icount;
736 unsigned long offset; 736 unsigned long offset;
diff --git a/drivers/serial/mpsc.c b/drivers/serial/mpsc.c
index c9f53e71f252..61d3ade5286c 100644
--- a/drivers/serial/mpsc.c
+++ b/drivers/serial/mpsc.c
@@ -921,6 +921,10 @@ static int mpsc_make_ready(struct mpsc_port_info *pi)
921 return 0; 921 return 0;
922} 922}
923 923
924#ifdef CONFIG_CONSOLE_POLL
925static int serial_polled;
926#endif
927
924/* 928/*
925 ****************************************************************************** 929 ******************************************************************************
926 * 930 *
@@ -956,7 +960,12 @@ static int mpsc_rx_intr(struct mpsc_port_info *pi)
956 while (!((cmdstat = be32_to_cpu(rxre->cmdstat)) 960 while (!((cmdstat = be32_to_cpu(rxre->cmdstat))
957 & SDMA_DESC_CMDSTAT_O)) { 961 & SDMA_DESC_CMDSTAT_O)) {
958 bytes_in = be16_to_cpu(rxre->bytecnt); 962 bytes_in = be16_to_cpu(rxre->bytecnt);
959 963#ifdef CONFIG_CONSOLE_POLL
964 if (unlikely(serial_polled)) {
965 serial_polled = 0;
966 return 0;
967 }
968#endif
960 /* Following use of tty struct directly is deprecated */ 969 /* Following use of tty struct directly is deprecated */
961 if (unlikely(tty_buffer_request_room(tty, bytes_in) 970 if (unlikely(tty_buffer_request_room(tty, bytes_in)
962 < bytes_in)) { 971 < bytes_in)) {
@@ -1017,6 +1026,12 @@ static int mpsc_rx_intr(struct mpsc_port_info *pi)
1017 if (uart_handle_sysrq_char(&pi->port, *bp)) { 1026 if (uart_handle_sysrq_char(&pi->port, *bp)) {
1018 bp++; 1027 bp++;
1019 bytes_in--; 1028 bytes_in--;
1029#ifdef CONFIG_CONSOLE_POLL
1030 if (unlikely(serial_polled)) {
1031 serial_polled = 0;
1032 return 0;
1033 }
1034#endif
1020 goto next_frame; 1035 goto next_frame;
1021 } 1036 }
1022 1037
@@ -1519,6 +1534,133 @@ static int mpsc_verify_port(struct uart_port *port, struct serial_struct *ser)
1519 1534
1520 return rc; 1535 return rc;
1521} 1536}
1537#ifdef CONFIG_CONSOLE_POLL
1538/* Serial polling routines for writing and reading from the uart while
1539 * in an interrupt or debug context.
1540 */
1541
1542static char poll_buf[2048];
1543static int poll_ptr;
1544static int poll_cnt;
1545static void mpsc_put_poll_char(struct uart_port *port,
1546 unsigned char c);
1547
1548static int mpsc_get_poll_char(struct uart_port *port)
1549{
1550 struct mpsc_port_info *pi = (struct mpsc_port_info *)port;
1551 struct mpsc_rx_desc *rxre;
1552 u32 cmdstat, bytes_in, i;
1553 u8 *bp;
1554
1555 if (!serial_polled)
1556 serial_polled = 1;
1557
1558 pr_debug("mpsc_rx_intr[%d]: Handling Rx intr\n", pi->port.line);
1559
1560 if (poll_cnt) {
1561 poll_cnt--;
1562 return poll_buf[poll_ptr++];
1563 }
1564 poll_ptr = 0;
1565 poll_cnt = 0;
1566
1567 while (poll_cnt == 0) {
1568 rxre = (struct mpsc_rx_desc *)(pi->rxr +
1569 (pi->rxr_posn*MPSC_RXRE_SIZE));
1570 dma_cache_sync(pi->port.dev, (void *)rxre,
1571 MPSC_RXRE_SIZE, DMA_FROM_DEVICE);
1572#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
1573 if (pi->cache_mgmt) /* GT642[46]0 Res #COMM-2 */
1574 invalidate_dcache_range((ulong)rxre,
1575 (ulong)rxre + MPSC_RXRE_SIZE);
1576#endif
1577 /*
1578 * Loop through Rx descriptors handling ones that have
1579 * been completed.
1580 */
1581 while (poll_cnt == 0 &&
1582 !((cmdstat = be32_to_cpu(rxre->cmdstat)) &
1583 SDMA_DESC_CMDSTAT_O)){
1584 bytes_in = be16_to_cpu(rxre->bytecnt);
1585 bp = pi->rxb + (pi->rxr_posn * MPSC_RXBE_SIZE);
1586 dma_cache_sync(pi->port.dev, (void *) bp,
1587 MPSC_RXBE_SIZE, DMA_FROM_DEVICE);
1588#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
1589 if (pi->cache_mgmt) /* GT642[46]0 Res #COMM-2 */
1590 invalidate_dcache_range((ulong)bp,
1591 (ulong)bp + MPSC_RXBE_SIZE);
1592#endif
1593 if ((unlikely(cmdstat & (SDMA_DESC_CMDSTAT_BR |
1594 SDMA_DESC_CMDSTAT_FR | SDMA_DESC_CMDSTAT_OR))) &&
1595 !(cmdstat & pi->port.ignore_status_mask)) {
1596 poll_buf[poll_cnt] = *bp;
1597 poll_cnt++;
1598 } else {
1599 for (i = 0; i < bytes_in; i++) {
1600 poll_buf[poll_cnt] = *bp++;
1601 poll_cnt++;
1602 }
1603 pi->port.icount.rx += bytes_in;
1604 }
1605 rxre->bytecnt = cpu_to_be16(0);
1606 wmb();
1607 rxre->cmdstat = cpu_to_be32(SDMA_DESC_CMDSTAT_O |
1608 SDMA_DESC_CMDSTAT_EI |
1609 SDMA_DESC_CMDSTAT_F |
1610 SDMA_DESC_CMDSTAT_L);
1611 wmb();
1612 dma_cache_sync(pi->port.dev, (void *)rxre,
1613 MPSC_RXRE_SIZE, DMA_BIDIRECTIONAL);
1614#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
1615 if (pi->cache_mgmt) /* GT642[46]0 Res #COMM-2 */
1616 flush_dcache_range((ulong)rxre,
1617 (ulong)rxre + MPSC_RXRE_SIZE);
1618#endif
1619
1620 /* Advance to next descriptor */
1621 pi->rxr_posn = (pi->rxr_posn + 1) &
1622 (MPSC_RXR_ENTRIES - 1);
1623 rxre = (struct mpsc_rx_desc *)(pi->rxr +
1624 (pi->rxr_posn * MPSC_RXRE_SIZE));
1625 dma_cache_sync(pi->port.dev, (void *)rxre,
1626 MPSC_RXRE_SIZE, DMA_FROM_DEVICE);
1627#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
1628 if (pi->cache_mgmt) /* GT642[46]0 Res #COMM-2 */
1629 invalidate_dcache_range((ulong)rxre,
1630 (ulong)rxre + MPSC_RXRE_SIZE);
1631#endif
1632 }
1633
1634 /* Restart rx engine, if its stopped */
1635 if ((readl(pi->sdma_base + SDMA_SDCM) & SDMA_SDCM_ERD) == 0)
1636 mpsc_start_rx(pi);
1637 }
1638 if (poll_cnt) {
1639 poll_cnt--;
1640 return poll_buf[poll_ptr++];
1641 }
1642
1643 return 0;
1644}
1645
1646
1647static void mpsc_put_poll_char(struct uart_port *port,
1648 unsigned char c)
1649{
1650 struct mpsc_port_info *pi = (struct mpsc_port_info *)port;
1651 u32 data;
1652
1653 data = readl(pi->mpsc_base + MPSC_MPCR);
1654 writeb(c, pi->mpsc_base + MPSC_CHR_1);
1655 mb();
1656 data = readl(pi->mpsc_base + MPSC_CHR_2);
1657 data |= MPSC_CHR_2_TTCS;
1658 writel(data, pi->mpsc_base + MPSC_CHR_2);
1659 mb();
1660
1661 while (readl(pi->mpsc_base + MPSC_CHR_2) & MPSC_CHR_2_TTCS);
1662}
1663#endif
1522 1664
1523static struct uart_ops mpsc_pops = { 1665static struct uart_ops mpsc_pops = {
1524 .tx_empty = mpsc_tx_empty, 1666 .tx_empty = mpsc_tx_empty,
@@ -1537,6 +1679,10 @@ static struct uart_ops mpsc_pops = {
1537 .request_port = mpsc_request_port, 1679 .request_port = mpsc_request_port,
1538 .config_port = mpsc_config_port, 1680 .config_port = mpsc_config_port,
1539 .verify_port = mpsc_verify_port, 1681 .verify_port = mpsc_verify_port,
1682#ifdef CONFIG_CONSOLE_POLL
1683 .poll_get_char = mpsc_get_poll_char,
1684 .poll_put_char = mpsc_put_poll_char,
1685#endif
1540}; 1686};
1541 1687
1542/* 1688/*
diff --git a/drivers/serial/samsung.c b/drivers/serial/samsung.c
index 4a3ecaa629e6..d852f83f8900 100644
--- a/drivers/serial/samsung.c
+++ b/drivers/serial/samsung.c
@@ -202,7 +202,7 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id)
202{ 202{
203 struct s3c24xx_uart_port *ourport = dev_id; 203 struct s3c24xx_uart_port *ourport = dev_id;
204 struct uart_port *port = &ourport->port; 204 struct uart_port *port = &ourport->port;
205 struct tty_struct *tty = port->info->tty; 205 struct tty_struct *tty = port->info->port.tty;
206 unsigned int ufcon, ch, flag, ufstat, uerstat; 206 unsigned int ufcon, ch, flag, ufstat, uerstat;
207 int max_count = 64; 207 int max_count = 64;
208 208
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 0bce1fe2c62a..f977c98cfa95 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -934,7 +934,7 @@ uart_tiocmset(struct tty_struct *tty, struct file *file,
934 return ret; 934 return ret;
935} 935}
936 936
937static void uart_break_ctl(struct tty_struct *tty, int break_state) 937static int uart_break_ctl(struct tty_struct *tty, int break_state)
938{ 938{
939 struct uart_state *state = tty->driver_data; 939 struct uart_state *state = tty->driver_data;
940 struct uart_port *port = state->port; 940 struct uart_port *port = state->port;
@@ -945,6 +945,7 @@ static void uart_break_ctl(struct tty_struct *tty, int break_state)
945 port->ops->break_ctl(port, break_state); 945 port->ops->break_ctl(port, break_state);
946 946
947 mutex_unlock(&state->mutex); 947 mutex_unlock(&state->mutex);
948 return 0;
948} 949}
949 950
950static int uart_do_autoconfig(struct uart_state *state) 951static int uart_do_autoconfig(struct uart_state *state)
diff --git a/drivers/serial/serial_txx9.c b/drivers/serial/serial_txx9.c
index 7ad21925869a..8fcb4c5b9a26 100644
--- a/drivers/serial/serial_txx9.c
+++ b/drivers/serial/serial_txx9.c
@@ -272,7 +272,7 @@ static void serial_txx9_initialize(struct uart_port *port)
272static inline void 272static inline void
273receive_chars(struct uart_txx9_port *up, unsigned int *status) 273receive_chars(struct uart_txx9_port *up, unsigned int *status)
274{ 274{
275 struct tty_struct *tty = up->port.info->tty; 275 struct tty_struct *tty = up->port.info->port.tty;
276 unsigned char ch; 276 unsigned char ch;
277 unsigned int disr = *status; 277 unsigned int disr = *status;
278 int max_count = 256; 278 int max_count = 256;
diff --git a/drivers/serial/zs.c b/drivers/serial/zs.c
index bd45b6230fd8..9e6a873f8203 100644
--- a/drivers/serial/zs.c
+++ b/drivers/serial/zs.c
@@ -787,7 +787,6 @@ static int zs_startup(struct uart_port *uport)
787 zport->regs[1] &= ~RxINT_MASK; 787 zport->regs[1] &= ~RxINT_MASK;
788 zport->regs[1] |= RxINT_ALL | TxINT_ENAB | EXT_INT_ENAB; 788 zport->regs[1] |= RxINT_ALL | TxINT_ENAB | EXT_INT_ENAB;
789 zport->regs[3] |= RxENABLE; 789 zport->regs[3] |= RxENABLE;
790 zport->regs[5] |= TxENAB;
791 zport->regs[15] |= BRKIE; 790 zport->regs[15] |= BRKIE;
792 write_zsreg(zport, R1, zport->regs[1]); 791 write_zsreg(zport, R1, zport->regs[1]);
793 write_zsreg(zport, R3, zport->regs[3]); 792 write_zsreg(zport, R3, zport->regs[3]);
@@ -814,7 +813,6 @@ static void zs_shutdown(struct uart_port *uport)
814 813
815 spin_lock_irqsave(&scc->zlock, flags); 814 spin_lock_irqsave(&scc->zlock, flags);
816 815
817 zport->regs[5] &= ~TxENAB;
818 zport->regs[3] &= ~RxENABLE; 816 zport->regs[3] &= ~RxENABLE;
819 write_zsreg(zport, R5, zport->regs[5]); 817 write_zsreg(zport, R5, zport->regs[5]);
820 write_zsreg(zport, R3, zport->regs[3]); 818 write_zsreg(zport, R3, zport->regs[3]);
@@ -959,6 +957,23 @@ static void zs_set_termios(struct uart_port *uport, struct ktermios *termios,
959 spin_unlock_irqrestore(&scc->zlock, flags); 957 spin_unlock_irqrestore(&scc->zlock, flags);
960} 958}
961 959
960/*
961 * Hack alert!
962 * Required solely so that the initial PROM-based console
963 * works undisturbed in parallel with this one.
964 */
965static void zs_pm(struct uart_port *uport, unsigned int state,
966 unsigned int oldstate)
967{
968 struct zs_port *zport = to_zport(uport);
969
970 if (state < 3)
971 zport->regs[5] |= TxENAB;
972 else
973 zport->regs[5] &= ~TxENAB;
974 write_zsreg(zport, R5, zport->regs[5]);
975}
976
962 977
963static const char *zs_type(struct uart_port *uport) 978static const char *zs_type(struct uart_port *uport)
964{ 979{
@@ -1041,6 +1056,7 @@ static struct uart_ops zs_ops = {
1041 .startup = zs_startup, 1056 .startup = zs_startup,
1042 .shutdown = zs_shutdown, 1057 .shutdown = zs_shutdown,
1043 .set_termios = zs_set_termios, 1058 .set_termios = zs_set_termios,
1059 .pm = zs_pm,
1044 .type = zs_type, 1060 .type = zs_type,
1045 .release_port = zs_release_port, 1061 .release_port = zs_release_port,
1046 .request_port = zs_request_port, 1062 .request_port = zs_request_port,
@@ -1190,6 +1206,7 @@ static int __init zs_console_setup(struct console *co, char *options)
1190 return ret; 1206 return ret;
1191 1207
1192 zs_reset(zport); 1208 zs_reset(zport);
1209 zs_pm(uport, 0, -1);
1193 1210
1194 if (options) 1211 if (options)
1195 uart_parse_options(options, &baud, &parity, &bits, &flow); 1212 uart_parse_options(options, &baud, &parity, &bits, &flow);
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index 66ec5d8808de..2303521b4f09 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -49,25 +49,26 @@ config SPI_MASTER
49 controller and the protocol drivers for the SPI slave chips 49 controller and the protocol drivers for the SPI slave chips
50 that are connected. 50 that are connected.
51 51
52if SPI_MASTER
53
52comment "SPI Master Controller Drivers" 54comment "SPI Master Controller Drivers"
53 depends on SPI_MASTER
54 55
55config SPI_ATMEL 56config SPI_ATMEL
56 tristate "Atmel SPI Controller" 57 tristate "Atmel SPI Controller"
57 depends on (ARCH_AT91 || AVR32) && SPI_MASTER 58 depends on (ARCH_AT91 || AVR32)
58 help 59 help
59 This selects a driver for the Atmel SPI Controller, present on 60 This selects a driver for the Atmel SPI Controller, present on
60 many AT32 (AVR32) and AT91 (ARM) chips. 61 many AT32 (AVR32) and AT91 (ARM) chips.
61 62
62config SPI_BFIN 63config SPI_BFIN
63 tristate "SPI controller driver for ADI Blackfin5xx" 64 tristate "SPI controller driver for ADI Blackfin5xx"
64 depends on SPI_MASTER && BLACKFIN 65 depends on BLACKFIN
65 help 66 help
66 This is the SPI controller master driver for Blackfin 5xx processor. 67 This is the SPI controller master driver for Blackfin 5xx processor.
67 68
68config SPI_AU1550 69config SPI_AU1550
69 tristate "Au1550/Au12x0 SPI Controller" 70 tristate "Au1550/Au12x0 SPI Controller"
70 depends on SPI_MASTER && (SOC_AU1550 || SOC_AU1200) && EXPERIMENTAL 71 depends on (SOC_AU1550 || SOC_AU1200) && EXPERIMENTAL
71 select SPI_BITBANG 72 select SPI_BITBANG
72 help 73 help
73 If you say yes to this option, support will be included for the 74 If you say yes to this option, support will be included for the
@@ -78,7 +79,6 @@ config SPI_AU1550
78 79
79config SPI_BITBANG 80config SPI_BITBANG
80 tristate "Bitbanging SPI master" 81 tristate "Bitbanging SPI master"
81 depends on SPI_MASTER && EXPERIMENTAL
82 help 82 help
83 With a few GPIO pins, your system can bitbang the SPI protocol. 83 With a few GPIO pins, your system can bitbang the SPI protocol.
84 Select this to get SPI support through I/O pins (GPIO, parallel 84 Select this to get SPI support through I/O pins (GPIO, parallel
@@ -92,7 +92,7 @@ config SPI_BITBANG
92 92
93config SPI_BUTTERFLY 93config SPI_BUTTERFLY
94 tristate "Parallel port adapter for AVR Butterfly (DEVELOPMENT)" 94 tristate "Parallel port adapter for AVR Butterfly (DEVELOPMENT)"
95 depends on SPI_MASTER && PARPORT && EXPERIMENTAL 95 depends on PARPORT
96 select SPI_BITBANG 96 select SPI_BITBANG
97 help 97 help
98 This uses a custom parallel port cable to connect to an AVR 98 This uses a custom parallel port cable to connect to an AVR
@@ -102,14 +102,14 @@ config SPI_BUTTERFLY
102 102
103config SPI_IMX 103config SPI_IMX
104 tristate "Freescale iMX SPI controller" 104 tristate "Freescale iMX SPI controller"
105 depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL 105 depends on ARCH_IMX && EXPERIMENTAL
106 help 106 help
107 This enables using the Freescale iMX SPI controller in master 107 This enables using the Freescale iMX SPI controller in master
108 mode. 108 mode.
109 109
110config SPI_LM70_LLP 110config SPI_LM70_LLP
111 tristate "Parallel port adapter for LM70 eval board (DEVELOPMENT)" 111 tristate "Parallel port adapter for LM70 eval board (DEVELOPMENT)"
112 depends on SPI_MASTER && PARPORT && EXPERIMENTAL 112 depends on PARPORT && EXPERIMENTAL
113 select SPI_BITBANG 113 select SPI_BITBANG
114 help 114 help
115 This driver supports the NS LM70 LLP Evaluation Board, 115 This driver supports the NS LM70 LLP Evaluation Board,
@@ -118,14 +118,14 @@ config SPI_LM70_LLP
118 118
119config SPI_MPC52xx_PSC 119config SPI_MPC52xx_PSC
120 tristate "Freescale MPC52xx PSC SPI controller" 120 tristate "Freescale MPC52xx PSC SPI controller"
121 depends on SPI_MASTER && PPC_MPC52xx && EXPERIMENTAL 121 depends on PPC_MPC52xx && EXPERIMENTAL
122 help 122 help
123 This enables using the Freescale MPC52xx Programmable Serial 123 This enables using the Freescale MPC52xx Programmable Serial
124 Controller in master SPI mode. 124 Controller in master SPI mode.
125 125
126config SPI_MPC83xx 126config SPI_MPC83xx
127 tristate "Freescale MPC83xx/QUICC Engine SPI controller" 127 tristate "Freescale MPC83xx/QUICC Engine SPI controller"
128 depends on SPI_MASTER && (PPC_83xx || QUICC_ENGINE) && EXPERIMENTAL 128 depends on (PPC_83xx || QUICC_ENGINE) && EXPERIMENTAL
129 help 129 help
130 This enables using the Freescale MPC83xx and QUICC Engine SPI 130 This enables using the Freescale MPC83xx and QUICC Engine SPI
131 controllers in master mode. 131 controllers in master mode.
@@ -137,21 +137,21 @@ config SPI_MPC83xx
137 137
138config SPI_OMAP_UWIRE 138config SPI_OMAP_UWIRE
139 tristate "OMAP1 MicroWire" 139 tristate "OMAP1 MicroWire"
140 depends on SPI_MASTER && ARCH_OMAP1 140 depends on ARCH_OMAP1
141 select SPI_BITBANG 141 select SPI_BITBANG
142 help 142 help
143 This hooks up to the MicroWire controller on OMAP1 chips. 143 This hooks up to the MicroWire controller on OMAP1 chips.
144 144
145config SPI_OMAP24XX 145config SPI_OMAP24XX
146 tristate "McSPI driver for OMAP24xx/OMAP34xx" 146 tristate "McSPI driver for OMAP24xx/OMAP34xx"
147 depends on SPI_MASTER && (ARCH_OMAP24XX || ARCH_OMAP34XX) 147 depends on ARCH_OMAP24XX || ARCH_OMAP34XX
148 help 148 help
149 SPI master controller for OMAP24xx/OMAP34xx Multichannel SPI 149 SPI master controller for OMAP24xx/OMAP34xx Multichannel SPI
150 (McSPI) modules. 150 (McSPI) modules.
151 151
152config SPI_PXA2XX 152config SPI_PXA2XX
153 tristate "PXA2xx SSP SPI master" 153 tristate "PXA2xx SSP SPI master"
154 depends on SPI_MASTER && ARCH_PXA && EXPERIMENTAL 154 depends on ARCH_PXA && EXPERIMENTAL
155 select PXA_SSP 155 select PXA_SSP
156 help 156 help
157 This enables using a PXA2xx SSP port as a SPI master controller. 157 This enables using a PXA2xx SSP port as a SPI master controller.
@@ -160,14 +160,14 @@ config SPI_PXA2XX
160 160
161config SPI_S3C24XX 161config SPI_S3C24XX
162 tristate "Samsung S3C24XX series SPI" 162 tristate "Samsung S3C24XX series SPI"
163 depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL 163 depends on ARCH_S3C2410 && EXPERIMENTAL
164 select SPI_BITBANG 164 select SPI_BITBANG
165 help 165 help
166 SPI driver for Samsung S3C24XX series ARM SoCs 166 SPI driver for Samsung S3C24XX series ARM SoCs
167 167
168config SPI_S3C24XX_GPIO 168config SPI_S3C24XX_GPIO
169 tristate "Samsung S3C24XX series SPI by GPIO" 169 tristate "Samsung S3C24XX series SPI by GPIO"
170 depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL 170 depends on ARCH_S3C2410 && EXPERIMENTAL
171 select SPI_BITBANG 171 select SPI_BITBANG
172 help 172 help
173 SPI driver for Samsung S3C24XX series ARM SoCs using 173 SPI driver for Samsung S3C24XX series ARM SoCs using
@@ -177,20 +177,20 @@ config SPI_S3C24XX_GPIO
177 177
178config SPI_SH_SCI 178config SPI_SH_SCI
179 tristate "SuperH SCI SPI controller" 179 tristate "SuperH SCI SPI controller"
180 depends on SPI_MASTER && SUPERH 180 depends on SUPERH
181 select SPI_BITBANG 181 select SPI_BITBANG
182 help 182 help
183 SPI driver for SuperH SCI blocks. 183 SPI driver for SuperH SCI blocks.
184 184
185config SPI_TXX9 185config SPI_TXX9
186 tristate "Toshiba TXx9 SPI controller" 186 tristate "Toshiba TXx9 SPI controller"
187 depends on SPI_MASTER && GENERIC_GPIO && CPU_TX49XX 187 depends on GENERIC_GPIO && CPU_TX49XX
188 help 188 help
189 SPI driver for Toshiba TXx9 MIPS SoCs 189 SPI driver for Toshiba TXx9 MIPS SoCs
190 190
191config SPI_XILINX 191config SPI_XILINX
192 tristate "Xilinx SPI controller" 192 tristate "Xilinx SPI controller"
193 depends on SPI_MASTER && XILINX_VIRTEX && EXPERIMENTAL 193 depends on XILINX_VIRTEX && EXPERIMENTAL
194 select SPI_BITBANG 194 select SPI_BITBANG
195 help 195 help
196 This exposes the SPI controller IP from the Xilinx EDK. 196 This exposes the SPI controller IP from the Xilinx EDK.
@@ -207,11 +207,10 @@ config SPI_XILINX
207# being probably the most widely used ones. 207# being probably the most widely used ones.
208# 208#
209comment "SPI Protocol Masters" 209comment "SPI Protocol Masters"
210 depends on SPI_MASTER
211 210
212config SPI_AT25 211config SPI_AT25
213 tristate "SPI EEPROMs from most vendors" 212 tristate "SPI EEPROMs from most vendors"
214 depends on SPI_MASTER && SYSFS 213 depends on SYSFS
215 help 214 help
216 Enable this driver to get read/write support to most SPI EEPROMs, 215 Enable this driver to get read/write support to most SPI EEPROMs,
217 after you configure the board init code to know about each eeprom 216 after you configure the board init code to know about each eeprom
@@ -222,7 +221,7 @@ config SPI_AT25
222 221
223config SPI_SPIDEV 222config SPI_SPIDEV
224 tristate "User mode SPI device driver support" 223 tristate "User mode SPI device driver support"
225 depends on SPI_MASTER && EXPERIMENTAL 224 depends on EXPERIMENTAL
226 help 225 help
227 This supports user mode SPI protocol drivers. 226 This supports user mode SPI protocol drivers.
228 227
@@ -231,7 +230,7 @@ config SPI_SPIDEV
231 230
232config SPI_TLE62X0 231config SPI_TLE62X0
233 tristate "Infineon TLE62X0 (for power switching)" 232 tristate "Infineon TLE62X0 (for power switching)"
234 depends on SPI_MASTER && SYSFS 233 depends on SYSFS
235 help 234 help
236 SPI driver for Infineon TLE62X0 series line driver chips, 235 SPI driver for Infineon TLE62X0 series line driver chips,
237 such as the TLE6220, TLE6230 and TLE6240. This provides a 236 such as the TLE6220, TLE6230 and TLE6240. This provides a
@@ -242,6 +241,8 @@ config SPI_TLE62X0
242# Add new SPI protocol masters in alphabetical order above this line 241# Add new SPI protocol masters in alphabetical order above this line
243# 242#
244 243
244endif # SPI_MASTER
245
245# (slave support would go here) 246# (slave support would go here)
246 247
247endif # SPI 248endif # SPI
diff --git a/drivers/spi/au1550_spi.c b/drivers/spi/au1550_spi.c
index 072c4a595334..9149689c79d9 100644
--- a/drivers/spi/au1550_spi.c
+++ b/drivers/spi/au1550_spi.c
@@ -26,6 +26,7 @@
26#include <linux/errno.h> 26#include <linux/errno.h>
27#include <linux/device.h> 27#include <linux/device.h>
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/resource.h>
29#include <linux/spi/spi.h> 30#include <linux/spi/spi.h>
30#include <linux/spi/spi_bitbang.h> 31#include <linux/spi/spi_bitbang.h>
31#include <linux/dma-mapping.h> 32#include <linux/dma-mapping.h>
@@ -81,6 +82,7 @@ struct au1550_spi {
81 struct spi_master *master; 82 struct spi_master *master;
82 struct device *dev; 83 struct device *dev;
83 struct au1550_spi_info *pdata; 84 struct au1550_spi_info *pdata;
85 struct resource *ioarea;
84}; 86};
85 87
86 88
@@ -96,6 +98,8 @@ static dbdev_tab_t au1550_spi_mem_dbdev =
96 .dev_intpolarity = 0 98 .dev_intpolarity = 0
97}; 99};
98 100
101static int ddma_memid; /* id to above mem dma device */
102
99static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw); 103static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw);
100 104
101 105
@@ -480,9 +484,13 @@ static irqreturn_t au1550_spi_dma_irq_callback(struct au1550_spi *hw)
480 au1xxx_dbdma_reset(hw->dma_tx_ch); 484 au1xxx_dbdma_reset(hw->dma_tx_ch);
481 au1550_spi_reset_fifos(hw); 485 au1550_spi_reset_fifos(hw);
482 486
483 dev_err(hw->dev, 487 if (evnt == PSC_SPIEVNT_RO)
484 "Unexpected SPI error: event=0x%x stat=0x%x!\n", 488 dev_err(hw->dev,
485 evnt, stat); 489 "dma transfer: receive FIFO overflow!\n");
490 else
491 dev_err(hw->dev,
492 "dma transfer: unexpected SPI error "
493 "(event=0x%x stat=0x%x)!\n", evnt, stat);
486 494
487 complete(&hw->master_done); 495 complete(&hw->master_done);
488 return IRQ_HANDLED; 496 return IRQ_HANDLED;
@@ -592,17 +600,17 @@ static irqreturn_t au1550_spi_pio_irq_callback(struct au1550_spi *hw)
592 600
593 if ((evnt & (PSC_SPIEVNT_MM | PSC_SPIEVNT_RO 601 if ((evnt & (PSC_SPIEVNT_MM | PSC_SPIEVNT_RO
594 | PSC_SPIEVNT_RU | PSC_SPIEVNT_TO 602 | PSC_SPIEVNT_RU | PSC_SPIEVNT_TO
595 | PSC_SPIEVNT_TU | PSC_SPIEVNT_SD)) 603 | PSC_SPIEVNT_SD))
596 != 0) { 604 != 0) {
597 dev_err(hw->dev,
598 "Unexpected SPI error: event=0x%x stat=0x%x!\n",
599 evnt, stat);
600 /* 605 /*
601 * due to an error we consider transfer as done, 606 * due to an error we consider transfer as done,
602 * so mask all events until before next transfer start 607 * so mask all events until before next transfer start
603 */ 608 */
604 au1550_spi_mask_ack_all(hw); 609 au1550_spi_mask_ack_all(hw);
605 au1550_spi_reset_fifos(hw); 610 au1550_spi_reset_fifos(hw);
611 dev_err(hw->dev,
612 "pio transfer: unexpected SPI error "
613 "(event=0x%x stat=0x%x)!\n", evnt, stat);
606 complete(&hw->master_done); 614 complete(&hw->master_done);
607 return IRQ_HANDLED; 615 return IRQ_HANDLED;
608 } 616 }
@@ -616,27 +624,50 @@ static irqreturn_t au1550_spi_pio_irq_callback(struct au1550_spi *hw)
616 stat = hw->regs->psc_spistat; 624 stat = hw->regs->psc_spistat;
617 au_sync(); 625 au_sync();
618 626
619 if ((stat & PSC_SPISTAT_RE) == 0 && hw->rx_count < hw->len) { 627 /*
628 * Take care to not let the Rx FIFO overflow.
629 *
630 * We only write a byte if we have read one at least. Initially,
631 * the write fifo is full, so we should read from the read fifo
632 * first.
633 * In case we miss a word from the read fifo, we should get a
634 * RO event and should back out.
635 */
636 if (!(stat & PSC_SPISTAT_RE) && hw->rx_count < hw->len) {
620 hw->rx_word(hw); 637 hw->rx_word(hw);
621 /* ack the receive request event */
622 hw->regs->psc_spievent = PSC_SPIEVNT_RR;
623 au_sync();
624 busy = 1; 638 busy = 1;
625 }
626 639
627 if ((stat & PSC_SPISTAT_TF) == 0 && hw->tx_count < hw->len) { 640 if (!(stat & PSC_SPISTAT_TF) && hw->tx_count < hw->len)
628 hw->tx_word(hw); 641 hw->tx_word(hw);
629 /* ack the transmit request event */
630 hw->regs->psc_spievent = PSC_SPIEVNT_TR;
631 au_sync();
632 busy = 1;
633 } 642 }
634 } while (busy); 643 } while (busy);
635 644
636 evnt = hw->regs->psc_spievent; 645 hw->regs->psc_spievent = PSC_SPIEVNT_RR | PSC_SPIEVNT_TR;
637 au_sync(); 646 au_sync();
638 647
639 if (hw->rx_count >= hw->len || (evnt & PSC_SPIEVNT_MD) != 0) { 648 /*
649 * Restart the SPI transmission in case of a transmit underflow.
650 * This seems to work despite the notes in the Au1550 data book
651 * of Figure 8-4 with flowchart for SPI master operation:
652 *
653 * """Note 1: An XFR Error Interrupt occurs, unless masked,
654 * for any of the following events: Tx FIFO Underflow,
655 * Rx FIFO Overflow, or Multiple-master Error
656 * Note 2: In case of a Tx Underflow Error, all zeroes are
657 * transmitted."""
658 *
659 * By simply restarting the spi transfer on Tx Underflow Error,
660 * we assume that spi transfer was paused instead of zeroes
661 * transmittion mentioned in the Note 2 of Au1550 data book.
662 */
663 if (evnt & PSC_SPIEVNT_TU) {
664 hw->regs->psc_spievent = PSC_SPIEVNT_TU | PSC_SPIEVNT_MD;
665 au_sync();
666 hw->regs->psc_spipcr = PSC_SPIPCR_MS;
667 au_sync();
668 }
669
670 if (hw->rx_count >= hw->len) {
640 /* transfer completed successfully */ 671 /* transfer completed successfully */
641 au1550_spi_mask_ack_all(hw); 672 au1550_spi_mask_ack_all(hw);
642 complete(&hw->master_done); 673 complete(&hw->master_done);
@@ -725,6 +756,8 @@ static void __init au1550_spi_setup_psc_as_spi(struct au1550_spi *hw)
725 stat = hw->regs->psc_spistat; 756 stat = hw->regs->psc_spistat;
726 au_sync(); 757 au_sync();
727 } while ((stat & PSC_SPISTAT_DR) == 0); 758 } while ((stat & PSC_SPISTAT_DR) == 0);
759
760 au1550_spi_reset_fifos(hw);
728} 761}
729 762
730 763
@@ -732,6 +765,7 @@ static int __init au1550_spi_probe(struct platform_device *pdev)
732{ 765{
733 struct au1550_spi *hw; 766 struct au1550_spi *hw;
734 struct spi_master *master; 767 struct spi_master *master;
768 struct resource *r;
735 int err = 0; 769 int err = 0;
736 770
737 master = spi_alloc_master(&pdev->dev, sizeof(struct au1550_spi)); 771 master = spi_alloc_master(&pdev->dev, sizeof(struct au1550_spi));
@@ -753,76 +787,64 @@ static int __init au1550_spi_probe(struct platform_device *pdev)
753 goto err_no_pdata; 787 goto err_no_pdata;
754 } 788 }
755 789
756 platform_set_drvdata(pdev, hw); 790 r = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
757 791 if (!r) {
758 init_completion(&hw->master_done); 792 dev_err(&pdev->dev, "no IRQ\n");
759 793 err = -ENODEV;
760 hw->bitbang.master = hw->master; 794 goto err_no_iores;
761 hw->bitbang.setup_transfer = au1550_spi_setupxfer; 795 }
762 hw->bitbang.chipselect = au1550_spi_chipsel; 796 hw->irq = r->start;
763 hw->bitbang.master->setup = au1550_spi_setup; 797
764 hw->bitbang.txrx_bufs = au1550_spi_txrx_bufs; 798 hw->usedma = 0;
799 r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
800 if (r) {
801 hw->dma_tx_id = r->start;
802 r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
803 if (r) {
804 hw->dma_rx_id = r->start;
805 if (usedma && ddma_memid) {
806 if (pdev->dev.dma_mask == NULL)
807 dev_warn(&pdev->dev, "no dma mask\n");
808 else
809 hw->usedma = 1;
810 }
811 }
812 }
765 813
766 switch (hw->pdata->bus_num) { 814 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
767 case 0: 815 if (!r) {
768 hw->irq = AU1550_PSC0_INT; 816 dev_err(&pdev->dev, "no mmio resource\n");
769 hw->regs = (volatile psc_spi_t *)PSC0_BASE_ADDR; 817 err = -ENODEV;
770 hw->dma_rx_id = DSCR_CMD0_PSC0_RX; 818 goto err_no_iores;
771 hw->dma_tx_id = DSCR_CMD0_PSC0_TX;
772 break;
773 case 1:
774 hw->irq = AU1550_PSC1_INT;
775 hw->regs = (volatile psc_spi_t *)PSC1_BASE_ADDR;
776 hw->dma_rx_id = DSCR_CMD0_PSC1_RX;
777 hw->dma_tx_id = DSCR_CMD0_PSC1_TX;
778 break;
779 case 2:
780 hw->irq = AU1550_PSC2_INT;
781 hw->regs = (volatile psc_spi_t *)PSC2_BASE_ADDR;
782 hw->dma_rx_id = DSCR_CMD0_PSC2_RX;
783 hw->dma_tx_id = DSCR_CMD0_PSC2_TX;
784 break;
785 case 3:
786 hw->irq = AU1550_PSC3_INT;
787 hw->regs = (volatile psc_spi_t *)PSC3_BASE_ADDR;
788 hw->dma_rx_id = DSCR_CMD0_PSC3_RX;
789 hw->dma_tx_id = DSCR_CMD0_PSC3_TX;
790 break;
791 default:
792 dev_err(&pdev->dev, "Wrong bus_num of SPI\n");
793 err = -ENOENT;
794 goto err_no_pdata;
795 } 819 }
796 820
797 if (request_mem_region((unsigned long)hw->regs, sizeof(psc_spi_t), 821 hw->ioarea = request_mem_region(r->start, sizeof(psc_spi_t),
798 pdev->name) == NULL) { 822 pdev->name);
823 if (!hw->ioarea) {
799 dev_err(&pdev->dev, "Cannot reserve iomem region\n"); 824 dev_err(&pdev->dev, "Cannot reserve iomem region\n");
800 err = -ENXIO; 825 err = -ENXIO;
801 goto err_no_iores; 826 goto err_no_iores;
802 } 827 }
803 828
804 829 hw->regs = (psc_spi_t __iomem *)ioremap(r->start, sizeof(psc_spi_t));
805 if (usedma) { 830 if (!hw->regs) {
806 if (pdev->dev.dma_mask == NULL) 831 dev_err(&pdev->dev, "cannot ioremap\n");
807 dev_warn(&pdev->dev, "no dma mask\n"); 832 err = -ENXIO;
808 else 833 goto err_ioremap;
809 hw->usedma = 1;
810 } 834 }
811 835
812 if (hw->usedma) { 836 platform_set_drvdata(pdev, hw);
813 /* 837
814 * create memory device with 8 bits dev_devwidth 838 init_completion(&hw->master_done);
815 * needed for proper byte ordering to spi fifo 839
816 */ 840 hw->bitbang.master = hw->master;
817 int memid = au1xxx_ddma_add_device(&au1550_spi_mem_dbdev); 841 hw->bitbang.setup_transfer = au1550_spi_setupxfer;
818 if (!memid) { 842 hw->bitbang.chipselect = au1550_spi_chipsel;
819 dev_err(&pdev->dev, 843 hw->bitbang.master->setup = au1550_spi_setup;
820 "Cannot create dma 8 bit mem device\n"); 844 hw->bitbang.txrx_bufs = au1550_spi_txrx_bufs;
821 err = -ENXIO;
822 goto err_dma_add_dev;
823 }
824 845
825 hw->dma_tx_ch = au1xxx_dbdma_chan_alloc(memid, 846 if (hw->usedma) {
847 hw->dma_tx_ch = au1xxx_dbdma_chan_alloc(ddma_memid,
826 hw->dma_tx_id, NULL, (void *)hw); 848 hw->dma_tx_id, NULL, (void *)hw);
827 if (hw->dma_tx_ch == 0) { 849 if (hw->dma_tx_ch == 0) {
828 dev_err(&pdev->dev, 850 dev_err(&pdev->dev,
@@ -841,7 +863,7 @@ static int __init au1550_spi_probe(struct platform_device *pdev)
841 863
842 864
843 hw->dma_rx_ch = au1xxx_dbdma_chan_alloc(hw->dma_rx_id, 865 hw->dma_rx_ch = au1xxx_dbdma_chan_alloc(hw->dma_rx_id,
844 memid, NULL, (void *)hw); 866 ddma_memid, NULL, (void *)hw);
845 if (hw->dma_rx_ch == 0) { 867 if (hw->dma_rx_ch == 0) {
846 dev_err(&pdev->dev, 868 dev_err(&pdev->dev,
847 "Cannot allocate rx dma channel\n"); 869 "Cannot allocate rx dma channel\n");
@@ -874,7 +896,7 @@ static int __init au1550_spi_probe(struct platform_device *pdev)
874 goto err_no_irq; 896 goto err_no_irq;
875 } 897 }
876 898
877 master->bus_num = hw->pdata->bus_num; 899 master->bus_num = pdev->id;
878 master->num_chipselect = hw->pdata->num_chipselect; 900 master->num_chipselect = hw->pdata->num_chipselect;
879 901
880 /* 902 /*
@@ -924,8 +946,11 @@ err_no_txdma_descr:
924 au1xxx_dbdma_chan_free(hw->dma_tx_ch); 946 au1xxx_dbdma_chan_free(hw->dma_tx_ch);
925 947
926err_no_txdma: 948err_no_txdma:
927err_dma_add_dev: 949 iounmap((void __iomem *)hw->regs);
928 release_mem_region((unsigned long)hw->regs, sizeof(psc_spi_t)); 950
951err_ioremap:
952 release_resource(hw->ioarea);
953 kfree(hw->ioarea);
929 954
930err_no_iores: 955err_no_iores:
931err_no_pdata: 956err_no_pdata:
@@ -944,7 +969,9 @@ static int __exit au1550_spi_remove(struct platform_device *pdev)
944 969
945 spi_bitbang_stop(&hw->bitbang); 970 spi_bitbang_stop(&hw->bitbang);
946 free_irq(hw->irq, hw); 971 free_irq(hw->irq, hw);
947 release_mem_region((unsigned long)hw->regs, sizeof(psc_spi_t)); 972 iounmap((void __iomem *)hw->regs);
973 release_resource(hw->ioarea);
974 kfree(hw->ioarea);
948 975
949 if (hw->usedma) { 976 if (hw->usedma) {
950 au1550_spi_dma_rxtmp_free(hw); 977 au1550_spi_dma_rxtmp_free(hw);
@@ -971,12 +998,24 @@ static struct platform_driver au1550_spi_drv = {
971 998
972static int __init au1550_spi_init(void) 999static int __init au1550_spi_init(void)
973{ 1000{
1001 /*
1002 * create memory device with 8 bits dev_devwidth
1003 * needed for proper byte ordering to spi fifo
1004 */
1005 if (usedma) {
1006 ddma_memid = au1xxx_ddma_add_device(&au1550_spi_mem_dbdev);
1007 if (!ddma_memid)
1008 printk(KERN_ERR "au1550-spi: cannot add memory"
1009 "dbdma device\n");
1010 }
974 return platform_driver_probe(&au1550_spi_drv, au1550_spi_probe); 1011 return platform_driver_probe(&au1550_spi_drv, au1550_spi_probe);
975} 1012}
976module_init(au1550_spi_init); 1013module_init(au1550_spi_init);
977 1014
978static void __exit au1550_spi_exit(void) 1015static void __exit au1550_spi_exit(void)
979{ 1016{
1017 if (usedma && ddma_memid)
1018 au1xxx_ddma_del_device(ddma_memid);
980 platform_driver_unregister(&au1550_spi_drv); 1019 platform_driver_unregister(&au1550_spi_drv);
981} 1020}
982module_exit(au1550_spi_exit); 1021module_exit(au1550_spi_exit);
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 1ad12afc6ba0..ecca4a6a6f94 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -218,6 +218,8 @@ struct spi_device *spi_new_device(struct spi_master *master,
218 if (!spi_master_get(master)) 218 if (!spi_master_get(master))
219 return NULL; 219 return NULL;
220 220
221 WARN_ON(strlen(chip->modalias) >= sizeof(proxy->modalias));
222
221 proxy = kzalloc(sizeof *proxy, GFP_KERNEL); 223 proxy = kzalloc(sizeof *proxy, GFP_KERNEL);
222 if (!proxy) { 224 if (!proxy) {
223 dev_err(dev, "can't alloc dev for cs%d\n", 225 dev_err(dev, "can't alloc dev for cs%d\n",
@@ -229,7 +231,7 @@ struct spi_device *spi_new_device(struct spi_master *master,
229 proxy->max_speed_hz = chip->max_speed_hz; 231 proxy->max_speed_hz = chip->max_speed_hz;
230 proxy->mode = chip->mode; 232 proxy->mode = chip->mode;
231 proxy->irq = chip->irq; 233 proxy->irq = chip->irq;
232 proxy->modalias = chip->modalias; 234 strlcpy(proxy->modalias, chip->modalias, sizeof(proxy->modalias));
233 235
234 snprintf(proxy->dev.bus_id, sizeof proxy->dev.bus_id, 236 snprintf(proxy->dev.bus_id, sizeof proxy->dev.bus_id,
235 "%s.%u", master->dev.bus_id, 237 "%s.%u", master->dev.bus_id,
@@ -502,7 +504,7 @@ struct spi_master *spi_busnum_to_master(u16 bus_num)
502 struct device *dev; 504 struct device *dev;
503 struct spi_master *master = NULL; 505 struct spi_master *master = NULL;
504 506
505 dev = class_find_device(&spi_master_class, &bus_num, 507 dev = class_find_device(&spi_master_class, NULL, &bus_num,
506 __spi_master_match); 508 __spi_master_match);
507 if (dev) 509 if (dev)
508 master = container_of(dev, struct spi_master, dev); 510 master = container_of(dev, struct spi_master, dev);
diff --git a/drivers/spi/spi_mpc83xx.c b/drivers/spi/spi_mpc83xx.c
index 6832da6f7109..070c6219e2d6 100644
--- a/drivers/spi/spi_mpc83xx.c
+++ b/drivers/spi/spi_mpc83xx.c
@@ -266,21 +266,24 @@ int mpc83xx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
266 266
267 cs->hw_mode |= SPMODE_LEN(bits_per_word); 267 cs->hw_mode |= SPMODE_LEN(bits_per_word);
268 268
269 if ((mpc83xx_spi->spibrg / hz) >= 64) { 269 if ((mpc83xx_spi->spibrg / hz) > 64) {
270 pm = mpc83xx_spi->spibrg / (hz * 64) - 1; 270 pm = mpc83xx_spi->spibrg / (hz * 64);
271 if (pm > 0x0f) { 271 if (pm > 16) {
272 dev_err(&spi->dev, "Requested speed is too " 272 cs->hw_mode |= SPMODE_DIV16;
273 "low: %d Hz. Will use %d Hz instead.\n", 273 pm /= 16;
274 hz, mpc83xx_spi->spibrg / 1024); 274 if (pm > 16) {
275 pm = 0x0f; 275 dev_err(&spi->dev, "Requested speed is too "
276 "low: %d Hz. Will use %d Hz instead.\n",
277 hz, mpc83xx_spi->spibrg / 1024);
278 pm = 16;
279 }
276 } 280 }
277 cs->hw_mode |= SPMODE_PM(pm) | SPMODE_DIV16; 281 } else
278 } else {
279 pm = mpc83xx_spi->spibrg / (hz * 4); 282 pm = mpc83xx_spi->spibrg / (hz * 4);
280 if (pm) 283 if (pm)
281 pm--; 284 pm--;
282 cs->hw_mode |= SPMODE_PM(pm); 285
283 } 286 cs->hw_mode |= SPMODE_PM(pm);
284 regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); 287 regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode);
285 if (cs->hw_mode != regval) { 288 if (cs->hw_mode != regval) {
286 unsigned long flags; 289 unsigned long flags;
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index ddbe1a5e970e..e5e0cfed5e3b 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -228,7 +228,6 @@ static int spidev_message(struct spidev_data *spidev,
228 * We walk the array of user-provided transfers, using each one 228 * We walk the array of user-provided transfers, using each one
229 * to initialize a kernel version of the same transfer. 229 * to initialize a kernel version of the same transfer.
230 */ 230 */
231 mutex_lock(&spidev->buf_lock);
232 buf = spidev->buffer; 231 buf = spidev->buffer;
233 total = 0; 232 total = 0;
234 for (n = n_xfers, k_tmp = k_xfers, u_tmp = u_xfers; 233 for (n = n_xfers, k_tmp = k_xfers, u_tmp = u_xfers;
@@ -296,14 +295,12 @@ static int spidev_message(struct spidev_data *spidev,
296 status = total; 295 status = total;
297 296
298done: 297done:
299 mutex_unlock(&spidev->buf_lock);
300 kfree(k_xfers); 298 kfree(k_xfers);
301 return status; 299 return status;
302} 300}
303 301
304static int 302static long
305spidev_ioctl(struct inode *inode, struct file *filp, 303spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
306 unsigned int cmd, unsigned long arg)
307{ 304{
308 int err = 0; 305 int err = 0;
309 int retval = 0; 306 int retval = 0;
@@ -341,6 +338,14 @@ spidev_ioctl(struct inode *inode, struct file *filp,
341 if (spi == NULL) 338 if (spi == NULL)
342 return -ESHUTDOWN; 339 return -ESHUTDOWN;
343 340
341 /* use the buffer lock here for triple duty:
342 * - prevent I/O (from us) so calling spi_setup() is safe;
343 * - prevent concurrent SPI_IOC_WR_* from morphing
344 * data fields while SPI_IOC_RD_* reads them;
345 * - SPI_IOC_MESSAGE needs the buffer locked "normally".
346 */
347 mutex_lock(&spidev->buf_lock);
348
344 switch (cmd) { 349 switch (cmd) {
345 /* read requests */ 350 /* read requests */
346 case SPI_IOC_RD_MODE: 351 case SPI_IOC_RD_MODE:
@@ -456,6 +461,8 @@ spidev_ioctl(struct inode *inode, struct file *filp,
456 kfree(ioc); 461 kfree(ioc);
457 break; 462 break;
458 } 463 }
464
465 mutex_unlock(&spidev->buf_lock);
459 spi_dev_put(spi); 466 spi_dev_put(spi);
460 return retval; 467 return retval;
461} 468}
@@ -533,7 +540,7 @@ static struct file_operations spidev_fops = {
533 */ 540 */
534 .write = spidev_write, 541 .write = spidev_write,
535 .read = spidev_read, 542 .read = spidev_read,
536 .ioctl = spidev_ioctl, 543 .unlocked_ioctl = spidev_ioctl,
537 .open = spidev_open, 544 .open = spidev_open,
538 .release = spidev_release, 545 .release = spidev_release,
539}; 546};
@@ -576,7 +583,8 @@ static int spidev_probe(struct spi_device *spi)
576 struct device *dev; 583 struct device *dev;
577 584
578 spidev->devt = MKDEV(SPIDEV_MAJOR, minor); 585 spidev->devt = MKDEV(SPIDEV_MAJOR, minor);
579 dev = device_create(spidev_class, &spi->dev, spidev->devt, 586 dev = device_create_drvdata(spidev_class, &spi->dev,
587 spidev->devt, spidev,
580 "spidev%d.%d", 588 "spidev%d.%d",
581 spi->master->bus_num, spi->chip_select); 589 spi->master->bus_num, spi->chip_select);
582 status = IS_ERR(dev) ? PTR_ERR(dev) : 0; 590 status = IS_ERR(dev) ? PTR_ERR(dev) : 0;
@@ -586,7 +594,6 @@ static int spidev_probe(struct spi_device *spi)
586 } 594 }
587 if (status == 0) { 595 if (status == 0) {
588 set_bit(minor, minors); 596 set_bit(minor, minors);
589 spi_set_drvdata(spi, spidev);
590 list_add(&spidev->device_entry, &device_list); 597 list_add(&spidev->device_entry, &device_list);
591 } 598 }
592 mutex_unlock(&device_list_lock); 599 mutex_unlock(&device_list_lock);
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
index 113a0468ffcb..68d6f4988fb5 100644
--- a/drivers/spi/xilinx_spi.c
+++ b/drivers/spi/xilinx_spi.c
@@ -353,11 +353,12 @@ static int __init xilinx_spi_probe(struct platform_device *dev)
353 goto put_master; 353 goto put_master;
354 } 354 }
355 355
356 xspi->irq = platform_get_irq(dev, 0); 356 ret = platform_get_irq(dev, 0);
357 if (xspi->irq < 0) { 357 if (ret < 0) {
358 ret = -ENXIO; 358 ret = -ENXIO;
359 goto unmap_io; 359 goto unmap_io;
360 } 360 }
361 xspi->irq = ret;
361 362
362 master->bus_num = pdata->bus_num; 363 master->bus_num = pdata->bus_num;
363 master->num_chipselect = pdata->num_chipselect; 364 master->num_chipselect = pdata->num_chipselect;
diff --git a/drivers/uio/Kconfig b/drivers/uio/Kconfig
index a4aaab9c7ddc..2e9079df26b3 100644
--- a/drivers/uio/Kconfig
+++ b/drivers/uio/Kconfig
@@ -15,7 +15,7 @@ if UIO
15 15
16config UIO_CIF 16config UIO_CIF
17 tristate "generic Hilscher CIF Card driver" 17 tristate "generic Hilscher CIF Card driver"
18 depends on UIO && PCI 18 depends on PCI
19 default n 19 default n
20 help 20 help
21 Driver for Hilscher CIF DeviceNet and Profibus cards. This 21 Driver for Hilscher CIF DeviceNet and Profibus cards. This
@@ -26,9 +26,15 @@ config UIO_CIF
26 To compile this driver as a module, choose M here: the module 26 To compile this driver as a module, choose M here: the module
27 will be called uio_cif. 27 will be called uio_cif.
28 28
29config UIO_PDRV
30 tristate "Userspace I/O platform driver"
31 help
32 Generic platform driver for Userspace I/O devices.
33
34 If you don't know what to do here, say N.
35
29config UIO_SMX 36config UIO_SMX
30 tristate "SMX cryptengine UIO interface" 37 tristate "SMX cryptengine UIO interface"
31 depends on UIO
32 default n 38 default n
33 help 39 help
34 Userspace IO interface to the Cryptography engine found on the 40 Userspace IO interface to the Cryptography engine found on the
diff --git a/drivers/uio/Makefile b/drivers/uio/Makefile
index 18c45662431e..e00ce0def1a0 100644
--- a/drivers/uio/Makefile
+++ b/drivers/uio/Makefile
@@ -1,3 +1,4 @@
1obj-$(CONFIG_UIO) += uio.o 1obj-$(CONFIG_UIO) += uio.o
2obj-$(CONFIG_UIO_CIF) += uio_cif.o 2obj-$(CONFIG_UIO_CIF) += uio_cif.o
3obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o
3obj-$(CONFIG_UIO_SMX) += uio_smx.o 4obj-$(CONFIG_UIO_SMX) += uio_smx.o
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 5a7ca2e6094d..3a6934bf7131 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -427,6 +427,31 @@ static ssize_t uio_read(struct file *filep, char __user *buf,
427 return retval; 427 return retval;
428} 428}
429 429
430static ssize_t uio_write(struct file *filep, const char __user *buf,
431 size_t count, loff_t *ppos)
432{
433 struct uio_listener *listener = filep->private_data;
434 struct uio_device *idev = listener->dev;
435 ssize_t retval;
436 s32 irq_on;
437
438 if (idev->info->irq == UIO_IRQ_NONE)
439 return -EIO;
440
441 if (count != sizeof(s32))
442 return -EINVAL;
443
444 if (!idev->info->irqcontrol)
445 return -ENOSYS;
446
447 if (copy_from_user(&irq_on, buf, count))
448 return -EFAULT;
449
450 retval = idev->info->irqcontrol(idev->info, irq_on);
451
452 return retval ? retval : sizeof(s32);
453}
454
430static int uio_find_mem_index(struct vm_area_struct *vma) 455static int uio_find_mem_index(struct vm_area_struct *vma)
431{ 456{
432 int mi; 457 int mi;
@@ -546,6 +571,7 @@ static const struct file_operations uio_fops = {
546 .open = uio_open, 571 .open = uio_open,
547 .release = uio_release, 572 .release = uio_release,
548 .read = uio_read, 573 .read = uio_read,
574 .write = uio_write,
549 .mmap = uio_mmap, 575 .mmap = uio_mmap,
550 .poll = uio_poll, 576 .poll = uio_poll,
551 .fasync = uio_fasync, 577 .fasync = uio_fasync,
diff --git a/drivers/uio/uio_pdrv.c b/drivers/uio/uio_pdrv.c
new file mode 100644
index 000000000000..5d0d2e85d982
--- /dev/null
+++ b/drivers/uio/uio_pdrv.c
@@ -0,0 +1,118 @@
1/*
2 * drivers/uio/uio_pdrv.c
3 *
4 * Copyright (C) 2008 by Digi International Inc.
5 * All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published by
9 * the Free Software Foundation.
10 */
11#include <linux/platform_device.h>
12#include <linux/uio_driver.h>
13#include <linux/stringify.h>
14
15#define DRIVER_NAME "uio"
16
17struct uio_platdata {
18 struct uio_info *uioinfo;
19};
20
21static int uio_pdrv_probe(struct platform_device *pdev)
22{
23 struct uio_info *uioinfo = pdev->dev.platform_data;
24 struct uio_platdata *pdata;
25 struct uio_mem *uiomem;
26 int ret = -ENODEV;
27 int i;
28
29 if (!uioinfo || !uioinfo->name || !uioinfo->version) {
30 dev_dbg(&pdev->dev, "%s: err_uioinfo\n", __func__);
31 goto err_uioinfo;
32 }
33
34 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
35 if (!pdata) {
36 ret = -ENOMEM;
37 dev_dbg(&pdev->dev, "%s: err_alloc_pdata\n", __func__);
38 goto err_alloc_pdata;
39 }
40
41 pdata->uioinfo = uioinfo;
42
43 uiomem = &uioinfo->mem[0];
44
45 for (i = 0; i < pdev->num_resources; ++i) {
46 struct resource *r = &pdev->resource[i];
47
48 if (r->flags != IORESOURCE_MEM)
49 continue;
50
51 if (uiomem >= &uioinfo->mem[MAX_UIO_MAPS]) {
52 dev_warn(&pdev->dev, "device has more than "
53 __stringify(MAX_UIO_MAPS)
54 " I/O memory resources.\n");
55 break;
56 }
57
58 uiomem->memtype = UIO_MEM_PHYS;
59 uiomem->addr = r->start;
60 uiomem->size = r->end - r->start + 1;
61 ++uiomem;
62 }
63
64 while (uiomem < &uioinfo->mem[MAX_UIO_MAPS]) {
65 uiomem->size = 0;
66 ++uiomem;
67 }
68
69 pdata->uioinfo->priv = pdata;
70
71 ret = uio_register_device(&pdev->dev, pdata->uioinfo);
72
73 if (ret) {
74 kfree(pdata);
75err_alloc_pdata:
76err_uioinfo:
77 return ret;
78 }
79
80 platform_set_drvdata(pdev, pdata);
81
82 return 0;
83}
84
85static int uio_pdrv_remove(struct platform_device *pdev)
86{
87 struct uio_platdata *pdata = platform_get_drvdata(pdev);
88
89 uio_unregister_device(pdata->uioinfo);
90
91 return 0;
92}
93
94static struct platform_driver uio_pdrv = {
95 .probe = uio_pdrv_probe,
96 .remove = uio_pdrv_remove,
97 .driver = {
98 .name = DRIVER_NAME,
99 .owner = THIS_MODULE,
100 },
101};
102
103static int __init uio_pdrv_init(void)
104{
105 return platform_driver_register(&uio_pdrv);
106}
107
108static void __exit uio_pdrv_exit(void)
109{
110 platform_driver_unregister(&uio_pdrv);
111}
112module_init(uio_pdrv_init);
113module_exit(uio_pdrv_exit);
114
115MODULE_AUTHOR("Uwe Kleine-Koenig");
116MODULE_DESCRIPTION("Userspace I/O platform driver");
117MODULE_LICENSE("GPL");
118MODULE_ALIAS("platform:" DRIVER_NAME);
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c
index 90583d6a5949..507a9bd0d77c 100644
--- a/drivers/usb/atm/cxacru.c
+++ b/drivers/usb/atm/cxacru.c
@@ -1052,7 +1052,6 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
1052 1052
1053 instance->usbatm = usbatm_instance; 1053 instance->usbatm = usbatm_instance;
1054 instance->modem_type = (struct cxacru_modem_type *) id->driver_info; 1054 instance->modem_type = (struct cxacru_modem_type *) id->driver_info;
1055 memset(instance->card_info, 0, sizeof(instance->card_info));
1056 1055
1057 mutex_init(&instance->poll_state_serialize); 1056 mutex_init(&instance->poll_state_serialize);
1058 instance->poll_state = CXPOLL_STOPPED; 1057 instance->poll_state = CXPOLL_STOPPED;
diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c
index 7d27c9cf3c43..76fce44c2f9a 100644
--- a/drivers/usb/atm/speedtch.c
+++ b/drivers/usb/atm/speedtch.c
@@ -829,7 +829,6 @@ static int speedtch_bind(struct usbatm_data *usbatm,
829 if (use_isoc) { 829 if (use_isoc) {
830 const struct usb_host_interface *desc = data_intf->cur_altsetting; 830 const struct usb_host_interface *desc = data_intf->cur_altsetting;
831 const __u8 target_address = USB_DIR_IN | usbatm->driver->isoc_in; 831 const __u8 target_address = USB_DIR_IN | usbatm->driver->isoc_in;
832 int i;
833 832
834 use_isoc = 0; /* fall back to bulk if endpoint not found */ 833 use_isoc = 0; /* fall back to bulk if endpoint not found */
835 834
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index c3201affa0b6..0725b1871f23 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -159,12 +159,34 @@ static void acm_write_done(struct acm *acm, struct acm_wb *wb)
159 spin_lock_irqsave(&acm->write_lock, flags); 159 spin_lock_irqsave(&acm->write_lock, flags);
160 acm->write_ready = 1; 160 acm->write_ready = 1;
161 wb->use = 0; 161 wb->use = 0;
162 acm->transmitting--;
162 spin_unlock_irqrestore(&acm->write_lock, flags); 163 spin_unlock_irqrestore(&acm->write_lock, flags);
163} 164}
164 165
165/* 166/*
166 * Poke write. 167 * Poke write.
168 *
169 * the caller is responsible for locking
167 */ 170 */
171
172static int acm_start_wb(struct acm *acm, struct acm_wb *wb)
173{
174 int rc;
175
176 acm->transmitting++;
177
178 wb->urb->transfer_buffer = wb->buf;
179 wb->urb->transfer_dma = wb->dmah;
180 wb->urb->transfer_buffer_length = wb->len;
181 wb->urb->dev = acm->dev;
182
183 if ((rc = usb_submit_urb(wb->urb, GFP_ATOMIC)) < 0) {
184 dbg("usb_submit_urb(write bulk) failed: %d", rc);
185 acm_write_done(acm, wb);
186 }
187 return rc;
188}
189
168static int acm_write_start(struct acm *acm, int wbn) 190static int acm_write_start(struct acm *acm, int wbn)
169{ 191{
170 unsigned long flags; 192 unsigned long flags;
@@ -182,26 +204,31 @@ static int acm_write_start(struct acm *acm, int wbn)
182 return 0; /* A white lie */ 204 return 0; /* A white lie */
183 } 205 }
184 206
207 wb = &acm->wb[wbn];
208 if(acm_wb_is_avail(acm) <= 1)
209 acm->write_ready = 0;
210
211 dbg("%s susp_count: %d", __func__, acm->susp_count);
212 if (acm->susp_count) {
213 acm->old_ready = acm->write_ready;
214 acm->delayed_wb = wb;
215 acm->write_ready = 0;
216 schedule_work(&acm->waker);
217 spin_unlock_irqrestore(&acm->write_lock, flags);
218 return 0; /* A white lie */
219 }
220 usb_mark_last_busy(acm->dev);
221
185 if (!acm_wb_is_used(acm, wbn)) { 222 if (!acm_wb_is_used(acm, wbn)) {
186 spin_unlock_irqrestore(&acm->write_lock, flags); 223 spin_unlock_irqrestore(&acm->write_lock, flags);
187 return 0; 224 return 0;
188 } 225 }
189 wb = &acm->wb[wbn];
190 226
191 if(acm_wb_is_avail(acm) <= 1) 227 rc = acm_start_wb(acm, wb);
192 acm->write_ready = 0;
193 spin_unlock_irqrestore(&acm->write_lock, flags); 228 spin_unlock_irqrestore(&acm->write_lock, flags);
194 229
195 wb->urb->transfer_buffer = wb->buf;
196 wb->urb->transfer_dma = wb->dmah;
197 wb->urb->transfer_buffer_length = wb->len;
198 wb->urb->dev = acm->dev;
199
200 if ((rc = usb_submit_urb(wb->urb, GFP_ATOMIC)) < 0) {
201 dbg("usb_submit_urb(write bulk) failed: %d", rc);
202 acm_write_done(acm, wb);
203 }
204 return rc; 230 return rc;
231
205} 232}
206/* 233/*
207 * attributes exported through sysfs 234 * attributes exported through sysfs
@@ -304,6 +331,7 @@ static void acm_ctrl_irq(struct urb *urb)
304 break; 331 break;
305 } 332 }
306exit: 333exit:
334 usb_mark_last_busy(acm->dev);
307 retval = usb_submit_urb (urb, GFP_ATOMIC); 335 retval = usb_submit_urb (urb, GFP_ATOMIC);
308 if (retval) 336 if (retval)
309 err ("%s - usb_submit_urb failed with result %d", 337 err ("%s - usb_submit_urb failed with result %d",
@@ -320,8 +348,11 @@ static void acm_read_bulk(struct urb *urb)
320 348
321 dbg("Entering acm_read_bulk with status %d", status); 349 dbg("Entering acm_read_bulk with status %d", status);
322 350
323 if (!ACM_READY(acm)) 351 if (!ACM_READY(acm)) {
352 dev_dbg(&acm->data->dev, "Aborting, acm not ready");
324 return; 353 return;
354 }
355 usb_mark_last_busy(acm->dev);
325 356
326 if (status) 357 if (status)
327 dev_dbg(&acm->data->dev, "bulk rx status %d\n", status); 358 dev_dbg(&acm->data->dev, "bulk rx status %d\n", status);
@@ -331,6 +362,7 @@ static void acm_read_bulk(struct urb *urb)
331 362
332 if (likely(status == 0)) { 363 if (likely(status == 0)) {
333 spin_lock(&acm->read_lock); 364 spin_lock(&acm->read_lock);
365 acm->processing++;
334 list_add_tail(&rcv->list, &acm->spare_read_urbs); 366 list_add_tail(&rcv->list, &acm->spare_read_urbs);
335 list_add_tail(&buf->list, &acm->filled_read_bufs); 367 list_add_tail(&buf->list, &acm->filled_read_bufs);
336 spin_unlock(&acm->read_lock); 368 spin_unlock(&acm->read_lock);
@@ -343,7 +375,8 @@ static void acm_read_bulk(struct urb *urb)
343 /* nevertheless the tasklet must be kicked unconditionally 375 /* nevertheless the tasklet must be kicked unconditionally
344 so the queue cannot dry up */ 376 so the queue cannot dry up */
345 } 377 }
346 tasklet_schedule(&acm->urb_task); 378 if (likely(!acm->susp_count))
379 tasklet_schedule(&acm->urb_task);
347} 380}
348 381
349static void acm_rx_tasklet(unsigned long _acm) 382static void acm_rx_tasklet(unsigned long _acm)
@@ -354,16 +387,23 @@ static void acm_rx_tasklet(unsigned long _acm)
354 struct acm_ru *rcv; 387 struct acm_ru *rcv;
355 unsigned long flags; 388 unsigned long flags;
356 unsigned char throttled; 389 unsigned char throttled;
390
357 dbg("Entering acm_rx_tasklet"); 391 dbg("Entering acm_rx_tasklet");
358 392
359 if (!ACM_READY(acm)) 393 if (!ACM_READY(acm))
394 {
395 dbg("acm_rx_tasklet: ACM not ready");
360 return; 396 return;
397 }
361 398
362 spin_lock_irqsave(&acm->throttle_lock, flags); 399 spin_lock_irqsave(&acm->throttle_lock, flags);
363 throttled = acm->throttle; 400 throttled = acm->throttle;
364 spin_unlock_irqrestore(&acm->throttle_lock, flags); 401 spin_unlock_irqrestore(&acm->throttle_lock, flags);
365 if (throttled) 402 if (throttled)
403 {
404 dbg("acm_rx_tasklet: throttled");
366 return; 405 return;
406 }
367 407
368next_buffer: 408next_buffer:
369 spin_lock_irqsave(&acm->read_lock, flags); 409 spin_lock_irqsave(&acm->read_lock, flags);
@@ -403,6 +443,7 @@ urbs:
403 while (!list_empty(&acm->spare_read_bufs)) { 443 while (!list_empty(&acm->spare_read_bufs)) {
404 spin_lock_irqsave(&acm->read_lock, flags); 444 spin_lock_irqsave(&acm->read_lock, flags);
405 if (list_empty(&acm->spare_read_urbs)) { 445 if (list_empty(&acm->spare_read_urbs)) {
446 acm->processing = 0;
406 spin_unlock_irqrestore(&acm->read_lock, flags); 447 spin_unlock_irqrestore(&acm->read_lock, flags);
407 return; 448 return;
408 } 449 }
@@ -425,18 +466,23 @@ urbs:
425 rcv->urb->transfer_dma = buf->dma; 466 rcv->urb->transfer_dma = buf->dma;
426 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 467 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
427 468
428 dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf);
429
430 /* This shouldn't kill the driver as unsuccessful URBs are returned to the 469 /* This shouldn't kill the driver as unsuccessful URBs are returned to the
431 free-urbs-pool and resubmited ASAP */ 470 free-urbs-pool and resubmited ASAP */
432 if (usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) { 471 spin_lock_irqsave(&acm->read_lock, flags);
472 if (acm->susp_count || usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) {
433 list_add(&buf->list, &acm->spare_read_bufs); 473 list_add(&buf->list, &acm->spare_read_bufs);
434 spin_lock_irqsave(&acm->read_lock, flags);
435 list_add(&rcv->list, &acm->spare_read_urbs); 474 list_add(&rcv->list, &acm->spare_read_urbs);
475 acm->processing = 0;
436 spin_unlock_irqrestore(&acm->read_lock, flags); 476 spin_unlock_irqrestore(&acm->read_lock, flags);
437 return; 477 return;
478 } else {
479 spin_unlock_irqrestore(&acm->read_lock, flags);
480 dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf);
438 } 481 }
439 } 482 }
483 spin_lock_irqsave(&acm->read_lock, flags);
484 acm->processing = 0;
485 spin_unlock_irqrestore(&acm->read_lock, flags);
440} 486}
441 487
442/* data interface wrote those outgoing bytes */ 488/* data interface wrote those outgoing bytes */
@@ -463,6 +509,27 @@ static void acm_softint(struct work_struct *work)
463 tty_wakeup(acm->tty); 509 tty_wakeup(acm->tty);
464} 510}
465 511
512static void acm_waker(struct work_struct *waker)
513{
514 struct acm *acm = container_of(waker, struct acm, waker);
515 long flags;
516 int rv;
517
518 rv = usb_autopm_get_interface(acm->control);
519 if (rv < 0) {
520 err("Autopm failure in %s", __func__);
521 return;
522 }
523 if (acm->delayed_wb) {
524 acm_start_wb(acm, acm->delayed_wb);
525 acm->delayed_wb = NULL;
526 }
527 spin_lock_irqsave(&acm->write_lock, flags);
528 acm->write_ready = acm->old_ready;
529 spin_unlock_irqrestore(&acm->write_lock, flags);
530 usb_autopm_put_interface(acm->control);
531}
532
466/* 533/*
467 * TTY handlers 534 * TTY handlers
468 */ 535 */
@@ -492,6 +559,8 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
492 559
493 if (usb_autopm_get_interface(acm->control) < 0) 560 if (usb_autopm_get_interface(acm->control) < 0)
494 goto early_bail; 561 goto early_bail;
562 else
563 acm->control->needs_remote_wakeup = 1;
495 564
496 mutex_lock(&acm->mutex); 565 mutex_lock(&acm->mutex);
497 if (acm->used++) { 566 if (acm->used++) {
@@ -509,6 +578,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
509 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) && 578 if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) &&
510 (acm->ctrl_caps & USB_CDC_CAP_LINE)) 579 (acm->ctrl_caps & USB_CDC_CAP_LINE))
511 goto full_bailout; 580 goto full_bailout;
581 usb_autopm_put_interface(acm->control);
512 582
513 INIT_LIST_HEAD(&acm->spare_read_urbs); 583 INIT_LIST_HEAD(&acm->spare_read_urbs);
514 INIT_LIST_HEAD(&acm->spare_read_bufs); 584 INIT_LIST_HEAD(&acm->spare_read_bufs);
@@ -570,12 +640,14 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp)
570 mutex_lock(&open_mutex); 640 mutex_lock(&open_mutex);
571 if (!--acm->used) { 641 if (!--acm->used) {
572 if (acm->dev) { 642 if (acm->dev) {
643 usb_autopm_get_interface(acm->control);
573 acm_set_control(acm, acm->ctrlout = 0); 644 acm_set_control(acm, acm->ctrlout = 0);
574 usb_kill_urb(acm->ctrlurb); 645 usb_kill_urb(acm->ctrlurb);
575 for (i = 0; i < ACM_NW; i++) 646 for (i = 0; i < ACM_NW; i++)
576 usb_kill_urb(acm->wb[i].urb); 647 usb_kill_urb(acm->wb[i].urb);
577 for (i = 0; i < nr; i++) 648 for (i = 0; i < nr; i++)
578 usb_kill_urb(acm->ru[i].urb); 649 usb_kill_urb(acm->ru[i].urb);
650 acm->control->needs_remote_wakeup = 0;
579 usb_autopm_put_interface(acm->control); 651 usb_autopm_put_interface(acm->control);
580 } else 652 } else
581 acm_tty_unregister(acm); 653 acm_tty_unregister(acm);
@@ -660,13 +732,16 @@ static void acm_tty_unthrottle(struct tty_struct *tty)
660 tasklet_schedule(&acm->urb_task); 732 tasklet_schedule(&acm->urb_task);
661} 733}
662 734
663static void acm_tty_break_ctl(struct tty_struct *tty, int state) 735static int acm_tty_break_ctl(struct tty_struct *tty, int state)
664{ 736{
665 struct acm *acm = tty->driver_data; 737 struct acm *acm = tty->driver_data;
738 int retval;
666 if (!ACM_READY(acm)) 739 if (!ACM_READY(acm))
667 return; 740 return -EINVAL;
668 if (acm_send_break(acm, state ? 0xffff : 0)) 741 retval = acm_send_break(acm, state ? 0xffff : 0);
742 if (retval < 0)
669 dbg("send break failed"); 743 dbg("send break failed");
744 return retval;
670} 745}
671 746
672static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file) 747static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file)
@@ -766,7 +841,7 @@ static void acm_tty_set_termios(struct tty_struct *tty, struct ktermios *termios
766 * USB probe and disconnect routines. 841 * USB probe and disconnect routines.
767 */ 842 */
768 843
769/* Little helper: write buffers free */ 844/* Little helpers: write/read buffers free */
770static void acm_write_buffers_free(struct acm *acm) 845static void acm_write_buffers_free(struct acm *acm)
771{ 846{
772 int i; 847 int i;
@@ -777,6 +852,15 @@ static void acm_write_buffers_free(struct acm *acm)
777 } 852 }
778} 853}
779 854
855static void acm_read_buffers_free(struct acm *acm)
856{
857 struct usb_device *usb_dev = interface_to_usbdev(acm->control);
858 int i, n = acm->rx_buflimit;
859
860 for (i = 0; i < n; i++)
861 usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
862}
863
780/* Little helper: write buffers allocate */ 864/* Little helper: write buffers allocate */
781static int acm_write_buffers_alloc(struct acm *acm) 865static int acm_write_buffers_alloc(struct acm *acm)
782{ 866{
@@ -987,6 +1071,7 @@ skip_normal_probe:
987 acm->urb_task.func = acm_rx_tasklet; 1071 acm->urb_task.func = acm_rx_tasklet;
988 acm->urb_task.data = (unsigned long) acm; 1072 acm->urb_task.data = (unsigned long) acm;
989 INIT_WORK(&acm->work, acm_softint); 1073 INIT_WORK(&acm->work, acm_softint);
1074 INIT_WORK(&acm->waker, acm_waker);
990 spin_lock_init(&acm->throttle_lock); 1075 spin_lock_init(&acm->throttle_lock);
991 spin_lock_init(&acm->write_lock); 1076 spin_lock_init(&acm->write_lock);
992 spin_lock_init(&acm->read_lock); 1077 spin_lock_init(&acm->read_lock);
@@ -1098,8 +1183,7 @@ alloc_fail8:
1098 for (i = 0; i < ACM_NW; i++) 1183 for (i = 0; i < ACM_NW; i++)
1099 usb_free_urb(acm->wb[i].urb); 1184 usb_free_urb(acm->wb[i].urb);
1100alloc_fail7: 1185alloc_fail7:
1101 for (i = 0; i < num_rx_buf; i++) 1186 acm_read_buffers_free(acm);
1102 usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
1103 for (i = 0; i < num_rx_buf; i++) 1187 for (i = 0; i < num_rx_buf; i++)
1104 usb_free_urb(acm->ru[i].urb); 1188 usb_free_urb(acm->ru[i].urb);
1105 usb_free_urb(acm->ctrlurb); 1189 usb_free_urb(acm->ctrlurb);
@@ -1116,6 +1200,7 @@ alloc_fail:
1116static void stop_data_traffic(struct acm *acm) 1200static void stop_data_traffic(struct acm *acm)
1117{ 1201{
1118 int i; 1202 int i;
1203 dbg("Entering stop_data_traffic");
1119 1204
1120 tasklet_disable(&acm->urb_task); 1205 tasklet_disable(&acm->urb_task);
1121 1206
@@ -1128,21 +1213,16 @@ static void stop_data_traffic(struct acm *acm)
1128 tasklet_enable(&acm->urb_task); 1213 tasklet_enable(&acm->urb_task);
1129 1214
1130 cancel_work_sync(&acm->work); 1215 cancel_work_sync(&acm->work);
1216 cancel_work_sync(&acm->waker);
1131} 1217}
1132 1218
1133static void acm_disconnect(struct usb_interface *intf) 1219static void acm_disconnect(struct usb_interface *intf)
1134{ 1220{
1135 struct acm *acm = usb_get_intfdata(intf); 1221 struct acm *acm = usb_get_intfdata(intf);
1136 struct usb_device *usb_dev = interface_to_usbdev(intf); 1222 struct usb_device *usb_dev = interface_to_usbdev(intf);
1137 int i;
1138
1139 if (!acm || !acm->dev) {
1140 dbg("disconnect on nonexisting interface");
1141 return;
1142 }
1143 1223
1144 mutex_lock(&open_mutex); 1224 mutex_lock(&open_mutex);
1145 if (!usb_get_intfdata(intf)) { 1225 if (!acm || !acm->dev) {
1146 mutex_unlock(&open_mutex); 1226 mutex_unlock(&open_mutex);
1147 return; 1227 return;
1148 } 1228 }
@@ -1161,10 +1241,10 @@ static void acm_disconnect(struct usb_interface *intf)
1161 1241
1162 acm_write_buffers_free(acm); 1242 acm_write_buffers_free(acm);
1163 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); 1243 usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
1164 for (i = 0; i < acm->rx_buflimit; i++) 1244 acm_read_buffers_free(acm);
1165 usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);
1166 1245
1167 usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : intf); 1246 usb_driver_release_interface(&acm_driver, intf == acm->control ?
1247 acm->data : acm->control);
1168 1248
1169 if (!acm->used) { 1249 if (!acm->used) {
1170 acm_tty_unregister(acm); 1250 acm_tty_unregister(acm);
@@ -1178,11 +1258,31 @@ static void acm_disconnect(struct usb_interface *intf)
1178 tty_hangup(acm->tty); 1258 tty_hangup(acm->tty);
1179} 1259}
1180 1260
1261#ifdef CONFIG_PM
1181static int acm_suspend(struct usb_interface *intf, pm_message_t message) 1262static int acm_suspend(struct usb_interface *intf, pm_message_t message)
1182{ 1263{
1183 struct acm *acm = usb_get_intfdata(intf); 1264 struct acm *acm = usb_get_intfdata(intf);
1265 int cnt;
1266
1267 if (acm->dev->auto_pm) {
1268 int b;
1269
1270 spin_lock_irq(&acm->read_lock);
1271 spin_lock(&acm->write_lock);
1272 b = acm->processing + acm->transmitting;
1273 spin_unlock(&acm->write_lock);
1274 spin_unlock_irq(&acm->read_lock);
1275 if (b)
1276 return -EBUSY;
1277 }
1278
1279 spin_lock_irq(&acm->read_lock);
1280 spin_lock(&acm->write_lock);
1281 cnt = acm->susp_count++;
1282 spin_unlock(&acm->write_lock);
1283 spin_unlock_irq(&acm->read_lock);
1184 1284
1185 if (acm->susp_count++) 1285 if (cnt)
1186 return 0; 1286 return 0;
1187 /* 1287 /*
1188 we treat opened interfaces differently, 1288 we treat opened interfaces differently,
@@ -1201,15 +1301,21 @@ static int acm_resume(struct usb_interface *intf)
1201{ 1301{
1202 struct acm *acm = usb_get_intfdata(intf); 1302 struct acm *acm = usb_get_intfdata(intf);
1203 int rv = 0; 1303 int rv = 0;
1304 int cnt;
1305
1306 spin_lock_irq(&acm->read_lock);
1307 acm->susp_count -= 1;
1308 cnt = acm->susp_count;
1309 spin_unlock_irq(&acm->read_lock);
1204 1310
1205 if (--acm->susp_count) 1311 if (cnt)
1206 return 0; 1312 return 0;
1207 1313
1208 mutex_lock(&acm->mutex); 1314 mutex_lock(&acm->mutex);
1209 if (acm->used) { 1315 if (acm->used) {
1210 rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO); 1316 rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO);
1211 if (rv < 0) 1317 if (rv < 0)
1212 goto err_out; 1318 goto err_out;
1213 1319
1214 tasklet_schedule(&acm->urb_task); 1320 tasklet_schedule(&acm->urb_task);
1215 } 1321 }
@@ -1218,6 +1324,8 @@ err_out:
1218 mutex_unlock(&acm->mutex); 1324 mutex_unlock(&acm->mutex);
1219 return rv; 1325 return rv;
1220} 1326}
1327
1328#endif /* CONFIG_PM */
1221/* 1329/*
1222 * USB driver structure. 1330 * USB driver structure.
1223 */ 1331 */
@@ -1273,10 +1381,14 @@ static struct usb_driver acm_driver = {
1273 .name = "cdc_acm", 1381 .name = "cdc_acm",
1274 .probe = acm_probe, 1382 .probe = acm_probe,
1275 .disconnect = acm_disconnect, 1383 .disconnect = acm_disconnect,
1384#ifdef CONFIG_PM
1276 .suspend = acm_suspend, 1385 .suspend = acm_suspend,
1277 .resume = acm_resume, 1386 .resume = acm_resume,
1387#endif
1278 .id_table = acm_ids, 1388 .id_table = acm_ids,
1389#ifdef CONFIG_PM
1279 .supports_autosuspend = 1, 1390 .supports_autosuspend = 1,
1391#endif
1280}; 1392};
1281 1393
1282/* 1394/*
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h
index 046e064b033a..85c3aaaab7c5 100644
--- a/drivers/usb/class/cdc-acm.h
+++ b/drivers/usb/class/cdc-acm.h
@@ -107,10 +107,14 @@ struct acm {
107 struct list_head filled_read_bufs; 107 struct list_head filled_read_bufs;
108 int write_used; /* number of non-empty write buffers */ 108 int write_used; /* number of non-empty write buffers */
109 int write_ready; /* write urb is not running */ 109 int write_ready; /* write urb is not running */
110 int old_ready;
111 int processing;
112 int transmitting;
110 spinlock_t write_lock; 113 spinlock_t write_lock;
111 struct mutex mutex; 114 struct mutex mutex;
112 struct usb_cdc_line_coding line; /* bits, stop, parity */ 115 struct usb_cdc_line_coding line; /* bits, stop, parity */
113 struct work_struct work; /* work queue entry for line discipline waking up */ 116 struct work_struct work; /* work queue entry for line discipline waking up */
117 struct work_struct waker;
114 struct tasklet_struct urb_task; /* rx processing */ 118 struct tasklet_struct urb_task; /* rx processing */
115 spinlock_t throttle_lock; /* synchronize throtteling and read callback */ 119 spinlock_t throttle_lock; /* synchronize throtteling and read callback */
116 unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ 120 unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */
@@ -123,6 +127,7 @@ struct acm {
123 unsigned char clocal; /* termios CLOCAL */ 127 unsigned char clocal; /* termios CLOCAL */
124 unsigned int ctrl_caps; /* control capabilities from the class specific header */ 128 unsigned int ctrl_caps; /* control capabilities from the class specific header */
125 unsigned int susp_count; /* number of suspended interfaces */ 129 unsigned int susp_count; /* number of suspended interfaces */
130 struct acm_wb *delayed_wb; /* write queued for a device about to be woken */
126}; 131};
127 132
128#define CDC_DATA_INTERFACE_TYPE 0x0a 133#define CDC_DATA_INTERFACE_TYPE 0x0a
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index 731db051070a..7e8e1235e4e5 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -28,8 +28,9 @@
28/* 28/*
29 * Version Information 29 * Version Information
30 */ 30 */
31#define DRIVER_VERSION "v0.02" 31#define DRIVER_VERSION "v0.03"
32#define DRIVER_AUTHOR "Oliver Neukum" 32#define DRIVER_AUTHOR "Oliver Neukum"
33#define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management"
33 34
34static struct usb_device_id wdm_ids[] = { 35static struct usb_device_id wdm_ids[] = {
35 { 36 {
@@ -87,6 +88,7 @@ struct wdm_device {
87 dma_addr_t ihandle; 88 dma_addr_t ihandle;
88 struct mutex wlock; 89 struct mutex wlock;
89 struct mutex rlock; 90 struct mutex rlock;
91 struct mutex plock;
90 wait_queue_head_t wait; 92 wait_queue_head_t wait;
91 struct work_struct rxwork; 93 struct work_struct rxwork;
92 int werr; 94 int werr;
@@ -205,7 +207,7 @@ static void wdm_int_callback(struct urb *urb)
205 req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE; 207 req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
206 req->wValue = 0; 208 req->wValue = 0;
207 req->wIndex = desc->inum; 209 req->wIndex = desc->inum;
208 req->wLength = cpu_to_le16(desc->bMaxPacketSize0); 210 req->wLength = cpu_to_le16(desc->wMaxCommand);
209 211
210 usb_fill_control_urb( 212 usb_fill_control_urb(
211 desc->response, 213 desc->response,
@@ -214,7 +216,7 @@ static void wdm_int_callback(struct urb *urb)
214 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0), 216 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
215 (unsigned char *)req, 217 (unsigned char *)req,
216 desc->inbuf, 218 desc->inbuf,
217 desc->bMaxPacketSize0, 219 desc->wMaxCommand,
218 wdm_in_callback, 220 wdm_in_callback,
219 desc 221 desc
220 ); 222 );
@@ -247,6 +249,7 @@ exit:
247 249
248static void kill_urbs(struct wdm_device *desc) 250static void kill_urbs(struct wdm_device *desc)
249{ 251{
252 /* the order here is essential */
250 usb_kill_urb(desc->command); 253 usb_kill_urb(desc->command);
251 usb_kill_urb(desc->validity); 254 usb_kill_urb(desc->validity);
252 usb_kill_urb(desc->response); 255 usb_kill_urb(desc->response);
@@ -266,7 +269,7 @@ static void cleanup(struct wdm_device *desc)
266 desc->sbuf, 269 desc->sbuf,
267 desc->validity->transfer_dma); 270 desc->validity->transfer_dma);
268 usb_buffer_free(interface_to_usbdev(desc->intf), 271 usb_buffer_free(interface_to_usbdev(desc->intf),
269 desc->wMaxPacketSize, 272 desc->wMaxCommand,
270 desc->inbuf, 273 desc->inbuf,
271 desc->response->transfer_dma); 274 desc->response->transfer_dma);
272 kfree(desc->orq); 275 kfree(desc->orq);
@@ -299,6 +302,9 @@ static ssize_t wdm_write
299 if (r) 302 if (r)
300 goto outnl; 303 goto outnl;
301 304
305 r = usb_autopm_get_interface(desc->intf);
306 if (r < 0)
307 goto outnp;
302 r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, 308 r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
303 &desc->flags)); 309 &desc->flags));
304 if (r < 0) 310 if (r < 0)
@@ -347,11 +353,14 @@ static ssize_t wdm_write
347 if (rv < 0) { 353 if (rv < 0) {
348 kfree(buf); 354 kfree(buf);
349 clear_bit(WDM_IN_USE, &desc->flags); 355 clear_bit(WDM_IN_USE, &desc->flags);
356 err("Tx URB error: %d", rv);
350 } else { 357 } else {
351 dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d", 358 dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
352 req->wIndex); 359 req->wIndex);
353 } 360 }
354out: 361out:
362 usb_autopm_put_interface(desc->intf);
363outnp:
355 mutex_unlock(&desc->wlock); 364 mutex_unlock(&desc->wlock);
356outnl: 365outnl:
357 return rv < 0 ? rv : count; 366 return rv < 0 ? rv : count;
@@ -376,6 +385,11 @@ retry:
376 rv = wait_event_interruptible(desc->wait, 385 rv = wait_event_interruptible(desc->wait,
377 test_bit(WDM_READ, &desc->flags)); 386 test_bit(WDM_READ, &desc->flags));
378 387
388 if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
389 rv = -ENODEV;
390 goto err;
391 }
392 usb_mark_last_busy(interface_to_usbdev(desc->intf));
379 if (rv < 0) { 393 if (rv < 0) {
380 rv = -ERESTARTSYS; 394 rv = -ERESTARTSYS;
381 goto err; 395 goto err;
@@ -418,6 +432,9 @@ retry:
418 desc->ubuf[i] = desc->ubuf[i + cntr]; 432 desc->ubuf[i] = desc->ubuf[i + cntr];
419 433
420 desc->length -= cntr; 434 desc->length -= cntr;
435 /* in case we had outstanding data */
436 if (!desc->length)
437 clear_bit(WDM_READ, &desc->flags);
421 rv = cntr; 438 rv = cntr;
422 439
423err: 440err:
@@ -480,18 +497,28 @@ static int wdm_open(struct inode *inode, struct file *file)
480 if (test_bit(WDM_DISCONNECTING, &desc->flags)) 497 if (test_bit(WDM_DISCONNECTING, &desc->flags))
481 goto out; 498 goto out;
482 499
483 desc->count++; 500 ;
484 file->private_data = desc; 501 file->private_data = desc;
485 502
486 rv = usb_submit_urb(desc->validity, GFP_KERNEL); 503 rv = usb_autopm_get_interface(desc->intf);
487
488 if (rv < 0) { 504 if (rv < 0) {
489 desc->count--; 505 err("Error autopm - %d", rv);
490 err("Error submitting int urb - %d", rv);
491 goto out; 506 goto out;
492 } 507 }
493 rv = 0; 508 intf->needs_remote_wakeup = 1;
494 509
510 mutex_lock(&desc->plock);
511 if (!desc->count++) {
512 rv = usb_submit_urb(desc->validity, GFP_KERNEL);
513 if (rv < 0) {
514 desc->count--;
515 err("Error submitting int urb - %d", rv);
516 }
517 } else {
518 rv = 0;
519 }
520 mutex_unlock(&desc->plock);
521 usb_autopm_put_interface(desc->intf);
495out: 522out:
496 mutex_unlock(&wdm_mutex); 523 mutex_unlock(&wdm_mutex);
497 return rv; 524 return rv;
@@ -502,10 +529,15 @@ static int wdm_release(struct inode *inode, struct file *file)
502 struct wdm_device *desc = file->private_data; 529 struct wdm_device *desc = file->private_data;
503 530
504 mutex_lock(&wdm_mutex); 531 mutex_lock(&wdm_mutex);
532 mutex_lock(&desc->plock);
505 desc->count--; 533 desc->count--;
534 mutex_unlock(&desc->plock);
535
506 if (!desc->count) { 536 if (!desc->count) {
507 dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); 537 dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
508 kill_urbs(desc); 538 kill_urbs(desc);
539 if (!test_bit(WDM_DISCONNECTING, &desc->flags))
540 desc->intf->needs_remote_wakeup = 0;
509 } 541 }
510 mutex_unlock(&wdm_mutex); 542 mutex_unlock(&wdm_mutex);
511 return 0; 543 return 0;
@@ -597,6 +629,7 @@ next_desc:
597 goto out; 629 goto out;
598 mutex_init(&desc->wlock); 630 mutex_init(&desc->wlock);
599 mutex_init(&desc->rlock); 631 mutex_init(&desc->rlock);
632 mutex_init(&desc->plock);
600 spin_lock_init(&desc->iuspin); 633 spin_lock_init(&desc->iuspin);
601 init_waitqueue_head(&desc->wait); 634 init_waitqueue_head(&desc->wait);
602 desc->wMaxCommand = maxcom; 635 desc->wMaxCommand = maxcom;
@@ -698,6 +731,7 @@ static void wdm_disconnect(struct usb_interface *intf)
698 spin_lock_irqsave(&desc->iuspin, flags); 731 spin_lock_irqsave(&desc->iuspin, flags);
699 set_bit(WDM_DISCONNECTING, &desc->flags); 732 set_bit(WDM_DISCONNECTING, &desc->flags);
700 set_bit(WDM_READ, &desc->flags); 733 set_bit(WDM_READ, &desc->flags);
734 /* to terminate pending flushes */
701 clear_bit(WDM_IN_USE, &desc->flags); 735 clear_bit(WDM_IN_USE, &desc->flags);
702 spin_unlock_irqrestore(&desc->iuspin, flags); 736 spin_unlock_irqrestore(&desc->iuspin, flags);
703 cancel_work_sync(&desc->rxwork); 737 cancel_work_sync(&desc->rxwork);
@@ -708,11 +742,81 @@ static void wdm_disconnect(struct usb_interface *intf)
708 mutex_unlock(&wdm_mutex); 742 mutex_unlock(&wdm_mutex);
709} 743}
710 744
745static int wdm_suspend(struct usb_interface *intf, pm_message_t message)
746{
747 struct wdm_device *desc = usb_get_intfdata(intf);
748 int rv = 0;
749
750 dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor);
751
752 mutex_lock(&desc->plock);
753#ifdef CONFIG_PM
754 if (interface_to_usbdev(desc->intf)->auto_pm && test_bit(WDM_IN_USE, &desc->flags)) {
755 rv = -EBUSY;
756 } else {
757#endif
758 cancel_work_sync(&desc->rxwork);
759 kill_urbs(desc);
760#ifdef CONFIG_PM
761 }
762#endif
763 mutex_unlock(&desc->plock);
764
765 return rv;
766}
767
768static int recover_from_urb_loss(struct wdm_device *desc)
769{
770 int rv = 0;
771
772 if (desc->count) {
773 rv = usb_submit_urb(desc->validity, GFP_NOIO);
774 if (rv < 0)
775 err("Error resume submitting int urb - %d", rv);
776 }
777 return rv;
778}
779static int wdm_resume(struct usb_interface *intf)
780{
781 struct wdm_device *desc = usb_get_intfdata(intf);
782 int rv;
783
784 dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor);
785 mutex_lock(&desc->plock);
786 rv = recover_from_urb_loss(desc);
787 mutex_unlock(&desc->plock);
788 return rv;
789}
790
791static int wdm_pre_reset(struct usb_interface *intf)
792{
793 struct wdm_device *desc = usb_get_intfdata(intf);
794
795 mutex_lock(&desc->plock);
796 return 0;
797}
798
799static int wdm_post_reset(struct usb_interface *intf)
800{
801 struct wdm_device *desc = usb_get_intfdata(intf);
802 int rv;
803
804 rv = recover_from_urb_loss(desc);
805 mutex_unlock(&desc->plock);
806 return 0;
807}
808
711static struct usb_driver wdm_driver = { 809static struct usb_driver wdm_driver = {
712 .name = "cdc_wdm", 810 .name = "cdc_wdm",
713 .probe = wdm_probe, 811 .probe = wdm_probe,
714 .disconnect = wdm_disconnect, 812 .disconnect = wdm_disconnect,
813 .suspend = wdm_suspend,
814 .resume = wdm_resume,
815 .reset_resume = wdm_resume,
816 .pre_reset = wdm_pre_reset,
817 .post_reset = wdm_post_reset,
715 .id_table = wdm_ids, 818 .id_table = wdm_ids,
819 .supports_autosuspend = 1,
716}; 820};
717 821
718/* --- low level module stuff --- */ 822/* --- low level module stuff --- */
@@ -735,6 +839,5 @@ module_init(wdm_init);
735module_exit(wdm_exit); 839module_exit(wdm_exit);
736 840
737MODULE_AUTHOR(DRIVER_AUTHOR); 841MODULE_AUTHOR(DRIVER_AUTHOR);
738MODULE_DESCRIPTION("USB Abstract Control Model driver for " 842MODULE_DESCRIPTION(DRIVER_DESC);
739 "USB WCM Device Management");
740MODULE_LICENSE("GPL"); 843MODULE_LICENSE("GPL");
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c
index 83d9dc379d96..6ec38175a817 100644
--- a/drivers/usb/core/devices.c
+++ b/drivers/usb/core/devices.c
@@ -46,8 +46,6 @@
46 * 2000-07-05: Ashley Montanaro <ashley@compsoc.man.ac.uk> 46 * 2000-07-05: Ashley Montanaro <ashley@compsoc.man.ac.uk>
47 * Converted file reading routine to dump to buffer once 47 * Converted file reading routine to dump to buffer once
48 * per device, not per bus 48 * per device, not per bus
49 *
50 * $Id: devices.c,v 1.5 2000/01/11 13:58:21 tom Exp $
51 */ 49 */
52 50
53#include <linux/fs.h> 51#include <linux/fs.h>
@@ -63,8 +61,6 @@
63#include "usb.h" 61#include "usb.h"
64#include "hcd.h" 62#include "hcd.h"
65 63
66#define MAX_TOPO_LEVEL 6
67
68/* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */ 64/* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */
69#define ALLOW_SERIAL_NUMBER 65#define ALLOW_SERIAL_NUMBER
70 66
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index 9218cca21043..20290c5b1562 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -19,8 +19,6 @@
19 * along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * 21 *
22 * $Id: devio.c,v 1.7 2000/02/01 17:28:48 fliegl Exp $
23 *
24 * This file implements the usbfs/x/y files, where 22 * This file implements the usbfs/x/y files, where
25 * x is the bus number and y the device number. 23 * x is the bus number and y the device number.
26 * 24 *
@@ -61,6 +59,22 @@
61/* Mutual exclusion for removal, open, and release */ 59/* Mutual exclusion for removal, open, and release */
62DEFINE_MUTEX(usbfs_mutex); 60DEFINE_MUTEX(usbfs_mutex);
63 61
62struct dev_state {
63 struct list_head list; /* state list */
64 struct usb_device *dev;
65 struct file *file;
66 spinlock_t lock; /* protects the async urb lists */
67 struct list_head async_pending;
68 struct list_head async_completed;
69 wait_queue_head_t wait; /* wake up if a request completed */
70 unsigned int discsignr;
71 struct pid *disc_pid;
72 uid_t disc_uid, disc_euid;
73 void __user *disccontext;
74 unsigned long ifclaimed;
75 u32 secid;
76};
77
64struct async { 78struct async {
65 struct list_head asynclist; 79 struct list_head asynclist;
66 struct dev_state *ps; 80 struct dev_state *ps;
@@ -536,23 +550,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype,
536 return ret; 550 return ret;
537} 551}
538 552
539static int __match_minor(struct device *dev, void *data) 553static int match_devt(struct device *dev, void *data)
540{ 554{
541 int minor = *((int *)data); 555 return dev->devt == (dev_t) (unsigned long) data;
542
543 if (dev->devt == MKDEV(USB_DEVICE_MAJOR, minor))
544 return 1;
545 return 0;
546} 556}
547 557
548static struct usb_device *usbdev_lookup_by_minor(int minor) 558static struct usb_device *usbdev_lookup_by_devt(dev_t devt)
549{ 559{
550 struct device *dev; 560 struct device *dev;
551 561
552 dev = bus_find_device(&usb_bus_type, NULL, &minor, __match_minor); 562 dev = bus_find_device(&usb_bus_type, NULL,
563 (void *) (unsigned long) devt, match_devt);
553 if (!dev) 564 if (!dev)
554 return NULL; 565 return NULL;
555 put_device(dev);
556 return container_of(dev, struct usb_device, dev); 566 return container_of(dev, struct usb_device, dev);
557} 567}
558 568
@@ -575,21 +585,27 @@ static int usbdev_open(struct inode *inode, struct file *file)
575 goto out; 585 goto out;
576 586
577 ret = -ENOENT; 587 ret = -ENOENT;
588
578 /* usbdev device-node */ 589 /* usbdev device-node */
579 if (imajor(inode) == USB_DEVICE_MAJOR) 590 if (imajor(inode) == USB_DEVICE_MAJOR)
580 dev = usbdev_lookup_by_minor(iminor(inode)); 591 dev = usbdev_lookup_by_devt(inode->i_rdev);
581#ifdef CONFIG_USB_DEVICEFS 592#ifdef CONFIG_USB_DEVICEFS
582 /* procfs file */ 593 /* procfs file */
583 if (!dev) 594 if (!dev) {
584 dev = inode->i_private; 595 dev = inode->i_private;
596 if (dev && dev->usbfs_dentry &&
597 dev->usbfs_dentry->d_inode == inode)
598 usb_get_dev(dev);
599 else
600 dev = NULL;
601 }
585#endif 602#endif
586 if (!dev) 603 if (!dev || dev->state == USB_STATE_NOTATTACHED)
587 goto out; 604 goto out;
588 ret = usb_autoresume_device(dev); 605 ret = usb_autoresume_device(dev);
589 if (ret) 606 if (ret)
590 goto out; 607 goto out;
591 608
592 usb_get_dev(dev);
593 ret = 0; 609 ret = 0;
594 ps->dev = dev; 610 ps->dev = dev;
595 ps->file = file; 611 ps->file = file;
@@ -609,8 +625,10 @@ static int usbdev_open(struct inode *inode, struct file *file)
609 list_add_tail(&ps->list, &dev->filelist); 625 list_add_tail(&ps->list, &dev->filelist);
610 file->private_data = ps; 626 file->private_data = ps;
611 out: 627 out:
612 if (ret) 628 if (ret) {
613 kfree(ps); 629 kfree(ps);
630 usb_put_dev(dev);
631 }
614 mutex_unlock(&usbfs_mutex); 632 mutex_unlock(&usbfs_mutex);
615 unlock_kernel(); 633 unlock_kernel();
616 return ret; 634 return ret;
@@ -874,7 +892,7 @@ static int proc_connectinfo(struct dev_state *ps, void __user *arg)
874 892
875static int proc_resetdevice(struct dev_state *ps) 893static int proc_resetdevice(struct dev_state *ps)
876{ 894{
877 return usb_reset_composite_device(ps->dev, NULL); 895 return usb_reset_device(ps->dev);
878} 896}
879 897
880static int proc_setintf(struct dev_state *ps, void __user *arg) 898static int proc_setintf(struct dev_state *ps, void __user *arg)
@@ -1682,25 +1700,49 @@ const struct file_operations usbdev_file_operations = {
1682 .release = usbdev_release, 1700 .release = usbdev_release,
1683}; 1701};
1684 1702
1703void usb_fs_classdev_common_remove(struct usb_device *udev)
1704{
1705 struct dev_state *ps;
1706 struct siginfo sinfo;
1707
1708 while (!list_empty(&udev->filelist)) {
1709 ps = list_entry(udev->filelist.next, struct dev_state, list);
1710 destroy_all_async(ps);
1711 wake_up_all(&ps->wait);
1712 list_del_init(&ps->list);
1713 if (ps->discsignr) {
1714 sinfo.si_signo = ps->discsignr;
1715 sinfo.si_errno = EPIPE;
1716 sinfo.si_code = SI_ASYNCIO;
1717 sinfo.si_addr = ps->disccontext;
1718 kill_pid_info_as_uid(ps->discsignr, &sinfo,
1719 ps->disc_pid, ps->disc_uid,
1720 ps->disc_euid, ps->secid);
1721 }
1722 }
1723}
1724
1685#ifdef CONFIG_USB_DEVICE_CLASS 1725#ifdef CONFIG_USB_DEVICE_CLASS
1686static struct class *usb_classdev_class; 1726static struct class *usb_classdev_class;
1687 1727
1688static int usb_classdev_add(struct usb_device *dev) 1728static int usb_classdev_add(struct usb_device *dev)
1689{ 1729{
1690 int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); 1730 struct device *cldev;
1691 1731
1692 dev->usb_classdev = device_create(usb_classdev_class, &dev->dev, 1732 cldev = device_create_drvdata(usb_classdev_class, &dev->dev,
1693 MKDEV(USB_DEVICE_MAJOR, minor), 1733 dev->dev.devt, NULL, "usbdev%d.%d",
1694 "usbdev%d.%d", dev->bus->busnum, dev->devnum); 1734 dev->bus->busnum, dev->devnum);
1695 if (IS_ERR(dev->usb_classdev)) 1735 if (IS_ERR(cldev))
1696 return PTR_ERR(dev->usb_classdev); 1736 return PTR_ERR(cldev);
1697 1737 dev->usb_classdev = cldev;
1698 return 0; 1738 return 0;
1699} 1739}
1700 1740
1701static void usb_classdev_remove(struct usb_device *dev) 1741static void usb_classdev_remove(struct usb_device *dev)
1702{ 1742{
1703 device_unregister(dev->usb_classdev); 1743 if (dev->usb_classdev)
1744 device_unregister(dev->usb_classdev);
1745 usb_fs_classdev_common_remove(dev);
1704} 1746}
1705 1747
1706static int usb_classdev_notify(struct notifier_block *self, 1748static int usb_classdev_notify(struct notifier_block *self,
@@ -1750,6 +1792,11 @@ int __init usb_devio_init(void)
1750 usb_classdev_class = NULL; 1792 usb_classdev_class = NULL;
1751 goto out; 1793 goto out;
1752 } 1794 }
1795 /* devices of this class shadow the major:minor of their parent
1796 * device, so clear ->dev_kobj to prevent adding duplicate entries
1797 * to /sys/dev
1798 */
1799 usb_classdev_class->dev_kobj = NULL;
1753 1800
1754 usb_register_notify(&usbdev_nb); 1801 usb_register_notify(&usbdev_nb);
1755#endif 1802#endif
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index 1e56f1cfa6dc..ddb54e14a5c5 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -201,6 +201,7 @@ static int usb_probe_interface(struct device *dev)
201 201
202 intf = to_usb_interface(dev); 202 intf = to_usb_interface(dev);
203 udev = interface_to_usbdev(intf); 203 udev = interface_to_usbdev(intf);
204 intf->needs_binding = 0;
204 205
205 if (udev->authorized == 0) { 206 if (udev->authorized == 0) {
206 dev_err(&intf->dev, "Device is not authorized for usage\n"); 207 dev_err(&intf->dev, "Device is not authorized for usage\n");
@@ -257,15 +258,16 @@ static int usb_unbind_interface(struct device *dev)
257 udev = interface_to_usbdev(intf); 258 udev = interface_to_usbdev(intf);
258 error = usb_autoresume_device(udev); 259 error = usb_autoresume_device(udev);
259 260
260 /* release all urbs for this interface */ 261 /* Terminate all URBs for this interface unless the driver
261 usb_disable_interface(interface_to_usbdev(intf), intf); 262 * supports "soft" unbinding.
263 */
264 if (!driver->soft_unbind)
265 usb_disable_interface(udev, intf);
262 266
263 driver->disconnect(intf); 267 driver->disconnect(intf);
264 268
265 /* reset other interface state */ 269 /* reset other interface state */
266 usb_set_interface(interface_to_usbdev(intf), 270 usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
267 intf->altsetting[0].desc.bInterfaceNumber,
268 0);
269 usb_set_intfdata(intf, NULL); 271 usb_set_intfdata(intf, NULL);
270 272
271 intf->condition = USB_INTERFACE_UNBOUND; 273 intf->condition = USB_INTERFACE_UNBOUND;
@@ -310,6 +312,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
310 312
311 dev->driver = &driver->drvwrap.driver; 313 dev->driver = &driver->drvwrap.driver;
312 usb_set_intfdata(iface, priv); 314 usb_set_intfdata(iface, priv);
315 iface->needs_binding = 0;
313 316
314 usb_pm_lock(udev); 317 usb_pm_lock(udev);
315 iface->condition = USB_INTERFACE_BOUND; 318 iface->condition = USB_INTERFACE_BOUND;
@@ -586,7 +589,7 @@ static int usb_uevent(struct device *dev, struct kobj_uevent_env *env)
586 struct usb_device *usb_dev; 589 struct usb_device *usb_dev;
587 590
588 /* driver is often null here; dev_dbg() would oops */ 591 /* driver is often null here; dev_dbg() would oops */
589 pr_debug("usb %s: uevent\n", dev->bus_id); 592 pr_debug("usb %s: uevent\n", dev_name(dev));
590 593
591 if (is_usb_device(dev)) 594 if (is_usb_device(dev))
592 usb_dev = to_usb_device(dev); 595 usb_dev = to_usb_device(dev);
@@ -596,11 +599,11 @@ static int usb_uevent(struct device *dev, struct kobj_uevent_env *env)
596 } 599 }
597 600
598 if (usb_dev->devnum < 0) { 601 if (usb_dev->devnum < 0) {
599 pr_debug("usb %s: already deleted?\n", dev->bus_id); 602 pr_debug("usb %s: already deleted?\n", dev_name(dev));
600 return -ENODEV; 603 return -ENODEV;
601 } 604 }
602 if (!usb_dev->bus) { 605 if (!usb_dev->bus) {
603 pr_debug("usb %s: bus removed?\n", dev->bus_id); 606 pr_debug("usb %s: bus removed?\n", dev_name(dev));
604 return -ENODEV; 607 return -ENODEV;
605 } 608 }
606 609
@@ -771,6 +774,104 @@ void usb_deregister(struct usb_driver *driver)
771} 774}
772EXPORT_SYMBOL_GPL(usb_deregister); 775EXPORT_SYMBOL_GPL(usb_deregister);
773 776
777
778/* Forced unbinding of a USB interface driver, either because
779 * it doesn't support pre_reset/post_reset/reset_resume or
780 * because it doesn't support suspend/resume.
781 *
782 * The caller must hold @intf's device's lock, but not its pm_mutex
783 * and not @intf->dev.sem.
784 */
785void usb_forced_unbind_intf(struct usb_interface *intf)
786{
787 struct usb_driver *driver = to_usb_driver(intf->dev.driver);
788
789 dev_dbg(&intf->dev, "forced unbind\n");
790 usb_driver_release_interface(driver, intf);
791
792 /* Mark the interface for later rebinding */
793 intf->needs_binding = 1;
794}
795
796/* Delayed forced unbinding of a USB interface driver and scan
797 * for rebinding.
798 *
799 * The caller must hold @intf's device's lock, but not its pm_mutex
800 * and not @intf->dev.sem.
801 *
802 * FIXME: The caller must block system sleep transitions.
803 */
804void usb_rebind_intf(struct usb_interface *intf)
805{
806 int rc;
807
808 /* Delayed unbind of an existing driver */
809 if (intf->dev.driver) {
810 struct usb_driver *driver =
811 to_usb_driver(intf->dev.driver);
812
813 dev_dbg(&intf->dev, "forced unbind\n");
814 usb_driver_release_interface(driver, intf);
815 }
816
817 /* Try to rebind the interface */
818 intf->needs_binding = 0;
819 rc = device_attach(&intf->dev);
820 if (rc < 0)
821 dev_warn(&intf->dev, "rebind failed: %d\n", rc);
822}
823
824#define DO_UNBIND 0
825#define DO_REBIND 1
826
827/* Unbind drivers for @udev's interfaces that don't support suspend/resume,
828 * or rebind interfaces that have been unbound, according to @action.
829 *
830 * The caller must hold @udev's device lock.
831 * FIXME: For rebinds, the caller must block system sleep transitions.
832 */
833static void do_unbind_rebind(struct usb_device *udev, int action)
834{
835 struct usb_host_config *config;
836 int i;
837 struct usb_interface *intf;
838 struct usb_driver *drv;
839
840 config = udev->actconfig;
841 if (config) {
842 for (i = 0; i < config->desc.bNumInterfaces; ++i) {
843 intf = config->interface[i];
844 switch (action) {
845 case DO_UNBIND:
846 if (intf->dev.driver) {
847 drv = to_usb_driver(intf->dev.driver);
848 if (!drv->suspend || !drv->resume)
849 usb_forced_unbind_intf(intf);
850 }
851 break;
852 case DO_REBIND:
853 if (intf->needs_binding) {
854
855 /* FIXME: The next line is needed because we are going to probe
856 * the interface, but as far as the PM core is concerned the
857 * interface is still suspended. The problem wouldn't exist
858 * if we could rebind the interface during the interface's own
859 * resume() call, but at the time the usb_device isn't locked!
860 *
861 * The real solution will be to carry this out during the device's
862 * complete() callback. Until that is implemented, we have to
863 * use this hack.
864 */
865// intf->dev.power.sleeping = 0;
866
867 usb_rebind_intf(intf);
868 }
869 break;
870 }
871 }
872 }
873}
874
774#ifdef CONFIG_PM 875#ifdef CONFIG_PM
775 876
776/* Caller has locked udev's pm_mutex */ 877/* Caller has locked udev's pm_mutex */
@@ -805,8 +906,6 @@ static int usb_resume_device(struct usb_device *udev)
805 906
806 if (udev->state == USB_STATE_NOTATTACHED) 907 if (udev->state == USB_STATE_NOTATTACHED)
807 goto done; 908 goto done;
808 if (udev->state != USB_STATE_SUSPENDED && !udev->reset_resume)
809 goto done;
810 909
811 /* Can't resume it if it doesn't have a driver. */ 910 /* Can't resume it if it doesn't have a driver. */
812 if (udev->dev.driver == NULL) { 911 if (udev->dev.driver == NULL) {
@@ -842,7 +941,7 @@ static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg)
842 goto done; 941 goto done;
843 driver = to_usb_driver(intf->dev.driver); 942 driver = to_usb_driver(intf->dev.driver);
844 943
845 if (driver->suspend && driver->resume) { 944 if (driver->suspend) {
846 status = driver->suspend(intf, msg); 945 status = driver->suspend(intf, msg);
847 if (status == 0) 946 if (status == 0)
848 mark_quiesced(intf); 947 mark_quiesced(intf);
@@ -850,12 +949,10 @@ static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg)
850 dev_err(&intf->dev, "%s error %d\n", 949 dev_err(&intf->dev, "%s error %d\n",
851 "suspend", status); 950 "suspend", status);
852 } else { 951 } else {
853 /* 952 /* Later we will unbind the driver and reprobe */
854 * FIXME else if there's no suspend method, disconnect... 953 intf->needs_binding = 1;
855 * Not possible if auto_pm is set... 954 dev_warn(&intf->dev, "no %s for driver %s?\n",
856 */ 955 "suspend", driver->name);
857 dev_warn(&intf->dev, "no suspend for driver %s?\n",
858 driver->name);
859 mark_quiesced(intf); 956 mark_quiesced(intf);
860 } 957 }
861 958
@@ -879,10 +976,12 @@ static int usb_resume_interface(struct usb_interface *intf, int reset_resume)
879 goto done; 976 goto done;
880 977
881 /* Can't resume it if it doesn't have a driver. */ 978 /* Can't resume it if it doesn't have a driver. */
882 if (intf->condition == USB_INTERFACE_UNBOUND) { 979 if (intf->condition == USB_INTERFACE_UNBOUND)
883 status = -ENOTCONN; 980 goto done;
981
982 /* Don't resume if the interface is marked for rebinding */
983 if (intf->needs_binding)
884 goto done; 984 goto done;
885 }
886 driver = to_usb_driver(intf->dev.driver); 985 driver = to_usb_driver(intf->dev.driver);
887 986
888 if (reset_resume) { 987 if (reset_resume) {
@@ -892,7 +991,7 @@ static int usb_resume_interface(struct usb_interface *intf, int reset_resume)
892 dev_err(&intf->dev, "%s error %d\n", 991 dev_err(&intf->dev, "%s error %d\n",
893 "reset_resume", status); 992 "reset_resume", status);
894 } else { 993 } else {
895 /* status = -EOPNOTSUPP; */ 994 intf->needs_binding = 1;
896 dev_warn(&intf->dev, "no %s for driver %s?\n", 995 dev_warn(&intf->dev, "no %s for driver %s?\n",
897 "reset_resume", driver->name); 996 "reset_resume", driver->name);
898 } 997 }
@@ -903,7 +1002,7 @@ static int usb_resume_interface(struct usb_interface *intf, int reset_resume)
903 dev_err(&intf->dev, "%s error %d\n", 1002 dev_err(&intf->dev, "%s error %d\n",
904 "resume", status); 1003 "resume", status);
905 } else { 1004 } else {
906 /* status = -EOPNOTSUPP; */ 1005 intf->needs_binding = 1;
907 dev_warn(&intf->dev, "no %s for driver %s?\n", 1006 dev_warn(&intf->dev, "no %s for driver %s?\n",
908 "resume", driver->name); 1007 "resume", driver->name);
909 } 1008 }
@@ -911,11 +1010,10 @@ static int usb_resume_interface(struct usb_interface *intf, int reset_resume)
911 1010
912done: 1011done:
913 dev_vdbg(&intf->dev, "%s: status %d\n", __func__, status); 1012 dev_vdbg(&intf->dev, "%s: status %d\n", __func__, status);
914 if (status == 0) 1013 if (status == 0 && intf->condition == USB_INTERFACE_BOUND)
915 mark_active(intf); 1014 mark_active(intf);
916 1015
917 /* FIXME: Unbind the driver and reprobe if the resume failed 1016 /* Later we will unbind the driver and/or reprobe, if necessary */
918 * (not possible if auto_pm is set) */
919 return status; 1017 return status;
920} 1018}
921 1019
@@ -1173,11 +1271,8 @@ static int usb_resume_both(struct usb_device *udev)
1173 * then we're stuck. */ 1271 * then we're stuck. */
1174 status = usb_resume_device(udev); 1272 status = usb_resume_device(udev);
1175 } 1273 }
1176 } else { 1274 } else if (udev->reset_resume)
1177
1178 /* Needed for reset-resume */
1179 status = usb_resume_device(udev); 1275 status = usb_resume_device(udev);
1180 }
1181 1276
1182 if (status == 0 && udev->actconfig) { 1277 if (status == 0 && udev->actconfig) {
1183 for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { 1278 for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
@@ -1474,6 +1569,7 @@ int usb_external_suspend_device(struct usb_device *udev, pm_message_t msg)
1474{ 1569{
1475 int status; 1570 int status;
1476 1571
1572 do_unbind_rebind(udev, DO_UNBIND);
1477 usb_pm_lock(udev); 1573 usb_pm_lock(udev);
1478 udev->auto_pm = 0; 1574 udev->auto_pm = 0;
1479 status = usb_suspend_both(udev, msg); 1575 status = usb_suspend_both(udev, msg);
@@ -1501,6 +1597,7 @@ int usb_external_resume_device(struct usb_device *udev)
1501 status = usb_resume_both(udev); 1597 status = usb_resume_both(udev);
1502 udev->last_busy = jiffies; 1598 udev->last_busy = jiffies;
1503 usb_pm_unlock(udev); 1599 usb_pm_unlock(udev);
1600 do_unbind_rebind(udev, DO_REBIND);
1504 1601
1505 /* Now that the device is awake, we can start trying to autosuspend 1602 /* Now that the device is awake, we can start trying to autosuspend
1506 * it again. */ 1603 * it again. */
@@ -1542,14 +1639,11 @@ static int usb_resume(struct device *dev)
1542 udev = to_usb_device(dev); 1639 udev = to_usb_device(dev);
1543 1640
1544 /* If udev->skip_sys_resume is set then udev was already suspended 1641 /* If udev->skip_sys_resume is set then udev was already suspended
1545 * when the system suspend started, so we don't want to resume 1642 * when the system sleep started, so we don't want to resume it
1546 * udev during this system wakeup. However a reset-resume counts 1643 * during this system wakeup.
1547 * as a wakeup event, so allow a reset-resume to occur if remote 1644 */
1548 * wakeup is enabled. */ 1645 if (udev->skip_sys_resume)
1549 if (udev->skip_sys_resume) { 1646 return 0;
1550 if (!(udev->reset_resume && udev->do_remote_wakeup))
1551 return -EHOSTUNREACH;
1552 }
1553 return usb_external_resume_device(udev); 1647 return usb_external_resume_device(udev);
1554} 1648}
1555 1649
diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c
index fae55a31e26d..22912136fc14 100644
--- a/drivers/usb/core/endpoint.c
+++ b/drivers/usb/core/endpoint.c
@@ -296,7 +296,7 @@ int usb_create_ep_files(struct device *parent,
296 retval = endpoint_get_minor(ep_dev); 296 retval = endpoint_get_minor(ep_dev);
297 if (retval) { 297 if (retval) {
298 dev_err(parent, "can not allocate minor number for %s\n", 298 dev_err(parent, "can not allocate minor number for %s\n",
299 ep_dev->dev.bus_id); 299 dev_name(&ep_dev->dev));
300 goto error_register; 300 goto error_register;
301 } 301 }
302 302
@@ -307,7 +307,7 @@ int usb_create_ep_files(struct device *parent,
307 ep_dev->dev.class = ep_class->class; 307 ep_dev->dev.class = ep_class->class;
308 ep_dev->dev.parent = parent; 308 ep_dev->dev.parent = parent;
309 ep_dev->dev.release = ep_device_release; 309 ep_dev->dev.release = ep_device_release;
310 snprintf(ep_dev->dev.bus_id, BUS_ID_SIZE, "usbdev%d.%d_ep%02x", 310 dev_set_name(&ep_dev->dev, "usbdev%d.%d_ep%02x",
311 udev->bus->busnum, udev->devnum, 311 udev->bus->busnum, udev->devnum,
312 endpoint->desc.bEndpointAddress); 312 endpoint->desc.bEndpointAddress);
313 313
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c
index c6a95395e52a..6b1b229e38cd 100644
--- a/drivers/usb/core/file.c
+++ b/drivers/usb/core/file.c
@@ -150,7 +150,7 @@ int usb_register_dev(struct usb_interface *intf,
150 int retval = -EINVAL; 150 int retval = -EINVAL;
151 int minor_base = class_driver->minor_base; 151 int minor_base = class_driver->minor_base;
152 int minor = 0; 152 int minor = 0;
153 char name[BUS_ID_SIZE]; 153 char name[20];
154 char *temp; 154 char *temp;
155 155
156#ifdef CONFIG_USB_DYNAMIC_MINORS 156#ifdef CONFIG_USB_DYNAMIC_MINORS
@@ -190,14 +190,15 @@ int usb_register_dev(struct usb_interface *intf,
190 intf->minor = minor; 190 intf->minor = minor;
191 191
192 /* create a usb class device for this usb interface */ 192 /* create a usb class device for this usb interface */
193 snprintf(name, BUS_ID_SIZE, class_driver->name, minor - minor_base); 193 snprintf(name, sizeof(name), class_driver->name, minor - minor_base);
194 temp = strrchr(name, '/'); 194 temp = strrchr(name, '/');
195 if (temp && (temp[1] != 0x00)) 195 if (temp && (temp[1] != '\0'))
196 ++temp; 196 ++temp;
197 else 197 else
198 temp = name; 198 temp = name;
199 intf->usb_dev = device_create(usb_class->class, &intf->dev, 199 intf->usb_dev = device_create_drvdata(usb_class->class, &intf->dev,
200 MKDEV(USB_MAJOR, minor), "%s", temp); 200 MKDEV(USB_MAJOR, minor), NULL,
201 "%s", temp);
201 if (IS_ERR(intf->usb_dev)) { 202 if (IS_ERR(intf->usb_dev)) {
202 down_write(&minor_rwsem); 203 down_write(&minor_rwsem);
203 usb_minors[intf->minor] = NULL; 204 usb_minors[intf->minor] = NULL;
@@ -227,7 +228,7 @@ void usb_deregister_dev(struct usb_interface *intf,
227 struct usb_class_driver *class_driver) 228 struct usb_class_driver *class_driver)
228{ 229{
229 int minor_base = class_driver->minor_base; 230 int minor_base = class_driver->minor_base;
230 char name[BUS_ID_SIZE]; 231 char name[20];
231 232
232#ifdef CONFIG_USB_DYNAMIC_MINORS 233#ifdef CONFIG_USB_DYNAMIC_MINORS
233 minor_base = 0; 234 minor_base = 0;
@@ -242,7 +243,7 @@ void usb_deregister_dev(struct usb_interface *intf,
242 usb_minors[intf->minor] = NULL; 243 usb_minors[intf->minor] = NULL;
243 up_write(&minor_rwsem); 244 up_write(&minor_rwsem);
244 245
245 snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base); 246 snprintf(name, sizeof(name), class_driver->name, intf->minor - minor_base);
246 device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); 247 device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
247 intf->usb_dev = NULL; 248 intf->usb_dev = NULL;
248 intf->minor = -1; 249 intf->minor = -1;
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 42a436478b78..f7bfd72ef115 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -900,14 +900,14 @@ static int register_root_hub(struct usb_hcd *hcd)
900 if (retval != sizeof usb_dev->descriptor) { 900 if (retval != sizeof usb_dev->descriptor) {
901 mutex_unlock(&usb_bus_list_lock); 901 mutex_unlock(&usb_bus_list_lock);
902 dev_dbg (parent_dev, "can't read %s device descriptor %d\n", 902 dev_dbg (parent_dev, "can't read %s device descriptor %d\n",
903 usb_dev->dev.bus_id, retval); 903 dev_name(&usb_dev->dev), retval);
904 return (retval < 0) ? retval : -EMSGSIZE; 904 return (retval < 0) ? retval : -EMSGSIZE;
905 } 905 }
906 906
907 retval = usb_new_device (usb_dev); 907 retval = usb_new_device (usb_dev);
908 if (retval) { 908 if (retval) {
909 dev_err (parent_dev, "can't register root hub for %s, %d\n", 909 dev_err (parent_dev, "can't register root hub for %s, %d\n",
910 usb_dev->dev.bus_id, retval); 910 dev_name(&usb_dev->dev), retval);
911 } 911 }
912 mutex_unlock(&usb_bus_list_lock); 912 mutex_unlock(&usb_bus_list_lock);
913 913
@@ -1764,7 +1764,7 @@ EXPORT_SYMBOL_GPL (usb_hc_died);
1764 * If memory is unavailable, returns NULL. 1764 * If memory is unavailable, returns NULL.
1765 */ 1765 */
1766struct usb_hcd *usb_create_hcd (const struct hc_driver *driver, 1766struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,
1767 struct device *dev, char *bus_name) 1767 struct device *dev, const char *bus_name)
1768{ 1768{
1769 struct usb_hcd *hcd; 1769 struct usb_hcd *hcd;
1770 1770
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
index b9de1569b39e..5b0b59b0d89b 100644
--- a/drivers/usb/core/hcd.h
+++ b/drivers/usb/core/hcd.h
@@ -21,6 +21,8 @@
21 21
22#include <linux/rwsem.h> 22#include <linux/rwsem.h>
23 23
24#define MAX_TOPO_LEVEL 6
25
24/* This file contains declarations of usbcore internals that are mostly 26/* This file contains declarations of usbcore internals that are mostly
25 * used or exposed by Host Controller Drivers. 27 * used or exposed by Host Controller Drivers.
26 */ 28 */
@@ -235,7 +237,7 @@ extern void usb_hcd_disable_endpoint(struct usb_device *udev,
235extern int usb_hcd_get_frame_number(struct usb_device *udev); 237extern int usb_hcd_get_frame_number(struct usb_device *udev);
236 238
237extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, 239extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
238 struct device *dev, char *bus_name); 240 struct device *dev, const char *bus_name);
239extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd); 241extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd);
240extern void usb_put_hcd(struct usb_hcd *hcd); 242extern void usb_put_hcd(struct usb_hcd *hcd);
241extern int usb_add_hcd(struct usb_hcd *hcd, 243extern int usb_add_hcd(struct usb_hcd *hcd,
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 4cfe32a16c37..107e1d25ddec 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -72,7 +72,6 @@ struct usb_hub {
72 72
73 unsigned limited_power:1; 73 unsigned limited_power:1;
74 unsigned quiescing:1; 74 unsigned quiescing:1;
75 unsigned activating:1;
76 unsigned disconnected:1; 75 unsigned disconnected:1;
77 76
78 unsigned has_indicators:1; 77 unsigned has_indicators:1;
@@ -131,6 +130,12 @@ MODULE_PARM_DESC(use_both_schemes,
131DECLARE_RWSEM(ehci_cf_port_reset_rwsem); 130DECLARE_RWSEM(ehci_cf_port_reset_rwsem);
132EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem); 131EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
133 132
133#define HUB_DEBOUNCE_TIMEOUT 1500
134#define HUB_DEBOUNCE_STEP 25
135#define HUB_DEBOUNCE_STABLE 100
136
137
138static int usb_reset_and_verify_device(struct usb_device *udev);
134 139
135static inline char *portspeed(int portstatus) 140static inline char *portspeed(int portstatus)
136{ 141{
@@ -535,37 +540,6 @@ static void hub_power_on(struct usb_hub *hub)
535 msleep(max(pgood_delay, (unsigned) 100)); 540 msleep(max(pgood_delay, (unsigned) 100));
536} 541}
537 542
538static void hub_quiesce(struct usb_hub *hub)
539{
540 /* (nonblocking) khubd and related activity won't re-trigger */
541 hub->quiescing = 1;
542 hub->activating = 0;
543
544 /* (blocking) stop khubd and related activity */
545 usb_kill_urb(hub->urb);
546 if (hub->has_indicators)
547 cancel_delayed_work_sync(&hub->leds);
548 if (hub->tt.hub)
549 cancel_work_sync(&hub->tt.kevent);
550}
551
552static void hub_activate(struct usb_hub *hub)
553{
554 int status;
555
556 hub->quiescing = 0;
557 hub->activating = 1;
558
559 status = usb_submit_urb(hub->urb, GFP_NOIO);
560 if (status < 0)
561 dev_err(hub->intfdev, "activate --> %d\n", status);
562 if (hub->has_indicators && blinkenlights)
563 schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD);
564
565 /* scan all ports ASAP */
566 kick_khubd(hub);
567}
568
569static int hub_hub_status(struct usb_hub *hub, 543static int hub_hub_status(struct usb_hub *hub,
570 u16 *status, u16 *change) 544 u16 *status, u16 *change)
571{ 545{
@@ -624,136 +598,149 @@ static void hub_port_logical_disconnect(struct usb_hub *hub, int port1)
624 kick_khubd(hub); 598 kick_khubd(hub);
625} 599}
626 600
627/* caller has locked the hub device */ 601enum hub_activation_type {
628static void hub_stop(struct usb_hub *hub) 602 HUB_INIT, HUB_POST_RESET, HUB_RESUME, HUB_RESET_RESUME
603};
604
605static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
629{ 606{
630 struct usb_device *hdev = hub->hdev; 607 struct usb_device *hdev = hub->hdev;
631 int i; 608 int port1;
609 int status;
610 bool need_debounce_delay = false;
632 611
633 /* Disconnect all the children */ 612 /* After a resume, port power should still be on.
634 for (i = 0; i < hdev->maxchild; ++i) { 613 * For any other type of activation, turn it on.
635 if (hdev->children[i]) 614 */
636 usb_disconnect(&hdev->children[i]); 615 if (type != HUB_RESUME)
637 } 616 hub_power_on(hub);
638 hub_quiesce(hub);
639}
640 617
641#define HUB_RESET 1 618 /* Check each port and set hub->change_bits to let khubd know
642#define HUB_RESUME 2 619 * which ports need attention.
643#define HUB_RESET_RESUME 3 620 */
621 for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
622 struct usb_device *udev = hdev->children[port1-1];
623 u16 portstatus, portchange;
644 624
645#ifdef CONFIG_PM 625 portstatus = portchange = 0;
626 status = hub_port_status(hub, port1, &portstatus, &portchange);
627 if (udev || (portstatus & USB_PORT_STAT_CONNECTION))
628 dev_dbg(hub->intfdev,
629 "port %d: status %04x change %04x\n",
630 port1, portstatus, portchange);
646 631
647/* Try to identify which devices need USB-PERSIST handling */ 632 /* After anything other than HUB_RESUME (i.e., initialization
648static int persistent_device(struct usb_device *udev) 633 * or any sort of reset), every port should be disabled.
649{ 634 * Unconnected ports should likewise be disabled (paranoia),
650 int i; 635 * and so should ports for which we have no usb_device.
651 int retval; 636 */
652 struct usb_host_config *actconfig; 637 if ((portstatus & USB_PORT_STAT_ENABLE) && (
638 type != HUB_RESUME ||
639 !(portstatus & USB_PORT_STAT_CONNECTION) ||
640 !udev ||
641 udev->state == USB_STATE_NOTATTACHED)) {
642 clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);
643 portstatus &= ~USB_PORT_STAT_ENABLE;
644 }
653 645
654 /* Explicitly not marked persistent? */ 646 /* Clear status-change flags; we'll debounce later */
655 if (!udev->persist_enabled) 647 if (portchange & USB_PORT_STAT_C_CONNECTION) {
656 return 0; 648 need_debounce_delay = true;
649 clear_port_feature(hub->hdev, port1,
650 USB_PORT_FEAT_C_CONNECTION);
651 }
652 if (portchange & USB_PORT_STAT_C_ENABLE) {
653 need_debounce_delay = true;
654 clear_port_feature(hub->hdev, port1,
655 USB_PORT_FEAT_C_ENABLE);
656 }
657 657
658 /* No active config? */ 658 if (!udev || udev->state == USB_STATE_NOTATTACHED) {
659 actconfig = udev->actconfig; 659 /* Tell khubd to disconnect the device or
660 if (!actconfig) 660 * check for a new connection
661 return 0; 661 */
662 if (udev || (portstatus & USB_PORT_STAT_CONNECTION))
663 set_bit(port1, hub->change_bits);
664
665 } else if (portstatus & USB_PORT_STAT_ENABLE) {
666 /* The power session apparently survived the resume.
667 * If there was an overcurrent or suspend change
668 * (i.e., remote wakeup request), have khubd
669 * take care of it.
670 */
671 if (portchange)
672 set_bit(port1, hub->change_bits);
662 673
663 /* FIXME! We should check whether it's open here or not! */ 674 } else if (udev->persist_enabled) {
675#ifdef CONFIG_PM
676 udev->reset_resume = 1;
677#endif
678 set_bit(port1, hub->change_bits);
664 679
665 /* 680 } else {
666 * Check that all the interface drivers have a 681 /* The power session is gone; tell khubd */
667 * 'reset_resume' entrypoint 682 usb_set_device_state(udev, USB_STATE_NOTATTACHED);
683 set_bit(port1, hub->change_bits);
684 }
685 }
686
687 /* If no port-status-change flags were set, we don't need any
688 * debouncing. If flags were set we can try to debounce the
689 * ports all at once right now, instead of letting khubd do them
690 * one at a time later on.
691 *
692 * If any port-status changes do occur during this delay, khubd
693 * will see them later and handle them normally.
668 */ 694 */
669 retval = 0; 695 if (need_debounce_delay)
670 for (i = 0; i < actconfig->desc.bNumInterfaces; i++) { 696 msleep(HUB_DEBOUNCE_STABLE);
671 struct usb_interface *intf;
672 struct usb_driver *driver;
673 697
674 intf = actconfig->interface[i]; 698 hub->quiescing = 0;
675 if (!intf->dev.driver)
676 continue;
677 driver = to_usb_driver(intf->dev.driver);
678 if (!driver->reset_resume)
679 return 0;
680 /*
681 * We have at least one driver, and that one
682 * has a reset_resume method.
683 */
684 retval = 1;
685 }
686 return retval;
687}
688 699
689static void hub_restart(struct usb_hub *hub, int type) 700 status = usb_submit_urb(hub->urb, GFP_NOIO);
690{ 701 if (status < 0)
691 struct usb_device *hdev = hub->hdev; 702 dev_err(hub->intfdev, "activate --> %d\n", status);
692 int port1; 703 if (hub->has_indicators && blinkenlights)
704 schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD);
693 705
694 /* Check each of the children to see if they require 706 /* Scan all ports that need attention */
695 * USB-PERSIST handling or disconnection. Also check 707 kick_khubd(hub);
696 * each unoccupied port to make sure it is still disabled. 708}
697 */
698 for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
699 struct usb_device *udev = hdev->children[port1-1];
700 int status = 0;
701 u16 portstatus, portchange;
702 709
703 if (!udev || udev->state == USB_STATE_NOTATTACHED) { 710enum hub_quiescing_type {
704 if (type != HUB_RESET) { 711 HUB_DISCONNECT, HUB_PRE_RESET, HUB_SUSPEND
705 status = hub_port_status(hub, port1, 712};
706 &portstatus, &portchange);
707 if (status == 0 && (portstatus &
708 USB_PORT_STAT_ENABLE))
709 clear_port_feature(hdev, port1,
710 USB_PORT_FEAT_ENABLE);
711 }
712 continue;
713 }
714 713
715 /* Was the power session lost while we were suspended? */ 714static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type)
716 status = hub_port_status(hub, port1, &portstatus, &portchange); 715{
716 struct usb_device *hdev = hub->hdev;
717 int i;
717 718
718 /* If the device is gone, khubd will handle it later */ 719 /* khubd and related activity won't re-trigger */
719 if (status == 0 && !(portstatus & USB_PORT_STAT_CONNECTION)) 720 hub->quiescing = 1;
720 continue;
721 721
722 /* For "USB_PERSIST"-enabled children we must 722 if (type != HUB_SUSPEND) {
723 * mark the child device for reset-resume and 723 /* Disconnect all the children */
724 * turn off the various status changes to prevent 724 for (i = 0; i < hdev->maxchild; ++i) {
725 * khubd from disconnecting it later. 725 if (hdev->children[i])
726 */ 726 usb_disconnect(&hdev->children[i]);
727 if (status == 0 && !(portstatus & USB_PORT_STAT_ENABLE) &&
728 persistent_device(udev)) {
729 if (portchange & USB_PORT_STAT_C_ENABLE)
730 clear_port_feature(hub->hdev, port1,
731 USB_PORT_FEAT_C_ENABLE);
732 if (portchange & USB_PORT_STAT_C_CONNECTION)
733 clear_port_feature(hub->hdev, port1,
734 USB_PORT_FEAT_C_CONNECTION);
735 udev->reset_resume = 1;
736 } 727 }
737
738 /* Otherwise for a reset_resume we must disconnect the child,
739 * but as we may not lock the child device here
740 * we have to do a "logical" disconnect.
741 */
742 else if (type == HUB_RESET_RESUME)
743 hub_port_logical_disconnect(hub, port1);
744 } 728 }
745 729
746 hub_activate(hub); 730 /* Stop khubd and related activity */
731 usb_kill_urb(hub->urb);
732 if (hub->has_indicators)
733 cancel_delayed_work_sync(&hub->leds);
734 if (hub->tt.hub)
735 cancel_work_sync(&hub->tt.kevent);
747} 736}
748 737
749#endif /* CONFIG_PM */
750
751/* caller has locked the hub device */ 738/* caller has locked the hub device */
752static int hub_pre_reset(struct usb_interface *intf) 739static int hub_pre_reset(struct usb_interface *intf)
753{ 740{
754 struct usb_hub *hub = usb_get_intfdata(intf); 741 struct usb_hub *hub = usb_get_intfdata(intf);
755 742
756 hub_stop(hub); 743 hub_quiesce(hub, HUB_PRE_RESET);
757 return 0; 744 return 0;
758} 745}
759 746
@@ -762,8 +749,7 @@ static int hub_post_reset(struct usb_interface *intf)
762{ 749{
763 struct usb_hub *hub = usb_get_intfdata(intf); 750 struct usb_hub *hub = usb_get_intfdata(intf);
764 751
765 hub_power_on(hub); 752 hub_activate(hub, HUB_POST_RESET);
766 hub_activate(hub);
767 return 0; 753 return 0;
768} 754}
769 755
@@ -1009,8 +995,7 @@ static int hub_configure(struct usb_hub *hub,
1009 if (hub->has_indicators && blinkenlights) 995 if (hub->has_indicators && blinkenlights)
1010 hub->indicator [0] = INDICATOR_CYCLE; 996 hub->indicator [0] = INDICATOR_CYCLE;
1011 997
1012 hub_power_on(hub); 998 hub_activate(hub, HUB_INIT);
1013 hub_activate(hub);
1014 return 0; 999 return 0;
1015 1000
1016fail: 1001fail:
@@ -1042,7 +1027,7 @@ static void hub_disconnect(struct usb_interface *intf)
1042 1027
1043 /* Disconnect all children and quiesce the hub */ 1028 /* Disconnect all children and quiesce the hub */
1044 hub->error = 0; 1029 hub->error = 0;
1045 hub_stop(hub); 1030 hub_quiesce(hub, HUB_DISCONNECT);
1046 1031
1047 usb_set_intfdata (intf, NULL); 1032 usb_set_intfdata (intf, NULL);
1048 1033
@@ -1068,6 +1053,12 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
1068 desc = intf->cur_altsetting; 1053 desc = intf->cur_altsetting;
1069 hdev = interface_to_usbdev(intf); 1054 hdev = interface_to_usbdev(intf);
1070 1055
1056 if (hdev->level == MAX_TOPO_LEVEL) {
1057 dev_err(&intf->dev, "Unsupported bus topology: "
1058 "hub nested too deep\n");
1059 return -E2BIG;
1060 }
1061
1071#ifdef CONFIG_USB_OTG_BLACKLIST_HUB 1062#ifdef CONFIG_USB_OTG_BLACKLIST_HUB
1072 if (hdev->parent) { 1063 if (hdev->parent) {
1073 dev_warn(&intf->dev, "ignoring external hub\n"); 1064 dev_warn(&intf->dev, "ignoring external hub\n");
@@ -1814,6 +1805,51 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
1814 1805
1815#ifdef CONFIG_PM 1806#ifdef CONFIG_PM
1816 1807
1808#define MASK_BITS (USB_PORT_STAT_POWER | USB_PORT_STAT_CONNECTION | \
1809 USB_PORT_STAT_SUSPEND)
1810#define WANT_BITS (USB_PORT_STAT_POWER | USB_PORT_STAT_CONNECTION)
1811
1812/* Determine whether the device on a port is ready for a normal resume,
1813 * is ready for a reset-resume, or should be disconnected.
1814 */
1815static int check_port_resume_type(struct usb_device *udev,
1816 struct usb_hub *hub, int port1,
1817 int status, unsigned portchange, unsigned portstatus)
1818{
1819 /* Is the device still present? */
1820 if (status || (portstatus & MASK_BITS) != WANT_BITS) {
1821 if (status >= 0)
1822 status = -ENODEV;
1823 }
1824
1825 /* Can't do a normal resume if the port isn't enabled,
1826 * so try a reset-resume instead.
1827 */
1828 else if (!(portstatus & USB_PORT_STAT_ENABLE) && !udev->reset_resume) {
1829 if (udev->persist_enabled)
1830 udev->reset_resume = 1;
1831 else
1832 status = -ENODEV;
1833 }
1834
1835 if (status) {
1836 dev_dbg(hub->intfdev,
1837 "port %d status %04x.%04x after resume, %d\n",
1838 port1, portchange, portstatus, status);
1839 } else if (udev->reset_resume) {
1840
1841 /* Late port handoff can set status-change bits */
1842 if (portchange & USB_PORT_STAT_C_CONNECTION)
1843 clear_port_feature(hub->hdev, port1,
1844 USB_PORT_FEAT_C_CONNECTION);
1845 if (portchange & USB_PORT_STAT_C_ENABLE)
1846 clear_port_feature(hub->hdev, port1,
1847 USB_PORT_FEAT_C_ENABLE);
1848 }
1849
1850 return status;
1851}
1852
1817#ifdef CONFIG_USB_SUSPEND 1853#ifdef CONFIG_USB_SUSPEND
1818 1854
1819/* 1855/*
@@ -1943,7 +1979,8 @@ static int finish_port_resume(struct usb_device *udev)
1943 * resumed. 1979 * resumed.
1944 */ 1980 */
1945 if (udev->reset_resume) 1981 if (udev->reset_resume)
1946 status = usb_reset_device(udev); 1982 retry_reset_resume:
1983 status = usb_reset_and_verify_device(udev);
1947 1984
1948 /* 10.5.4.5 says be sure devices in the tree are still there. 1985 /* 10.5.4.5 says be sure devices in the tree are still there.
1949 * For now let's assume the device didn't go crazy on resume, 1986 * For now let's assume the device didn't go crazy on resume,
@@ -1954,6 +1991,13 @@ static int finish_port_resume(struct usb_device *udev)
1954 status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); 1991 status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
1955 if (status >= 0) 1992 if (status >= 0)
1956 status = (status > 0 ? 0 : -ENODEV); 1993 status = (status > 0 ? 0 : -ENODEV);
1994
1995 /* If a normal resume failed, try doing a reset-resume */
1996 if (status && !udev->reset_resume && udev->persist_enabled) {
1997 dev_dbg(&udev->dev, "retry with reset-resume\n");
1998 udev->reset_resume = 1;
1999 goto retry_reset_resume;
2000 }
1957 } 2001 }
1958 2002
1959 if (status) { 2003 if (status) {
@@ -2002,7 +2046,7 @@ static int finish_port_resume(struct usb_device *udev)
2002 * to it will be lost. Using the USB_PERSIST facility, the device can be 2046 * to it will be lost. Using the USB_PERSIST facility, the device can be
2003 * made to appear as if it had not disconnected. 2047 * made to appear as if it had not disconnected.
2004 * 2048 *
2005 * This facility can be dangerous. Although usb_reset_device() makes 2049 * This facility can be dangerous. Although usb_reset_and_verify_device() makes
2006 * every effort to insure that the same device is present after the 2050 * every effort to insure that the same device is present after the
2007 * reset as before, it cannot provide a 100% guarantee. Furthermore it's 2051 * reset as before, it cannot provide a 100% guarantee. Furthermore it's
2008 * quite possible for a device to remain unaltered but its media to be 2052 * quite possible for a device to remain unaltered but its media to be
@@ -2018,7 +2062,6 @@ int usb_port_resume(struct usb_device *udev)
2018 int port1 = udev->portnum; 2062 int port1 = udev->portnum;
2019 int status; 2063 int status;
2020 u16 portchange, portstatus; 2064 u16 portchange, portstatus;
2021 unsigned mask_flags, want_flags;
2022 2065
2023 /* Skip the initial Clear-Suspend step for a remote wakeup */ 2066 /* Skip the initial Clear-Suspend step for a remote wakeup */
2024 status = hub_port_status(hub, port1, &portstatus, &portchange); 2067 status = hub_port_status(hub, port1, &portstatus, &portchange);
@@ -2047,35 +2090,23 @@ int usb_port_resume(struct usb_device *udev)
2047 */ 2090 */
2048 status = hub_port_status(hub, port1, &portstatus, &portchange); 2091 status = hub_port_status(hub, port1, &portstatus, &portchange);
2049 2092
2050 SuspendCleared: 2093 /* TRSMRCY = 10 msec */
2051 if (udev->reset_resume) 2094 msleep(10);
2052 want_flags = USB_PORT_STAT_POWER 2095 }
2053 | USB_PORT_STAT_CONNECTION;
2054 else
2055 want_flags = USB_PORT_STAT_POWER
2056 | USB_PORT_STAT_CONNECTION
2057 | USB_PORT_STAT_ENABLE;
2058 mask_flags = want_flags | USB_PORT_STAT_SUSPEND;
2059 2096
2060 if (status < 0 || (portstatus & mask_flags) != want_flags) { 2097 SuspendCleared:
2061 dev_dbg(hub->intfdev, 2098 if (status == 0) {
2062 "port %d status %04x.%04x after resume, %d\n", 2099 if (portchange & USB_PORT_STAT_C_SUSPEND)
2063 port1, portchange, portstatus, status); 2100 clear_port_feature(hub->hdev, port1,
2064 if (status >= 0) 2101 USB_PORT_FEAT_C_SUSPEND);
2065 status = -ENODEV;
2066 } else {
2067 if (portchange & USB_PORT_STAT_C_SUSPEND)
2068 clear_port_feature(hub->hdev, port1,
2069 USB_PORT_FEAT_C_SUSPEND);
2070 /* TRSMRCY = 10 msec */
2071 msleep(10);
2072 }
2073 } 2102 }
2074 2103
2075 clear_bit(port1, hub->busy_bits); 2104 clear_bit(port1, hub->busy_bits);
2076 if (!hub->hdev->parent && !hub->busy_bits[0]) 2105 if (!hub->hdev->parent && !hub->busy_bits[0])
2077 usb_enable_root_hub_irq(hub->hdev->bus); 2106 usb_enable_root_hub_irq(hub->hdev->bus);
2078 2107
2108 status = check_port_resume_type(udev,
2109 hub, port1, status, portchange, portstatus);
2079 if (status == 0) 2110 if (status == 0)
2080 status = finish_port_resume(udev); 2111 status = finish_port_resume(udev);
2081 if (status < 0) { 2112 if (status < 0) {
@@ -2085,17 +2116,16 @@ int usb_port_resume(struct usb_device *udev)
2085 return status; 2116 return status;
2086} 2117}
2087 2118
2119/* caller has locked udev */
2088static int remote_wakeup(struct usb_device *udev) 2120static int remote_wakeup(struct usb_device *udev)
2089{ 2121{
2090 int status = 0; 2122 int status = 0;
2091 2123
2092 usb_lock_device(udev);
2093 if (udev->state == USB_STATE_SUSPENDED) { 2124 if (udev->state == USB_STATE_SUSPENDED) {
2094 dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); 2125 dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-");
2095 usb_mark_last_busy(udev); 2126 usb_mark_last_busy(udev);
2096 status = usb_external_resume_device(udev); 2127 status = usb_external_resume_device(udev);
2097 } 2128 }
2098 usb_unlock_device(udev);
2099 return status; 2129 return status;
2100} 2130}
2101 2131
@@ -2108,14 +2138,25 @@ int usb_port_suspend(struct usb_device *udev)
2108 return 0; 2138 return 0;
2109} 2139}
2110 2140
2141/* However we may need to do a reset-resume */
2142
2111int usb_port_resume(struct usb_device *udev) 2143int usb_port_resume(struct usb_device *udev)
2112{ 2144{
2113 int status = 0; 2145 struct usb_hub *hub = hdev_to_hub(udev->parent);
2146 int port1 = udev->portnum;
2147 int status;
2148 u16 portchange, portstatus;
2114 2149
2115 /* However we may need to do a reset-resume */ 2150 status = hub_port_status(hub, port1, &portstatus, &portchange);
2116 if (udev->reset_resume) { 2151 status = check_port_resume_type(udev,
2152 hub, port1, status, portchange, portstatus);
2153
2154 if (status) {
2155 dev_dbg(&udev->dev, "can't resume, status %d\n", status);
2156 hub_port_logical_disconnect(hub, port1);
2157 } else if (udev->reset_resume) {
2117 dev_dbg(&udev->dev, "reset-resume\n"); 2158 dev_dbg(&udev->dev, "reset-resume\n");
2118 status = usb_reset_device(udev); 2159 status = usb_reset_and_verify_device(udev);
2119 } 2160 }
2120 return status; 2161 return status;
2121} 2162}
@@ -2149,7 +2190,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
2149 dev_dbg(&intf->dev, "%s\n", __func__); 2190 dev_dbg(&intf->dev, "%s\n", __func__);
2150 2191
2151 /* stop khubd and related activity */ 2192 /* stop khubd and related activity */
2152 hub_quiesce(hub); 2193 hub_quiesce(hub, HUB_SUSPEND);
2153 return 0; 2194 return 0;
2154} 2195}
2155 2196
@@ -2158,7 +2199,7 @@ static int hub_resume(struct usb_interface *intf)
2158 struct usb_hub *hub = usb_get_intfdata(intf); 2199 struct usb_hub *hub = usb_get_intfdata(intf);
2159 2200
2160 dev_dbg(&intf->dev, "%s\n", __func__); 2201 dev_dbg(&intf->dev, "%s\n", __func__);
2161 hub_restart(hub, HUB_RESUME); 2202 hub_activate(hub, HUB_RESUME);
2162 return 0; 2203 return 0;
2163} 2204}
2164 2205
@@ -2167,8 +2208,7 @@ static int hub_reset_resume(struct usb_interface *intf)
2167 struct usb_hub *hub = usb_get_intfdata(intf); 2208 struct usb_hub *hub = usb_get_intfdata(intf);
2168 2209
2169 dev_dbg(&intf->dev, "%s\n", __func__); 2210 dev_dbg(&intf->dev, "%s\n", __func__);
2170 hub_power_on(hub); 2211 hub_activate(hub, HUB_RESET_RESUME);
2171 hub_restart(hub, HUB_RESET_RESUME);
2172 return 0; 2212 return 0;
2173} 2213}
2174 2214
@@ -2218,11 +2258,6 @@ static inline int remote_wakeup(struct usb_device *udev)
2218 * every 25ms for transient disconnects. When the port status has been 2258 * every 25ms for transient disconnects. When the port status has been
2219 * unchanged for 100ms it returns the port status. 2259 * unchanged for 100ms it returns the port status.
2220 */ 2260 */
2221
2222#define HUB_DEBOUNCE_TIMEOUT 1500
2223#define HUB_DEBOUNCE_STEP 25
2224#define HUB_DEBOUNCE_STABLE 100
2225
2226static int hub_port_debounce(struct usb_hub *hub, int port1) 2261static int hub_port_debounce(struct usb_hub *hub, int port1)
2227{ 2262{
2228 int ret; 2263 int ret;
@@ -2302,7 +2337,7 @@ static int hub_set_address(struct usb_device *udev, int devnum)
2302 * Returns device in USB_STATE_ADDRESS, except on error. 2337 * Returns device in USB_STATE_ADDRESS, except on error.
2303 * 2338 *
2304 * If this is called for an already-existing device (as part of 2339 * If this is called for an already-existing device (as part of
2305 * usb_reset_device), the caller must own the device lock. For a 2340 * usb_reset_and_verify_device), the caller must own the device lock. For a
2306 * newly detected device that is not accessible through any global 2341 * newly detected device that is not accessible through any global
2307 * pointers, it's not necessary to lock the device. 2342 * pointers, it's not necessary to lock the device.
2308 */ 2343 */
@@ -2619,7 +2654,7 @@ hub_power_remaining (struct usb_hub *hub)
2619 * This routine is called when: 2654 * This routine is called when:
2620 * a port connection-change occurs; 2655 * a port connection-change occurs;
2621 * a port enable-change occurs (often caused by EMI); 2656 * a port enable-change occurs (often caused by EMI);
2622 * usb_reset_device() encounters changed descriptors (as from 2657 * usb_reset_and_verify_device() encounters changed descriptors (as from
2623 * a firmware download) 2658 * a firmware download)
2624 * caller already locked the hub 2659 * caller already locked the hub
2625 */ 2660 */
@@ -2629,9 +2664,11 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
2629 struct usb_device *hdev = hub->hdev; 2664 struct usb_device *hdev = hub->hdev;
2630 struct device *hub_dev = hub->intfdev; 2665 struct device *hub_dev = hub->intfdev;
2631 struct usb_hcd *hcd = bus_to_hcd(hdev->bus); 2666 struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
2632 u16 wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); 2667 unsigned wHubCharacteristics =
2668 le16_to_cpu(hub->descriptor->wHubCharacteristics);
2669 struct usb_device *udev;
2633 int status, i; 2670 int status, i;
2634 2671
2635 dev_dbg (hub_dev, 2672 dev_dbg (hub_dev,
2636 "port %d, status %04x, change %04x, %s\n", 2673 "port %d, status %04x, change %04x, %s\n",
2637 port1, portstatus, portchange, portspeed (portstatus)); 2674 port1, portstatus, portchange, portspeed (portstatus));
@@ -2640,30 +2677,73 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
2640 set_port_led(hub, port1, HUB_LED_AUTO); 2677 set_port_led(hub, port1, HUB_LED_AUTO);
2641 hub->indicator[port1-1] = INDICATOR_AUTO; 2678 hub->indicator[port1-1] = INDICATOR_AUTO;
2642 } 2679 }
2643
2644 /* Disconnect any existing devices under this port */
2645 if (hdev->children[port1-1])
2646 usb_disconnect(&hdev->children[port1-1]);
2647 clear_bit(port1, hub->change_bits);
2648 2680
2649#ifdef CONFIG_USB_OTG 2681#ifdef CONFIG_USB_OTG
2650 /* during HNP, don't repeat the debounce */ 2682 /* during HNP, don't repeat the debounce */
2651 if (hdev->bus->is_b_host) 2683 if (hdev->bus->is_b_host)
2652 portchange &= ~USB_PORT_STAT_C_CONNECTION; 2684 portchange &= ~(USB_PORT_STAT_C_CONNECTION |
2685 USB_PORT_STAT_C_ENABLE);
2653#endif 2686#endif
2654 2687
2655 if (portchange & USB_PORT_STAT_C_CONNECTION) { 2688 /* Try to use the debounce delay for protection against
2689 * port-enable changes caused, for example, by EMI.
2690 */
2691 if (portchange & (USB_PORT_STAT_C_CONNECTION |
2692 USB_PORT_STAT_C_ENABLE)) {
2656 status = hub_port_debounce(hub, port1); 2693 status = hub_port_debounce(hub, port1);
2657 if (status < 0) { 2694 if (status < 0) {
2658 if (printk_ratelimit()) 2695 if (printk_ratelimit())
2659 dev_err (hub_dev, "connect-debounce failed, " 2696 dev_err (hub_dev, "connect-debounce failed, "
2660 "port %d disabled\n", port1); 2697 "port %d disabled\n", port1);
2661 goto done; 2698 portstatus &= ~USB_PORT_STAT_CONNECTION;
2699 } else {
2700 portstatus = status;
2701 }
2702 }
2703
2704 /* Try to resuscitate an existing device */
2705 udev = hdev->children[port1-1];
2706 if ((portstatus & USB_PORT_STAT_CONNECTION) && udev &&
2707 udev->state != USB_STATE_NOTATTACHED) {
2708
2709 usb_lock_device(udev);
2710 if (portstatus & USB_PORT_STAT_ENABLE) {
2711 status = 0; /* Nothing to do */
2712 } else if (!udev->persist_enabled) {
2713 status = -ENODEV; /* Mustn't resuscitate */
2714
2715#ifdef CONFIG_USB_SUSPEND
2716 } else if (udev->state == USB_STATE_SUSPENDED) {
2717 /* For a suspended device, treat this as a
2718 * remote wakeup event.
2719 */
2720 if (udev->do_remote_wakeup)
2721 status = remote_wakeup(udev);
2722
2723 /* Otherwise leave it be; devices can't tell the
2724 * difference between suspended and disabled.
2725 */
2726 else
2727 status = 0;
2728#endif
2729
2730 } else {
2731 status = usb_reset_device(udev);
2732 }
2733 usb_unlock_device(udev);
2734
2735 if (status == 0) {
2736 clear_bit(port1, hub->change_bits);
2737 return;
2662 } 2738 }
2663 portstatus = status;
2664 } 2739 }
2665 2740
2666 /* Return now if nothing is connected */ 2741 /* Disconnect any existing devices under this port */
2742 if (udev)
2743 usb_disconnect(&hdev->children[port1-1]);
2744 clear_bit(port1, hub->change_bits);
2745
2746 /* Return now if debouncing failed or nothing is connected */
2667 if (!(portstatus & USB_PORT_STAT_CONNECTION)) { 2747 if (!(portstatus & USB_PORT_STAT_CONNECTION)) {
2668 2748
2669 /* maybe switch power back on (e.g. root hub was reset) */ 2749 /* maybe switch power back on (e.g. root hub was reset) */
@@ -2677,7 +2757,6 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
2677 } 2757 }
2678 2758
2679 for (i = 0; i < SET_CONFIG_TRIES; i++) { 2759 for (i = 0; i < SET_CONFIG_TRIES; i++) {
2680 struct usb_device *udev;
2681 2760
2682 /* reallocate for each attempt, since references 2761 /* reallocate for each attempt, since references
2683 * to the previous one can escape in various ways 2762 * to the previous one can escape in various ways
@@ -2858,7 +2937,7 @@ static void hub_events(void)
2858 /* If the hub has died, clean up after it */ 2937 /* If the hub has died, clean up after it */
2859 if (hdev->state == USB_STATE_NOTATTACHED) { 2938 if (hdev->state == USB_STATE_NOTATTACHED) {
2860 hub->error = -ENODEV; 2939 hub->error = -ENODEV;
2861 hub_stop(hub); 2940 hub_quiesce(hub, HUB_DISCONNECT);
2862 goto loop; 2941 goto loop;
2863 } 2942 }
2864 2943
@@ -2877,7 +2956,7 @@ static void hub_events(void)
2877 dev_dbg (hub_dev, "resetting for error %d\n", 2956 dev_dbg (hub_dev, "resetting for error %d\n",
2878 hub->error); 2957 hub->error);
2879 2958
2880 ret = usb_reset_composite_device(hdev, intf); 2959 ret = usb_reset_device(hdev);
2881 if (ret) { 2960 if (ret) {
2882 dev_dbg (hub_dev, 2961 dev_dbg (hub_dev,
2883 "error resetting hub: %d\n", ret); 2962 "error resetting hub: %d\n", ret);
@@ -2894,7 +2973,7 @@ static void hub_events(void)
2894 continue; 2973 continue;
2895 connect_change = test_bit(i, hub->change_bits); 2974 connect_change = test_bit(i, hub->change_bits);
2896 if (!test_and_clear_bit(i, hub->event_bits) && 2975 if (!test_and_clear_bit(i, hub->event_bits) &&
2897 !connect_change && !hub->activating) 2976 !connect_change)
2898 continue; 2977 continue;
2899 2978
2900 ret = hub_port_status(hub, i, 2979 ret = hub_port_status(hub, i,
@@ -2902,11 +2981,6 @@ static void hub_events(void)
2902 if (ret < 0) 2981 if (ret < 0)
2903 continue; 2982 continue;
2904 2983
2905 if (hub->activating && !hdev->children[i-1] &&
2906 (portstatus &
2907 USB_PORT_STAT_CONNECTION))
2908 connect_change = 1;
2909
2910 if (portchange & USB_PORT_STAT_C_CONNECTION) { 2984 if (portchange & USB_PORT_STAT_C_CONNECTION) {
2911 clear_port_feature(hdev, i, 2985 clear_port_feature(hdev, i,
2912 USB_PORT_FEAT_C_CONNECTION); 2986 USB_PORT_FEAT_C_CONNECTION);
@@ -2941,11 +3015,16 @@ static void hub_events(void)
2941 } 3015 }
2942 3016
2943 if (portchange & USB_PORT_STAT_C_SUSPEND) { 3017 if (portchange & USB_PORT_STAT_C_SUSPEND) {
3018 struct usb_device *udev;
3019
2944 clear_port_feature(hdev, i, 3020 clear_port_feature(hdev, i,
2945 USB_PORT_FEAT_C_SUSPEND); 3021 USB_PORT_FEAT_C_SUSPEND);
2946 if (hdev->children[i-1]) { 3022 udev = hdev->children[i-1];
3023 if (udev) {
3024 usb_lock_device(udev);
2947 ret = remote_wakeup(hdev-> 3025 ret = remote_wakeup(hdev->
2948 children[i-1]); 3026 children[i-1]);
3027 usb_unlock_device(udev);
2949 if (ret < 0) 3028 if (ret < 0)
2950 connect_change = 1; 3029 connect_change = 1;
2951 } else { 3030 } else {
@@ -3002,8 +3081,6 @@ static void hub_events(void)
3002 } 3081 }
3003 } 3082 }
3004 3083
3005 hub->activating = 0;
3006
3007 /* If this is a root hub, tell the HCD it's okay to 3084 /* If this is a root hub, tell the HCD it's okay to
3008 * re-enable port-change interrupts now. */ 3085 * re-enable port-change interrupts now. */
3009 if (!hdev->parent && !hub->busy_bits[0]) 3086 if (!hdev->parent && !hub->busy_bits[0])
@@ -3172,12 +3249,12 @@ static int descriptors_changed(struct usb_device *udev,
3172} 3249}
3173 3250
3174/** 3251/**
3175 * usb_reset_device - perform a USB port reset to reinitialize a device 3252 * usb_reset_and_verify_device - perform a USB port reset to reinitialize a device
3176 * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) 3253 * @udev: device to reset (not in SUSPENDED or NOTATTACHED state)
3177 * 3254 *
3178 * WARNING - don't use this routine to reset a composite device 3255 * WARNING - don't use this routine to reset a composite device
3179 * (one with multiple interfaces owned by separate drivers)! 3256 * (one with multiple interfaces owned by separate drivers)!
3180 * Use usb_reset_composite_device() instead. 3257 * Use usb_reset_device() instead.
3181 * 3258 *
3182 * Do a port reset, reassign the device's address, and establish its 3259 * Do a port reset, reassign the device's address, and establish its
3183 * former operating configuration. If the reset fails, or the device's 3260 * former operating configuration. If the reset fails, or the device's
@@ -3201,7 +3278,7 @@ static int descriptors_changed(struct usb_device *udev,
3201 * holding the device lock because these tasks should always call 3278 * holding the device lock because these tasks should always call
3202 * usb_autopm_resume_device(), thereby preventing any unwanted autoresume. 3279 * usb_autopm_resume_device(), thereby preventing any unwanted autoresume.
3203 */ 3280 */
3204int usb_reset_device(struct usb_device *udev) 3281static int usb_reset_and_verify_device(struct usb_device *udev)
3205{ 3282{
3206 struct usb_device *parent_hdev = udev->parent; 3283 struct usb_device *parent_hdev = udev->parent;
3207 struct usb_hub *parent_hub; 3284 struct usb_hub *parent_hub;
@@ -3289,26 +3366,28 @@ re_enumerate:
3289 hub_port_logical_disconnect(parent_hub, port1); 3366 hub_port_logical_disconnect(parent_hub, port1);
3290 return -ENODEV; 3367 return -ENODEV;
3291} 3368}
3292EXPORT_SYMBOL_GPL(usb_reset_device);
3293 3369
3294/** 3370/**
3295 * usb_reset_composite_device - warn interface drivers and perform a USB port reset 3371 * usb_reset_device - warn interface drivers and perform a USB port reset
3296 * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) 3372 * @udev: device to reset (not in SUSPENDED or NOTATTACHED state)
3297 * @iface: interface bound to the driver making the request (optional)
3298 * 3373 *
3299 * Warns all drivers bound to registered interfaces (using their pre_reset 3374 * Warns all drivers bound to registered interfaces (using their pre_reset
3300 * method), performs the port reset, and then lets the drivers know that 3375 * method), performs the port reset, and then lets the drivers know that
3301 * the reset is over (using their post_reset method). 3376 * the reset is over (using their post_reset method).
3302 * 3377 *
3303 * Return value is the same as for usb_reset_device(). 3378 * Return value is the same as for usb_reset_and_verify_device().
3304 * 3379 *
3305 * The caller must own the device lock. For example, it's safe to use 3380 * The caller must own the device lock. For example, it's safe to use
3306 * this from a driver probe() routine after downloading new firmware. 3381 * this from a driver probe() routine after downloading new firmware.
3307 * For calls that might not occur during probe(), drivers should lock 3382 * For calls that might not occur during probe(), drivers should lock
3308 * the device using usb_lock_device_for_reset(). 3383 * the device using usb_lock_device_for_reset().
3384 *
3385 * If an interface is currently being probed or disconnected, we assume
3386 * its driver knows how to handle resets. For all other interfaces,
3387 * if the driver doesn't have pre_reset and post_reset methods then
3388 * we attempt to unbind it and rebind afterward.
3309 */ 3389 */
3310int usb_reset_composite_device(struct usb_device *udev, 3390int usb_reset_device(struct usb_device *udev)
3311 struct usb_interface *iface)
3312{ 3391{
3313 int ret; 3392 int ret;
3314 int i; 3393 int i;
@@ -3324,40 +3403,47 @@ int usb_reset_composite_device(struct usb_device *udev,
3324 /* Prevent autosuspend during the reset */ 3403 /* Prevent autosuspend during the reset */
3325 usb_autoresume_device(udev); 3404 usb_autoresume_device(udev);
3326 3405
3327 if (iface && iface->condition != USB_INTERFACE_BINDING)
3328 iface = NULL;
3329
3330 if (config) { 3406 if (config) {
3331 for (i = 0; i < config->desc.bNumInterfaces; ++i) { 3407 for (i = 0; i < config->desc.bNumInterfaces; ++i) {
3332 struct usb_interface *cintf = config->interface[i]; 3408 struct usb_interface *cintf = config->interface[i];
3333 struct usb_driver *drv; 3409 struct usb_driver *drv;
3410 int unbind = 0;
3334 3411
3335 if (cintf->dev.driver) { 3412 if (cintf->dev.driver) {
3336 drv = to_usb_driver(cintf->dev.driver); 3413 drv = to_usb_driver(cintf->dev.driver);
3337 if (drv->pre_reset) 3414 if (drv->pre_reset && drv->post_reset)
3338 (drv->pre_reset)(cintf); 3415 unbind = (drv->pre_reset)(cintf);
3339 /* FIXME: Unbind if pre_reset returns an error or isn't defined */ 3416 else if (cintf->condition ==
3417 USB_INTERFACE_BOUND)
3418 unbind = 1;
3419 if (unbind)
3420 usb_forced_unbind_intf(cintf);
3340 } 3421 }
3341 } 3422 }
3342 } 3423 }
3343 3424
3344 ret = usb_reset_device(udev); 3425 ret = usb_reset_and_verify_device(udev);
3345 3426
3346 if (config) { 3427 if (config) {
3347 for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) { 3428 for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) {
3348 struct usb_interface *cintf = config->interface[i]; 3429 struct usb_interface *cintf = config->interface[i];
3349 struct usb_driver *drv; 3430 struct usb_driver *drv;
3431 int rebind = cintf->needs_binding;
3350 3432
3351 if (cintf->dev.driver) { 3433 if (!rebind && cintf->dev.driver) {
3352 drv = to_usb_driver(cintf->dev.driver); 3434 drv = to_usb_driver(cintf->dev.driver);
3353 if (drv->post_reset) 3435 if (drv->post_reset)
3354 (drv->post_reset)(cintf); 3436 rebind = (drv->post_reset)(cintf);
3355 /* FIXME: Unbind if post_reset returns an error or isn't defined */ 3437 else if (cintf->condition ==
3438 USB_INTERFACE_BOUND)
3439 rebind = 1;
3356 } 3440 }
3441 if (rebind)
3442 usb_rebind_intf(cintf);
3357 } 3443 }
3358 } 3444 }
3359 3445
3360 usb_autosuspend_device(udev); 3446 usb_autosuspend_device(udev);
3361 return ret; 3447 return ret;
3362} 3448}
3363EXPORT_SYMBOL_GPL(usb_reset_composite_device); 3449EXPORT_SYMBOL_GPL(usb_reset_device);
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c
index 1d253dd4ea81..db410e92c80d 100644
--- a/drivers/usb/core/inode.c
+++ b/drivers/usb/core/inode.c
@@ -712,25 +712,11 @@ static void usbfs_add_device(struct usb_device *dev)
712 712
713static void usbfs_remove_device(struct usb_device *dev) 713static void usbfs_remove_device(struct usb_device *dev)
714{ 714{
715 struct dev_state *ds;
716 struct siginfo sinfo;
717
718 if (dev->usbfs_dentry) { 715 if (dev->usbfs_dentry) {
719 fs_remove_file (dev->usbfs_dentry); 716 fs_remove_file (dev->usbfs_dentry);
720 dev->usbfs_dentry = NULL; 717 dev->usbfs_dentry = NULL;
721 } 718 }
722 while (!list_empty(&dev->filelist)) { 719 usb_fs_classdev_common_remove(dev);
723 ds = list_entry(dev->filelist.next, struct dev_state, list);
724 wake_up_all(&ds->wait);
725 list_del_init(&ds->list);
726 if (ds->discsignr) {
727 sinfo.si_signo = ds->discsignr;
728 sinfo.si_errno = EPIPE;
729 sinfo.si_code = SI_ASYNCIO;
730 sinfo.si_addr = ds->disccontext;
731 kill_pid_info_as_uid(ds->discsignr, &sinfo, ds->disc_pid, ds->disc_uid, ds->disc_euid, ds->secid);
732 }
733 }
734} 720}
735 721
736static int usbfs_notify(struct notifier_block *self, unsigned long action, void *dev) 722static int usbfs_notify(struct notifier_block *self, unsigned long action, void *dev)
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index fe47d145255a..2fcc06eb5e60 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -400,7 +400,7 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
400 if (usb_pipein(pipe)) 400 if (usb_pipein(pipe))
401 urb_flags |= URB_SHORT_NOT_OK; 401 urb_flags |= URB_SHORT_NOT_OK;
402 402
403 for (i = 0; i < io->entries; i++) { 403 for_each_sg(sg, sg, io->entries, i) {
404 unsigned len; 404 unsigned len;
405 405
406 io->urbs[i] = usb_alloc_urb(0, mem_flags); 406 io->urbs[i] = usb_alloc_urb(0, mem_flags);
@@ -434,17 +434,17 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
434 * to prevent stale pointers and to help spot bugs. 434 * to prevent stale pointers and to help spot bugs.
435 */ 435 */
436 if (dma) { 436 if (dma) {
437 io->urbs[i]->transfer_dma = sg_dma_address(sg + i); 437 io->urbs[i]->transfer_dma = sg_dma_address(sg);
438 len = sg_dma_len(sg + i); 438 len = sg_dma_len(sg);
439#if defined(CONFIG_HIGHMEM) || defined(CONFIG_GART_IOMMU) 439#if defined(CONFIG_HIGHMEM) || defined(CONFIG_GART_IOMMU)
440 io->urbs[i]->transfer_buffer = NULL; 440 io->urbs[i]->transfer_buffer = NULL;
441#else 441#else
442 io->urbs[i]->transfer_buffer = sg_virt(&sg[i]); 442 io->urbs[i]->transfer_buffer = sg_virt(sg);
443#endif 443#endif
444 } else { 444 } else {
445 /* hc may use _only_ transfer_buffer */ 445 /* hc may use _only_ transfer_buffer */
446 io->urbs[i]->transfer_buffer = sg_virt(&sg[i]); 446 io->urbs[i]->transfer_buffer = sg_virt(sg);
447 len = sg[i].length; 447 len = sg->length;
448 } 448 }
449 449
450 if (length) { 450 if (length) {
@@ -1090,7 +1090,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
1090 if (!device_is_registered(&interface->dev)) 1090 if (!device_is_registered(&interface->dev))
1091 continue; 1091 continue;
1092 dev_dbg(&dev->dev, "unregistering interface %s\n", 1092 dev_dbg(&dev->dev, "unregistering interface %s\n",
1093 interface->dev.bus_id); 1093 dev_name(&interface->dev));
1094 device_del(&interface->dev); 1094 device_del(&interface->dev);
1095 usb_remove_sysfs_intf_files(interface); 1095 usb_remove_sysfs_intf_files(interface);
1096 } 1096 }
@@ -1476,7 +1476,7 @@ static struct usb_interface_assoc_descriptor *find_iad(struct usb_device *dev,
1476 * 1476 *
1477 * This call is synchronous. The calling context must be able to sleep, 1477 * This call is synchronous. The calling context must be able to sleep,
1478 * must own the device lock, and must not hold the driver model's USB 1478 * must own the device lock, and must not hold the driver model's USB
1479 * bus mutex; usb device driver probe() methods cannot use this routine. 1479 * bus mutex; usb interface driver probe() methods cannot use this routine.
1480 * 1480 *
1481 * Returns zero on success, or else the status code returned by the 1481 * Returns zero on success, or else the status code returned by the
1482 * underlying call that failed. On successful completion, each interface 1482 * underlying call that failed. On successful completion, each interface
@@ -1611,7 +1611,7 @@ free_interfaces:
1611 intf->dev.dma_mask = dev->dev.dma_mask; 1611 intf->dev.dma_mask = dev->dev.dma_mask;
1612 device_initialize(&intf->dev); 1612 device_initialize(&intf->dev);
1613 mark_quiesced(intf); 1613 mark_quiesced(intf);
1614 sprintf(&intf->dev.bus_id[0], "%d-%s:%d.%d", 1614 dev_set_name(&intf->dev, "%d-%s:%d.%d",
1615 dev->bus->busnum, dev->devpath, 1615 dev->bus->busnum, dev->devpath,
1616 configuration, alt->desc.bInterfaceNumber); 1616 configuration, alt->desc.bInterfaceNumber);
1617 } 1617 }
@@ -1631,12 +1631,12 @@ free_interfaces:
1631 1631
1632 dev_dbg(&dev->dev, 1632 dev_dbg(&dev->dev,
1633 "adding %s (config #%d, interface %d)\n", 1633 "adding %s (config #%d, interface %d)\n",
1634 intf->dev.bus_id, configuration, 1634 dev_name(&intf->dev), configuration,
1635 intf->cur_altsetting->desc.bInterfaceNumber); 1635 intf->cur_altsetting->desc.bInterfaceNumber);
1636 ret = device_add(&intf->dev); 1636 ret = device_add(&intf->dev);
1637 if (ret != 0) { 1637 if (ret != 0) {
1638 dev_err(&dev->dev, "device_add(%s) --> %d\n", 1638 dev_err(&dev->dev, "device_add(%s) --> %d\n",
1639 intf->dev.bus_id, ret); 1639 dev_name(&intf->dev), ret);
1640 continue; 1640 continue;
1641 } 1641 }
1642 usb_create_sysfs_intf_files(intf); 1642 usb_create_sysfs_intf_files(intf);
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 325774375837..84fcaa6a21ec 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -308,7 +308,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
308 * by location for diagnostics, tools, driver model, etc. The 308 * by location for diagnostics, tools, driver model, etc. The
309 * string is a path along hub ports, from the root. Each device's 309 * string is a path along hub ports, from the root. Each device's
310 * dev->devpath will be stable until USB is re-cabled, and hubs 310 * dev->devpath will be stable until USB is re-cabled, and hubs
311 * are often labeled with these port numbers. The bus_id isn't 311 * are often labeled with these port numbers. The name isn't
312 * as stable: bus->busnum changes easily from modprobe order, 312 * as stable: bus->busnum changes easily from modprobe order,
313 * cardbus or pci hotplugging, and so on. 313 * cardbus or pci hotplugging, and so on.
314 */ 314 */
@@ -316,7 +316,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
316 dev->devpath[0] = '0'; 316 dev->devpath[0] = '0';
317 317
318 dev->dev.parent = bus->controller; 318 dev->dev.parent = bus->controller;
319 sprintf(&dev->dev.bus_id[0], "usb%d", bus->busnum); 319 dev_set_name(&dev->dev, "usb%d", bus->busnum);
320 root_hub = 1; 320 root_hub = 1;
321 } else { 321 } else {
322 /* match any labeling on the hubs; it's one-based */ 322 /* match any labeling on the hubs; it's one-based */
@@ -328,8 +328,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
328 "%s.%d", parent->devpath, port1); 328 "%s.%d", parent->devpath, port1);
329 329
330 dev->dev.parent = &parent->dev; 330 dev->dev.parent = &parent->dev;
331 sprintf(&dev->dev.bus_id[0], "%d-%s", 331 dev_set_name(&dev->dev, "%d-%s", bus->busnum, dev->devpath);
332 bus->busnum, dev->devpath);
333 332
334 /* hub driver sets up TT records */ 333 /* hub driver sets up TT records */
335 } 334 }
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 1a8bc21c335e..d9a6e16dbf84 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -29,6 +29,8 @@ extern int usb_choose_configuration(struct usb_device *udev);
29extern void usb_kick_khubd(struct usb_device *dev); 29extern void usb_kick_khubd(struct usb_device *dev);
30extern int usb_match_device(struct usb_device *dev, 30extern int usb_match_device(struct usb_device *dev,
31 const struct usb_device_id *id); 31 const struct usb_device_id *id);
32extern void usb_forced_unbind_intf(struct usb_interface *intf);
33extern void usb_rebind_intf(struct usb_interface *intf);
32 34
33extern int usb_hub_init(void); 35extern int usb_hub_init(void);
34extern void usb_hub_cleanup(void); 36extern void usb_hub_cleanup(void);
@@ -140,26 +142,11 @@ extern struct usb_driver usbfs_driver;
140extern const struct file_operations usbfs_devices_fops; 142extern const struct file_operations usbfs_devices_fops;
141extern const struct file_operations usbdev_file_operations; 143extern const struct file_operations usbdev_file_operations;
142extern void usbfs_conn_disc_event(void); 144extern void usbfs_conn_disc_event(void);
145extern void usb_fs_classdev_common_remove(struct usb_device *udev);
143 146
144extern int usb_devio_init(void); 147extern int usb_devio_init(void);
145extern void usb_devio_cleanup(void); 148extern void usb_devio_cleanup(void);
146 149
147struct dev_state {
148 struct list_head list; /* state list */
149 struct usb_device *dev;
150 struct file *file;
151 spinlock_t lock; /* protects the async urb lists */
152 struct list_head async_pending;
153 struct list_head async_completed;
154 wait_queue_head_t wait; /* wake up if a request completed */
155 unsigned int discsignr;
156 struct pid *disc_pid;
157 uid_t disc_uid, disc_euid;
158 void __user *disccontext;
159 unsigned long ifclaimed;
160 u32 secid;
161};
162
163/* internal notify stuff */ 150/* internal notify stuff */
164extern void usb_notify_add_device(struct usb_device *udev); 151extern void usb_notify_add_device(struct usb_device *udev);
165extern void usb_notify_remove_device(struct usb_device *udev); 152extern void usb_notify_remove_device(struct usb_device *udev);
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index d6bab0d5f453..c6a8c6b1116a 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -586,6 +586,20 @@ config USB_G_PRINTER
586 For more information, see Documentation/usb/gadget_printer.txt 586 For more information, see Documentation/usb/gadget_printer.txt
587 which includes sample code for accessing the device file. 587 which includes sample code for accessing the device file.
588 588
589config USB_CDC_COMPOSITE
590 tristate "CDC Composite Device (Ethernet and ACM)"
591 depends on NET
592 help
593 This driver provides two functions in one configuration:
594 a CDC Ethernet (ECM) link, and a CDC ACM (serial port) link.
595
596 This driver requires four bulk and two interrupt endpoints,
597 plus the ability to handle altsettings. Not all peripheral
598 controllers are that capable.
599
600 Say "y" to link the driver statically, or "m" to build a
601 dynamically linked module.
602
589# put drivers that need isochronous transfer support (for audio 603# put drivers that need isochronous transfer support (for audio
590# or video class gadget drivers), or specific hardware, here. 604# or video class gadget drivers), or specific hardware, here.
591 605
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile
index e258afd25faf..fcb5cb9094d9 100644
--- a/drivers/usb/gadget/Makefile
+++ b/drivers/usb/gadget/Makefile
@@ -22,18 +22,22 @@ obj-$(CONFIG_USB_M66592) += m66592-udc.o
22# 22#
23# USB gadget drivers 23# USB gadget drivers
24# 24#
25g_zero-objs := zero.o usbstring.o config.o epautoconf.o 25C_UTILS = composite.o usbstring.o config.o epautoconf.o
26g_ether-objs := ether.o usbstring.o config.o epautoconf.o 26
27g_serial-objs := serial.o usbstring.o config.o epautoconf.o 27g_zero-objs := zero.o f_sourcesink.o f_loopback.o $(C_UTILS)
28g_ether-objs := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS)
29g_serial-objs := serial.o u_serial.o f_acm.o f_serial.o $(C_UTILS)
28g_midi-objs := gmidi.o usbstring.o config.o epautoconf.o 30g_midi-objs := gmidi.o usbstring.o config.o epautoconf.o
29gadgetfs-objs := inode.o 31gadgetfs-objs := inode.o
30g_file_storage-objs := file_storage.o usbstring.o config.o \ 32g_file_storage-objs := file_storage.o usbstring.o config.o \
31 epautoconf.o 33 epautoconf.o
32g_printer-objs := printer.o usbstring.o config.o \ 34g_printer-objs := printer.o usbstring.o config.o \
33 epautoconf.o 35 epautoconf.o
36g_cdc-objs := cdc2.o u_ether.o f_ecm.o \
37 u_serial.o f_acm.o $(C_UTILS)
34 38
35ifeq ($(CONFIG_USB_ETH_RNDIS),y) 39ifeq ($(CONFIG_USB_ETH_RNDIS),y)
36 g_ether-objs += rndis.o 40 g_ether-objs += f_rndis.o rndis.o
37endif 41endif
38 42
39obj-$(CONFIG_USB_ZERO) += g_zero.o 43obj-$(CONFIG_USB_ZERO) += g_zero.o
@@ -43,4 +47,5 @@ obj-$(CONFIG_USB_FILE_STORAGE) += g_file_storage.o
43obj-$(CONFIG_USB_G_SERIAL) += g_serial.o 47obj-$(CONFIG_USB_G_SERIAL) += g_serial.o
44obj-$(CONFIG_USB_G_PRINTER) += g_printer.o 48obj-$(CONFIG_USB_G_PRINTER) += g_printer.o
45obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o 49obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o
50obj-$(CONFIG_USB_CDC_COMPOSITE) += g_cdc.o
46 51
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c
index f261d2a9a5f0..1500e1b3c302 100644
--- a/drivers/usb/gadget/amd5536udc.c
+++ b/drivers/usb/gadget/amd5536udc.c
@@ -3342,7 +3342,7 @@ static int udc_probe(struct udc *dev)
3342 spin_lock_init(&dev->lock); 3342 spin_lock_init(&dev->lock);
3343 dev->gadget.ops = &udc_ops; 3343 dev->gadget.ops = &udc_ops;
3344 3344
3345 strcpy(dev->gadget.dev.bus_id, "gadget"); 3345 dev_set_name(&dev->gadget.dev, "gadget");
3346 dev->gadget.dev.release = gadget_release; 3346 dev->gadget.dev.release = gadget_release;
3347 dev->gadget.name = name; 3347 dev->gadget.name = name;
3348 dev->gadget.name = name; 3348 dev->gadget.name = name;
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c
index b6b2a0a5ba37..e2d8a5d86c40 100644
--- a/drivers/usb/gadget/at91_udc.c
+++ b/drivers/usb/gadget/at91_udc.c
@@ -1687,6 +1687,19 @@ static int __init at91udc_probe(struct platform_device *pdev)
1687 udc->board.pullup_active_low); 1687 udc->board.pullup_active_low);
1688 } 1688 }
1689 1689
1690 /* newer chips have more FIFO memory than rm9200 */
1691 if (cpu_is_at91sam9260()) {
1692 udc->ep[0].maxpacket = 64;
1693 udc->ep[3].maxpacket = 64;
1694 udc->ep[4].maxpacket = 512;
1695 udc->ep[5].maxpacket = 512;
1696 } else if (cpu_is_at91sam9261()) {
1697 udc->ep[3].maxpacket = 64;
1698 } else if (cpu_is_at91sam9263()) {
1699 udc->ep[0].maxpacket = 64;
1700 udc->ep[3].maxpacket = 64;
1701 }
1702
1690 udc->udp_baseaddr = ioremap(res->start, res->end - res->start + 1); 1703 udc->udp_baseaddr = ioremap(res->start, res->end - res->start + 1);
1691 if (!udc->udp_baseaddr) { 1704 if (!udc->udp_baseaddr) {
1692 retval = -ENOMEM; 1705 retval = -ENOMEM;
diff --git a/drivers/usb/gadget/cdc2.c b/drivers/usb/gadget/cdc2.c
new file mode 100644
index 000000000000..d490d0289507
--- /dev/null
+++ b/drivers/usb/gadget/cdc2.c
@@ -0,0 +1,246 @@
1/*
2 * cdc2.c -- CDC Composite driver, with ECM and ACM support
3 *
4 * Copyright (C) 2008 David Brownell
5 * Copyright (C) 2008 Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22#include <linux/kernel.h>
23#include <linux/utsname.h>
24
25#include "u_ether.h"
26#include "u_serial.h"
27
28
29#define DRIVER_DESC "CDC Composite Gadget"
30#define DRIVER_VERSION "King Kamehameha Day 2008"
31
32/*-------------------------------------------------------------------------*/
33
34/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
35 * Instead: allocate your own, using normal USB-IF procedures.
36 */
37
38/* Thanks to NetChip Technologies for donating this product ID.
39 * It's for devices with only this composite CDC configuration.
40 */
41#define CDC_VENDOR_NUM 0x0525 /* NetChip */
42#define CDC_PRODUCT_NUM 0xa4aa /* CDC Composite: ECM + ACM */
43
44/*-------------------------------------------------------------------------*/
45
46static struct usb_device_descriptor device_desc = {
47 .bLength = sizeof device_desc,
48 .bDescriptorType = USB_DT_DEVICE,
49
50 .bcdUSB = __constant_cpu_to_le16(0x0200),
51
52 .bDeviceClass = USB_CLASS_COMM,
53 .bDeviceSubClass = 0,
54 .bDeviceProtocol = 0,
55 /* .bMaxPacketSize0 = f(hardware) */
56
57 /* Vendor and product id can be overridden by module parameters. */
58 .idVendor = __constant_cpu_to_le16(CDC_VENDOR_NUM),
59 .idProduct = __constant_cpu_to_le16(CDC_PRODUCT_NUM),
60 /* .bcdDevice = f(hardware) */
61 /* .iManufacturer = DYNAMIC */
62 /* .iProduct = DYNAMIC */
63 /* NO SERIAL NUMBER */
64 .bNumConfigurations = 1,
65};
66
67static struct usb_otg_descriptor otg_descriptor = {
68 .bLength = sizeof otg_descriptor,
69 .bDescriptorType = USB_DT_OTG,
70
71 /* REVISIT SRP-only hardware is possible, although
72 * it would not be called "OTG" ...
73 */
74 .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
75};
76
77static const struct usb_descriptor_header *otg_desc[] = {
78 (struct usb_descriptor_header *) &otg_descriptor,
79 NULL,
80};
81
82
83/* string IDs are assigned dynamically */
84
85#define STRING_MANUFACTURER_IDX 0
86#define STRING_PRODUCT_IDX 1
87
88static char manufacturer[50];
89
90static struct usb_string strings_dev[] = {
91 [STRING_MANUFACTURER_IDX].s = manufacturer,
92 [STRING_PRODUCT_IDX].s = DRIVER_DESC,
93 { } /* end of list */
94};
95
96static struct usb_gadget_strings stringtab_dev = {
97 .language = 0x0409, /* en-us */
98 .strings = strings_dev,
99};
100
101static struct usb_gadget_strings *dev_strings[] = {
102 &stringtab_dev,
103 NULL,
104};
105
106static u8 hostaddr[ETH_ALEN];
107
108/*-------------------------------------------------------------------------*/
109
110/*
111 * We _always_ have both CDC ECM and CDC ACM functions.
112 */
113static int __init cdc_do_config(struct usb_configuration *c)
114{
115 int status;
116
117 if (gadget_is_otg(c->cdev->gadget)) {
118 c->descriptors = otg_desc;
119 c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
120 }
121
122 status = ecm_bind_config(c, hostaddr);
123 if (status < 0)
124 return status;
125
126 status = acm_bind_config(c, 0);
127 if (status < 0)
128 return status;
129
130 return 0;
131}
132
133static struct usb_configuration cdc_config_driver = {
134 .label = "CDC Composite (ECM + ACM)",
135 .bind = cdc_do_config,
136 .bConfigurationValue = 1,
137 /* .iConfiguration = DYNAMIC */
138 .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
139 .bMaxPower = 1, /* 2 mA, minimal */
140};
141
142/*-------------------------------------------------------------------------*/
143
144static int __init cdc_bind(struct usb_composite_dev *cdev)
145{
146 int gcnum;
147 struct usb_gadget *gadget = cdev->gadget;
148 int status;
149
150 if (!can_support_ecm(cdev->gadget)) {
151 ERROR(cdev, "controller '%s' not usable\n", gadget->name);
152 return -EINVAL;
153 }
154
155 /* set up network link layer */
156 status = gether_setup(cdev->gadget, hostaddr);
157 if (status < 0)
158 return status;
159
160 /* set up serial link layer */
161 status = gserial_setup(cdev->gadget, 1);
162 if (status < 0)
163 goto fail0;
164
165 gcnum = usb_gadget_controller_number(gadget);
166 if (gcnum >= 0)
167 device_desc.bcdDevice = cpu_to_le16(0x0300 | gcnum);
168 else {
169 /* We assume that can_support_ecm() tells the truth;
170 * but if the controller isn't recognized at all then
171 * that assumption is a bit more likely to be wrong.
172 */
173 WARN(cdev, "controller '%s' not recognized; trying %s\n",
174 gadget->name,
175 cdc_config_driver.label);
176 device_desc.bcdDevice =
177 __constant_cpu_to_le16(0x0300 | 0x0099);
178 }
179
180
181 /* Allocate string descriptor numbers ... note that string
182 * contents can be overridden by the composite_dev glue.
183 */
184
185 /* device descriptor strings: manufacturer, product */
186 snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
187 init_utsname()->sysname, init_utsname()->release,
188 gadget->name);
189 status = usb_string_id(cdev);
190 if (status < 0)
191 goto fail1;
192 strings_dev[STRING_MANUFACTURER_IDX].id = status;
193 device_desc.iManufacturer = status;
194
195 status = usb_string_id(cdev);
196 if (status < 0)
197 goto fail1;
198 strings_dev[STRING_PRODUCT_IDX].id = status;
199 device_desc.iProduct = status;
200
201 /* register our configuration */
202 status = usb_add_config(cdev, &cdc_config_driver);
203 if (status < 0)
204 goto fail1;
205
206 INFO(cdev, "%s, version: " DRIVER_VERSION "\n", DRIVER_DESC);
207
208 return 0;
209
210fail1:
211 gserial_cleanup();
212fail0:
213 gether_cleanup();
214 return status;
215}
216
217static int __exit cdc_unbind(struct usb_composite_dev *cdev)
218{
219 gserial_cleanup();
220 gether_cleanup();
221 return 0;
222}
223
224static struct usb_composite_driver cdc_driver = {
225 .name = "g_cdc",
226 .dev = &device_desc,
227 .strings = dev_strings,
228 .bind = cdc_bind,
229 .unbind = __exit_p(cdc_unbind),
230};
231
232MODULE_DESCRIPTION(DRIVER_DESC);
233MODULE_AUTHOR("David Brownell");
234MODULE_LICENSE("GPL");
235
236static int __init init(void)
237{
238 return usb_composite_register(&cdc_driver);
239}
240module_init(init);
241
242static void __exit cleanup(void)
243{
244 usb_composite_unregister(&cdc_driver);
245}
246module_exit(cleanup);
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
new file mode 100644
index 000000000000..85c876c1f150
--- /dev/null
+++ b/drivers/usb/gadget/composite.c
@@ -0,0 +1,1041 @@
1/*
2 * composite.c - infrastructure for Composite USB Gadgets
3 *
4 * Copyright (C) 2006-2008 David Brownell
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21/* #define VERBOSE_DEBUG */
22
23#include <linux/kallsyms.h>
24#include <linux/kernel.h>
25#include <linux/slab.h>
26#include <linux/device.h>
27
28#include <linux/usb/composite.h>
29
30
31/*
32 * The code in this file is utility code, used to build a gadget driver
33 * from one or more "function" drivers, one or more "configuration"
34 * objects, and a "usb_composite_driver" by gluing them together along
35 * with the relevant device-wide data.
36 */
37
38/* big enough to hold our biggest descriptor */
39#define USB_BUFSIZ 512
40
41static struct usb_composite_driver *composite;
42
43/* Some systems will need runtime overrides for the product identifers
44 * published in the device descriptor, either numbers or strings or both.
45 * String parameters are in UTF-8 (superset of ASCII's 7 bit characters).
46 */
47
48static ushort idVendor;
49module_param(idVendor, ushort, 0);
50MODULE_PARM_DESC(idVendor, "USB Vendor ID");
51
52static ushort idProduct;
53module_param(idProduct, ushort, 0);
54MODULE_PARM_DESC(idProduct, "USB Product ID");
55
56static ushort bcdDevice;
57module_param(bcdDevice, ushort, 0);
58MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)");
59
60static char *iManufacturer;
61module_param(iManufacturer, charp, 0);
62MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string");
63
64static char *iProduct;
65module_param(iProduct, charp, 0);
66MODULE_PARM_DESC(iProduct, "USB Product string");
67
68static char *iSerialNumber;
69module_param(iSerialNumber, charp, 0);
70MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");
71
72/*-------------------------------------------------------------------------*/
73
74/**
75 * usb_add_function() - add a function to a configuration
76 * @config: the configuration
77 * @function: the function being added
78 * Context: single threaded during gadget setup
79 *
80 * After initialization, each configuration must have one or more
81 * functions added to it. Adding a function involves calling its @bind()
82 * method to allocate resources such as interface and string identifiers
83 * and endpoints.
84 *
85 * This function returns the value of the function's bind(), which is
86 * zero for success else a negative errno value.
87 */
88int __init usb_add_function(struct usb_configuration *config,
89 struct usb_function *function)
90{
91 int value = -EINVAL;
92
93 DBG(config->cdev, "adding '%s'/%p to config '%s'/%p\n",
94 function->name, function,
95 config->label, config);
96
97 if (!function->set_alt || !function->disable)
98 goto done;
99
100 function->config = config;
101 list_add_tail(&function->list, &config->functions);
102
103 /* REVISIT *require* function->bind? */
104 if (function->bind) {
105 value = function->bind(config, function);
106 if (value < 0) {
107 list_del(&function->list);
108 function->config = NULL;
109 }
110 } else
111 value = 0;
112
113 /* We allow configurations that don't work at both speeds.
114 * If we run into a lowspeed Linux system, treat it the same
115 * as full speed ... it's the function drivers that will need
116 * to avoid bulk and ISO transfers.
117 */
118 if (!config->fullspeed && function->descriptors)
119 config->fullspeed = true;
120 if (!config->highspeed && function->hs_descriptors)
121 config->highspeed = true;
122
123done:
124 if (value)
125 DBG(config->cdev, "adding '%s'/%p --> %d\n",
126 function->name, function, value);
127 return value;
128}
129
130/**
131 * usb_interface_id() - allocate an unused interface ID
132 * @config: configuration associated with the interface
133 * @function: function handling the interface
134 * Context: single threaded during gadget setup
135 *
136 * usb_interface_id() is called from usb_function.bind() callbacks to
137 * allocate new interface IDs. The function driver will then store that
138 * ID in interface, association, CDC union, and other descriptors. It
139 * will also handle any control requests targetted at that interface,
140 * particularly changing its altsetting via set_alt(). There may
141 * also be class-specific or vendor-specific requests to handle.
142 *
143 * All interface identifier should be allocated using this routine, to
144 * ensure that for example different functions don't wrongly assign
145 * different meanings to the same identifier. Note that since interface
146 * identifers are configuration-specific, functions used in more than
147 * one configuration (or more than once in a given configuration) need
148 * multiple versions of the relevant descriptors.
149 *
150 * Returns the interface ID which was allocated; or -ENODEV if no
151 * more interface IDs can be allocated.
152 */
153int __init usb_interface_id(struct usb_configuration *config,
154 struct usb_function *function)
155{
156 unsigned id = config->next_interface_id;
157
158 if (id < MAX_CONFIG_INTERFACES) {
159 config->interface[id] = function;
160 config->next_interface_id = id + 1;
161 return id;
162 }
163 return -ENODEV;
164}
165
166static int config_buf(struct usb_configuration *config,
167 enum usb_device_speed speed, void *buf, u8 type)
168{
169 struct usb_config_descriptor *c = buf;
170 void *next = buf + USB_DT_CONFIG_SIZE;
171 int len = USB_BUFSIZ - USB_DT_CONFIG_SIZE;
172 struct usb_function *f;
173 int status;
174
175 /* write the config descriptor */
176 c = buf;
177 c->bLength = USB_DT_CONFIG_SIZE;
178 c->bDescriptorType = type;
179 /* wTotalLength is written later */
180 c->bNumInterfaces = config->next_interface_id;
181 c->bConfigurationValue = config->bConfigurationValue;
182 c->iConfiguration = config->iConfiguration;
183 c->bmAttributes = USB_CONFIG_ATT_ONE | config->bmAttributes;
184 c->bMaxPower = config->bMaxPower;
185
186 /* There may be e.g. OTG descriptors */
187 if (config->descriptors) {
188 status = usb_descriptor_fillbuf(next, len,
189 config->descriptors);
190 if (status < 0)
191 return status;
192 len -= status;
193 next += status;
194 }
195
196 /* add each function's descriptors */
197 list_for_each_entry(f, &config->functions, list) {
198 struct usb_descriptor_header **descriptors;
199
200 if (speed == USB_SPEED_HIGH)
201 descriptors = f->hs_descriptors;
202 else
203 descriptors = f->descriptors;
204 if (!descriptors)
205 continue;
206 status = usb_descriptor_fillbuf(next, len,
207 (const struct usb_descriptor_header **) descriptors);
208 if (status < 0)
209 return status;
210 len -= status;
211 next += status;
212 }
213
214 len = next - buf;
215 c->wTotalLength = cpu_to_le16(len);
216 return len;
217}
218
219static int config_desc(struct usb_composite_dev *cdev, unsigned w_value)
220{
221 struct usb_gadget *gadget = cdev->gadget;
222 struct usb_configuration *c;
223 u8 type = w_value >> 8;
224 enum usb_device_speed speed = USB_SPEED_UNKNOWN;
225
226 if (gadget_is_dualspeed(gadget)) {
227 int hs = 0;
228
229 if (gadget->speed == USB_SPEED_HIGH)
230 hs = 1;
231 if (type == USB_DT_OTHER_SPEED_CONFIG)
232 hs = !hs;
233 if (hs)
234 speed = USB_SPEED_HIGH;
235
236 }
237
238 /* This is a lookup by config *INDEX* */
239 w_value &= 0xff;
240 list_for_each_entry(c, &cdev->configs, list) {
241 /* ignore configs that won't work at this speed */
242 if (speed == USB_SPEED_HIGH) {
243 if (!c->highspeed)
244 continue;
245 } else {
246 if (!c->fullspeed)
247 continue;
248 }
249 if (w_value == 0)
250 return config_buf(c, speed, cdev->req->buf, type);
251 w_value--;
252 }
253 return -EINVAL;
254}
255
256static int count_configs(struct usb_composite_dev *cdev, unsigned type)
257{
258 struct usb_gadget *gadget = cdev->gadget;
259 struct usb_configuration *c;
260 unsigned count = 0;
261 int hs = 0;
262
263 if (gadget_is_dualspeed(gadget)) {
264 if (gadget->speed == USB_SPEED_HIGH)
265 hs = 1;
266 if (type == USB_DT_DEVICE_QUALIFIER)
267 hs = !hs;
268 }
269 list_for_each_entry(c, &cdev->configs, list) {
270 /* ignore configs that won't work at this speed */
271 if (hs) {
272 if (!c->highspeed)
273 continue;
274 } else {
275 if (!c->fullspeed)
276 continue;
277 }
278 count++;
279 }
280 return count;
281}
282
283static void device_qual(struct usb_composite_dev *cdev)
284{
285 struct usb_qualifier_descriptor *qual = cdev->req->buf;
286
287 qual->bLength = sizeof(*qual);
288 qual->bDescriptorType = USB_DT_DEVICE_QUALIFIER;
289 /* POLICY: same bcdUSB and device type info at both speeds */
290 qual->bcdUSB = cdev->desc.bcdUSB;
291 qual->bDeviceClass = cdev->desc.bDeviceClass;
292 qual->bDeviceSubClass = cdev->desc.bDeviceSubClass;
293 qual->bDeviceProtocol = cdev->desc.bDeviceProtocol;
294 /* ASSUME same EP0 fifo size at both speeds */
295 qual->bMaxPacketSize0 = cdev->desc.bMaxPacketSize0;
296 qual->bNumConfigurations = count_configs(cdev, USB_DT_DEVICE_QUALIFIER);
297 qual->bRESERVED = 0;
298}
299
300/*-------------------------------------------------------------------------*/
301
302static void reset_config(struct usb_composite_dev *cdev)
303{
304 struct usb_function *f;
305
306 DBG(cdev, "reset config\n");
307
308 list_for_each_entry(f, &cdev->config->functions, list) {
309 if (f->disable)
310 f->disable(f);
311 }
312 cdev->config = NULL;
313}
314
315static int set_config(struct usb_composite_dev *cdev,
316 const struct usb_ctrlrequest *ctrl, unsigned number)
317{
318 struct usb_gadget *gadget = cdev->gadget;
319 struct usb_configuration *c = NULL;
320 int result = -EINVAL;
321 unsigned power = gadget_is_otg(gadget) ? 8 : 100;
322 int tmp;
323
324 if (cdev->config)
325 reset_config(cdev);
326
327 if (number) {
328 list_for_each_entry(c, &cdev->configs, list) {
329 if (c->bConfigurationValue == number) {
330 result = 0;
331 break;
332 }
333 }
334 if (result < 0)
335 goto done;
336 } else
337 result = 0;
338
339 INFO(cdev, "%s speed config #%d: %s\n",
340 ({ char *speed;
341 switch (gadget->speed) {
342 case USB_SPEED_LOW: speed = "low"; break;
343 case USB_SPEED_FULL: speed = "full"; break;
344 case USB_SPEED_HIGH: speed = "high"; break;
345 default: speed = "?"; break;
346 } ; speed; }), number, c ? c->label : "unconfigured");
347
348 if (!c)
349 goto done;
350
351 cdev->config = c;
352
353 /* Initialize all interfaces by setting them to altsetting zero. */
354 for (tmp = 0; tmp < MAX_CONFIG_INTERFACES; tmp++) {
355 struct usb_function *f = c->interface[tmp];
356
357 if (!f)
358 break;
359
360 result = f->set_alt(f, tmp, 0);
361 if (result < 0) {
362 DBG(cdev, "interface %d (%s/%p) alt 0 --> %d\n",
363 tmp, f->name, f, result);
364
365 reset_config(cdev);
366 goto done;
367 }
368 }
369
370 /* when we return, be sure our power usage is valid */
371 power = 2 * c->bMaxPower;
372done:
373 usb_gadget_vbus_draw(gadget, power);
374 return result;
375}
376
377/**
378 * usb_add_config() - add a configuration to a device.
379 * @cdev: wraps the USB gadget
380 * @config: the configuration, with bConfigurationValue assigned
381 * Context: single threaded during gadget setup
382 *
383 * One of the main tasks of a composite driver's bind() routine is to
384 * add each of the configurations it supports, using this routine.
385 *
386 * This function returns the value of the configuration's bind(), which
387 * is zero for success else a negative errno value. Binding configurations
388 * assigns global resources including string IDs, and per-configuration
389 * resources such as interface IDs and endpoints.
390 */
391int __init usb_add_config(struct usb_composite_dev *cdev,
392 struct usb_configuration *config)
393{
394 int status = -EINVAL;
395 struct usb_configuration *c;
396
397 DBG(cdev, "adding config #%u '%s'/%p\n",
398 config->bConfigurationValue,
399 config->label, config);
400
401 if (!config->bConfigurationValue || !config->bind)
402 goto done;
403
404 /* Prevent duplicate configuration identifiers */
405 list_for_each_entry(c, &cdev->configs, list) {
406 if (c->bConfigurationValue == config->bConfigurationValue) {
407 status = -EBUSY;
408 goto done;
409 }
410 }
411
412 config->cdev = cdev;
413 list_add_tail(&config->list, &cdev->configs);
414
415 INIT_LIST_HEAD(&config->functions);
416 config->next_interface_id = 0;
417
418 status = config->bind(config);
419 if (status < 0) {
420 list_del(&config->list);
421 config->cdev = NULL;
422 } else {
423 unsigned i;
424
425 DBG(cdev, "cfg %d/%p speeds:%s%s\n",
426 config->bConfigurationValue, config,
427 config->highspeed ? " high" : "",
428 config->fullspeed
429 ? (gadget_is_dualspeed(cdev->gadget)
430 ? " full"
431 : " full/low")
432 : "");
433
434 for (i = 0; i < MAX_CONFIG_INTERFACES; i++) {
435 struct usb_function *f = config->interface[i];
436
437 if (!f)
438 continue;
439 DBG(cdev, " interface %d = %s/%p\n",
440 i, f->name, f);
441 }
442 }
443
444 /* set_alt(), or next config->bind(), sets up
445 * ep->driver_data as needed.
446 */
447 usb_ep_autoconfig_reset(cdev->gadget);
448
449done:
450 if (status)
451 DBG(cdev, "added config '%s'/%u --> %d\n", config->label,
452 config->bConfigurationValue, status);
453 return status;
454}
455
456/*-------------------------------------------------------------------------*/
457
458/* We support strings in multiple languages ... string descriptor zero
459 * says which languages are supported. The typical case will be that
460 * only one language (probably English) is used, with I18N handled on
461 * the host side.
462 */
463
464static void collect_langs(struct usb_gadget_strings **sp, __le16 *buf)
465{
466 const struct usb_gadget_strings *s;
467 u16 language;
468 __le16 *tmp;
469
470 while (*sp) {
471 s = *sp;
472 language = cpu_to_le16(s->language);
473 for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) {
474 if (*tmp == language)
475 goto repeat;
476 }
477 *tmp++ = language;
478repeat:
479 sp++;
480 }
481}
482
483static int lookup_string(
484 struct usb_gadget_strings **sp,
485 void *buf,
486 u16 language,
487 int id
488)
489{
490 struct usb_gadget_strings *s;
491 int value;
492
493 while (*sp) {
494 s = *sp++;
495 if (s->language != language)
496 continue;
497 value = usb_gadget_get_string(s, id, buf);
498 if (value > 0)
499 return value;
500 }
501 return -EINVAL;
502}
503
504static int get_string(struct usb_composite_dev *cdev,
505 void *buf, u16 language, int id)
506{
507 struct usb_configuration *c;
508 struct usb_function *f;
509 int len;
510
511 /* Yes, not only is USB's I18N support probably more than most
512 * folk will ever care about ... also, it's all supported here.
513 * (Except for UTF8 support for Unicode's "Astral Planes".)
514 */
515
516 /* 0 == report all available language codes */
517 if (id == 0) {
518 struct usb_string_descriptor *s = buf;
519 struct usb_gadget_strings **sp;
520
521 memset(s, 0, 256);
522 s->bDescriptorType = USB_DT_STRING;
523
524 sp = composite->strings;
525 if (sp)
526 collect_langs(sp, s->wData);
527
528 list_for_each_entry(c, &cdev->configs, list) {
529 sp = c->strings;
530 if (sp)
531 collect_langs(sp, s->wData);
532
533 list_for_each_entry(f, &c->functions, list) {
534 sp = f->strings;
535 if (sp)
536 collect_langs(sp, s->wData);
537 }
538 }
539
540 for (len = 0; s->wData[len] && len <= 126; len++)
541 continue;
542 if (!len)
543 return -EINVAL;
544
545 s->bLength = 2 * (len + 1);
546 return s->bLength;
547 }
548
549 /* Otherwise, look up and return a specified string. String IDs
550 * are device-scoped, so we look up each string table we're told
551 * about. These lookups are infrequent; simpler-is-better here.
552 */
553 if (composite->strings) {
554 len = lookup_string(composite->strings, buf, language, id);
555 if (len > 0)
556 return len;
557 }
558 list_for_each_entry(c, &cdev->configs, list) {
559 if (c->strings) {
560 len = lookup_string(c->strings, buf, language, id);
561 if (len > 0)
562 return len;
563 }
564 list_for_each_entry(f, &c->functions, list) {
565 if (!f->strings)
566 continue;
567 len = lookup_string(f->strings, buf, language, id);
568 if (len > 0)
569 return len;
570 }
571 }
572 return -EINVAL;
573}
574
575/**
576 * usb_string_id() - allocate an unused string ID
577 * @cdev: the device whose string descriptor IDs are being allocated
578 * Context: single threaded during gadget setup
579 *
580 * @usb_string_id() is called from bind() callbacks to allocate
581 * string IDs. Drivers for functions, configurations, or gadgets will
582 * then store that ID in the appropriate descriptors and string table.
583 *
584 * All string identifier should be allocated using this routine, to
585 * ensure that for example different functions don't wrongly assign
586 * different meanings to the same identifier.
587 */
588int __init usb_string_id(struct usb_composite_dev *cdev)
589{
590 if (cdev->next_string_id < 254) {
591 /* string id 0 is reserved */
592 cdev->next_string_id++;
593 return cdev->next_string_id;
594 }
595 return -ENODEV;
596}
597
598/*-------------------------------------------------------------------------*/
599
600static void composite_setup_complete(struct usb_ep *ep, struct usb_request *req)
601{
602 if (req->status || req->actual != req->length)
603 DBG((struct usb_composite_dev *) ep->driver_data,
604 "setup complete --> %d, %d/%d\n",
605 req->status, req->actual, req->length);
606}
607
608/*
609 * The setup() callback implements all the ep0 functionality that's
610 * not handled lower down, in hardware or the hardware driver(like
611 * device and endpoint feature flags, and their status). It's all
612 * housekeeping for the gadget function we're implementing. Most of
613 * the work is in config and function specific setup.
614 */
615static int
616composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
617{
618 struct usb_composite_dev *cdev = get_gadget_data(gadget);
619 struct usb_request *req = cdev->req;
620 int value = -EOPNOTSUPP;
621 u16 w_index = le16_to_cpu(ctrl->wIndex);
622 u16 w_value = le16_to_cpu(ctrl->wValue);
623 u16 w_length = le16_to_cpu(ctrl->wLength);
624 struct usb_function *f = NULL;
625
626 /* partial re-init of the response message; the function or the
627 * gadget might need to intercept e.g. a control-OUT completion
628 * when we delegate to it.
629 */
630 req->zero = 0;
631 req->complete = composite_setup_complete;
632 req->length = USB_BUFSIZ;
633 gadget->ep0->driver_data = cdev;
634
635 switch (ctrl->bRequest) {
636
637 /* we handle all standard USB descriptors */
638 case USB_REQ_GET_DESCRIPTOR:
639 if (ctrl->bRequestType != USB_DIR_IN)
640 goto unknown;
641 switch (w_value >> 8) {
642
643 case USB_DT_DEVICE:
644 cdev->desc.bNumConfigurations =
645 count_configs(cdev, USB_DT_DEVICE);
646 value = min(w_length, (u16) sizeof cdev->desc);
647 memcpy(req->buf, &cdev->desc, value);
648 break;
649 case USB_DT_DEVICE_QUALIFIER:
650 if (!gadget_is_dualspeed(gadget))
651 break;
652 device_qual(cdev);
653 value = min_t(int, w_length,
654 sizeof(struct usb_qualifier_descriptor));
655 break;
656 case USB_DT_OTHER_SPEED_CONFIG:
657 if (!gadget_is_dualspeed(gadget))
658 break;
659 /* FALLTHROUGH */
660 case USB_DT_CONFIG:
661 value = config_desc(cdev, w_value);
662 if (value >= 0)
663 value = min(w_length, (u16) value);
664 break;
665 case USB_DT_STRING:
666 value = get_string(cdev, req->buf,
667 w_index, w_value & 0xff);
668 if (value >= 0)
669 value = min(w_length, (u16) value);
670 break;
671 }
672 break;
673
674 /* any number of configs can work */
675 case USB_REQ_SET_CONFIGURATION:
676 if (ctrl->bRequestType != 0)
677 goto unknown;
678 if (gadget_is_otg(gadget)) {
679 if (gadget->a_hnp_support)
680 DBG(cdev, "HNP available\n");
681 else if (gadget->a_alt_hnp_support)
682 DBG(cdev, "HNP on another port\n");
683 else
684 VDBG(cdev, "HNP inactive\n");
685 }
686 spin_lock(&cdev->lock);
687 value = set_config(cdev, ctrl, w_value);
688 spin_unlock(&cdev->lock);
689 break;
690 case USB_REQ_GET_CONFIGURATION:
691 if (ctrl->bRequestType != USB_DIR_IN)
692 goto unknown;
693 if (cdev->config)
694 *(u8 *)req->buf = cdev->config->bConfigurationValue;
695 else
696 *(u8 *)req->buf = 0;
697 value = min(w_length, (u16) 1);
698 break;
699
700 /* function drivers must handle get/set altsetting; if there's
701 * no get() method, we know only altsetting zero works.
702 */
703 case USB_REQ_SET_INTERFACE:
704 if (ctrl->bRequestType != USB_RECIP_INTERFACE)
705 goto unknown;
706 if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES)
707 break;
708 f = cdev->config->interface[w_index];
709 if (!f)
710 break;
711 if (w_value && !f->get_alt)
712 break;
713 value = f->set_alt(f, w_index, w_value);
714 break;
715 case USB_REQ_GET_INTERFACE:
716 if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE))
717 goto unknown;
718 if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES)
719 break;
720 f = cdev->config->interface[w_index];
721 if (!f)
722 break;
723 /* lots of interfaces only need altsetting zero... */
724 value = f->get_alt ? f->get_alt(f, w_index) : 0;
725 if (value < 0)
726 break;
727 *((u8 *)req->buf) = value;
728 value = min(w_length, (u16) 1);
729 break;
730 default:
731unknown:
732 VDBG(cdev,
733 "non-core control req%02x.%02x v%04x i%04x l%d\n",
734 ctrl->bRequestType, ctrl->bRequest,
735 w_value, w_index, w_length);
736
737 /* functions always handle their interfaces ... punt other
738 * recipients (endpoint, other, WUSB, ...) to the current
739 * configuration code.
740 *
741 * REVISIT it could make sense to let the composite device
742 * take such requests too, if that's ever needed: to work
743 * in config 0, etc.
744 */
745 if ((ctrl->bRequestType & USB_RECIP_MASK)
746 == USB_RECIP_INTERFACE) {
747 f = cdev->config->interface[w_index];
748 if (f && f->setup)
749 value = f->setup(f, ctrl);
750 else
751 f = NULL;
752 }
753 if (value < 0 && !f) {
754 struct usb_configuration *c;
755
756 c = cdev->config;
757 if (c && c->setup)
758 value = c->setup(c, ctrl);
759 }
760
761 goto done;
762 }
763
764 /* respond with data transfer before status phase? */
765 if (value >= 0) {
766 req->length = value;
767 req->zero = value < w_length;
768 value = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC);
769 if (value < 0) {
770 DBG(cdev, "ep_queue --> %d\n", value);
771 req->status = 0;
772 composite_setup_complete(gadget->ep0, req);
773 }
774 }
775
776done:
777 /* device either stalls (value < 0) or reports success */
778 return value;
779}
780
781static void composite_disconnect(struct usb_gadget *gadget)
782{
783 struct usb_composite_dev *cdev = get_gadget_data(gadget);
784 unsigned long flags;
785
786 /* REVISIT: should we have config and device level
787 * disconnect callbacks?
788 */
789 spin_lock_irqsave(&cdev->lock, flags);
790 if (cdev->config)
791 reset_config(cdev);
792 spin_unlock_irqrestore(&cdev->lock, flags);
793}
794
795/*-------------------------------------------------------------------------*/
796
797static void /* __init_or_exit */
798composite_unbind(struct usb_gadget *gadget)
799{
800 struct usb_composite_dev *cdev = get_gadget_data(gadget);
801
802 /* composite_disconnect() must already have been called
803 * by the underlying peripheral controller driver!
804 * so there's no i/o concurrency that could affect the
805 * state protected by cdev->lock.
806 */
807 WARN_ON(cdev->config);
808
809 while (!list_empty(&cdev->configs)) {
810 struct usb_configuration *c;
811
812 c = list_first_entry(&cdev->configs,
813 struct usb_configuration, list);
814 while (!list_empty(&c->functions)) {
815 struct usb_function *f;
816
817 f = list_first_entry(&c->functions,
818 struct usb_function, list);
819 list_del(&f->list);
820 if (f->unbind) {
821 DBG(cdev, "unbind function '%s'/%p\n",
822 f->name, f);
823 f->unbind(c, f);
824 /* may free memory for "f" */
825 }
826 }
827 list_del(&c->list);
828 if (c->unbind) {
829 DBG(cdev, "unbind config '%s'/%p\n", c->label, c);
830 c->unbind(c);
831 /* may free memory for "c" */
832 }
833 }
834 if (composite->unbind)
835 composite->unbind(cdev);
836
837 if (cdev->req) {
838 kfree(cdev->req->buf);
839 usb_ep_free_request(gadget->ep0, cdev->req);
840 }
841 kfree(cdev);
842 set_gadget_data(gadget, NULL);
843 composite = NULL;
844}
845
846static void __init
847string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s)
848{
849 struct usb_string *str = tab->strings;
850
851 for (str = tab->strings; str->s; str++) {
852 if (str->id == id) {
853 str->s = s;
854 return;
855 }
856 }
857}
858
859static void __init
860string_override(struct usb_gadget_strings **tab, u8 id, const char *s)
861{
862 while (*tab) {
863 string_override_one(*tab, id, s);
864 tab++;
865 }
866}
867
868static int __init composite_bind(struct usb_gadget *gadget)
869{
870 struct usb_composite_dev *cdev;
871 int status = -ENOMEM;
872
873 cdev = kzalloc(sizeof *cdev, GFP_KERNEL);
874 if (!cdev)
875 return status;
876
877 spin_lock_init(&cdev->lock);
878 cdev->gadget = gadget;
879 set_gadget_data(gadget, cdev);
880 INIT_LIST_HEAD(&cdev->configs);
881
882 /* preallocate control response and buffer */
883 cdev->req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL);
884 if (!cdev->req)
885 goto fail;
886 cdev->req->buf = kmalloc(USB_BUFSIZ, GFP_KERNEL);
887 if (!cdev->req->buf)
888 goto fail;
889 cdev->req->complete = composite_setup_complete;
890 gadget->ep0->driver_data = cdev;
891
892 cdev->bufsiz = USB_BUFSIZ;
893 cdev->driver = composite;
894
895 usb_gadget_set_selfpowered(gadget);
896
897 /* interface and string IDs start at zero via kzalloc.
898 * we force endpoints to start unassigned; few controller
899 * drivers will zero ep->driver_data.
900 */
901 usb_ep_autoconfig_reset(cdev->gadget);
902
903 /* composite gadget needs to assign strings for whole device (like
904 * serial number), register function drivers, potentially update
905 * power state and consumption, etc
906 */
907 status = composite->bind(cdev);
908 if (status < 0)
909 goto fail;
910
911 cdev->desc = *composite->dev;
912 cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
913
914 /* standardized runtime overrides for device ID data */
915 if (idVendor)
916 cdev->desc.idVendor = cpu_to_le16(idVendor);
917 if (idProduct)
918 cdev->desc.idProduct = cpu_to_le16(idProduct);
919 if (bcdDevice)
920 cdev->desc.bcdDevice = cpu_to_le16(bcdDevice);
921
922 /* strings can't be assigned before bind() allocates the
923 * releavnt identifiers
924 */
925 if (cdev->desc.iManufacturer && iManufacturer)
926 string_override(composite->strings,
927 cdev->desc.iManufacturer, iManufacturer);
928 if (cdev->desc.iProduct && iProduct)
929 string_override(composite->strings,
930 cdev->desc.iProduct, iProduct);
931 if (cdev->desc.iSerialNumber && iSerialNumber)
932 string_override(composite->strings,
933 cdev->desc.iSerialNumber, iSerialNumber);
934
935 INFO(cdev, "%s ready\n", composite->name);
936 return 0;
937
938fail:
939 composite_unbind(gadget);
940 return status;
941}
942
943/*-------------------------------------------------------------------------*/
944
945static void
946composite_suspend(struct usb_gadget *gadget)
947{
948 struct usb_composite_dev *cdev = get_gadget_data(gadget);
949 struct usb_function *f;
950
951 /* REVISIT: should we have config and device level
952 * suspend/resume callbacks?
953 */
954 DBG(cdev, "suspend\n");
955 if (cdev->config) {
956 list_for_each_entry(f, &cdev->config->functions, list) {
957 if (f->suspend)
958 f->suspend(f);
959 }
960 }
961}
962
963static void
964composite_resume(struct usb_gadget *gadget)
965{
966 struct usb_composite_dev *cdev = get_gadget_data(gadget);
967 struct usb_function *f;
968
969 /* REVISIT: should we have config and device level
970 * suspend/resume callbacks?
971 */
972 DBG(cdev, "resume\n");
973 if (cdev->config) {
974 list_for_each_entry(f, &cdev->config->functions, list) {
975 if (f->resume)
976 f->resume(f);
977 }
978 }
979}
980
981/*-------------------------------------------------------------------------*/
982
983static struct usb_gadget_driver composite_driver = {
984 .speed = USB_SPEED_HIGH,
985
986 .bind = composite_bind,
987 .unbind = __exit_p(composite_unbind),
988
989 .setup = composite_setup,
990 .disconnect = composite_disconnect,
991
992 .suspend = composite_suspend,
993 .resume = composite_resume,
994
995 .driver = {
996 .owner = THIS_MODULE,
997 },
998};
999
1000/**
1001 * usb_composite_register() - register a composite driver
1002 * @driver: the driver to register
1003 * Context: single threaded during gadget setup
1004 *
1005 * This function is used to register drivers using the composite driver
1006 * framework. The return value is zero, or a negative errno value.
1007 * Those values normally come from the driver's @bind method, which does
1008 * all the work of setting up the driver to match the hardware.
1009 *
1010 * On successful return, the gadget is ready to respond to requests from
1011 * the host, unless one of its components invokes usb_gadget_disconnect()
1012 * while it was binding. That would usually be done in order to wait for
1013 * some userspace participation.
1014 */
1015int __init usb_composite_register(struct usb_composite_driver *driver)
1016{
1017 if (!driver || !driver->dev || !driver->bind || composite)
1018 return -EINVAL;
1019
1020 if (!driver->name)
1021 driver->name = "composite";
1022 composite_driver.function = (char *) driver->name;
1023 composite_driver.driver.name = driver->name;
1024 composite = driver;
1025
1026 return usb_gadget_register_driver(&composite_driver);
1027}
1028
1029/**
1030 * usb_composite_unregister() - unregister a composite driver
1031 * @driver: the driver to unregister
1032 *
1033 * This function is used to unregister drivers using the composite
1034 * driver framework.
1035 */
1036void __exit usb_composite_unregister(struct usb_composite_driver *driver)
1037{
1038 if (composite != driver)
1039 return;
1040 usb_gadget_unregister_driver(&composite_driver);
1041}
diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c
index a4e54b2743f0..1ca1c326392a 100644
--- a/drivers/usb/gadget/config.c
+++ b/drivers/usb/gadget/config.c
@@ -96,7 +96,7 @@ int usb_gadget_config_buf(
96 /* config descriptor first */ 96 /* config descriptor first */
97 if (length < USB_DT_CONFIG_SIZE || !desc) 97 if (length < USB_DT_CONFIG_SIZE || !desc)
98 return -EINVAL; 98 return -EINVAL;
99 *cp = *config; 99 *cp = *config;
100 100
101 /* then interface/endpoint/class/vendor/... */ 101 /* then interface/endpoint/class/vendor/... */
102 len = usb_descriptor_fillbuf(USB_DT_CONFIG_SIZE + (u8*)buf, 102 len = usb_descriptor_fillbuf(USB_DT_CONFIG_SIZE + (u8*)buf,
@@ -115,3 +115,77 @@ int usb_gadget_config_buf(
115 return len; 115 return len;
116} 116}
117 117
118/**
119 * usb_copy_descriptors - copy a vector of USB descriptors
120 * @src: null-terminated vector to copy
121 * Context: initialization code, which may sleep
122 *
123 * This makes a copy of a vector of USB descriptors. Its primary use
124 * is to support usb_function objects which can have multiple copies,
125 * each needing different descriptors. Functions may have static
126 * tables of descriptors, which are used as templates and customized
127 * with identifiers (for interfaces, strings, endpoints, and more)
128 * as needed by a given function instance.
129 */
130struct usb_descriptor_header **__init
131usb_copy_descriptors(struct usb_descriptor_header **src)
132{
133 struct usb_descriptor_header **tmp;
134 unsigned bytes;
135 unsigned n_desc;
136 void *mem;
137 struct usb_descriptor_header **ret;
138
139 /* count descriptors and their sizes; then add vector size */
140 for (bytes = 0, n_desc = 0, tmp = src; *tmp; tmp++, n_desc++)
141 bytes += (*tmp)->bLength;
142 bytes += (n_desc + 1) * sizeof(*tmp);
143
144 mem = kmalloc(bytes, GFP_KERNEL);
145 if (!mem)
146 return NULL;
147
148 /* fill in pointers starting at "tmp",
149 * to descriptors copied starting at "mem";
150 * and return "ret"
151 */
152 tmp = mem;
153 ret = mem;
154 mem += (n_desc + 1) * sizeof(*tmp);
155 while (*src) {
156 memcpy(mem, *src, (*src)->bLength);
157 *tmp = mem;
158 tmp++;
159 mem += (*src)->bLength;
160 src++;
161 }
162 *tmp = NULL;
163
164 return ret;
165}
166
167/**
168 * usb_find_endpoint - find a copy of an endpoint descriptor
169 * @src: original vector of descriptors
170 * @copy: copy of @src
171 * @ep: endpoint descriptor found in @src
172 *
173 * This returns the copy of the @match descriptor made for @copy. Its
174 * intended use is to help remembering the endpoint descriptor to use
175 * when enabling a given endpoint.
176 */
177struct usb_endpoint_descriptor *__init
178usb_find_endpoint(
179 struct usb_descriptor_header **src,
180 struct usb_descriptor_header **copy,
181 struct usb_endpoint_descriptor *match
182)
183{
184 while (*src) {
185 if (*src == (void *) match)
186 return (void *)*copy;
187 src++;
188 copy++;
189 }
190 return NULL;
191}
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index 42036192a03c..21d1406af9ee 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -862,7 +862,7 @@ static int dummy_udc_probe (struct platform_device *pdev)
862 /* maybe claim OTG support, though we won't complete HNP */ 862 /* maybe claim OTG support, though we won't complete HNP */
863 dum->gadget.is_otg = (dummy_to_hcd(dum)->self.otg_port != 0); 863 dum->gadget.is_otg = (dummy_to_hcd(dum)->self.otg_port != 0);
864 864
865 strcpy (dum->gadget.dev.bus_id, "gadget"); 865 dev_set_name(&dum->gadget.dev, "gadget");
866 dum->gadget.dev.parent = &pdev->dev; 866 dum->gadget.dev.parent = &pdev->dev;
867 dum->gadget.dev.release = dummy_gadget_release; 867 dum->gadget.dev.release = dummy_gadget_release;
868 rc = device_register (&dum->gadget.dev); 868 rc = device_register (&dum->gadget.dev);
@@ -1865,7 +1865,7 @@ static int dummy_hcd_probe(struct platform_device *pdev)
1865 1865
1866 dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); 1866 dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
1867 1867
1868 hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, pdev->dev.bus_id); 1868 hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
1869 if (!hcd) 1869 if (!hcd)
1870 return -ENOMEM; 1870 return -ENOMEM;
1871 the_controller = hcd_to_dummy (hcd); 1871 the_controller = hcd_to_dummy (hcd);
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 8bdad221fa91..9462e30192d8 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -159,6 +159,7 @@ ep_matches (
159 /* MATCH!! */ 159 /* MATCH!! */
160 160
161 /* report address */ 161 /* report address */
162 desc->bEndpointAddress &= USB_DIR_IN;
162 if (isdigit (ep->name [2])) { 163 if (isdigit (ep->name [2])) {
163 u8 num = simple_strtol (&ep->name [2], NULL, 10); 164 u8 num = simple_strtol (&ep->name [2], NULL, 10);
164 desc->bEndpointAddress |= num; 165 desc->bEndpointAddress |= num;
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 4ce3950b997f..d7aaaa29b1e1 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -1,8 +1,9 @@
1/* 1/*
2 * ether.c -- Ethernet gadget driver, with CDC and non-CDC options 2 * ether.c -- Ethernet gadget driver, with CDC and non-CDC options
3 * 3 *
4 * Copyright (C) 2003-2005 David Brownell 4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger 5 * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
6 * Copyright (C) 2008 Nokia Corporation
6 * 7 *
7 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
@@ -23,18 +24,9 @@
23 24
24#include <linux/kernel.h> 25#include <linux/kernel.h>
25#include <linux/utsname.h> 26#include <linux/utsname.h>
26#include <linux/device.h>
27#include <linux/ctype.h>
28#include <linux/etherdevice.h>
29#include <linux/ethtool.h>
30 27
31#include <linux/usb/ch9.h> 28#include "u_ether.h"
32#include <linux/usb/cdc.h>
33#include <linux/usb/gadget.h>
34 29
35#include "gadget_chips.h"
36
37/*-------------------------------------------------------------------------*/
38 30
39/* 31/*
40 * Ethernet gadget driver -- with CDC and non-CDC options 32 * Ethernet gadget driver -- with CDC and non-CDC options
@@ -46,7 +38,11 @@
46 * this USB-IF standard as its open-systems interoperability solution; 38 * this USB-IF standard as its open-systems interoperability solution;
47 * most host side USB stacks (except from Microsoft) support it. 39 * most host side USB stacks (except from Microsoft) support it.
48 * 40 *
49 * There's some hardware that can't talk CDC. We make that hardware 41 * This is sometimes called "CDC ECM" (Ethernet Control Model) to support
42 * TLA-soup. "CDC ACM" (Abstract Control Model) is for modems, and a new
43 * "CDC EEM" (Ethernet Emulation Model) is starting to spread.
44 *
45 * There's some hardware that can't talk CDC ECM. We make that hardware
50 * implement a "minimalist" vendor-agnostic CDC core: same framing, but 46 * implement a "minimalist" vendor-agnostic CDC core: same framing, but
51 * link-level setup only requires activating the configuration. Only the 47 * link-level setup only requires activating the configuration. Only the
52 * endpoint descriptors, and product/vendor IDs, are relevant; no control 48 * endpoint descriptors, and product/vendor IDs, are relevant; no control
@@ -64,70 +60,40 @@
64 * A third option is also in use. Rather than CDC Ethernet, or something 60 * A third option is also in use. Rather than CDC Ethernet, or something
65 * simpler, Microsoft pushes their own approach: RNDIS. The published 61 * simpler, Microsoft pushes their own approach: RNDIS. The published
66 * RNDIS specs are ambiguous and appear to be incomplete, and are also 62 * RNDIS specs are ambiguous and appear to be incomplete, and are also
67 * needlessly complex. 63 * needlessly complex. They borrow more from CDC ACM than CDC ECM.
68 */ 64 */
69 65
70#define DRIVER_DESC "Ethernet Gadget" 66#define DRIVER_DESC "Ethernet Gadget"
71#define DRIVER_VERSION "May Day 2005" 67#define DRIVER_VERSION "Memorial Day 2008"
72
73static const char shortname [] = "ether";
74static const char driver_desc [] = DRIVER_DESC;
75
76#define RX_EXTRA 20 /* guard against rx overflows */
77
78#include "rndis.h"
79 68
80#ifndef CONFIG_USB_ETH_RNDIS 69#ifdef CONFIG_USB_ETH_RNDIS
81#define rndis_uninit(x) do{}while(0) 70#define PREFIX "RNDIS/"
82#define rndis_deregister(c) do{}while(0) 71#else
83#define rndis_exit() do{}while(0) 72#define PREFIX ""
84#endif 73#endif
85 74
86/* CDC and RNDIS support the same host-chosen outgoing packet filters. */ 75/*
87#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ 76 * This driver aims for interoperability by using CDC ECM unless
88 |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ 77 *
89 |USB_CDC_PACKET_TYPE_PROMISCUOUS \ 78 * can_support_ecm()
90 |USB_CDC_PACKET_TYPE_DIRECTED) 79 *
91 80 * returns false, in which case it supports the CDC Subset. By default,
92 81 * that returns true; most hardware has no problems with CDC ECM, that's
93/*-------------------------------------------------------------------------*/ 82 * a good default. Previous versions of this driver had no default; this
94 83 * version changes that, removing overhead for new controller support.
95struct eth_dev {
96 spinlock_t lock;
97 struct usb_gadget *gadget;
98 struct usb_request *req; /* for control responses */
99 struct usb_request *stat_req; /* for cdc & rndis status */
100
101 u8 config;
102 struct usb_ep *in_ep, *out_ep, *status_ep;
103 const struct usb_endpoint_descriptor
104 *in, *out, *status;
105
106 spinlock_t req_lock;
107 struct list_head tx_reqs, rx_reqs;
108
109 struct net_device *net;
110 struct net_device_stats stats;
111 atomic_t tx_qlen;
112
113 struct work_struct work;
114 unsigned zlp:1;
115 unsigned cdc:1;
116 unsigned rndis:1;
117 unsigned suspended:1;
118 u16 cdc_filter;
119 unsigned long todo;
120#define WORK_RX_MEMORY 0
121 int rndis_config;
122 u8 host_mac [ETH_ALEN];
123};
124
125/* This version autoconfigures as much as possible at run-time.
126 * 84 *
127 * It also ASSUMES a self-powered device, without remote wakeup, 85 * IF YOUR HARDWARE CAN'T SUPPORT CDC ECM, UPDATE THAT ROUTINE!
128 * although remote wakeup support would make sense.
129 */ 86 */
130 87
88static inline bool has_rndis(void)
89{
90#ifdef CONFIG_USB_ETH_RNDIS
91 return true;
92#else
93 return false;
94#endif
95}
96
131/*-------------------------------------------------------------------------*/ 97/*-------------------------------------------------------------------------*/
132 98
133/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!! 99/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
@@ -137,8 +103,8 @@ struct eth_dev {
137/* Thanks to NetChip Technologies for donating this product ID. 103/* Thanks to NetChip Technologies for donating this product ID.
138 * It's for devices with only CDC Ethernet configurations. 104 * It's for devices with only CDC Ethernet configurations.
139 */ 105 */
140#define CDC_VENDOR_NUM 0x0525 /* NetChip */ 106#define CDC_VENDOR_NUM 0x0525 /* NetChip */
141#define CDC_PRODUCT_NUM 0xa4a1 /* Linux-USB Ethernet Gadget */ 107#define CDC_PRODUCT_NUM 0xa4a1 /* Linux-USB Ethernet Gadget */
142 108
143/* For hardware that can't talk CDC, we use the same vendor ID that 109/* For hardware that can't talk CDC, we use the same vendor ID that
144 * ARM Linux has used for ethernet-over-usb, both with sa1100 and 110 * ARM Linux has used for ethernet-over-usb, both with sa1100 and
@@ -162,274 +128,9 @@ struct eth_dev {
162#define RNDIS_VENDOR_NUM 0x0525 /* NetChip */ 128#define RNDIS_VENDOR_NUM 0x0525 /* NetChip */
163#define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */ 129#define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */
164 130
165
166/* Some systems will want different product identifers published in the
167 * device descriptor, either numbers or strings or both. These string
168 * parameters are in UTF-8 (superset of ASCII's 7 bit characters).
169 */
170
171static ushort idVendor;
172module_param(idVendor, ushort, S_IRUGO);
173MODULE_PARM_DESC(idVendor, "USB Vendor ID");
174
175static ushort idProduct;
176module_param(idProduct, ushort, S_IRUGO);
177MODULE_PARM_DESC(idProduct, "USB Product ID");
178
179static ushort bcdDevice;
180module_param(bcdDevice, ushort, S_IRUGO);
181MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)");
182
183static char *iManufacturer;
184module_param(iManufacturer, charp, S_IRUGO);
185MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string");
186
187static char *iProduct;
188module_param(iProduct, charp, S_IRUGO);
189MODULE_PARM_DESC(iProduct, "USB Product string");
190
191static char *iSerialNumber;
192module_param(iSerialNumber, charp, S_IRUGO);
193MODULE_PARM_DESC(iSerialNumber, "SerialNumber");
194
195/* initial value, changed by "ifconfig usb0 hw ether xx:xx:xx:xx:xx:xx" */
196static char *dev_addr;
197module_param(dev_addr, charp, S_IRUGO);
198MODULE_PARM_DESC(dev_addr, "Device Ethernet Address");
199
200/* this address is invisible to ifconfig */
201static char *host_addr;
202module_param(host_addr, charp, S_IRUGO);
203MODULE_PARM_DESC(host_addr, "Host Ethernet Address");
204
205
206/*-------------------------------------------------------------------------*/
207
208/* Include CDC support if we could run on CDC-capable hardware. */
209
210#ifdef CONFIG_USB_GADGET_NET2280
211#define DEV_CONFIG_CDC
212#endif
213
214#ifdef CONFIG_USB_GADGET_DUMMY_HCD
215#define DEV_CONFIG_CDC
216#endif
217
218#ifdef CONFIG_USB_GADGET_GOKU
219#define DEV_CONFIG_CDC
220#endif
221
222#ifdef CONFIG_USB_GADGET_LH7A40X
223#define DEV_CONFIG_CDC
224#endif
225
226#ifdef CONFIG_USB_GADGET_MQ11XX
227#define DEV_CONFIG_CDC
228#endif
229
230#ifdef CONFIG_USB_GADGET_OMAP
231#define DEV_CONFIG_CDC
232#endif
233
234#ifdef CONFIG_USB_GADGET_N9604
235#define DEV_CONFIG_CDC
236#endif
237
238#ifdef CONFIG_USB_GADGET_S3C2410
239#define DEV_CONFIG_CDC
240#endif
241
242#ifdef CONFIG_USB_GADGET_AT91
243#define DEV_CONFIG_CDC
244#endif
245
246#ifdef CONFIG_USB_GADGET_MUSBHSFC
247#define DEV_CONFIG_CDC
248#endif
249
250#ifdef CONFIG_USB_GADGET_MUSB_HDRC
251#define DEV_CONFIG_CDC
252#endif
253
254#ifdef CONFIG_USB_GADGET_ATMEL_USBA
255#define DEV_CONFIG_CDC
256#endif
257
258#ifdef CONFIG_USB_GADGET_FSL_USB2
259#define DEV_CONFIG_CDC
260#endif
261
262/* For CDC-incapable hardware, choose the simple cdc subset.
263 * Anything that talks bulk (without notable bugs) can do this.
264 */
265#ifdef CONFIG_USB_GADGET_PXA25X
266#define DEV_CONFIG_SUBSET
267#endif
268
269#ifdef CONFIG_USB_GADGET_PXA27X
270#define DEV_CONFIG_SUBSET
271#endif
272
273#ifdef CONFIG_USB_GADGET_SUPERH
274#define DEV_CONFIG_SUBSET
275#endif
276
277#ifdef CONFIG_USB_GADGET_SA1100
278/* use non-CDC for backwards compatibility */
279#define DEV_CONFIG_SUBSET
280#endif
281
282#ifdef CONFIG_USB_GADGET_M66592
283#define DEV_CONFIG_CDC
284#endif
285
286#ifdef CONFIG_USB_GADGET_AMD5536UDC
287#define DEV_CONFIG_CDC
288#endif
289
290
291/*-------------------------------------------------------------------------*/
292
293/* "main" config is either CDC, or its simple subset */
294static inline int is_cdc(struct eth_dev *dev)
295{
296#if !defined(DEV_CONFIG_SUBSET)
297 return 1; /* only cdc possible */
298#elif !defined (DEV_CONFIG_CDC)
299 return 0; /* only subset possible */
300#else
301 return dev->cdc; /* depends on what hardware we found */
302#endif
303}
304
305/* "secondary" RNDIS config may sometimes be activated */
306static inline int rndis_active(struct eth_dev *dev)
307{
308#ifdef CONFIG_USB_ETH_RNDIS
309 return dev->rndis;
310#else
311 return 0;
312#endif
313}
314
315#define subset_active(dev) (!is_cdc(dev) && !rndis_active(dev))
316#define cdc_active(dev) ( is_cdc(dev) && !rndis_active(dev))
317
318
319
320#define DEFAULT_QLEN 2 /* double buffering by default */
321
322/* peak bulk transfer bits-per-second */
323#define HS_BPS (13 * 512 * 8 * 1000 * 8)
324#define FS_BPS (19 * 64 * 1 * 1000 * 8)
325
326#ifdef CONFIG_USB_GADGET_DUALSPEED
327#define DEVSPEED USB_SPEED_HIGH
328
329static unsigned qmult = 5;
330module_param (qmult, uint, S_IRUGO|S_IWUSR);
331
332
333/* for dual-speed hardware, use deeper queues at highspeed */
334#define qlen(gadget) \
335 (DEFAULT_QLEN*((gadget->speed == USB_SPEED_HIGH) ? qmult : 1))
336
337static inline int BITRATE(struct usb_gadget *g)
338{
339 return (g->speed == USB_SPEED_HIGH) ? HS_BPS : FS_BPS;
340}
341
342#else /* full speed (low speed doesn't do bulk) */
343
344#define qmult 1
345
346#define DEVSPEED USB_SPEED_FULL
347
348#define qlen(gadget) DEFAULT_QLEN
349
350static inline int BITRATE(struct usb_gadget *g)
351{
352 return FS_BPS;
353}
354#endif
355
356
357/*-------------------------------------------------------------------------*/
358
359#define xprintk(d,level,fmt,args...) \
360 printk(level "%s: " fmt , (d)->net->name , ## args)
361
362#ifdef DEBUG
363#undef DEBUG
364#define DEBUG(dev,fmt,args...) \
365 xprintk(dev , KERN_DEBUG , fmt , ## args)
366#else
367#define DEBUG(dev,fmt,args...) \
368 do { } while (0)
369#endif /* DEBUG */
370
371#ifdef VERBOSE_DEBUG
372#define VDEBUG DEBUG
373#else
374#define VDEBUG(dev,fmt,args...) \
375 do { } while (0)
376#endif /* DEBUG */
377
378#define ERROR(dev,fmt,args...) \
379 xprintk(dev , KERN_ERR , fmt , ## args)
380#define WARN(dev,fmt,args...) \
381 xprintk(dev , KERN_WARNING , fmt , ## args)
382#define INFO(dev,fmt,args...) \
383 xprintk(dev , KERN_INFO , fmt , ## args)
384
385/*-------------------------------------------------------------------------*/ 131/*-------------------------------------------------------------------------*/
386 132
387/* USB DRIVER HOOKUP (to the hardware driver, below us), mostly 133static struct usb_device_descriptor device_desc = {
388 * ep0 implementation: descriptors, config management, setup().
389 * also optional class-specific notification interrupt transfer.
390 */
391
392/*
393 * DESCRIPTORS ... most are static, but strings and (full) configuration
394 * descriptors are built on demand. For now we do either full CDC, or
395 * our simple subset, with RNDIS as an optional second configuration.
396 *
397 * RNDIS includes some CDC ACM descriptors ... like CDC Ethernet. But
398 * the class descriptors match a modem (they're ignored; it's really just
399 * Ethernet functionality), they don't need the NOP altsetting, and the
400 * status transfer endpoint isn't optional.
401 */
402
403#define STRING_MANUFACTURER 1
404#define STRING_PRODUCT 2
405#define STRING_ETHADDR 3
406#define STRING_DATA 4
407#define STRING_CONTROL 5
408#define STRING_RNDIS_CONTROL 6
409#define STRING_CDC 7
410#define STRING_SUBSET 8
411#define STRING_RNDIS 9
412#define STRING_SERIALNUMBER 10
413
414/* holds our biggest descriptor (or RNDIS response) */
415#define USB_BUFSIZ 256
416
417/*
418 * This device advertises one configuration, eth_config, unless RNDIS
419 * is enabled (rndis_config) on hardware supporting at least two configs.
420 *
421 * NOTE: Controllers like superh_udc should probably be able to use
422 * an RNDIS-only configuration.
423 *
424 * FIXME define some higher-powered configurations to make it easier
425 * to recharge batteries ...
426 */
427
428#define DEV_CONFIG_VALUE 1 /* cdc or subset */
429#define DEV_RNDIS_CONFIG_VALUE 2 /* rndis; optional */
430
431static struct usb_device_descriptor
432device_desc = {
433 .bLength = sizeof device_desc, 134 .bLength = sizeof device_desc,
434 .bDescriptorType = USB_DT_DEVICE, 135 .bDescriptorType = USB_DT_DEVICE,
435 136
@@ -438,2220 +139,234 @@ device_desc = {
438 .bDeviceClass = USB_CLASS_COMM, 139 .bDeviceClass = USB_CLASS_COMM,
439 .bDeviceSubClass = 0, 140 .bDeviceSubClass = 0,
440 .bDeviceProtocol = 0, 141 .bDeviceProtocol = 0,
142 /* .bMaxPacketSize0 = f(hardware) */
441 143
144 /* Vendor and product id defaults change according to what configs
145 * we support. (As does bNumConfigurations.) These values can
146 * also be overridden by module parameters.
147 */
442 .idVendor = __constant_cpu_to_le16 (CDC_VENDOR_NUM), 148 .idVendor = __constant_cpu_to_le16 (CDC_VENDOR_NUM),
443 .idProduct = __constant_cpu_to_le16 (CDC_PRODUCT_NUM), 149 .idProduct = __constant_cpu_to_le16 (CDC_PRODUCT_NUM),
444 .iManufacturer = STRING_MANUFACTURER, 150 /* .bcdDevice = f(hardware) */
445 .iProduct = STRING_PRODUCT, 151 /* .iManufacturer = DYNAMIC */
152 /* .iProduct = DYNAMIC */
153 /* NO SERIAL NUMBER */
446 .bNumConfigurations = 1, 154 .bNumConfigurations = 1,
447}; 155};
448 156
449static struct usb_otg_descriptor 157static struct usb_otg_descriptor otg_descriptor = {
450otg_descriptor = {
451 .bLength = sizeof otg_descriptor, 158 .bLength = sizeof otg_descriptor,
452 .bDescriptorType = USB_DT_OTG, 159 .bDescriptorType = USB_DT_OTG,
453 160
454 .bmAttributes = USB_OTG_SRP, 161 /* REVISIT SRP-only hardware is possible, although
455}; 162 * it would not be called "OTG" ...
456 163 */
457static struct usb_config_descriptor 164 .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
458eth_config = {
459 .bLength = sizeof eth_config,
460 .bDescriptorType = USB_DT_CONFIG,
461
462 /* compute wTotalLength on the fly */
463 .bNumInterfaces = 2,
464 .bConfigurationValue = DEV_CONFIG_VALUE,
465 .iConfiguration = STRING_CDC,
466 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
467 .bMaxPower = 50,
468};
469
470#ifdef CONFIG_USB_ETH_RNDIS
471static struct usb_config_descriptor
472rndis_config = {
473 .bLength = sizeof rndis_config,
474 .bDescriptorType = USB_DT_CONFIG,
475
476 /* compute wTotalLength on the fly */
477 .bNumInterfaces = 2,
478 .bConfigurationValue = DEV_RNDIS_CONFIG_VALUE,
479 .iConfiguration = STRING_RNDIS,
480 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
481 .bMaxPower = 50,
482};
483#endif
484
485/*
486 * Compared to the simple CDC subset, the full CDC Ethernet model adds
487 * three class descriptors, two interface descriptors, optional status
488 * endpoint. Both have a "data" interface and two bulk endpoints.
489 * There are also differences in how control requests are handled.
490 *
491 * RNDIS shares a lot with CDC-Ethernet, since it's a variant of the
492 * CDC-ACM (modem) spec. Unfortunately MSFT's RNDIS driver is buggy; it
493 * may hang or oops. Since bugfixes (or accurate specs, letting Linux
494 * work around those bugs) are unlikely to ever come from MSFT, you may
495 * wish to avoid using RNDIS.
496 *
497 * MCCI offers an alternative to RNDIS if you need to connect to Windows
498 * but have hardware that can't support CDC Ethernet. We add descriptors
499 * to present the CDC Subset as a (nonconformant) CDC MDLM variant called
500 * "SAFE". That borrows from both CDC Ethernet and CDC MDLM. You can
501 * get those drivers from MCCI, or bundled with various products.
502 */
503
504#ifdef DEV_CONFIG_CDC
505static struct usb_interface_descriptor
506control_intf = {
507 .bLength = sizeof control_intf,
508 .bDescriptorType = USB_DT_INTERFACE,
509
510 .bInterfaceNumber = 0,
511 /* status endpoint is optional; this may be patched later */
512 .bNumEndpoints = 1,
513 .bInterfaceClass = USB_CLASS_COMM,
514 .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET,
515 .bInterfaceProtocol = USB_CDC_PROTO_NONE,
516 .iInterface = STRING_CONTROL,
517};
518#endif
519
520#ifdef CONFIG_USB_ETH_RNDIS
521static const struct usb_interface_descriptor
522rndis_control_intf = {
523 .bLength = sizeof rndis_control_intf,
524 .bDescriptorType = USB_DT_INTERFACE,
525
526 .bInterfaceNumber = 0,
527 .bNumEndpoints = 1,
528 .bInterfaceClass = USB_CLASS_COMM,
529 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
530 .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
531 .iInterface = STRING_RNDIS_CONTROL,
532};
533#endif
534
535static const struct usb_cdc_header_desc header_desc = {
536 .bLength = sizeof header_desc,
537 .bDescriptorType = USB_DT_CS_INTERFACE,
538 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
539
540 .bcdCDC = __constant_cpu_to_le16 (0x0110),
541};
542
543#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
544
545static const struct usb_cdc_union_desc union_desc = {
546 .bLength = sizeof union_desc,
547 .bDescriptorType = USB_DT_CS_INTERFACE,
548 .bDescriptorSubType = USB_CDC_UNION_TYPE,
549
550 .bMasterInterface0 = 0, /* index of control interface */
551 .bSlaveInterface0 = 1, /* index of DATA interface */
552};
553
554#endif /* CDC || RNDIS */
555
556#ifdef CONFIG_USB_ETH_RNDIS
557
558static const struct usb_cdc_call_mgmt_descriptor call_mgmt_descriptor = {
559 .bLength = sizeof call_mgmt_descriptor,
560 .bDescriptorType = USB_DT_CS_INTERFACE,
561 .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
562
563 .bmCapabilities = 0x00,
564 .bDataInterface = 0x01,
565};
566
567static const struct usb_cdc_acm_descriptor acm_descriptor = {
568 .bLength = sizeof acm_descriptor,
569 .bDescriptorType = USB_DT_CS_INTERFACE,
570 .bDescriptorSubType = USB_CDC_ACM_TYPE,
571
572 .bmCapabilities = 0x00,
573};
574
575#endif
576
577#ifndef DEV_CONFIG_CDC
578
579/* "SAFE" loosely follows CDC WMC MDLM, violating the spec in various
580 * ways: data endpoints live in the control interface, there's no data
581 * interface, and it's not used to talk to a cell phone radio.
582 */
583
584static const struct usb_cdc_mdlm_desc mdlm_desc = {
585 .bLength = sizeof mdlm_desc,
586 .bDescriptorType = USB_DT_CS_INTERFACE,
587 .bDescriptorSubType = USB_CDC_MDLM_TYPE,
588
589 .bcdVersion = __constant_cpu_to_le16(0x0100),
590 .bGUID = {
591 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6,
592 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f,
593 },
594};
595
596/* since "usb_cdc_mdlm_detail_desc" is a variable length structure, we
597 * can't really use its struct. All we do here is say that we're using
598 * the submode of "SAFE" which directly matches the CDC Subset.
599 */
600static const u8 mdlm_detail_desc[] = {
601 6,
602 USB_DT_CS_INTERFACE,
603 USB_CDC_MDLM_DETAIL_TYPE,
604
605 0, /* "SAFE" */
606 0, /* network control capabilities (none) */
607 0, /* network data capabilities ("raw" encapsulation) */
608};
609
610#endif
611
612static const struct usb_cdc_ether_desc ether_desc = {
613 .bLength = sizeof ether_desc,
614 .bDescriptorType = USB_DT_CS_INTERFACE,
615 .bDescriptorSubType = USB_CDC_ETHERNET_TYPE,
616
617 /* this descriptor actually adds value, surprise! */
618 .iMACAddress = STRING_ETHADDR,
619 .bmEthernetStatistics = __constant_cpu_to_le32 (0), /* no statistics */
620 .wMaxSegmentSize = __constant_cpu_to_le16 (ETH_FRAME_LEN),
621 .wNumberMCFilters = __constant_cpu_to_le16 (0),
622 .bNumberPowerFilters = 0,
623};
624
625
626#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
627
628/* include the status endpoint if we can, even where it's optional.
629 * use wMaxPacketSize big enough to fit CDC_NOTIFY_SPEED_CHANGE in one
630 * packet, to simplify cancellation; and a big transfer interval, to
631 * waste less bandwidth.
632 *
633 * some drivers (like Linux 2.4 cdc-ether!) "need" it to exist even
634 * if they ignore the connect/disconnect notifications that real aether
635 * can provide. more advanced cdc configurations might want to support
636 * encapsulated commands (vendor-specific, using control-OUT).
637 *
638 * RNDIS requires the status endpoint, since it uses that encapsulation
639 * mechanism for its funky RPC scheme.
640 */
641
642#define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */
643#define STATUS_BYTECOUNT 16 /* 8 byte header + data */
644
645static struct usb_endpoint_descriptor
646fs_status_desc = {
647 .bLength = USB_DT_ENDPOINT_SIZE,
648 .bDescriptorType = USB_DT_ENDPOINT,
649
650 .bEndpointAddress = USB_DIR_IN,
651 .bmAttributes = USB_ENDPOINT_XFER_INT,
652 .wMaxPacketSize = __constant_cpu_to_le16 (STATUS_BYTECOUNT),
653 .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC,
654};
655#endif
656
657#ifdef DEV_CONFIG_CDC
658
659/* the default data interface has no endpoints ... */
660
661static const struct usb_interface_descriptor
662data_nop_intf = {
663 .bLength = sizeof data_nop_intf,
664 .bDescriptorType = USB_DT_INTERFACE,
665
666 .bInterfaceNumber = 1,
667 .bAlternateSetting = 0,
668 .bNumEndpoints = 0,
669 .bInterfaceClass = USB_CLASS_CDC_DATA,
670 .bInterfaceSubClass = 0,
671 .bInterfaceProtocol = 0,
672};
673
674/* ... but the "real" data interface has two bulk endpoints */
675
676static const struct usb_interface_descriptor
677data_intf = {
678 .bLength = sizeof data_intf,
679 .bDescriptorType = USB_DT_INTERFACE,
680
681 .bInterfaceNumber = 1,
682 .bAlternateSetting = 1,
683 .bNumEndpoints = 2,
684 .bInterfaceClass = USB_CLASS_CDC_DATA,
685 .bInterfaceSubClass = 0,
686 .bInterfaceProtocol = 0,
687 .iInterface = STRING_DATA,
688};
689
690#endif
691
692#ifdef CONFIG_USB_ETH_RNDIS
693
694/* RNDIS doesn't activate by changing to the "real" altsetting */
695
696static const struct usb_interface_descriptor
697rndis_data_intf = {
698 .bLength = sizeof rndis_data_intf,
699 .bDescriptorType = USB_DT_INTERFACE,
700
701 .bInterfaceNumber = 1,
702 .bAlternateSetting = 0,
703 .bNumEndpoints = 2,
704 .bInterfaceClass = USB_CLASS_CDC_DATA,
705 .bInterfaceSubClass = 0,
706 .bInterfaceProtocol = 0,
707 .iInterface = STRING_DATA,
708};
709
710#endif
711
712#ifdef DEV_CONFIG_SUBSET
713
714/*
715 * "Simple" CDC-subset option is a simple vendor-neutral model that most
716 * full speed controllers can handle: one interface, two bulk endpoints.
717 *
718 * To assist host side drivers, we fancy it up a bit, and add descriptors
719 * so some host side drivers will understand it as a "SAFE" variant.
720 */
721
722static const struct usb_interface_descriptor
723subset_data_intf = {
724 .bLength = sizeof subset_data_intf,
725 .bDescriptorType = USB_DT_INTERFACE,
726
727 .bInterfaceNumber = 0,
728 .bAlternateSetting = 0,
729 .bNumEndpoints = 2,
730 .bInterfaceClass = USB_CLASS_COMM,
731 .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM,
732 .bInterfaceProtocol = 0,
733 .iInterface = STRING_DATA,
734};
735
736#endif /* SUBSET */
737
738
739static struct usb_endpoint_descriptor
740fs_source_desc = {
741 .bLength = USB_DT_ENDPOINT_SIZE,
742 .bDescriptorType = USB_DT_ENDPOINT,
743
744 .bEndpointAddress = USB_DIR_IN,
745 .bmAttributes = USB_ENDPOINT_XFER_BULK,
746};
747
748static struct usb_endpoint_descriptor
749fs_sink_desc = {
750 .bLength = USB_DT_ENDPOINT_SIZE,
751 .bDescriptorType = USB_DT_ENDPOINT,
752
753 .bEndpointAddress = USB_DIR_OUT,
754 .bmAttributes = USB_ENDPOINT_XFER_BULK,
755}; 165};
756 166
757static const struct usb_descriptor_header *fs_eth_function [11] = { 167static const struct usb_descriptor_header *otg_desc[] = {
758 (struct usb_descriptor_header *) &otg_descriptor, 168 (struct usb_descriptor_header *) &otg_descriptor,
759#ifdef DEV_CONFIG_CDC
760 /* "cdc" mode descriptors */
761 (struct usb_descriptor_header *) &control_intf,
762 (struct usb_descriptor_header *) &header_desc,
763 (struct usb_descriptor_header *) &union_desc,
764 (struct usb_descriptor_header *) &ether_desc,
765 /* NOTE: status endpoint may need to be removed */
766 (struct usb_descriptor_header *) &fs_status_desc,
767 /* data interface, with altsetting */
768 (struct usb_descriptor_header *) &data_nop_intf,
769 (struct usb_descriptor_header *) &data_intf,
770 (struct usb_descriptor_header *) &fs_source_desc,
771 (struct usb_descriptor_header *) &fs_sink_desc,
772 NULL, 169 NULL,
773#endif /* DEV_CONFIG_CDC */
774}; 170};
775 171
776static inline void __init fs_subset_descriptors(void)
777{
778#ifdef DEV_CONFIG_SUBSET
779 /* behavior is "CDC Subset"; extra descriptors say "SAFE" */
780 fs_eth_function[1] = (struct usb_descriptor_header *) &subset_data_intf;
781 fs_eth_function[2] = (struct usb_descriptor_header *) &header_desc;
782 fs_eth_function[3] = (struct usb_descriptor_header *) &mdlm_desc;
783 fs_eth_function[4] = (struct usb_descriptor_header *) &mdlm_detail_desc;
784 fs_eth_function[5] = (struct usb_descriptor_header *) &ether_desc;
785 fs_eth_function[6] = (struct usb_descriptor_header *) &fs_source_desc;
786 fs_eth_function[7] = (struct usb_descriptor_header *) &fs_sink_desc;
787 fs_eth_function[8] = NULL;
788#else
789 fs_eth_function[1] = NULL;
790#endif
791}
792 172
793#ifdef CONFIG_USB_ETH_RNDIS 173/* string IDs are assigned dynamically */
794static const struct usb_descriptor_header *fs_rndis_function [] = {
795 (struct usb_descriptor_header *) &otg_descriptor,
796 /* control interface matches ACM, not Ethernet */
797 (struct usb_descriptor_header *) &rndis_control_intf,
798 (struct usb_descriptor_header *) &header_desc,
799 (struct usb_descriptor_header *) &call_mgmt_descriptor,
800 (struct usb_descriptor_header *) &acm_descriptor,
801 (struct usb_descriptor_header *) &union_desc,
802 (struct usb_descriptor_header *) &fs_status_desc,
803 /* data interface has no altsetting */
804 (struct usb_descriptor_header *) &rndis_data_intf,
805 (struct usb_descriptor_header *) &fs_source_desc,
806 (struct usb_descriptor_header *) &fs_sink_desc,
807 NULL,
808};
809#endif
810
811/*
812 * usb 2.0 devices need to expose both high speed and full speed
813 * descriptors, unless they only run at full speed.
814 */
815
816#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
817static struct usb_endpoint_descriptor
818hs_status_desc = {
819 .bLength = USB_DT_ENDPOINT_SIZE,
820 .bDescriptorType = USB_DT_ENDPOINT,
821
822 .bmAttributes = USB_ENDPOINT_XFER_INT,
823 .wMaxPacketSize = __constant_cpu_to_le16 (STATUS_BYTECOUNT),
824 .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4,
825};
826#endif /* DEV_CONFIG_CDC */
827
828static struct usb_endpoint_descriptor
829hs_source_desc = {
830 .bLength = USB_DT_ENDPOINT_SIZE,
831 .bDescriptorType = USB_DT_ENDPOINT,
832
833 .bmAttributes = USB_ENDPOINT_XFER_BULK,
834 .wMaxPacketSize = __constant_cpu_to_le16 (512),
835};
836
837static struct usb_endpoint_descriptor
838hs_sink_desc = {
839 .bLength = USB_DT_ENDPOINT_SIZE,
840 .bDescriptorType = USB_DT_ENDPOINT,
841
842 .bmAttributes = USB_ENDPOINT_XFER_BULK,
843 .wMaxPacketSize = __constant_cpu_to_le16 (512),
844};
845 174
846static struct usb_qualifier_descriptor 175#define STRING_MANUFACTURER_IDX 0
847dev_qualifier = { 176#define STRING_PRODUCT_IDX 1
848 .bLength = sizeof dev_qualifier,
849 .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
850 177
851 .bcdUSB = __constant_cpu_to_le16 (0x0200), 178static char manufacturer[50];
852 .bDeviceClass = USB_CLASS_COMM,
853 179
854 .bNumConfigurations = 1, 180static struct usb_string strings_dev[] = {
181 [STRING_MANUFACTURER_IDX].s = manufacturer,
182 [STRING_PRODUCT_IDX].s = PREFIX DRIVER_DESC,
183 { } /* end of list */
855}; 184};
856 185
857static const struct usb_descriptor_header *hs_eth_function [11] = { 186static struct usb_gadget_strings stringtab_dev = {
858 (struct usb_descriptor_header *) &otg_descriptor, 187 .language = 0x0409, /* en-us */
859#ifdef DEV_CONFIG_CDC 188 .strings = strings_dev,
860 /* "cdc" mode descriptors */
861 (struct usb_descriptor_header *) &control_intf,
862 (struct usb_descriptor_header *) &header_desc,
863 (struct usb_descriptor_header *) &union_desc,
864 (struct usb_descriptor_header *) &ether_desc,
865 /* NOTE: status endpoint may need to be removed */
866 (struct usb_descriptor_header *) &hs_status_desc,
867 /* data interface, with altsetting */
868 (struct usb_descriptor_header *) &data_nop_intf,
869 (struct usb_descriptor_header *) &data_intf,
870 (struct usb_descriptor_header *) &hs_source_desc,
871 (struct usb_descriptor_header *) &hs_sink_desc,
872 NULL,
873#endif /* DEV_CONFIG_CDC */
874}; 189};
875 190
876static inline void __init hs_subset_descriptors(void) 191static struct usb_gadget_strings *dev_strings[] = {
877{ 192 &stringtab_dev,
878#ifdef DEV_CONFIG_SUBSET
879 /* behavior is "CDC Subset"; extra descriptors say "SAFE" */
880 hs_eth_function[1] = (struct usb_descriptor_header *) &subset_data_intf;
881 hs_eth_function[2] = (struct usb_descriptor_header *) &header_desc;
882 hs_eth_function[3] = (struct usb_descriptor_header *) &mdlm_desc;
883 hs_eth_function[4] = (struct usb_descriptor_header *) &mdlm_detail_desc;
884 hs_eth_function[5] = (struct usb_descriptor_header *) &ether_desc;
885 hs_eth_function[6] = (struct usb_descriptor_header *) &hs_source_desc;
886 hs_eth_function[7] = (struct usb_descriptor_header *) &hs_sink_desc;
887 hs_eth_function[8] = NULL;
888#else
889 hs_eth_function[1] = NULL;
890#endif
891}
892
893#ifdef CONFIG_USB_ETH_RNDIS
894static const struct usb_descriptor_header *hs_rndis_function [] = {
895 (struct usb_descriptor_header *) &otg_descriptor,
896 /* control interface matches ACM, not Ethernet */
897 (struct usb_descriptor_header *) &rndis_control_intf,
898 (struct usb_descriptor_header *) &header_desc,
899 (struct usb_descriptor_header *) &call_mgmt_descriptor,
900 (struct usb_descriptor_header *) &acm_descriptor,
901 (struct usb_descriptor_header *) &union_desc,
902 (struct usb_descriptor_header *) &hs_status_desc,
903 /* data interface has no altsetting */
904 (struct usb_descriptor_header *) &rndis_data_intf,
905 (struct usb_descriptor_header *) &hs_source_desc,
906 (struct usb_descriptor_header *) &hs_sink_desc,
907 NULL, 193 NULL,
908}; 194};
909#endif
910
911
912/* maxpacket and other transfer characteristics vary by speed. */
913static inline struct usb_endpoint_descriptor *
914ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *hs,
915 struct usb_endpoint_descriptor *fs)
916{
917 if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
918 return hs;
919 return fs;
920}
921 195
196static u8 hostaddr[ETH_ALEN];
922 197
923/*-------------------------------------------------------------------------*/ 198/*-------------------------------------------------------------------------*/
924 199
925/* descriptors that are built on-demand */
926
927static char manufacturer [50];
928static char product_desc [40] = DRIVER_DESC;
929static char serial_number [20];
930
931/* address that the host will use ... usually assigned at random */
932static char ethaddr [2 * ETH_ALEN + 1];
933
934/* static strings, in UTF-8 */
935static struct usb_string strings [] = {
936 { STRING_MANUFACTURER, manufacturer, },
937 { STRING_PRODUCT, product_desc, },
938 { STRING_SERIALNUMBER, serial_number, },
939 { STRING_DATA, "Ethernet Data", },
940 { STRING_ETHADDR, ethaddr, },
941#ifdef DEV_CONFIG_CDC
942 { STRING_CDC, "CDC Ethernet", },
943 { STRING_CONTROL, "CDC Communications Control", },
944#endif
945#ifdef DEV_CONFIG_SUBSET
946 { STRING_SUBSET, "CDC Ethernet Subset", },
947#endif
948#ifdef CONFIG_USB_ETH_RNDIS
949 { STRING_RNDIS, "RNDIS", },
950 { STRING_RNDIS_CONTROL, "RNDIS Communications Control", },
951#endif
952 { } /* end of list */
953};
954
955static struct usb_gadget_strings stringtab = {
956 .language = 0x0409, /* en-us */
957 .strings = strings,
958};
959
960/* 200/*
961 * one config, two interfaces: control, data. 201 * We may not have an RNDIS configuration, but if we do it needs to be
962 * complications: class descriptors, and an altsetting. 202 * the first one present. That's to make Microsoft's drivers happy,
963 */ 203 * and to follow DOCSIS 1.0 (cable modem standard).
964static int
965config_buf(struct usb_gadget *g, u8 *buf, u8 type, unsigned index, int is_otg)
966{
967 int len;
968 const struct usb_config_descriptor *config;
969 const struct usb_descriptor_header **function;
970 int hs = 0;
971
972 if (gadget_is_dualspeed(g)) {
973 hs = (g->speed == USB_SPEED_HIGH);
974 if (type == USB_DT_OTHER_SPEED_CONFIG)
975 hs = !hs;
976 }
977#define which_fn(t) (hs ? hs_ ## t ## _function : fs_ ## t ## _function)
978
979 if (index >= device_desc.bNumConfigurations)
980 return -EINVAL;
981
982#ifdef CONFIG_USB_ETH_RNDIS
983 /* list the RNDIS config first, to make Microsoft's drivers
984 * happy. DOCSIS 1.0 needs this too.
985 */
986 if (device_desc.bNumConfigurations == 2 && index == 0) {
987 config = &rndis_config;
988 function = which_fn (rndis);
989 } else
990#endif
991 {
992 config = &eth_config;
993 function = which_fn (eth);
994 }
995
996 /* for now, don't advertise srp-only devices */
997 if (!is_otg)
998 function++;
999
1000 len = usb_gadget_config_buf (config, buf, USB_BUFSIZ, function);
1001 if (len < 0)
1002 return len;
1003 ((struct usb_config_descriptor *) buf)->bDescriptorType = type;
1004 return len;
1005}
1006
1007/*-------------------------------------------------------------------------*/
1008
1009static void eth_start (struct eth_dev *dev, gfp_t gfp_flags);
1010static int alloc_requests (struct eth_dev *dev, unsigned n, gfp_t gfp_flags);
1011
1012static int
1013set_ether_config (struct eth_dev *dev, gfp_t gfp_flags)
1014{
1015 int result = 0;
1016 struct usb_gadget *gadget = dev->gadget;
1017
1018#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
1019 /* status endpoint used for RNDIS and (optionally) CDC */
1020 if (!subset_active(dev) && dev->status_ep) {
1021 dev->status = ep_desc (gadget, &hs_status_desc,
1022 &fs_status_desc);
1023 dev->status_ep->driver_data = dev;
1024
1025 result = usb_ep_enable (dev->status_ep, dev->status);
1026 if (result != 0) {
1027 DEBUG (dev, "enable %s --> %d\n",
1028 dev->status_ep->name, result);
1029 goto done;
1030 }
1031 }
1032#endif
1033
1034 dev->in = ep_desc(gadget, &hs_source_desc, &fs_source_desc);
1035 dev->in_ep->driver_data = dev;
1036
1037 dev->out = ep_desc(gadget, &hs_sink_desc, &fs_sink_desc);
1038 dev->out_ep->driver_data = dev;
1039
1040 /* With CDC, the host isn't allowed to use these two data
1041 * endpoints in the default altsetting for the interface.
1042 * so we don't activate them yet. Reset from SET_INTERFACE.
1043 *
1044 * Strictly speaking RNDIS should work the same: activation is
1045 * a side effect of setting a packet filter. Deactivation is
1046 * from REMOTE_NDIS_HALT_MSG, reset from REMOTE_NDIS_RESET_MSG.
1047 */
1048 if (!cdc_active(dev)) {
1049 result = usb_ep_enable (dev->in_ep, dev->in);
1050 if (result != 0) {
1051 DEBUG(dev, "enable %s --> %d\n",
1052 dev->in_ep->name, result);
1053 goto done;
1054 }
1055
1056 result = usb_ep_enable (dev->out_ep, dev->out);
1057 if (result != 0) {
1058 DEBUG (dev, "enable %s --> %d\n",
1059 dev->out_ep->name, result);
1060 goto done;
1061 }
1062 }
1063
1064done:
1065 if (result == 0)
1066 result = alloc_requests (dev, qlen (gadget), gfp_flags);
1067
1068 /* on error, disable any endpoints */
1069 if (result < 0) {
1070 if (!subset_active(dev) && dev->status_ep)
1071 (void) usb_ep_disable (dev->status_ep);
1072 dev->status = NULL;
1073 (void) usb_ep_disable (dev->in_ep);
1074 (void) usb_ep_disable (dev->out_ep);
1075 dev->in = NULL;
1076 dev->out = NULL;
1077 }
1078
1079 /* activate non-CDC configs right away
1080 * this isn't strictly according to the RNDIS spec
1081 */
1082 else if (!cdc_active (dev)) {
1083 netif_carrier_on (dev->net);
1084 if (netif_running (dev->net)) {
1085 spin_unlock (&dev->lock);
1086 eth_start (dev, GFP_ATOMIC);
1087 spin_lock (&dev->lock);
1088 }
1089 }
1090
1091 if (result == 0)
1092 DEBUG (dev, "qlen %d\n", qlen (gadget));
1093
1094 /* caller is responsible for cleanup on error */
1095 return result;
1096}
1097
1098static void eth_reset_config (struct eth_dev *dev)
1099{
1100 struct usb_request *req;
1101
1102 if (dev->config == 0)
1103 return;
1104
1105 DEBUG (dev, "%s\n", __func__);
1106
1107 netif_stop_queue (dev->net);
1108 netif_carrier_off (dev->net);
1109 rndis_uninit(dev->rndis_config);
1110
1111 /* disable endpoints, forcing (synchronous) completion of
1112 * pending i/o. then free the requests.
1113 */
1114 if (dev->in) {
1115 usb_ep_disable (dev->in_ep);
1116 spin_lock(&dev->req_lock);
1117 while (likely (!list_empty (&dev->tx_reqs))) {
1118 req = container_of (dev->tx_reqs.next,
1119 struct usb_request, list);
1120 list_del (&req->list);
1121
1122 spin_unlock(&dev->req_lock);
1123 usb_ep_free_request (dev->in_ep, req);
1124 spin_lock(&dev->req_lock);
1125 }
1126 spin_unlock(&dev->req_lock);
1127 }
1128 if (dev->out) {
1129 usb_ep_disable (dev->out_ep);
1130 spin_lock(&dev->req_lock);
1131 while (likely (!list_empty (&dev->rx_reqs))) {
1132 req = container_of (dev->rx_reqs.next,
1133 struct usb_request, list);
1134 list_del (&req->list);
1135
1136 spin_unlock(&dev->req_lock);
1137 usb_ep_free_request (dev->out_ep, req);
1138 spin_lock(&dev->req_lock);
1139 }
1140 spin_unlock(&dev->req_lock);
1141 }
1142
1143 if (dev->status) {
1144 usb_ep_disable (dev->status_ep);
1145 }
1146 dev->rndis = 0;
1147 dev->cdc_filter = 0;
1148 dev->config = 0;
1149}
1150
1151/* change our operational config. must agree with the code
1152 * that returns config descriptors, and altsetting code.
1153 */ 204 */
1154static int 205static int __init rndis_do_config(struct usb_configuration *c)
1155eth_set_config (struct eth_dev *dev, unsigned number, gfp_t gfp_flags)
1156{ 206{
1157 int result = 0; 207 /* FIXME alloc iConfiguration string, set it in c->strings */
1158 struct usb_gadget *gadget = dev->gadget;
1159
1160 if (gadget_is_sa1100 (gadget)
1161 && dev->config
1162 && atomic_read (&dev->tx_qlen) != 0) {
1163 /* tx fifo is full, but we can't clear it...*/
1164 INFO (dev, "can't change configurations\n");
1165 return -ESPIPE;
1166 }
1167 eth_reset_config (dev);
1168
1169 switch (number) {
1170 case DEV_CONFIG_VALUE:
1171 result = set_ether_config (dev, gfp_flags);
1172 break;
1173#ifdef CONFIG_USB_ETH_RNDIS
1174 case DEV_RNDIS_CONFIG_VALUE:
1175 dev->rndis = 1;
1176 result = set_ether_config (dev, gfp_flags);
1177 break;
1178#endif
1179 default:
1180 result = -EINVAL;
1181 /* FALL THROUGH */
1182 case 0:
1183 break;
1184 }
1185
1186 if (result) {
1187 if (number)
1188 eth_reset_config (dev);
1189 usb_gadget_vbus_draw(dev->gadget,
1190 gadget_is_otg(dev->gadget) ? 8 : 100);
1191 } else {
1192 char *speed;
1193 unsigned power;
1194
1195 power = 2 * eth_config.bMaxPower;
1196 usb_gadget_vbus_draw(dev->gadget, power);
1197 208
1198 switch (gadget->speed) { 209 if (gadget_is_otg(c->cdev->gadget)) {
1199 case USB_SPEED_FULL: speed = "full"; break; 210 c->descriptors = otg_desc;
1200#ifdef CONFIG_USB_GADGET_DUALSPEED 211 c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1201 case USB_SPEED_HIGH: speed = "high"; break;
1202#endif
1203 default: speed = "?"; break;
1204 }
1205
1206 dev->config = number;
1207 INFO (dev, "%s speed config #%d: %d mA, %s, using %s\n",
1208 speed, number, power, driver_desc,
1209 rndis_active(dev)
1210 ? "RNDIS"
1211 : (cdc_active(dev)
1212 ? "CDC Ethernet"
1213 : "CDC Ethernet Subset"));
1214 } 212 }
1215 return result;
1216}
1217
1218/*-------------------------------------------------------------------------*/
1219
1220#ifdef DEV_CONFIG_CDC
1221 213
1222/* The interrupt endpoint is used in CDC networking models (Ethernet, ATM) 214 return rndis_bind_config(c, hostaddr);
1223 * only to notify the host about link status changes (which we support) or
1224 * report completion of some encapsulated command (as used in RNDIS). Since
1225 * we want this CDC Ethernet code to be vendor-neutral, we don't use that
1226 * command mechanism; and only one status request is ever queued.
1227 */
1228
1229static void eth_status_complete (struct usb_ep *ep, struct usb_request *req)
1230{
1231 struct usb_cdc_notification *event = req->buf;
1232 int value = req->status;
1233 struct eth_dev *dev = ep->driver_data;
1234
1235 /* issue the second notification if host reads the first */
1236 if (event->bNotificationType == USB_CDC_NOTIFY_NETWORK_CONNECTION
1237 && value == 0) {
1238 __le32 *data = req->buf + sizeof *event;
1239
1240 event->bmRequestType = 0xA1;
1241 event->bNotificationType = USB_CDC_NOTIFY_SPEED_CHANGE;
1242 event->wValue = __constant_cpu_to_le16 (0);
1243 event->wIndex = __constant_cpu_to_le16 (1);
1244 event->wLength = __constant_cpu_to_le16 (8);
1245
1246 /* SPEED_CHANGE data is up/down speeds in bits/sec */
1247 data [0] = data [1] = cpu_to_le32 (BITRATE (dev->gadget));
1248
1249 req->length = STATUS_BYTECOUNT;
1250 value = usb_ep_queue (ep, req, GFP_ATOMIC);
1251 DEBUG (dev, "send SPEED_CHANGE --> %d\n", value);
1252 if (value == 0)
1253 return;
1254 } else if (value != -ECONNRESET)
1255 DEBUG (dev, "event %02x --> %d\n",
1256 event->bNotificationType, value);
1257 req->context = NULL;
1258} 215}
1259 216
1260static void issue_start_status (struct eth_dev *dev) 217static struct usb_configuration rndis_config_driver = {
1261{ 218 .label = "RNDIS",
1262 struct usb_request *req = dev->stat_req; 219 .bind = rndis_do_config,
1263 struct usb_cdc_notification *event; 220 .bConfigurationValue = 2,
1264 int value; 221 /* .iConfiguration = DYNAMIC */
1265 222 .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
1266 DEBUG (dev, "%s, flush old status first\n", __func__); 223 .bMaxPower = 1, /* 2 mA, minimal */
1267 224};
1268 /* flush old status
1269 *
1270 * FIXME ugly idiom, maybe we'd be better with just
1271 * a "cancel the whole queue" primitive since any
1272 * unlink-one primitive has way too many error modes.
1273 * here, we "know" toggle is already clear...
1274 *
1275 * FIXME iff req->context != null just dequeue it
1276 */
1277 usb_ep_disable (dev->status_ep);
1278 usb_ep_enable (dev->status_ep, dev->status);
1279
1280 /* 3.8.1 says to issue first NETWORK_CONNECTION, then
1281 * a SPEED_CHANGE. could be useful in some configs.
1282 */
1283 event = req->buf;
1284 event->bmRequestType = 0xA1;
1285 event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
1286 event->wValue = __constant_cpu_to_le16 (1); /* connected */
1287 event->wIndex = __constant_cpu_to_le16 (1);
1288 event->wLength = 0;
1289
1290 req->length = sizeof *event;
1291 req->complete = eth_status_complete;
1292 req->context = dev;
1293
1294 value = usb_ep_queue (dev->status_ep, req, GFP_ATOMIC);
1295 if (value < 0)
1296 DEBUG (dev, "status buf queue --> %d\n", value);
1297}
1298
1299#endif
1300 225
1301/*-------------------------------------------------------------------------*/ 226/*-------------------------------------------------------------------------*/
1302 227
1303static void eth_setup_complete (struct usb_ep *ep, struct usb_request *req)
1304{
1305 if (req->status || req->actual != req->length)
1306 DEBUG ((struct eth_dev *) ep->driver_data,
1307 "setup complete --> %d, %d/%d\n",
1308 req->status, req->actual, req->length);
1309}
1310
1311#ifdef CONFIG_USB_ETH_RNDIS
1312
1313static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req)
1314{
1315 if (req->status || req->actual != req->length)
1316 DEBUG ((struct eth_dev *) ep->driver_data,
1317 "rndis response complete --> %d, %d/%d\n",
1318 req->status, req->actual, req->length);
1319
1320 /* done sending after USB_CDC_GET_ENCAPSULATED_RESPONSE */
1321}
1322
1323static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req)
1324{
1325 struct eth_dev *dev = ep->driver_data;
1326 int status;
1327
1328 /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
1329 spin_lock(&dev->lock);
1330 status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf);
1331 if (status < 0)
1332 ERROR(dev, "%s: rndis parse error %d\n", __func__, status);
1333 spin_unlock(&dev->lock);
1334}
1335
1336#endif /* RNDIS */
1337
1338/* 228/*
1339 * The setup() callback implements all the ep0 functionality that's not 229 * We _always_ have an ECM or CDC Subset configuration.
1340 * handled lower down. CDC has a number of less-common features:
1341 *
1342 * - two interfaces: control, and ethernet data
1343 * - Ethernet data interface has two altsettings: default, and active
1344 * - class-specific descriptors for the control interface
1345 * - class-specific control requests
1346 */ 230 */
1347static int 231static int __init eth_do_config(struct usb_configuration *c)
1348eth_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
1349{ 232{
1350 struct eth_dev *dev = get_gadget_data (gadget); 233 /* FIXME alloc iConfiguration string, set it in c->strings */
1351 struct usb_request *req = dev->req;
1352 int value = -EOPNOTSUPP;
1353 u16 wIndex = le16_to_cpu(ctrl->wIndex);
1354 u16 wValue = le16_to_cpu(ctrl->wValue);
1355 u16 wLength = le16_to_cpu(ctrl->wLength);
1356
1357 /* descriptors just go into the pre-allocated ep0 buffer,
1358 * while config change events may enable network traffic.
1359 */
1360 req->complete = eth_setup_complete;
1361 switch (ctrl->bRequest) {
1362
1363 case USB_REQ_GET_DESCRIPTOR:
1364 if (ctrl->bRequestType != USB_DIR_IN)
1365 break;
1366 switch (wValue >> 8) {
1367
1368 case USB_DT_DEVICE:
1369 value = min (wLength, (u16) sizeof device_desc);
1370 memcpy (req->buf, &device_desc, value);
1371 break;
1372 case USB_DT_DEVICE_QUALIFIER:
1373 if (!gadget_is_dualspeed(gadget))
1374 break;
1375 value = min (wLength, (u16) sizeof dev_qualifier);
1376 memcpy (req->buf, &dev_qualifier, value);
1377 break;
1378
1379 case USB_DT_OTHER_SPEED_CONFIG:
1380 if (!gadget_is_dualspeed(gadget))
1381 break;
1382 // FALLTHROUGH
1383 case USB_DT_CONFIG:
1384 value = config_buf(gadget, req->buf,
1385 wValue >> 8,
1386 wValue & 0xff,
1387 gadget_is_otg(gadget));
1388 if (value >= 0)
1389 value = min (wLength, (u16) value);
1390 break;
1391
1392 case USB_DT_STRING:
1393 value = usb_gadget_get_string (&stringtab,
1394 wValue & 0xff, req->buf);
1395 if (value >= 0)
1396 value = min (wLength, (u16) value);
1397 break;
1398 }
1399 break;
1400
1401 case USB_REQ_SET_CONFIGURATION:
1402 if (ctrl->bRequestType != 0)
1403 break;
1404 if (gadget->a_hnp_support)
1405 DEBUG (dev, "HNP available\n");
1406 else if (gadget->a_alt_hnp_support)
1407 DEBUG (dev, "HNP needs a different root port\n");
1408 spin_lock (&dev->lock);
1409 value = eth_set_config (dev, wValue, GFP_ATOMIC);
1410 spin_unlock (&dev->lock);
1411 break;
1412 case USB_REQ_GET_CONFIGURATION:
1413 if (ctrl->bRequestType != USB_DIR_IN)
1414 break;
1415 *(u8 *)req->buf = dev->config;
1416 value = min (wLength, (u16) 1);
1417 break;
1418
1419 case USB_REQ_SET_INTERFACE:
1420 if (ctrl->bRequestType != USB_RECIP_INTERFACE
1421 || !dev->config
1422 || wIndex > 1)
1423 break;
1424 if (!cdc_active(dev) && wIndex != 0)
1425 break;
1426 spin_lock (&dev->lock);
1427
1428 /* PXA hardware partially handles SET_INTERFACE;
1429 * we need to kluge around that interference.
1430 */
1431 if (gadget_is_pxa (gadget)) {
1432 value = eth_set_config (dev, DEV_CONFIG_VALUE,
1433 GFP_ATOMIC);
1434 goto done_set_intf;
1435 }
1436
1437#ifdef DEV_CONFIG_CDC
1438 switch (wIndex) {
1439 case 0: /* control/master intf */
1440 if (wValue != 0)
1441 break;
1442 if (dev->status) {
1443 usb_ep_disable (dev->status_ep);
1444 usb_ep_enable (dev->status_ep, dev->status);
1445 }
1446 value = 0;
1447 break;
1448 case 1: /* data intf */
1449 if (wValue > 1)
1450 break;
1451 usb_ep_disable (dev->in_ep);
1452 usb_ep_disable (dev->out_ep);
1453
1454 /* CDC requires the data transfers not be done from
1455 * the default interface setting ... also, setting
1456 * the non-default interface resets filters etc.
1457 */
1458 if (wValue == 1) {
1459 if (!cdc_active (dev))
1460 break;
1461 usb_ep_enable (dev->in_ep, dev->in);
1462 usb_ep_enable (dev->out_ep, dev->out);
1463 dev->cdc_filter = DEFAULT_FILTER;
1464 netif_carrier_on (dev->net);
1465 if (dev->status)
1466 issue_start_status (dev);
1467 if (netif_running (dev->net)) {
1468 spin_unlock (&dev->lock);
1469 eth_start (dev, GFP_ATOMIC);
1470 spin_lock (&dev->lock);
1471 }
1472 } else {
1473 netif_stop_queue (dev->net);
1474 netif_carrier_off (dev->net);
1475 }
1476 value = 0;
1477 break;
1478 }
1479#else
1480 /* FIXME this is wrong, as is the assumption that
1481 * all non-PXA hardware talks real CDC ...
1482 */
1483 dev_warn (&gadget->dev, "set_interface ignored!\n");
1484#endif /* DEV_CONFIG_CDC */
1485
1486done_set_intf:
1487 spin_unlock (&dev->lock);
1488 break;
1489 case USB_REQ_GET_INTERFACE:
1490 if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)
1491 || !dev->config
1492 || wIndex > 1)
1493 break;
1494 if (!(cdc_active(dev) || rndis_active(dev)) && wIndex != 0)
1495 break;
1496
1497 /* for CDC, iff carrier is on, data interface is active. */
1498 if (rndis_active(dev) || wIndex != 1)
1499 *(u8 *)req->buf = 0;
1500 else
1501 *(u8 *)req->buf = netif_carrier_ok (dev->net) ? 1 : 0;
1502 value = min (wLength, (u16) 1);
1503 break;
1504
1505#ifdef DEV_CONFIG_CDC
1506 case USB_CDC_SET_ETHERNET_PACKET_FILTER:
1507 /* see 6.2.30: no data, wIndex = interface,
1508 * wValue = packet filter bitmap
1509 */
1510 if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE)
1511 || !cdc_active(dev)
1512 || wLength != 0
1513 || wIndex > 1)
1514 break;
1515 DEBUG (dev, "packet filter %02x\n", wValue);
1516 dev->cdc_filter = wValue;
1517 value = 0;
1518 break;
1519
1520 /* and potentially:
1521 * case USB_CDC_SET_ETHERNET_MULTICAST_FILTERS:
1522 * case USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER:
1523 * case USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER:
1524 * case USB_CDC_GET_ETHERNET_STATISTIC:
1525 */
1526
1527#endif /* DEV_CONFIG_CDC */
1528 234
1529#ifdef CONFIG_USB_ETH_RNDIS 235 if (gadget_is_otg(c->cdev->gadget)) {
1530 /* RNDIS uses the CDC command encapsulation mechanism to implement 236 c->descriptors = otg_desc;
1531 * an RPC scheme, with much getting/setting of attributes by OID. 237 c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1532 */
1533 case USB_CDC_SEND_ENCAPSULATED_COMMAND:
1534 if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE)
1535 || !rndis_active(dev)
1536 || wLength > USB_BUFSIZ
1537 || wValue
1538 || rndis_control_intf.bInterfaceNumber
1539 != wIndex)
1540 break;
1541 /* read the request, then process it */
1542 value = wLength;
1543 req->complete = rndis_command_complete;
1544 /* later, rndis_control_ack () sends a notification */
1545 break;
1546
1547 case USB_CDC_GET_ENCAPSULATED_RESPONSE:
1548 if ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)
1549 == ctrl->bRequestType
1550 && rndis_active(dev)
1551 // && wLength >= 0x0400
1552 && !wValue
1553 && rndis_control_intf.bInterfaceNumber
1554 == wIndex) {
1555 u8 *buf;
1556 u32 n;
1557
1558 /* return the result */
1559 buf = rndis_get_next_response(dev->rndis_config, &n);
1560 if (buf) {
1561 memcpy(req->buf, buf, n);
1562 req->complete = rndis_response_complete;
1563 rndis_free_response(dev->rndis_config, buf);
1564 value = n;
1565 }
1566 /* else stalls ... spec says to avoid that */
1567 }
1568 break;
1569#endif /* RNDIS */
1570
1571 default:
1572 VDEBUG (dev,
1573 "unknown control req%02x.%02x v%04x i%04x l%d\n",
1574 ctrl->bRequestType, ctrl->bRequest,
1575 wValue, wIndex, wLength);
1576 } 238 }
1577 239
1578 /* respond with data transfer before status phase? */ 240 if (can_support_ecm(c->cdev->gadget))
1579 if (value >= 0) { 241 return ecm_bind_config(c, hostaddr);
1580 req->length = value;
1581 req->zero = value < wLength
1582 && (value % gadget->ep0->maxpacket) == 0;
1583 value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC);
1584 if (value < 0) {
1585 DEBUG (dev, "ep_queue --> %d\n", value);
1586 req->status = 0;
1587 eth_setup_complete (gadget->ep0, req);
1588 }
1589 }
1590
1591 /* host either stalls (value < 0) or reports success */
1592 return value;
1593}
1594
1595static void
1596eth_disconnect (struct usb_gadget *gadget)
1597{
1598 struct eth_dev *dev = get_gadget_data (gadget);
1599 unsigned long flags;
1600
1601 spin_lock_irqsave (&dev->lock, flags);
1602 netif_stop_queue (dev->net);
1603 netif_carrier_off (dev->net);
1604 eth_reset_config (dev);
1605 spin_unlock_irqrestore (&dev->lock, flags);
1606
1607 /* FIXME RNDIS should enter RNDIS_UNINITIALIZED */
1608
1609 /* next we may get setup() calls to enumerate new connections;
1610 * or an unbind() during shutdown (including removing module).
1611 */
1612}
1613
1614/*-------------------------------------------------------------------------*/
1615
1616/* NETWORK DRIVER HOOKUP (to the layer above this driver) */
1617
1618static int eth_change_mtu (struct net_device *net, int new_mtu)
1619{
1620 struct eth_dev *dev = netdev_priv(net);
1621
1622 if (dev->rndis)
1623 return -EBUSY;
1624
1625 if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN)
1626 return -ERANGE;
1627 /* no zero-length packet read wanted after mtu-sized packets */
1628 if (((new_mtu + sizeof (struct ethhdr)) % dev->in_ep->maxpacket) == 0)
1629 return -EDOM;
1630 net->mtu = new_mtu;
1631 return 0;
1632}
1633
1634static struct net_device_stats *eth_get_stats (struct net_device *net)
1635{
1636 return &((struct eth_dev *)netdev_priv(net))->stats;
1637}
1638
1639static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)
1640{
1641 struct eth_dev *dev = netdev_priv(net);
1642 strlcpy(p->driver, shortname, sizeof p->driver);
1643 strlcpy(p->version, DRIVER_VERSION, sizeof p->version);
1644 strlcpy(p->fw_version, dev->gadget->name, sizeof p->fw_version);
1645 strlcpy (p->bus_info, dev->gadget->dev.bus_id, sizeof p->bus_info);
1646}
1647
1648static u32 eth_get_link(struct net_device *net)
1649{
1650 struct eth_dev *dev = netdev_priv(net);
1651 return dev->gadget->speed != USB_SPEED_UNKNOWN;
1652}
1653
1654static struct ethtool_ops ops = {
1655 .get_drvinfo = eth_get_drvinfo,
1656 .get_link = eth_get_link
1657};
1658
1659static void defer_kevent (struct eth_dev *dev, int flag)
1660{
1661 if (test_and_set_bit (flag, &dev->todo))
1662 return;
1663 if (!schedule_work (&dev->work))
1664 ERROR (dev, "kevent %d may have been dropped\n", flag);
1665 else 242 else
1666 DEBUG (dev, "kevent %d scheduled\n", flag); 243 return geth_bind_config(c, hostaddr);
1667}
1668
1669static void rx_complete (struct usb_ep *ep, struct usb_request *req);
1670
1671static int
1672rx_submit (struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
1673{
1674 struct sk_buff *skb;
1675 int retval = -ENOMEM;
1676 size_t size;
1677
1678 /* Padding up to RX_EXTRA handles minor disagreements with host.
1679 * Normally we use the USB "terminate on short read" convention;
1680 * so allow up to (N*maxpacket), since that memory is normally
1681 * already allocated. Some hardware doesn't deal well with short
1682 * reads (e.g. DMA must be N*maxpacket), so for now don't trim a
1683 * byte off the end (to force hardware errors on overflow).
1684 *
1685 * RNDIS uses internal framing, and explicitly allows senders to
1686 * pad to end-of-packet. That's potentially nice for speed,
1687 * but means receivers can't recover synch on their own.
1688 */
1689 size = (sizeof (struct ethhdr) + dev->net->mtu + RX_EXTRA);
1690 size += dev->out_ep->maxpacket - 1;
1691 if (rndis_active(dev))
1692 size += sizeof (struct rndis_packet_msg_type);
1693 size -= size % dev->out_ep->maxpacket;
1694
1695 skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
1696 if (skb == NULL) {
1697 DEBUG (dev, "no rx skb\n");
1698 goto enomem;
1699 }
1700
1701 /* Some platforms perform better when IP packets are aligned,
1702 * but on at least one, checksumming fails otherwise. Note:
1703 * RNDIS headers involve variable numbers of LE32 values.
1704 */
1705 skb_reserve(skb, NET_IP_ALIGN);
1706
1707 req->buf = skb->data;
1708 req->length = size;
1709 req->complete = rx_complete;
1710 req->context = skb;
1711
1712 retval = usb_ep_queue (dev->out_ep, req, gfp_flags);
1713 if (retval == -ENOMEM)
1714enomem:
1715 defer_kevent (dev, WORK_RX_MEMORY);
1716 if (retval) {
1717 DEBUG (dev, "rx submit --> %d\n", retval);
1718 if (skb)
1719 dev_kfree_skb_any(skb);
1720 spin_lock(&dev->req_lock);
1721 list_add (&req->list, &dev->rx_reqs);
1722 spin_unlock(&dev->req_lock);
1723 }
1724 return retval;
1725}
1726
1727static void rx_complete (struct usb_ep *ep, struct usb_request *req)
1728{
1729 struct sk_buff *skb = req->context;
1730 struct eth_dev *dev = ep->driver_data;
1731 int status = req->status;
1732
1733 switch (status) {
1734
1735 /* normal completion */
1736 case 0:
1737 skb_put (skb, req->actual);
1738 /* we know MaxPacketsPerTransfer == 1 here */
1739 if (rndis_active(dev))
1740 status = rndis_rm_hdr (skb);
1741 if (status < 0
1742 || ETH_HLEN > skb->len
1743 || skb->len > ETH_FRAME_LEN) {
1744 dev->stats.rx_errors++;
1745 dev->stats.rx_length_errors++;
1746 DEBUG (dev, "rx length %d\n", skb->len);
1747 break;
1748 }
1749
1750 skb->protocol = eth_type_trans (skb, dev->net);
1751 dev->stats.rx_packets++;
1752 dev->stats.rx_bytes += skb->len;
1753
1754 /* no buffer copies needed, unless hardware can't
1755 * use skb buffers.
1756 */
1757 status = netif_rx (skb);
1758 skb = NULL;
1759 break;
1760
1761 /* software-driven interface shutdown */
1762 case -ECONNRESET: // unlink
1763 case -ESHUTDOWN: // disconnect etc
1764 VDEBUG (dev, "rx shutdown, code %d\n", status);
1765 goto quiesce;
1766
1767 /* for hardware automagic (such as pxa) */
1768 case -ECONNABORTED: // endpoint reset
1769 DEBUG (dev, "rx %s reset\n", ep->name);
1770 defer_kevent (dev, WORK_RX_MEMORY);
1771quiesce:
1772 dev_kfree_skb_any (skb);
1773 goto clean;
1774
1775 /* data overrun */
1776 case -EOVERFLOW:
1777 dev->stats.rx_over_errors++;
1778 // FALLTHROUGH
1779
1780 default:
1781 dev->stats.rx_errors++;
1782 DEBUG (dev, "rx status %d\n", status);
1783 break;
1784 }
1785
1786 if (skb)
1787 dev_kfree_skb_any (skb);
1788 if (!netif_running (dev->net)) {
1789clean:
1790 spin_lock(&dev->req_lock);
1791 list_add (&req->list, &dev->rx_reqs);
1792 spin_unlock(&dev->req_lock);
1793 req = NULL;
1794 }
1795 if (req)
1796 rx_submit (dev, req, GFP_ATOMIC);
1797}
1798
1799static int prealloc (struct list_head *list, struct usb_ep *ep,
1800 unsigned n, gfp_t gfp_flags)
1801{
1802 unsigned i;
1803 struct usb_request *req;
1804
1805 if (!n)
1806 return -ENOMEM;
1807
1808 /* queue/recycle up to N requests */
1809 i = n;
1810 list_for_each_entry (req, list, list) {
1811 if (i-- == 0)
1812 goto extra;
1813 }
1814 while (i--) {
1815 req = usb_ep_alloc_request (ep, gfp_flags);
1816 if (!req)
1817 return list_empty (list) ? -ENOMEM : 0;
1818 list_add (&req->list, list);
1819 }
1820 return 0;
1821
1822extra:
1823 /* free extras */
1824 for (;;) {
1825 struct list_head *next;
1826
1827 next = req->list.next;
1828 list_del (&req->list);
1829 usb_ep_free_request (ep, req);
1830
1831 if (next == list)
1832 break;
1833
1834 req = container_of (next, struct usb_request, list);
1835 }
1836 return 0;
1837}
1838
1839static int alloc_requests (struct eth_dev *dev, unsigned n, gfp_t gfp_flags)
1840{
1841 int status;
1842
1843 spin_lock(&dev->req_lock);
1844 status = prealloc (&dev->tx_reqs, dev->in_ep, n, gfp_flags);
1845 if (status < 0)
1846 goto fail;
1847 status = prealloc (&dev->rx_reqs, dev->out_ep, n, gfp_flags);
1848 if (status < 0)
1849 goto fail;
1850 goto done;
1851fail:
1852 DEBUG (dev, "can't alloc requests\n");
1853done:
1854 spin_unlock(&dev->req_lock);
1855 return status;
1856}
1857
1858static void rx_fill (struct eth_dev *dev, gfp_t gfp_flags)
1859{
1860 struct usb_request *req;
1861 unsigned long flags;
1862
1863 /* fill unused rxq slots with some skb */
1864 spin_lock_irqsave(&dev->req_lock, flags);
1865 while (!list_empty (&dev->rx_reqs)) {
1866 req = container_of (dev->rx_reqs.next,
1867 struct usb_request, list);
1868 list_del_init (&req->list);
1869 spin_unlock_irqrestore(&dev->req_lock, flags);
1870
1871 if (rx_submit (dev, req, gfp_flags) < 0) {
1872 defer_kevent (dev, WORK_RX_MEMORY);
1873 return;
1874 }
1875
1876 spin_lock_irqsave(&dev->req_lock, flags);
1877 }
1878 spin_unlock_irqrestore(&dev->req_lock, flags);
1879}
1880
1881static void eth_work (struct work_struct *work)
1882{
1883 struct eth_dev *dev = container_of(work, struct eth_dev, work);
1884
1885 if (test_and_clear_bit (WORK_RX_MEMORY, &dev->todo)) {
1886 if (netif_running (dev->net))
1887 rx_fill (dev, GFP_KERNEL);
1888 }
1889
1890 if (dev->todo)
1891 DEBUG (dev, "work done, flags = 0x%lx\n", dev->todo);
1892}
1893
1894static void tx_complete (struct usb_ep *ep, struct usb_request *req)
1895{
1896 struct sk_buff *skb = req->context;
1897 struct eth_dev *dev = ep->driver_data;
1898
1899 switch (req->status) {
1900 default:
1901 dev->stats.tx_errors++;
1902 VDEBUG (dev, "tx err %d\n", req->status);
1903 /* FALLTHROUGH */
1904 case -ECONNRESET: // unlink
1905 case -ESHUTDOWN: // disconnect etc
1906 break;
1907 case 0:
1908 dev->stats.tx_bytes += skb->len;
1909 }
1910 dev->stats.tx_packets++;
1911
1912 spin_lock(&dev->req_lock);
1913 list_add (&req->list, &dev->tx_reqs);
1914 spin_unlock(&dev->req_lock);
1915 dev_kfree_skb_any (skb);
1916
1917 atomic_dec (&dev->tx_qlen);
1918 if (netif_carrier_ok (dev->net))
1919 netif_wake_queue (dev->net);
1920}
1921
1922static inline int eth_is_promisc (struct eth_dev *dev)
1923{
1924 /* no filters for the CDC subset; always promisc */
1925 if (subset_active (dev))
1926 return 1;
1927 return dev->cdc_filter & USB_CDC_PACKET_TYPE_PROMISCUOUS;
1928}
1929
1930static int eth_start_xmit (struct sk_buff *skb, struct net_device *net)
1931{
1932 struct eth_dev *dev = netdev_priv(net);
1933 int length = skb->len;
1934 int retval;
1935 struct usb_request *req = NULL;
1936 unsigned long flags;
1937
1938 /* apply outgoing CDC or RNDIS filters */
1939 if (!eth_is_promisc (dev)) {
1940 u8 *dest = skb->data;
1941
1942 if (is_multicast_ether_addr(dest)) {
1943 u16 type;
1944
1945 /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host
1946 * SET_ETHERNET_MULTICAST_FILTERS requests
1947 */
1948 if (is_broadcast_ether_addr(dest))
1949 type = USB_CDC_PACKET_TYPE_BROADCAST;
1950 else
1951 type = USB_CDC_PACKET_TYPE_ALL_MULTICAST;
1952 if (!(dev->cdc_filter & type)) {
1953 dev_kfree_skb_any (skb);
1954 return 0;
1955 }
1956 }
1957 /* ignores USB_CDC_PACKET_TYPE_DIRECTED */
1958 }
1959
1960 spin_lock_irqsave(&dev->req_lock, flags);
1961 /*
1962 * this freelist can be empty if an interrupt triggered disconnect()
1963 * and reconfigured the gadget (shutting down this queue) after the
1964 * network stack decided to xmit but before we got the spinlock.
1965 */
1966 if (list_empty(&dev->tx_reqs)) {
1967 spin_unlock_irqrestore(&dev->req_lock, flags);
1968 return 1;
1969 }
1970
1971 req = container_of (dev->tx_reqs.next, struct usb_request, list);
1972 list_del (&req->list);
1973
1974 /* temporarily stop TX queue when the freelist empties */
1975 if (list_empty (&dev->tx_reqs))
1976 netif_stop_queue (net);
1977 spin_unlock_irqrestore(&dev->req_lock, flags);
1978
1979 /* no buffer copies needed, unless the network stack did it
1980 * or the hardware can't use skb buffers.
1981 * or there's not enough space for any RNDIS headers we need
1982 */
1983 if (rndis_active(dev)) {
1984 struct sk_buff *skb_rndis;
1985
1986 skb_rndis = skb_realloc_headroom (skb,
1987 sizeof (struct rndis_packet_msg_type));
1988 if (!skb_rndis)
1989 goto drop;
1990
1991 dev_kfree_skb_any (skb);
1992 skb = skb_rndis;
1993 rndis_add_hdr (skb);
1994 length = skb->len;
1995 }
1996 req->buf = skb->data;
1997 req->context = skb;
1998 req->complete = tx_complete;
1999
2000 /* use zlp framing on tx for strict CDC-Ether conformance,
2001 * though any robust network rx path ignores extra padding.
2002 * and some hardware doesn't like to write zlps.
2003 */
2004 req->zero = 1;
2005 if (!dev->zlp && (length % dev->in_ep->maxpacket) == 0)
2006 length++;
2007
2008 req->length = length;
2009
2010 /* throttle highspeed IRQ rate back slightly */
2011 if (gadget_is_dualspeed(dev->gadget))
2012 req->no_interrupt = (dev->gadget->speed == USB_SPEED_HIGH)
2013 ? ((atomic_read(&dev->tx_qlen) % qmult) != 0)
2014 : 0;
2015
2016 retval = usb_ep_queue (dev->in_ep, req, GFP_ATOMIC);
2017 switch (retval) {
2018 default:
2019 DEBUG (dev, "tx queue err %d\n", retval);
2020 break;
2021 case 0:
2022 net->trans_start = jiffies;
2023 atomic_inc (&dev->tx_qlen);
2024 }
2025
2026 if (retval) {
2027drop:
2028 dev->stats.tx_dropped++;
2029 dev_kfree_skb_any (skb);
2030 spin_lock_irqsave(&dev->req_lock, flags);
2031 if (list_empty (&dev->tx_reqs))
2032 netif_start_queue (net);
2033 list_add (&req->list, &dev->tx_reqs);
2034 spin_unlock_irqrestore(&dev->req_lock, flags);
2035 }
2036 return 0;
2037}
2038
2039/*-------------------------------------------------------------------------*/
2040
2041#ifdef CONFIG_USB_ETH_RNDIS
2042
2043/* The interrupt endpoint is used in RNDIS to notify the host when messages
2044 * other than data packets are available ... notably the REMOTE_NDIS_*_CMPLT
2045 * messages, but also REMOTE_NDIS_INDICATE_STATUS_MSG and potentially even
2046 * REMOTE_NDIS_KEEPALIVE_MSG.
2047 *
2048 * The RNDIS control queue is processed by GET_ENCAPSULATED_RESPONSE, and
2049 * normally just one notification will be queued.
2050 */
2051
2052static struct usb_request *eth_req_alloc (struct usb_ep *, unsigned, gfp_t);
2053static void eth_req_free (struct usb_ep *ep, struct usb_request *req);
2054
2055static void
2056rndis_control_ack_complete (struct usb_ep *ep, struct usb_request *req)
2057{
2058 struct eth_dev *dev = ep->driver_data;
2059
2060 if (req->status || req->actual != req->length)
2061 DEBUG (dev,
2062 "rndis control ack complete --> %d, %d/%d\n",
2063 req->status, req->actual, req->length);
2064 req->context = NULL;
2065
2066 if (req != dev->stat_req)
2067 eth_req_free(ep, req);
2068}
2069
2070static int rndis_control_ack (struct net_device *net)
2071{
2072 struct eth_dev *dev = netdev_priv(net);
2073 int length;
2074 struct usb_request *resp = dev->stat_req;
2075
2076 /* in case RNDIS calls this after disconnect */
2077 if (!dev->status) {
2078 DEBUG (dev, "status ENODEV\n");
2079 return -ENODEV;
2080 }
2081
2082 /* in case queue length > 1 */
2083 if (resp->context) {
2084 resp = eth_req_alloc (dev->status_ep, 8, GFP_ATOMIC);
2085 if (!resp)
2086 return -ENOMEM;
2087 }
2088
2089 /* Send RNDIS RESPONSE_AVAILABLE notification;
2090 * USB_CDC_NOTIFY_RESPONSE_AVAILABLE should work too
2091 */
2092 resp->length = 8;
2093 resp->complete = rndis_control_ack_complete;
2094 resp->context = dev;
2095
2096 *((__le32 *) resp->buf) = __constant_cpu_to_le32 (1);
2097 *((__le32 *) resp->buf + 1) = __constant_cpu_to_le32 (0);
2098
2099 length = usb_ep_queue (dev->status_ep, resp, GFP_ATOMIC);
2100 if (length < 0) {
2101 resp->status = 0;
2102 rndis_control_ack_complete (dev->status_ep, resp);
2103 }
2104
2105 return 0;
2106}
2107
2108#else
2109
2110#define rndis_control_ack NULL
2111
2112#endif /* RNDIS */
2113
2114static void eth_start (struct eth_dev *dev, gfp_t gfp_flags)
2115{
2116 DEBUG (dev, "%s\n", __func__);
2117
2118 /* fill the rx queue */
2119 rx_fill (dev, gfp_flags);
2120
2121 /* and open the tx floodgates */
2122 atomic_set (&dev->tx_qlen, 0);
2123 netif_wake_queue (dev->net);
2124 if (rndis_active(dev)) {
2125 rndis_set_param_medium (dev->rndis_config,
2126 NDIS_MEDIUM_802_3,
2127 BITRATE(dev->gadget)/100);
2128 (void) rndis_signal_connect (dev->rndis_config);
2129 }
2130}
2131
2132static int eth_open (struct net_device *net)
2133{
2134 struct eth_dev *dev = netdev_priv(net);
2135
2136 DEBUG (dev, "%s\n", __func__);
2137 if (netif_carrier_ok (dev->net))
2138 eth_start (dev, GFP_KERNEL);
2139 return 0;
2140} 244}
2141 245
2142static int eth_stop (struct net_device *net) 246static struct usb_configuration eth_config_driver = {
2143{ 247 /* .label = f(hardware) */
2144 struct eth_dev *dev = netdev_priv(net); 248 .bind = eth_do_config,
2145 249 .bConfigurationValue = 1,
2146 VDEBUG (dev, "%s\n", __func__); 250 /* .iConfiguration = DYNAMIC */
2147 netif_stop_queue (net); 251 .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
2148 252 .bMaxPower = 1, /* 2 mA, minimal */
2149 DEBUG (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", 253};
2150 dev->stats.rx_packets, dev->stats.tx_packets,
2151 dev->stats.rx_errors, dev->stats.tx_errors
2152 );
2153
2154 /* ensure there are no more active requests */
2155 if (dev->config) {
2156 usb_ep_disable (dev->in_ep);
2157 usb_ep_disable (dev->out_ep);
2158 if (netif_carrier_ok (dev->net)) {
2159 DEBUG (dev, "host still using in/out endpoints\n");
2160 // FIXME idiom may leave toggle wrong here
2161 usb_ep_enable (dev->in_ep, dev->in);
2162 usb_ep_enable (dev->out_ep, dev->out);
2163 }
2164 if (dev->status_ep) {
2165 usb_ep_disable (dev->status_ep);
2166 usb_ep_enable (dev->status_ep, dev->status);
2167 }
2168 }
2169
2170 if (rndis_active(dev)) {
2171 rndis_set_param_medium(dev->rndis_config, NDIS_MEDIUM_802_3, 0);
2172 (void) rndis_signal_disconnect (dev->rndis_config);
2173 }
2174
2175 return 0;
2176}
2177 254
2178/*-------------------------------------------------------------------------*/ 255/*-------------------------------------------------------------------------*/
2179 256
2180static struct usb_request * 257static int __init eth_bind(struct usb_composite_dev *cdev)
2181eth_req_alloc (struct usb_ep *ep, unsigned size, gfp_t gfp_flags)
2182{ 258{
2183 struct usb_request *req; 259 int gcnum;
2184 260 struct usb_gadget *gadget = cdev->gadget;
2185 req = usb_ep_alloc_request (ep, gfp_flags); 261 int status;
2186 if (!req)
2187 return NULL;
2188
2189 req->buf = kmalloc (size, gfp_flags);
2190 if (!req->buf) {
2191 usb_ep_free_request (ep, req);
2192 req = NULL;
2193 }
2194 return req;
2195}
2196
2197static void
2198eth_req_free (struct usb_ep *ep, struct usb_request *req)
2199{
2200 kfree (req->buf);
2201 usb_ep_free_request (ep, req);
2202}
2203
2204
2205static void /* __init_or_exit */
2206eth_unbind (struct usb_gadget *gadget)
2207{
2208 struct eth_dev *dev = get_gadget_data (gadget);
2209
2210 DEBUG (dev, "unbind\n");
2211 rndis_deregister (dev->rndis_config);
2212 rndis_exit ();
2213
2214 /* we've already been disconnected ... no i/o is active */
2215 if (dev->req) {
2216 eth_req_free (gadget->ep0, dev->req);
2217 dev->req = NULL;
2218 }
2219 if (dev->stat_req) {
2220 eth_req_free (dev->status_ep, dev->stat_req);
2221 dev->stat_req = NULL;
2222 }
2223
2224 unregister_netdev (dev->net);
2225 free_netdev(dev->net);
2226
2227 /* assuming we used keventd, it must quiesce too */
2228 flush_scheduled_work ();
2229 set_gadget_data (gadget, NULL);
2230}
2231
2232static u8 __init nibble (unsigned char c)
2233{
2234 if (likely (isdigit (c)))
2235 return c - '0';
2236 c = toupper (c);
2237 if (likely (isxdigit (c)))
2238 return 10 + c - 'A';
2239 return 0;
2240}
2241 262
2242static int __init get_ether_addr(const char *str, u8 *dev_addr) 263 /* set up network link layer */
2243{ 264 status = gether_setup(cdev->gadget, hostaddr);
2244 if (str) { 265 if (status < 0)
2245 unsigned i; 266 return status;
2246 267
2247 for (i = 0; i < 6; i++) { 268 /* set up main config label and device descriptor */
2248 unsigned char num; 269 if (can_support_ecm(cdev->gadget)) {
270 /* ECM */
271 eth_config_driver.label = "CDC Ethernet (ECM)";
272 } else {
273 /* CDC Subset */
274 eth_config_driver.label = "CDC Subset/SAFE";
2249 275
2250 if((*str == '.') || (*str == ':')) 276 device_desc.idVendor = cpu_to_le16(SIMPLE_VENDOR_NUM),
2251 str++; 277 device_desc.idProduct = cpu_to_le16(SIMPLE_PRODUCT_NUM),
2252 num = nibble(*str++) << 4; 278 device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC;
2253 num |= (nibble(*str++));
2254 dev_addr [i] = num;
2255 }
2256 if (is_valid_ether_addr (dev_addr))
2257 return 0;
2258 } 279 }
2259 random_ether_addr(dev_addr);
2260 return 1;
2261}
2262
2263static int __init
2264eth_bind (struct usb_gadget *gadget)
2265{
2266 struct eth_dev *dev;
2267 struct net_device *net;
2268 u8 cdc = 1, zlp = 1, rndis = 1;
2269 struct usb_ep *in_ep, *out_ep, *status_ep = NULL;
2270 int status = -ENOMEM;
2271 int gcnum;
2272
2273 /* these flags are only ever cleared; compiler take note */
2274#ifndef DEV_CONFIG_CDC
2275 cdc = 0;
2276#endif
2277#ifndef CONFIG_USB_ETH_RNDIS
2278 rndis = 0;
2279#endif
2280 280
2281 /* Because most host side USB stacks handle CDC Ethernet, that 281 if (has_rndis()) {
2282 * standard protocol is _strongly_ preferred for interop purposes. 282 /* RNDIS plus ECM-or-Subset */
2283 * (By everyone except Microsoft.) 283 device_desc.idVendor = cpu_to_le16(RNDIS_VENDOR_NUM),
2284 */ 284 device_desc.idProduct = cpu_to_le16(RNDIS_PRODUCT_NUM),
2285 if (gadget_is_pxa (gadget)) { 285 device_desc.bNumConfigurations = 2;
2286 /* pxa doesn't support altsettings */
2287 cdc = 0;
2288 } else if (gadget_is_musbhdrc(gadget)) {
2289 /* reduce tx dma overhead by avoiding special cases */
2290 zlp = 0;
2291 } else if (gadget_is_sh(gadget)) {
2292 /* sh doesn't support multiple interfaces or configs */
2293 cdc = 0;
2294 rndis = 0;
2295 } else if (gadget_is_sa1100 (gadget)) {
2296 /* hardware can't write zlps */
2297 zlp = 0;
2298 /* sa1100 CAN do CDC, without status endpoint ... we use
2299 * non-CDC to be compatible with ARM Linux-2.4 "usb-eth".
2300 */
2301 cdc = 0;
2302 } 286 }
2303 287
2304 gcnum = usb_gadget_controller_number (gadget); 288 gcnum = usb_gadget_controller_number(gadget);
2305 if (gcnum >= 0) 289 if (gcnum >= 0)
2306 device_desc.bcdDevice = cpu_to_le16 (0x0200 + gcnum); 290 device_desc.bcdDevice = cpu_to_le16(0x0300 | gcnum);
2307 else { 291 else {
2308 /* can't assume CDC works. don't want to default to 292 /* We assume that can_support_ecm() tells the truth;
2309 * anything less functional on CDC-capable hardware, 293 * but if the controller isn't recognized at all then
2310 * so we fail in this case. 294 * that assumption is a bit more likely to be wrong.
2311 */ 295 */
2312 dev_err (&gadget->dev, 296 WARN(cdev, "controller '%s' not recognized; trying %s\n",
2313 "controller '%s' not recognized\n", 297 gadget->name,
2314 gadget->name); 298 eth_config_driver.label);
2315 return -ENODEV; 299 device_desc.bcdDevice =
2316 } 300 __constant_cpu_to_le16(0x0300 | 0x0099);
2317 snprintf (manufacturer, sizeof manufacturer, "%s %s/%s",
2318 init_utsname()->sysname, init_utsname()->release,
2319 gadget->name);
2320
2321 /* If there's an RNDIS configuration, that's what Windows wants to
2322 * be using ... so use these product IDs here and in the "linux.inf"
2323 * needed to install MSFT drivers. Current Linux kernels will use
2324 * the second configuration if it's CDC Ethernet, and need some help
2325 * to choose the right configuration otherwise.
2326 */
2327 if (rndis) {
2328 device_desc.idVendor =
2329 __constant_cpu_to_le16(RNDIS_VENDOR_NUM);
2330 device_desc.idProduct =
2331 __constant_cpu_to_le16(RNDIS_PRODUCT_NUM);
2332 snprintf (product_desc, sizeof product_desc,
2333 "RNDIS/%s", driver_desc);
2334
2335 /* CDC subset ... recognized by Linux since 2.4.10, but Windows
2336 * drivers aren't widely available. (That may be improved by
2337 * supporting one submode of the "SAFE" variant of MDLM.)
2338 */
2339 } else if (!cdc) {
2340 device_desc.idVendor =
2341 __constant_cpu_to_le16(SIMPLE_VENDOR_NUM);
2342 device_desc.idProduct =
2343 __constant_cpu_to_le16(SIMPLE_PRODUCT_NUM);
2344 }
2345
2346 /* support optional vendor/distro customization */
2347 if (idVendor) {
2348 if (!idProduct) {
2349 dev_err (&gadget->dev, "idVendor needs idProduct!\n");
2350 return -ENODEV;
2351 }
2352 device_desc.idVendor = cpu_to_le16(idVendor);
2353 device_desc.idProduct = cpu_to_le16(idProduct);
2354 if (bcdDevice)
2355 device_desc.bcdDevice = cpu_to_le16(bcdDevice);
2356 }
2357 if (iManufacturer)
2358 strlcpy (manufacturer, iManufacturer, sizeof manufacturer);
2359 if (iProduct)
2360 strlcpy (product_desc, iProduct, sizeof product_desc);
2361 if (iSerialNumber) {
2362 device_desc.iSerialNumber = STRING_SERIALNUMBER,
2363 strlcpy(serial_number, iSerialNumber, sizeof serial_number);
2364 }
2365
2366 /* all we really need is bulk IN/OUT */
2367 usb_ep_autoconfig_reset (gadget);
2368 in_ep = usb_ep_autoconfig (gadget, &fs_source_desc);
2369 if (!in_ep) {
2370autoconf_fail:
2371 dev_err (&gadget->dev,
2372 "can't autoconfigure on %s\n",
2373 gadget->name);
2374 return -ENODEV;
2375 }
2376 in_ep->driver_data = in_ep; /* claim */
2377
2378 out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc);
2379 if (!out_ep)
2380 goto autoconf_fail;
2381 out_ep->driver_data = out_ep; /* claim */
2382
2383#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
2384 /* CDC Ethernet control interface doesn't require a status endpoint.
2385 * Since some hosts expect one, try to allocate one anyway.
2386 */
2387 if (cdc || rndis) {
2388 status_ep = usb_ep_autoconfig (gadget, &fs_status_desc);
2389 if (status_ep) {
2390 status_ep->driver_data = status_ep; /* claim */
2391 } else if (rndis) {
2392 dev_err (&gadget->dev,
2393 "can't run RNDIS on %s\n",
2394 gadget->name);
2395 return -ENODEV;
2396#ifdef DEV_CONFIG_CDC
2397 /* pxa25x only does CDC subset; often used with RNDIS */
2398 } else if (cdc) {
2399 control_intf.bNumEndpoints = 0;
2400 /* FIXME remove endpoint from descriptor list */
2401#endif
2402 }
2403 }
2404#endif
2405
2406 /* one config: cdc, else minimal subset */
2407 if (!cdc) {
2408 eth_config.bNumInterfaces = 1;
2409 eth_config.iConfiguration = STRING_SUBSET;
2410
2411 /* use functions to set these up, in case we're built to work
2412 * with multiple controllers and must override CDC Ethernet.
2413 */
2414 fs_subset_descriptors();
2415 hs_subset_descriptors();
2416 }
2417
2418 device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
2419 usb_gadget_set_selfpowered (gadget);
2420
2421 /* For now RNDIS is always a second config */
2422 if (rndis)
2423 device_desc.bNumConfigurations = 2;
2424
2425 if (gadget_is_dualspeed(gadget)) {
2426 if (rndis)
2427 dev_qualifier.bNumConfigurations = 2;
2428 else if (!cdc)
2429 dev_qualifier.bDeviceClass = USB_CLASS_VENDOR_SPEC;
2430
2431 /* assumes ep0 uses the same value for both speeds ... */
2432 dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0;
2433
2434 /* and that all endpoints are dual-speed */
2435 hs_source_desc.bEndpointAddress =
2436 fs_source_desc.bEndpointAddress;
2437 hs_sink_desc.bEndpointAddress =
2438 fs_sink_desc.bEndpointAddress;
2439#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
2440 if (status_ep)
2441 hs_status_desc.bEndpointAddress =
2442 fs_status_desc.bEndpointAddress;
2443#endif
2444 } 301 }
2445 302
2446 if (gadget_is_otg(gadget)) {
2447 otg_descriptor.bmAttributes |= USB_OTG_HNP,
2448 eth_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
2449 eth_config.bMaxPower = 4;
2450#ifdef CONFIG_USB_ETH_RNDIS
2451 rndis_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
2452 rndis_config.bMaxPower = 4;
2453#endif
2454 }
2455
2456 net = alloc_etherdev (sizeof *dev);
2457 if (!net)
2458 return status;
2459 dev = netdev_priv(net);
2460 spin_lock_init (&dev->lock);
2461 spin_lock_init (&dev->req_lock);
2462 INIT_WORK (&dev->work, eth_work);
2463 INIT_LIST_HEAD (&dev->tx_reqs);
2464 INIT_LIST_HEAD (&dev->rx_reqs);
2465
2466 /* network device setup */
2467 dev->net = net;
2468 strcpy (net->name, "usb%d");
2469 dev->cdc = cdc;
2470 dev->zlp = zlp;
2471 303
2472 dev->in_ep = in_ep; 304 /* Allocate string descriptor numbers ... note that string
2473 dev->out_ep = out_ep; 305 * contents can be overridden by the composite_dev glue.
2474 dev->status_ep = status_ep;
2475
2476 /* Module params for these addresses should come from ID proms.
2477 * The host side address is used with CDC and RNDIS, and commonly
2478 * ends up in a persistent config database. It's not clear if
2479 * host side code for the SAFE thing cares -- its original BLAN
2480 * thing didn't, Sharp never assigned those addresses on Zaurii.
2481 */ 306 */
2482 if (get_ether_addr(dev_addr, net->dev_addr))
2483 dev_warn(&gadget->dev,
2484 "using random %s ethernet address\n", "self");
2485 if (get_ether_addr(host_addr, dev->host_mac))
2486 dev_warn(&gadget->dev,
2487 "using random %s ethernet address\n", "host");
2488 snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X",
2489 dev->host_mac [0], dev->host_mac [1],
2490 dev->host_mac [2], dev->host_mac [3],
2491 dev->host_mac [4], dev->host_mac [5]);
2492
2493 if (rndis) {
2494 status = rndis_init();
2495 if (status < 0) {
2496 dev_err (&gadget->dev, "can't init RNDIS, %d\n",
2497 status);
2498 goto fail;
2499 }
2500 }
2501 307
2502 net->change_mtu = eth_change_mtu; 308 /* device descriptor strings: manufacturer, product */
2503 net->get_stats = eth_get_stats; 309 snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
2504 net->hard_start_xmit = eth_start_xmit; 310 init_utsname()->sysname, init_utsname()->release,
2505 net->open = eth_open; 311 gadget->name);
2506 net->stop = eth_stop; 312 status = usb_string_id(cdev);
2507 // watchdog_timeo, tx_timeout ... 313 if (status < 0)
2508 // set_multicast_list 314 goto fail;
2509 SET_ETHTOOL_OPS(net, &ops); 315 strings_dev[STRING_MANUFACTURER_IDX].id = status;
316 device_desc.iManufacturer = status;
2510 317
2511 /* preallocate control message data and buffer */ 318 status = usb_string_id(cdev);
2512 dev->req = eth_req_alloc (gadget->ep0, USB_BUFSIZ, GFP_KERNEL); 319 if (status < 0)
2513 if (!dev->req)
2514 goto fail; 320 goto fail;
2515 dev->req->complete = eth_setup_complete; 321 strings_dev[STRING_PRODUCT_IDX].id = status;
322 device_desc.iProduct = status;
2516 323
2517 /* ... and maybe likewise for status transfer */ 324 /* register our configuration(s); RNDIS first, if it's used */
2518#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS) 325 if (has_rndis()) {
2519 if (dev->status_ep) { 326 status = usb_add_config(cdev, &rndis_config_driver);
2520 dev->stat_req = eth_req_alloc (dev->status_ep, 327 if (status < 0)
2521 STATUS_BYTECOUNT, GFP_KERNEL);
2522 if (!dev->stat_req) {
2523 eth_req_free (gadget->ep0, dev->req);
2524 goto fail; 328 goto fail;
2525 }
2526 dev->stat_req->context = NULL;
2527 } 329 }
2528#endif
2529
2530 /* finish hookup to lower layer ... */
2531 dev->gadget = gadget;
2532 set_gadget_data (gadget, dev);
2533 gadget->ep0->driver_data = dev;
2534 330
2535 /* two kinds of host-initiated state changes: 331 status = usb_add_config(cdev, &eth_config_driver);
2536 * - iff DATA transfer is active, carrier is "on"
2537 * - tx queueing enabled if open *and* carrier is "on"
2538 */
2539 netif_stop_queue (dev->net);
2540 netif_carrier_off (dev->net);
2541
2542 SET_NETDEV_DEV (dev->net, &gadget->dev);
2543 status = register_netdev (dev->net);
2544 if (status < 0) 332 if (status < 0)
2545 goto fail1; 333 goto fail;
2546
2547 INFO (dev, "%s, version: " DRIVER_VERSION "\n", driver_desc);
2548 INFO (dev, "using %s, OUT %s IN %s%s%s\n", gadget->name,
2549 out_ep->name, in_ep->name,
2550 status_ep ? " STATUS " : "",
2551 status_ep ? status_ep->name : ""
2552 );
2553 INFO (dev, "MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
2554 net->dev_addr [0], net->dev_addr [1],
2555 net->dev_addr [2], net->dev_addr [3],
2556 net->dev_addr [4], net->dev_addr [5]);
2557
2558 if (cdc || rndis)
2559 INFO (dev, "HOST MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
2560 dev->host_mac [0], dev->host_mac [1],
2561 dev->host_mac [2], dev->host_mac [3],
2562 dev->host_mac [4], dev->host_mac [5]);
2563
2564 if (rndis) {
2565 u32 vendorID = 0;
2566
2567 /* FIXME RNDIS vendor id == "vendor NIC code" == ? */
2568
2569 dev->rndis_config = rndis_register (rndis_control_ack);
2570 if (dev->rndis_config < 0) {
2571fail0:
2572 unregister_netdev (dev->net);
2573 status = -ENODEV;
2574 goto fail;
2575 }
2576 334
2577 /* these set up a lot of the OIDs that RNDIS needs */ 335 INFO(cdev, "%s, version: " DRIVER_VERSION "\n", DRIVER_DESC);
2578 rndis_set_host_mac (dev->rndis_config, dev->host_mac);
2579 if (rndis_set_param_dev (dev->rndis_config, dev->net,
2580 &dev->stats, &dev->cdc_filter))
2581 goto fail0;
2582 if (rndis_set_param_vendor(dev->rndis_config, vendorID,
2583 manufacturer))
2584 goto fail0;
2585 if (rndis_set_param_medium(dev->rndis_config,
2586 NDIS_MEDIUM_802_3, 0))
2587 goto fail0;
2588 INFO (dev, "RNDIS ready\n");
2589 }
2590 336
2591 return status; 337 return 0;
2592 338
2593fail1:
2594 dev_dbg(&gadget->dev, "register_netdev failed, %d\n", status);
2595fail: 339fail:
2596 eth_unbind (gadget); 340 gether_cleanup();
2597 return status; 341 return status;
2598} 342}
2599 343
2600/*-------------------------------------------------------------------------*/ 344static int __exit eth_unbind(struct usb_composite_dev *cdev)
2601
2602static void
2603eth_suspend (struct usb_gadget *gadget)
2604{
2605 struct eth_dev *dev = get_gadget_data (gadget);
2606
2607 DEBUG (dev, "suspend\n");
2608 dev->suspended = 1;
2609}
2610
2611static void
2612eth_resume (struct usb_gadget *gadget)
2613{ 345{
2614 struct eth_dev *dev = get_gadget_data (gadget); 346 gether_cleanup();
2615 347 return 0;
2616 DEBUG (dev, "resume\n");
2617 dev->suspended = 0;
2618} 348}
2619 349
2620/*-------------------------------------------------------------------------*/ 350static struct usb_composite_driver eth_driver = {
2621 351 .name = "g_ether",
2622static struct usb_gadget_driver eth_driver = { 352 .dev = &device_desc,
2623 .speed = DEVSPEED, 353 .strings = dev_strings,
2624
2625 .function = (char *) driver_desc,
2626 .bind = eth_bind, 354 .bind = eth_bind,
2627 .unbind = eth_unbind, 355 .unbind = __exit_p(eth_unbind),
2628
2629 .setup = eth_setup,
2630 .disconnect = eth_disconnect,
2631
2632 .suspend = eth_suspend,
2633 .resume = eth_resume,
2634
2635 .driver = {
2636 .name = (char *) shortname,
2637 .owner = THIS_MODULE,
2638 },
2639}; 356};
2640 357
2641MODULE_DESCRIPTION (DRIVER_DESC); 358MODULE_DESCRIPTION(PREFIX DRIVER_DESC);
2642MODULE_AUTHOR ("David Brownell, Benedikt Spanger"); 359MODULE_AUTHOR("David Brownell, Benedikt Spanger");
2643MODULE_LICENSE ("GPL"); 360MODULE_LICENSE("GPL");
2644 361
2645 362static int __init init(void)
2646static int __init init (void)
2647{ 363{
2648 return usb_gadget_register_driver (&eth_driver); 364 return usb_composite_register(&eth_driver);
2649} 365}
2650module_init (init); 366module_init(init);
2651 367
2652static void __exit cleanup (void) 368static void __exit cleanup(void)
2653{ 369{
2654 usb_gadget_unregister_driver (&eth_driver); 370 usb_composite_unregister(&eth_driver);
2655} 371}
2656module_exit (cleanup); 372module_exit(cleanup);
2657
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c
new file mode 100644
index 000000000000..d8faccf27895
--- /dev/null
+++ b/drivers/usb/gadget/f_acm.c
@@ -0,0 +1,589 @@
1/*
2 * f_acm.c -- USB CDC serial (ACM) function driver
3 *
4 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
5 * Copyright (C) 2008 by David Brownell
6 * Copyright (C) 2008 by Nokia Corporation
7 *
8 * This software is distributed under the terms of the GNU General
9 * Public License ("GPL") as published by the Free Software Foundation,
10 * either version 2 of that License or (at your option) any later version.
11 */
12
13/* #define VERBOSE_DEBUG */
14
15#include <linux/kernel.h>
16#include <linux/device.h>
17
18#include "u_serial.h"
19#include "gadget_chips.h"
20
21
22/*
23 * This CDC ACM function support just wraps control functions and
24 * notifications around the generic serial-over-usb code.
25 *
26 * Because CDC ACM is standardized by the USB-IF, many host operating
27 * systems have drivers for it. Accordingly, ACM is the preferred
28 * interop solution for serial-port type connections. The control
29 * models are often not necessary, and in any case don't do much in
30 * this bare-bones implementation.
31 *
32 * Note that even MS-Windows has some support for ACM. However, that
33 * support is somewhat broken because when you use ACM in a composite
34 * device, having multiple interfaces confuses the poor OS. It doesn't
35 * seem to understand CDC Union descriptors. The new "association"
36 * descriptors (roughly equivalent to CDC Unions) may sometimes help.
37 */
38
39struct acm_ep_descs {
40 struct usb_endpoint_descriptor *in;
41 struct usb_endpoint_descriptor *out;
42 struct usb_endpoint_descriptor *notify;
43};
44
45struct f_acm {
46 struct gserial port;
47 u8 ctrl_id, data_id;
48 u8 port_num;
49
50 struct usb_descriptor_header **fs_function;
51 struct acm_ep_descs fs;
52 struct usb_descriptor_header **hs_function;
53 struct acm_ep_descs hs;
54
55 struct usb_ep *notify;
56 struct usb_endpoint_descriptor *notify_desc;
57
58 struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */
59 u16 port_handshake_bits;
60#define RS232_RTS (1 << 1) /* unused with full duplex */
61#define RS232_DTR (1 << 0) /* host is ready for data r/w */
62};
63
64static inline struct f_acm *func_to_acm(struct usb_function *f)
65{
66 return container_of(f, struct f_acm, port.func);
67}
68
69/*-------------------------------------------------------------------------*/
70
71/* notification endpoint uses smallish and infrequent fixed-size messages */
72
73#define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */
74#define GS_NOTIFY_MAXPACKET 8
75
76/* interface and class descriptors: */
77
78static struct usb_interface_descriptor acm_control_interface_desc __initdata = {
79 .bLength = USB_DT_INTERFACE_SIZE,
80 .bDescriptorType = USB_DT_INTERFACE,
81 /* .bInterfaceNumber = DYNAMIC */
82 .bNumEndpoints = 1,
83 .bInterfaceClass = USB_CLASS_COMM,
84 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
85 .bInterfaceProtocol = USB_CDC_ACM_PROTO_AT_V25TER,
86 /* .iInterface = DYNAMIC */
87};
88
89static struct usb_interface_descriptor acm_data_interface_desc __initdata = {
90 .bLength = USB_DT_INTERFACE_SIZE,
91 .bDescriptorType = USB_DT_INTERFACE,
92 /* .bInterfaceNumber = DYNAMIC */
93 .bNumEndpoints = 2,
94 .bInterfaceClass = USB_CLASS_CDC_DATA,
95 .bInterfaceSubClass = 0,
96 .bInterfaceProtocol = 0,
97 /* .iInterface = DYNAMIC */
98};
99
100static struct usb_cdc_header_desc acm_header_desc __initdata = {
101 .bLength = sizeof(acm_header_desc),
102 .bDescriptorType = USB_DT_CS_INTERFACE,
103 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
104 .bcdCDC = __constant_cpu_to_le16(0x0110),
105};
106
107static struct usb_cdc_call_mgmt_descriptor
108acm_call_mgmt_descriptor __initdata = {
109 .bLength = sizeof(acm_call_mgmt_descriptor),
110 .bDescriptorType = USB_DT_CS_INTERFACE,
111 .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
112 .bmCapabilities = 0,
113 /* .bDataInterface = DYNAMIC */
114};
115
116static struct usb_cdc_acm_descriptor acm_descriptor __initdata = {
117 .bLength = sizeof(acm_descriptor),
118 .bDescriptorType = USB_DT_CS_INTERFACE,
119 .bDescriptorSubType = USB_CDC_ACM_TYPE,
120 .bmCapabilities = (1 << 1),
121};
122
123static struct usb_cdc_union_desc acm_union_desc __initdata = {
124 .bLength = sizeof(acm_union_desc),
125 .bDescriptorType = USB_DT_CS_INTERFACE,
126 .bDescriptorSubType = USB_CDC_UNION_TYPE,
127 /* .bMasterInterface0 = DYNAMIC */
128 /* .bSlaveInterface0 = DYNAMIC */
129};
130
131/* full speed support: */
132
133static struct usb_endpoint_descriptor acm_fs_notify_desc __initdata = {
134 .bLength = USB_DT_ENDPOINT_SIZE,
135 .bDescriptorType = USB_DT_ENDPOINT,
136 .bEndpointAddress = USB_DIR_IN,
137 .bmAttributes = USB_ENDPOINT_XFER_INT,
138 .wMaxPacketSize = __constant_cpu_to_le16(GS_NOTIFY_MAXPACKET),
139 .bInterval = 1 << GS_LOG2_NOTIFY_INTERVAL,
140};
141
142static struct usb_endpoint_descriptor acm_fs_in_desc __initdata = {
143 .bLength = USB_DT_ENDPOINT_SIZE,
144 .bDescriptorType = USB_DT_ENDPOINT,
145 .bEndpointAddress = USB_DIR_IN,
146 .bmAttributes = USB_ENDPOINT_XFER_BULK,
147};
148
149static struct usb_endpoint_descriptor acm_fs_out_desc __initdata = {
150 .bLength = USB_DT_ENDPOINT_SIZE,
151 .bDescriptorType = USB_DT_ENDPOINT,
152 .bEndpointAddress = USB_DIR_OUT,
153 .bmAttributes = USB_ENDPOINT_XFER_BULK,
154};
155
156static struct usb_descriptor_header *acm_fs_function[] __initdata = {
157 (struct usb_descriptor_header *) &acm_control_interface_desc,
158 (struct usb_descriptor_header *) &acm_header_desc,
159 (struct usb_descriptor_header *) &acm_call_mgmt_descriptor,
160 (struct usb_descriptor_header *) &acm_descriptor,
161 (struct usb_descriptor_header *) &acm_union_desc,
162 (struct usb_descriptor_header *) &acm_fs_notify_desc,
163 (struct usb_descriptor_header *) &acm_data_interface_desc,
164 (struct usb_descriptor_header *) &acm_fs_in_desc,
165 (struct usb_descriptor_header *) &acm_fs_out_desc,
166 NULL,
167};
168
169/* high speed support: */
170
171static struct usb_endpoint_descriptor acm_hs_notify_desc __initdata = {
172 .bLength = USB_DT_ENDPOINT_SIZE,
173 .bDescriptorType = USB_DT_ENDPOINT,
174 .bEndpointAddress = USB_DIR_IN,
175 .bmAttributes = USB_ENDPOINT_XFER_INT,
176 .wMaxPacketSize = __constant_cpu_to_le16(GS_NOTIFY_MAXPACKET),
177 .bInterval = GS_LOG2_NOTIFY_INTERVAL+4,
178};
179
180static struct usb_endpoint_descriptor acm_hs_in_desc __initdata = {
181 .bLength = USB_DT_ENDPOINT_SIZE,
182 .bDescriptorType = USB_DT_ENDPOINT,
183 .bmAttributes = USB_ENDPOINT_XFER_BULK,
184 .wMaxPacketSize = __constant_cpu_to_le16(512),
185};
186
187static struct usb_endpoint_descriptor acm_hs_out_desc __initdata = {
188 .bLength = USB_DT_ENDPOINT_SIZE,
189 .bDescriptorType = USB_DT_ENDPOINT,
190 .bmAttributes = USB_ENDPOINT_XFER_BULK,
191 .wMaxPacketSize = __constant_cpu_to_le16(512),
192};
193
194static struct usb_descriptor_header *acm_hs_function[] __initdata = {
195 (struct usb_descriptor_header *) &acm_control_interface_desc,
196 (struct usb_descriptor_header *) &acm_header_desc,
197 (struct usb_descriptor_header *) &acm_call_mgmt_descriptor,
198 (struct usb_descriptor_header *) &acm_descriptor,
199 (struct usb_descriptor_header *) &acm_union_desc,
200 (struct usb_descriptor_header *) &acm_hs_notify_desc,
201 (struct usb_descriptor_header *) &acm_data_interface_desc,
202 (struct usb_descriptor_header *) &acm_hs_in_desc,
203 (struct usb_descriptor_header *) &acm_hs_out_desc,
204 NULL,
205};
206
207/* string descriptors: */
208
209#define ACM_CTRL_IDX 0
210#define ACM_DATA_IDX 1
211
212/* static strings, in UTF-8 */
213static struct usb_string acm_string_defs[] = {
214 [ACM_CTRL_IDX].s = "CDC Abstract Control Model (ACM)",
215 [ACM_DATA_IDX].s = "CDC ACM Data",
216 { /* ZEROES END LIST */ },
217};
218
219static struct usb_gadget_strings acm_string_table = {
220 .language = 0x0409, /* en-us */
221 .strings = acm_string_defs,
222};
223
224static struct usb_gadget_strings *acm_strings[] = {
225 &acm_string_table,
226 NULL,
227};
228
229/*-------------------------------------------------------------------------*/
230
231/* ACM control ... data handling is delegated to tty library code.
232 * The main task of this function is to activate and deactivate
233 * that code based on device state; track parameters like line
234 * speed, handshake state, and so on; and issue notifications.
235 */
236
237static void acm_complete_set_line_coding(struct usb_ep *ep,
238 struct usb_request *req)
239{
240 struct f_acm *acm = ep->driver_data;
241 struct usb_composite_dev *cdev = acm->port.func.config->cdev;
242
243 if (req->status != 0) {
244 DBG(cdev, "acm ttyGS%d completion, err %d\n",
245 acm->port_num, req->status);
246 return;
247 }
248
249 /* normal completion */
250 if (req->actual != sizeof(acm->port_line_coding)) {
251 DBG(cdev, "acm ttyGS%d short resp, len %d\n",
252 acm->port_num, req->actual);
253 usb_ep_set_halt(ep);
254 } else {
255 struct usb_cdc_line_coding *value = req->buf;
256
257 /* REVISIT: we currently just remember this data.
258 * If we change that, (a) validate it first, then
259 * (b) update whatever hardware needs updating,
260 * (c) worry about locking. This is information on
261 * the order of 9600-8-N-1 ... most of which means
262 * nothing unless we control a real RS232 line.
263 */
264 acm->port_line_coding = *value;
265 }
266}
267
268static int acm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
269{
270 struct f_acm *acm = func_to_acm(f);
271 struct usb_composite_dev *cdev = f->config->cdev;
272 struct usb_request *req = cdev->req;
273 int value = -EOPNOTSUPP;
274 u16 w_index = le16_to_cpu(ctrl->wIndex);
275 u16 w_value = le16_to_cpu(ctrl->wValue);
276 u16 w_length = le16_to_cpu(ctrl->wLength);
277
278 /* composite driver infrastructure handles everything except
279 * CDC class messages; interface activation uses set_alt().
280 */
281 switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
282
283 /* SET_LINE_CODING ... just read and save what the host sends */
284 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
285 | USB_CDC_REQ_SET_LINE_CODING:
286 if (w_length != sizeof(struct usb_cdc_line_coding)
287 || w_index != acm->ctrl_id)
288 goto invalid;
289
290 value = w_length;
291 cdev->gadget->ep0->driver_data = acm;
292 req->complete = acm_complete_set_line_coding;
293 break;
294
295 /* GET_LINE_CODING ... return what host sent, or initial value */
296 case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
297 | USB_CDC_REQ_GET_LINE_CODING:
298 if (w_index != acm->ctrl_id)
299 goto invalid;
300
301 value = min_t(unsigned, w_length,
302 sizeof(struct usb_cdc_line_coding));
303 memcpy(req->buf, &acm->port_line_coding, value);
304 break;
305
306 /* SET_CONTROL_LINE_STATE ... save what the host sent */
307 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
308 | USB_CDC_REQ_SET_CONTROL_LINE_STATE:
309 if (w_index != acm->ctrl_id)
310 goto invalid;
311
312 value = 0;
313
314 /* FIXME we should not allow data to flow until the
315 * host sets the RS232_DTR bit; and when it clears
316 * that bit, we should return to that no-flow state.
317 */
318 acm->port_handshake_bits = w_value;
319 break;
320
321 default:
322invalid:
323 VDBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
324 ctrl->bRequestType, ctrl->bRequest,
325 w_value, w_index, w_length);
326 }
327
328 /* respond with data transfer or status phase? */
329 if (value >= 0) {
330 DBG(cdev, "acm ttyGS%d req%02x.%02x v%04x i%04x l%d\n",
331 acm->port_num, ctrl->bRequestType, ctrl->bRequest,
332 w_value, w_index, w_length);
333 req->zero = 0;
334 req->length = value;
335 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
336 if (value < 0)
337 ERROR(cdev, "acm response on ttyGS%d, err %d\n",
338 acm->port_num, value);
339 }
340
341 /* device either stalls (value < 0) or reports success */
342 return value;
343}
344
345static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
346{
347 struct f_acm *acm = func_to_acm(f);
348 struct usb_composite_dev *cdev = f->config->cdev;
349
350 /* we know alt == 0, so this is an activation or a reset */
351
352 if (intf == acm->ctrl_id) {
353 /* REVISIT this may need more work when we start to
354 * send notifications ...
355 */
356 if (acm->notify->driver_data) {
357 VDBG(cdev, "reset acm control interface %d\n", intf);
358 usb_ep_disable(acm->notify);
359 } else {
360 VDBG(cdev, "init acm ctrl interface %d\n", intf);
361 acm->notify_desc = ep_choose(cdev->gadget,
362 acm->hs.notify,
363 acm->fs.notify);
364 }
365 usb_ep_enable(acm->notify, acm->notify_desc);
366 acm->notify->driver_data = acm;
367
368 } else if (intf == acm->data_id) {
369 if (acm->port.in->driver_data) {
370 DBG(cdev, "reset acm ttyGS%d\n", acm->port_num);
371 gserial_disconnect(&acm->port);
372 } else {
373 DBG(cdev, "activate acm ttyGS%d\n", acm->port_num);
374 acm->port.in_desc = ep_choose(cdev->gadget,
375 acm->hs.in, acm->fs.in);
376 acm->port.out_desc = ep_choose(cdev->gadget,
377 acm->hs.out, acm->fs.out);
378 }
379 gserial_connect(&acm->port, acm->port_num);
380
381 } else
382 return -EINVAL;
383
384 return 0;
385}
386
387static void acm_disable(struct usb_function *f)
388{
389 struct f_acm *acm = func_to_acm(f);
390 struct usb_composite_dev *cdev = f->config->cdev;
391
392 DBG(cdev, "acm ttyGS%d deactivated\n", acm->port_num);
393 gserial_disconnect(&acm->port);
394 usb_ep_disable(acm->notify);
395 acm->notify->driver_data = NULL;
396}
397
398/*-------------------------------------------------------------------------*/
399
400/* ACM function driver setup/binding */
401static int __init
402acm_bind(struct usb_configuration *c, struct usb_function *f)
403{
404 struct usb_composite_dev *cdev = c->cdev;
405 struct f_acm *acm = func_to_acm(f);
406 int status;
407 struct usb_ep *ep;
408
409 /* allocate instance-specific interface IDs, and patch descriptors */
410 status = usb_interface_id(c, f);
411 if (status < 0)
412 goto fail;
413 acm->ctrl_id = status;
414
415 acm_control_interface_desc.bInterfaceNumber = status;
416 acm_union_desc .bMasterInterface0 = status;
417
418 status = usb_interface_id(c, f);
419 if (status < 0)
420 goto fail;
421 acm->data_id = status;
422
423 acm_data_interface_desc.bInterfaceNumber = status;
424 acm_union_desc.bSlaveInterface0 = status;
425 acm_call_mgmt_descriptor.bDataInterface = status;
426
427 status = -ENODEV;
428
429 /* allocate instance-specific endpoints */
430 ep = usb_ep_autoconfig(cdev->gadget, &acm_fs_in_desc);
431 if (!ep)
432 goto fail;
433 acm->port.in = ep;
434 ep->driver_data = cdev; /* claim */
435
436 ep = usb_ep_autoconfig(cdev->gadget, &acm_fs_out_desc);
437 if (!ep)
438 goto fail;
439 acm->port.out = ep;
440 ep->driver_data = cdev; /* claim */
441
442 ep = usb_ep_autoconfig(cdev->gadget, &acm_fs_notify_desc);
443 if (!ep)
444 goto fail;
445 acm->notify = ep;
446 ep->driver_data = cdev; /* claim */
447
448 /* copy descriptors, and track endpoint copies */
449 f->descriptors = usb_copy_descriptors(acm_fs_function);
450
451 acm->fs.in = usb_find_endpoint(acm_fs_function,
452 f->descriptors, &acm_fs_in_desc);
453 acm->fs.out = usb_find_endpoint(acm_fs_function,
454 f->descriptors, &acm_fs_out_desc);
455 acm->fs.notify = usb_find_endpoint(acm_fs_function,
456 f->descriptors, &acm_fs_notify_desc);
457
458 /* support all relevant hardware speeds... we expect that when
459 * hardware is dual speed, all bulk-capable endpoints work at
460 * both speeds
461 */
462 if (gadget_is_dualspeed(c->cdev->gadget)) {
463 acm_hs_in_desc.bEndpointAddress =
464 acm_fs_in_desc.bEndpointAddress;
465 acm_hs_out_desc.bEndpointAddress =
466 acm_fs_out_desc.bEndpointAddress;
467 acm_hs_notify_desc.bEndpointAddress =
468 acm_fs_notify_desc.bEndpointAddress;
469
470 /* copy descriptors, and track endpoint copies */
471 f->hs_descriptors = usb_copy_descriptors(acm_hs_function);
472
473 acm->hs.in = usb_find_endpoint(acm_hs_function,
474 f->hs_descriptors, &acm_hs_in_desc);
475 acm->hs.out = usb_find_endpoint(acm_hs_function,
476 f->hs_descriptors, &acm_hs_out_desc);
477 acm->hs.notify = usb_find_endpoint(acm_hs_function,
478 f->hs_descriptors, &acm_hs_notify_desc);
479 }
480
481 /* FIXME provide a callback for triggering notifications */
482
483 DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n",
484 acm->port_num,
485 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
486 acm->port.in->name, acm->port.out->name,
487 acm->notify->name);
488 return 0;
489
490fail:
491 /* we might as well release our claims on endpoints */
492 if (acm->notify)
493 acm->notify->driver_data = NULL;
494 if (acm->port.out)
495 acm->port.out->driver_data = NULL;
496 if (acm->port.in)
497 acm->port.in->driver_data = NULL;
498
499 ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status);
500
501 return status;
502}
503
504static void
505acm_unbind(struct usb_configuration *c, struct usb_function *f)
506{
507 if (gadget_is_dualspeed(c->cdev->gadget))
508 usb_free_descriptors(f->hs_descriptors);
509 usb_free_descriptors(f->descriptors);
510 kfree(func_to_acm(f));
511}
512
513/* Some controllers can't support CDC ACM ... */
514static inline bool can_support_cdc(struct usb_configuration *c)
515{
516 /* SH3 doesn't support multiple interfaces */
517 if (gadget_is_sh(c->cdev->gadget))
518 return false;
519
520 /* sa1100 doesn't have a third interrupt endpoint */
521 if (gadget_is_sa1100(c->cdev->gadget))
522 return false;
523
524 /* everything else is *probably* fine ... */
525 return true;
526}
527
528/**
529 * acm_bind_config - add a CDC ACM function to a configuration
530 * @c: the configuration to support the CDC ACM instance
531 * @port_num: /dev/ttyGS* port this interface will use
532 * Context: single threaded during gadget setup
533 *
534 * Returns zero on success, else negative errno.
535 *
536 * Caller must have called @gserial_setup() with enough ports to
537 * handle all the ones it binds. Caller is also responsible
538 * for calling @gserial_cleanup() before module unload.
539 */
540int __init acm_bind_config(struct usb_configuration *c, u8 port_num)
541{
542 struct f_acm *acm;
543 int status;
544
545 if (!can_support_cdc(c))
546 return -EINVAL;
547
548 /* REVISIT might want instance-specific strings to help
549 * distinguish instances ...
550 */
551
552 /* maybe allocate device-global string IDs, and patch descriptors */
553 if (acm_string_defs[ACM_CTRL_IDX].id == 0) {
554 status = usb_string_id(c->cdev);
555 if (status < 0)
556 return status;
557 acm_string_defs[ACM_CTRL_IDX].id = status;
558
559 acm_control_interface_desc.iInterface = status;
560
561 status = usb_string_id(c->cdev);
562 if (status < 0)
563 return status;
564 acm_string_defs[ACM_DATA_IDX].id = status;
565
566 acm_data_interface_desc.iInterface = status;
567 }
568
569 /* allocate and initialize one new instance */
570 acm = kzalloc(sizeof *acm, GFP_KERNEL);
571 if (!acm)
572 return -ENOMEM;
573
574 acm->port_num = port_num;
575
576 acm->port.func.name = "acm";
577 acm->port.func.strings = acm_strings;
578 /* descriptors are per-instance copies */
579 acm->port.func.bind = acm_bind;
580 acm->port.func.unbind = acm_unbind;
581 acm->port.func.set_alt = acm_set_alt;
582 acm->port.func.setup = acm_setup;
583 acm->port.func.disable = acm_disable;
584
585 status = usb_add_function(c, &acm->port.func);
586 if (status)
587 kfree(acm);
588 return status;
589}
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c
new file mode 100644
index 000000000000..0822e9d7693a
--- /dev/null
+++ b/drivers/usb/gadget/f_ecm.c
@@ -0,0 +1,833 @@
1/*
2 * f_ecm.c -- USB CDC Ethernet (ECM) link function driver
3 *
4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2008 Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22/* #define VERBOSE_DEBUG */
23
24#include <linux/kernel.h>
25#include <linux/device.h>
26#include <linux/etherdevice.h>
27
28#include "u_ether.h"
29
30
31/*
32 * This function is a "CDC Ethernet Networking Control Model" (CDC ECM)
33 * Ethernet link. The data transfer model is simple (packets sent and
34 * received over bulk endpoints using normal short packet termination),
35 * and the control model exposes various data and optional notifications.
36 *
37 * ECM is well standardized and (except for Microsoft) supported by most
38 * operating systems with USB host support. It's the preferred interop
39 * solution for Ethernet over USB, at least for firmware based solutions.
40 * (Hardware solutions tend to be more minimalist.) A newer and simpler
41 * "Ethernet Emulation Model" (CDC EEM) hasn't yet caught on.
42 *
43 * Note that ECM requires the use of "alternate settings" for its data
44 * interface. This means that the set_alt() method has real work to do,
45 * and also means that a get_alt() method is required.
46 */
47
48struct ecm_ep_descs {
49 struct usb_endpoint_descriptor *in;
50 struct usb_endpoint_descriptor *out;
51 struct usb_endpoint_descriptor *notify;
52};
53
54enum ecm_notify_state {
55 ECM_NOTIFY_NONE, /* don't notify */
56 ECM_NOTIFY_CONNECT, /* issue CONNECT next */
57 ECM_NOTIFY_SPEED, /* issue SPEED_CHANGE next */
58};
59
60struct f_ecm {
61 struct gether port;
62 u8 ctrl_id, data_id;
63
64 char ethaddr[14];
65
66 struct usb_descriptor_header **fs_function;
67 struct ecm_ep_descs fs;
68 struct usb_descriptor_header **hs_function;
69 struct ecm_ep_descs hs;
70
71 struct usb_ep *notify;
72 struct usb_endpoint_descriptor *notify_desc;
73 struct usb_request *notify_req;
74 u8 notify_state;
75 bool is_open;
76
77 /* FIXME is_open needs some irq-ish locking
78 * ... possibly the same as port.ioport
79 */
80};
81
82static inline struct f_ecm *func_to_ecm(struct usb_function *f)
83{
84 return container_of(f, struct f_ecm, port.func);
85}
86
87/* peak (theoretical) bulk transfer rate in bits-per-second */
88static inline unsigned bitrate(struct usb_gadget *g)
89{
90 if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
91 return 13 * 512 * 8 * 1000 * 8;
92 else
93 return 19 * 64 * 1 * 1000 * 8;
94}
95
96/*-------------------------------------------------------------------------*/
97
98/*
99 * Include the status endpoint if we can, even though it's optional.
100 *
101 * Use wMaxPacketSize big enough to fit CDC_NOTIFY_SPEED_CHANGE in one
102 * packet, to simplify cancellation; and a big transfer interval, to
103 * waste less bandwidth.
104 *
105 * Some drivers (like Linux 2.4 cdc-ether!) "need" it to exist even
106 * if they ignore the connect/disconnect notifications that real aether
107 * can provide. More advanced cdc configurations might want to support
108 * encapsulated commands (vendor-specific, using control-OUT).
109 */
110
111#define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */
112#define STATUS_BYTECOUNT 16 /* 8 byte header + data */
113
114
115/* interface descriptor: */
116
117static struct usb_interface_descriptor ecm_control_intf __initdata = {
118 .bLength = sizeof ecm_control_intf,
119 .bDescriptorType = USB_DT_INTERFACE,
120
121 /* .bInterfaceNumber = DYNAMIC */
122 /* status endpoint is optional; this could be patched later */
123 .bNumEndpoints = 1,
124 .bInterfaceClass = USB_CLASS_COMM,
125 .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET,
126 .bInterfaceProtocol = USB_CDC_PROTO_NONE,
127 /* .iInterface = DYNAMIC */
128};
129
130static struct usb_cdc_header_desc header_desc __initdata = {
131 .bLength = sizeof header_desc,
132 .bDescriptorType = USB_DT_CS_INTERFACE,
133 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
134
135 .bcdCDC = __constant_cpu_to_le16(0x0110),
136};
137
138static struct usb_cdc_union_desc ecm_union_desc __initdata = {
139 .bLength = sizeof(ecm_union_desc),
140 .bDescriptorType = USB_DT_CS_INTERFACE,
141 .bDescriptorSubType = USB_CDC_UNION_TYPE,
142 /* .bMasterInterface0 = DYNAMIC */
143 /* .bSlaveInterface0 = DYNAMIC */
144};
145
146static struct usb_cdc_ether_desc ether_desc __initdata = {
147 .bLength = sizeof ether_desc,
148 .bDescriptorType = USB_DT_CS_INTERFACE,
149 .bDescriptorSubType = USB_CDC_ETHERNET_TYPE,
150
151 /* this descriptor actually adds value, surprise! */
152 /* .iMACAddress = DYNAMIC */
153 .bmEthernetStatistics = __constant_cpu_to_le32(0), /* no statistics */
154 .wMaxSegmentSize = __constant_cpu_to_le16(ETH_FRAME_LEN),
155 .wNumberMCFilters = __constant_cpu_to_le16(0),
156 .bNumberPowerFilters = 0,
157};
158
159/* the default data interface has no endpoints ... */
160
161static struct usb_interface_descriptor ecm_data_nop_intf __initdata = {
162 .bLength = sizeof ecm_data_nop_intf,
163 .bDescriptorType = USB_DT_INTERFACE,
164
165 .bInterfaceNumber = 1,
166 .bAlternateSetting = 0,
167 .bNumEndpoints = 0,
168 .bInterfaceClass = USB_CLASS_CDC_DATA,
169 .bInterfaceSubClass = 0,
170 .bInterfaceProtocol = 0,
171 /* .iInterface = DYNAMIC */
172};
173
174/* ... but the "real" data interface has two bulk endpoints */
175
176static struct usb_interface_descriptor ecm_data_intf __initdata = {
177 .bLength = sizeof ecm_data_intf,
178 .bDescriptorType = USB_DT_INTERFACE,
179
180 .bInterfaceNumber = 1,
181 .bAlternateSetting = 1,
182 .bNumEndpoints = 2,
183 .bInterfaceClass = USB_CLASS_CDC_DATA,
184 .bInterfaceSubClass = 0,
185 .bInterfaceProtocol = 0,
186 /* .iInterface = DYNAMIC */
187};
188
189/* full speed support: */
190
191static struct usb_endpoint_descriptor fs_notify_desc __initdata = {
192 .bLength = USB_DT_ENDPOINT_SIZE,
193 .bDescriptorType = USB_DT_ENDPOINT,
194
195 .bEndpointAddress = USB_DIR_IN,
196 .bmAttributes = USB_ENDPOINT_XFER_INT,
197 .wMaxPacketSize = __constant_cpu_to_le16(STATUS_BYTECOUNT),
198 .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC,
199};
200
201static struct usb_endpoint_descriptor fs_in_desc __initdata = {
202 .bLength = USB_DT_ENDPOINT_SIZE,
203 .bDescriptorType = USB_DT_ENDPOINT,
204
205 .bEndpointAddress = USB_DIR_IN,
206 .bmAttributes = USB_ENDPOINT_XFER_BULK,
207};
208
209static struct usb_endpoint_descriptor fs_out_desc __initdata = {
210 .bLength = USB_DT_ENDPOINT_SIZE,
211 .bDescriptorType = USB_DT_ENDPOINT,
212
213 .bEndpointAddress = USB_DIR_OUT,
214 .bmAttributes = USB_ENDPOINT_XFER_BULK,
215};
216
217static struct usb_descriptor_header *eth_fs_function[] __initdata = {
218 /* CDC ECM control descriptors */
219 (struct usb_descriptor_header *) &ecm_control_intf,
220 (struct usb_descriptor_header *) &header_desc,
221 (struct usb_descriptor_header *) &ecm_union_desc,
222 (struct usb_descriptor_header *) &ether_desc,
223 /* NOTE: status endpoint might need to be removed */
224 (struct usb_descriptor_header *) &fs_notify_desc,
225 /* data interface, altsettings 0 and 1 */
226 (struct usb_descriptor_header *) &ecm_data_nop_intf,
227 (struct usb_descriptor_header *) &ecm_data_intf,
228 (struct usb_descriptor_header *) &fs_in_desc,
229 (struct usb_descriptor_header *) &fs_out_desc,
230 NULL,
231};
232
233/* high speed support: */
234
235static struct usb_endpoint_descriptor hs_notify_desc __initdata = {
236 .bLength = USB_DT_ENDPOINT_SIZE,
237 .bDescriptorType = USB_DT_ENDPOINT,
238
239 .bEndpointAddress = USB_DIR_IN,
240 .bmAttributes = USB_ENDPOINT_XFER_INT,
241 .wMaxPacketSize = __constant_cpu_to_le16(STATUS_BYTECOUNT),
242 .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4,
243};
244static struct usb_endpoint_descriptor hs_in_desc __initdata = {
245 .bLength = USB_DT_ENDPOINT_SIZE,
246 .bDescriptorType = USB_DT_ENDPOINT,
247
248 .bEndpointAddress = USB_DIR_IN,
249 .bmAttributes = USB_ENDPOINT_XFER_BULK,
250 .wMaxPacketSize = __constant_cpu_to_le16(512),
251};
252
253static struct usb_endpoint_descriptor hs_out_desc __initdata = {
254 .bLength = USB_DT_ENDPOINT_SIZE,
255 .bDescriptorType = USB_DT_ENDPOINT,
256
257 .bEndpointAddress = USB_DIR_OUT,
258 .bmAttributes = USB_ENDPOINT_XFER_BULK,
259 .wMaxPacketSize = __constant_cpu_to_le16(512),
260};
261
262static struct usb_descriptor_header *eth_hs_function[] __initdata = {
263 /* CDC ECM control descriptors */
264 (struct usb_descriptor_header *) &ecm_control_intf,
265 (struct usb_descriptor_header *) &header_desc,
266 (struct usb_descriptor_header *) &ecm_union_desc,
267 (struct usb_descriptor_header *) &ether_desc,
268 /* NOTE: status endpoint might need to be removed */
269 (struct usb_descriptor_header *) &hs_notify_desc,
270 /* data interface, altsettings 0 and 1 */
271 (struct usb_descriptor_header *) &ecm_data_nop_intf,
272 (struct usb_descriptor_header *) &ecm_data_intf,
273 (struct usb_descriptor_header *) &hs_in_desc,
274 (struct usb_descriptor_header *) &hs_out_desc,
275 NULL,
276};
277
278/* string descriptors: */
279
280static struct usb_string ecm_string_defs[] = {
281 [0].s = "CDC Ethernet Control Model (ECM)",
282 [1].s = NULL /* DYNAMIC */,
283 [2].s = "CDC Ethernet Data",
284 { } /* end of list */
285};
286
287static struct usb_gadget_strings ecm_string_table = {
288 .language = 0x0409, /* en-us */
289 .strings = ecm_string_defs,
290};
291
292static struct usb_gadget_strings *ecm_strings[] = {
293 &ecm_string_table,
294 NULL,
295};
296
297/*-------------------------------------------------------------------------*/
298
299static void ecm_do_notify(struct f_ecm *ecm)
300{
301 struct usb_request *req = ecm->notify_req;
302 struct usb_cdc_notification *event;
303 struct usb_composite_dev *cdev = ecm->port.func.config->cdev;
304 __le32 *data;
305 int status;
306
307 /* notification already in flight? */
308 if (!req)
309 return;
310
311 event = req->buf;
312 switch (ecm->notify_state) {
313 case ECM_NOTIFY_NONE:
314 return;
315
316 case ECM_NOTIFY_CONNECT:
317 event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
318 if (ecm->is_open)
319 event->wValue = cpu_to_le16(1);
320 else
321 event->wValue = cpu_to_le16(0);
322 event->wLength = 0;
323 req->length = sizeof *event;
324
325 DBG(cdev, "notify connect %s\n",
326 ecm->is_open ? "true" : "false");
327 ecm->notify_state = ECM_NOTIFY_SPEED;
328 break;
329
330 case ECM_NOTIFY_SPEED:
331 event->bNotificationType = USB_CDC_NOTIFY_SPEED_CHANGE;
332 event->wValue = cpu_to_le16(0);
333 event->wLength = cpu_to_le16(8);
334 req->length = STATUS_BYTECOUNT;
335
336 /* SPEED_CHANGE data is up/down speeds in bits/sec */
337 data = req->buf + sizeof *event;
338 data[0] = cpu_to_le32(bitrate(cdev->gadget));
339 data[1] = data[0];
340
341 DBG(cdev, "notify speed %d\n", bitrate(cdev->gadget));
342 ecm->notify_state = ECM_NOTIFY_NONE;
343 break;
344 }
345 event->bmRequestType = 0xA1;
346 event->wIndex = cpu_to_le16(ecm->ctrl_id);
347
348 ecm->notify_req = NULL;
349 status = usb_ep_queue(ecm->notify, req, GFP_ATOMIC);
350 if (status < 0) {
351 ecm->notify_req = req;
352 DBG(cdev, "notify --> %d\n", status);
353 }
354}
355
356static void ecm_notify(struct f_ecm *ecm)
357{
358 /* NOTE on most versions of Linux, host side cdc-ethernet
359 * won't listen for notifications until its netdevice opens.
360 * The first notification then sits in the FIFO for a long
361 * time, and the second one is queued.
362 */
363 ecm->notify_state = ECM_NOTIFY_CONNECT;
364 ecm_do_notify(ecm);
365}
366
367static void ecm_notify_complete(struct usb_ep *ep, struct usb_request *req)
368{
369 struct f_ecm *ecm = req->context;
370 struct usb_composite_dev *cdev = ecm->port.func.config->cdev;
371 struct usb_cdc_notification *event = req->buf;
372
373 switch (req->status) {
374 case 0:
375 /* no fault */
376 break;
377 case -ECONNRESET:
378 case -ESHUTDOWN:
379 ecm->notify_state = ECM_NOTIFY_NONE;
380 break;
381 default:
382 DBG(cdev, "event %02x --> %d\n",
383 event->bNotificationType, req->status);
384 break;
385 }
386 ecm->notify_req = req;
387 ecm_do_notify(ecm);
388}
389
390static int ecm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
391{
392 struct f_ecm *ecm = func_to_ecm(f);
393 struct usb_composite_dev *cdev = f->config->cdev;
394 struct usb_request *req = cdev->req;
395 int value = -EOPNOTSUPP;
396 u16 w_index = le16_to_cpu(ctrl->wIndex);
397 u16 w_value = le16_to_cpu(ctrl->wValue);
398 u16 w_length = le16_to_cpu(ctrl->wLength);
399
400 /* composite driver infrastructure handles everything except
401 * CDC class messages; interface activation uses set_alt().
402 */
403 switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
404 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
405 | USB_CDC_SET_ETHERNET_PACKET_FILTER:
406 /* see 6.2.30: no data, wIndex = interface,
407 * wValue = packet filter bitmap
408 */
409 if (w_length != 0 || w_index != ecm->ctrl_id)
410 goto invalid;
411 DBG(cdev, "packet filter %02x\n", w_value);
412 /* REVISIT locking of cdc_filter. This assumes the UDC
413 * driver won't have a concurrent packet TX irq running on
414 * another CPU; or that if it does, this write is atomic...
415 */
416 ecm->port.cdc_filter = w_value;
417 value = 0;
418 break;
419
420 /* and optionally:
421 * case USB_CDC_SEND_ENCAPSULATED_COMMAND:
422 * case USB_CDC_GET_ENCAPSULATED_RESPONSE:
423 * case USB_CDC_SET_ETHERNET_MULTICAST_FILTERS:
424 * case USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER:
425 * case USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER:
426 * case USB_CDC_GET_ETHERNET_STATISTIC:
427 */
428
429 default:
430invalid:
431 DBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
432 ctrl->bRequestType, ctrl->bRequest,
433 w_value, w_index, w_length);
434 }
435
436 /* respond with data transfer or status phase? */
437 if (value >= 0) {
438 DBG(cdev, "ecm req%02x.%02x v%04x i%04x l%d\n",
439 ctrl->bRequestType, ctrl->bRequest,
440 w_value, w_index, w_length);
441 req->zero = 0;
442 req->length = value;
443 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
444 if (value < 0)
445 ERROR(cdev, "ecm req %02x.%02x response err %d\n",
446 ctrl->bRequestType, ctrl->bRequest,
447 value);
448 }
449
450 /* device either stalls (value < 0) or reports success */
451 return value;
452}
453
454
455static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
456{
457 struct f_ecm *ecm = func_to_ecm(f);
458 struct usb_composite_dev *cdev = f->config->cdev;
459
460 /* Control interface has only altsetting 0 */
461 if (intf == ecm->ctrl_id) {
462 if (alt != 0)
463 goto fail;
464
465 if (ecm->notify->driver_data) {
466 VDBG(cdev, "reset ecm control %d\n", intf);
467 usb_ep_disable(ecm->notify);
468 } else {
469 VDBG(cdev, "init ecm ctrl %d\n", intf);
470 ecm->notify_desc = ep_choose(cdev->gadget,
471 ecm->hs.notify,
472 ecm->fs.notify);
473 }
474 usb_ep_enable(ecm->notify, ecm->notify_desc);
475 ecm->notify->driver_data = ecm;
476
477 /* Data interface has two altsettings, 0 and 1 */
478 } else if (intf == ecm->data_id) {
479 if (alt > 1)
480 goto fail;
481
482 if (ecm->port.in_ep->driver_data) {
483 DBG(cdev, "reset ecm\n");
484 gether_disconnect(&ecm->port);
485 }
486
487 if (!ecm->port.in) {
488 DBG(cdev, "init ecm\n");
489 ecm->port.in = ep_choose(cdev->gadget,
490 ecm->hs.in, ecm->fs.in);
491 ecm->port.out = ep_choose(cdev->gadget,
492 ecm->hs.out, ecm->fs.out);
493 }
494
495 /* CDC Ethernet only sends data in non-default altsettings.
496 * Changing altsettings resets filters, statistics, etc.
497 */
498 if (alt == 1) {
499 struct net_device *net;
500
501 /* Enable zlps by default for ECM conformance;
502 * override for musb_hdrc (avoids txdma ovhead)
503 * and sa1100 (can't).
504 */
505 ecm->port.is_zlp_ok = !(
506 gadget_is_sa1100(cdev->gadget)
507 || gadget_is_musbhdrc(cdev->gadget)
508 );
509 ecm->port.cdc_filter = DEFAULT_FILTER;
510 DBG(cdev, "activate ecm\n");
511 net = gether_connect(&ecm->port);
512 if (IS_ERR(net))
513 return PTR_ERR(net);
514 }
515
516 /* NOTE this can be a minor disagreement with the ECM spec,
517 * which says speed notifications will "always" follow
518 * connection notifications. But we allow one connect to
519 * follow another (if the first is in flight), and instead
520 * just guarantee that a speed notification is always sent.
521 */
522 ecm_notify(ecm);
523 } else
524 goto fail;
525
526 return 0;
527fail:
528 return -EINVAL;
529}
530
531/* Because the data interface supports multiple altsettings,
532 * this ECM function *MUST* implement a get_alt() method.
533 */
534static int ecm_get_alt(struct usb_function *f, unsigned intf)
535{
536 struct f_ecm *ecm = func_to_ecm(f);
537
538 if (intf == ecm->ctrl_id)
539 return 0;
540 return ecm->port.in_ep->driver_data ? 1 : 0;
541}
542
543static void ecm_disable(struct usb_function *f)
544{
545 struct f_ecm *ecm = func_to_ecm(f);
546 struct usb_composite_dev *cdev = f->config->cdev;
547
548 DBG(cdev, "ecm deactivated\n");
549
550 if (ecm->port.in_ep->driver_data)
551 gether_disconnect(&ecm->port);
552
553 if (ecm->notify->driver_data) {
554 usb_ep_disable(ecm->notify);
555 ecm->notify->driver_data = NULL;
556 ecm->notify_desc = NULL;
557 }
558}
559
560/*-------------------------------------------------------------------------*/
561
562/*
563 * Callbacks let us notify the host about connect/disconnect when the
564 * net device is opened or closed.
565 *
566 * For testing, note that link states on this side include both opened
567 * and closed variants of:
568 *
569 * - disconnected/unconfigured
570 * - configured but inactive (data alt 0)
571 * - configured and active (data alt 1)
572 *
573 * Each needs to be tested with unplug, rmmod, SET_CONFIGURATION, and
574 * SET_INTERFACE (altsetting). Remember also that "configured" doesn't
575 * imply the host is actually polling the notification endpoint, and
576 * likewise that "active" doesn't imply it's actually using the data
577 * endpoints for traffic.
578 */
579
580static void ecm_open(struct gether *geth)
581{
582 struct f_ecm *ecm = func_to_ecm(&geth->func);
583
584 DBG(ecm->port.func.config->cdev, "%s\n", __func__);
585
586 ecm->is_open = true;
587 ecm_notify(ecm);
588}
589
590static void ecm_close(struct gether *geth)
591{
592 struct f_ecm *ecm = func_to_ecm(&geth->func);
593
594 DBG(ecm->port.func.config->cdev, "%s\n", __func__);
595
596 ecm->is_open = false;
597 ecm_notify(ecm);
598}
599
600/*-------------------------------------------------------------------------*/
601
602/* ethernet function driver setup/binding */
603
604static int __init
605ecm_bind(struct usb_configuration *c, struct usb_function *f)
606{
607 struct usb_composite_dev *cdev = c->cdev;
608 struct f_ecm *ecm = func_to_ecm(f);
609 int status;
610 struct usb_ep *ep;
611
612 /* allocate instance-specific interface IDs */
613 status = usb_interface_id(c, f);
614 if (status < 0)
615 goto fail;
616 ecm->ctrl_id = status;
617
618 ecm_control_intf.bInterfaceNumber = status;
619 ecm_union_desc.bMasterInterface0 = status;
620
621 status = usb_interface_id(c, f);
622 if (status < 0)
623 goto fail;
624 ecm->data_id = status;
625
626 ecm_data_nop_intf.bInterfaceNumber = status;
627 ecm_data_intf.bInterfaceNumber = status;
628 ecm_union_desc.bSlaveInterface0 = status;
629
630 status = -ENODEV;
631
632 /* allocate instance-specific endpoints */
633 ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
634 if (!ep)
635 goto fail;
636 ecm->port.in_ep = ep;
637 ep->driver_data = cdev; /* claim */
638
639 ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
640 if (!ep)
641 goto fail;
642 ecm->port.out_ep = ep;
643 ep->driver_data = cdev; /* claim */
644
645 /* NOTE: a status/notification endpoint is *OPTIONAL* but we
646 * don't treat it that way. It's simpler, and some newer CDC
647 * profiles (wireless handsets) no longer treat it as optional.
648 */
649 ep = usb_ep_autoconfig(cdev->gadget, &fs_notify_desc);
650 if (!ep)
651 goto fail;
652 ecm->notify = ep;
653 ep->driver_data = cdev; /* claim */
654
655 status = -ENOMEM;
656
657 /* allocate notification request and buffer */
658 ecm->notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
659 if (!ecm->notify_req)
660 goto fail;
661 ecm->notify_req->buf = kmalloc(STATUS_BYTECOUNT, GFP_KERNEL);
662 if (!ecm->notify_req->buf)
663 goto fail;
664 ecm->notify_req->context = ecm;
665 ecm->notify_req->complete = ecm_notify_complete;
666
667 /* copy descriptors, and track endpoint copies */
668 f->descriptors = usb_copy_descriptors(eth_fs_function);
669 if (!f->descriptors)
670 goto fail;
671
672 ecm->fs.in = usb_find_endpoint(eth_fs_function,
673 f->descriptors, &fs_in_desc);
674 ecm->fs.out = usb_find_endpoint(eth_fs_function,
675 f->descriptors, &fs_out_desc);
676 ecm->fs.notify = usb_find_endpoint(eth_fs_function,
677 f->descriptors, &fs_notify_desc);
678
679 /* support all relevant hardware speeds... we expect that when
680 * hardware is dual speed, all bulk-capable endpoints work at
681 * both speeds
682 */
683 if (gadget_is_dualspeed(c->cdev->gadget)) {
684 hs_in_desc.bEndpointAddress =
685 fs_in_desc.bEndpointAddress;
686 hs_out_desc.bEndpointAddress =
687 fs_out_desc.bEndpointAddress;
688 hs_notify_desc.bEndpointAddress =
689 fs_notify_desc.bEndpointAddress;
690
691 /* copy descriptors, and track endpoint copies */
692 f->hs_descriptors = usb_copy_descriptors(eth_hs_function);
693 if (!f->hs_descriptors)
694 goto fail;
695
696 ecm->hs.in = usb_find_endpoint(eth_hs_function,
697 f->hs_descriptors, &hs_in_desc);
698 ecm->hs.out = usb_find_endpoint(eth_hs_function,
699 f->hs_descriptors, &hs_out_desc);
700 ecm->hs.notify = usb_find_endpoint(eth_hs_function,
701 f->hs_descriptors, &hs_notify_desc);
702 }
703
704 /* NOTE: all that is done without knowing or caring about
705 * the network link ... which is unavailable to this code
706 * until we're activated via set_alt().
707 */
708
709 ecm->port.open = ecm_open;
710 ecm->port.close = ecm_close;
711
712 DBG(cdev, "CDC Ethernet: %s speed IN/%s OUT/%s NOTIFY/%s\n",
713 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
714 ecm->port.in_ep->name, ecm->port.out_ep->name,
715 ecm->notify->name);
716 return 0;
717
718fail:
719 if (f->descriptors)
720 usb_free_descriptors(f->descriptors);
721
722 if (ecm->notify_req) {
723 kfree(ecm->notify_req->buf);
724 usb_ep_free_request(ecm->notify, ecm->notify_req);
725 }
726
727 /* we might as well release our claims on endpoints */
728 if (ecm->notify)
729 ecm->notify->driver_data = NULL;
730 if (ecm->port.out)
731 ecm->port.out_ep->driver_data = NULL;
732 if (ecm->port.in)
733 ecm->port.in_ep->driver_data = NULL;
734
735 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
736
737 return status;
738}
739
740static void
741ecm_unbind(struct usb_configuration *c, struct usb_function *f)
742{
743 struct f_ecm *ecm = func_to_ecm(f);
744
745 DBG(c->cdev, "ecm unbind\n");
746
747 if (gadget_is_dualspeed(c->cdev->gadget))
748 usb_free_descriptors(f->hs_descriptors);
749 usb_free_descriptors(f->descriptors);
750
751 kfree(ecm->notify_req->buf);
752 usb_ep_free_request(ecm->notify, ecm->notify_req);
753
754 ecm_string_defs[1].s = NULL;
755 kfree(ecm);
756}
757
758/**
759 * ecm_bind_config - add CDC Ethernet network link to a configuration
760 * @c: the configuration to support the network link
761 * @ethaddr: a buffer in which the ethernet address of the host side
762 * side of the link was recorded
763 * Context: single threaded during gadget setup
764 *
765 * Returns zero on success, else negative errno.
766 *
767 * Caller must have called @gether_setup(). Caller is also responsible
768 * for calling @gether_cleanup() before module unload.
769 */
770int __init ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
771{
772 struct f_ecm *ecm;
773 int status;
774
775 if (!can_support_ecm(c->cdev->gadget) || !ethaddr)
776 return -EINVAL;
777
778 /* maybe allocate device-global string IDs */
779 if (ecm_string_defs[0].id == 0) {
780
781 /* control interface label */
782 status = usb_string_id(c->cdev);
783 if (status < 0)
784 return status;
785 ecm_string_defs[0].id = status;
786 ecm_control_intf.iInterface = status;
787
788 /* data interface label */
789 status = usb_string_id(c->cdev);
790 if (status < 0)
791 return status;
792 ecm_string_defs[2].id = status;
793 ecm_data_intf.iInterface = status;
794
795 /* MAC address */
796 status = usb_string_id(c->cdev);
797 if (status < 0)
798 return status;
799 ecm_string_defs[1].id = status;
800 ether_desc.iMACAddress = status;
801 }
802
803 /* allocate and initialize one new instance */
804 ecm = kzalloc(sizeof *ecm, GFP_KERNEL);
805 if (!ecm)
806 return -ENOMEM;
807
808 /* export host's Ethernet address in CDC format */
809 snprintf(ecm->ethaddr, sizeof ecm->ethaddr,
810 "%02X%02X%02X%02X%02X%02X",
811 ethaddr[0], ethaddr[1], ethaddr[2],
812 ethaddr[3], ethaddr[4], ethaddr[5]);
813 ecm_string_defs[1].s = ecm->ethaddr;
814
815 ecm->port.cdc_filter = DEFAULT_FILTER;
816
817 ecm->port.func.name = "cdc_ethernet";
818 ecm->port.func.strings = ecm_strings;
819 /* descriptors are per-instance copies */
820 ecm->port.func.bind = ecm_bind;
821 ecm->port.func.unbind = ecm_unbind;
822 ecm->port.func.set_alt = ecm_set_alt;
823 ecm->port.func.get_alt = ecm_get_alt;
824 ecm->port.func.setup = ecm_setup;
825 ecm->port.func.disable = ecm_disable;
826
827 status = usb_add_function(c, &ecm->port.func);
828 if (status) {
829 ecm_string_defs[1].s = NULL;
830 kfree(ecm);
831 }
832 return status;
833}
diff --git a/drivers/usb/gadget/f_loopback.c b/drivers/usb/gadget/f_loopback.c
new file mode 100644
index 000000000000..eda4cde72c82
--- /dev/null
+++ b/drivers/usb/gadget/f_loopback.c
@@ -0,0 +1,381 @@
1/*
2 * f_loopback.c - USB peripheral loopback configuration driver
3 *
4 * Copyright (C) 2003-2008 David Brownell
5 * Copyright (C) 2008 by Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22/* #define VERBOSE_DEBUG */
23
24#include <linux/kernel.h>
25#include <linux/utsname.h>
26#include <linux/device.h>
27
28#include "g_zero.h"
29#include "gadget_chips.h"
30
31
32/*
33 * LOOPBACK FUNCTION ... a testing vehicle for USB peripherals,
34 *
35 * This takes messages of various sizes written OUT to a device, and loops
36 * them back so they can be read IN from it. It has been used by certain
37 * test applications. It supports limited testing of data queueing logic.
38 *
39 *
40 * This is currently packaged as a configuration driver, which can't be
41 * combined with other functions to make composite devices. However, it
42 * can be combined with other independent configurations.
43 */
44struct f_loopback {
45 struct usb_function function;
46
47 struct usb_ep *in_ep;
48 struct usb_ep *out_ep;
49};
50
51static inline struct f_loopback *func_to_loop(struct usb_function *f)
52{
53 return container_of(f, struct f_loopback, function);
54}
55
56static unsigned qlen = 32;
57module_param(qlen, uint, 0);
58MODULE_PARM_DESC(qlenn, "depth of loopback queue");
59
60/*-------------------------------------------------------------------------*/
61
62static struct usb_interface_descriptor loopback_intf = {
63 .bLength = sizeof loopback_intf,
64 .bDescriptorType = USB_DT_INTERFACE,
65
66 .bNumEndpoints = 2,
67 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
68 /* .iInterface = DYNAMIC */
69};
70
71/* full speed support: */
72
73static struct usb_endpoint_descriptor fs_source_desc = {
74 .bLength = USB_DT_ENDPOINT_SIZE,
75 .bDescriptorType = USB_DT_ENDPOINT,
76
77 .bEndpointAddress = USB_DIR_IN,
78 .bmAttributes = USB_ENDPOINT_XFER_BULK,
79};
80
81static struct usb_endpoint_descriptor fs_sink_desc = {
82 .bLength = USB_DT_ENDPOINT_SIZE,
83 .bDescriptorType = USB_DT_ENDPOINT,
84
85 .bEndpointAddress = USB_DIR_OUT,
86 .bmAttributes = USB_ENDPOINT_XFER_BULK,
87};
88
89static struct usb_descriptor_header *fs_loopback_descs[] = {
90 (struct usb_descriptor_header *) &loopback_intf,
91 (struct usb_descriptor_header *) &fs_sink_desc,
92 (struct usb_descriptor_header *) &fs_source_desc,
93 NULL,
94};
95
96/* high speed support: */
97
98static struct usb_endpoint_descriptor hs_source_desc = {
99 .bLength = USB_DT_ENDPOINT_SIZE,
100 .bDescriptorType = USB_DT_ENDPOINT,
101
102 .bmAttributes = USB_ENDPOINT_XFER_BULK,
103 .wMaxPacketSize = __constant_cpu_to_le16(512),
104};
105
106static struct usb_endpoint_descriptor hs_sink_desc = {
107 .bLength = USB_DT_ENDPOINT_SIZE,
108 .bDescriptorType = USB_DT_ENDPOINT,
109
110 .bmAttributes = USB_ENDPOINT_XFER_BULK,
111 .wMaxPacketSize = __constant_cpu_to_le16(512),
112};
113
114static struct usb_descriptor_header *hs_loopback_descs[] = {
115 (struct usb_descriptor_header *) &loopback_intf,
116 (struct usb_descriptor_header *) &hs_source_desc,
117 (struct usb_descriptor_header *) &hs_sink_desc,
118 NULL,
119};
120
121/* function-specific strings: */
122
123static struct usb_string strings_loopback[] = {
124 [0].s = "loop input to output",
125 { } /* end of list */
126};
127
128static struct usb_gadget_strings stringtab_loop = {
129 .language = 0x0409, /* en-us */
130 .strings = strings_loopback,
131};
132
133static struct usb_gadget_strings *loopback_strings[] = {
134 &stringtab_loop,
135 NULL,
136};
137
138/*-------------------------------------------------------------------------*/
139
140static int __init
141loopback_bind(struct usb_configuration *c, struct usb_function *f)
142{
143 struct usb_composite_dev *cdev = c->cdev;
144 struct f_loopback *loop = func_to_loop(f);
145 int id;
146
147 /* allocate interface ID(s) */
148 id = usb_interface_id(c, f);
149 if (id < 0)
150 return id;
151 loopback_intf.bInterfaceNumber = id;
152
153 /* allocate endpoints */
154
155 loop->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc);
156 if (!loop->in_ep) {
157autoconf_fail:
158 ERROR(cdev, "%s: can't autoconfigure on %s\n",
159 f->name, cdev->gadget->name);
160 return -ENODEV;
161 }
162 loop->in_ep->driver_data = cdev; /* claim */
163
164 loop->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc);
165 if (!loop->out_ep)
166 goto autoconf_fail;
167 loop->out_ep->driver_data = cdev; /* claim */
168
169 /* support high speed hardware */
170 if (gadget_is_dualspeed(c->cdev->gadget)) {
171 hs_source_desc.bEndpointAddress =
172 fs_source_desc.bEndpointAddress;
173 hs_sink_desc.bEndpointAddress =
174 fs_sink_desc.bEndpointAddress;
175 f->hs_descriptors = hs_loopback_descs;
176 }
177
178 DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n",
179 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
180 f->name, loop->in_ep->name, loop->out_ep->name);
181 return 0;
182}
183
184static void
185loopback_unbind(struct usb_configuration *c, struct usb_function *f)
186{
187 kfree(func_to_loop(f));
188}
189
190static void loopback_complete(struct usb_ep *ep, struct usb_request *req)
191{
192 struct f_loopback *loop = ep->driver_data;
193 struct usb_composite_dev *cdev = loop->function.config->cdev;
194 int status = req->status;
195
196 switch (status) {
197
198 case 0: /* normal completion? */
199 if (ep == loop->out_ep) {
200 /* loop this OUT packet back IN to the host */
201 req->zero = (req->actual < req->length);
202 req->length = req->actual;
203 status = usb_ep_queue(loop->in_ep, req, GFP_ATOMIC);
204 if (status == 0)
205 return;
206
207 /* "should never get here" */
208 ERROR(cdev, "can't loop %s to %s: %d\n",
209 ep->name, loop->in_ep->name,
210 status);
211 }
212
213 /* queue the buffer for some later OUT packet */
214 req->length = buflen;
215 status = usb_ep_queue(loop->out_ep, req, GFP_ATOMIC);
216 if (status == 0)
217 return;
218
219 /* "should never get here" */
220 /* FALLTHROUGH */
221
222 default:
223 ERROR(cdev, "%s loop complete --> %d, %d/%d\n", ep->name,
224 status, req->actual, req->length);
225 /* FALLTHROUGH */
226
227 /* NOTE: since this driver doesn't maintain an explicit record
228 * of requests it submitted (just maintains qlen count), we
229 * rely on the hardware driver to clean up on disconnect or
230 * endpoint disable.
231 */
232 case -ECONNABORTED: /* hardware forced ep reset */
233 case -ECONNRESET: /* request dequeued */
234 case -ESHUTDOWN: /* disconnect from host */
235 free_ep_req(ep, req);
236 return;
237 }
238}
239
240static void disable_loopback(struct f_loopback *loop)
241{
242 struct usb_composite_dev *cdev;
243
244 cdev = loop->function.config->cdev;
245 disable_endpoints(cdev, loop->in_ep, loop->out_ep);
246 VDBG(cdev, "%s disabled\n", loop->function.name);
247}
248
249static int
250enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)
251{
252 int result = 0;
253 const struct usb_endpoint_descriptor *src, *sink;
254 struct usb_ep *ep;
255 struct usb_request *req;
256 unsigned i;
257
258 src = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc);
259 sink = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc);
260
261 /* one endpoint writes data back IN to the host */
262 ep = loop->in_ep;
263 result = usb_ep_enable(ep, src);
264 if (result < 0)
265 return result;
266 ep->driver_data = loop;
267
268 /* one endpoint just reads OUT packets */
269 ep = loop->out_ep;
270 result = usb_ep_enable(ep, sink);
271 if (result < 0) {
272fail0:
273 ep = loop->in_ep;
274 usb_ep_disable(ep);
275 ep->driver_data = NULL;
276 return result;
277 }
278 ep->driver_data = loop;
279
280 /* allocate a bunch of read buffers and queue them all at once.
281 * we buffer at most 'qlen' transfers; fewer if any need more
282 * than 'buflen' bytes each.
283 */
284 for (i = 0; i < qlen && result == 0; i++) {
285 req = alloc_ep_req(ep);
286 if (req) {
287 req->complete = loopback_complete;
288 result = usb_ep_queue(ep, req, GFP_ATOMIC);
289 if (result)
290 ERROR(cdev, "%s queue req --> %d\n",
291 ep->name, result);
292 } else {
293 usb_ep_disable(ep);
294 ep->driver_data = NULL;
295 result = -ENOMEM;
296 goto fail0;
297 }
298 }
299
300 DBG(cdev, "%s enabled\n", loop->function.name);
301 return result;
302}
303
304static int loopback_set_alt(struct usb_function *f,
305 unsigned intf, unsigned alt)
306{
307 struct f_loopback *loop = func_to_loop(f);
308 struct usb_composite_dev *cdev = f->config->cdev;
309
310 /* we know alt is zero */
311 if (loop->in_ep->driver_data)
312 disable_loopback(loop);
313 return enable_loopback(cdev, loop);
314}
315
316static void loopback_disable(struct usb_function *f)
317{
318 struct f_loopback *loop = func_to_loop(f);
319
320 disable_loopback(loop);
321}
322
323/*-------------------------------------------------------------------------*/
324
325static int __init loopback_bind_config(struct usb_configuration *c)
326{
327 struct f_loopback *loop;
328 int status;
329
330 loop = kzalloc(sizeof *loop, GFP_KERNEL);
331 if (!loop)
332 return -ENOMEM;
333
334 loop->function.name = "loopback";
335 loop->function.descriptors = fs_loopback_descs;
336 loop->function.bind = loopback_bind;
337 loop->function.unbind = loopback_unbind;
338 loop->function.set_alt = loopback_set_alt;
339 loop->function.disable = loopback_disable;
340
341 status = usb_add_function(c, &loop->function);
342 if (status)
343 kfree(loop);
344 return status;
345}
346
347static struct usb_configuration loopback_driver = {
348 .label = "loopback",
349 .strings = loopback_strings,
350 .bind = loopback_bind_config,
351 .bConfigurationValue = 2,
352 .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
353 .bMaxPower = 1, /* 2 mA, minimal */
354 /* .iConfiguration = DYNAMIC */
355};
356
357/**
358 * loopback_add - add a loopback testing configuration to a device
359 * @cdev: the device to support the loopback configuration
360 */
361int __init loopback_add(struct usb_composite_dev *cdev)
362{
363 int id;
364
365 /* allocate string ID(s) */
366 id = usb_string_id(cdev);
367 if (id < 0)
368 return id;
369 strings_loopback[0].id = id;
370
371 loopback_intf.iInterface = id;
372 loopback_driver.iConfiguration = id;
373
374 /* support OTG systems */
375 if (gadget_is_otg(cdev->gadget)) {
376 loopback_driver.descriptors = otg_desc;
377 loopback_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
378 }
379
380 return usb_add_config(cdev, &loopback_driver);
381}
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
new file mode 100644
index 000000000000..61652f0f13fd
--- /dev/null
+++ b/drivers/usb/gadget/f_rndis.c
@@ -0,0 +1,827 @@
1/*
2 * f_rndis.c -- RNDIS link function driver
3 *
4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
6 * Copyright (C) 2008 Nokia Corporation
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23/* #define VERBOSE_DEBUG */
24
25#include <linux/kernel.h>
26#include <linux/device.h>
27#include <linux/etherdevice.h>
28
29#include <asm/atomic.h>
30
31#include "u_ether.h"
32#include "rndis.h"
33
34
35/*
36 * This function is an RNDIS Ethernet port -- a Microsoft protocol that's
37 * been promoted instead of the standard CDC Ethernet. The published RNDIS
38 * spec is ambiguous, incomplete, and needlessly complex. Variants such as
39 * ActiveSync have even worse status in terms of specification.
40 *
41 * In short: it's a protocol controlled by (and for) Microsoft, not for an
42 * Open ecosystem or markets. Linux supports it *only* because Microsoft
43 * doesn't support the CDC Ethernet standard.
44 *
45 * The RNDIS data transfer model is complex, with multiple Ethernet packets
46 * per USB message, and out of band data. The control model is built around
47 * what's essentially an "RNDIS RPC" protocol. It's all wrapped in a CDC ACM
48 * (modem, not Ethernet) veneer, with those ACM descriptors being entirely
49 * useless (they're ignored). RNDIS expects to be the only function in its
50 * configuration, so it's no real help if you need composite devices; and
51 * it expects to be the first configuration too.
52 *
53 * There is a single technical advantage of RNDIS over CDC Ethernet, if you
54 * discount the fluff that its RPC can be made to deliver: it doesn't need
55 * a NOP altsetting for the data interface. That lets it work on some of the
56 * "so smart it's stupid" hardware which takes over configuration changes
57 * from the software, and adds restrictions like "no altsettings".
58 *
59 * Unfortunately MSFT's RNDIS drivers are buggy. They hang or oops, and
60 * have all sorts of contrary-to-specification oddities that can prevent
61 * them from working sanely. Since bugfixes (or accurate specs, letting
62 * Linux work around those bugs) are unlikely to ever come from MSFT, you
63 * may want to avoid using RNDIS on purely operational grounds.
64 *
65 * Omissions from the RNDIS 1.0 specification include:
66 *
67 * - Power management ... references data that's scattered around lots
68 * of other documentation, which is incorrect/incomplete there too.
69 *
70 * - There are various undocumented protocol requirements, like the need
71 * to send garbage in some control-OUT messages.
72 *
73 * - MS-Windows drivers sometimes emit undocumented requests.
74 */
75
76struct rndis_ep_descs {
77 struct usb_endpoint_descriptor *in;
78 struct usb_endpoint_descriptor *out;
79 struct usb_endpoint_descriptor *notify;
80};
81
82struct f_rndis {
83 struct gether port;
84 u8 ctrl_id, data_id;
85 u8 ethaddr[ETH_ALEN];
86 int config;
87
88 struct usb_descriptor_header **fs_function;
89 struct rndis_ep_descs fs;
90 struct usb_descriptor_header **hs_function;
91 struct rndis_ep_descs hs;
92
93 struct usb_ep *notify;
94 struct usb_endpoint_descriptor *notify_desc;
95 struct usb_request *notify_req;
96 atomic_t notify_count;
97};
98
99static inline struct f_rndis *func_to_rndis(struct usb_function *f)
100{
101 return container_of(f, struct f_rndis, port.func);
102}
103
104/* peak (theoretical) bulk transfer rate in bits-per-second */
105static unsigned int bitrate(struct usb_gadget *g)
106{
107 if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
108 return 13 * 512 * 8 * 1000 * 8;
109 else
110 return 19 * 64 * 1 * 1000 * 8;
111}
112
113/*-------------------------------------------------------------------------*/
114
115/*
116 */
117
118#define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */
119#define STATUS_BYTECOUNT 8 /* 8 bytes data */
120
121
122/* interface descriptor: */
123
124static struct usb_interface_descriptor rndis_control_intf __initdata = {
125 .bLength = sizeof rndis_control_intf,
126 .bDescriptorType = USB_DT_INTERFACE,
127
128 /* .bInterfaceNumber = DYNAMIC */
129 /* status endpoint is optional; this could be patched later */
130 .bNumEndpoints = 1,
131 .bInterfaceClass = USB_CLASS_COMM,
132 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
133 .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
134 /* .iInterface = DYNAMIC */
135};
136
137static struct usb_cdc_header_desc header_desc __initdata = {
138 .bLength = sizeof header_desc,
139 .bDescriptorType = USB_DT_CS_INTERFACE,
140 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
141
142 .bcdCDC = __constant_cpu_to_le16(0x0110),
143};
144
145static struct usb_cdc_call_mgmt_descriptor call_mgmt_descriptor __initdata = {
146 .bLength = sizeof call_mgmt_descriptor,
147 .bDescriptorType = USB_DT_CS_INTERFACE,
148 .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
149
150 .bmCapabilities = 0x00,
151 .bDataInterface = 0x01,
152};
153
154static struct usb_cdc_acm_descriptor acm_descriptor __initdata = {
155 .bLength = sizeof acm_descriptor,
156 .bDescriptorType = USB_DT_CS_INTERFACE,
157 .bDescriptorSubType = USB_CDC_ACM_TYPE,
158
159 .bmCapabilities = 0x00,
160};
161
162static struct usb_cdc_union_desc rndis_union_desc __initdata = {
163 .bLength = sizeof(rndis_union_desc),
164 .bDescriptorType = USB_DT_CS_INTERFACE,
165 .bDescriptorSubType = USB_CDC_UNION_TYPE,
166 /* .bMasterInterface0 = DYNAMIC */
167 /* .bSlaveInterface0 = DYNAMIC */
168};
169
170/* the data interface has two bulk endpoints */
171
172static struct usb_interface_descriptor rndis_data_intf __initdata = {
173 .bLength = sizeof rndis_data_intf,
174 .bDescriptorType = USB_DT_INTERFACE,
175
176 /* .bInterfaceNumber = DYNAMIC */
177 .bAlternateSetting = 1,
178 .bNumEndpoints = 2,
179 .bInterfaceClass = USB_CLASS_CDC_DATA,
180 .bInterfaceSubClass = 0,
181 .bInterfaceProtocol = 0,
182 /* .iInterface = DYNAMIC */
183};
184
185/* full speed support: */
186
187static struct usb_endpoint_descriptor fs_notify_desc __initdata = {
188 .bLength = USB_DT_ENDPOINT_SIZE,
189 .bDescriptorType = USB_DT_ENDPOINT,
190
191 .bEndpointAddress = USB_DIR_IN,
192 .bmAttributes = USB_ENDPOINT_XFER_INT,
193 .wMaxPacketSize = __constant_cpu_to_le16(STATUS_BYTECOUNT),
194 .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC,
195};
196
197static struct usb_endpoint_descriptor fs_in_desc __initdata = {
198 .bLength = USB_DT_ENDPOINT_SIZE,
199 .bDescriptorType = USB_DT_ENDPOINT,
200
201 .bEndpointAddress = USB_DIR_IN,
202 .bmAttributes = USB_ENDPOINT_XFER_BULK,
203};
204
205static struct usb_endpoint_descriptor fs_out_desc __initdata = {
206 .bLength = USB_DT_ENDPOINT_SIZE,
207 .bDescriptorType = USB_DT_ENDPOINT,
208
209 .bEndpointAddress = USB_DIR_OUT,
210 .bmAttributes = USB_ENDPOINT_XFER_BULK,
211};
212
213static struct usb_descriptor_header *eth_fs_function[] __initdata = {
214 /* control interface matches ACM, not Ethernet */
215 (struct usb_descriptor_header *) &rndis_control_intf,
216 (struct usb_descriptor_header *) &header_desc,
217 (struct usb_descriptor_header *) &call_mgmt_descriptor,
218 (struct usb_descriptor_header *) &acm_descriptor,
219 (struct usb_descriptor_header *) &rndis_union_desc,
220 (struct usb_descriptor_header *) &fs_notify_desc,
221 /* data interface has no altsetting */
222 (struct usb_descriptor_header *) &rndis_data_intf,
223 (struct usb_descriptor_header *) &fs_in_desc,
224 (struct usb_descriptor_header *) &fs_out_desc,
225 NULL,
226};
227
228/* high speed support: */
229
230static struct usb_endpoint_descriptor hs_notify_desc __initdata = {
231 .bLength = USB_DT_ENDPOINT_SIZE,
232 .bDescriptorType = USB_DT_ENDPOINT,
233
234 .bEndpointAddress = USB_DIR_IN,
235 .bmAttributes = USB_ENDPOINT_XFER_INT,
236 .wMaxPacketSize = __constant_cpu_to_le16(STATUS_BYTECOUNT),
237 .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4,
238};
239static struct usb_endpoint_descriptor hs_in_desc __initdata = {
240 .bLength = USB_DT_ENDPOINT_SIZE,
241 .bDescriptorType = USB_DT_ENDPOINT,
242
243 .bEndpointAddress = USB_DIR_IN,
244 .bmAttributes = USB_ENDPOINT_XFER_BULK,
245 .wMaxPacketSize = __constant_cpu_to_le16(512),
246};
247
248static struct usb_endpoint_descriptor hs_out_desc __initdata = {
249 .bLength = USB_DT_ENDPOINT_SIZE,
250 .bDescriptorType = USB_DT_ENDPOINT,
251
252 .bEndpointAddress = USB_DIR_OUT,
253 .bmAttributes = USB_ENDPOINT_XFER_BULK,
254 .wMaxPacketSize = __constant_cpu_to_le16(512),
255};
256
257static struct usb_descriptor_header *eth_hs_function[] __initdata = {
258 /* control interface matches ACM, not Ethernet */
259 (struct usb_descriptor_header *) &rndis_control_intf,
260 (struct usb_descriptor_header *) &header_desc,
261 (struct usb_descriptor_header *) &call_mgmt_descriptor,
262 (struct usb_descriptor_header *) &acm_descriptor,
263 (struct usb_descriptor_header *) &rndis_union_desc,
264 (struct usb_descriptor_header *) &hs_notify_desc,
265 /* data interface has no altsetting */
266 (struct usb_descriptor_header *) &rndis_data_intf,
267 (struct usb_descriptor_header *) &hs_in_desc,
268 (struct usb_descriptor_header *) &hs_out_desc,
269 NULL,
270};
271
272/* string descriptors: */
273
274static struct usb_string rndis_string_defs[] = {
275 [0].s = "RNDIS Communications Control",
276 [1].s = "RNDIS Ethernet Data",
277 { } /* end of list */
278};
279
280static struct usb_gadget_strings rndis_string_table = {
281 .language = 0x0409, /* en-us */
282 .strings = rndis_string_defs,
283};
284
285static struct usb_gadget_strings *rndis_strings[] = {
286 &rndis_string_table,
287 NULL,
288};
289
290/*-------------------------------------------------------------------------*/
291
292static struct sk_buff *rndis_add_header(struct sk_buff *skb)
293{
294 skb = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type));
295 if (skb)
296 rndis_add_hdr(skb);
297 return skb;
298}
299
300static void rndis_response_available(void *_rndis)
301{
302 struct f_rndis *rndis = _rndis;
303 struct usb_request *req = rndis->notify_req;
304 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
305 __le32 *data = req->buf;
306 int status;
307
308 if (atomic_inc_return(&rndis->notify_count))
309 return;
310
311 /* Send RNDIS RESPONSE_AVAILABLE notification; a
312 * USB_CDC_NOTIFY_RESPONSE_AVAILABLE "should" work too
313 *
314 * This is the only notification defined by RNDIS.
315 */
316 data[0] = cpu_to_le32(1);
317 data[1] = cpu_to_le32(0);
318
319 status = usb_ep_queue(rndis->notify, req, GFP_ATOMIC);
320 if (status) {
321 atomic_dec(&rndis->notify_count);
322 DBG(cdev, "notify/0 --> %d\n", status);
323 }
324}
325
326static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req)
327{
328 struct f_rndis *rndis = req->context;
329 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
330 int status = req->status;
331
332 /* after TX:
333 * - USB_CDC_GET_ENCAPSULATED_RESPONSE (ep0/control)
334 * - RNDIS_RESPONSE_AVAILABLE (status/irq)
335 */
336 switch (status) {
337 case -ECONNRESET:
338 case -ESHUTDOWN:
339 /* connection gone */
340 atomic_set(&rndis->notify_count, 0);
341 break;
342 default:
343 DBG(cdev, "RNDIS %s response error %d, %d/%d\n",
344 ep->name, status,
345 req->actual, req->length);
346 /* FALLTHROUGH */
347 case 0:
348 if (ep != rndis->notify)
349 break;
350
351 /* handle multiple pending RNDIS_RESPONSE_AVAILABLE
352 * notifications by resending until we're done
353 */
354 if (atomic_dec_and_test(&rndis->notify_count))
355 break;
356 status = usb_ep_queue(rndis->notify, req, GFP_ATOMIC);
357 if (status) {
358 atomic_dec(&rndis->notify_count);
359 DBG(cdev, "notify/1 --> %d\n", status);
360 }
361 break;
362 }
363}
364
365static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
366{
367 struct f_rndis *rndis = req->context;
368 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
369 int status;
370
371 /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
372// spin_lock(&dev->lock);
373 status = rndis_msg_parser(rndis->config, (u8 *) req->buf);
374 if (status < 0)
375 ERROR(cdev, "RNDIS command error %d, %d/%d\n",
376 status, req->actual, req->length);
377// spin_unlock(&dev->lock);
378}
379
380static int
381rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
382{
383 struct f_rndis *rndis = func_to_rndis(f);
384 struct usb_composite_dev *cdev = f->config->cdev;
385 struct usb_request *req = cdev->req;
386 int value = -EOPNOTSUPP;
387 u16 w_index = le16_to_cpu(ctrl->wIndex);
388 u16 w_value = le16_to_cpu(ctrl->wValue);
389 u16 w_length = le16_to_cpu(ctrl->wLength);
390
391 /* composite driver infrastructure handles everything except
392 * CDC class messages; interface activation uses set_alt().
393 */
394 switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
395
396 /* RNDIS uses the CDC command encapsulation mechanism to implement
397 * an RPC scheme, with much getting/setting of attributes by OID.
398 */
399 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
400 | USB_CDC_SEND_ENCAPSULATED_COMMAND:
401 if (w_length > req->length || w_value
402 || w_index != rndis->ctrl_id)
403 goto invalid;
404 /* read the request; process it later */
405 value = w_length;
406 req->complete = rndis_command_complete;
407 req->context = rndis;
408 /* later, rndis_response_available() sends a notification */
409 break;
410
411 case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
412 | USB_CDC_GET_ENCAPSULATED_RESPONSE:
413 if (w_value || w_index != rndis->ctrl_id)
414 goto invalid;
415 else {
416 u8 *buf;
417 u32 n;
418
419 /* return the result */
420 buf = rndis_get_next_response(rndis->config, &n);
421 if (buf) {
422 memcpy(req->buf, buf, n);
423 req->complete = rndis_response_complete;
424 rndis_free_response(rndis->config, buf);
425 value = n;
426 }
427 /* else stalls ... spec says to avoid that */
428 }
429 break;
430
431 default:
432invalid:
433 VDBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
434 ctrl->bRequestType, ctrl->bRequest,
435 w_value, w_index, w_length);
436 }
437
438 /* respond with data transfer or status phase? */
439 if (value >= 0) {
440 DBG(cdev, "rndis req%02x.%02x v%04x i%04x l%d\n",
441 ctrl->bRequestType, ctrl->bRequest,
442 w_value, w_index, w_length);
443 req->zero = 0;
444 req->length = value;
445 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
446 if (value < 0)
447 ERROR(cdev, "rndis response on err %d\n", value);
448 }
449
450 /* device either stalls (value < 0) or reports success */
451 return value;
452}
453
454
455static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
456{
457 struct f_rndis *rndis = func_to_rndis(f);
458 struct usb_composite_dev *cdev = f->config->cdev;
459
460 /* we know alt == 0 */
461
462 if (intf == rndis->ctrl_id) {
463 if (rndis->notify->driver_data) {
464 VDBG(cdev, "reset rndis control %d\n", intf);
465 usb_ep_disable(rndis->notify);
466 } else {
467 VDBG(cdev, "init rndis ctrl %d\n", intf);
468 rndis->notify_desc = ep_choose(cdev->gadget,
469 rndis->hs.notify,
470 rndis->fs.notify);
471 }
472 usb_ep_enable(rndis->notify, rndis->notify_desc);
473 rndis->notify->driver_data = rndis;
474
475 } else if (intf == rndis->data_id) {
476 struct net_device *net;
477
478 if (rndis->port.in_ep->driver_data) {
479 DBG(cdev, "reset rndis\n");
480 gether_disconnect(&rndis->port);
481 } else {
482 DBG(cdev, "init rndis\n");
483 rndis->port.in = ep_choose(cdev->gadget,
484 rndis->hs.in, rndis->fs.in);
485 rndis->port.out = ep_choose(cdev->gadget,
486 rndis->hs.out, rndis->fs.out);
487 }
488
489 /* Avoid ZLPs; they can be troublesome. */
490 rndis->port.is_zlp_ok = false;
491
492 /* RNDIS should be in the "RNDIS uninitialized" state,
493 * either never activated or after rndis_uninit().
494 *
495 * We don't want data to flow here until a nonzero packet
496 * filter is set, at which point it enters "RNDIS data
497 * initialized" state ... but we do want the endpoints
498 * to be activated. It's a strange little state.
499 *
500 * REVISIT the RNDIS gadget code has done this wrong for a
501 * very long time. We need another call to the link layer
502 * code -- gether_updown(...bool) maybe -- to do it right.
503 */
504 rndis->port.cdc_filter = 0;
505
506 DBG(cdev, "RNDIS RX/TX early activation ... \n");
507 net = gether_connect(&rndis->port);
508 if (IS_ERR(net))
509 return PTR_ERR(net);
510
511 rndis_set_param_dev(rndis->config, net,
512 &rndis->port.cdc_filter);
513 } else
514 goto fail;
515
516 return 0;
517fail:
518 return -EINVAL;
519}
520
521static void rndis_disable(struct usb_function *f)
522{
523 struct f_rndis *rndis = func_to_rndis(f);
524 struct usb_composite_dev *cdev = f->config->cdev;
525
526 if (!rndis->notify->driver_data)
527 return;
528
529 DBG(cdev, "rndis deactivated\n");
530
531 rndis_uninit(rndis->config);
532 gether_disconnect(&rndis->port);
533
534 usb_ep_disable(rndis->notify);
535 rndis->notify->driver_data = NULL;
536}
537
538/*-------------------------------------------------------------------------*/
539
540/*
541 * This isn't quite the same mechanism as CDC Ethernet, since the
542 * notification scheme passes less data, but the same set of link
543 * states must be tested. A key difference is that altsettings are
544 * not used to tell whether the link should send packets or not.
545 */
546
547static void rndis_open(struct gether *geth)
548{
549 struct f_rndis *rndis = func_to_rndis(&geth->func);
550 struct usb_composite_dev *cdev = geth->func.config->cdev;
551
552 DBG(cdev, "%s\n", __func__);
553
554 rndis_set_param_medium(rndis->config, NDIS_MEDIUM_802_3,
555 bitrate(cdev->gadget) / 100);
556 rndis_signal_connect(rndis->config);
557}
558
559static void rndis_close(struct gether *geth)
560{
561 struct f_rndis *rndis = func_to_rndis(&geth->func);
562
563 DBG(geth->func.config->cdev, "%s\n", __func__);
564
565 rndis_set_param_medium(rndis->config, NDIS_MEDIUM_802_3, 0);
566 rndis_signal_disconnect(rndis->config);
567}
568
569/*-------------------------------------------------------------------------*/
570
571/* ethernet function driver setup/binding */
572
573static int __init
574rndis_bind(struct usb_configuration *c, struct usb_function *f)
575{
576 struct usb_composite_dev *cdev = c->cdev;
577 struct f_rndis *rndis = func_to_rndis(f);
578 int status;
579 struct usb_ep *ep;
580
581 /* allocate instance-specific interface IDs */
582 status = usb_interface_id(c, f);
583 if (status < 0)
584 goto fail;
585 rndis->ctrl_id = status;
586
587 rndis_control_intf.bInterfaceNumber = status;
588 rndis_union_desc.bMasterInterface0 = status;
589
590 status = usb_interface_id(c, f);
591 if (status < 0)
592 goto fail;
593 rndis->data_id = status;
594
595 rndis_data_intf.bInterfaceNumber = status;
596 rndis_union_desc.bSlaveInterface0 = status;
597
598 status = -ENODEV;
599
600 /* allocate instance-specific endpoints */
601 ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
602 if (!ep)
603 goto fail;
604 rndis->port.in_ep = ep;
605 ep->driver_data = cdev; /* claim */
606
607 ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
608 if (!ep)
609 goto fail;
610 rndis->port.out_ep = ep;
611 ep->driver_data = cdev; /* claim */
612
613 /* NOTE: a status/notification endpoint is, strictly speaking,
614 * optional. We don't treat it that way though! It's simpler,
615 * and some newer profiles don't treat it as optional.
616 */
617 ep = usb_ep_autoconfig(cdev->gadget, &fs_notify_desc);
618 if (!ep)
619 goto fail;
620 rndis->notify = ep;
621 ep->driver_data = cdev; /* claim */
622
623 status = -ENOMEM;
624
625 /* allocate notification request and buffer */
626 rndis->notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
627 if (!rndis->notify_req)
628 goto fail;
629 rndis->notify_req->buf = kmalloc(STATUS_BYTECOUNT, GFP_KERNEL);
630 if (!rndis->notify_req->buf)
631 goto fail;
632 rndis->notify_req->length = STATUS_BYTECOUNT;
633 rndis->notify_req->context = rndis;
634 rndis->notify_req->complete = rndis_response_complete;
635
636 /* copy descriptors, and track endpoint copies */
637 f->descriptors = usb_copy_descriptors(eth_fs_function);
638 if (!f->descriptors)
639 goto fail;
640
641 rndis->fs.in = usb_find_endpoint(eth_fs_function,
642 f->descriptors, &fs_in_desc);
643 rndis->fs.out = usb_find_endpoint(eth_fs_function,
644 f->descriptors, &fs_out_desc);
645 rndis->fs.notify = usb_find_endpoint(eth_fs_function,
646 f->descriptors, &fs_notify_desc);
647
648 /* support all relevant hardware speeds... we expect that when
649 * hardware is dual speed, all bulk-capable endpoints work at
650 * both speeds
651 */
652 if (gadget_is_dualspeed(c->cdev->gadget)) {
653 hs_in_desc.bEndpointAddress =
654 fs_in_desc.bEndpointAddress;
655 hs_out_desc.bEndpointAddress =
656 fs_out_desc.bEndpointAddress;
657
658 /* copy descriptors, and track endpoint copies */
659 f->hs_descriptors = usb_copy_descriptors(eth_hs_function);
660
661 if (!f->hs_descriptors)
662 goto fail;
663
664 rndis->hs.in = usb_find_endpoint(eth_hs_function,
665 f->hs_descriptors, &hs_in_desc);
666 rndis->hs.out = usb_find_endpoint(eth_hs_function,
667 f->hs_descriptors, &hs_out_desc);
668 }
669
670 rndis->port.open = rndis_open;
671 rndis->port.close = rndis_close;
672
673 status = rndis_register(rndis_response_available, rndis);
674 if (status < 0)
675 goto fail;
676 rndis->config = status;
677
678 rndis_set_param_medium(rndis->config, NDIS_MEDIUM_802_3, 0);
679 rndis_set_host_mac(rndis->config, rndis->ethaddr);
680
681#if 0
682// FIXME
683 if (rndis_set_param_vendor(rndis->config, vendorID,
684 manufacturer))
685 goto fail0;
686#endif
687
688 /* NOTE: all that is done without knowing or caring about
689 * the network link ... which is unavailable to this code
690 * until we're activated via set_alt().
691 */
692
693 DBG(cdev, "RNDIS: %s speed IN/%s OUT/%s NOTIFY/%s\n",
694 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
695 rndis->port.in_ep->name, rndis->port.out_ep->name,
696 rndis->notify->name);
697 return 0;
698
699fail:
700 if (gadget_is_dualspeed(c->cdev->gadget) && f->hs_descriptors)
701 usb_free_descriptors(f->hs_descriptors);
702 if (f->descriptors)
703 usb_free_descriptors(f->descriptors);
704
705 if (rndis->notify_req) {
706 kfree(rndis->notify_req->buf);
707 usb_ep_free_request(rndis->notify, rndis->notify_req);
708 }
709
710 /* we might as well release our claims on endpoints */
711 if (rndis->notify)
712 rndis->notify->driver_data = NULL;
713 if (rndis->port.out)
714 rndis->port.out_ep->driver_data = NULL;
715 if (rndis->port.in)
716 rndis->port.in_ep->driver_data = NULL;
717
718 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
719
720 return status;
721}
722
723static void
724rndis_unbind(struct usb_configuration *c, struct usb_function *f)
725{
726 struct f_rndis *rndis = func_to_rndis(f);
727
728 rndis_deregister(rndis->config);
729 rndis_exit();
730
731 if (gadget_is_dualspeed(c->cdev->gadget))
732 usb_free_descriptors(f->hs_descriptors);
733 usb_free_descriptors(f->descriptors);
734
735 kfree(rndis->notify_req->buf);
736 usb_ep_free_request(rndis->notify, rndis->notify_req);
737
738 kfree(rndis);
739}
740
741/* Some controllers can't support RNDIS ... */
742static inline bool can_support_rndis(struct usb_configuration *c)
743{
744 /* only two endpoints on sa1100 */
745 if (gadget_is_sa1100(c->cdev->gadget))
746 return false;
747
748 /* everything else is *presumably* fine */
749 return true;
750}
751
752/**
753 * rndis_bind_config - add RNDIS network link to a configuration
754 * @c: the configuration to support the network link
755 * @ethaddr: a buffer in which the ethernet address of the host side
756 * side of the link was recorded
757 * Context: single threaded during gadget setup
758 *
759 * Returns zero on success, else negative errno.
760 *
761 * Caller must have called @gether_setup(). Caller is also responsible
762 * for calling @gether_cleanup() before module unload.
763 */
764int __init rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
765{
766 struct f_rndis *rndis;
767 int status;
768
769 if (!can_support_rndis(c) || !ethaddr)
770 return -EINVAL;
771
772 /* maybe allocate device-global string IDs */
773 if (rndis_string_defs[0].id == 0) {
774
775 /* ... and setup RNDIS itself */
776 status = rndis_init();
777 if (status < 0)
778 return status;
779
780 /* control interface label */
781 status = usb_string_id(c->cdev);
782 if (status < 0)
783 return status;
784 rndis_string_defs[0].id = status;
785 rndis_control_intf.iInterface = status;
786
787 /* data interface label */
788 status = usb_string_id(c->cdev);
789 if (status < 0)
790 return status;
791 rndis_string_defs[1].id = status;
792 rndis_data_intf.iInterface = status;
793 }
794
795 /* allocate and initialize one new instance */
796 status = -ENOMEM;
797 rndis = kzalloc(sizeof *rndis, GFP_KERNEL);
798 if (!rndis)
799 goto fail;
800
801 memcpy(rndis->ethaddr, ethaddr, ETH_ALEN);
802
803 /* RNDIS activates when the host changes this filter */
804 rndis->port.cdc_filter = 0;
805
806 /* RNDIS has special (and complex) framing */
807 rndis->port.header_len = sizeof(struct rndis_packet_msg_type);
808 rndis->port.wrap = rndis_add_header;
809 rndis->port.unwrap = rndis_rm_hdr;
810
811 rndis->port.func.name = "rndis";
812 rndis->port.func.strings = rndis_strings;
813 /* descriptors are per-instance copies */
814 rndis->port.func.bind = rndis_bind;
815 rndis->port.func.unbind = rndis_unbind;
816 rndis->port.func.set_alt = rndis_set_alt;
817 rndis->port.func.setup = rndis_setup;
818 rndis->port.func.disable = rndis_disable;
819
820 status = usb_add_function(c, &rndis->port.func);
821 if (status) {
822 kfree(rndis);
823fail:
824 rndis_exit();
825 }
826 return status;
827}
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c
new file mode 100644
index 000000000000..1b6bde9aaed5
--- /dev/null
+++ b/drivers/usb/gadget/f_serial.c
@@ -0,0 +1,296 @@
1/*
2 * f_serial.c - generic USB serial function driver
3 *
4 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
5 * Copyright (C) 2008 by David Brownell
6 * Copyright (C) 2008 by Nokia Corporation
7 *
8 * This software is distributed under the terms of the GNU General
9 * Public License ("GPL") as published by the Free Software Foundation,
10 * either version 2 of that License or (at your option) any later version.
11 */
12
13#include <linux/kernel.h>
14#include <linux/device.h>
15
16#include "u_serial.h"
17#include "gadget_chips.h"
18
19
20/*
21 * This function packages a simple "generic serial" port with no real
22 * control mechanisms, just raw data transfer over two bulk endpoints.
23 *
24 * Because it's not standardized, this isn't as interoperable as the
25 * CDC ACM driver. However, for many purposes it's just as functional
26 * if you can arrange appropriate host side drivers.
27 */
28
29struct gser_descs {
30 struct usb_endpoint_descriptor *in;
31 struct usb_endpoint_descriptor *out;
32};
33
34struct f_gser {
35 struct gserial port;
36 u8 data_id;
37 u8 port_num;
38
39 struct usb_descriptor_header **fs_function;
40 struct gser_descs fs;
41 struct usb_descriptor_header **hs_function;
42 struct gser_descs hs;
43};
44
45static inline struct f_gser *func_to_gser(struct usb_function *f)
46{
47 return container_of(f, struct f_gser, port.func);
48}
49
50/*-------------------------------------------------------------------------*/
51
52/* interface descriptor: */
53
54static struct usb_interface_descriptor gser_interface_desc __initdata = {
55 .bLength = USB_DT_INTERFACE_SIZE,
56 .bDescriptorType = USB_DT_INTERFACE,
57 /* .bInterfaceNumber = DYNAMIC */
58 .bNumEndpoints = 2,
59 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
60 .bInterfaceSubClass = 0,
61 .bInterfaceProtocol = 0,
62 /* .iInterface = DYNAMIC */
63};
64
65/* full speed support: */
66
67static struct usb_endpoint_descriptor gser_fs_in_desc __initdata = {
68 .bLength = USB_DT_ENDPOINT_SIZE,
69 .bDescriptorType = USB_DT_ENDPOINT,
70 .bEndpointAddress = USB_DIR_IN,
71 .bmAttributes = USB_ENDPOINT_XFER_BULK,
72};
73
74static struct usb_endpoint_descriptor gser_fs_out_desc __initdata = {
75 .bLength = USB_DT_ENDPOINT_SIZE,
76 .bDescriptorType = USB_DT_ENDPOINT,
77 .bEndpointAddress = USB_DIR_OUT,
78 .bmAttributes = USB_ENDPOINT_XFER_BULK,
79};
80
81static struct usb_descriptor_header *gser_fs_function[] __initdata = {
82 (struct usb_descriptor_header *) &gser_interface_desc,
83 (struct usb_descriptor_header *) &gser_fs_in_desc,
84 (struct usb_descriptor_header *) &gser_fs_out_desc,
85 NULL,
86};
87
88/* high speed support: */
89
90static struct usb_endpoint_descriptor gser_hs_in_desc __initdata = {
91 .bLength = USB_DT_ENDPOINT_SIZE,
92 .bDescriptorType = USB_DT_ENDPOINT,
93 .bmAttributes = USB_ENDPOINT_XFER_BULK,
94 .wMaxPacketSize = __constant_cpu_to_le16(512),
95};
96
97static struct usb_endpoint_descriptor gser_hs_out_desc __initdata = {
98 .bLength = USB_DT_ENDPOINT_SIZE,
99 .bDescriptorType = USB_DT_ENDPOINT,
100 .bmAttributes = USB_ENDPOINT_XFER_BULK,
101 .wMaxPacketSize = __constant_cpu_to_le16(512),
102};
103
104static struct usb_descriptor_header *gser_hs_function[] __initdata = {
105 (struct usb_descriptor_header *) &gser_interface_desc,
106 (struct usb_descriptor_header *) &gser_hs_in_desc,
107 (struct usb_descriptor_header *) &gser_hs_out_desc,
108 NULL,
109};
110
111/* string descriptors: */
112
113static struct usb_string gser_string_defs[] = {
114 [0].s = "Generic Serial",
115 { } /* end of list */
116};
117
118static struct usb_gadget_strings gser_string_table = {
119 .language = 0x0409, /* en-us */
120 .strings = gser_string_defs,
121};
122
123static struct usb_gadget_strings *gser_strings[] = {
124 &gser_string_table,
125 NULL,
126};
127
128/*-------------------------------------------------------------------------*/
129
130static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
131{
132 struct f_gser *gser = func_to_gser(f);
133 struct usb_composite_dev *cdev = f->config->cdev;
134
135 /* we know alt == 0, so this is an activation or a reset */
136
137 if (gser->port.in->driver_data) {
138 DBG(cdev, "reset generic ttyGS%d\n", gser->port_num);
139 gserial_disconnect(&gser->port);
140 } else {
141 DBG(cdev, "activate generic ttyGS%d\n", gser->port_num);
142 gser->port.in_desc = ep_choose(cdev->gadget,
143 gser->hs.in, gser->fs.in);
144 gser->port.out_desc = ep_choose(cdev->gadget,
145 gser->hs.out, gser->fs.out);
146 }
147 gserial_connect(&gser->port, gser->port_num);
148 return 0;
149}
150
151static void gser_disable(struct usb_function *f)
152{
153 struct f_gser *gser = func_to_gser(f);
154 struct usb_composite_dev *cdev = f->config->cdev;
155
156 DBG(cdev, "generic ttyGS%d deactivated\n", gser->port_num);
157 gserial_disconnect(&gser->port);
158}
159
160/*-------------------------------------------------------------------------*/
161
162/* serial function driver setup/binding */
163
164static int __init
165gser_bind(struct usb_configuration *c, struct usb_function *f)
166{
167 struct usb_composite_dev *cdev = c->cdev;
168 struct f_gser *gser = func_to_gser(f);
169 int status;
170 struct usb_ep *ep;
171
172 /* allocate instance-specific interface IDs */
173 status = usb_interface_id(c, f);
174 if (status < 0)
175 goto fail;
176 gser->data_id = status;
177 gser_interface_desc.bInterfaceNumber = status;
178
179 status = -ENODEV;
180
181 /* allocate instance-specific endpoints */
182 ep = usb_ep_autoconfig(cdev->gadget, &gser_fs_in_desc);
183 if (!ep)
184 goto fail;
185 gser->port.in = ep;
186 ep->driver_data = cdev; /* claim */
187
188 ep = usb_ep_autoconfig(cdev->gadget, &gser_fs_out_desc);
189 if (!ep)
190 goto fail;
191 gser->port.out = ep;
192 ep->driver_data = cdev; /* claim */
193
194 /* copy descriptors, and track endpoint copies */
195 f->descriptors = usb_copy_descriptors(gser_fs_function);
196
197 gser->fs.in = usb_find_endpoint(gser_fs_function,
198 f->descriptors, &gser_fs_in_desc);
199 gser->fs.out = usb_find_endpoint(gser_fs_function,
200 f->descriptors, &gser_fs_out_desc);
201
202
203 /* support all relevant hardware speeds... we expect that when
204 * hardware is dual speed, all bulk-capable endpoints work at
205 * both speeds
206 */
207 if (gadget_is_dualspeed(c->cdev->gadget)) {
208 gser_hs_in_desc.bEndpointAddress =
209 gser_fs_in_desc.bEndpointAddress;
210 gser_hs_out_desc.bEndpointAddress =
211 gser_fs_out_desc.bEndpointAddress;
212
213 /* copy descriptors, and track endpoint copies */
214 f->hs_descriptors = usb_copy_descriptors(gser_hs_function);
215
216 gser->hs.in = usb_find_endpoint(gser_hs_function,
217 f->hs_descriptors, &gser_hs_in_desc);
218 gser->hs.out = usb_find_endpoint(gser_hs_function,
219 f->hs_descriptors, &gser_hs_out_desc);
220 }
221
222 DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n",
223 gser->port_num,
224 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
225 gser->port.in->name, gser->port.out->name);
226 return 0;
227
228fail:
229 /* we might as well release our claims on endpoints */
230 if (gser->port.out)
231 gser->port.out->driver_data = NULL;
232 if (gser->port.in)
233 gser->port.in->driver_data = NULL;
234
235 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
236
237 return status;
238}
239
240static void
241gser_unbind(struct usb_configuration *c, struct usb_function *f)
242{
243 if (gadget_is_dualspeed(c->cdev->gadget))
244 usb_free_descriptors(f->hs_descriptors);
245 usb_free_descriptors(f->descriptors);
246 kfree(func_to_gser(f));
247}
248
249/**
250 * gser_bind_config - add a generic serial function to a configuration
251 * @c: the configuration to support the serial instance
252 * @port_num: /dev/ttyGS* port this interface will use
253 * Context: single threaded during gadget setup
254 *
255 * Returns zero on success, else negative errno.
256 *
257 * Caller must have called @gserial_setup() with enough ports to
258 * handle all the ones it binds. Caller is also responsible
259 * for calling @gserial_cleanup() before module unload.
260 */
261int __init gser_bind_config(struct usb_configuration *c, u8 port_num)
262{
263 struct f_gser *gser;
264 int status;
265
266 /* REVISIT might want instance-specific strings to help
267 * distinguish instances ...
268 */
269
270 /* maybe allocate device-global string ID */
271 if (gser_string_defs[0].id == 0) {
272 status = usb_string_id(c->cdev);
273 if (status < 0)
274 return status;
275 gser_string_defs[0].id = status;
276 }
277
278 /* allocate and initialize one new instance */
279 gser = kzalloc(sizeof *gser, GFP_KERNEL);
280 if (!gser)
281 return -ENOMEM;
282
283 gser->port_num = port_num;
284
285 gser->port.func.name = "gser";
286 gser->port.func.strings = gser_strings;
287 gser->port.func.bind = gser_bind;
288 gser->port.func.unbind = gser_unbind;
289 gser->port.func.set_alt = gser_set_alt;
290 gser->port.func.disable = gser_disable;
291
292 status = usb_add_function(c, &gser->port.func);
293 if (status)
294 kfree(gser);
295 return status;
296}
diff --git a/drivers/usb/gadget/f_sourcesink.c b/drivers/usb/gadget/f_sourcesink.c
new file mode 100644
index 000000000000..f18c3a14d72a
--- /dev/null
+++ b/drivers/usb/gadget/f_sourcesink.c
@@ -0,0 +1,587 @@
1/*
2 * f_sourcesink.c - USB peripheral source/sink configuration driver
3 *
4 * Copyright (C) 2003-2008 David Brownell
5 * Copyright (C) 2008 by Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22/* #define VERBOSE_DEBUG */
23
24#include <linux/kernel.h>
25#include <linux/utsname.h>
26#include <linux/device.h>
27
28#include "g_zero.h"
29#include "gadget_chips.h"
30
31
32/*
33 * SOURCE/SINK FUNCTION ... a primary testing vehicle for USB peripheral
34 * controller drivers.
35 *
36 * This just sinks bulk packets OUT to the peripheral and sources them IN
37 * to the host, optionally with specific data patterns for integrity tests.
38 * As such it supports basic functionality and load tests.
39 *
40 * In terms of control messaging, this supports all the standard requests
41 * plus two that support control-OUT tests. If the optional "autoresume"
42 * mode is enabled, it provides good functional coverage for the "USBCV"
43 * test harness from USB-IF.
44 *
45 * Note that because this doesn't queue more than one request at a time,
46 * some other function must be used to test queueing logic. The network
47 * link (g_ether) is the best overall option for that, since its TX and RX
48 * queues are relatively independent, will receive a range of packet sizes,
49 * and can often be made to run out completely. Those issues are important
50 * when stress testing peripheral controller drivers.
51 *
52 *
53 * This is currently packaged as a configuration driver, which can't be
54 * combined with other functions to make composite devices. However, it
55 * can be combined with other independent configurations.
56 */
57struct f_sourcesink {
58 struct usb_function function;
59
60 struct usb_ep *in_ep;
61 struct usb_ep *out_ep;
62 struct timer_list resume;
63};
64
65static inline struct f_sourcesink *func_to_ss(struct usb_function *f)
66{
67 return container_of(f, struct f_sourcesink, function);
68}
69
70static unsigned autoresume;
71module_param(autoresume, uint, 0);
72MODULE_PARM_DESC(autoresume, "zero, or seconds before remote wakeup");
73
74static unsigned pattern;
75module_param(pattern, uint, 0);
76MODULE_PARM_DESC(pattern, "0 = all zeroes, 1 = mod63 ");
77
78/*-------------------------------------------------------------------------*/
79
80static struct usb_interface_descriptor source_sink_intf = {
81 .bLength = sizeof source_sink_intf,
82 .bDescriptorType = USB_DT_INTERFACE,
83
84 .bNumEndpoints = 2,
85 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
86 /* .iInterface = DYNAMIC */
87};
88
89/* full speed support: */
90
91static struct usb_endpoint_descriptor fs_source_desc = {
92 .bLength = USB_DT_ENDPOINT_SIZE,
93 .bDescriptorType = USB_DT_ENDPOINT,
94
95 .bEndpointAddress = USB_DIR_IN,
96 .bmAttributes = USB_ENDPOINT_XFER_BULK,
97};
98
99static struct usb_endpoint_descriptor fs_sink_desc = {
100 .bLength = USB_DT_ENDPOINT_SIZE,
101 .bDescriptorType = USB_DT_ENDPOINT,
102
103 .bEndpointAddress = USB_DIR_OUT,
104 .bmAttributes = USB_ENDPOINT_XFER_BULK,
105};
106
107static struct usb_descriptor_header *fs_source_sink_descs[] = {
108 (struct usb_descriptor_header *) &source_sink_intf,
109 (struct usb_descriptor_header *) &fs_sink_desc,
110 (struct usb_descriptor_header *) &fs_source_desc,
111 NULL,
112};
113
114/* high speed support: */
115
116static struct usb_endpoint_descriptor hs_source_desc = {
117 .bLength = USB_DT_ENDPOINT_SIZE,
118 .bDescriptorType = USB_DT_ENDPOINT,
119
120 .bmAttributes = USB_ENDPOINT_XFER_BULK,
121 .wMaxPacketSize = __constant_cpu_to_le16(512),
122};
123
124static struct usb_endpoint_descriptor hs_sink_desc = {
125 .bLength = USB_DT_ENDPOINT_SIZE,
126 .bDescriptorType = USB_DT_ENDPOINT,
127
128 .bmAttributes = USB_ENDPOINT_XFER_BULK,
129 .wMaxPacketSize = __constant_cpu_to_le16(512),
130};
131
132static struct usb_descriptor_header *hs_source_sink_descs[] = {
133 (struct usb_descriptor_header *) &source_sink_intf,
134 (struct usb_descriptor_header *) &hs_source_desc,
135 (struct usb_descriptor_header *) &hs_sink_desc,
136 NULL,
137};
138
139/* function-specific strings: */
140
141static struct usb_string strings_sourcesink[] = {
142 [0].s = "source and sink data",
143 { } /* end of list */
144};
145
146static struct usb_gadget_strings stringtab_sourcesink = {
147 .language = 0x0409, /* en-us */
148 .strings = strings_sourcesink,
149};
150
151static struct usb_gadget_strings *sourcesink_strings[] = {
152 &stringtab_sourcesink,
153 NULL,
154};
155
156/*-------------------------------------------------------------------------*/
157
158static void sourcesink_autoresume(unsigned long _c)
159{
160 struct usb_composite_dev *cdev = (void *)_c;
161 struct usb_gadget *g = cdev->gadget;
162
163 /* Normally the host would be woken up for something
164 * more significant than just a timer firing; likely
165 * because of some direct user request.
166 */
167 if (g->speed != USB_SPEED_UNKNOWN) {
168 int status = usb_gadget_wakeup(g);
169 DBG(cdev, "%s --> %d\n", __func__, status);
170 }
171}
172
173static int __init
174sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
175{
176 struct usb_composite_dev *cdev = c->cdev;
177 struct f_sourcesink *ss = func_to_ss(f);
178 int id;
179
180 /* allocate interface ID(s) */
181 id = usb_interface_id(c, f);
182 if (id < 0)
183 return id;
184 source_sink_intf.bInterfaceNumber = id;
185
186 /* allocate endpoints */
187 ss->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc);
188 if (!ss->in_ep) {
189autoconf_fail:
190 ERROR(cdev, "%s: can't autoconfigure on %s\n",
191 f->name, cdev->gadget->name);
192 return -ENODEV;
193 }
194 ss->in_ep->driver_data = cdev; /* claim */
195
196 ss->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc);
197 if (!ss->out_ep)
198 goto autoconf_fail;
199 ss->out_ep->driver_data = cdev; /* claim */
200
201 setup_timer(&ss->resume, sourcesink_autoresume,
202 (unsigned long) c->cdev);
203
204 /* support high speed hardware */
205 if (gadget_is_dualspeed(c->cdev->gadget)) {
206 hs_source_desc.bEndpointAddress =
207 fs_source_desc.bEndpointAddress;
208 hs_sink_desc.bEndpointAddress =
209 fs_sink_desc.bEndpointAddress;
210 f->hs_descriptors = hs_source_sink_descs;
211 }
212
213 DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n",
214 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
215 f->name, ss->in_ep->name, ss->out_ep->name);
216 return 0;
217}
218
219static void
220sourcesink_unbind(struct usb_configuration *c, struct usb_function *f)
221{
222 kfree(func_to_ss(f));
223}
224
225/* optionally require specific source/sink data patterns */
226static int check_read_data(struct f_sourcesink *ss, struct usb_request *req)
227{
228 unsigned i;
229 u8 *buf = req->buf;
230 struct usb_composite_dev *cdev = ss->function.config->cdev;
231
232 for (i = 0; i < req->actual; i++, buf++) {
233 switch (pattern) {
234
235 /* all-zeroes has no synchronization issues */
236 case 0:
237 if (*buf == 0)
238 continue;
239 break;
240
241 /* "mod63" stays in sync with short-terminated transfers,
242 * OR otherwise when host and gadget agree on how large
243 * each usb transfer request should be. Resync is done
244 * with set_interface or set_config. (We *WANT* it to
245 * get quickly out of sync if controllers or their drivers
246 * stutter for any reason, including buffer duplcation...)
247 */
248 case 1:
249 if (*buf == (u8)(i % 63))
250 continue;
251 break;
252 }
253 ERROR(cdev, "bad OUT byte, buf[%d] = %d\n", i, *buf);
254 usb_ep_set_halt(ss->out_ep);
255 return -EINVAL;
256 }
257 return 0;
258}
259
260static void reinit_write_data(struct usb_ep *ep, struct usb_request *req)
261{
262 unsigned i;
263 u8 *buf = req->buf;
264
265 switch (pattern) {
266 case 0:
267 memset(req->buf, 0, req->length);
268 break;
269 case 1:
270 for (i = 0; i < req->length; i++)
271 *buf++ = (u8) (i % 63);
272 break;
273 }
274}
275
276static void source_sink_complete(struct usb_ep *ep, struct usb_request *req)
277{
278 struct f_sourcesink *ss = ep->driver_data;
279 struct usb_composite_dev *cdev = ss->function.config->cdev;
280 int status = req->status;
281
282 switch (status) {
283
284 case 0: /* normal completion? */
285 if (ep == ss->out_ep) {
286 check_read_data(ss, req);
287 memset(req->buf, 0x55, req->length);
288 } else
289 reinit_write_data(ep, req);
290 break;
291
292 /* this endpoint is normally active while we're configured */
293 case -ECONNABORTED: /* hardware forced ep reset */
294 case -ECONNRESET: /* request dequeued */
295 case -ESHUTDOWN: /* disconnect from host */
296 VDBG(cdev, "%s gone (%d), %d/%d\n", ep->name, status,
297 req->actual, req->length);
298 if (ep == ss->out_ep)
299 check_read_data(ss, req);
300 free_ep_req(ep, req);
301 return;
302
303 case -EOVERFLOW: /* buffer overrun on read means that
304 * we didn't provide a big enough
305 * buffer.
306 */
307 default:
308#if 1
309 DBG(cdev, "%s complete --> %d, %d/%d\n", ep->name,
310 status, req->actual, req->length);
311#endif
312 case -EREMOTEIO: /* short read */
313 break;
314 }
315
316 status = usb_ep_queue(ep, req, GFP_ATOMIC);
317 if (status) {
318 ERROR(cdev, "kill %s: resubmit %d bytes --> %d\n",
319 ep->name, req->length, status);
320 usb_ep_set_halt(ep);
321 /* FIXME recover later ... somehow */
322 }
323}
324
325static int source_sink_start_ep(struct f_sourcesink *ss, bool is_in)
326{
327 struct usb_ep *ep;
328 struct usb_request *req;
329 int status;
330
331 ep = is_in ? ss->in_ep : ss->out_ep;
332 req = alloc_ep_req(ep);
333 if (!req)
334 return -ENOMEM;
335
336 req->complete = source_sink_complete;
337 if (is_in)
338 reinit_write_data(ep, req);
339 else
340 memset(req->buf, 0x55, req->length);
341
342 status = usb_ep_queue(ep, req, GFP_ATOMIC);
343 if (status) {
344 struct usb_composite_dev *cdev;
345
346 cdev = ss->function.config->cdev;
347 ERROR(cdev, "start %s %s --> %d\n",
348 is_in ? "IN" : "OUT",
349 ep->name, status);
350 free_ep_req(ep, req);
351 }
352
353 return status;
354}
355
356static void disable_source_sink(struct f_sourcesink *ss)
357{
358 struct usb_composite_dev *cdev;
359
360 cdev = ss->function.config->cdev;
361 disable_endpoints(cdev, ss->in_ep, ss->out_ep);
362 del_timer(&ss->resume);
363 VDBG(cdev, "%s disabled\n", ss->function.name);
364}
365
366static int
367enable_source_sink(struct usb_composite_dev *cdev, struct f_sourcesink *ss)
368{
369 int result = 0;
370 const struct usb_endpoint_descriptor *src, *sink;
371 struct usb_ep *ep;
372
373 src = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc);
374 sink = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc);
375
376 /* one endpoint writes (sources) zeroes IN (to the host) */
377 ep = ss->in_ep;
378 result = usb_ep_enable(ep, src);
379 if (result < 0)
380 return result;
381 ep->driver_data = ss;
382
383 result = source_sink_start_ep(ss, true);
384 if (result < 0) {
385fail:
386 ep = ss->in_ep;
387 usb_ep_disable(ep);
388 ep->driver_data = NULL;
389 return result;
390 }
391
392 /* one endpoint reads (sinks) anything OUT (from the host) */
393 ep = ss->out_ep;
394 result = usb_ep_enable(ep, sink);
395 if (result < 0)
396 goto fail;
397 ep->driver_data = ss;
398
399 result = source_sink_start_ep(ss, false);
400 if (result < 0) {
401 usb_ep_disable(ep);
402 ep->driver_data = NULL;
403 goto fail;
404 }
405
406 DBG(cdev, "%s enabled\n", ss->function.name);
407 return result;
408}
409
410static int sourcesink_set_alt(struct usb_function *f,
411 unsigned intf, unsigned alt)
412{
413 struct f_sourcesink *ss = func_to_ss(f);
414 struct usb_composite_dev *cdev = f->config->cdev;
415
416 /* we know alt is zero */
417 if (ss->in_ep->driver_data)
418 disable_source_sink(ss);
419 return enable_source_sink(cdev, ss);
420}
421
422static void sourcesink_disable(struct usb_function *f)
423{
424 struct f_sourcesink *ss = func_to_ss(f);
425
426 disable_source_sink(ss);
427}
428
429static void sourcesink_suspend(struct usb_function *f)
430{
431 struct f_sourcesink *ss = func_to_ss(f);
432 struct usb_composite_dev *cdev = f->config->cdev;
433
434 if (cdev->gadget->speed == USB_SPEED_UNKNOWN)
435 return;
436
437 if (autoresume) {
438 mod_timer(&ss->resume, jiffies + (HZ * autoresume));
439 DBG(cdev, "suspend, wakeup in %d seconds\n", autoresume);
440 } else
441 DBG(cdev, "%s\n", __func__);
442}
443
444static void sourcesink_resume(struct usb_function *f)
445{
446 struct f_sourcesink *ss = func_to_ss(f);
447 struct usb_composite_dev *cdev = f->config->cdev;
448
449 DBG(cdev, "%s\n", __func__);
450 del_timer(&ss->resume);
451}
452
453/*-------------------------------------------------------------------------*/
454
455static int __init sourcesink_bind_config(struct usb_configuration *c)
456{
457 struct f_sourcesink *ss;
458 int status;
459
460 ss = kzalloc(sizeof *ss, GFP_KERNEL);
461 if (!ss)
462 return -ENOMEM;
463
464 ss->function.name = "source/sink";
465 ss->function.descriptors = fs_source_sink_descs;
466 ss->function.bind = sourcesink_bind;
467 ss->function.unbind = sourcesink_unbind;
468 ss->function.set_alt = sourcesink_set_alt;
469 ss->function.disable = sourcesink_disable;
470 ss->function.suspend = sourcesink_suspend;
471 ss->function.resume = sourcesink_resume;
472
473 status = usb_add_function(c, &ss->function);
474 if (status)
475 kfree(ss);
476 return status;
477}
478
479static int sourcesink_setup(struct usb_configuration *c,
480 const struct usb_ctrlrequest *ctrl)
481{
482 struct usb_request *req = c->cdev->req;
483 int value = -EOPNOTSUPP;
484 u16 w_index = le16_to_cpu(ctrl->wIndex);
485 u16 w_value = le16_to_cpu(ctrl->wValue);
486 u16 w_length = le16_to_cpu(ctrl->wLength);
487
488 /* composite driver infrastructure handles everything except
489 * the two control test requests.
490 */
491 switch (ctrl->bRequest) {
492
493 /*
494 * These are the same vendor-specific requests supported by
495 * Intel's USB 2.0 compliance test devices. We exceed that
496 * device spec by allowing multiple-packet requests.
497 *
498 * NOTE: the Control-OUT data stays in req->buf ... better
499 * would be copying it into a scratch buffer, so that other
500 * requests may safely intervene.
501 */
502 case 0x5b: /* control WRITE test -- fill the buffer */
503 if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR))
504 goto unknown;
505 if (w_value || w_index)
506 break;
507 /* just read that many bytes into the buffer */
508 if (w_length > req->length)
509 break;
510 value = w_length;
511 break;
512 case 0x5c: /* control READ test -- return the buffer */
513 if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR))
514 goto unknown;
515 if (w_value || w_index)
516 break;
517 /* expect those bytes are still in the buffer; send back */
518 if (w_length > req->length)
519 break;
520 value = w_length;
521 break;
522
523 default:
524unknown:
525 VDBG(c->cdev,
526 "unknown control req%02x.%02x v%04x i%04x l%d\n",
527 ctrl->bRequestType, ctrl->bRequest,
528 w_value, w_index, w_length);
529 }
530
531 /* respond with data transfer or status phase? */
532 if (value >= 0) {
533 VDBG(c->cdev, "source/sink req%02x.%02x v%04x i%04x l%d\n",
534 ctrl->bRequestType, ctrl->bRequest,
535 w_value, w_index, w_length);
536 req->zero = 0;
537 req->length = value;
538 value = usb_ep_queue(c->cdev->gadget->ep0, req, GFP_ATOMIC);
539 if (value < 0)
540 ERROR(c->cdev, "source/sinkc response, err %d\n",
541 value);
542 }
543
544 /* device either stalls (value < 0) or reports success */
545 return value;
546}
547
548static struct usb_configuration sourcesink_driver = {
549 .label = "source/sink",
550 .strings = sourcesink_strings,
551 .bind = sourcesink_bind_config,
552 .setup = sourcesink_setup,
553 .bConfigurationValue = 3,
554 .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
555 .bMaxPower = 1, /* 2 mA, minimal */
556 /* .iConfiguration = DYNAMIC */
557};
558
559/**
560 * sourcesink_add - add a source/sink testing configuration to a device
561 * @cdev: the device to support the configuration
562 */
563int __init sourcesink_add(struct usb_composite_dev *cdev)
564{
565 int id;
566
567 /* allocate string ID(s) */
568 id = usb_string_id(cdev);
569 if (id < 0)
570 return id;
571 strings_sourcesink[0].id = id;
572
573 source_sink_intf.iInterface = id;
574 sourcesink_driver.iConfiguration = id;
575
576 /* support autoresume for remote wakeup testing */
577 if (autoresume)
578 sourcesink_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
579
580 /* support OTG systems */
581 if (gadget_is_otg(cdev->gadget)) {
582 sourcesink_driver.descriptors = otg_desc;
583 sourcesink_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
584 }
585
586 return usb_add_config(cdev, &sourcesink_driver);
587}
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c
new file mode 100644
index 000000000000..afeab9a0523f
--- /dev/null
+++ b/drivers/usb/gadget/f_subset.c
@@ -0,0 +1,423 @@
1/*
2 * f_subset.c -- "CDC Subset" Ethernet link function driver
3 *
4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2008 Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22#include <linux/kernel.h>
23#include <linux/device.h>
24#include <linux/etherdevice.h>
25
26#include "u_ether.h"
27
28
29/*
30 * This function packages a simple "CDC Subset" Ethernet port with no real
31 * control mechanisms; just raw data transfer over two bulk endpoints.
32 * The data transfer model is exactly that of CDC Ethernet, which is
33 * why we call it the "CDC Subset".
34 *
35 * Because it's not standardized, this has some interoperability issues.
36 * They mostly relate to driver binding, since the data transfer model is
37 * so simple (CDC Ethernet). The original versions of this protocol used
38 * specific product/vendor IDs: byteswapped IDs for Digital Equipment's
39 * SA-1100 "Itsy" board, which could run Linux 2.4 kernels and supported
40 * daughtercards with USB peripheral connectors. (It was used more often
41 * with other boards, using the Itsy identifiers.) Linux hosts recognized
42 * this with CONFIG_USB_ARMLINUX; these devices have only one configuration
43 * and one interface.
44 *
45 * At some point, MCCI defined a (nonconformant) CDC MDLM variant called
46 * "SAFE", which happens to have a mode which is identical to the "CDC
47 * Subset" in terms of data transfer and lack of control model. This was
48 * adopted by later Sharp Zaurus models, and by some other software which
49 * Linux hosts recognize with CONFIG_USB_NET_ZAURUS.
50 *
51 * Because Microsoft's RNDIS drivers are far from robust, we added a few
52 * descriptors to the CDC Subset code, making this code look like a SAFE
53 * implementation. This lets you use MCCI's host side MS-Windows drivers
54 * if you get fed up with RNDIS. It also makes it easier for composite
55 * drivers to work, since they can use class based binding instead of
56 * caring about specific product and vendor IDs.
57 */
58
59struct geth_descs {
60 struct usb_endpoint_descriptor *in;
61 struct usb_endpoint_descriptor *out;
62};
63
64struct f_gether {
65 struct gether port;
66
67 char ethaddr[14];
68
69 struct usb_descriptor_header **fs_function;
70 struct geth_descs fs;
71 struct usb_descriptor_header **hs_function;
72 struct geth_descs hs;
73};
74
75static inline struct f_gether *func_to_geth(struct usb_function *f)
76{
77 return container_of(f, struct f_gether, port.func);
78}
79
80/*-------------------------------------------------------------------------*/
81
82/*
83 * "Simple" CDC-subset option is a simple vendor-neutral model that most
84 * full speed controllers can handle: one interface, two bulk endpoints.
85 * To assist host side drivers, we fancy it up a bit, and add descriptors so
86 * some host side drivers will understand it as a "SAFE" variant.
87 *
88 * "SAFE" loosely follows CDC WMC MDLM, violating the spec in various ways.
89 * Data endpoints live in the control interface, there's no data interface.
90 * And it's not used to talk to a cell phone radio.
91 */
92
93/* interface descriptor: */
94
95static struct usb_interface_descriptor subset_data_intf __initdata = {
96 .bLength = sizeof subset_data_intf,
97 .bDescriptorType = USB_DT_INTERFACE,
98
99 /* .bInterfaceNumber = DYNAMIC */
100 .bAlternateSetting = 0,
101 .bNumEndpoints = 2,
102 .bInterfaceClass = USB_CLASS_COMM,
103 .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM,
104 .bInterfaceProtocol = 0,
105 /* .iInterface = DYNAMIC */
106};
107
108static struct usb_cdc_header_desc header_desc __initdata = {
109 .bLength = sizeof header_desc,
110 .bDescriptorType = USB_DT_CS_INTERFACE,
111 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
112
113 .bcdCDC = __constant_cpu_to_le16(0x0110),
114};
115
116static struct usb_cdc_mdlm_desc mdlm_desc __initdata = {
117 .bLength = sizeof mdlm_desc,
118 .bDescriptorType = USB_DT_CS_INTERFACE,
119 .bDescriptorSubType = USB_CDC_MDLM_TYPE,
120
121 .bcdVersion = __constant_cpu_to_le16(0x0100),
122 .bGUID = {
123 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6,
124 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f,
125 },
126};
127
128/* since "usb_cdc_mdlm_detail_desc" is a variable length structure, we
129 * can't really use its struct. All we do here is say that we're using
130 * the submode of "SAFE" which directly matches the CDC Subset.
131 */
132static u8 mdlm_detail_desc[] __initdata = {
133 6,
134 USB_DT_CS_INTERFACE,
135 USB_CDC_MDLM_DETAIL_TYPE,
136
137 0, /* "SAFE" */
138 0, /* network control capabilities (none) */
139 0, /* network data capabilities ("raw" encapsulation) */
140};
141
142static struct usb_cdc_ether_desc ether_desc __initdata = {
143 .bLength = sizeof ether_desc,
144 .bDescriptorType = USB_DT_CS_INTERFACE,
145 .bDescriptorSubType = USB_CDC_ETHERNET_TYPE,
146
147 /* this descriptor actually adds value, surprise! */
148 /* .iMACAddress = DYNAMIC */
149 .bmEthernetStatistics = __constant_cpu_to_le32(0), /* no statistics */
150 .wMaxSegmentSize = __constant_cpu_to_le16(ETH_FRAME_LEN),
151 .wNumberMCFilters = __constant_cpu_to_le16(0),
152 .bNumberPowerFilters = 0,
153};
154
155/* full speed support: */
156
157static struct usb_endpoint_descriptor fs_in_desc __initdata = {
158 .bLength = USB_DT_ENDPOINT_SIZE,
159 .bDescriptorType = USB_DT_ENDPOINT,
160
161 .bEndpointAddress = USB_DIR_IN,
162 .bmAttributes = USB_ENDPOINT_XFER_BULK,
163};
164
165static struct usb_endpoint_descriptor fs_out_desc __initdata = {
166 .bLength = USB_DT_ENDPOINT_SIZE,
167 .bDescriptorType = USB_DT_ENDPOINT,
168
169 .bEndpointAddress = USB_DIR_OUT,
170 .bmAttributes = USB_ENDPOINT_XFER_BULK,
171};
172
173static struct usb_descriptor_header *fs_eth_function[] __initdata = {
174 (struct usb_descriptor_header *) &subset_data_intf,
175 (struct usb_descriptor_header *) &header_desc,
176 (struct usb_descriptor_header *) &mdlm_desc,
177 (struct usb_descriptor_header *) &mdlm_detail_desc,
178 (struct usb_descriptor_header *) &ether_desc,
179 (struct usb_descriptor_header *) &fs_in_desc,
180 (struct usb_descriptor_header *) &fs_out_desc,
181 NULL,
182};
183
184/* high speed support: */
185
186static struct usb_endpoint_descriptor hs_in_desc __initdata = {
187 .bLength = USB_DT_ENDPOINT_SIZE,
188 .bDescriptorType = USB_DT_ENDPOINT,
189
190 .bmAttributes = USB_ENDPOINT_XFER_BULK,
191 .wMaxPacketSize = __constant_cpu_to_le16(512),
192};
193
194static struct usb_endpoint_descriptor hs_out_desc __initdata = {
195 .bLength = USB_DT_ENDPOINT_SIZE,
196 .bDescriptorType = USB_DT_ENDPOINT,
197
198 .bmAttributes = USB_ENDPOINT_XFER_BULK,
199 .wMaxPacketSize = __constant_cpu_to_le16(512),
200};
201
202static struct usb_descriptor_header *hs_eth_function[] __initdata = {
203 (struct usb_descriptor_header *) &subset_data_intf,
204 (struct usb_descriptor_header *) &header_desc,
205 (struct usb_descriptor_header *) &mdlm_desc,
206 (struct usb_descriptor_header *) &mdlm_detail_desc,
207 (struct usb_descriptor_header *) &ether_desc,
208 (struct usb_descriptor_header *) &hs_in_desc,
209 (struct usb_descriptor_header *) &hs_out_desc,
210 NULL,
211};
212
213/* string descriptors: */
214
215static struct usb_string geth_string_defs[] = {
216 [0].s = "CDC Ethernet Subset/SAFE",
217 [1].s = NULL /* DYNAMIC */,
218 { } /* end of list */
219};
220
221static struct usb_gadget_strings geth_string_table = {
222 .language = 0x0409, /* en-us */
223 .strings = geth_string_defs,
224};
225
226static struct usb_gadget_strings *geth_strings[] = {
227 &geth_string_table,
228 NULL,
229};
230
231/*-------------------------------------------------------------------------*/
232
233static int geth_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
234{
235 struct f_gether *geth = func_to_geth(f);
236 struct usb_composite_dev *cdev = f->config->cdev;
237 struct net_device *net;
238
239 /* we know alt == 0, so this is an activation or a reset */
240
241 if (geth->port.in_ep->driver_data) {
242 DBG(cdev, "reset cdc subset\n");
243 gether_disconnect(&geth->port);
244 }
245
246 DBG(cdev, "init + activate cdc subset\n");
247 geth->port.in = ep_choose(cdev->gadget,
248 geth->hs.in, geth->fs.in);
249 geth->port.out = ep_choose(cdev->gadget,
250 geth->hs.out, geth->fs.out);
251
252 net = gether_connect(&geth->port);
253 return IS_ERR(net) ? PTR_ERR(net) : 0;
254}
255
256static void geth_disable(struct usb_function *f)
257{
258 struct f_gether *geth = func_to_geth(f);
259 struct usb_composite_dev *cdev = f->config->cdev;
260
261 DBG(cdev, "net deactivated\n");
262 gether_disconnect(&geth->port);
263}
264
265/*-------------------------------------------------------------------------*/
266
267/* serial function driver setup/binding */
268
269static int __init
270geth_bind(struct usb_configuration *c, struct usb_function *f)
271{
272 struct usb_composite_dev *cdev = c->cdev;
273 struct f_gether *geth = func_to_geth(f);
274 int status;
275 struct usb_ep *ep;
276
277 /* allocate instance-specific interface IDs */
278 status = usb_interface_id(c, f);
279 if (status < 0)
280 goto fail;
281 subset_data_intf.bInterfaceNumber = status;
282
283 status = -ENODEV;
284
285 /* allocate instance-specific endpoints */
286 ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
287 if (!ep)
288 goto fail;
289 geth->port.in_ep = ep;
290 ep->driver_data = cdev; /* claim */
291
292 ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
293 if (!ep)
294 goto fail;
295 geth->port.out_ep = ep;
296 ep->driver_data = cdev; /* claim */
297
298 /* copy descriptors, and track endpoint copies */
299 f->descriptors = usb_copy_descriptors(fs_eth_function);
300
301 geth->fs.in = usb_find_endpoint(fs_eth_function,
302 f->descriptors, &fs_in_desc);
303 geth->fs.out = usb_find_endpoint(fs_eth_function,
304 f->descriptors, &fs_out_desc);
305
306
307 /* support all relevant hardware speeds... we expect that when
308 * hardware is dual speed, all bulk-capable endpoints work at
309 * both speeds
310 */
311 if (gadget_is_dualspeed(c->cdev->gadget)) {
312 hs_in_desc.bEndpointAddress =
313 fs_in_desc.bEndpointAddress;
314 hs_out_desc.bEndpointAddress =
315 fs_out_desc.bEndpointAddress;
316
317 /* copy descriptors, and track endpoint copies */
318 f->hs_descriptors = usb_copy_descriptors(hs_eth_function);
319
320 geth->hs.in = usb_find_endpoint(hs_eth_function,
321 f->hs_descriptors, &hs_in_desc);
322 geth->hs.out = usb_find_endpoint(hs_eth_function,
323 f->hs_descriptors, &hs_out_desc);
324 }
325
326 /* NOTE: all that is done without knowing or caring about
327 * the network link ... which is unavailable to this code
328 * until we're activated via set_alt().
329 */
330
331 DBG(cdev, "CDC Subset: %s speed IN/%s OUT/%s\n",
332 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
333 geth->port.in_ep->name, geth->port.out_ep->name);
334 return 0;
335
336fail:
337 /* we might as well release our claims on endpoints */
338 if (geth->port.out)
339 geth->port.out_ep->driver_data = NULL;
340 if (geth->port.in)
341 geth->port.in_ep->driver_data = NULL;
342
343 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
344
345 return status;
346}
347
348static void
349geth_unbind(struct usb_configuration *c, struct usb_function *f)
350{
351 if (gadget_is_dualspeed(c->cdev->gadget))
352 usb_free_descriptors(f->hs_descriptors);
353 usb_free_descriptors(f->descriptors);
354 geth_string_defs[1].s = NULL;
355 kfree(func_to_geth(f));
356}
357
358/**
359 * geth_bind_config - add CDC Subset network link to a configuration
360 * @c: the configuration to support the network link
361 * @ethaddr: a buffer in which the ethernet address of the host side
362 * side of the link was recorded
363 * Context: single threaded during gadget setup
364 *
365 * Returns zero on success, else negative errno.
366 *
367 * Caller must have called @gether_setup(). Caller is also responsible
368 * for calling @gether_cleanup() before module unload.
369 */
370int __init geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
371{
372 struct f_gether *geth;
373 int status;
374
375 if (!ethaddr)
376 return -EINVAL;
377
378 /* maybe allocate device-global string IDs */
379 if (geth_string_defs[0].id == 0) {
380
381 /* interface label */
382 status = usb_string_id(c->cdev);
383 if (status < 0)
384 return status;
385 geth_string_defs[0].id = status;
386 subset_data_intf.iInterface = status;
387
388 /* MAC address */
389 status = usb_string_id(c->cdev);
390 if (status < 0)
391 return status;
392 geth_string_defs[1].id = status;
393 ether_desc.iMACAddress = status;
394 }
395
396 /* allocate and initialize one new instance */
397 geth = kzalloc(sizeof *geth, GFP_KERNEL);
398 if (!geth)
399 return -ENOMEM;
400
401 /* export host's Ethernet address in CDC format */
402 snprintf(geth->ethaddr, sizeof geth->ethaddr,
403 "%02X%02X%02X%02X%02X%02X",
404 ethaddr[0], ethaddr[1], ethaddr[2],
405 ethaddr[3], ethaddr[4], ethaddr[5]);
406 geth_string_defs[1].s = geth->ethaddr;
407
408 geth->port.cdc_filter = DEFAULT_FILTER;
409
410 geth->port.func.name = "cdc_subset";
411 geth->port.func.strings = geth_strings;
412 geth->port.func.bind = geth_bind;
413 geth->port.func.unbind = geth_unbind;
414 geth->port.func.set_alt = geth_set_alt;
415 geth->port.func.disable = geth_disable;
416
417 status = usb_add_function(c, &geth->port.func);
418 if (status) {
419 geth_string_defs[1].s = NULL;
420 kfree(geth);
421 }
422 return status;
423}
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index 47bb9f09a1aa..15c24edbb61a 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -3867,8 +3867,8 @@ static int __init fsg_bind(struct usb_gadget *gadget)
3867 curlun->dev.parent = &gadget->dev; 3867 curlun->dev.parent = &gadget->dev;
3868 curlun->dev.driver = &fsg_driver.driver; 3868 curlun->dev.driver = &fsg_driver.driver;
3869 dev_set_drvdata(&curlun->dev, fsg); 3869 dev_set_drvdata(&curlun->dev, fsg);
3870 snprintf(curlun->dev.bus_id, BUS_ID_SIZE, 3870 dev_set_name(&curlun->dev,"%s-lun%d",
3871 "%s-lun%d", gadget->dev.bus_id, i); 3871 dev_name(&gadget->dev), i);
3872 3872
3873 if ((rc = device_register(&curlun->dev)) != 0) { 3873 if ((rc = device_register(&curlun->dev)) != 0) {
3874 INFO(fsg, "failed to register LUN%d: %d\n", i, rc); 3874 INFO(fsg, "failed to register LUN%d: %d\n", i, rc);
diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c
index 18687543d7fa..1695382f30fe 100644
--- a/drivers/usb/gadget/fsl_usb2_udc.c
+++ b/drivers/usb/gadget/fsl_usb2_udc.c
@@ -2331,7 +2331,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2331 udc_controller->gadget.name = driver_name; 2331 udc_controller->gadget.name = driver_name;
2332 2332
2333 /* Setup gadget.dev and register with kernel */ 2333 /* Setup gadget.dev and register with kernel */
2334 strcpy(udc_controller->gadget.dev.bus_id, "gadget"); 2334 dev_set_name(&udc_controller->gadget.dev, "gadget");
2335 udc_controller->gadget.dev.release = fsl_udc_release; 2335 udc_controller->gadget.dev.release = fsl_udc_release;
2336 udc_controller->gadget.dev.parent = &pdev->dev; 2336 udc_controller->gadget.dev.parent = &pdev->dev;
2337 ret = device_register(&udc_controller->gadget.dev); 2337 ret = device_register(&udc_controller->gadget.dev);
diff --git a/drivers/usb/gadget/g_zero.h b/drivers/usb/gadget/g_zero.h
new file mode 100644
index 000000000000..dd2f16ad5a88
--- /dev/null
+++ b/drivers/usb/gadget/g_zero.h
@@ -0,0 +1,25 @@
1/*
2 * This header declares the utility functions used by "Gadget Zero", plus
3 * interfaces to its two single-configuration function drivers.
4 */
5
6#ifndef __G_ZERO_H
7#define __G_ZERO_H
8
9#include <linux/usb/composite.h>
10
11/* global state */
12extern unsigned buflen;
13extern const struct usb_descriptor_header *otg_desc[];
14
15/* common utilities */
16struct usb_request *alloc_ep_req(struct usb_ep *ep);
17void free_ep_req(struct usb_ep *ep, struct usb_request *req);
18void disable_endpoints(struct usb_composite_dev *cdev,
19 struct usb_ep *in, struct usb_ep *out);
20
21/* configuration-specific linkup */
22int sourcesink_add(struct usb_composite_dev *cdev);
23int loopback_add(struct usb_composite_dev *cdev);
24
25#endif /* __G_ZERO_H */
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h
index ca5149ea7312..5246e8fef2b2 100644
--- a/drivers/usb/gadget/gadget_chips.h
+++ b/drivers/usb/gadget/gadget_chips.h
@@ -214,3 +214,26 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget)
214 return 0x21; 214 return 0x21;
215 return -ENOENT; 215 return -ENOENT;
216} 216}
217
218
219/**
220 * gadget_supports_altsettings - return true if altsettings work
221 * @gadget: the gadget in question
222 */
223static inline bool gadget_supports_altsettings(struct usb_gadget *gadget)
224{
225 /* PXA 21x/25x/26x has no altsettings at all */
226 if (gadget_is_pxa(gadget))
227 return false;
228
229 /* PXA 27x and 3xx have *broken* altsetting support */
230 if (gadget_is_pxa27x(gadget))
231 return false;
232
233 /* SH3 hardware just doesn't do altsettings */
234 if (gadget_is_sh(gadget))
235 return false;
236
237 /* Everything else is *presumably* fine ... */
238 return true;
239}
diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c
index be6613afedbf..48f1c63b7013 100644
--- a/drivers/usb/gadget/goku_udc.c
+++ b/drivers/usb/gadget/goku_udc.c
@@ -1790,7 +1790,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1790 dev->gadget.ops = &goku_ops; 1790 dev->gadget.ops = &goku_ops;
1791 1791
1792 /* the "gadget" abstracts/virtualizes the controller */ 1792 /* the "gadget" abstracts/virtualizes the controller */
1793 strcpy(dev->gadget.dev.bus_id, "gadget"); 1793 dev_set_name(&dev->gadget.dev, "gadget");
1794 dev->gadget.dev.parent = &pdev->dev; 1794 dev->gadget.dev.parent = &pdev->dev;
1795 dev->gadget.dev.dma_mask = pdev->dev.dma_mask; 1795 dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
1796 dev->gadget.dev.release = gadget_release; 1796 dev->gadget.dev.release = gadget_release;
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
index f132a9219e11..04692d59fc1c 100644
--- a/drivers/usb/gadget/inode.c
+++ b/drivers/usb/gadget/inode.c
@@ -32,6 +32,7 @@
32#include <asm/uaccess.h> 32#include <asm/uaccess.h>
33#include <linux/slab.h> 33#include <linux/slab.h>
34#include <linux/poll.h> 34#include <linux/poll.h>
35#include <linux/smp_lock.h>
35 36
36#include <linux/device.h> 37#include <linux/device.h>
37#include <linux/moduleparam.h> 38#include <linux/moduleparam.h>
@@ -483,8 +484,7 @@ ep_release (struct inode *inode, struct file *fd)
483 return 0; 484 return 0;
484} 485}
485 486
486static int ep_ioctl (struct inode *inode, struct file *fd, 487static long ep_ioctl(struct file *fd, unsigned code, unsigned long value)
487 unsigned code, unsigned long value)
488{ 488{
489 struct ep_data *data = fd->private_data; 489 struct ep_data *data = fd->private_data;
490 int status; 490 int status;
@@ -740,7 +740,7 @@ static const struct file_operations ep_io_operations = {
740 740
741 .read = ep_read, 741 .read = ep_read,
742 .write = ep_write, 742 .write = ep_write,
743 .ioctl = ep_ioctl, 743 .unlocked_ioctl = ep_ioctl,
744 .release = ep_release, 744 .release = ep_release,
745 745
746 .aio_read = ep_aio_read, 746 .aio_read = ep_aio_read,
@@ -1294,15 +1294,18 @@ out:
1294 return mask; 1294 return mask;
1295} 1295}
1296 1296
1297static int dev_ioctl (struct inode *inode, struct file *fd, 1297static long dev_ioctl (struct file *fd, unsigned code, unsigned long value)
1298 unsigned code, unsigned long value)
1299{ 1298{
1300 struct dev_data *dev = fd->private_data; 1299 struct dev_data *dev = fd->private_data;
1301 struct usb_gadget *gadget = dev->gadget; 1300 struct usb_gadget *gadget = dev->gadget;
1301 long ret = -ENOTTY;
1302 1302
1303 if (gadget->ops->ioctl) 1303 if (gadget->ops->ioctl) {
1304 return gadget->ops->ioctl (gadget, code, value); 1304 lock_kernel();
1305 return -ENOTTY; 1305 ret = gadget->ops->ioctl (gadget, code, value);
1306 unlock_kernel();
1307 }
1308 return ret;
1306} 1309}
1307 1310
1308/* used after device configuration */ 1311/* used after device configuration */
@@ -1314,7 +1317,7 @@ static const struct file_operations ep0_io_operations = {
1314 .write = ep0_write, 1317 .write = ep0_write,
1315 .fasync = ep0_fasync, 1318 .fasync = ep0_fasync,
1316 .poll = ep0_poll, 1319 .poll = ep0_poll,
1317 .ioctl = dev_ioctl, 1320 .unlocked_ioctl = dev_ioctl,
1318 .release = dev_release, 1321 .release = dev_release,
1319}; 1322};
1320 1323
@@ -1964,7 +1967,7 @@ static const struct file_operations dev_init_operations = {
1964 .open = dev_open, 1967 .open = dev_open,
1965 .write = dev_config, 1968 .write = dev_config,
1966 .fasync = ep0_fasync, 1969 .fasync = ep0_fasync,
1967 .ioctl = dev_ioctl, 1970 .unlocked_ioctl = dev_ioctl,
1968 .release = dev_release, 1971 .release = dev_release,
1969}; 1972};
1970 1973
diff --git a/drivers/usb/gadget/lh7a40x_udc.c b/drivers/usb/gadget/lh7a40x_udc.c
index 825abd2621b3..c6e7df04c69a 100644
--- a/drivers/usb/gadget/lh7a40x_udc.c
+++ b/drivers/usb/gadget/lh7a40x_udc.c
@@ -1970,7 +1970,7 @@ static const struct usb_gadget_ops lh7a40x_udc_ops = {
1970 1970
1971static void nop_release(struct device *dev) 1971static void nop_release(struct device *dev)
1972{ 1972{
1973 DEBUG("%s %s\n", __func__, dev->bus_id); 1973 DEBUG("%s %s\n", __func__, dev_name(dev));
1974} 1974}
1975 1975
1976static struct lh7a40x_udc memory = { 1976static struct lh7a40x_udc memory = {
diff --git a/drivers/usb/gadget/m66592-udc.c b/drivers/usb/gadget/m66592-udc.c
index ee6b35fa870f..8da7535c0c70 100644
--- a/drivers/usb/gadget/m66592-udc.c
+++ b/drivers/usb/gadget/m66592-udc.c
@@ -1593,7 +1593,7 @@ static int __init m66592_probe(struct platform_device *pdev)
1593 1593
1594 m66592->gadget.ops = &m66592_gadget_ops; 1594 m66592->gadget.ops = &m66592_gadget_ops;
1595 device_initialize(&m66592->gadget.dev); 1595 device_initialize(&m66592->gadget.dev);
1596 strcpy(m66592->gadget.dev.bus_id, "gadget"); 1596 dev_set_name(&m66592->gadget, "gadget");
1597 m66592->gadget.is_dualspeed = 1; 1597 m66592->gadget.is_dualspeed = 1;
1598 m66592->gadget.dev.parent = &pdev->dev; 1598 m66592->gadget.dev.parent = &pdev->dev;
1599 m66592->gadget.dev.dma_mask = pdev->dev.dma_mask; 1599 m66592->gadget.dev.dma_mask = pdev->dev.dma_mask;
diff --git a/drivers/usb/gadget/ndis.h b/drivers/usb/gadget/ndis.h
index 09e3ee4eeae1..df886cec5ef4 100644
--- a/drivers/usb/gadget/ndis.h
+++ b/drivers/usb/gadget/ndis.h
@@ -1,11 +1,11 @@
1/* 1/*
2 * ndis.h 2 * ndis.h
3 * 3 *
4 * ntddndis.h modified by Benedikt Spranger <b.spranger@pengutronix.de> 4 * ntddndis.h modified by Benedikt Spranger <b.spranger@pengutronix.de>
5 * 5 *
6 * Thanks to the cygwin development team, 6 * Thanks to the cygwin development team,
7 * espacially to Casper S. Hornstrup <chorns@users.sourceforge.net> 7 * espacially to Casper S. Hornstrup <chorns@users.sourceforge.net>
8 * 8 *
9 * THIS SOFTWARE IS NOT COPYRIGHTED 9 * THIS SOFTWARE IS NOT COPYRIGHTED
10 * 10 *
11 * This source code is offered for use in the public domain. You may 11 * This source code is offered for use in the public domain. You may
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c
index e01862300169..b67ab677af72 100644
--- a/drivers/usb/gadget/net2280.c
+++ b/drivers/usb/gadget/net2280.c
@@ -2768,7 +2768,7 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
2768 dev->gadget.is_dualspeed = 1; 2768 dev->gadget.is_dualspeed = 1;
2769 2769
2770 /* the "gadget" abstracts/virtualizes the controller */ 2770 /* the "gadget" abstracts/virtualizes the controller */
2771 strcpy (dev->gadget.dev.bus_id, "gadget"); 2771 dev_set_name(&dev->gadget.dev, "gadget");
2772 dev->gadget.dev.parent = &pdev->dev; 2772 dev->gadget.dev.parent = &pdev->dev;
2773 dev->gadget.dev.dma_mask = pdev->dev.dma_mask; 2773 dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
2774 dev->gadget.dev.release = gadget_release; 2774 dev->gadget.dev.release = gadget_release;
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c
index 03a7f49d207d..4b79a8509e84 100644
--- a/drivers/usb/gadget/omap_udc.c
+++ b/drivers/usb/gadget/omap_udc.c
@@ -2686,7 +2686,7 @@ omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv)
2686 udc->gadget.name = driver_name; 2686 udc->gadget.name = driver_name;
2687 2687
2688 device_initialize(&udc->gadget.dev); 2688 device_initialize(&udc->gadget.dev);
2689 strcpy (udc->gadget.dev.bus_id, "gadget"); 2689 dev_set_name(&udc->gadget.dev, "gadget");
2690 udc->gadget.dev.release = omap_udc_release; 2690 udc->gadget.dev.release = omap_udc_release;
2691 udc->gadget.dev.parent = &odev->dev; 2691 udc->gadget.dev.parent = &odev->dev;
2692 if (use_dma) 2692 if (use_dma)
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c
index ec8f2eb041ca..49cd9e145a9b 100644
--- a/drivers/usb/gadget/printer.c
+++ b/drivers/usb/gadget/printer.c
@@ -828,9 +828,8 @@ printer_poll(struct file *fd, poll_table *wait)
828 return status; 828 return status;
829} 829}
830 830
831static int 831static long
832printer_ioctl(struct inode *inode, struct file *fd, unsigned int code, 832printer_ioctl(struct file *fd, unsigned int code, unsigned long arg)
833 unsigned long arg)
834{ 833{
835 struct printer_dev *dev = fd->private_data; 834 struct printer_dev *dev = fd->private_data;
836 unsigned long flags; 835 unsigned long flags;
@@ -869,7 +868,7 @@ static struct file_operations printer_io_operations = {
869 .write = printer_write, 868 .write = printer_write,
870 .fsync = printer_fsync, 869 .fsync = printer_fsync,
871 .poll = printer_poll, 870 .poll = printer_poll,
872 .ioctl = printer_ioctl, 871 .unlocked_ioctl = printer_ioctl,
873 .release = printer_close 872 .release = printer_close
874}; 873};
875 874
@@ -1361,8 +1360,8 @@ printer_bind(struct usb_gadget *gadget)
1361 1360
1362 1361
1363 /* Setup the sysfs files for the printer gadget. */ 1362 /* Setup the sysfs files for the printer gadget. */
1364 dev->pdev = device_create(usb_gadget_class, NULL, g_printer_devno, 1363 dev->pdev = device_create_drvdata(usb_gadget_class, NULL,
1365 "g_printer"); 1364 g_printer_devno, NULL, "g_printer");
1366 if (IS_ERR(dev->pdev)) { 1365 if (IS_ERR(dev->pdev)) {
1367 ERROR(dev, "Failed to create device: g_printer\n"); 1366 ERROR(dev, "Failed to create device: g_printer\n");
1368 goto fail; 1367 goto fail;
diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c
index 031dceb93023..8fb0066609bb 100644
--- a/drivers/usb/gadget/pxa25x_udc.c
+++ b/drivers/usb/gadget/pxa25x_udc.c
@@ -152,9 +152,10 @@ static int is_vbus_present(void)
152static void pullup_off(void) 152static void pullup_off(void)
153{ 153{
154 struct pxa2xx_udc_mach_info *mach = the_controller->mach; 154 struct pxa2xx_udc_mach_info *mach = the_controller->mach;
155 int off_level = mach->gpio_pullup_inverted;
155 156
156 if (mach->gpio_pullup) 157 if (mach->gpio_pullup)
157 gpio_set_value(mach->gpio_pullup, 0); 158 gpio_set_value(mach->gpio_pullup, off_level);
158 else if (mach->udc_command) 159 else if (mach->udc_command)
159 mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); 160 mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
160} 161}
@@ -162,9 +163,10 @@ static void pullup_off(void)
162static void pullup_on(void) 163static void pullup_on(void)
163{ 164{
164 struct pxa2xx_udc_mach_info *mach = the_controller->mach; 165 struct pxa2xx_udc_mach_info *mach = the_controller->mach;
166 int on_level = !mach->gpio_pullup_inverted;
165 167
166 if (mach->gpio_pullup) 168 if (mach->gpio_pullup)
167 gpio_set_value(mach->gpio_pullup, 1); 169 gpio_set_value(mach->gpio_pullup, on_level);
168 else if (mach->udc_command) 170 else if (mach->udc_command)
169 mach->udc_command(PXA2XX_UDC_CMD_CONNECT); 171 mach->udc_command(PXA2XX_UDC_CMD_CONNECT);
170} 172}
@@ -1818,7 +1820,7 @@ pxa25x_udc_irq(int irq, void *_dev)
1818 1820
1819static void nop_release (struct device *dev) 1821static void nop_release (struct device *dev)
1820{ 1822{
1821 DMSG("%s %s\n", __func__, dev->bus_id); 1823 DMSG("%s %s\n", __func__, dev_name(dev));
1822} 1824}
1823 1825
1824/* this uses load-time allocation and initialization (instead of 1826/* this uses load-time allocation and initialization (instead of
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c
index 9c0e82ec5c43..9d447d8cfc0c 100644
--- a/drivers/usb/gadget/pxa27x_udc.c
+++ b/drivers/usb/gadget/pxa27x_udc.c
@@ -1575,7 +1575,6 @@ static void udc_enable(struct pxa_udc *udc)
1575{ 1575{
1576 udc_writel(udc, UDCICR0, 0); 1576 udc_writel(udc, UDCICR0, 0);
1577 udc_writel(udc, UDCICR1, 0); 1577 udc_writel(udc, UDCICR1, 0);
1578 udc_writel(udc, UP2OCR, UP2OCR_HXOE);
1579 udc_clear_mask_UDCCR(udc, UDCCR_UDE); 1578 udc_clear_mask_UDCCR(udc, UDCCR_UDE);
1580 1579
1581 clk_enable(udc->clk); 1580 clk_enable(udc->clk);
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
index d0677f5d3cd5..7228e8562236 100644
--- a/drivers/usb/gadget/rndis.c
+++ b/drivers/usb/gadget/rndis.c
@@ -1,8 +1,6 @@
1/* 1/*
2 * RNDIS MSG parser 2 * RNDIS MSG parser
3 * 3 *
4 * Version: $Id: rndis.c,v 1.19 2004/03/25 21:33:46 robert Exp $
5 *
6 * Authors: Benedikt Spranger, Pengutronix 4 * Authors: Benedikt Spranger, Pengutronix
7 * Robert Schwebel, Pengutronix 5 * Robert Schwebel, Pengutronix
8 * 6 *
@@ -30,6 +28,7 @@
30#include <linux/init.h> 28#include <linux/init.h>
31#include <linux/list.h> 29#include <linux/list.h>
32#include <linux/proc_fs.h> 30#include <linux/proc_fs.h>
31#include <linux/seq_file.h>
33#include <linux/netdevice.h> 32#include <linux/netdevice.h>
34 33
35#include <asm/io.h> 34#include <asm/io.h>
@@ -38,9 +37,7 @@
38#include <asm/unaligned.h> 37#include <asm/unaligned.h>
39 38
40 39
41#undef RNDIS_PM 40#undef VERBOSE_DEBUG
42#undef RNDIS_WAKEUP
43#undef VERBOSE
44 41
45#include "rndis.h" 42#include "rndis.h"
46 43
@@ -96,9 +93,6 @@ static const u32 oid_supported_list [] =
96 OID_GEN_MAXIMUM_TOTAL_SIZE, 93 OID_GEN_MAXIMUM_TOTAL_SIZE,
97 OID_GEN_MEDIA_CONNECT_STATUS, 94 OID_GEN_MEDIA_CONNECT_STATUS,
98 OID_GEN_PHYSICAL_MEDIUM, 95 OID_GEN_PHYSICAL_MEDIUM,
99#if 0
100 OID_GEN_RNDIS_CONFIG_PARAMETER,
101#endif
102 96
103 /* the statistical stuff */ 97 /* the statistical stuff */
104 OID_GEN_XMIT_OK, 98 OID_GEN_XMIT_OK,
@@ -146,7 +140,14 @@ static const u32 oid_supported_list [] =
146#endif /* RNDIS_OPTIONAL_STATS */ 140#endif /* RNDIS_OPTIONAL_STATS */
147 141
148#ifdef RNDIS_PM 142#ifdef RNDIS_PM
149 /* PM and wakeup are mandatory for USB: */ 143 /* PM and wakeup are "mandatory" for USB, but the RNDIS specs
144 * don't say what they mean ... and the NDIS specs are often
145 * confusing and/or ambiguous in this context. (That is, more
146 * so than their specs for the other OIDs.)
147 *
148 * FIXME someone who knows what these should do, please
149 * implement them!
150 */
150 151
151 /* power management */ 152 /* power management */
152 OID_PNP_CAPABILITIES, 153 OID_PNP_CAPABILITIES,
@@ -173,6 +174,8 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
173 __le32 *outbuf; 174 __le32 *outbuf;
174 int i, count; 175 int i, count;
175 rndis_query_cmplt_type *resp; 176 rndis_query_cmplt_type *resp;
177 struct net_device *net;
178 struct net_device_stats *stats;
176 179
177 if (!r) return -ENOMEM; 180 if (!r) return -ENOMEM;
178 resp = (rndis_query_cmplt_type *) r->buf; 181 resp = (rndis_query_cmplt_type *) r->buf;
@@ -194,6 +197,12 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
194 outbuf = (__le32 *) &resp[1]; 197 outbuf = (__le32 *) &resp[1];
195 resp->InformationBufferOffset = __constant_cpu_to_le32 (16); 198 resp->InformationBufferOffset = __constant_cpu_to_le32 (16);
196 199
200 net = rndis_per_dev_params[configNr].dev;
201 if (net->get_stats)
202 stats = net->get_stats(net);
203 else
204 stats = NULL;
205
197 switch (OID) { 206 switch (OID) {
198 207
199 /* general oids (table 4-1) */ 208 /* general oids (table 4-1) */
@@ -350,11 +359,9 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
350 case OID_GEN_XMIT_OK: 359 case OID_GEN_XMIT_OK:
351 if (rndis_debug > 1) 360 if (rndis_debug > 1)
352 DBG("%s: OID_GEN_XMIT_OK\n", __func__); 361 DBG("%s: OID_GEN_XMIT_OK\n", __func__);
353 if (rndis_per_dev_params [configNr].stats) { 362 if (stats) {
354 *outbuf = cpu_to_le32 ( 363 *outbuf = cpu_to_le32(stats->tx_packets
355 rndis_per_dev_params [configNr].stats->tx_packets - 364 - stats->tx_errors - stats->tx_dropped);
356 rndis_per_dev_params [configNr].stats->tx_errors -
357 rndis_per_dev_params [configNr].stats->tx_dropped);
358 retval = 0; 365 retval = 0;
359 } 366 }
360 break; 367 break;
@@ -363,11 +370,9 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
363 case OID_GEN_RCV_OK: 370 case OID_GEN_RCV_OK:
364 if (rndis_debug > 1) 371 if (rndis_debug > 1)
365 DBG("%s: OID_GEN_RCV_OK\n", __func__); 372 DBG("%s: OID_GEN_RCV_OK\n", __func__);
366 if (rndis_per_dev_params [configNr].stats) { 373 if (stats) {
367 *outbuf = cpu_to_le32 ( 374 *outbuf = cpu_to_le32(stats->rx_packets
368 rndis_per_dev_params [configNr].stats->rx_packets - 375 - stats->rx_errors - stats->rx_dropped);
369 rndis_per_dev_params [configNr].stats->rx_errors -
370 rndis_per_dev_params [configNr].stats->rx_dropped);
371 retval = 0; 376 retval = 0;
372 } 377 }
373 break; 378 break;
@@ -376,9 +381,8 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
376 case OID_GEN_XMIT_ERROR: 381 case OID_GEN_XMIT_ERROR:
377 if (rndis_debug > 1) 382 if (rndis_debug > 1)
378 DBG("%s: OID_GEN_XMIT_ERROR\n", __func__); 383 DBG("%s: OID_GEN_XMIT_ERROR\n", __func__);
379 if (rndis_per_dev_params [configNr].stats) { 384 if (stats) {
380 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] 385 *outbuf = cpu_to_le32(stats->tx_errors);
381 .stats->tx_errors);
382 retval = 0; 386 retval = 0;
383 } 387 }
384 break; 388 break;
@@ -387,9 +391,8 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
387 case OID_GEN_RCV_ERROR: 391 case OID_GEN_RCV_ERROR:
388 if (rndis_debug > 1) 392 if (rndis_debug > 1)
389 DBG("%s: OID_GEN_RCV_ERROR\n", __func__); 393 DBG("%s: OID_GEN_RCV_ERROR\n", __func__);
390 if (rndis_per_dev_params [configNr].stats) { 394 if (stats) {
391 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] 395 *outbuf = cpu_to_le32(stats->rx_errors);
392 .stats->rx_errors);
393 retval = 0; 396 retval = 0;
394 } 397 }
395 break; 398 break;
@@ -397,150 +400,12 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
397 /* mandatory */ 400 /* mandatory */
398 case OID_GEN_RCV_NO_BUFFER: 401 case OID_GEN_RCV_NO_BUFFER:
399 DBG("%s: OID_GEN_RCV_NO_BUFFER\n", __func__); 402 DBG("%s: OID_GEN_RCV_NO_BUFFER\n", __func__);
400 if (rndis_per_dev_params [configNr].stats) { 403 if (stats) {
401 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] 404 *outbuf = cpu_to_le32(stats->rx_dropped);
402 .stats->rx_dropped);
403 retval = 0;
404 }
405 break;
406
407#ifdef RNDIS_OPTIONAL_STATS
408 case OID_GEN_DIRECTED_BYTES_XMIT:
409 DBG("%s: OID_GEN_DIRECTED_BYTES_XMIT\n", __func__);
410 /*
411 * Aunt Tilly's size of shoes
412 * minus antarctica count of penguins
413 * divided by weight of Alpha Centauri
414 */
415 if (rndis_per_dev_params [configNr].stats) {
416 *outbuf = cpu_to_le32 (
417 (rndis_per_dev_params [configNr]
418 .stats->tx_packets -
419 rndis_per_dev_params [configNr]
420 .stats->tx_errors -
421 rndis_per_dev_params [configNr]
422 .stats->tx_dropped)
423 * 123);
424 retval = 0;
425 }
426 break;
427
428 case OID_GEN_DIRECTED_FRAMES_XMIT:
429 DBG("%s: OID_GEN_DIRECTED_FRAMES_XMIT\n", __func__);
430 /* dito */
431 if (rndis_per_dev_params [configNr].stats) {
432 *outbuf = cpu_to_le32 (
433 (rndis_per_dev_params [configNr]
434 .stats->tx_packets -
435 rndis_per_dev_params [configNr]
436 .stats->tx_errors -
437 rndis_per_dev_params [configNr]
438 .stats->tx_dropped)
439 / 123);
440 retval = 0;
441 }
442 break;
443
444 case OID_GEN_MULTICAST_BYTES_XMIT:
445 DBG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __func__);
446 if (rndis_per_dev_params [configNr].stats) {
447 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
448 .stats->multicast*1234);
449 retval = 0;
450 }
451 break;
452
453 case OID_GEN_MULTICAST_FRAMES_XMIT:
454 DBG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __func__);
455 if (rndis_per_dev_params [configNr].stats) {
456 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
457 .stats->multicast);
458 retval = 0;
459 }
460 break;
461
462 case OID_GEN_BROADCAST_BYTES_XMIT:
463 DBG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __func__);
464 if (rndis_per_dev_params [configNr].stats) {
465 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
466 .stats->tx_packets/42*255);
467 retval = 0;
468 }
469 break;
470
471 case OID_GEN_BROADCAST_FRAMES_XMIT:
472 DBG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __func__);
473 if (rndis_per_dev_params [configNr].stats) {
474 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
475 .stats->tx_packets/42);
476 retval = 0;
477 }
478 break;
479
480 case OID_GEN_DIRECTED_BYTES_RCV:
481 DBG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __func__);
482 *outbuf = __constant_cpu_to_le32 (0);
483 retval = 0;
484 break;
485
486 case OID_GEN_DIRECTED_FRAMES_RCV:
487 DBG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __func__);
488 *outbuf = __constant_cpu_to_le32 (0);
489 retval = 0;
490 break;
491
492 case OID_GEN_MULTICAST_BYTES_RCV:
493 DBG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __func__);
494 if (rndis_per_dev_params [configNr].stats) {
495 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
496 .stats->multicast * 1111);
497 retval = 0;
498 }
499 break;
500
501 case OID_GEN_MULTICAST_FRAMES_RCV:
502 DBG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __func__);
503 if (rndis_per_dev_params [configNr].stats) {
504 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
505 .stats->multicast);
506 retval = 0;
507 }
508 break;
509
510 case OID_GEN_BROADCAST_BYTES_RCV:
511 DBG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __func__);
512 if (rndis_per_dev_params [configNr].stats) {
513 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
514 .stats->rx_packets/42*255);
515 retval = 0;
516 }
517 break;
518
519 case OID_GEN_BROADCAST_FRAMES_RCV:
520 DBG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __func__);
521 if (rndis_per_dev_params [configNr].stats) {
522 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
523 .stats->rx_packets/42);
524 retval = 0; 405 retval = 0;
525 } 406 }
526 break; 407 break;
527 408
528 case OID_GEN_RCV_CRC_ERROR:
529 DBG("%s: OID_GEN_RCV_CRC_ERROR\n", __func__);
530 if (rndis_per_dev_params [configNr].stats) {
531 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
532 .stats->rx_crc_errors);
533 retval = 0;
534 }
535 break;
536
537 case OID_GEN_TRANSMIT_QUEUE_LENGTH:
538 DBG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __func__);
539 *outbuf = __constant_cpu_to_le32 (0);
540 retval = 0;
541 break;
542#endif /* RNDIS_OPTIONAL_STATS */
543
544 /* ieee802.3 OIDs (table 4-3) */ 409 /* ieee802.3 OIDs (table 4-3) */
545 410
546 /* mandatory */ 411 /* mandatory */
@@ -592,9 +457,8 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
592 /* mandatory */ 457 /* mandatory */
593 case OID_802_3_RCV_ERROR_ALIGNMENT: 458 case OID_802_3_RCV_ERROR_ALIGNMENT:
594 DBG("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __func__); 459 DBG("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __func__);
595 if (rndis_per_dev_params [configNr].stats) { 460 if (stats) {
596 *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] 461 *outbuf = cpu_to_le32(stats->rx_frame_errors);
597 .stats->rx_frame_errors);
598 retval = 0; 462 retval = 0;
599 } 463 }
600 break; 464 break;
@@ -613,64 +477,6 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
613 retval = 0; 477 retval = 0;
614 break; 478 break;
615 479
616#ifdef RNDIS_OPTIONAL_STATS
617 case OID_802_3_XMIT_DEFERRED:
618 DBG("%s: OID_802_3_XMIT_DEFERRED\n", __func__);
619 /* TODO */
620 break;
621
622 case OID_802_3_XMIT_MAX_COLLISIONS:
623 DBG("%s: OID_802_3_XMIT_MAX_COLLISIONS\n", __func__);
624 /* TODO */
625 break;
626
627 case OID_802_3_RCV_OVERRUN:
628 DBG("%s: OID_802_3_RCV_OVERRUN\n", __func__);
629 /* TODO */
630 break;
631
632 case OID_802_3_XMIT_UNDERRUN:
633 DBG("%s: OID_802_3_XMIT_UNDERRUN\n", __func__);
634 /* TODO */
635 break;
636
637 case OID_802_3_XMIT_HEARTBEAT_FAILURE:
638 DBG("%s: OID_802_3_XMIT_HEARTBEAT_FAILURE\n", __func__);
639 /* TODO */
640 break;
641
642 case OID_802_3_XMIT_TIMES_CRS_LOST:
643 DBG("%s: OID_802_3_XMIT_TIMES_CRS_LOST\n", __func__);
644 /* TODO */
645 break;
646
647 case OID_802_3_XMIT_LATE_COLLISIONS:
648 DBG("%s: OID_802_3_XMIT_LATE_COLLISIONS\n", __func__);
649 /* TODO */
650 break;
651#endif /* RNDIS_OPTIONAL_STATS */
652
653#ifdef RNDIS_PM
654 /* power management OIDs (table 4-5) */
655 case OID_PNP_CAPABILITIES:
656 DBG("%s: OID_PNP_CAPABILITIES\n", __func__);
657
658 /* for now, no wakeup capabilities */
659 length = sizeof (struct NDIS_PNP_CAPABILITIES);
660 memset(outbuf, 0, length);
661 retval = 0;
662 break;
663 case OID_PNP_QUERY_POWER:
664 DBG("%s: OID_PNP_QUERY_POWER D%d\n", __func__,
665 get_unaligned_le32(buf) - 1);
666 /* only suspend is a real power state, and
667 * it can't be entered by OID_PNP_SET_POWER...
668 */
669 length = 0;
670 retval = 0;
671 break;
672#endif
673
674 default: 480 default:
675 pr_warning("%s: query unknown OID 0x%08X\n", 481 pr_warning("%s: query unknown OID 0x%08X\n",
676 __func__, OID); 482 __func__, OID);
@@ -726,9 +532,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
726 * what makes the packet flow start and stop, like 532 * what makes the packet flow start and stop, like
727 * activating the CDC Ethernet altsetting. 533 * activating the CDC Ethernet altsetting.
728 */ 534 */
729#ifdef RNDIS_PM
730update_linkstate:
731#endif
732 retval = 0; 535 retval = 0;
733 if (*params->filter) { 536 if (*params->filter) {
734 params->state = RNDIS_DATA_INITIALIZED; 537 params->state = RNDIS_DATA_INITIALIZED;
@@ -747,49 +550,6 @@ update_linkstate:
747 DBG("%s: OID_802_3_MULTICAST_LIST\n", __func__); 550 DBG("%s: OID_802_3_MULTICAST_LIST\n", __func__);
748 retval = 0; 551 retval = 0;
749 break; 552 break;
750#if 0
751 case OID_GEN_RNDIS_CONFIG_PARAMETER:
752 {
753 struct rndis_config_parameter *param;
754 param = (struct rndis_config_parameter *) buf;
755 DBG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER '%*s'\n",
756 __func__,
757 min(cpu_to_le32(param->ParameterNameLength),80),
758 buf + param->ParameterNameOffset);
759 retval = 0;
760 }
761 break;
762#endif
763
764#ifdef RNDIS_PM
765 case OID_PNP_SET_POWER:
766 /* The only real power state is USB suspend, and RNDIS requests
767 * can't enter it; this one isn't really about power. After
768 * resuming, Windows forces a reset, and then SET_POWER D0.
769 * FIXME ... then things go batty; Windows wedges itself.
770 */
771 i = get_unaligned_le32(buf);
772 DBG("%s: OID_PNP_SET_POWER D%d\n", __func__, i - 1);
773 switch (i) {
774 case NdisDeviceStateD0:
775 *params->filter = params->saved_filter;
776 goto update_linkstate;
777 case NdisDeviceStateD3:
778 case NdisDeviceStateD2:
779 case NdisDeviceStateD1:
780 params->saved_filter = *params->filter;
781 retval = 0;
782 break;
783 }
784 break;
785
786#ifdef RNDIS_WAKEUP
787 // no wakeup support advertised, so wakeup OIDs always fail:
788 // - OID_PNP_ENABLE_WAKE_UP
789 // - OID_PNP_{ADD,REMOVE}_WAKE_UP_PATTERN
790#endif
791
792#endif /* RNDIS_PM */
793 553
794 default: 554 default:
795 pr_warning("%s: set unknown OID 0x%08X, size %d\n", 555 pr_warning("%s: set unknown OID 0x%08X, size %d\n",
@@ -807,8 +567,10 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf)
807{ 567{
808 rndis_init_cmplt_type *resp; 568 rndis_init_cmplt_type *resp;
809 rndis_resp_t *r; 569 rndis_resp_t *r;
570 struct rndis_params *params = rndis_per_dev_params + configNr;
810 571
811 if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; 572 if (!params->dev)
573 return -ENOTSUPP;
812 574
813 r = rndis_add_response (configNr, sizeof (rndis_init_cmplt_type)); 575 r = rndis_add_response (configNr, sizeof (rndis_init_cmplt_type));
814 if (!r) 576 if (!r)
@@ -826,7 +588,7 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf)
826 resp->Medium = __constant_cpu_to_le32 (RNDIS_MEDIUM_802_3); 588 resp->Medium = __constant_cpu_to_le32 (RNDIS_MEDIUM_802_3);
827 resp->MaxPacketsPerTransfer = __constant_cpu_to_le32 (1); 589 resp->MaxPacketsPerTransfer = __constant_cpu_to_le32 (1);
828 resp->MaxTransferSize = cpu_to_le32 ( 590 resp->MaxTransferSize = cpu_to_le32 (
829 rndis_per_dev_params [configNr].dev->mtu 591 params->dev->mtu
830 + sizeof (struct ethhdr) 592 + sizeof (struct ethhdr)
831 + sizeof (struct rndis_packet_msg_type) 593 + sizeof (struct rndis_packet_msg_type)
832 + 22); 594 + 22);
@@ -834,10 +596,7 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf)
834 resp->AFListOffset = __constant_cpu_to_le32 (0); 596 resp->AFListOffset = __constant_cpu_to_le32 (0);
835 resp->AFListSize = __constant_cpu_to_le32 (0); 597 resp->AFListSize = __constant_cpu_to_le32 (0);
836 598
837 if (rndis_per_dev_params [configNr].ack) 599 params->resp_avail(params->v);
838 rndis_per_dev_params [configNr].ack (
839 rndis_per_dev_params [configNr].dev);
840
841 return 0; 600 return 0;
842} 601}
843 602
@@ -845,9 +604,11 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
845{ 604{
846 rndis_query_cmplt_type *resp; 605 rndis_query_cmplt_type *resp;
847 rndis_resp_t *r; 606 rndis_resp_t *r;
607 struct rndis_params *params = rndis_per_dev_params + configNr;
848 608
849 // DBG("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID)); 609 // DBG("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID));
850 if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; 610 if (!params->dev)
611 return -ENOTSUPP;
851 612
852 /* 613 /*
853 * we need more memory: 614 * we need more memory:
@@ -878,9 +639,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
878 } else 639 } else
879 resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); 640 resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
880 641
881 if (rndis_per_dev_params [configNr].ack) 642 params->resp_avail(params->v);
882 rndis_per_dev_params [configNr].ack (
883 rndis_per_dev_params [configNr].dev);
884 return 0; 643 return 0;
885} 644}
886 645
@@ -889,6 +648,7 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
889 u32 BufLength, BufOffset; 648 u32 BufLength, BufOffset;
890 rndis_set_cmplt_type *resp; 649 rndis_set_cmplt_type *resp;
891 rndis_resp_t *r; 650 rndis_resp_t *r;
651 struct rndis_params *params = rndis_per_dev_params + configNr;
892 652
893 r = rndis_add_response (configNr, sizeof (rndis_set_cmplt_type)); 653 r = rndis_add_response (configNr, sizeof (rndis_set_cmplt_type));
894 if (!r) 654 if (!r)
@@ -898,7 +658,7 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
898 BufLength = le32_to_cpu (buf->InformationBufferLength); 658 BufLength = le32_to_cpu (buf->InformationBufferLength);
899 BufOffset = le32_to_cpu (buf->InformationBufferOffset); 659 BufOffset = le32_to_cpu (buf->InformationBufferOffset);
900 660
901#ifdef VERBOSE 661#ifdef VERBOSE_DEBUG
902 DBG("%s: Length: %d\n", __func__, BufLength); 662 DBG("%s: Length: %d\n", __func__, BufLength);
903 DBG("%s: Offset: %d\n", __func__, BufOffset); 663 DBG("%s: Offset: %d\n", __func__, BufOffset);
904 DBG("%s: InfoBuffer: ", __func__); 664 DBG("%s: InfoBuffer: ", __func__);
@@ -919,10 +679,7 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
919 else 679 else
920 resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); 680 resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
921 681
922 if (rndis_per_dev_params [configNr].ack) 682 params->resp_avail(params->v);
923 rndis_per_dev_params [configNr].ack (
924 rndis_per_dev_params [configNr].dev);
925
926 return 0; 683 return 0;
927} 684}
928 685
@@ -930,6 +687,7 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf)
930{ 687{
931 rndis_reset_cmplt_type *resp; 688 rndis_reset_cmplt_type *resp;
932 rndis_resp_t *r; 689 rndis_resp_t *r;
690 struct rndis_params *params = rndis_per_dev_params + configNr;
933 691
934 r = rndis_add_response (configNr, sizeof (rndis_reset_cmplt_type)); 692 r = rndis_add_response (configNr, sizeof (rndis_reset_cmplt_type));
935 if (!r) 693 if (!r)
@@ -942,10 +700,7 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf)
942 /* resent information */ 700 /* resent information */
943 resp->AddressingReset = __constant_cpu_to_le32 (1); 701 resp->AddressingReset = __constant_cpu_to_le32 (1);
944 702
945 if (rndis_per_dev_params [configNr].ack) 703 params->resp_avail(params->v);
946 rndis_per_dev_params [configNr].ack (
947 rndis_per_dev_params [configNr].dev);
948
949 return 0; 704 return 0;
950} 705}
951 706
@@ -954,6 +709,7 @@ static int rndis_keepalive_response (int configNr,
954{ 709{
955 rndis_keepalive_cmplt_type *resp; 710 rndis_keepalive_cmplt_type *resp;
956 rndis_resp_t *r; 711 rndis_resp_t *r;
712 struct rndis_params *params = rndis_per_dev_params + configNr;
957 713
958 /* host "should" check only in RNDIS_DATA_INITIALIZED state */ 714 /* host "should" check only in RNDIS_DATA_INITIALIZED state */
959 715
@@ -968,10 +724,7 @@ static int rndis_keepalive_response (int configNr,
968 resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ 724 resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
969 resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); 725 resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
970 726
971 if (rndis_per_dev_params [configNr].ack) 727 params->resp_avail(params->v);
972 rndis_per_dev_params [configNr].ack (
973 rndis_per_dev_params [configNr].dev);
974
975 return 0; 728 return 0;
976} 729}
977 730
@@ -983,8 +736,9 @@ static int rndis_indicate_status_msg (int configNr, u32 status)
983{ 736{
984 rndis_indicate_status_msg_type *resp; 737 rndis_indicate_status_msg_type *resp;
985 rndis_resp_t *r; 738 rndis_resp_t *r;
739 struct rndis_params *params = rndis_per_dev_params + configNr;
986 740
987 if (rndis_per_dev_params [configNr].state == RNDIS_UNINITIALIZED) 741 if (params->state == RNDIS_UNINITIALIZED)
988 return -ENOTSUPP; 742 return -ENOTSUPP;
989 743
990 r = rndis_add_response (configNr, 744 r = rndis_add_response (configNr,
@@ -1000,9 +754,7 @@ static int rndis_indicate_status_msg (int configNr, u32 status)
1000 resp->StatusBufferLength = __constant_cpu_to_le32 (0); 754 resp->StatusBufferLength = __constant_cpu_to_le32 (0);
1001 resp->StatusBufferOffset = __constant_cpu_to_le32 (0); 755 resp->StatusBufferOffset = __constant_cpu_to_le32 (0);
1002 756
1003 if (rndis_per_dev_params [configNr].ack) 757 params->resp_avail(params->v);
1004 rndis_per_dev_params [configNr].ack (
1005 rndis_per_dev_params [configNr].dev);
1006 return 0; 758 return 0;
1007} 759}
1008 760
@@ -1029,7 +781,6 @@ void rndis_uninit (int configNr)
1029 781
1030 if (configNr >= RNDIS_MAX_CONFIGS) 782 if (configNr >= RNDIS_MAX_CONFIGS)
1031 return; 783 return;
1032 rndis_per_dev_params [configNr].used = 0;
1033 rndis_per_dev_params [configNr].state = RNDIS_UNINITIALIZED; 784 rndis_per_dev_params [configNr].state = RNDIS_UNINITIALIZED;
1034 785
1035 /* drain the response queue */ 786 /* drain the response queue */
@@ -1142,21 +893,25 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
1142 return -ENOTSUPP; 893 return -ENOTSUPP;
1143} 894}
1144 895
1145int rndis_register (int (* rndis_control_ack) (struct net_device *)) 896int rndis_register(void (*resp_avail)(void *v), void *v)
1146{ 897{
1147 u8 i; 898 u8 i;
1148 899
900 if (!resp_avail)
901 return -EINVAL;
902
1149 for (i = 0; i < RNDIS_MAX_CONFIGS; i++) { 903 for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
1150 if (!rndis_per_dev_params [i].used) { 904 if (!rndis_per_dev_params [i].used) {
1151 rndis_per_dev_params [i].used = 1; 905 rndis_per_dev_params [i].used = 1;
1152 rndis_per_dev_params [i].ack = rndis_control_ack; 906 rndis_per_dev_params [i].resp_avail = resp_avail;
907 rndis_per_dev_params [i].v = v;
1153 DBG("%s: configNr = %d\n", __func__, i); 908 DBG("%s: configNr = %d\n", __func__, i);
1154 return i; 909 return i;
1155 } 910 }
1156 } 911 }
1157 DBG("failed\n"); 912 DBG("failed\n");
1158 913
1159 return -1; 914 return -ENODEV;
1160} 915}
1161 916
1162void rndis_deregister (int configNr) 917void rndis_deregister (int configNr)
@@ -1169,16 +924,14 @@ void rndis_deregister (int configNr)
1169 return; 924 return;
1170} 925}
1171 926
1172int rndis_set_param_dev (u8 configNr, struct net_device *dev, 927int rndis_set_param_dev(u8 configNr, struct net_device *dev, u16 *cdc_filter)
1173 struct net_device_stats *stats,
1174 u16 *cdc_filter)
1175{ 928{
1176 DBG("%s:\n", __func__ ); 929 DBG("%s:\n", __func__ );
1177 if (!dev || !stats) return -1; 930 if (!dev)
931 return -EINVAL;
1178 if (configNr >= RNDIS_MAX_CONFIGS) return -1; 932 if (configNr >= RNDIS_MAX_CONFIGS) return -1;
1179 933
1180 rndis_per_dev_params [configNr].dev = dev; 934 rndis_per_dev_params [configNr].dev = dev;
1181 rndis_per_dev_params [configNr].stats = stats;
1182 rndis_per_dev_params [configNr].filter = cdc_filter; 935 rndis_per_dev_params [configNr].filter = cdc_filter;
1183 936
1184 return 0; 937 return 0;
@@ -1296,14 +1049,11 @@ int rndis_rm_hdr(struct sk_buff *skb)
1296 1049
1297#ifdef CONFIG_USB_GADGET_DEBUG_FILES 1050#ifdef CONFIG_USB_GADGET_DEBUG_FILES
1298 1051
1299static int rndis_proc_read (char *page, char **start, off_t off, int count, int *eof, 1052static int rndis_proc_show(struct seq_file *m, void *v)
1300 void *data)
1301{ 1053{
1302 char *out = page; 1054 rndis_params *param = m->private;
1303 int len;
1304 rndis_params *param = (rndis_params *) data;
1305 1055
1306 out += snprintf (out, count, 1056 seq_printf(m,
1307 "Config Nr. %d\n" 1057 "Config Nr. %d\n"
1308 "used : %s\n" 1058 "used : %s\n"
1309 "state : %s\n" 1059 "state : %s\n"
@@ -1326,25 +1076,13 @@ static int rndis_proc_read (char *page, char **start, off_t off, int count, int
1326 (param->media_state) ? 0 : param->speed*100, 1076 (param->media_state) ? 0 : param->speed*100,
1327 (param->media_state) ? "disconnected" : "connected", 1077 (param->media_state) ? "disconnected" : "connected",
1328 param->vendorID, param->vendorDescr); 1078 param->vendorID, param->vendorDescr);
1329 1079 return 0;
1330 len = out - page;
1331 len -= off;
1332
1333 if (len < count) {
1334 *eof = 1;
1335 if (len <= 0)
1336 return 0;
1337 } else
1338 len = count;
1339
1340 *start = page + off;
1341 return len;
1342} 1080}
1343 1081
1344static int rndis_proc_write (struct file *file, const char __user *buffer, 1082static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
1345 unsigned long count, void *data) 1083 size_t count, loff_t *ppos)
1346{ 1084{
1347 rndis_params *p = data; 1085 rndis_params *p = PDE(file->f_path.dentry->d_inode)->data;
1348 u32 speed = 0; 1086 u32 speed = 0;
1349 int i, fl_speed = 0; 1087 int i, fl_speed = 0;
1350 1088
@@ -1386,6 +1124,20 @@ static int rndis_proc_write (struct file *file, const char __user *buffer,
1386 return count; 1124 return count;
1387} 1125}
1388 1126
1127static int rndis_proc_open(struct inode *inode, struct file *file)
1128{
1129 return single_open(file, rndis_proc_show, PDE(inode)->data);
1130}
1131
1132static const struct file_operations rndis_proc_fops = {
1133 .owner = THIS_MODULE,
1134 .open = rndis_proc_open,
1135 .read = seq_read,
1136 .llseek = seq_lseek,
1137 .release = single_release,
1138 .write = rndis_proc_write,
1139};
1140
1389#define NAME_TEMPLATE "driver/rndis-%03d" 1141#define NAME_TEMPLATE "driver/rndis-%03d"
1390 1142
1391static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS]; 1143static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS];
@@ -1403,7 +1155,9 @@ int __init rndis_init (void)
1403 1155
1404 sprintf (name, NAME_TEMPLATE, i); 1156 sprintf (name, NAME_TEMPLATE, i);
1405 if (!(rndis_connect_state [i] 1157 if (!(rndis_connect_state [i]
1406 = create_proc_entry (name, 0660, NULL))) 1158 = proc_create_data(name, 0660, NULL,
1159 &rndis_proc_fops,
1160 (void *)(rndis_per_dev_params + i))))
1407 { 1161 {
1408 DBG("%s :remove entries", __func__); 1162 DBG("%s :remove entries", __func__);
1409 while (i) { 1163 while (i) {
@@ -1413,11 +1167,6 @@ int __init rndis_init (void)
1413 DBG("\n"); 1167 DBG("\n");
1414 return -EIO; 1168 return -EIO;
1415 } 1169 }
1416
1417 rndis_connect_state [i]->write_proc = rndis_proc_write;
1418 rndis_connect_state [i]->read_proc = rndis_proc_read;
1419 rndis_connect_state [i]->data = (void *)
1420 (rndis_per_dev_params + i);
1421#endif 1170#endif
1422 rndis_per_dev_params [i].confignr = i; 1171 rndis_per_dev_params [i].confignr = i;
1423 rndis_per_dev_params [i].used = 0; 1172 rndis_per_dev_params [i].used = 0;
diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h
index 397b149f3ca7..aac61dfe0f03 100644
--- a/drivers/usb/gadget/rndis.h
+++ b/drivers/usb/gadget/rndis.h
@@ -1,8 +1,6 @@
1/* 1/*
2 * RNDIS Definitions for Remote NDIS 2 * RNDIS Definitions for Remote NDIS
3 * 3 *
4 * Version: $Id: rndis.h,v 1.15 2004/03/25 21:33:46 robert Exp $
5 *
6 * Authors: Benedikt Spranger, Pengutronix 4 * Authors: Benedikt Spranger, Pengutronix
7 * Robert Schwebel, Pengutronix 5 * Robert Schwebel, Pengutronix
8 * 6 *
@@ -235,20 +233,19 @@ typedef struct rndis_params
235 const u8 *host_mac; 233 const u8 *host_mac;
236 u16 *filter; 234 u16 *filter;
237 struct net_device *dev; 235 struct net_device *dev;
238 struct net_device_stats *stats;
239 236
240 u32 vendorID; 237 u32 vendorID;
241 const char *vendorDescr; 238 const char *vendorDescr;
242 int (*ack) (struct net_device *); 239 void (*resp_avail)(void *v);
240 void *v;
243 struct list_head resp_queue; 241 struct list_head resp_queue;
244} rndis_params; 242} rndis_params;
245 243
246/* RNDIS Message parser and other useless functions */ 244/* RNDIS Message parser and other useless functions */
247int rndis_msg_parser (u8 configNr, u8 *buf); 245int rndis_msg_parser (u8 configNr, u8 *buf);
248int rndis_register (int (*rndis_control_ack) (struct net_device *)); 246int rndis_register(void (*resp_avail)(void *v), void *v);
249void rndis_deregister (int configNr); 247void rndis_deregister (int configNr);
250int rndis_set_param_dev (u8 configNr, struct net_device *dev, 248int rndis_set_param_dev (u8 configNr, struct net_device *dev,
251 struct net_device_stats *stats,
252 u16 *cdc_filter); 249 u16 *cdc_filter);
253int rndis_set_param_vendor (u8 configNr, u32 vendorID, 250int rndis_set_param_vendor (u8 configNr, u32 vendorID,
254 const char *vendorDescr); 251 const char *vendorDescr);
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c
index fa019fa73334..b3699afff002 100644
--- a/drivers/usb/gadget/serial.c
+++ b/drivers/usb/gadget/serial.c
@@ -1,15 +1,9 @@
1/* 1/*
2 * g_serial.c -- USB gadget serial driver 2 * serial.c -- USB gadget serial driver
3 * 3 *
4 * Copyright 2003 (C) Al Borchers (alborchers@steinerpoint.com) 4 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
5 * 5 * Copyright (C) 2008 by David Brownell
6 * This code is based in part on the Gadget Zero driver, which 6 * Copyright (C) 2008 by Nokia Corporation
7 * is Copyright (C) 2003 by David Brownell, all rights reserved.
8 *
9 * This code also borrows from usbserial.c, which is
10 * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com)
11 * Copyright (C) 2000 Peter Berger (pberger@brimson.com)
12 * Copyright (C) 2000 Al Borchers (alborchers@steinerpoint.com)
13 * 7 *
14 * This software is distributed under the terms of the GNU General 8 * This software is distributed under the terms of the GNU General
15 * Public License ("GPL") as published by the Free Software Foundation, 9 * Public License ("GPL") as published by the Free Software Foundation,
@@ -22,2254 +16,237 @@
22#include <linux/tty.h> 16#include <linux/tty.h>
23#include <linux/tty_flip.h> 17#include <linux/tty_flip.h>
24 18
25#include <linux/usb/ch9.h> 19#include "u_serial.h"
26#include <linux/usb/cdc.h>
27#include <linux/usb/gadget.h>
28
29#include "gadget_chips.h" 20#include "gadget_chips.h"
30 21
31 22
32/* Defines */ 23/* Defines */
33 24
34#define GS_VERSION_STR "v2.2" 25#define GS_VERSION_STR "v2.4"
35#define GS_VERSION_NUM 0x2200 26#define GS_VERSION_NUM 0x2400
36 27
37#define GS_LONG_NAME "Gadget Serial" 28#define GS_LONG_NAME "Gadget Serial"
38#define GS_SHORT_NAME "g_serial" 29#define GS_VERSION_NAME GS_LONG_NAME " " GS_VERSION_STR
39
40#define GS_MAJOR 127
41#define GS_MINOR_START 0
42
43/* REVISIT only one port is supported for now;
44 * see gs_{send,recv}_packet() ... no multiplexing,
45 * and no support for multiple ACM devices.
46 */
47#define GS_NUM_PORTS 1
48
49#define GS_NUM_CONFIGS 1
50#define GS_NO_CONFIG_ID 0
51#define GS_BULK_CONFIG_ID 1
52#define GS_ACM_CONFIG_ID 2
53
54#define GS_MAX_NUM_INTERFACES 2
55#define GS_BULK_INTERFACE_ID 0
56#define GS_CONTROL_INTERFACE_ID 0
57#define GS_DATA_INTERFACE_ID 1
58
59#define GS_MAX_DESC_LEN 256
60
61#define GS_DEFAULT_READ_Q_SIZE 32
62#define GS_DEFAULT_WRITE_Q_SIZE 32
63
64#define GS_DEFAULT_WRITE_BUF_SIZE 8192
65#define GS_TMP_BUF_SIZE 8192
66
67#define GS_CLOSE_TIMEOUT 15
68
69#define GS_DEFAULT_USE_ACM 0
70
71/* 9600-8-N-1 ... matches init_termios.c_cflag and defaults
72 * expected by "usbser.sys" on MS-Windows.
73 */
74#define GS_DEFAULT_DTE_RATE 9600
75#define GS_DEFAULT_DATA_BITS 8
76#define GS_DEFAULT_PARITY USB_CDC_NO_PARITY
77#define GS_DEFAULT_CHAR_FORMAT USB_CDC_1_STOP_BITS
78
79/* maxpacket and other transfer characteristics vary by speed. */
80static inline struct usb_endpoint_descriptor *
81choose_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *hs,
82 struct usb_endpoint_descriptor *fs)
83{
84 if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
85 return hs;
86 return fs;
87}
88
89
90/* debug settings */
91#ifdef DEBUG
92static int debug = 1;
93#else
94#define debug 0
95#endif
96
97#define gs_debug(format, arg...) \
98 do { if (debug) pr_debug(format, ## arg); } while (0)
99#define gs_debug_level(level, format, arg...) \
100 do { if (debug >= level) pr_debug(format, ## arg); } while (0)
101 30
31/*-------------------------------------------------------------------------*/
102 32
103/* Thanks to NetChip Technologies for donating this product ID. 33/* Thanks to NetChip Technologies for donating this product ID.
104 * 34*
105 * DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!! 35* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
106 * Instead: allocate your own, using normal USB-IF procedures. 36* Instead: allocate your own, using normal USB-IF procedures.
107 */ 37*/
108#define GS_VENDOR_ID 0x0525 /* NetChip */ 38#define GS_VENDOR_ID 0x0525 /* NetChip */
109#define GS_PRODUCT_ID 0xa4a6 /* Linux-USB Serial Gadget */ 39#define GS_PRODUCT_ID 0xa4a6 /* Linux-USB Serial Gadget */
110#define GS_CDC_PRODUCT_ID 0xa4a7 /* ... as CDC-ACM */ 40#define GS_CDC_PRODUCT_ID 0xa4a7 /* ... as CDC-ACM */
111 41
112#define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */ 42/* string IDs are assigned dynamically */
113#define GS_NOTIFY_MAXPACKET 8
114 43
44#define STRING_MANUFACTURER_IDX 0
45#define STRING_PRODUCT_IDX 1
46#define STRING_DESCRIPTION_IDX 2
115 47
116/* circular buffer */ 48static char manufacturer[50];
117struct gs_buf {
118 unsigned int buf_size;
119 char *buf_buf;
120 char *buf_get;
121 char *buf_put;
122};
123 49
124/* the port structure holds info for each port, one for each minor number */ 50static struct usb_string strings_dev[] = {
125struct gs_port { 51 [STRING_MANUFACTURER_IDX].s = manufacturer,
126 struct gs_dev *port_dev; /* pointer to device struct */ 52 [STRING_PRODUCT_IDX].s = GS_VERSION_NAME,
127 struct tty_struct *port_tty; /* pointer to tty struct */ 53 [STRING_DESCRIPTION_IDX].s = NULL /* updated; f(use_acm) */,
128 spinlock_t port_lock; 54 { } /* end of list */
129 int port_num;
130 int port_open_count;
131 int port_in_use; /* open/close in progress */
132 wait_queue_head_t port_write_wait;/* waiting to write */
133 struct gs_buf *port_write_buf;
134 struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */
135 u16 port_handshake_bits;
136#define RS232_RTS (1 << 1)
137#define RS232_DTE (1 << 0)
138}; 55};
139 56
140/* the device structure holds info for the USB device */ 57static struct usb_gadget_strings stringtab_dev = {
141struct gs_dev { 58 .language = 0x0409, /* en-us */
142 struct usb_gadget *dev_gadget; /* gadget device pointer */ 59 .strings = strings_dev,
143 spinlock_t dev_lock; /* lock for set/reset config */
144 int dev_config; /* configuration number */
145 struct usb_ep *dev_notify_ep; /* address of notify endpoint */
146 struct usb_ep *dev_in_ep; /* address of in endpoint */
147 struct usb_ep *dev_out_ep; /* address of out endpoint */
148 struct usb_endpoint_descriptor /* descriptor of notify ep */
149 *dev_notify_ep_desc;
150 struct usb_endpoint_descriptor /* descriptor of in endpoint */
151 *dev_in_ep_desc;
152 struct usb_endpoint_descriptor /* descriptor of out endpoint */
153 *dev_out_ep_desc;
154 struct usb_request *dev_ctrl_req; /* control request */
155 struct list_head dev_req_list; /* list of write requests */
156 int dev_sched_port; /* round robin port scheduled */
157 struct gs_port *dev_port[GS_NUM_PORTS]; /* the ports */
158}; 60};
159 61
160 62static struct usb_gadget_strings *dev_strings[] = {
161/* Functions */ 63 &stringtab_dev,
162 64 NULL,
163/* tty driver internals */
164static int gs_send(struct gs_dev *dev);
165static int gs_send_packet(struct gs_dev *dev, char *packet,
166 unsigned int size);
167static int gs_recv_packet(struct gs_dev *dev, char *packet,
168 unsigned int size);
169static void gs_read_complete(struct usb_ep *ep, struct usb_request *req);
170static void gs_write_complete(struct usb_ep *ep, struct usb_request *req);
171
172/* gadget driver internals */
173static int gs_set_config(struct gs_dev *dev, unsigned config);
174static void gs_reset_config(struct gs_dev *dev);
175static int gs_build_config_buf(u8 *buf, struct usb_gadget *g,
176 u8 type, unsigned int index, int is_otg);
177
178static struct usb_request *gs_alloc_req(struct usb_ep *ep, unsigned int len,
179 gfp_t kmalloc_flags);
180static void gs_free_req(struct usb_ep *ep, struct usb_request *req);
181
182static int gs_alloc_ports(struct gs_dev *dev, gfp_t kmalloc_flags);
183static void gs_free_ports(struct gs_dev *dev);
184
185/* circular buffer */
186static struct gs_buf *gs_buf_alloc(unsigned int size, gfp_t kmalloc_flags);
187static void gs_buf_free(struct gs_buf *gb);
188static void gs_buf_clear(struct gs_buf *gb);
189static unsigned int gs_buf_data_avail(struct gs_buf *gb);
190static unsigned int gs_buf_space_avail(struct gs_buf *gb);
191static unsigned int gs_buf_put(struct gs_buf *gb, const char *buf,
192 unsigned int count);
193static unsigned int gs_buf_get(struct gs_buf *gb, char *buf,
194 unsigned int count);
195
196
197/* Globals */
198
199static struct gs_dev *gs_device;
200
201static struct mutex gs_open_close_lock[GS_NUM_PORTS];
202
203
204/*-------------------------------------------------------------------------*/
205
206/* USB descriptors */
207
208#define GS_MANUFACTURER_STR_ID 1
209#define GS_PRODUCT_STR_ID 2
210#define GS_SERIAL_STR_ID 3
211#define GS_BULK_CONFIG_STR_ID 4
212#define GS_ACM_CONFIG_STR_ID 5
213#define GS_CONTROL_STR_ID 6
214#define GS_DATA_STR_ID 7
215
216/* static strings, in UTF-8 */
217static char manufacturer[50];
218static struct usb_string gs_strings[] = {
219 { GS_MANUFACTURER_STR_ID, manufacturer },
220 { GS_PRODUCT_STR_ID, GS_LONG_NAME },
221 { GS_BULK_CONFIG_STR_ID, "Gadget Serial Bulk" },
222 { GS_ACM_CONFIG_STR_ID, "Gadget Serial CDC ACM" },
223 { GS_CONTROL_STR_ID, "Gadget Serial Control" },
224 { GS_DATA_STR_ID, "Gadget Serial Data" },
225 { } /* end of list */
226};
227
228static struct usb_gadget_strings gs_string_table = {
229 .language = 0x0409, /* en-us */
230 .strings = gs_strings,
231}; 65};
232 66
233static struct usb_device_descriptor gs_device_desc = { 67static struct usb_device_descriptor device_desc = {
234 .bLength = USB_DT_DEVICE_SIZE, 68 .bLength = USB_DT_DEVICE_SIZE,
235 .bDescriptorType = USB_DT_DEVICE, 69 .bDescriptorType = USB_DT_DEVICE,
236 .bcdUSB = __constant_cpu_to_le16(0x0200), 70 .bcdUSB = __constant_cpu_to_le16(0x0200),
71 /* .bDeviceClass = f(use_acm) */
237 .bDeviceSubClass = 0, 72 .bDeviceSubClass = 0,
238 .bDeviceProtocol = 0, 73 .bDeviceProtocol = 0,
74 /* .bMaxPacketSize0 = f(hardware) */
239 .idVendor = __constant_cpu_to_le16(GS_VENDOR_ID), 75 .idVendor = __constant_cpu_to_le16(GS_VENDOR_ID),
240 .idProduct = __constant_cpu_to_le16(GS_PRODUCT_ID), 76 /* .idProduct = f(use_acm) */
241 .iManufacturer = GS_MANUFACTURER_STR_ID, 77 /* .bcdDevice = f(hardware) */
242 .iProduct = GS_PRODUCT_STR_ID, 78 /* .iManufacturer = DYNAMIC */
243 .bNumConfigurations = GS_NUM_CONFIGS, 79 /* .iProduct = DYNAMIC */
80 .bNumConfigurations = 1,
244}; 81};
245 82
246static struct usb_otg_descriptor gs_otg_descriptor = { 83static struct usb_otg_descriptor otg_descriptor = {
247 .bLength = sizeof(gs_otg_descriptor), 84 .bLength = sizeof otg_descriptor,
248 .bDescriptorType = USB_DT_OTG, 85 .bDescriptorType = USB_DT_OTG,
249 .bmAttributes = USB_OTG_SRP,
250};
251
252static struct usb_config_descriptor gs_bulk_config_desc = {
253 .bLength = USB_DT_CONFIG_SIZE,
254 .bDescriptorType = USB_DT_CONFIG,
255 /* .wTotalLength computed dynamically */
256 .bNumInterfaces = 1,
257 .bConfigurationValue = GS_BULK_CONFIG_ID,
258 .iConfiguration = GS_BULK_CONFIG_STR_ID,
259 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
260 .bMaxPower = 1,
261};
262
263static struct usb_config_descriptor gs_acm_config_desc = {
264 .bLength = USB_DT_CONFIG_SIZE,
265 .bDescriptorType = USB_DT_CONFIG,
266 /* .wTotalLength computed dynamically */
267 .bNumInterfaces = 2,
268 .bConfigurationValue = GS_ACM_CONFIG_ID,
269 .iConfiguration = GS_ACM_CONFIG_STR_ID,
270 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
271 .bMaxPower = 1,
272};
273
274static const struct usb_interface_descriptor gs_bulk_interface_desc = {
275 .bLength = USB_DT_INTERFACE_SIZE,
276 .bDescriptorType = USB_DT_INTERFACE,
277 .bInterfaceNumber = GS_BULK_INTERFACE_ID,
278 .bNumEndpoints = 2,
279 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
280 .bInterfaceSubClass = 0,
281 .bInterfaceProtocol = 0,
282 .iInterface = GS_DATA_STR_ID,
283};
284
285static const struct usb_interface_descriptor gs_control_interface_desc = {
286 .bLength = USB_DT_INTERFACE_SIZE,
287 .bDescriptorType = USB_DT_INTERFACE,
288 .bInterfaceNumber = GS_CONTROL_INTERFACE_ID,
289 .bNumEndpoints = 1,
290 .bInterfaceClass = USB_CLASS_COMM,
291 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
292 .bInterfaceProtocol = USB_CDC_ACM_PROTO_AT_V25TER,
293 .iInterface = GS_CONTROL_STR_ID,
294};
295
296static const struct usb_interface_descriptor gs_data_interface_desc = {
297 .bLength = USB_DT_INTERFACE_SIZE,
298 .bDescriptorType = USB_DT_INTERFACE,
299 .bInterfaceNumber = GS_DATA_INTERFACE_ID,
300 .bNumEndpoints = 2,
301 .bInterfaceClass = USB_CLASS_CDC_DATA,
302 .bInterfaceSubClass = 0,
303 .bInterfaceProtocol = 0,
304 .iInterface = GS_DATA_STR_ID,
305};
306
307static const struct usb_cdc_header_desc gs_header_desc = {
308 .bLength = sizeof(gs_header_desc),
309 .bDescriptorType = USB_DT_CS_INTERFACE,
310 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
311 .bcdCDC = __constant_cpu_to_le16(0x0110),
312};
313
314static const struct usb_cdc_call_mgmt_descriptor gs_call_mgmt_descriptor = {
315 .bLength = sizeof(gs_call_mgmt_descriptor),
316 .bDescriptorType = USB_DT_CS_INTERFACE,
317 .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
318 .bmCapabilities = 0,
319 .bDataInterface = 1, /* index of data interface */
320};
321
322static struct usb_cdc_acm_descriptor gs_acm_descriptor = {
323 .bLength = sizeof(gs_acm_descriptor),
324 .bDescriptorType = USB_DT_CS_INTERFACE,
325 .bDescriptorSubType = USB_CDC_ACM_TYPE,
326 .bmCapabilities = (1 << 1),
327};
328
329static const struct usb_cdc_union_desc gs_union_desc = {
330 .bLength = sizeof(gs_union_desc),
331 .bDescriptorType = USB_DT_CS_INTERFACE,
332 .bDescriptorSubType = USB_CDC_UNION_TYPE,
333 .bMasterInterface0 = 0, /* index of control interface */
334 .bSlaveInterface0 = 1, /* index of data interface */
335};
336
337static struct usb_endpoint_descriptor gs_fullspeed_notify_desc = {
338 .bLength = USB_DT_ENDPOINT_SIZE,
339 .bDescriptorType = USB_DT_ENDPOINT,
340 .bEndpointAddress = USB_DIR_IN,
341 .bmAttributes = USB_ENDPOINT_XFER_INT,
342 .wMaxPacketSize = __constant_cpu_to_le16(GS_NOTIFY_MAXPACKET),
343 .bInterval = 1 << GS_LOG2_NOTIFY_INTERVAL,
344};
345
346static struct usb_endpoint_descriptor gs_fullspeed_in_desc = {
347 .bLength = USB_DT_ENDPOINT_SIZE,
348 .bDescriptorType = USB_DT_ENDPOINT,
349 .bEndpointAddress = USB_DIR_IN,
350 .bmAttributes = USB_ENDPOINT_XFER_BULK,
351};
352
353static struct usb_endpoint_descriptor gs_fullspeed_out_desc = {
354 .bLength = USB_DT_ENDPOINT_SIZE,
355 .bDescriptorType = USB_DT_ENDPOINT,
356 .bEndpointAddress = USB_DIR_OUT,
357 .bmAttributes = USB_ENDPOINT_XFER_BULK,
358};
359
360static const struct usb_descriptor_header *gs_bulk_fullspeed_function[] = {
361 (struct usb_descriptor_header *) &gs_otg_descriptor,
362 (struct usb_descriptor_header *) &gs_bulk_interface_desc,
363 (struct usb_descriptor_header *) &gs_fullspeed_in_desc,
364 (struct usb_descriptor_header *) &gs_fullspeed_out_desc,
365 NULL,
366};
367
368static const struct usb_descriptor_header *gs_acm_fullspeed_function[] = {
369 (struct usb_descriptor_header *) &gs_otg_descriptor,
370 (struct usb_descriptor_header *) &gs_control_interface_desc,
371 (struct usb_descriptor_header *) &gs_header_desc,
372 (struct usb_descriptor_header *) &gs_call_mgmt_descriptor,
373 (struct usb_descriptor_header *) &gs_acm_descriptor,
374 (struct usb_descriptor_header *) &gs_union_desc,
375 (struct usb_descriptor_header *) &gs_fullspeed_notify_desc,
376 (struct usb_descriptor_header *) &gs_data_interface_desc,
377 (struct usb_descriptor_header *) &gs_fullspeed_in_desc,
378 (struct usb_descriptor_header *) &gs_fullspeed_out_desc,
379 NULL,
380};
381 86
382static struct usb_endpoint_descriptor gs_highspeed_notify_desc = { 87 /* REVISIT SRP-only hardware is possible, although
383 .bLength = USB_DT_ENDPOINT_SIZE, 88 * it would not be called "OTG" ...
384 .bDescriptorType = USB_DT_ENDPOINT, 89 */
385 .bEndpointAddress = USB_DIR_IN, 90 .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
386 .bmAttributes = USB_ENDPOINT_XFER_INT,
387 .wMaxPacketSize = __constant_cpu_to_le16(GS_NOTIFY_MAXPACKET),
388 .bInterval = GS_LOG2_NOTIFY_INTERVAL+4,
389};
390
391static struct usb_endpoint_descriptor gs_highspeed_in_desc = {
392 .bLength = USB_DT_ENDPOINT_SIZE,
393 .bDescriptorType = USB_DT_ENDPOINT,
394 .bmAttributes = USB_ENDPOINT_XFER_BULK,
395 .wMaxPacketSize = __constant_cpu_to_le16(512),
396};
397
398static struct usb_endpoint_descriptor gs_highspeed_out_desc = {
399 .bLength = USB_DT_ENDPOINT_SIZE,
400 .bDescriptorType = USB_DT_ENDPOINT,
401 .bmAttributes = USB_ENDPOINT_XFER_BULK,
402 .wMaxPacketSize = __constant_cpu_to_le16(512),
403};
404
405static struct usb_qualifier_descriptor gs_qualifier_desc = {
406 .bLength = sizeof(struct usb_qualifier_descriptor),
407 .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
408 .bcdUSB = __constant_cpu_to_le16 (0x0200),
409 /* assumes ep0 uses the same value for both speeds ... */
410 .bNumConfigurations = GS_NUM_CONFIGS,
411};
412
413static const struct usb_descriptor_header *gs_bulk_highspeed_function[] = {
414 (struct usb_descriptor_header *) &gs_otg_descriptor,
415 (struct usb_descriptor_header *) &gs_bulk_interface_desc,
416 (struct usb_descriptor_header *) &gs_highspeed_in_desc,
417 (struct usb_descriptor_header *) &gs_highspeed_out_desc,
418 NULL,
419}; 91};
420 92
421static const struct usb_descriptor_header *gs_acm_highspeed_function[] = { 93static const struct usb_descriptor_header *otg_desc[] = {
422 (struct usb_descriptor_header *) &gs_otg_descriptor, 94 (struct usb_descriptor_header *) &otg_descriptor,
423 (struct usb_descriptor_header *) &gs_control_interface_desc,
424 (struct usb_descriptor_header *) &gs_header_desc,
425 (struct usb_descriptor_header *) &gs_call_mgmt_descriptor,
426 (struct usb_descriptor_header *) &gs_acm_descriptor,
427 (struct usb_descriptor_header *) &gs_union_desc,
428 (struct usb_descriptor_header *) &gs_highspeed_notify_desc,
429 (struct usb_descriptor_header *) &gs_data_interface_desc,
430 (struct usb_descriptor_header *) &gs_highspeed_in_desc,
431 (struct usb_descriptor_header *) &gs_highspeed_out_desc,
432 NULL, 95 NULL,
433}; 96};
434 97
435
436/*-------------------------------------------------------------------------*/ 98/*-------------------------------------------------------------------------*/
437 99
438/* Module */ 100/* Module */
439MODULE_DESCRIPTION(GS_LONG_NAME); 101MODULE_DESCRIPTION(GS_VERSION_NAME);
440MODULE_AUTHOR("Al Borchers"); 102MODULE_AUTHOR("Al Borchers");
103MODULE_AUTHOR("David Brownell");
441MODULE_LICENSE("GPL"); 104MODULE_LICENSE("GPL");
442 105
443#ifdef DEBUG 106static int use_acm = true;
444module_param(debug, int, S_IRUGO|S_IWUSR); 107module_param(use_acm, bool, 0);
445MODULE_PARM_DESC(debug, "Enable debugging, 0=off, 1=on"); 108MODULE_PARM_DESC(use_acm, "Use CDC ACM, default=yes");
446#endif
447
448static unsigned int read_q_size = GS_DEFAULT_READ_Q_SIZE;
449module_param(read_q_size, uint, S_IRUGO);
450MODULE_PARM_DESC(read_q_size, "Read request queue size, default=32");
451
452static unsigned int write_q_size = GS_DEFAULT_WRITE_Q_SIZE;
453module_param(write_q_size, uint, S_IRUGO);
454MODULE_PARM_DESC(write_q_size, "Write request queue size, default=32");
455 109
456static unsigned int write_buf_size = GS_DEFAULT_WRITE_BUF_SIZE; 110static unsigned n_ports = 1;
457module_param(write_buf_size, uint, S_IRUGO); 111module_param(n_ports, uint, 0);
458MODULE_PARM_DESC(write_buf_size, "Write buffer size, default=8192"); 112MODULE_PARM_DESC(n_ports, "number of ports to create, default=1");
459
460static unsigned int use_acm = GS_DEFAULT_USE_ACM;
461module_param(use_acm, uint, S_IRUGO);
462MODULE_PARM_DESC(use_acm, "Use CDC ACM, 0=no, 1=yes, default=no");
463 113
464/*-------------------------------------------------------------------------*/ 114/*-------------------------------------------------------------------------*/
465 115
466/* TTY Driver */ 116static int __init serial_bind_config(struct usb_configuration *c)
467
468/*
469 * gs_open
470 */
471static int gs_open(struct tty_struct *tty, struct file *file)
472{
473 int port_num;
474 unsigned long flags;
475 struct gs_port *port;
476 struct gs_dev *dev;
477 struct gs_buf *buf;
478 struct mutex *mtx;
479 int ret;
480
481 port_num = tty->index;
482
483 gs_debug("gs_open: (%d,%p,%p)\n", port_num, tty, file);
484
485 if (port_num < 0 || port_num >= GS_NUM_PORTS) {
486 pr_err("gs_open: (%d,%p,%p) invalid port number\n",
487 port_num, tty, file);
488 return -ENODEV;
489 }
490
491 dev = gs_device;
492
493 if (dev == NULL) {
494 pr_err("gs_open: (%d,%p,%p) NULL device pointer\n",
495 port_num, tty, file);
496 return -ENODEV;
497 }
498
499 mtx = &gs_open_close_lock[port_num];
500 if (mutex_lock_interruptible(mtx)) {
501 pr_err("gs_open: (%d,%p,%p) interrupted waiting for mutex\n",
502 port_num, tty, file);
503 return -ERESTARTSYS;
504 }
505
506 spin_lock_irqsave(&dev->dev_lock, flags);
507
508 if (dev->dev_config == GS_NO_CONFIG_ID) {
509 pr_err("gs_open: (%d,%p,%p) device is not connected\n",
510 port_num, tty, file);
511 ret = -ENODEV;
512 goto exit_unlock_dev;
513 }
514
515 port = dev->dev_port[port_num];
516
517 if (port == NULL) {
518 pr_err("gs_open: (%d,%p,%p) NULL port pointer\n",
519 port_num, tty, file);
520 ret = -ENODEV;
521 goto exit_unlock_dev;
522 }
523
524 spin_lock(&port->port_lock);
525 spin_unlock(&dev->dev_lock);
526
527 if (port->port_dev == NULL) {
528 pr_err("gs_open: (%d,%p,%p) port disconnected (1)\n",
529 port_num, tty, file);
530 ret = -EIO;
531 goto exit_unlock_port;
532 }
533
534 if (port->port_open_count > 0) {
535 ++port->port_open_count;
536 gs_debug("gs_open: (%d,%p,%p) already open\n",
537 port_num, tty, file);
538 ret = 0;
539 goto exit_unlock_port;
540 }
541
542 tty->driver_data = NULL;
543
544 /* mark port as in use, we can drop port lock and sleep if necessary */
545 port->port_in_use = 1;
546
547 /* allocate write buffer on first open */
548 if (port->port_write_buf == NULL) {
549 spin_unlock_irqrestore(&port->port_lock, flags);
550 buf = gs_buf_alloc(write_buf_size, GFP_KERNEL);
551 spin_lock_irqsave(&port->port_lock, flags);
552
553 /* might have been disconnected while asleep, check */
554 if (port->port_dev == NULL) {
555 pr_err("gs_open: (%d,%p,%p) port disconnected (2)\n",
556 port_num, tty, file);
557 port->port_in_use = 0;
558 ret = -EIO;
559 goto exit_unlock_port;
560 }
561
562 if ((port->port_write_buf=buf) == NULL) {
563 pr_err("gs_open: (%d,%p,%p) cannot allocate "
564 "port write buffer\n",
565 port_num, tty, file);
566 port->port_in_use = 0;
567 ret = -ENOMEM;
568 goto exit_unlock_port;
569 }
570
571 }
572
573 /* wait for carrier detect (not implemented) */
574
575 /* might have been disconnected while asleep, check */
576 if (port->port_dev == NULL) {
577 pr_err("gs_open: (%d,%p,%p) port disconnected (3)\n",
578 port_num, tty, file);
579 port->port_in_use = 0;
580 ret = -EIO;
581 goto exit_unlock_port;
582 }
583
584 tty->driver_data = port;
585 port->port_tty = tty;
586 port->port_open_count = 1;
587 port->port_in_use = 0;
588
589 gs_debug("gs_open: (%d,%p,%p) completed\n", port_num, tty, file);
590
591 ret = 0;
592
593exit_unlock_port:
594 spin_unlock_irqrestore(&port->port_lock, flags);
595 mutex_unlock(mtx);
596 return ret;
597
598exit_unlock_dev:
599 spin_unlock_irqrestore(&dev->dev_lock, flags);
600 mutex_unlock(mtx);
601 return ret;
602
603}
604
605/*
606 * gs_close
607 */
608
609static int gs_write_finished_event_safely(struct gs_port *p)
610{
611 int cond;
612
613 spin_lock_irq(&(p)->port_lock);
614 cond = !(p)->port_dev || !gs_buf_data_avail((p)->port_write_buf);
615 spin_unlock_irq(&(p)->port_lock);
616 return cond;
617}
618
619static void gs_close(struct tty_struct *tty, struct file *file)
620{
621 struct gs_port *port = tty->driver_data;
622 struct mutex *mtx;
623
624 if (port == NULL) {
625 pr_err("gs_close: NULL port pointer\n");
626 return;
627 }
628
629 gs_debug("gs_close: (%d,%p,%p)\n", port->port_num, tty, file);
630
631 mtx = &gs_open_close_lock[port->port_num];
632 mutex_lock(mtx);
633
634 spin_lock_irq(&port->port_lock);
635
636 if (port->port_open_count == 0) {
637 pr_err("gs_close: (%d,%p,%p) port is already closed\n",
638 port->port_num, tty, file);
639 goto exit;
640 }
641
642 if (port->port_open_count > 1) {
643 --port->port_open_count;
644 goto exit;
645 }
646
647 /* free disconnected port on final close */
648 if (port->port_dev == NULL) {
649 kfree(port);
650 goto exit;
651 }
652
653 /* mark port as closed but in use, we can drop port lock */
654 /* and sleep if necessary */
655 port->port_in_use = 1;
656 port->port_open_count = 0;
657
658 /* wait for write buffer to drain, or */
659 /* at most GS_CLOSE_TIMEOUT seconds */
660 if (gs_buf_data_avail(port->port_write_buf) > 0) {
661 spin_unlock_irq(&port->port_lock);
662 wait_event_interruptible_timeout(port->port_write_wait,
663 gs_write_finished_event_safely(port),
664 GS_CLOSE_TIMEOUT * HZ);
665 spin_lock_irq(&port->port_lock);
666 }
667
668 /* free disconnected port on final close */
669 /* (might have happened during the above sleep) */
670 if (port->port_dev == NULL) {
671 kfree(port);
672 goto exit;
673 }
674
675 gs_buf_clear(port->port_write_buf);
676
677 tty->driver_data = NULL;
678 port->port_tty = NULL;
679 port->port_in_use = 0;
680
681 gs_debug("gs_close: (%d,%p,%p) completed\n",
682 port->port_num, tty, file);
683
684exit:
685 spin_unlock_irq(&port->port_lock);
686 mutex_unlock(mtx);
687}
688
689/*
690 * gs_write
691 */
692static int gs_write(struct tty_struct *tty, const unsigned char *buf, int count)
693{ 117{
694 unsigned long flags; 118 unsigned i;
695 struct gs_port *port = tty->driver_data; 119 int status = 0;
696 int ret;
697
698 if (port == NULL) {
699 pr_err("gs_write: NULL port pointer\n");
700 return -EIO;
701 }
702
703 gs_debug("gs_write: (%d,%p) writing %d bytes\n", port->port_num, tty,
704 count);
705
706 if (count == 0)
707 return 0;
708
709 spin_lock_irqsave(&port->port_lock, flags);
710
711 if (port->port_dev == NULL) {
712 pr_err("gs_write: (%d,%p) port is not connected\n",
713 port->port_num, tty);
714 ret = -EIO;
715 goto exit;
716 }
717
718 if (port->port_open_count == 0) {
719 pr_err("gs_write: (%d,%p) port is closed\n",
720 port->port_num, tty);
721 ret = -EBADF;
722 goto exit;
723 }
724
725 count = gs_buf_put(port->port_write_buf, buf, count);
726
727 spin_unlock_irqrestore(&port->port_lock, flags);
728
729 gs_send(gs_device);
730
731 gs_debug("gs_write: (%d,%p) wrote %d bytes\n", port->port_num, tty,
732 count);
733 120
734 return count; 121 for (i = 0; i < n_ports && status == 0; i++) {
735 122 if (use_acm)
736exit: 123 status = acm_bind_config(c, i);
737 spin_unlock_irqrestore(&port->port_lock, flags); 124 else
738 return ret; 125 status = gser_bind_config(c, i);
739}
740
741/*
742 * gs_put_char
743 */
744static int gs_put_char(struct tty_struct *tty, unsigned char ch)
745{
746 unsigned long flags;
747 struct gs_port *port = tty->driver_data;
748 int ret = 0;
749
750 if (port == NULL) {
751 pr_err("gs_put_char: NULL port pointer\n");
752 return 0;
753 }
754
755 gs_debug("gs_put_char: (%d,%p) char=0x%x, called from %p\n",
756 port->port_num, tty, ch, __builtin_return_address(0));
757
758 spin_lock_irqsave(&port->port_lock, flags);
759
760 if (port->port_dev == NULL) {
761 pr_err("gs_put_char: (%d,%p) port is not connected\n",
762 port->port_num, tty);
763 goto exit;
764 }
765
766 if (port->port_open_count == 0) {
767 pr_err("gs_put_char: (%d,%p) port is closed\n",
768 port->port_num, tty);
769 goto exit;
770 }
771
772 ret = gs_buf_put(port->port_write_buf, &ch, 1);
773
774exit:
775 spin_unlock_irqrestore(&port->port_lock, flags);
776 return ret;
777}
778
779/*
780 * gs_flush_chars
781 */
782static void gs_flush_chars(struct tty_struct *tty)
783{
784 unsigned long flags;
785 struct gs_port *port = tty->driver_data;
786
787 if (port == NULL) {
788 pr_err("gs_flush_chars: NULL port pointer\n");
789 return;
790 }
791
792 gs_debug("gs_flush_chars: (%d,%p)\n", port->port_num, tty);
793
794 spin_lock_irqsave(&port->port_lock, flags);
795
796 if (port->port_dev == NULL) {
797 pr_err("gs_flush_chars: (%d,%p) port is not connected\n",
798 port->port_num, tty);
799 goto exit;
800 }
801
802 if (port->port_open_count == 0) {
803 pr_err("gs_flush_chars: (%d,%p) port is closed\n",
804 port->port_num, tty);
805 goto exit;
806 }
807
808 spin_unlock_irqrestore(&port->port_lock, flags);
809
810 gs_send(gs_device);
811
812 return;
813
814exit:
815 spin_unlock_irqrestore(&port->port_lock, flags);
816}
817
818/*
819 * gs_write_room
820 */
821static int gs_write_room(struct tty_struct *tty)
822{
823
824 int room = 0;
825 unsigned long flags;
826 struct gs_port *port = tty->driver_data;
827
828
829 if (port == NULL)
830 return 0;
831
832 spin_lock_irqsave(&port->port_lock, flags);
833
834 if (port->port_dev != NULL && port->port_open_count > 0
835 && port->port_write_buf != NULL)
836 room = gs_buf_space_avail(port->port_write_buf);
837
838 spin_unlock_irqrestore(&port->port_lock, flags);
839
840 gs_debug("gs_write_room: (%d,%p) room=%d\n",
841 port->port_num, tty, room);
842
843 return room;
844}
845
846/*
847 * gs_chars_in_buffer
848 */
849static int gs_chars_in_buffer(struct tty_struct *tty)
850{
851 int chars = 0;
852 unsigned long flags;
853 struct gs_port *port = tty->driver_data;
854
855 if (port == NULL)
856 return 0;
857
858 spin_lock_irqsave(&port->port_lock, flags);
859
860 if (port->port_dev != NULL && port->port_open_count > 0
861 && port->port_write_buf != NULL)
862 chars = gs_buf_data_avail(port->port_write_buf);
863
864 spin_unlock_irqrestore(&port->port_lock, flags);
865
866 gs_debug("gs_chars_in_buffer: (%d,%p) chars=%d\n",
867 port->port_num, tty, chars);
868
869 return chars;
870}
871
872/*
873 * gs_throttle
874 */
875static void gs_throttle(struct tty_struct *tty)
876{
877}
878
879/*
880 * gs_unthrottle
881 */
882static void gs_unthrottle(struct tty_struct *tty)
883{
884}
885
886/*
887 * gs_break
888 */
889static void gs_break(struct tty_struct *tty, int break_state)
890{
891}
892
893/*
894 * gs_ioctl
895 */
896static int gs_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
897{
898 struct gs_port *port = tty->driver_data;
899
900 if (port == NULL) {
901 pr_err("gs_ioctl: NULL port pointer\n");
902 return -EIO;
903 } 126 }
904 127 return status;
905 gs_debug("gs_ioctl: (%d,%p,%p) cmd=0x%4.4x, arg=%lu\n",
906 port->port_num, tty, file, cmd, arg);
907
908 /* handle ioctls */
909
910 /* could not handle ioctl */
911 return -ENOIOCTLCMD;
912}
913
914/*
915 * gs_set_termios
916 */
917static void gs_set_termios(struct tty_struct *tty, struct ktermios *old)
918{
919} 128}
920 129
921static const struct tty_operations gs_tty_ops = { 130static struct usb_configuration serial_config_driver = {
922 .open = gs_open, 131 /* .label = f(use_acm) */
923 .close = gs_close, 132 .bind = serial_bind_config,
924 .write = gs_write, 133 /* .bConfigurationValue = f(use_acm) */
925 .put_char = gs_put_char, 134 /* .iConfiguration = DYNAMIC */
926 .flush_chars = gs_flush_chars, 135 .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
927 .write_room = gs_write_room, 136 .bMaxPower = 1, /* 2 mA, minimal */
928 .ioctl = gs_ioctl,
929 .set_termios = gs_set_termios,
930 .throttle = gs_throttle,
931 .unthrottle = gs_unthrottle,
932 .break_ctl = gs_break,
933 .chars_in_buffer = gs_chars_in_buffer,
934}; 137};
935 138
936/*-------------------------------------------------------------------------*/ 139static int __init gs_bind(struct usb_composite_dev *cdev)
937
938/*
939* gs_send
940*
941* This function finds available write requests, calls
942* gs_send_packet to fill these packets with data, and
943* continues until either there are no more write requests
944* available or no more data to send. This function is
945* run whenever data arrives or write requests are available.
946*/
947static int gs_send(struct gs_dev *dev)
948{
949 int ret,len;
950 unsigned long flags;
951 struct usb_ep *ep;
952 struct usb_request *req;
953
954 if (dev == NULL) {
955 pr_err("gs_send: NULL device pointer\n");
956 return -ENODEV;
957 }
958
959 spin_lock_irqsave(&dev->dev_lock, flags);
960
961 ep = dev->dev_in_ep;
962
963 while(!list_empty(&dev->dev_req_list)) {
964
965 req = list_entry(dev->dev_req_list.next,
966 struct usb_request, list);
967
968 len = gs_send_packet(dev, req->buf, ep->maxpacket);
969
970 if (len > 0) {
971 gs_debug_level(3, "gs_send: len=%d, 0x%2.2x "
972 "0x%2.2x 0x%2.2x ...\n", len,
973 *((unsigned char *)req->buf),
974 *((unsigned char *)req->buf+1),
975 *((unsigned char *)req->buf+2));
976 list_del(&req->list);
977 req->length = len;
978 spin_unlock_irqrestore(&dev->dev_lock, flags);
979 if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) {
980 pr_err(
981 "gs_send: cannot queue read request, ret=%d\n",
982 ret);
983 spin_lock_irqsave(&dev->dev_lock, flags);
984 break;
985 }
986 spin_lock_irqsave(&dev->dev_lock, flags);
987 } else {
988 break;
989 }
990
991 }
992
993 spin_unlock_irqrestore(&dev->dev_lock, flags);
994
995 return 0;
996}
997
998/*
999 * gs_send_packet
1000 *
1001 * If there is data to send, a packet is built in the given
1002 * buffer and the size is returned. If there is no data to
1003 * send, 0 is returned. If there is any error a negative
1004 * error number is returned.
1005 *
1006 * Called during USB completion routine, on interrupt time.
1007 *
1008 * We assume that disconnect will not happen until all completion
1009 * routines have completed, so we can assume that the dev_port
1010 * array does not change during the lifetime of this function.
1011 */
1012static int gs_send_packet(struct gs_dev *dev, char *packet, unsigned int size)
1013{
1014 unsigned int len;
1015 struct gs_port *port;
1016
1017 /* TEMPORARY -- only port 0 is supported right now */
1018 port = dev->dev_port[0];
1019
1020 if (port == NULL) {
1021 pr_err("gs_send_packet: port=%d, NULL port pointer\n", 0);
1022 return -EIO;
1023 }
1024
1025 spin_lock(&port->port_lock);
1026
1027 len = gs_buf_data_avail(port->port_write_buf);
1028 if (len < size)
1029 size = len;
1030
1031 if (size == 0)
1032 goto exit;
1033
1034 size = gs_buf_get(port->port_write_buf, packet, size);
1035
1036 if (port->port_tty)
1037 wake_up_interruptible(&port->port_tty->write_wait);
1038
1039exit:
1040 spin_unlock(&port->port_lock);
1041 return size;
1042}
1043
1044/*
1045 * gs_recv_packet
1046 *
1047 * Called for each USB packet received. Reads the packet
1048 * header and stuffs the data in the appropriate tty buffer.
1049 * Returns 0 if successful, or a negative error number.
1050 *
1051 * Called during USB completion routine, on interrupt time.
1052 *
1053 * We assume that disconnect will not happen until all completion
1054 * routines have completed, so we can assume that the dev_port
1055 * array does not change during the lifetime of this function.
1056 */
1057static int gs_recv_packet(struct gs_dev *dev, char *packet, unsigned int size)
1058{
1059 unsigned int len;
1060 struct gs_port *port;
1061 int ret;
1062 struct tty_struct *tty;
1063
1064 /* TEMPORARY -- only port 0 is supported right now */
1065 port = dev->dev_port[0];
1066
1067 if (port == NULL) {
1068 pr_err("gs_recv_packet: port=%d, NULL port pointer\n",
1069 port->port_num);
1070 return -EIO;
1071 }
1072
1073 spin_lock(&port->port_lock);
1074
1075 if (port->port_open_count == 0) {
1076 pr_err("gs_recv_packet: port=%d, port is closed\n",
1077 port->port_num);
1078 ret = -EIO;
1079 goto exit;
1080 }
1081
1082
1083 tty = port->port_tty;
1084
1085 if (tty == NULL) {
1086 pr_err("gs_recv_packet: port=%d, NULL tty pointer\n",
1087 port->port_num);
1088 ret = -EIO;
1089 goto exit;
1090 }
1091
1092 if (port->port_tty->magic != TTY_MAGIC) {
1093 pr_err("gs_recv_packet: port=%d, bad tty magic\n",
1094 port->port_num);
1095 ret = -EIO;
1096 goto exit;
1097 }
1098
1099 len = tty_buffer_request_room(tty, size);
1100 if (len > 0) {
1101 tty_insert_flip_string(tty, packet, len);
1102 tty_flip_buffer_push(port->port_tty);
1103 wake_up_interruptible(&port->port_tty->read_wait);
1104 }
1105 ret = 0;
1106exit:
1107 spin_unlock(&port->port_lock);
1108 return ret;
1109}
1110
1111/*
1112* gs_read_complete
1113*/
1114static void gs_read_complete(struct usb_ep *ep, struct usb_request *req)
1115{ 140{
1116 int ret; 141 int gcnum;
1117 struct gs_dev *dev = ep->driver_data; 142 struct usb_gadget *gadget = cdev->gadget;
1118 143 int status;
1119 if (dev == NULL) {
1120 pr_err("gs_read_complete: NULL device pointer\n");
1121 return;
1122 }
1123 144
1124 switch(req->status) { 145 status = gserial_setup(cdev->gadget, n_ports);
1125 case 0: 146 if (status < 0)
1126 /* normal completion */ 147 return status;
1127 gs_recv_packet(dev, req->buf, req->actual);
1128requeue:
1129 req->length = ep->maxpacket;
1130 if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) {
1131 pr_err(
1132 "gs_read_complete: cannot queue read request, ret=%d\n",
1133 ret);
1134 }
1135 break;
1136
1137 case -ESHUTDOWN:
1138 /* disconnect */
1139 gs_debug("gs_read_complete: shutdown\n");
1140 gs_free_req(ep, req);
1141 break;
1142
1143 default:
1144 /* unexpected */
1145 pr_err(
1146 "gs_read_complete: unexpected status error, status=%d\n",
1147 req->status);
1148 goto requeue;
1149 break;
1150 }
1151}
1152
1153/*
1154* gs_write_complete
1155*/
1156static void gs_write_complete(struct usb_ep *ep, struct usb_request *req)
1157{
1158 struct gs_dev *dev = ep->driver_data;
1159
1160 if (dev == NULL) {
1161 pr_err("gs_write_complete: NULL device pointer\n");
1162 return;
1163 }
1164 148
1165 switch(req->status) { 149 /* Allocate string descriptor numbers ... note that string
1166 case 0: 150 * contents can be overridden by the composite_dev glue.
1167 /* normal completion */ 151 */
1168requeue:
1169 spin_lock(&dev->dev_lock);
1170 list_add(&req->list, &dev->dev_req_list);
1171 spin_unlock(&dev->dev_lock);
1172
1173 gs_send(dev);
1174
1175 break;
1176
1177 case -ESHUTDOWN:
1178 /* disconnect */
1179 gs_debug("gs_write_complete: shutdown\n");
1180 gs_free_req(ep, req);
1181 break;
1182
1183 default:
1184 pr_err(
1185 "gs_write_complete: unexpected status error, status=%d\n",
1186 req->status);
1187 goto requeue;
1188 break;
1189 }
1190}
1191 152
1192/*-------------------------------------------------------------------------*/ 153 /* device description: manufacturer, product */
154 snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
155 init_utsname()->sysname, init_utsname()->release,
156 gadget->name);
157 status = usb_string_id(cdev);
158 if (status < 0)
159 goto fail;
160 strings_dev[STRING_MANUFACTURER_IDX].id = status;
1193 161
1194/* Gadget Driver */ 162 device_desc.iManufacturer = status;
1195 163
1196/* 164 status = usb_string_id(cdev);
1197 * gs_unbind 165 if (status < 0)
1198 * 166 goto fail;
1199 * Called on module unload. Frees the control request and device 167 strings_dev[STRING_PRODUCT_IDX].id = status;
1200 * structure.
1201 */
1202static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget)
1203{
1204 struct gs_dev *dev = get_gadget_data(gadget);
1205 168
1206 gs_device = NULL; 169 device_desc.iProduct = status;
1207 170
1208 /* read/write requests already freed, only control request remains */ 171 /* config description */
1209 if (dev != NULL) { 172 status = usb_string_id(cdev);
1210 if (dev->dev_ctrl_req != NULL) { 173 if (status < 0)
1211 gs_free_req(gadget->ep0, dev->dev_ctrl_req); 174 goto fail;
1212 dev->dev_ctrl_req = NULL; 175 strings_dev[STRING_DESCRIPTION_IDX].id = status;
1213 }
1214 gs_reset_config(dev);
1215 gs_free_ports(dev);
1216 kfree(dev);
1217 set_gadget_data(gadget, NULL);
1218 }
1219 176
1220 pr_info("gs_unbind: %s %s unbound\n", GS_LONG_NAME, 177 serial_config_driver.iConfiguration = status;
1221 GS_VERSION_STR);
1222}
1223
1224/*
1225 * gs_bind
1226 *
1227 * Called on module load. Allocates and initializes the device
1228 * structure and a control request.
1229 */
1230static int __init gs_bind(struct usb_gadget *gadget)
1231{
1232 int ret;
1233 struct usb_ep *ep;
1234 struct gs_dev *dev;
1235 int gcnum;
1236
1237 /* Some controllers can't support CDC ACM:
1238 * - sh doesn't support multiple interfaces or configs;
1239 * - sa1100 doesn't have a third interrupt endpoint
1240 */
1241 if (gadget_is_sh(gadget) || gadget_is_sa1100(gadget))
1242 use_acm = 0;
1243 178
179 /* set up other descriptors */
1244 gcnum = usb_gadget_controller_number(gadget); 180 gcnum = usb_gadget_controller_number(gadget);
1245 if (gcnum >= 0) 181 if (gcnum >= 0)
1246 gs_device_desc.bcdDevice = 182 device_desc.bcdDevice = cpu_to_le16(GS_VERSION_NUM | gcnum);
1247 cpu_to_le16(GS_VERSION_NUM | gcnum);
1248 else { 183 else {
184 /* this is so simple (for now, no altsettings) that it
185 * SHOULD NOT have problems with bulk-capable hardware.
186 * so warn about unrcognized controllers -- don't panic.
187 *
188 * things like configuration and altsetting numbering
189 * can need hardware-specific attention though.
190 */
1249 pr_warning("gs_bind: controller '%s' not recognized\n", 191 pr_warning("gs_bind: controller '%s' not recognized\n",
1250 gadget->name); 192 gadget->name);
1251 /* unrecognized, but safe unless bulk is REALLY quirky */ 193 device_desc.bcdDevice =
1252 gs_device_desc.bcdDevice = 194 __constant_cpu_to_le16(GS_VERSION_NUM | 0x0099);
1253 __constant_cpu_to_le16(GS_VERSION_NUM|0x0099);
1254 }
1255
1256 dev = kzalloc(sizeof(struct gs_dev), GFP_KERNEL);
1257 if (dev == NULL)
1258 return -ENOMEM;
1259
1260 usb_ep_autoconfig_reset(gadget);
1261
1262 ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc);
1263 if (!ep)
1264 goto autoconf_fail;
1265 dev->dev_in_ep = ep;
1266 ep->driver_data = dev; /* claim the endpoint */
1267
1268 ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc);
1269 if (!ep)
1270 goto autoconf_fail;
1271 dev->dev_out_ep = ep;
1272 ep->driver_data = dev; /* claim the endpoint */
1273
1274 if (use_acm) {
1275 ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc);
1276 if (!ep) {
1277 pr_err("gs_bind: cannot run ACM on %s\n", gadget->name);
1278 goto autoconf_fail;
1279 }
1280 gs_device_desc.idProduct = __constant_cpu_to_le16(
1281 GS_CDC_PRODUCT_ID),
1282 dev->dev_notify_ep = ep;
1283 ep->driver_data = dev; /* claim the endpoint */
1284 }
1285
1286 gs_device_desc.bDeviceClass = use_acm
1287 ? USB_CLASS_COMM : USB_CLASS_VENDOR_SPEC;
1288 gs_device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
1289
1290 if (gadget_is_dualspeed(gadget)) {
1291 gs_qualifier_desc.bDeviceClass = use_acm
1292 ? USB_CLASS_COMM : USB_CLASS_VENDOR_SPEC;
1293 /* assume ep0 uses the same packet size for both speeds */
1294 gs_qualifier_desc.bMaxPacketSize0 =
1295 gs_device_desc.bMaxPacketSize0;
1296 /* assume endpoints are dual-speed */
1297 gs_highspeed_notify_desc.bEndpointAddress =
1298 gs_fullspeed_notify_desc.bEndpointAddress;
1299 gs_highspeed_in_desc.bEndpointAddress =
1300 gs_fullspeed_in_desc.bEndpointAddress;
1301 gs_highspeed_out_desc.bEndpointAddress =
1302 gs_fullspeed_out_desc.bEndpointAddress;
1303 }
1304
1305 usb_gadget_set_selfpowered(gadget);
1306
1307 if (gadget_is_otg(gadget)) {
1308 gs_otg_descriptor.bmAttributes |= USB_OTG_HNP,
1309 gs_bulk_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1310 gs_acm_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1311 } 195 }
1312 196
1313 gs_device = dev; 197 if (gadget_is_otg(cdev->gadget)) {
1314 198 serial_config_driver.descriptors = otg_desc;
1315 snprintf(manufacturer, sizeof(manufacturer), "%s %s with %s", 199 serial_config_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1316 init_utsname()->sysname, init_utsname()->release,
1317 gadget->name);
1318
1319 dev->dev_gadget = gadget;
1320 spin_lock_init(&dev->dev_lock);
1321 INIT_LIST_HEAD(&dev->dev_req_list);
1322 set_gadget_data(gadget, dev);
1323
1324 if ((ret=gs_alloc_ports(dev, GFP_KERNEL)) != 0) {
1325 pr_err("gs_bind: cannot allocate ports\n");
1326 gs_unbind(gadget);
1327 return ret;
1328 } 200 }
1329 201
1330 /* preallocate control response and buffer */ 202 /* register our configuration */
1331 dev->dev_ctrl_req = gs_alloc_req(gadget->ep0, GS_MAX_DESC_LEN, 203 status = usb_add_config(cdev, &serial_config_driver);
1332 GFP_KERNEL); 204 if (status < 0)
1333 if (dev->dev_ctrl_req == NULL) { 205 goto fail;
1334 gs_unbind(gadget);
1335 return -ENOMEM;
1336 }
1337 gadget->ep0->driver_data = dev;
1338 206
1339 pr_info("gs_bind: %s %s bound\n", 207 INFO(cdev, "%s\n", GS_VERSION_NAME);
1340 GS_LONG_NAME, GS_VERSION_STR);
1341 208
1342 return 0; 209 return 0;
1343 210
1344autoconf_fail: 211fail:
1345 kfree(dev); 212 gserial_cleanup();
1346 pr_err("gs_bind: cannot autoconfigure on %s\n", gadget->name); 213 return status;
1347 return -ENODEV;
1348}
1349
1350static int gs_setup_standard(struct usb_gadget *gadget,
1351 const struct usb_ctrlrequest *ctrl)
1352{
1353 int ret = -EOPNOTSUPP;
1354 struct gs_dev *dev = get_gadget_data(gadget);
1355 struct usb_request *req = dev->dev_ctrl_req;
1356 u16 wIndex = le16_to_cpu(ctrl->wIndex);
1357 u16 wValue = le16_to_cpu(ctrl->wValue);
1358 u16 wLength = le16_to_cpu(ctrl->wLength);
1359
1360 switch (ctrl->bRequest) {
1361 case USB_REQ_GET_DESCRIPTOR:
1362 if (ctrl->bRequestType != USB_DIR_IN)
1363 break;
1364
1365 switch (wValue >> 8) {
1366 case USB_DT_DEVICE:
1367 ret = min(wLength,
1368 (u16)sizeof(struct usb_device_descriptor));
1369 memcpy(req->buf, &gs_device_desc, ret);
1370 break;
1371
1372 case USB_DT_DEVICE_QUALIFIER:
1373 if (!gadget_is_dualspeed(gadget))
1374 break;
1375 ret = min(wLength,
1376 (u16)sizeof(struct usb_qualifier_descriptor));
1377 memcpy(req->buf, &gs_qualifier_desc, ret);
1378 break;
1379
1380 case USB_DT_OTHER_SPEED_CONFIG:
1381 if (!gadget_is_dualspeed(gadget))
1382 break;
1383 /* fall through */
1384 case USB_DT_CONFIG:
1385 ret = gs_build_config_buf(req->buf, gadget,
1386 wValue >> 8, wValue & 0xff,
1387 gadget_is_otg(gadget));
1388 if (ret >= 0)
1389 ret = min(wLength, (u16)ret);
1390 break;
1391
1392 case USB_DT_STRING:
1393 /* wIndex == language code. */
1394 ret = usb_gadget_get_string(&gs_string_table,
1395 wValue & 0xff, req->buf);
1396 if (ret >= 0)
1397 ret = min(wLength, (u16)ret);
1398 break;
1399 }
1400 break;
1401
1402 case USB_REQ_SET_CONFIGURATION:
1403 if (ctrl->bRequestType != 0)
1404 break;
1405 spin_lock(&dev->dev_lock);
1406 ret = gs_set_config(dev, wValue);
1407 spin_unlock(&dev->dev_lock);
1408 break;
1409
1410 case USB_REQ_GET_CONFIGURATION:
1411 if (ctrl->bRequestType != USB_DIR_IN)
1412 break;
1413 *(u8 *)req->buf = dev->dev_config;
1414 ret = min(wLength, (u16)1);
1415 break;
1416
1417 case USB_REQ_SET_INTERFACE:
1418 if (ctrl->bRequestType != USB_RECIP_INTERFACE
1419 || !dev->dev_config
1420 || wIndex >= GS_MAX_NUM_INTERFACES)
1421 break;
1422 if (dev->dev_config == GS_BULK_CONFIG_ID
1423 && wIndex != GS_BULK_INTERFACE_ID)
1424 break;
1425 /* no alternate interface settings */
1426 if (wValue != 0)
1427 break;
1428 spin_lock(&dev->dev_lock);
1429 /* PXA hardware partially handles SET_INTERFACE;
1430 * we need to kluge around that interference. */
1431 if (gadget_is_pxa(gadget)) {
1432 ret = gs_set_config(dev, use_acm ?
1433 GS_ACM_CONFIG_ID : GS_BULK_CONFIG_ID);
1434 goto set_interface_done;
1435 }
1436 if (dev->dev_config != GS_BULK_CONFIG_ID
1437 && wIndex == GS_CONTROL_INTERFACE_ID) {
1438 if (dev->dev_notify_ep) {
1439 usb_ep_disable(dev->dev_notify_ep);
1440 usb_ep_enable(dev->dev_notify_ep, dev->dev_notify_ep_desc);
1441 }
1442 } else {
1443 usb_ep_disable(dev->dev_in_ep);
1444 usb_ep_disable(dev->dev_out_ep);
1445 usb_ep_enable(dev->dev_in_ep, dev->dev_in_ep_desc);
1446 usb_ep_enable(dev->dev_out_ep, dev->dev_out_ep_desc);
1447 }
1448 ret = 0;
1449set_interface_done:
1450 spin_unlock(&dev->dev_lock);
1451 break;
1452
1453 case USB_REQ_GET_INTERFACE:
1454 if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)
1455 || dev->dev_config == GS_NO_CONFIG_ID)
1456 break;
1457 if (wIndex >= GS_MAX_NUM_INTERFACES
1458 || (dev->dev_config == GS_BULK_CONFIG_ID
1459 && wIndex != GS_BULK_INTERFACE_ID)) {
1460 ret = -EDOM;
1461 break;
1462 }
1463 /* no alternate interface settings */
1464 *(u8 *)req->buf = 0;
1465 ret = min(wLength, (u16)1);
1466 break;
1467
1468 default:
1469 pr_err("gs_setup: unknown standard request, type=%02x, "
1470 "request=%02x, value=%04x, index=%04x, length=%d\n",
1471 ctrl->bRequestType, ctrl->bRequest,
1472 wValue, wIndex, wLength);
1473 break;
1474 }
1475
1476 return ret;
1477} 214}
1478 215
1479static void gs_setup_complete_set_line_coding(struct usb_ep *ep, 216static struct usb_composite_driver gserial_driver = {
1480 struct usb_request *req) 217 .name = "g_serial",
1481{ 218 .dev = &device_desc,
1482 struct gs_dev *dev = ep->driver_data; 219 .strings = dev_strings,
1483 struct gs_port *port = dev->dev_port[0]; /* ACM only has one port */ 220 .bind = gs_bind,
1484
1485 switch (req->status) {
1486 case 0:
1487 /* normal completion */
1488 if (req->actual != sizeof(port->port_line_coding))
1489 usb_ep_set_halt(ep);
1490 else if (port) {
1491 struct usb_cdc_line_coding *value = req->buf;
1492
1493 /* REVISIT: we currently just remember this data.
1494 * If we change that, (a) validate it first, then
1495 * (b) update whatever hardware needs updating.
1496 */
1497 spin_lock(&port->port_lock);
1498 port->port_line_coding = *value;
1499 spin_unlock(&port->port_lock);
1500 }
1501 break;
1502
1503 case -ESHUTDOWN:
1504 /* disconnect */
1505 gs_free_req(ep, req);
1506 break;
1507
1508 default:
1509 /* unexpected */
1510 break;
1511 }
1512 return;
1513}
1514
1515static int gs_setup_class(struct usb_gadget *gadget,
1516 const struct usb_ctrlrequest *ctrl)
1517{
1518 int ret = -EOPNOTSUPP;
1519 struct gs_dev *dev = get_gadget_data(gadget);
1520 struct gs_port *port = dev->dev_port[0]; /* ACM only has one port */
1521 struct usb_request *req = dev->dev_ctrl_req;
1522 u16 wIndex = le16_to_cpu(ctrl->wIndex);
1523 u16 wValue = le16_to_cpu(ctrl->wValue);
1524 u16 wLength = le16_to_cpu(ctrl->wLength);
1525
1526 switch (ctrl->bRequest) {
1527 case USB_CDC_REQ_SET_LINE_CODING:
1528 if (wLength != sizeof(struct usb_cdc_line_coding))
1529 break;
1530 ret = wLength;
1531 req->complete = gs_setup_complete_set_line_coding;
1532 break;
1533
1534 case USB_CDC_REQ_GET_LINE_CODING:
1535 ret = min_t(int, wLength, sizeof(struct usb_cdc_line_coding));
1536 if (port) {
1537 spin_lock(&port->port_lock);
1538 memcpy(req->buf, &port->port_line_coding, ret);
1539 spin_unlock(&port->port_lock);
1540 }
1541 break;
1542
1543 case USB_CDC_REQ_SET_CONTROL_LINE_STATE:
1544 if (wLength != 0)
1545 break;
1546 ret = 0;
1547 if (port) {
1548 /* REVISIT: we currently just remember this data.
1549 * If we change that, update whatever hardware needs
1550 * updating.
1551 */
1552 spin_lock(&port->port_lock);
1553 port->port_handshake_bits = wValue;
1554 spin_unlock(&port->port_lock);
1555 }
1556 break;
1557
1558 default:
1559 /* NOTE: strictly speaking, we should accept AT-commands
1560 * using SEND_ENCPSULATED_COMMAND/GET_ENCAPSULATED_RESPONSE.
1561 * But our call management descriptor says we don't handle
1562 * call management, so we should be able to get by without
1563 * handling those "required" commands (except by stalling).
1564 */
1565 pr_err("gs_setup: unknown class request, "
1566 "type=%02x, request=%02x, value=%04x, "
1567 "index=%04x, length=%d\n",
1568 ctrl->bRequestType, ctrl->bRequest,
1569 wValue, wIndex, wLength);
1570 break;
1571 }
1572
1573 return ret;
1574}
1575
1576/*
1577 * gs_setup_complete
1578 */
1579static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req)
1580{
1581 if (req->status || req->actual != req->length) {
1582 pr_err("gs_setup_complete: status error, status=%d, "
1583 "actual=%d, length=%d\n",
1584 req->status, req->actual, req->length);
1585 }
1586}
1587
1588/*
1589 * gs_setup
1590 *
1591 * Implements all the control endpoint functionality that's not
1592 * handled in hardware or the hardware driver.
1593 *
1594 * Returns the size of the data sent to the host, or a negative
1595 * error number.
1596 */
1597static int gs_setup(struct usb_gadget *gadget,
1598 const struct usb_ctrlrequest *ctrl)
1599{
1600 int ret = -EOPNOTSUPP;
1601 struct gs_dev *dev = get_gadget_data(gadget);
1602 struct usb_request *req = dev->dev_ctrl_req;
1603 u16 wIndex = le16_to_cpu(ctrl->wIndex);
1604 u16 wValue = le16_to_cpu(ctrl->wValue);
1605 u16 wLength = le16_to_cpu(ctrl->wLength);
1606
1607 req->complete = gs_setup_complete;
1608
1609 switch (ctrl->bRequestType & USB_TYPE_MASK) {
1610 case USB_TYPE_STANDARD:
1611 ret = gs_setup_standard(gadget, ctrl);
1612 break;
1613
1614 case USB_TYPE_CLASS:
1615 ret = gs_setup_class(gadget, ctrl);
1616 break;
1617
1618 default:
1619 pr_err("gs_setup: unknown request, type=%02x, request=%02x, "
1620 "value=%04x, index=%04x, length=%d\n",
1621 ctrl->bRequestType, ctrl->bRequest,
1622 wValue, wIndex, wLength);
1623 break;
1624 }
1625
1626 /* respond with data transfer before status phase? */
1627 if (ret >= 0) {
1628 req->length = ret;
1629 req->zero = ret < wLength
1630 && (ret % gadget->ep0->maxpacket) == 0;
1631 ret = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC);
1632 if (ret < 0) {
1633 pr_err("gs_setup: cannot queue response, ret=%d\n",
1634 ret);
1635 req->status = 0;
1636 gs_setup_complete(gadget->ep0, req);
1637 }
1638 }
1639
1640 /* device either stalls (ret < 0) or reports success */
1641 return ret;
1642}
1643
1644/*
1645 * gs_disconnect
1646 *
1647 * Called when the device is disconnected. Frees the closed
1648 * ports and disconnects open ports. Open ports will be freed
1649 * on close. Then reallocates the ports for the next connection.
1650 */
1651static void gs_disconnect(struct usb_gadget *gadget)
1652{
1653 unsigned long flags;
1654 struct gs_dev *dev = get_gadget_data(gadget);
1655
1656 spin_lock_irqsave(&dev->dev_lock, flags);
1657
1658 gs_reset_config(dev);
1659
1660 /* free closed ports and disconnect open ports */
1661 /* (open ports will be freed when closed) */
1662 gs_free_ports(dev);
1663
1664 /* re-allocate ports for the next connection */
1665 if (gs_alloc_ports(dev, GFP_ATOMIC) != 0)
1666 pr_err("gs_disconnect: cannot re-allocate ports\n");
1667
1668 spin_unlock_irqrestore(&dev->dev_lock, flags);
1669
1670 pr_info("gs_disconnect: %s disconnected\n", GS_LONG_NAME);
1671}
1672
1673static struct usb_gadget_driver gs_gadget_driver = {
1674#ifdef CONFIG_USB_GADGET_DUALSPEED
1675 .speed = USB_SPEED_HIGH,
1676#else
1677 .speed = USB_SPEED_FULL,
1678#endif /* CONFIG_USB_GADGET_DUALSPEED */
1679 .function = GS_LONG_NAME,
1680 .bind = gs_bind,
1681 .unbind = gs_unbind,
1682 .setup = gs_setup,
1683 .disconnect = gs_disconnect,
1684 .driver = {
1685 .name = GS_SHORT_NAME,
1686 .owner = THIS_MODULE,
1687 },
1688}; 221};
1689 222
1690/* 223static int __init init(void)
1691 * gs_set_config
1692 *
1693 * Configures the device by enabling device specific
1694 * optimizations, setting up the endpoints, allocating
1695 * read and write requests and queuing read requests.
1696 *
1697 * The device lock must be held when calling this function.
1698 */
1699static int gs_set_config(struct gs_dev *dev, unsigned config)
1700{ 224{
1701 int i; 225 /* We *could* export two configs; that'd be much cleaner...
1702 int ret = 0; 226 * but neither of these product IDs was defined that way.
1703 struct usb_gadget *gadget = dev->dev_gadget;
1704 struct usb_ep *ep;
1705 struct usb_endpoint_descriptor *out, *in, *notify;
1706 struct usb_request *req;
1707
1708 if (dev == NULL) {
1709 pr_err("gs_set_config: NULL device pointer\n");
1710 return 0;
1711 }
1712
1713 if (config == dev->dev_config)
1714 return 0;
1715
1716 gs_reset_config(dev);
1717
1718 switch (config) {
1719 case GS_NO_CONFIG_ID:
1720 return 0;
1721 case GS_BULK_CONFIG_ID:
1722 if (use_acm)
1723 return -EINVAL;
1724 break;
1725 case GS_ACM_CONFIG_ID:
1726 if (!use_acm)
1727 return -EINVAL;
1728 break;
1729 default:
1730 return -EINVAL;
1731 }
1732
1733 in = choose_ep_desc(gadget,
1734 &gs_highspeed_in_desc,
1735 &gs_fullspeed_in_desc);
1736 out = choose_ep_desc(gadget,
1737 &gs_highspeed_out_desc,
1738 &gs_fullspeed_out_desc);
1739 notify = dev->dev_notify_ep
1740 ? choose_ep_desc(gadget,
1741 &gs_highspeed_notify_desc,
1742 &gs_fullspeed_notify_desc)
1743 : NULL;
1744
1745 ret = usb_ep_enable(dev->dev_in_ep, in);
1746 if (ret == 0) {
1747 dev->dev_in_ep_desc = in;
1748 } else {
1749 pr_debug("%s: cannot enable %s %s, ret=%d\n",
1750 __func__, "IN", dev->dev_in_ep->name, ret);
1751 return ret;
1752 }
1753
1754 ret = usb_ep_enable(dev->dev_out_ep, out);
1755 if (ret == 0) {
1756 dev->dev_out_ep_desc = out;
1757 } else {
1758 pr_debug("%s: cannot enable %s %s, ret=%d\n",
1759 __func__, "OUT", dev->dev_out_ep->name, ret);
1760fail0:
1761 usb_ep_disable(dev->dev_in_ep);
1762 return ret;
1763 }
1764
1765 if (notify) {
1766 ret = usb_ep_enable(dev->dev_notify_ep, notify);
1767 if (ret == 0) {
1768 dev->dev_notify_ep_desc = notify;
1769 } else {
1770 pr_debug("%s: cannot enable %s %s, ret=%d\n",
1771 __func__, "NOTIFY",
1772 dev->dev_notify_ep->name, ret);
1773 usb_ep_disable(dev->dev_out_ep);
1774 goto fail0;
1775 }
1776 }
1777
1778 dev->dev_config = config;
1779
1780 /* allocate and queue read requests */
1781 ep = dev->dev_out_ep;
1782 for (i=0; i<read_q_size && ret == 0; i++) {
1783 if ((req=gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC))) {
1784 req->complete = gs_read_complete;
1785 if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) {
1786 pr_err("gs_set_config: cannot queue read "
1787 "request, ret=%d\n", ret);
1788 }
1789 } else {
1790 pr_err("gs_set_config: cannot allocate "
1791 "read requests\n");
1792 ret = -ENOMEM;
1793 goto exit_reset_config;
1794 }
1795 }
1796
1797 /* allocate write requests, and put on free list */
1798 ep = dev->dev_in_ep;
1799 for (i=0; i<write_q_size; i++) {
1800 req = gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC);
1801 if (req) {
1802 req->complete = gs_write_complete;
1803 list_add(&req->list, &dev->dev_req_list);
1804 } else {
1805 pr_err("gs_set_config: cannot allocate "
1806 "write requests\n");
1807 ret = -ENOMEM;
1808 goto exit_reset_config;
1809 }
1810 }
1811
1812 /* REVISIT the ACM mode should be able to actually *issue* some
1813 * notifications, for at least serial state change events if
1814 * not also for network connection; say so in bmCapabilities.
1815 */ 227 */
1816
1817 pr_info("gs_set_config: %s configured, %s speed %s config\n",
1818 GS_LONG_NAME,
1819 gadget->speed == USB_SPEED_HIGH ? "high" : "full",
1820 config == GS_BULK_CONFIG_ID ? "BULK" : "CDC-ACM");
1821
1822 return 0;
1823
1824exit_reset_config:
1825 gs_reset_config(dev);
1826 return ret;
1827}
1828
1829/*
1830 * gs_reset_config
1831 *
1832 * Mark the device as not configured, disable all endpoints,
1833 * which forces completion of pending I/O and frees queued
1834 * requests, and free the remaining write requests on the
1835 * free list.
1836 *
1837 * The device lock must be held when calling this function.
1838 */
1839static void gs_reset_config(struct gs_dev *dev)
1840{
1841 struct usb_request *req;
1842
1843 if (dev == NULL) {
1844 pr_err("gs_reset_config: NULL device pointer\n");
1845 return;
1846 }
1847
1848 if (dev->dev_config == GS_NO_CONFIG_ID)
1849 return;
1850
1851 dev->dev_config = GS_NO_CONFIG_ID;
1852
1853 /* free write requests on the free list */
1854 while(!list_empty(&dev->dev_req_list)) {
1855 req = list_entry(dev->dev_req_list.next,
1856 struct usb_request, list);
1857 list_del(&req->list);
1858 gs_free_req(dev->dev_in_ep, req);
1859 }
1860
1861 /* disable endpoints, forcing completion of pending i/o; */
1862 /* completion handlers free their requests in this case */
1863 if (dev->dev_notify_ep)
1864 usb_ep_disable(dev->dev_notify_ep);
1865 usb_ep_disable(dev->dev_in_ep);
1866 usb_ep_disable(dev->dev_out_ep);
1867}
1868
1869/*
1870 * gs_build_config_buf
1871 *
1872 * Builds the config descriptors in the given buffer and returns the
1873 * length, or a negative error number.
1874 */
1875static int gs_build_config_buf(u8 *buf, struct usb_gadget *g,
1876 u8 type, unsigned int index, int is_otg)
1877{
1878 int len;
1879 int high_speed = 0;
1880 const struct usb_config_descriptor *config_desc;
1881 const struct usb_descriptor_header **function;
1882
1883 if (index >= gs_device_desc.bNumConfigurations)
1884 return -EINVAL;
1885
1886 /* other speed switches high and full speed */
1887 if (gadget_is_dualspeed(g)) {
1888 high_speed = (g->speed == USB_SPEED_HIGH);
1889 if (type == USB_DT_OTHER_SPEED_CONFIG)
1890 high_speed = !high_speed;
1891 }
1892
1893 if (use_acm) { 228 if (use_acm) {
1894 config_desc = &gs_acm_config_desc; 229 serial_config_driver.label = "CDC ACM config";
1895 function = high_speed 230 serial_config_driver.bConfigurationValue = 2;
1896 ? gs_acm_highspeed_function 231 device_desc.bDeviceClass = USB_CLASS_COMM;
1897 : gs_acm_fullspeed_function; 232 device_desc.idProduct =
233 __constant_cpu_to_le16(GS_CDC_PRODUCT_ID);
1898 } else { 234 } else {
1899 config_desc = &gs_bulk_config_desc; 235 serial_config_driver.label = "Generic Serial config";
1900 function = high_speed 236 serial_config_driver.bConfigurationValue = 1;
1901 ? gs_bulk_highspeed_function 237 device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC;
1902 : gs_bulk_fullspeed_function; 238 device_desc.idProduct =
1903 } 239 __constant_cpu_to_le16(GS_PRODUCT_ID);
1904
1905 /* for now, don't advertise srp-only devices */
1906 if (!is_otg)
1907 function++;
1908
1909 len = usb_gadget_config_buf(config_desc, buf, GS_MAX_DESC_LEN, function);
1910 if (len < 0)
1911 return len;
1912
1913 ((struct usb_config_descriptor *)buf)->bDescriptorType = type;
1914
1915 return len;
1916}
1917
1918/*
1919 * gs_alloc_req
1920 *
1921 * Allocate a usb_request and its buffer. Returns a pointer to the
1922 * usb_request or NULL if there is an error.
1923 */
1924static struct usb_request *
1925gs_alloc_req(struct usb_ep *ep, unsigned int len, gfp_t kmalloc_flags)
1926{
1927 struct usb_request *req;
1928
1929 if (ep == NULL)
1930 return NULL;
1931
1932 req = usb_ep_alloc_request(ep, kmalloc_flags);
1933
1934 if (req != NULL) {
1935 req->length = len;
1936 req->buf = kmalloc(len, kmalloc_flags);
1937 if (req->buf == NULL) {
1938 usb_ep_free_request(ep, req);
1939 return NULL;
1940 }
1941 } 240 }
241 strings_dev[STRING_DESCRIPTION_IDX].s = serial_config_driver.label;
1942 242
1943 return req; 243 return usb_composite_register(&gserial_driver);
1944} 244}
245module_init(init);
1945 246
1946/* 247static void __exit cleanup(void)
1947 * gs_free_req
1948 *
1949 * Free a usb_request and its buffer.
1950 */
1951static void gs_free_req(struct usb_ep *ep, struct usb_request *req)
1952{ 248{
1953 if (ep != NULL && req != NULL) { 249 usb_composite_unregister(&gserial_driver);
1954 kfree(req->buf); 250 gserial_cleanup();
1955 usb_ep_free_request(ep, req);
1956 }
1957}
1958
1959/*
1960 * gs_alloc_ports
1961 *
1962 * Allocate all ports and set the gs_dev struct to point to them.
1963 * Return 0 if successful, or a negative error number.
1964 *
1965 * The device lock is normally held when calling this function.
1966 */
1967static int gs_alloc_ports(struct gs_dev *dev, gfp_t kmalloc_flags)
1968{
1969 int i;
1970 struct gs_port *port;
1971
1972 if (dev == NULL)
1973 return -EIO;
1974
1975 for (i=0; i<GS_NUM_PORTS; i++) {
1976 if ((port=kzalloc(sizeof(struct gs_port), kmalloc_flags)) == NULL)
1977 return -ENOMEM;
1978
1979 port->port_dev = dev;
1980 port->port_num = i;
1981 port->port_line_coding.dwDTERate = cpu_to_le32(GS_DEFAULT_DTE_RATE);
1982 port->port_line_coding.bCharFormat = GS_DEFAULT_CHAR_FORMAT;
1983 port->port_line_coding.bParityType = GS_DEFAULT_PARITY;
1984 port->port_line_coding.bDataBits = GS_DEFAULT_DATA_BITS;
1985 spin_lock_init(&port->port_lock);
1986 init_waitqueue_head(&port->port_write_wait);
1987
1988 dev->dev_port[i] = port;
1989 }
1990
1991 return 0;
1992}
1993
1994/*
1995 * gs_free_ports
1996 *
1997 * Free all closed ports. Open ports are disconnected by
1998 * freeing their write buffers, setting their device pointers
1999 * and the pointers to them in the device to NULL. These
2000 * ports will be freed when closed.
2001 *
2002 * The device lock is normally held when calling this function.
2003 */
2004static void gs_free_ports(struct gs_dev *dev)
2005{
2006 int i;
2007 unsigned long flags;
2008 struct gs_port *port;
2009
2010 if (dev == NULL)
2011 return;
2012
2013 for (i=0; i<GS_NUM_PORTS; i++) {
2014 if ((port=dev->dev_port[i]) != NULL) {
2015 dev->dev_port[i] = NULL;
2016
2017 spin_lock_irqsave(&port->port_lock, flags);
2018
2019 if (port->port_write_buf != NULL) {
2020 gs_buf_free(port->port_write_buf);
2021 port->port_write_buf = NULL;
2022 }
2023
2024 if (port->port_open_count > 0 || port->port_in_use) {
2025 port->port_dev = NULL;
2026 wake_up_interruptible(&port->port_write_wait);
2027 if (port->port_tty) {
2028 tty_hangup(port->port_tty);
2029 }
2030 spin_unlock_irqrestore(&port->port_lock, flags);
2031 } else {
2032 spin_unlock_irqrestore(&port->port_lock, flags);
2033 kfree(port);
2034 }
2035
2036 }
2037 }
2038}
2039
2040/*-------------------------------------------------------------------------*/
2041
2042/* Circular Buffer */
2043
2044/*
2045 * gs_buf_alloc
2046 *
2047 * Allocate a circular buffer and all associated memory.
2048 */
2049static struct gs_buf *gs_buf_alloc(unsigned int size, gfp_t kmalloc_flags)
2050{
2051 struct gs_buf *gb;
2052
2053 if (size == 0)
2054 return NULL;
2055
2056 gb = kmalloc(sizeof(struct gs_buf), kmalloc_flags);
2057 if (gb == NULL)
2058 return NULL;
2059
2060 gb->buf_buf = kmalloc(size, kmalloc_flags);
2061 if (gb->buf_buf == NULL) {
2062 kfree(gb);
2063 return NULL;
2064 }
2065
2066 gb->buf_size = size;
2067 gb->buf_get = gb->buf_put = gb->buf_buf;
2068
2069 return gb;
2070}
2071
2072/*
2073 * gs_buf_free
2074 *
2075 * Free the buffer and all associated memory.
2076 */
2077static void gs_buf_free(struct gs_buf *gb)
2078{
2079 if (gb) {
2080 kfree(gb->buf_buf);
2081 kfree(gb);
2082 }
2083}
2084
2085/*
2086 * gs_buf_clear
2087 *
2088 * Clear out all data in the circular buffer.
2089 */
2090static void gs_buf_clear(struct gs_buf *gb)
2091{
2092 if (gb != NULL)
2093 gb->buf_get = gb->buf_put;
2094 /* equivalent to a get of all data available */
2095}
2096
2097/*
2098 * gs_buf_data_avail
2099 *
2100 * Return the number of bytes of data available in the circular
2101 * buffer.
2102 */
2103static unsigned int gs_buf_data_avail(struct gs_buf *gb)
2104{
2105 if (gb != NULL)
2106 return (gb->buf_size + gb->buf_put - gb->buf_get) % gb->buf_size;
2107 else
2108 return 0;
2109}
2110
2111/*
2112 * gs_buf_space_avail
2113 *
2114 * Return the number of bytes of space available in the circular
2115 * buffer.
2116 */
2117static unsigned int gs_buf_space_avail(struct gs_buf *gb)
2118{
2119 if (gb != NULL)
2120 return (gb->buf_size + gb->buf_get - gb->buf_put - 1) % gb->buf_size;
2121 else
2122 return 0;
2123}
2124
2125/*
2126 * gs_buf_put
2127 *
2128 * Copy data data from a user buffer and put it into the circular buffer.
2129 * Restrict to the amount of space available.
2130 *
2131 * Return the number of bytes copied.
2132 */
2133static unsigned int
2134gs_buf_put(struct gs_buf *gb, const char *buf, unsigned int count)
2135{
2136 unsigned int len;
2137
2138 if (gb == NULL)
2139 return 0;
2140
2141 len = gs_buf_space_avail(gb);
2142 if (count > len)
2143 count = len;
2144
2145 if (count == 0)
2146 return 0;
2147
2148 len = gb->buf_buf + gb->buf_size - gb->buf_put;
2149 if (count > len) {
2150 memcpy(gb->buf_put, buf, len);
2151 memcpy(gb->buf_buf, buf+len, count - len);
2152 gb->buf_put = gb->buf_buf + count - len;
2153 } else {
2154 memcpy(gb->buf_put, buf, count);
2155 if (count < len)
2156 gb->buf_put += count;
2157 else /* count == len */
2158 gb->buf_put = gb->buf_buf;
2159 }
2160
2161 return count;
2162}
2163
2164/*
2165 * gs_buf_get
2166 *
2167 * Get data from the circular buffer and copy to the given buffer.
2168 * Restrict to the amount of data available.
2169 *
2170 * Return the number of bytes copied.
2171 */
2172static unsigned int
2173gs_buf_get(struct gs_buf *gb, char *buf, unsigned int count)
2174{
2175 unsigned int len;
2176
2177 if (gb == NULL)
2178 return 0;
2179
2180 len = gs_buf_data_avail(gb);
2181 if (count > len)
2182 count = len;
2183
2184 if (count == 0)
2185 return 0;
2186
2187 len = gb->buf_buf + gb->buf_size - gb->buf_get;
2188 if (count > len) {
2189 memcpy(buf, gb->buf_get, len);
2190 memcpy(buf+len, gb->buf_buf, count - len);
2191 gb->buf_get = gb->buf_buf + count - len;
2192 } else {
2193 memcpy(buf, gb->buf_get, count);
2194 if (count < len)
2195 gb->buf_get += count;
2196 else /* count == len */
2197 gb->buf_get = gb->buf_buf;
2198 }
2199
2200 return count;
2201}
2202
2203/*-------------------------------------------------------------------------*/
2204
2205static struct tty_driver *gs_tty_driver;
2206
2207/*
2208 * gs_module_init
2209 *
2210 * Register as a USB gadget driver and a tty driver.
2211 */
2212static int __init gs_module_init(void)
2213{
2214 int i;
2215 int retval;
2216
2217 retval = usb_gadget_register_driver(&gs_gadget_driver);
2218 if (retval) {
2219 pr_err("gs_module_init: cannot register gadget driver, "
2220 "ret=%d\n", retval);
2221 return retval;
2222 }
2223
2224 gs_tty_driver = alloc_tty_driver(GS_NUM_PORTS);
2225 if (!gs_tty_driver)
2226 return -ENOMEM;
2227 gs_tty_driver->owner = THIS_MODULE;
2228 gs_tty_driver->driver_name = GS_SHORT_NAME;
2229 gs_tty_driver->name = "ttygs";
2230 gs_tty_driver->major = GS_MAJOR;
2231 gs_tty_driver->minor_start = GS_MINOR_START;
2232 gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
2233 gs_tty_driver->subtype = SERIAL_TYPE_NORMAL;
2234 gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
2235 gs_tty_driver->init_termios = tty_std_termios;
2236 /* must match GS_DEFAULT_DTE_RATE and friends */
2237 gs_tty_driver->init_termios.c_cflag =
2238 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2239 gs_tty_driver->init_termios.c_ispeed = GS_DEFAULT_DTE_RATE;
2240 gs_tty_driver->init_termios.c_ospeed = GS_DEFAULT_DTE_RATE;
2241 tty_set_operations(gs_tty_driver, &gs_tty_ops);
2242
2243 for (i = 0; i < GS_NUM_PORTS; i++)
2244 mutex_init(&gs_open_close_lock[i]);
2245
2246 retval = tty_register_driver(gs_tty_driver);
2247 if (retval) {
2248 usb_gadget_unregister_driver(&gs_gadget_driver);
2249 put_tty_driver(gs_tty_driver);
2250 pr_err("gs_module_init: cannot register tty driver, "
2251 "ret=%d\n", retval);
2252 return retval;
2253 }
2254
2255 pr_info("gs_module_init: %s %s loaded\n",
2256 GS_LONG_NAME, GS_VERSION_STR);
2257 return 0;
2258}
2259module_init(gs_module_init);
2260
2261/*
2262 * gs_module_exit
2263 *
2264 * Unregister as a tty driver and a USB gadget driver.
2265 */
2266static void __exit gs_module_exit(void)
2267{
2268 tty_unregister_driver(gs_tty_driver);
2269 put_tty_driver(gs_tty_driver);
2270 usb_gadget_unregister_driver(&gs_gadget_driver);
2271
2272 pr_info("gs_module_exit: %s %s unloaded\n",
2273 GS_LONG_NAME, GS_VERSION_STR);
2274} 251}
2275module_exit(gs_module_exit); 252module_exit(cleanup);
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
new file mode 100644
index 000000000000..5458f43a8668
--- /dev/null
+++ b/drivers/usb/gadget/u_ether.c
@@ -0,0 +1,967 @@
1/*
2 * u_ether.c -- Ethernet-over-USB link layer utilities for Gadget stack
3 *
4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
6 * Copyright (C) 2008 Nokia Corporation
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23/* #define VERBOSE_DEBUG */
24
25#include <linux/kernel.h>
26#include <linux/utsname.h>
27#include <linux/device.h>
28#include <linux/ctype.h>
29#include <linux/etherdevice.h>
30#include <linux/ethtool.h>
31
32#include "u_ether.h"
33
34
35/*
36 * This component encapsulates the Ethernet link glue needed to provide
37 * one (!) network link through the USB gadget stack, normally "usb0".
38 *
39 * The control and data models are handled by the function driver which
40 * connects to this code; such as CDC Ethernet, "CDC Subset", or RNDIS.
41 * That includes all descriptor and endpoint management.
42 *
43 * Link level addressing is handled by this component using module
44 * parameters; if no such parameters are provided, random link level
45 * addresses are used. Each end of the link uses one address. The
46 * host end address is exported in various ways, and is often recorded
47 * in configuration databases.
48 *
49 * The driver which assembles each configuration using such a link is
50 * responsible for ensuring that each configuration includes at most one
51 * instance of is network link. (The network layer provides ways for
52 * this single "physical" link to be used by multiple virtual links.)
53 */
54
55#define DRIVER_VERSION "29-May-2008"
56
57struct eth_dev {
58 /* lock is held while accessing port_usb
59 * or updating its backlink port_usb->ioport
60 */
61 spinlock_t lock;
62 struct gether *port_usb;
63
64 struct net_device *net;
65 struct usb_gadget *gadget;
66
67 spinlock_t req_lock; /* guard {rx,tx}_reqs */
68 struct list_head tx_reqs, rx_reqs;
69 atomic_t tx_qlen;
70
71 unsigned header_len;
72 struct sk_buff *(*wrap)(struct sk_buff *skb);
73 int (*unwrap)(struct sk_buff *skb);
74
75 struct work_struct work;
76
77 unsigned long todo;
78#define WORK_RX_MEMORY 0
79
80 bool zlp;
81 u8 host_mac[ETH_ALEN];
82};
83
84/*-------------------------------------------------------------------------*/
85
86#define RX_EXTRA 20 /* bytes guarding against rx overflows */
87
88#define DEFAULT_QLEN 2 /* double buffering by default */
89
90
91#ifdef CONFIG_USB_GADGET_DUALSPEED
92
93static unsigned qmult = 5;
94module_param(qmult, uint, S_IRUGO|S_IWUSR);
95MODULE_PARM_DESC(qmult, "queue length multiplier at high speed");
96
97#else /* full speed (low speed doesn't do bulk) */
98#define qmult 1
99#endif
100
101/* for dual-speed hardware, use deeper queues at highspeed */
102static inline int qlen(struct usb_gadget *gadget)
103{
104 if (gadget_is_dualspeed(gadget) && gadget->speed == USB_SPEED_HIGH)
105 return qmult * DEFAULT_QLEN;
106 else
107 return DEFAULT_QLEN;
108}
109
110/*-------------------------------------------------------------------------*/
111
112/* REVISIT there must be a better way than having two sets
113 * of debug calls ...
114 */
115
116#undef DBG
117#undef VDBG
118#undef ERROR
119#undef WARN
120#undef INFO
121
122#define xprintk(d, level, fmt, args...) \
123 printk(level "%s: " fmt , (d)->net->name , ## args)
124
125#ifdef DEBUG
126#undef DEBUG
127#define DBG(dev, fmt, args...) \
128 xprintk(dev , KERN_DEBUG , fmt , ## args)
129#else
130#define DBG(dev, fmt, args...) \
131 do { } while (0)
132#endif /* DEBUG */
133
134#ifdef VERBOSE_DEBUG
135#define VDBG DBG
136#else
137#define VDBG(dev, fmt, args...) \
138 do { } while (0)
139#endif /* DEBUG */
140
141#define ERROR(dev, fmt, args...) \
142 xprintk(dev , KERN_ERR , fmt , ## args)
143#define WARN(dev, fmt, args...) \
144 xprintk(dev , KERN_WARNING , fmt , ## args)
145#define INFO(dev, fmt, args...) \
146 xprintk(dev , KERN_INFO , fmt , ## args)
147
148/*-------------------------------------------------------------------------*/
149
150/* NETWORK DRIVER HOOKUP (to the layer above this driver) */
151
152static int eth_change_mtu(struct net_device *net, int new_mtu)
153{
154 struct eth_dev *dev = netdev_priv(net);
155 unsigned long flags;
156 int status = 0;
157
158 /* don't change MTU on "live" link (peer won't know) */
159 spin_lock_irqsave(&dev->lock, flags);
160 if (dev->port_usb)
161 status = -EBUSY;
162 else if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN)
163 status = -ERANGE;
164 else
165 net->mtu = new_mtu;
166 spin_unlock_irqrestore(&dev->lock, flags);
167
168 return status;
169}
170
171static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)
172{
173 struct eth_dev *dev = netdev_priv(net);
174
175 strlcpy(p->driver, "g_ether", sizeof p->driver);
176 strlcpy(p->version, DRIVER_VERSION, sizeof p->version);
177 strlcpy(p->fw_version, dev->gadget->name, sizeof p->fw_version);
178 strlcpy(p->bus_info, dev_name(&dev->gadget->dev), sizeof p->bus_info);
179}
180
181static u32 eth_get_link(struct net_device *net)
182{
183 struct eth_dev *dev = netdev_priv(net);
184 return dev->gadget->speed != USB_SPEED_UNKNOWN;
185}
186
187/* REVISIT can also support:
188 * - WOL (by tracking suspends and issuing remote wakeup)
189 * - msglevel (implies updated messaging)
190 * - ... probably more ethtool ops
191 */
192
193static struct ethtool_ops ops = {
194 .get_drvinfo = eth_get_drvinfo,
195 .get_link = eth_get_link
196};
197
198static void defer_kevent(struct eth_dev *dev, int flag)
199{
200 if (test_and_set_bit(flag, &dev->todo))
201 return;
202 if (!schedule_work(&dev->work))
203 ERROR(dev, "kevent %d may have been dropped\n", flag);
204 else
205 DBG(dev, "kevent %d scheduled\n", flag);
206}
207
208static void rx_complete(struct usb_ep *ep, struct usb_request *req);
209
210static int
211rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
212{
213 struct sk_buff *skb;
214 int retval = -ENOMEM;
215 size_t size = 0;
216 struct usb_ep *out;
217 unsigned long flags;
218
219 spin_lock_irqsave(&dev->lock, flags);
220 if (dev->port_usb)
221 out = dev->port_usb->out_ep;
222 else
223 out = NULL;
224 spin_unlock_irqrestore(&dev->lock, flags);
225
226 if (!out)
227 return -ENOTCONN;
228
229
230 /* Padding up to RX_EXTRA handles minor disagreements with host.
231 * Normally we use the USB "terminate on short read" convention;
232 * so allow up to (N*maxpacket), since that memory is normally
233 * already allocated. Some hardware doesn't deal well with short
234 * reads (e.g. DMA must be N*maxpacket), so for now don't trim a
235 * byte off the end (to force hardware errors on overflow).
236 *
237 * RNDIS uses internal framing, and explicitly allows senders to
238 * pad to end-of-packet. That's potentially nice for speed, but
239 * means receivers can't recover lost synch on their own (because
240 * new packets don't only start after a short RX).
241 */
242 size += sizeof(struct ethhdr) + dev->net->mtu + RX_EXTRA;
243 size += dev->port_usb->header_len;
244 size += out->maxpacket - 1;
245 size -= size % out->maxpacket;
246
247 skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
248 if (skb == NULL) {
249 DBG(dev, "no rx skb\n");
250 goto enomem;
251 }
252
253 /* Some platforms perform better when IP packets are aligned,
254 * but on at least one, checksumming fails otherwise. Note:
255 * RNDIS headers involve variable numbers of LE32 values.
256 */
257 skb_reserve(skb, NET_IP_ALIGN);
258
259 req->buf = skb->data;
260 req->length = size;
261 req->complete = rx_complete;
262 req->context = skb;
263
264 retval = usb_ep_queue(out, req, gfp_flags);
265 if (retval == -ENOMEM)
266enomem:
267 defer_kevent(dev, WORK_RX_MEMORY);
268 if (retval) {
269 DBG(dev, "rx submit --> %d\n", retval);
270 if (skb)
271 dev_kfree_skb_any(skb);
272 spin_lock_irqsave(&dev->req_lock, flags);
273 list_add(&req->list, &dev->rx_reqs);
274 spin_unlock_irqrestore(&dev->req_lock, flags);
275 }
276 return retval;
277}
278
279static void rx_complete(struct usb_ep *ep, struct usb_request *req)
280{
281 struct sk_buff *skb = req->context;
282 struct eth_dev *dev = ep->driver_data;
283 int status = req->status;
284
285 switch (status) {
286
287 /* normal completion */
288 case 0:
289 skb_put(skb, req->actual);
290 if (dev->unwrap)
291 status = dev->unwrap(skb);
292 if (status < 0
293 || ETH_HLEN > skb->len
294 || skb->len > ETH_FRAME_LEN) {
295 dev->net->stats.rx_errors++;
296 dev->net->stats.rx_length_errors++;
297 DBG(dev, "rx length %d\n", skb->len);
298 break;
299 }
300
301 skb->protocol = eth_type_trans(skb, dev->net);
302 dev->net->stats.rx_packets++;
303 dev->net->stats.rx_bytes += skb->len;
304
305 /* no buffer copies needed, unless hardware can't
306 * use skb buffers.
307 */
308 status = netif_rx(skb);
309 skb = NULL;
310 break;
311
312 /* software-driven interface shutdown */
313 case -ECONNRESET: /* unlink */
314 case -ESHUTDOWN: /* disconnect etc */
315 VDBG(dev, "rx shutdown, code %d\n", status);
316 goto quiesce;
317
318 /* for hardware automagic (such as pxa) */
319 case -ECONNABORTED: /* endpoint reset */
320 DBG(dev, "rx %s reset\n", ep->name);
321 defer_kevent(dev, WORK_RX_MEMORY);
322quiesce:
323 dev_kfree_skb_any(skb);
324 goto clean;
325
326 /* data overrun */
327 case -EOVERFLOW:
328 dev->net->stats.rx_over_errors++;
329 /* FALLTHROUGH */
330
331 default:
332 dev->net->stats.rx_errors++;
333 DBG(dev, "rx status %d\n", status);
334 break;
335 }
336
337 if (skb)
338 dev_kfree_skb_any(skb);
339 if (!netif_running(dev->net)) {
340clean:
341 spin_lock(&dev->req_lock);
342 list_add(&req->list, &dev->rx_reqs);
343 spin_unlock(&dev->req_lock);
344 req = NULL;
345 }
346 if (req)
347 rx_submit(dev, req, GFP_ATOMIC);
348}
349
350static int prealloc(struct list_head *list, struct usb_ep *ep, unsigned n)
351{
352 unsigned i;
353 struct usb_request *req;
354
355 if (!n)
356 return -ENOMEM;
357
358 /* queue/recycle up to N requests */
359 i = n;
360 list_for_each_entry(req, list, list) {
361 if (i-- == 0)
362 goto extra;
363 }
364 while (i--) {
365 req = usb_ep_alloc_request(ep, GFP_ATOMIC);
366 if (!req)
367 return list_empty(list) ? -ENOMEM : 0;
368 list_add(&req->list, list);
369 }
370 return 0;
371
372extra:
373 /* free extras */
374 for (;;) {
375 struct list_head *next;
376
377 next = req->list.next;
378 list_del(&req->list);
379 usb_ep_free_request(ep, req);
380
381 if (next == list)
382 break;
383
384 req = container_of(next, struct usb_request, list);
385 }
386 return 0;
387}
388
389static int alloc_requests(struct eth_dev *dev, struct gether *link, unsigned n)
390{
391 int status;
392
393 spin_lock(&dev->req_lock);
394 status = prealloc(&dev->tx_reqs, link->in_ep, n);
395 if (status < 0)
396 goto fail;
397 status = prealloc(&dev->rx_reqs, link->out_ep, n);
398 if (status < 0)
399 goto fail;
400 goto done;
401fail:
402 DBG(dev, "can't alloc requests\n");
403done:
404 spin_unlock(&dev->req_lock);
405 return status;
406}
407
408static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags)
409{
410 struct usb_request *req;
411 unsigned long flags;
412
413 /* fill unused rxq slots with some skb */
414 spin_lock_irqsave(&dev->req_lock, flags);
415 while (!list_empty(&dev->rx_reqs)) {
416 req = container_of(dev->rx_reqs.next,
417 struct usb_request, list);
418 list_del_init(&req->list);
419 spin_unlock_irqrestore(&dev->req_lock, flags);
420
421 if (rx_submit(dev, req, gfp_flags) < 0) {
422 defer_kevent(dev, WORK_RX_MEMORY);
423 return;
424 }
425
426 spin_lock_irqsave(&dev->req_lock, flags);
427 }
428 spin_unlock_irqrestore(&dev->req_lock, flags);
429}
430
431static void eth_work(struct work_struct *work)
432{
433 struct eth_dev *dev = container_of(work, struct eth_dev, work);
434
435 if (test_and_clear_bit(WORK_RX_MEMORY, &dev->todo)) {
436 if (netif_running(dev->net))
437 rx_fill(dev, GFP_KERNEL);
438 }
439
440 if (dev->todo)
441 DBG(dev, "work done, flags = 0x%lx\n", dev->todo);
442}
443
444static void tx_complete(struct usb_ep *ep, struct usb_request *req)
445{
446 struct sk_buff *skb = req->context;
447 struct eth_dev *dev = ep->driver_data;
448
449 switch (req->status) {
450 default:
451 dev->net->stats.tx_errors++;
452 VDBG(dev, "tx err %d\n", req->status);
453 /* FALLTHROUGH */
454 case -ECONNRESET: /* unlink */
455 case -ESHUTDOWN: /* disconnect etc */
456 break;
457 case 0:
458 dev->net->stats.tx_bytes += skb->len;
459 }
460 dev->net->stats.tx_packets++;
461
462 spin_lock(&dev->req_lock);
463 list_add(&req->list, &dev->tx_reqs);
464 spin_unlock(&dev->req_lock);
465 dev_kfree_skb_any(skb);
466
467 atomic_dec(&dev->tx_qlen);
468 if (netif_carrier_ok(dev->net))
469 netif_wake_queue(dev->net);
470}
471
472static inline int is_promisc(u16 cdc_filter)
473{
474 return cdc_filter & USB_CDC_PACKET_TYPE_PROMISCUOUS;
475}
476
477static int eth_start_xmit(struct sk_buff *skb, struct net_device *net)
478{
479 struct eth_dev *dev = netdev_priv(net);
480 int length = skb->len;
481 int retval;
482 struct usb_request *req = NULL;
483 unsigned long flags;
484 struct usb_ep *in;
485 u16 cdc_filter;
486
487 spin_lock_irqsave(&dev->lock, flags);
488 if (dev->port_usb) {
489 in = dev->port_usb->in_ep;
490 cdc_filter = dev->port_usb->cdc_filter;
491 } else {
492 in = NULL;
493 cdc_filter = 0;
494 }
495 spin_unlock_irqrestore(&dev->lock, flags);
496
497 if (!in) {
498 dev_kfree_skb_any(skb);
499 return 0;
500 }
501
502 /* apply outgoing CDC or RNDIS filters */
503 if (!is_promisc(cdc_filter)) {
504 u8 *dest = skb->data;
505
506 if (is_multicast_ether_addr(dest)) {
507 u16 type;
508
509 /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host
510 * SET_ETHERNET_MULTICAST_FILTERS requests
511 */
512 if (is_broadcast_ether_addr(dest))
513 type = USB_CDC_PACKET_TYPE_BROADCAST;
514 else
515 type = USB_CDC_PACKET_TYPE_ALL_MULTICAST;
516 if (!(cdc_filter & type)) {
517 dev_kfree_skb_any(skb);
518 return 0;
519 }
520 }
521 /* ignores USB_CDC_PACKET_TYPE_DIRECTED */
522 }
523
524 spin_lock_irqsave(&dev->req_lock, flags);
525 /*
526 * this freelist can be empty if an interrupt triggered disconnect()
527 * and reconfigured the gadget (shutting down this queue) after the
528 * network stack decided to xmit but before we got the spinlock.
529 */
530 if (list_empty(&dev->tx_reqs)) {
531 spin_unlock_irqrestore(&dev->req_lock, flags);
532 return 1;
533 }
534
535 req = container_of(dev->tx_reqs.next, struct usb_request, list);
536 list_del(&req->list);
537
538 /* temporarily stop TX queue when the freelist empties */
539 if (list_empty(&dev->tx_reqs))
540 netif_stop_queue(net);
541 spin_unlock_irqrestore(&dev->req_lock, flags);
542
543 /* no buffer copies needed, unless the network stack did it
544 * or the hardware can't use skb buffers.
545 * or there's not enough space for extra headers we need
546 */
547 if (dev->wrap) {
548 struct sk_buff *skb_new;
549
550 skb_new = dev->wrap(skb);
551 if (!skb_new)
552 goto drop;
553
554 dev_kfree_skb_any(skb);
555 skb = skb_new;
556 length = skb->len;
557 }
558 req->buf = skb->data;
559 req->context = skb;
560 req->complete = tx_complete;
561
562 /* use zlp framing on tx for strict CDC-Ether conformance,
563 * though any robust network rx path ignores extra padding.
564 * and some hardware doesn't like to write zlps.
565 */
566 req->zero = 1;
567 if (!dev->zlp && (length % in->maxpacket) == 0)
568 length++;
569
570 req->length = length;
571
572 /* throttle highspeed IRQ rate back slightly */
573 if (gadget_is_dualspeed(dev->gadget))
574 req->no_interrupt = (dev->gadget->speed == USB_SPEED_HIGH)
575 ? ((atomic_read(&dev->tx_qlen) % qmult) != 0)
576 : 0;
577
578 retval = usb_ep_queue(in, req, GFP_ATOMIC);
579 switch (retval) {
580 default:
581 DBG(dev, "tx queue err %d\n", retval);
582 break;
583 case 0:
584 net->trans_start = jiffies;
585 atomic_inc(&dev->tx_qlen);
586 }
587
588 if (retval) {
589drop:
590 dev->net->stats.tx_dropped++;
591 dev_kfree_skb_any(skb);
592 spin_lock_irqsave(&dev->req_lock, flags);
593 if (list_empty(&dev->tx_reqs))
594 netif_start_queue(net);
595 list_add(&req->list, &dev->tx_reqs);
596 spin_unlock_irqrestore(&dev->req_lock, flags);
597 }
598 return 0;
599}
600
601/*-------------------------------------------------------------------------*/
602
603static void eth_start(struct eth_dev *dev, gfp_t gfp_flags)
604{
605 DBG(dev, "%s\n", __func__);
606
607 /* fill the rx queue */
608 rx_fill(dev, gfp_flags);
609
610 /* and open the tx floodgates */
611 atomic_set(&dev->tx_qlen, 0);
612 netif_wake_queue(dev->net);
613}
614
615static int eth_open(struct net_device *net)
616{
617 struct eth_dev *dev = netdev_priv(net);
618 struct gether *link;
619
620 DBG(dev, "%s\n", __func__);
621 if (netif_carrier_ok(dev->net))
622 eth_start(dev, GFP_KERNEL);
623
624 spin_lock_irq(&dev->lock);
625 link = dev->port_usb;
626 if (link && link->open)
627 link->open(link);
628 spin_unlock_irq(&dev->lock);
629
630 return 0;
631}
632
633static int eth_stop(struct net_device *net)
634{
635 struct eth_dev *dev = netdev_priv(net);
636 unsigned long flags;
637
638 VDBG(dev, "%s\n", __func__);
639 netif_stop_queue(net);
640
641 DBG(dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n",
642 dev->net->stats.rx_packets, dev->net->stats.tx_packets,
643 dev->net->stats.rx_errors, dev->net->stats.tx_errors
644 );
645
646 /* ensure there are no more active requests */
647 spin_lock_irqsave(&dev->lock, flags);
648 if (dev->port_usb) {
649 struct gether *link = dev->port_usb;
650
651 if (link->close)
652 link->close(link);
653
654 /* NOTE: we have no abort-queue primitive we could use
655 * to cancel all pending I/O. Instead, we disable then
656 * reenable the endpoints ... this idiom may leave toggle
657 * wrong, but that's a self-correcting error.
658 *
659 * REVISIT: we *COULD* just let the transfers complete at
660 * their own pace; the network stack can handle old packets.
661 * For the moment we leave this here, since it works.
662 */
663 usb_ep_disable(link->in_ep);
664 usb_ep_disable(link->out_ep);
665 if (netif_carrier_ok(net)) {
666 DBG(dev, "host still using in/out endpoints\n");
667 usb_ep_enable(link->in_ep, link->in);
668 usb_ep_enable(link->out_ep, link->out);
669 }
670 }
671 spin_unlock_irqrestore(&dev->lock, flags);
672
673 return 0;
674}
675
676/*-------------------------------------------------------------------------*/
677
678/* initial value, changed by "ifconfig usb0 hw ether xx:xx:xx:xx:xx:xx" */
679static char *dev_addr;
680module_param(dev_addr, charp, S_IRUGO);
681MODULE_PARM_DESC(dev_addr, "Device Ethernet Address");
682
683/* this address is invisible to ifconfig */
684static char *host_addr;
685module_param(host_addr, charp, S_IRUGO);
686MODULE_PARM_DESC(host_addr, "Host Ethernet Address");
687
688
689static u8 __init nibble(unsigned char c)
690{
691 if (isdigit(c))
692 return c - '0';
693 c = toupper(c);
694 if (isxdigit(c))
695 return 10 + c - 'A';
696 return 0;
697}
698
699static int __init get_ether_addr(const char *str, u8 *dev_addr)
700{
701 if (str) {
702 unsigned i;
703
704 for (i = 0; i < 6; i++) {
705 unsigned char num;
706
707 if ((*str == '.') || (*str == ':'))
708 str++;
709 num = nibble(*str++) << 4;
710 num |= (nibble(*str++));
711 dev_addr [i] = num;
712 }
713 if (is_valid_ether_addr(dev_addr))
714 return 0;
715 }
716 random_ether_addr(dev_addr);
717 return 1;
718}
719
720static struct eth_dev *the_dev;
721
722
723/**
724 * gether_setup - initialize one ethernet-over-usb link
725 * @g: gadget to associated with these links
726 * @ethaddr: NULL, or a buffer in which the ethernet address of the
727 * host side of the link is recorded
728 * Context: may sleep
729 *
730 * This sets up the single network link that may be exported by a
731 * gadget driver using this framework. The link layer addresses are
732 * set up using module parameters.
733 *
734 * Returns negative errno, or zero on success
735 */
736int __init gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN])
737{
738 struct eth_dev *dev;
739 struct net_device *net;
740 int status;
741
742 if (the_dev)
743 return -EBUSY;
744
745 net = alloc_etherdev(sizeof *dev);
746 if (!net)
747 return -ENOMEM;
748
749 dev = netdev_priv(net);
750 spin_lock_init(&dev->lock);
751 spin_lock_init(&dev->req_lock);
752 INIT_WORK(&dev->work, eth_work);
753 INIT_LIST_HEAD(&dev->tx_reqs);
754 INIT_LIST_HEAD(&dev->rx_reqs);
755
756 /* network device setup */
757 dev->net = net;
758 strcpy(net->name, "usb%d");
759
760 if (get_ether_addr(dev_addr, net->dev_addr))
761 dev_warn(&g->dev,
762 "using random %s ethernet address\n", "self");
763 if (get_ether_addr(host_addr, dev->host_mac))
764 dev_warn(&g->dev,
765 "using random %s ethernet address\n", "host");
766
767 if (ethaddr)
768 memcpy(ethaddr, dev->host_mac, ETH_ALEN);
769
770 net->change_mtu = eth_change_mtu;
771 net->hard_start_xmit = eth_start_xmit;
772 net->open = eth_open;
773 net->stop = eth_stop;
774 /* watchdog_timeo, tx_timeout ... */
775 /* set_multicast_list */
776 SET_ETHTOOL_OPS(net, &ops);
777
778 /* two kinds of host-initiated state changes:
779 * - iff DATA transfer is active, carrier is "on"
780 * - tx queueing enabled if open *and* carrier is "on"
781 */
782 netif_stop_queue(net);
783 netif_carrier_off(net);
784
785 dev->gadget = g;
786 SET_NETDEV_DEV(net, &g->dev);
787
788 status = register_netdev(net);
789 if (status < 0) {
790 dev_dbg(&g->dev, "register_netdev failed, %d\n", status);
791 free_netdev(net);
792 } else {
793 DECLARE_MAC_BUF(tmp);
794
795 INFO(dev, "MAC %s\n", print_mac(tmp, net->dev_addr));
796 INFO(dev, "HOST MAC %s\n", print_mac(tmp, dev->host_mac));
797
798 the_dev = dev;
799 }
800
801 return status;
802}
803
804/**
805 * gether_cleanup - remove Ethernet-over-USB device
806 * Context: may sleep
807 *
808 * This is called to free all resources allocated by @gether_setup().
809 */
810void gether_cleanup(void)
811{
812 if (!the_dev)
813 return;
814
815 unregister_netdev(the_dev->net);
816 free_netdev(the_dev->net);
817
818 /* assuming we used keventd, it must quiesce too */
819 flush_scheduled_work();
820
821 the_dev = NULL;
822}
823
824
825/**
826 * gether_connect - notify network layer that USB link is active
827 * @link: the USB link, set up with endpoints, descriptors matching
828 * current device speed, and any framing wrapper(s) set up.
829 * Context: irqs blocked
830 *
831 * This is called to activate endpoints and let the network layer know
832 * the connection is active ("carrier detect"). It may cause the I/O
833 * queues to open and start letting network packets flow, but will in
834 * any case activate the endpoints so that they respond properly to the
835 * USB host.
836 *
837 * Verify net_device pointer returned using IS_ERR(). If it doesn't
838 * indicate some error code (negative errno), ep->driver_data values
839 * have been overwritten.
840 */
841struct net_device *gether_connect(struct gether *link)
842{
843 struct eth_dev *dev = the_dev;
844 int result = 0;
845
846 if (!dev)
847 return ERR_PTR(-EINVAL);
848
849 link->in_ep->driver_data = dev;
850 result = usb_ep_enable(link->in_ep, link->in);
851 if (result != 0) {
852 DBG(dev, "enable %s --> %d\n",
853 link->in_ep->name, result);
854 goto fail0;
855 }
856
857 link->out_ep->driver_data = dev;
858 result = usb_ep_enable(link->out_ep, link->out);
859 if (result != 0) {
860 DBG(dev, "enable %s --> %d\n",
861 link->out_ep->name, result);
862 goto fail1;
863 }
864
865 if (result == 0)
866 result = alloc_requests(dev, link, qlen(dev->gadget));
867
868 if (result == 0) {
869 dev->zlp = link->is_zlp_ok;
870 DBG(dev, "qlen %d\n", qlen(dev->gadget));
871
872 dev->header_len = link->header_len;
873 dev->unwrap = link->unwrap;
874 dev->wrap = link->wrap;
875
876 spin_lock(&dev->lock);
877 dev->port_usb = link;
878 link->ioport = dev;
879 spin_unlock(&dev->lock);
880
881 netif_carrier_on(dev->net);
882 if (netif_running(dev->net))
883 eth_start(dev, GFP_ATOMIC);
884
885 /* on error, disable any endpoints */
886 } else {
887 (void) usb_ep_disable(link->out_ep);
888fail1:
889 (void) usb_ep_disable(link->in_ep);
890 }
891fail0:
892 /* caller is responsible for cleanup on error */
893 if (result < 0)
894 return ERR_PTR(result);
895 return dev->net;
896}
897
898/**
899 * gether_disconnect - notify network layer that USB link is inactive
900 * @link: the USB link, on which gether_connect() was called
901 * Context: irqs blocked
902 *
903 * This is called to deactivate endpoints and let the network layer know
904 * the connection went inactive ("no carrier").
905 *
906 * On return, the state is as if gether_connect() had never been called.
907 * The endpoints are inactive, and accordingly without active USB I/O.
908 * Pointers to endpoint descriptors and endpoint private data are nulled.
909 */
910void gether_disconnect(struct gether *link)
911{
912 struct eth_dev *dev = link->ioport;
913 struct usb_request *req;
914
915 WARN_ON(!dev);
916 if (!dev)
917 return;
918
919 DBG(dev, "%s\n", __func__);
920
921 netif_stop_queue(dev->net);
922 netif_carrier_off(dev->net);
923
924 /* disable endpoints, forcing (synchronous) completion
925 * of all pending i/o. then free the request objects
926 * and forget about the endpoints.
927 */
928 usb_ep_disable(link->in_ep);
929 spin_lock(&dev->req_lock);
930 while (!list_empty(&dev->tx_reqs)) {
931 req = container_of(dev->tx_reqs.next,
932 struct usb_request, list);
933 list_del(&req->list);
934
935 spin_unlock(&dev->req_lock);
936 usb_ep_free_request(link->in_ep, req);
937 spin_lock(&dev->req_lock);
938 }
939 spin_unlock(&dev->req_lock);
940 link->in_ep->driver_data = NULL;
941 link->in = NULL;
942
943 usb_ep_disable(link->out_ep);
944 spin_lock(&dev->req_lock);
945 while (!list_empty(&dev->rx_reqs)) {
946 req = container_of(dev->rx_reqs.next,
947 struct usb_request, list);
948 list_del(&req->list);
949
950 spin_unlock(&dev->req_lock);
951 usb_ep_free_request(link->out_ep, req);
952 spin_lock(&dev->req_lock);
953 }
954 spin_unlock(&dev->req_lock);
955 link->out_ep->driver_data = NULL;
956 link->out = NULL;
957
958 /* finish forgetting about this USB link episode */
959 dev->header_len = 0;
960 dev->unwrap = NULL;
961 dev->wrap = NULL;
962
963 spin_lock(&dev->lock);
964 dev->port_usb = NULL;
965 link->ioport = NULL;
966 spin_unlock(&dev->lock);
967}
diff --git a/drivers/usb/gadget/u_ether.h b/drivers/usb/gadget/u_ether.h
new file mode 100644
index 000000000000..0d1f7ae3b071
--- /dev/null
+++ b/drivers/usb/gadget/u_ether.h
@@ -0,0 +1,127 @@
1/*
2 * u_ether.h -- interface to USB gadget "ethernet link" utilities
3 *
4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
6 * Copyright (C) 2008 Nokia Corporation
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23#ifndef __U_ETHER_H
24#define __U_ETHER_H
25
26#include <linux/err.h>
27#include <linux/if_ether.h>
28#include <linux/usb/composite.h>
29#include <linux/usb/cdc.h>
30
31#include "gadget_chips.h"
32
33
34/*
35 * This represents the USB side of an "ethernet" link, managed by a USB
36 * function which provides control and (maybe) framing. Two functions
37 * in different configurations could share the same ethernet link/netdev,
38 * using different host interaction models.
39 *
40 * There is a current limitation that only one instance of this link may
41 * be present in any given configuration. When that's a problem, network
42 * layer facilities can be used to package multiple logical links on this
43 * single "physical" one.
44 */
45struct gether {
46 struct usb_function func;
47
48 /* updated by gether_{connect,disconnect} */
49 struct eth_dev *ioport;
50
51 /* endpoints handle full and/or high speeds */
52 struct usb_ep *in_ep;
53 struct usb_ep *out_ep;
54
55 /* descriptors match device speed at gether_connect() time */
56 struct usb_endpoint_descriptor *in;
57 struct usb_endpoint_descriptor *out;
58
59 bool is_zlp_ok;
60
61 u16 cdc_filter;
62
63 /* hooks for added framing, as needed for RNDIS and EEM.
64 * we currently don't support multiple frames per SKB.
65 */
66 u32 header_len;
67 struct sk_buff *(*wrap)(struct sk_buff *skb);
68 int (*unwrap)(struct sk_buff *skb);
69
70 /* called on network open/close */
71 void (*open)(struct gether *);
72 void (*close)(struct gether *);
73};
74
75#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \
76 |USB_CDC_PACKET_TYPE_ALL_MULTICAST \
77 |USB_CDC_PACKET_TYPE_PROMISCUOUS \
78 |USB_CDC_PACKET_TYPE_DIRECTED)
79
80
81/* netdev setup/teardown as directed by the gadget driver */
82int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]);
83void gether_cleanup(void);
84
85/* connect/disconnect is handled by individual functions */
86struct net_device *gether_connect(struct gether *);
87void gether_disconnect(struct gether *);
88
89/* Some controllers can't support CDC Ethernet (ECM) ... */
90static inline bool can_support_ecm(struct usb_gadget *gadget)
91{
92 if (!gadget_supports_altsettings(gadget))
93 return false;
94
95 /* SA1100 can do ECM, *without* status endpoint ... but we'll
96 * only use it in non-ECM mode for backwards compatibility
97 * (and since we currently require a status endpoint)
98 */
99 if (gadget_is_sa1100(gadget))
100 return false;
101
102 /* Everything else is *presumably* fine ... but this is a bit
103 * chancy, so be **CERTAIN** there are no hardware issues with
104 * your controller. Add it above if it can't handle CDC.
105 */
106 return true;
107}
108
109/* each configuration may bind one instance of an ethernet link */
110int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
111int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
112
113#ifdef CONFIG_USB_ETH_RNDIS
114
115int rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
116
117#else
118
119static inline int
120rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
121{
122 return 0;
123}
124
125#endif
126
127#endif /* __U_ETHER_H */
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c
new file mode 100644
index 000000000000..abf9505d3a75
--- /dev/null
+++ b/drivers/usb/gadget/u_serial.c
@@ -0,0 +1,1246 @@
1/*
2 * u_serial.c - utilities for USB gadget "serial port"/TTY support
3 *
4 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
5 * Copyright (C) 2008 David Brownell
6 * Copyright (C) 2008 by Nokia Corporation
7 *
8 * This code also borrows from usbserial.c, which is
9 * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com)
10 * Copyright (C) 2000 Peter Berger (pberger@brimson.com)
11 * Copyright (C) 2000 Al Borchers (alborchers@steinerpoint.com)
12 *
13 * This software is distributed under the terms of the GNU General
14 * Public License ("GPL") as published by the Free Software Foundation,
15 * either version 2 of that License or (at your option) any later version.
16 */
17
18/* #define VERBOSE_DEBUG */
19
20#include <linux/kernel.h>
21#include <linux/interrupt.h>
22#include <linux/device.h>
23#include <linux/delay.h>
24#include <linux/tty.h>
25#include <linux/tty_flip.h>
26
27#include "u_serial.h"
28
29
30/*
31 * This component encapsulates the TTY layer glue needed to provide basic
32 * "serial port" functionality through the USB gadget stack. Each such
33 * port is exposed through a /dev/ttyGS* node.
34 *
35 * After initialization (gserial_setup), these TTY port devices stay
36 * available until they are removed (gserial_cleanup). Each one may be
37 * connected to a USB function (gserial_connect), or disconnected (with
38 * gserial_disconnect) when the USB host issues a config change event.
39 * Data can only flow when the port is connected to the host.
40 *
41 * A given TTY port can be made available in multiple configurations.
42 * For example, each one might expose a ttyGS0 node which provides a
43 * login application. In one case that might use CDC ACM interface 0,
44 * while another configuration might use interface 3 for that. The
45 * work to handle that (including descriptor management) is not part
46 * of this component.
47 *
48 * Configurations may expose more than one TTY port. For example, if
49 * ttyGS0 provides login service, then ttyGS1 might provide dialer access
50 * for a telephone or fax link. And ttyGS2 might be something that just
51 * needs a simple byte stream interface for some messaging protocol that
52 * is managed in userspace ... OBEX, PTP, and MTP have been mentioned.
53 */
54
55/*
56 * gserial is the lifecycle interface, used by USB functions
57 * gs_port is the I/O nexus, used by the tty driver
58 * tty_struct links to the tty/filesystem framework
59 *
60 * gserial <---> gs_port ... links will be null when the USB link is
61 * inactive; managed by gserial_{connect,disconnect}().
62 * gserial->ioport == usb_ep->driver_data ... gs_port
63 * gs_port->port_usb ... gserial
64 *
65 * gs_port <---> tty_struct ... links will be null when the TTY file
66 * isn't opened; managed by gs_open()/gs_close()
67 * gserial->port_tty ... tty_struct
68 * tty_struct->driver_data ... gserial
69 */
70
71/* RX and TX queues can buffer QUEUE_SIZE packets before they hit the
72 * next layer of buffering. For TX that's a circular buffer; for RX
73 * consider it a NOP. A third layer is provided by the TTY code.
74 */
75#define QUEUE_SIZE 16
76#define WRITE_BUF_SIZE 8192 /* TX only */
77
78/* circular buffer */
79struct gs_buf {
80 unsigned buf_size;
81 char *buf_buf;
82 char *buf_get;
83 char *buf_put;
84};
85
86/*
87 * The port structure holds info for each port, one for each minor number
88 * (and thus for each /dev/ node).
89 */
90struct gs_port {
91 spinlock_t port_lock; /* guard port_* access */
92
93 struct gserial *port_usb;
94 struct tty_struct *port_tty;
95
96 unsigned open_count;
97 bool openclose; /* open/close in progress */
98 u8 port_num;
99
100 wait_queue_head_t close_wait; /* wait for last close */
101
102 struct list_head read_pool;
103 struct tasklet_struct push;
104
105 struct list_head write_pool;
106 struct gs_buf port_write_buf;
107 wait_queue_head_t drain_wait; /* wait while writes drain */
108
109 /* REVISIT this state ... */
110 struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */
111};
112
113/* increase N_PORTS if you need more */
114#define N_PORTS 4
115static struct portmaster {
116 struct mutex lock; /* protect open/close */
117 struct gs_port *port;
118} ports[N_PORTS];
119static unsigned n_ports;
120
121#define GS_CLOSE_TIMEOUT 15 /* seconds */
122
123
124
125#ifdef VERBOSE_DEBUG
126#define pr_vdebug(fmt, arg...) \
127 pr_debug(fmt, ##arg)
128#else
129#define pr_vdebug(fmt, arg...) \
130 ({ if (0) pr_debug(fmt, ##arg); })
131#endif
132
133/*-------------------------------------------------------------------------*/
134
135/* Circular Buffer */
136
137/*
138 * gs_buf_alloc
139 *
140 * Allocate a circular buffer and all associated memory.
141 */
142static int gs_buf_alloc(struct gs_buf *gb, unsigned size)
143{
144 gb->buf_buf = kmalloc(size, GFP_KERNEL);
145 if (gb->buf_buf == NULL)
146 return -ENOMEM;
147
148 gb->buf_size = size;
149 gb->buf_put = gb->buf_buf;
150 gb->buf_get = gb->buf_buf;
151
152 return 0;
153}
154
155/*
156 * gs_buf_free
157 *
158 * Free the buffer and all associated memory.
159 */
160static void gs_buf_free(struct gs_buf *gb)
161{
162 kfree(gb->buf_buf);
163 gb->buf_buf = NULL;
164}
165
166/*
167 * gs_buf_clear
168 *
169 * Clear out all data in the circular buffer.
170 */
171static void gs_buf_clear(struct gs_buf *gb)
172{
173 gb->buf_get = gb->buf_put;
174 /* equivalent to a get of all data available */
175}
176
177/*
178 * gs_buf_data_avail
179 *
180 * Return the number of bytes of data available in the circular
181 * buffer.
182 */
183static unsigned gs_buf_data_avail(struct gs_buf *gb)
184{
185 return (gb->buf_size + gb->buf_put - gb->buf_get) % gb->buf_size;
186}
187
188/*
189 * gs_buf_space_avail
190 *
191 * Return the number of bytes of space available in the circular
192 * buffer.
193 */
194static unsigned gs_buf_space_avail(struct gs_buf *gb)
195{
196 return (gb->buf_size + gb->buf_get - gb->buf_put - 1) % gb->buf_size;
197}
198
199/*
200 * gs_buf_put
201 *
202 * Copy data data from a user buffer and put it into the circular buffer.
203 * Restrict to the amount of space available.
204 *
205 * Return the number of bytes copied.
206 */
207static unsigned
208gs_buf_put(struct gs_buf *gb, const char *buf, unsigned count)
209{
210 unsigned len;
211
212 len = gs_buf_space_avail(gb);
213 if (count > len)
214 count = len;
215
216 if (count == 0)
217 return 0;
218
219 len = gb->buf_buf + gb->buf_size - gb->buf_put;
220 if (count > len) {
221 memcpy(gb->buf_put, buf, len);
222 memcpy(gb->buf_buf, buf+len, count - len);
223 gb->buf_put = gb->buf_buf + count - len;
224 } else {
225 memcpy(gb->buf_put, buf, count);
226 if (count < len)
227 gb->buf_put += count;
228 else /* count == len */
229 gb->buf_put = gb->buf_buf;
230 }
231
232 return count;
233}
234
235/*
236 * gs_buf_get
237 *
238 * Get data from the circular buffer and copy to the given buffer.
239 * Restrict to the amount of data available.
240 *
241 * Return the number of bytes copied.
242 */
243static unsigned
244gs_buf_get(struct gs_buf *gb, char *buf, unsigned count)
245{
246 unsigned len;
247
248 len = gs_buf_data_avail(gb);
249 if (count > len)
250 count = len;
251
252 if (count == 0)
253 return 0;
254
255 len = gb->buf_buf + gb->buf_size - gb->buf_get;
256 if (count > len) {
257 memcpy(buf, gb->buf_get, len);
258 memcpy(buf+len, gb->buf_buf, count - len);
259 gb->buf_get = gb->buf_buf + count - len;
260 } else {
261 memcpy(buf, gb->buf_get, count);
262 if (count < len)
263 gb->buf_get += count;
264 else /* count == len */
265 gb->buf_get = gb->buf_buf;
266 }
267
268 return count;
269}
270
271/*-------------------------------------------------------------------------*/
272
273/* I/O glue between TTY (upper) and USB function (lower) driver layers */
274
275/*
276 * gs_alloc_req
277 *
278 * Allocate a usb_request and its buffer. Returns a pointer to the
279 * usb_request or NULL if there is an error.
280 */
281static struct usb_request *
282gs_alloc_req(struct usb_ep *ep, unsigned len, gfp_t kmalloc_flags)
283{
284 struct usb_request *req;
285
286 req = usb_ep_alloc_request(ep, kmalloc_flags);
287
288 if (req != NULL) {
289 req->length = len;
290 req->buf = kmalloc(len, kmalloc_flags);
291 if (req->buf == NULL) {
292 usb_ep_free_request(ep, req);
293 return NULL;
294 }
295 }
296
297 return req;
298}
299
300/*
301 * gs_free_req
302 *
303 * Free a usb_request and its buffer.
304 */
305static void gs_free_req(struct usb_ep *ep, struct usb_request *req)
306{
307 kfree(req->buf);
308 usb_ep_free_request(ep, req);
309}
310
311/*
312 * gs_send_packet
313 *
314 * If there is data to send, a packet is built in the given
315 * buffer and the size is returned. If there is no data to
316 * send, 0 is returned.
317 *
318 * Called with port_lock held.
319 */
320static unsigned
321gs_send_packet(struct gs_port *port, char *packet, unsigned size)
322{
323 unsigned len;
324
325 len = gs_buf_data_avail(&port->port_write_buf);
326 if (len < size)
327 size = len;
328 if (size != 0)
329 size = gs_buf_get(&port->port_write_buf, packet, size);
330 return size;
331}
332
333/*
334 * gs_start_tx
335 *
336 * This function finds available write requests, calls
337 * gs_send_packet to fill these packets with data, and
338 * continues until either there are no more write requests
339 * available or no more data to send. This function is
340 * run whenever data arrives or write requests are available.
341 *
342 * Context: caller owns port_lock; port_usb is non-null.
343 */
344static int gs_start_tx(struct gs_port *port)
345/*
346__releases(&port->port_lock)
347__acquires(&port->port_lock)
348*/
349{
350 struct list_head *pool = &port->write_pool;
351 struct usb_ep *in = port->port_usb->in;
352 int status = 0;
353 bool do_tty_wake = false;
354
355 while (!list_empty(pool)) {
356 struct usb_request *req;
357 int len;
358
359 req = list_entry(pool->next, struct usb_request, list);
360 len = gs_send_packet(port, req->buf, in->maxpacket);
361 if (len == 0) {
362 wake_up_interruptible(&port->drain_wait);
363 break;
364 }
365 do_tty_wake = true;
366
367 req->length = len;
368 list_del(&req->list);
369
370#ifdef VERBOSE_DEBUG
371 pr_debug("%s: %s, len=%d, 0x%02x 0x%02x 0x%02x ...\n",
372 __func__, in->name, len, *((u8 *)req->buf),
373 *((u8 *)req->buf+1), *((u8 *)req->buf+2));
374#endif
375
376 /* Drop lock while we call out of driver; completions
377 * could be issued while we do so. Disconnection may
378 * happen too; maybe immediately before we queue this!
379 *
380 * NOTE that we may keep sending data for a while after
381 * the TTY closed (dev->ioport->port_tty is NULL).
382 */
383 spin_unlock(&port->port_lock);
384 status = usb_ep_queue(in, req, GFP_ATOMIC);
385 spin_lock(&port->port_lock);
386
387 if (status) {
388 pr_debug("%s: %s %s err %d\n",
389 __func__, "queue", in->name, status);
390 list_add(&req->list, pool);
391 break;
392 }
393
394 /* abort immediately after disconnect */
395 if (!port->port_usb)
396 break;
397 }
398
399 if (do_tty_wake && port->port_tty)
400 tty_wakeup(port->port_tty);
401 return status;
402}
403
404static void gs_rx_push(unsigned long _port)
405{
406 struct gs_port *port = (void *)_port;
407 struct tty_struct *tty = port->port_tty;
408
409 /* With low_latency, tty_flip_buffer_push() doesn't put its
410 * real work through a workqueue, so the ldisc has a better
411 * chance to keep up with peak USB data rates.
412 */
413 if (tty) {
414 tty_flip_buffer_push(tty);
415 wake_up_interruptible(&tty->read_wait);
416 }
417}
418
419/*
420 * gs_recv_packet
421 *
422 * Called for each USB packet received. Reads the packet
423 * header and stuffs the data in the appropriate tty buffer.
424 * Returns 0 if successful, or a negative error number.
425 *
426 * Called during USB completion routine, on interrupt time.
427 * With port_lock.
428 */
429static int gs_recv_packet(struct gs_port *port, char *packet, unsigned size)
430{
431 unsigned len;
432 struct tty_struct *tty;
433
434 /* I/O completions can continue for a while after close(), until the
435 * request queue empties. Just discard any data we receive, until
436 * something reopens this TTY ... as if there were no HW flow control.
437 */
438 tty = port->port_tty;
439 if (tty == NULL) {
440 pr_vdebug("%s: ttyGS%d, after close\n",
441 __func__, port->port_num);
442 return -EIO;
443 }
444
445 len = tty_insert_flip_string(tty, packet, size);
446 if (len > 0)
447 tasklet_schedule(&port->push);
448 if (len < size)
449 pr_debug("%s: ttyGS%d, drop %d bytes\n",
450 __func__, port->port_num, size - len);
451 return 0;
452}
453
454/*
455 * Context: caller owns port_lock, and port_usb is set
456 */
457static unsigned gs_start_rx(struct gs_port *port)
458/*
459__releases(&port->port_lock)
460__acquires(&port->port_lock)
461*/
462{
463 struct list_head *pool = &port->read_pool;
464 struct usb_ep *out = port->port_usb->out;
465 unsigned started = 0;
466
467 while (!list_empty(pool)) {
468 struct usb_request *req;
469 int status;
470 struct tty_struct *tty;
471
472 /* no more rx if closed or throttled */
473 tty = port->port_tty;
474 if (!tty || test_bit(TTY_THROTTLED, &tty->flags))
475 break;
476
477 req = list_entry(pool->next, struct usb_request, list);
478 list_del(&req->list);
479 req->length = out->maxpacket;
480
481 /* drop lock while we call out; the controller driver
482 * may need to call us back (e.g. for disconnect)
483 */
484 spin_unlock(&port->port_lock);
485 status = usb_ep_queue(out, req, GFP_ATOMIC);
486 spin_lock(&port->port_lock);
487
488 if (status) {
489 pr_debug("%s: %s %s err %d\n",
490 __func__, "queue", out->name, status);
491 list_add(&req->list, pool);
492 break;
493 }
494 started++;
495
496 /* abort immediately after disconnect */
497 if (!port->port_usb)
498 break;
499 }
500 return started;
501}
502
503static void gs_read_complete(struct usb_ep *ep, struct usb_request *req)
504{
505 int status;
506 struct gs_port *port = ep->driver_data;
507
508 spin_lock(&port->port_lock);
509 list_add(&req->list, &port->read_pool);
510
511 switch (req->status) {
512 case 0:
513 /* normal completion */
514 status = gs_recv_packet(port, req->buf, req->actual);
515 if (status && status != -EIO)
516 pr_debug("%s: %s %s err %d\n",
517 __func__, "recv", ep->name, status);
518 gs_start_rx(port);
519 break;
520
521 case -ESHUTDOWN:
522 /* disconnect */
523 pr_vdebug("%s: %s shutdown\n", __func__, ep->name);
524 break;
525
526 default:
527 /* presumably a transient fault */
528 pr_warning("%s: unexpected %s status %d\n",
529 __func__, ep->name, req->status);
530 gs_start_rx(port);
531 break;
532 }
533 spin_unlock(&port->port_lock);
534}
535
536static void gs_write_complete(struct usb_ep *ep, struct usb_request *req)
537{
538 struct gs_port *port = ep->driver_data;
539
540 spin_lock(&port->port_lock);
541 list_add(&req->list, &port->write_pool);
542
543 switch (req->status) {
544 default:
545 /* presumably a transient fault */
546 pr_warning("%s: unexpected %s status %d\n",
547 __func__, ep->name, req->status);
548 /* FALL THROUGH */
549 case 0:
550 /* normal completion */
551 gs_start_tx(port);
552 break;
553
554 case -ESHUTDOWN:
555 /* disconnect */
556 pr_vdebug("%s: %s shutdown\n", __func__, ep->name);
557 break;
558 }
559
560 spin_unlock(&port->port_lock);
561}
562
563static void gs_free_requests(struct usb_ep *ep, struct list_head *head)
564{
565 struct usb_request *req;
566
567 while (!list_empty(head)) {
568 req = list_entry(head->next, struct usb_request, list);
569 list_del(&req->list);
570 gs_free_req(ep, req);
571 }
572}
573
574static int gs_alloc_requests(struct usb_ep *ep, struct list_head *head,
575 void (*fn)(struct usb_ep *, struct usb_request *))
576{
577 int i;
578 struct usb_request *req;
579
580 /* Pre-allocate up to QUEUE_SIZE transfers, but if we can't
581 * do quite that many this time, don't fail ... we just won't
582 * be as speedy as we might otherwise be.
583 */
584 for (i = 0; i < QUEUE_SIZE; i++) {
585 req = gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC);
586 if (!req)
587 return list_empty(head) ? -ENOMEM : 0;
588 req->complete = fn;
589 list_add_tail(&req->list, head);
590 }
591 return 0;
592}
593
594/**
595 * gs_start_io - start USB I/O streams
596 * @dev: encapsulates endpoints to use
597 * Context: holding port_lock; port_tty and port_usb are non-null
598 *
599 * We only start I/O when something is connected to both sides of
600 * this port. If nothing is listening on the host side, we may
601 * be pointlessly filling up our TX buffers and FIFO.
602 */
603static int gs_start_io(struct gs_port *port)
604{
605 struct list_head *head = &port->read_pool;
606 struct usb_ep *ep = port->port_usb->out;
607 int status;
608 unsigned started;
609
610 /* Allocate RX and TX I/O buffers. We can't easily do this much
611 * earlier (with GFP_KERNEL) because the requests are coupled to
612 * endpoints, as are the packet sizes we'll be using. Different
613 * configurations may use different endpoints with a given port;
614 * and high speed vs full speed changes packet sizes too.
615 */
616 status = gs_alloc_requests(ep, head, gs_read_complete);
617 if (status)
618 return status;
619
620 status = gs_alloc_requests(port->port_usb->in, &port->write_pool,
621 gs_write_complete);
622 if (status) {
623 gs_free_requests(ep, head);
624 return status;
625 }
626
627 /* queue read requests */
628 started = gs_start_rx(port);
629
630 /* unblock any pending writes into our circular buffer */
631 if (started) {
632 tty_wakeup(port->port_tty);
633 } else {
634 gs_free_requests(ep, head);
635 gs_free_requests(port->port_usb->in, &port->write_pool);
636 }
637
638 return started ? 0 : status;
639}
640
641/*-------------------------------------------------------------------------*/
642
643/* TTY Driver */
644
645/*
646 * gs_open sets up the link between a gs_port and its associated TTY.
647 * That link is broken *only* by TTY close(), and all driver methods
648 * know that.
649 */
650static int gs_open(struct tty_struct *tty, struct file *file)
651{
652 int port_num = tty->index;
653 struct gs_port *port;
654 int status;
655
656 if (port_num < 0 || port_num >= n_ports)
657 return -ENXIO;
658
659 do {
660 mutex_lock(&ports[port_num].lock);
661 port = ports[port_num].port;
662 if (!port)
663 status = -ENODEV;
664 else {
665 spin_lock_irq(&port->port_lock);
666
667 /* already open? Great. */
668 if (port->open_count) {
669 status = 0;
670 port->open_count++;
671
672 /* currently opening/closing? wait ... */
673 } else if (port->openclose) {
674 status = -EBUSY;
675
676 /* ... else we do the work */
677 } else {
678 status = -EAGAIN;
679 port->openclose = true;
680 }
681 spin_unlock_irq(&port->port_lock);
682 }
683 mutex_unlock(&ports[port_num].lock);
684
685 switch (status) {
686 default:
687 /* fully handled */
688 return status;
689 case -EAGAIN:
690 /* must do the work */
691 break;
692 case -EBUSY:
693 /* wait for EAGAIN task to finish */
694 msleep(1);
695 /* REVISIT could have a waitchannel here, if
696 * concurrent open performance is important
697 */
698 break;
699 }
700 } while (status != -EAGAIN);
701
702 /* Do the "real open" */
703 spin_lock_irq(&port->port_lock);
704
705 /* allocate circular buffer on first open */
706 if (port->port_write_buf.buf_buf == NULL) {
707
708 spin_unlock_irq(&port->port_lock);
709 status = gs_buf_alloc(&port->port_write_buf, WRITE_BUF_SIZE);
710 spin_lock_irq(&port->port_lock);
711
712 if (status) {
713 pr_debug("gs_open: ttyGS%d (%p,%p) no buffer\n",
714 port->port_num, tty, file);
715 port->openclose = false;
716 goto exit_unlock_port;
717 }
718 }
719
720 /* REVISIT if REMOVED (ports[].port NULL), abort the open
721 * to let rmmod work faster (but this way isn't wrong).
722 */
723
724 /* REVISIT maybe wait for "carrier detect" */
725
726 tty->driver_data = port;
727 port->port_tty = tty;
728
729 port->open_count = 1;
730 port->openclose = false;
731
732 /* low_latency means ldiscs work in tasklet context, without
733 * needing a workqueue schedule ... easier to keep up.
734 */
735 tty->low_latency = 1;
736
737 /* if connected, start the I/O stream */
738 if (port->port_usb) {
739 pr_debug("gs_open: start ttyGS%d\n", port->port_num);
740 gs_start_io(port);
741
742 /* REVISIT for ACM, issue "network connected" event */
743 }
744
745 pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file);
746
747 status = 0;
748
749exit_unlock_port:
750 spin_unlock_irq(&port->port_lock);
751 return status;
752}
753
754static int gs_writes_finished(struct gs_port *p)
755{
756 int cond;
757
758 /* return true on disconnect or empty buffer */
759 spin_lock_irq(&p->port_lock);
760 cond = (p->port_usb == NULL) || !gs_buf_data_avail(&p->port_write_buf);
761 spin_unlock_irq(&p->port_lock);
762
763 return cond;
764}
765
766static void gs_close(struct tty_struct *tty, struct file *file)
767{
768 struct gs_port *port = tty->driver_data;
769
770 spin_lock_irq(&port->port_lock);
771
772 if (port->open_count != 1) {
773 if (port->open_count == 0)
774 WARN_ON(1);
775 else
776 --port->open_count;
777 goto exit;
778 }
779
780 pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file);
781
782 /* mark port as closing but in use; we can drop port lock
783 * and sleep if necessary
784 */
785 port->openclose = true;
786 port->open_count = 0;
787
788 if (port->port_usb)
789 /* REVISIT for ACM, issue "network disconnected" event */;
790
791 /* wait for circular write buffer to drain, disconnect, or at
792 * most GS_CLOSE_TIMEOUT seconds; then discard the rest
793 */
794 if (gs_buf_data_avail(&port->port_write_buf) > 0
795 && port->port_usb) {
796 spin_unlock_irq(&port->port_lock);
797 wait_event_interruptible_timeout(port->drain_wait,
798 gs_writes_finished(port),
799 GS_CLOSE_TIMEOUT * HZ);
800 spin_lock_irq(&port->port_lock);
801 }
802
803 /* Iff we're disconnected, there can be no I/O in flight so it's
804 * ok to free the circular buffer; else just scrub it. And don't
805 * let the push tasklet fire again until we're re-opened.
806 */
807 if (port->port_usb == NULL)
808 gs_buf_free(&port->port_write_buf);
809 else
810 gs_buf_clear(&port->port_write_buf);
811
812 tasklet_kill(&port->push);
813
814 tty->driver_data = NULL;
815 port->port_tty = NULL;
816
817 port->openclose = false;
818
819 pr_debug("gs_close: ttyGS%d (%p,%p) done!\n",
820 port->port_num, tty, file);
821
822 wake_up_interruptible(&port->close_wait);
823exit:
824 spin_unlock_irq(&port->port_lock);
825}
826
827static int gs_write(struct tty_struct *tty, const unsigned char *buf, int count)
828{
829 struct gs_port *port = tty->driver_data;
830 unsigned long flags;
831 int status;
832
833 pr_vdebug("gs_write: ttyGS%d (%p) writing %d bytes\n",
834 port->port_num, tty, count);
835
836 spin_lock_irqsave(&port->port_lock, flags);
837 if (count)
838 count = gs_buf_put(&port->port_write_buf, buf, count);
839 /* treat count == 0 as flush_chars() */
840 if (port->port_usb)
841 status = gs_start_tx(port);
842 spin_unlock_irqrestore(&port->port_lock, flags);
843
844 return count;
845}
846
847static int gs_put_char(struct tty_struct *tty, unsigned char ch)
848{
849 struct gs_port *port = tty->driver_data;
850 unsigned long flags;
851 int status;
852
853 pr_vdebug("gs_put_char: (%d,%p) char=0x%x, called from %p\n",
854 port->port_num, tty, ch, __builtin_return_address(0));
855
856 spin_lock_irqsave(&port->port_lock, flags);
857 status = gs_buf_put(&port->port_write_buf, &ch, 1);
858 spin_unlock_irqrestore(&port->port_lock, flags);
859
860 return status;
861}
862
863static void gs_flush_chars(struct tty_struct *tty)
864{
865 struct gs_port *port = tty->driver_data;
866 unsigned long flags;
867
868 pr_vdebug("gs_flush_chars: (%d,%p)\n", port->port_num, tty);
869
870 spin_lock_irqsave(&port->port_lock, flags);
871 if (port->port_usb)
872 gs_start_tx(port);
873 spin_unlock_irqrestore(&port->port_lock, flags);
874}
875
876static int gs_write_room(struct tty_struct *tty)
877{
878 struct gs_port *port = tty->driver_data;
879 unsigned long flags;
880 int room = 0;
881
882 spin_lock_irqsave(&port->port_lock, flags);
883 if (port->port_usb)
884 room = gs_buf_space_avail(&port->port_write_buf);
885 spin_unlock_irqrestore(&port->port_lock, flags);
886
887 pr_vdebug("gs_write_room: (%d,%p) room=%d\n",
888 port->port_num, tty, room);
889
890 return room;
891}
892
893static int gs_chars_in_buffer(struct tty_struct *tty)
894{
895 struct gs_port *port = tty->driver_data;
896 unsigned long flags;
897 int chars = 0;
898
899 spin_lock_irqsave(&port->port_lock, flags);
900 chars = gs_buf_data_avail(&port->port_write_buf);
901 spin_unlock_irqrestore(&port->port_lock, flags);
902
903 pr_vdebug("gs_chars_in_buffer: (%d,%p) chars=%d\n",
904 port->port_num, tty, chars);
905
906 return chars;
907}
908
909/* undo side effects of setting TTY_THROTTLED */
910static void gs_unthrottle(struct tty_struct *tty)
911{
912 struct gs_port *port = tty->driver_data;
913 unsigned long flags;
914 unsigned started = 0;
915
916 spin_lock_irqsave(&port->port_lock, flags);
917 if (port->port_usb)
918 started = gs_start_rx(port);
919 spin_unlock_irqrestore(&port->port_lock, flags);
920
921 pr_vdebug("gs_unthrottle: ttyGS%d, %d packets\n",
922 port->port_num, started);
923}
924
925static const struct tty_operations gs_tty_ops = {
926 .open = gs_open,
927 .close = gs_close,
928 .write = gs_write,
929 .put_char = gs_put_char,
930 .flush_chars = gs_flush_chars,
931 .write_room = gs_write_room,
932 .chars_in_buffer = gs_chars_in_buffer,
933 .unthrottle = gs_unthrottle,
934};
935
936/*-------------------------------------------------------------------------*/
937
938static struct tty_driver *gs_tty_driver;
939
940static int __init
941gs_port_alloc(unsigned port_num, struct usb_cdc_line_coding *coding)
942{
943 struct gs_port *port;
944
945 port = kzalloc(sizeof(struct gs_port), GFP_KERNEL);
946 if (port == NULL)
947 return -ENOMEM;
948
949 spin_lock_init(&port->port_lock);
950 init_waitqueue_head(&port->close_wait);
951 init_waitqueue_head(&port->drain_wait);
952
953 tasklet_init(&port->push, gs_rx_push, (unsigned long) port);
954
955 INIT_LIST_HEAD(&port->read_pool);
956 INIT_LIST_HEAD(&port->write_pool);
957
958 port->port_num = port_num;
959 port->port_line_coding = *coding;
960
961 ports[port_num].port = port;
962
963 return 0;
964}
965
966/**
967 * gserial_setup - initialize TTY driver for one or more ports
968 * @g: gadget to associate with these ports
969 * @count: how many ports to support
970 * Context: may sleep
971 *
972 * The TTY stack needs to know in advance how many devices it should
973 * plan to manage. Use this call to set up the ports you will be
974 * exporting through USB. Later, connect them to functions based
975 * on what configuration is activated by the USB host; and disconnect
976 * them as appropriate.
977 *
978 * An example would be a two-configuration device in which both
979 * configurations expose port 0, but through different functions.
980 * One configuration could even expose port 1 while the other
981 * one doesn't.
982 *
983 * Returns negative errno or zero.
984 */
985int __init gserial_setup(struct usb_gadget *g, unsigned count)
986{
987 unsigned i;
988 struct usb_cdc_line_coding coding;
989 int status;
990
991 if (count == 0 || count > N_PORTS)
992 return -EINVAL;
993
994 gs_tty_driver = alloc_tty_driver(count);
995 if (!gs_tty_driver)
996 return -ENOMEM;
997
998 gs_tty_driver->owner = THIS_MODULE;
999 gs_tty_driver->driver_name = "g_serial";
1000 gs_tty_driver->name = "ttyGS";
1001 /* uses dynamically assigned dev_t values */
1002
1003 gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1004 gs_tty_driver->subtype = SERIAL_TYPE_NORMAL;
1005 gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
1006 gs_tty_driver->init_termios = tty_std_termios;
1007
1008 /* 9600-8-N-1 ... matches defaults expected by "usbser.sys" on
1009 * MS-Windows. Otherwise, most of these flags shouldn't affect
1010 * anything unless we were to actually hook up to a serial line.
1011 */
1012 gs_tty_driver->init_termios.c_cflag =
1013 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1014 gs_tty_driver->init_termios.c_ispeed = 9600;
1015 gs_tty_driver->init_termios.c_ospeed = 9600;
1016
1017 coding.dwDTERate = __constant_cpu_to_le32(9600);
1018 coding.bCharFormat = 8;
1019 coding.bParityType = USB_CDC_NO_PARITY;
1020 coding.bDataBits = USB_CDC_1_STOP_BITS;
1021
1022 tty_set_operations(gs_tty_driver, &gs_tty_ops);
1023
1024 /* make devices be openable */
1025 for (i = 0; i < count; i++) {
1026 mutex_init(&ports[i].lock);
1027 status = gs_port_alloc(i, &coding);
1028 if (status) {
1029 count = i;
1030 goto fail;
1031 }
1032 }
1033 n_ports = count;
1034
1035 /* export the driver ... */
1036 status = tty_register_driver(gs_tty_driver);
1037 if (status) {
1038 put_tty_driver(gs_tty_driver);
1039 pr_err("%s: cannot register, err %d\n",
1040 __func__, status);
1041 goto fail;
1042 }
1043
1044 /* ... and sysfs class devices, so mdev/udev make /dev/ttyGS* */
1045 for (i = 0; i < count; i++) {
1046 struct device *tty_dev;
1047
1048 tty_dev = tty_register_device(gs_tty_driver, i, &g->dev);
1049 if (IS_ERR(tty_dev))
1050 pr_warning("%s: no classdev for port %d, err %ld\n",
1051 __func__, i, PTR_ERR(tty_dev));
1052 }
1053
1054 pr_debug("%s: registered %d ttyGS* device%s\n", __func__,
1055 count, (count == 1) ? "" : "s");
1056
1057 return status;
1058fail:
1059 while (count--)
1060 kfree(ports[count].port);
1061 put_tty_driver(gs_tty_driver);
1062 gs_tty_driver = NULL;
1063 return status;
1064}
1065
1066static int gs_closed(struct gs_port *port)
1067{
1068 int cond;
1069
1070 spin_lock_irq(&port->port_lock);
1071 cond = (port->open_count == 0) && !port->openclose;
1072 spin_unlock_irq(&port->port_lock);
1073 return cond;
1074}
1075
1076/**
1077 * gserial_cleanup - remove TTY-over-USB driver and devices
1078 * Context: may sleep
1079 *
1080 * This is called to free all resources allocated by @gserial_setup().
1081 * Accordingly, it may need to wait until some open /dev/ files have
1082 * closed.
1083 *
1084 * The caller must have issued @gserial_disconnect() for any ports
1085 * that had previously been connected, so that there is never any
1086 * I/O pending when it's called.
1087 */
1088void gserial_cleanup(void)
1089{
1090 unsigned i;
1091 struct gs_port *port;
1092
1093 if (!gs_tty_driver)
1094 return;
1095
1096 /* start sysfs and /dev/ttyGS* node removal */
1097 for (i = 0; i < n_ports; i++)
1098 tty_unregister_device(gs_tty_driver, i);
1099
1100 for (i = 0; i < n_ports; i++) {
1101 /* prevent new opens */
1102 mutex_lock(&ports[i].lock);
1103 port = ports[i].port;
1104 ports[i].port = NULL;
1105 mutex_unlock(&ports[i].lock);
1106
1107 /* wait for old opens to finish */
1108 wait_event(port->close_wait, gs_closed(port));
1109
1110 WARN_ON(port->port_usb != NULL);
1111
1112 kfree(port);
1113 }
1114 n_ports = 0;
1115
1116 tty_unregister_driver(gs_tty_driver);
1117 gs_tty_driver = NULL;
1118
1119 pr_debug("%s: cleaned up ttyGS* support\n", __func__);
1120}
1121
1122/**
1123 * gserial_connect - notify TTY I/O glue that USB link is active
1124 * @gser: the function, set up with endpoints and descriptors
1125 * @port_num: which port is active
1126 * Context: any (usually from irq)
1127 *
1128 * This is called activate endpoints and let the TTY layer know that
1129 * the connection is active ... not unlike "carrier detect". It won't
1130 * necessarily start I/O queues; unless the TTY is held open by any
1131 * task, there would be no point. However, the endpoints will be
1132 * activated so the USB host can perform I/O, subject to basic USB
1133 * hardware flow control.
1134 *
1135 * Caller needs to have set up the endpoints and USB function in @dev
1136 * before calling this, as well as the appropriate (speed-specific)
1137 * endpoint descriptors, and also have set up the TTY driver by calling
1138 * @gserial_setup().
1139 *
1140 * Returns negative errno or zero.
1141 * On success, ep->driver_data will be overwritten.
1142 */
1143int gserial_connect(struct gserial *gser, u8 port_num)
1144{
1145 struct gs_port *port;
1146 unsigned long flags;
1147 int status;
1148
1149 if (!gs_tty_driver || port_num >= n_ports)
1150 return -ENXIO;
1151
1152 /* we "know" gserial_cleanup() hasn't been called */
1153 port = ports[port_num].port;
1154
1155 /* activate the endpoints */
1156 status = usb_ep_enable(gser->in, gser->in_desc);
1157 if (status < 0)
1158 return status;
1159 gser->in->driver_data = port;
1160
1161 status = usb_ep_enable(gser->out, gser->out_desc);
1162 if (status < 0)
1163 goto fail_out;
1164 gser->out->driver_data = port;
1165
1166 /* then tell the tty glue that I/O can work */
1167 spin_lock_irqsave(&port->port_lock, flags);
1168 gser->ioport = port;
1169 port->port_usb = gser;
1170
1171 /* REVISIT unclear how best to handle this state...
1172 * we don't really couple it with the Linux TTY.
1173 */
1174 gser->port_line_coding = port->port_line_coding;
1175
1176 /* REVISIT if waiting on "carrier detect", signal. */
1177
1178 /* REVISIT for ACM, issue "network connection" status notification:
1179 * connected if open_count, else disconnected.
1180 */
1181
1182 /* if it's already open, start I/O */
1183 if (port->open_count) {
1184 pr_debug("gserial_connect: start ttyGS%d\n", port->port_num);
1185 gs_start_io(port);
1186 }
1187
1188 spin_unlock_irqrestore(&port->port_lock, flags);
1189
1190 return status;
1191
1192fail_out:
1193 usb_ep_disable(gser->in);
1194 gser->in->driver_data = NULL;
1195 return status;
1196}
1197
1198/**
1199 * gserial_disconnect - notify TTY I/O glue that USB link is inactive
1200 * @gser: the function, on which gserial_connect() was called
1201 * Context: any (usually from irq)
1202 *
1203 * This is called to deactivate endpoints and let the TTY layer know
1204 * that the connection went inactive ... not unlike "hangup".
1205 *
1206 * On return, the state is as if gserial_connect() had never been called;
1207 * there is no active USB I/O on these endpoints.
1208 */
1209void gserial_disconnect(struct gserial *gser)
1210{
1211 struct gs_port *port = gser->ioport;
1212 unsigned long flags;
1213
1214 if (!port)
1215 return;
1216
1217 /* tell the TTY glue not to do I/O here any more */
1218 spin_lock_irqsave(&port->port_lock, flags);
1219
1220 /* REVISIT as above: how best to track this? */
1221 port->port_line_coding = gser->port_line_coding;
1222
1223 port->port_usb = NULL;
1224 gser->ioport = NULL;
1225 if (port->open_count > 0 || port->openclose) {
1226 wake_up_interruptible(&port->drain_wait);
1227 if (port->port_tty)
1228 tty_hangup(port->port_tty);
1229 }
1230 spin_unlock_irqrestore(&port->port_lock, flags);
1231
1232 /* disable endpoints, aborting down any active I/O */
1233 usb_ep_disable(gser->out);
1234 gser->out->driver_data = NULL;
1235
1236 usb_ep_disable(gser->in);
1237 gser->in->driver_data = NULL;
1238
1239 /* finally, free any unused/unusable I/O buffers */
1240 spin_lock_irqsave(&port->port_lock, flags);
1241 if (port->open_count == 0 && !port->openclose)
1242 gs_buf_free(&port->port_write_buf);
1243 gs_free_requests(gser->out, &port->read_pool);
1244 gs_free_requests(gser->in, &port->write_pool);
1245 spin_unlock_irqrestore(&port->port_lock, flags);
1246}
diff --git a/drivers/usb/gadget/u_serial.h b/drivers/usb/gadget/u_serial.h
new file mode 100644
index 000000000000..7b561138f90e
--- /dev/null
+++ b/drivers/usb/gadget/u_serial.h
@@ -0,0 +1,58 @@
1/*
2 * u_serial.h - interface to USB gadget "serial port"/TTY utilities
3 *
4 * Copyright (C) 2008 David Brownell
5 * Copyright (C) 2008 by Nokia Corporation
6 *
7 * This software is distributed under the terms of the GNU General
8 * Public License ("GPL") as published by the Free Software Foundation,
9 * either version 2 of that License or (at your option) any later version.
10 */
11
12#ifndef __U_SERIAL_H
13#define __U_SERIAL_H
14
15#include <linux/usb/composite.h>
16#include <linux/usb/cdc.h>
17
18/*
19 * One non-multiplexed "serial" I/O port ... there can be several of these
20 * on any given USB peripheral device, if it provides enough endpoints.
21 *
22 * The "u_serial" utility component exists to do one thing: manage TTY
23 * style I/O using the USB peripheral endpoints listed here, including
24 * hookups to sysfs and /dev for each logical "tty" device.
25 *
26 * REVISIT need TTY --> USB event flow too, so ACM can report open/close
27 * as carrier detect events. Model after ECM. There's more ACM state too.
28 *
29 * REVISIT someday, allow multiplexing several TTYs over these endpoints.
30 */
31struct gserial {
32 struct usb_function func;
33
34 /* port is managed by gserial_{connect,disconnect} */
35 struct gs_port *ioport;
36
37 struct usb_ep *in;
38 struct usb_ep *out;
39 struct usb_endpoint_descriptor *in_desc;
40 struct usb_endpoint_descriptor *out_desc;
41
42 /* REVISIT avoid this CDC-ACM support harder ... */
43 struct usb_cdc_line_coding port_line_coding; /* 9600-8-N-1 etc */
44};
45
46/* port setup/teardown is handled by gadget driver */
47int gserial_setup(struct usb_gadget *g, unsigned n_ports);
48void gserial_cleanup(void);
49
50/* connect/disconnect is handled by individual functions */
51int gserial_connect(struct gserial *, u8 port_num);
52void gserial_disconnect(struct gserial *);
53
54/* functions are bound to configurations by a config or gadget driver */
55int acm_bind_config(struct usb_configuration *c, u8 port_num);
56int gser_bind_config(struct usb_configuration *c, u8 port_num);
57
58#endif /* __U_SERIAL_H */
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c
index fce4924dbbe8..aa0bd4f126a1 100644
--- a/drivers/usb/gadget/zero.c
+++ b/drivers/usb/gadget/zero.c
@@ -1,8 +1,8 @@
1/* 1/*
2 * zero.c -- Gadget Zero, for USB development 2 * zero.c -- Gadget Zero, for USB development
3 * 3 *
4 * Copyright (C) 2003-2007 David Brownell 4 * Copyright (C) 2003-2008 David Brownell
5 * All rights reserved. 5 * Copyright (C) 2008 by Nokia Corporation
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -30,12 +30,7 @@
30 * 30 *
31 * It supports two similar configurations. One sinks whatever the usb host 31 * It supports two similar configurations. One sinks whatever the usb host
32 * writes, and in return sources zeroes. The other loops whatever the host 32 * writes, and in return sources zeroes. The other loops whatever the host
33 * writes back, so the host can read it. Module options include: 33 * writes back, so the host can read it.
34 *
35 * buflen=N default N=4096, buffer size used
36 * qlen=N default N=32, how many buffers in the loopback queue
37 * loopdefault default false, list loopback config first
38 * autoresume=N default N=0, seconds before triggering remote wakeup
39 * 34 *
40 * Many drivers will only have one configuration, letting them be much 35 * Many drivers will only have one configuration, letting them be much
41 * simpler if they also don't support high speed operation (like this 36 * simpler if they also don't support high speed operation (like this
@@ -47,94 +42,35 @@
47 * work with low capability USB controllers without four bulk endpoints. 42 * work with low capability USB controllers without four bulk endpoints.
48 */ 43 */
49 44
45/*
46 * driver assumes self-powered hardware, and
47 * has no way for users to trigger remote wakeup.
48 */
49
50/* #define VERBOSE_DEBUG */ 50/* #define VERBOSE_DEBUG */
51 51
52#include <linux/kernel.h> 52#include <linux/kernel.h>
53#include <linux/utsname.h> 53#include <linux/utsname.h>
54#include <linux/device.h> 54#include <linux/device.h>
55 55
56#include <linux/usb/ch9.h> 56#include "g_zero.h"
57#include <linux/usb/gadget.h>
58
59#include "gadget_chips.h" 57#include "gadget_chips.h"
60 58
61 59
62/*-------------------------------------------------------------------------*/ 60/*-------------------------------------------------------------------------*/
63 61
64#define DRIVER_VERSION "Earth Day 2008" 62#define DRIVER_VERSION "Cinco de Mayo 2008"
65 63
66static const char shortname[] = "zero";
67static const char longname[] = "Gadget Zero"; 64static const char longname[] = "Gadget Zero";
68 65
69static const char source_sink[] = "source and sink data"; 66unsigned buflen = 4096;
70static const char loopback[] = "loop input to output"; 67module_param(buflen, uint, 0);
71
72/*-------------------------------------------------------------------------*/
73
74/*
75 * driver assumes self-powered hardware, and
76 * has no way for users to trigger remote wakeup.
77 *
78 * this version autoconfigures as much as possible,
79 * which is reasonable for most "bulk-only" drivers.
80 */
81static const char *EP_IN_NAME; /* source */
82static const char *EP_OUT_NAME; /* sink */
83
84/*-------------------------------------------------------------------------*/
85
86/* big enough to hold our biggest descriptor */
87#define USB_BUFSIZ 256
88
89struct zero_dev {
90 spinlock_t lock;
91 struct usb_gadget *gadget;
92 struct usb_request *req; /* for control responses */
93
94 /* when configured, we have one of two configs:
95 * - source data (in to host) and sink it (out from host)
96 * - or loop it back (out from host back in to host)
97 */
98 u8 config;
99 struct usb_ep *in_ep, *out_ep;
100
101 /* autoresume timer */
102 struct timer_list resume;
103};
104
105#define DBG(d, fmt, args...) \
106 dev_dbg(&(d)->gadget->dev , fmt , ## args)
107#define VDBG(d, fmt, args...) \
108 dev_vdbg(&(d)->gadget->dev , fmt , ## args)
109#define ERROR(d, fmt, args...) \
110 dev_err(&(d)->gadget->dev , fmt , ## args)
111#define WARN(d, fmt, args...) \
112 dev_warn(&(d)->gadget->dev , fmt , ## args)
113#define INFO(d, fmt, args...) \
114 dev_info(&(d)->gadget->dev , fmt , ## args)
115
116/*-------------------------------------------------------------------------*/
117
118static unsigned buflen = 4096;
119static unsigned qlen = 32;
120static unsigned pattern = 0;
121
122module_param(buflen, uint, S_IRUGO);
123module_param(qlen, uint, S_IRUGO);
124module_param(pattern, uint, S_IRUGO|S_IWUSR);
125
126/*
127 * if it's nonzero, autoresume says how many seconds to wait
128 * before trying to wake up the host after suspend.
129 */
130static unsigned autoresume = 0;
131module_param(autoresume, uint, 0);
132 68
133/* 69/*
134 * Normally the "loopback" configuration is second (index 1) so 70 * Normally the "loopback" configuration is second (index 1) so
135 * it's not the default. Here's where to change that order, to 71 * it's not the default. Here's where to change that order, to
136 * work better with hosts where config changes are problematic. 72 * work better with hosts where config changes are problematic or
137 * Or controllers (like superh) that only support one config. 73 * controllers (like original superh) that only support one config.
138 */ 74 */
139static int loopdefault = 0; 75static int loopdefault = 0;
140module_param(loopdefault, bool, S_IRUGO|S_IWUSR); 76module_param(loopdefault, bool, S_IRUGO|S_IWUSR);
@@ -156,24 +92,6 @@ module_param(loopdefault, bool, S_IRUGO|S_IWUSR);
156 92
157/*-------------------------------------------------------------------------*/ 93/*-------------------------------------------------------------------------*/
158 94
159/*
160 * DESCRIPTORS ... most are static, but strings and (full)
161 * configuration descriptors are built on demand.
162 */
163
164#define STRING_MANUFACTURER 25
165#define STRING_PRODUCT 42
166#define STRING_SERIAL 101
167#define STRING_SOURCE_SINK 250
168#define STRING_LOOPBACK 251
169
170/*
171 * This device advertises two configurations; these numbers work
172 * on a pxa250 as well as more flexible hardware.
173 */
174#define CONFIG_SOURCE_SINK 3
175#define CONFIG_LOOPBACK 2
176
177static struct usb_device_descriptor device_desc = { 95static struct usb_device_descriptor device_desc = {
178 .bLength = sizeof device_desc, 96 .bLength = sizeof device_desc,
179 .bDescriptorType = USB_DT_DEVICE, 97 .bDescriptorType = USB_DT_DEVICE,
@@ -183,248 +101,64 @@ static struct usb_device_descriptor device_desc = {
183 101
184 .idVendor = __constant_cpu_to_le16(DRIVER_VENDOR_NUM), 102 .idVendor = __constant_cpu_to_le16(DRIVER_VENDOR_NUM),
185 .idProduct = __constant_cpu_to_le16(DRIVER_PRODUCT_NUM), 103 .idProduct = __constant_cpu_to_le16(DRIVER_PRODUCT_NUM),
186 .iManufacturer = STRING_MANUFACTURER,
187 .iProduct = STRING_PRODUCT,
188 .iSerialNumber = STRING_SERIAL,
189 .bNumConfigurations = 2, 104 .bNumConfigurations = 2,
190}; 105};
191 106
192static struct usb_config_descriptor source_sink_config = { 107#ifdef CONFIG_USB_OTG
193 .bLength = sizeof source_sink_config,
194 .bDescriptorType = USB_DT_CONFIG,
195
196 /* compute wTotalLength on the fly */
197 .bNumInterfaces = 1,
198 .bConfigurationValue = CONFIG_SOURCE_SINK,
199 .iConfiguration = STRING_SOURCE_SINK,
200 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
201 .bMaxPower = 1, /* self-powered */
202};
203
204static struct usb_config_descriptor loopback_config = {
205 .bLength = sizeof loopback_config,
206 .bDescriptorType = USB_DT_CONFIG,
207
208 /* compute wTotalLength on the fly */
209 .bNumInterfaces = 1,
210 .bConfigurationValue = CONFIG_LOOPBACK,
211 .iConfiguration = STRING_LOOPBACK,
212 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
213 .bMaxPower = 1, /* self-powered */
214};
215
216static struct usb_otg_descriptor otg_descriptor = { 108static struct usb_otg_descriptor otg_descriptor = {
217 .bLength = sizeof otg_descriptor, 109 .bLength = sizeof otg_descriptor,
218 .bDescriptorType = USB_DT_OTG, 110 .bDescriptorType = USB_DT_OTG,
219 111
220 .bmAttributes = USB_OTG_SRP, 112 /* REVISIT SRP-only hardware is possible, although
221}; 113 * it would not be called "OTG" ...
222 114 */
223/* one interface in each configuration */ 115 .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
224
225static const struct usb_interface_descriptor source_sink_intf = {
226 .bLength = sizeof source_sink_intf,
227 .bDescriptorType = USB_DT_INTERFACE,
228
229 .bNumEndpoints = 2,
230 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
231 .iInterface = STRING_SOURCE_SINK,
232};
233
234static const struct usb_interface_descriptor loopback_intf = {
235 .bLength = sizeof loopback_intf,
236 .bDescriptorType = USB_DT_INTERFACE,
237
238 .bNumEndpoints = 2,
239 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
240 .iInterface = STRING_LOOPBACK,
241};
242
243/* two full speed bulk endpoints; their use is config-dependent */
244
245static struct usb_endpoint_descriptor fs_source_desc = {
246 .bLength = USB_DT_ENDPOINT_SIZE,
247 .bDescriptorType = USB_DT_ENDPOINT,
248
249 .bEndpointAddress = USB_DIR_IN,
250 .bmAttributes = USB_ENDPOINT_XFER_BULK,
251};
252
253static struct usb_endpoint_descriptor fs_sink_desc = {
254 .bLength = USB_DT_ENDPOINT_SIZE,
255 .bDescriptorType = USB_DT_ENDPOINT,
256
257 .bEndpointAddress = USB_DIR_OUT,
258 .bmAttributes = USB_ENDPOINT_XFER_BULK,
259};
260
261static const struct usb_descriptor_header *fs_source_sink_function[] = {
262 (struct usb_descriptor_header *) &otg_descriptor,
263 (struct usb_descriptor_header *) &source_sink_intf,
264 (struct usb_descriptor_header *) &fs_sink_desc,
265 (struct usb_descriptor_header *) &fs_source_desc,
266 NULL,
267};
268
269static const struct usb_descriptor_header *fs_loopback_function[] = {
270 (struct usb_descriptor_header *) &otg_descriptor,
271 (struct usb_descriptor_header *) &loopback_intf,
272 (struct usb_descriptor_header *) &fs_sink_desc,
273 (struct usb_descriptor_header *) &fs_source_desc,
274 NULL,
275};
276
277/*
278 * usb 2.0 devices need to expose both high speed and full speed
279 * descriptors, unless they only run at full speed.
280 *
281 * that means alternate endpoint descriptors (bigger packets)
282 * and a "device qualifier" ... plus more construction options
283 * for the config descriptor.
284 */
285
286static struct usb_endpoint_descriptor hs_source_desc = {
287 .bLength = USB_DT_ENDPOINT_SIZE,
288 .bDescriptorType = USB_DT_ENDPOINT,
289
290 .bmAttributes = USB_ENDPOINT_XFER_BULK,
291 .wMaxPacketSize = __constant_cpu_to_le16(512),
292};
293
294static struct usb_endpoint_descriptor hs_sink_desc = {
295 .bLength = USB_DT_ENDPOINT_SIZE,
296 .bDescriptorType = USB_DT_ENDPOINT,
297
298 .bmAttributes = USB_ENDPOINT_XFER_BULK,
299 .wMaxPacketSize = __constant_cpu_to_le16(512),
300};
301
302static struct usb_qualifier_descriptor dev_qualifier = {
303 .bLength = sizeof dev_qualifier,
304 .bDescriptorType = USB_DT_DEVICE_QUALIFIER,
305
306 .bcdUSB = __constant_cpu_to_le16(0x0200),
307 .bDeviceClass = USB_CLASS_VENDOR_SPEC,
308
309 .bNumConfigurations = 2,
310}; 116};
311 117
312static const struct usb_descriptor_header *hs_source_sink_function[] = { 118const struct usb_descriptor_header *otg_desc[] = {
313 (struct usb_descriptor_header *) &otg_descriptor, 119 (struct usb_descriptor_header *) &otg_descriptor,
314 (struct usb_descriptor_header *) &source_sink_intf,
315 (struct usb_descriptor_header *) &hs_source_desc,
316 (struct usb_descriptor_header *) &hs_sink_desc,
317 NULL, 120 NULL,
318}; 121};
122#endif
319 123
320static const struct usb_descriptor_header *hs_loopback_function[] = { 124/* string IDs are assigned dynamically */
321 (struct usb_descriptor_header *) &otg_descriptor,
322 (struct usb_descriptor_header *) &loopback_intf,
323 (struct usb_descriptor_header *) &hs_source_desc,
324 (struct usb_descriptor_header *) &hs_sink_desc,
325 NULL,
326};
327 125
328/* maxpacket and other transfer characteristics vary by speed. */ 126#define STRING_MANUFACTURER_IDX 0
329static inline struct usb_endpoint_descriptor * 127#define STRING_PRODUCT_IDX 1
330ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *hs, 128#define STRING_SERIAL_IDX 2
331 struct usb_endpoint_descriptor *fs)
332{
333 if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
334 return hs;
335 return fs;
336}
337 129
338static char manufacturer[50]; 130static char manufacturer[50];
339 131
340/* default serial number takes at least two packets */ 132/* default serial number takes at least two packets */
341static char serial[] = "0123456789.0123456789.0123456789"; 133static char serial[] = "0123456789.0123456789.0123456789";
342 134
343 135static struct usb_string strings_dev[] = {
344/* static strings, in UTF-8 */ 136 [STRING_MANUFACTURER_IDX].s = manufacturer,
345static struct usb_string strings[] = { 137 [STRING_PRODUCT_IDX].s = longname,
346 { STRING_MANUFACTURER, manufacturer, }, 138 [STRING_SERIAL_IDX].s = serial,
347 { STRING_PRODUCT, longname, },
348 { STRING_SERIAL, serial, },
349 { STRING_LOOPBACK, loopback, },
350 { STRING_SOURCE_SINK, source_sink, },
351 { } /* end of list */ 139 { } /* end of list */
352}; 140};
353 141
354static struct usb_gadget_strings stringtab = { 142static struct usb_gadget_strings stringtab_dev = {
355 .language = 0x0409, /* en-us */ 143 .language = 0x0409, /* en-us */
356 .strings = strings, 144 .strings = strings_dev,
357}; 145};
358 146
359/* 147static struct usb_gadget_strings *dev_strings[] = {
360 * config descriptors are also handcrafted. these must agree with code 148 &stringtab_dev,
361 * that sets configurations, and with code managing interfaces and their 149 NULL,
362 * altsettings. other complexity may come from: 150};
363 *
364 * - high speed support, including "other speed config" rules
365 * - multiple configurations
366 * - interfaces with alternate settings
367 * - embedded class or vendor-specific descriptors
368 *
369 * this handles high speed, and has a second config that could as easily
370 * have been an alternate interface setting (on most hardware).
371 *
372 * NOTE: to demonstrate (and test) more USB capabilities, this driver
373 * should include an altsetting to test interrupt transfers, including
374 * high bandwidth modes at high speed. (Maybe work like Intel's test
375 * device?)
376 */
377static int config_buf(struct usb_gadget *gadget,
378 u8 *buf, u8 type, unsigned index)
379{
380 int is_source_sink;
381 int len;
382 const struct usb_descriptor_header **function;
383 int hs = 0;
384
385 /* two configurations will always be index 0 and index 1 */
386 if (index > 1)
387 return -EINVAL;
388 is_source_sink = loopdefault ? (index == 1) : (index == 0);
389
390 if (gadget_is_dualspeed(gadget)) {
391 hs = (gadget->speed == USB_SPEED_HIGH);
392 if (type == USB_DT_OTHER_SPEED_CONFIG)
393 hs = !hs;
394 }
395 if (hs)
396 function = is_source_sink
397 ? hs_source_sink_function
398 : hs_loopback_function;
399 else
400 function = is_source_sink
401 ? fs_source_sink_function
402 : fs_loopback_function;
403
404 /* for now, don't advertise srp-only devices */
405 if (!gadget_is_otg(gadget))
406 function++;
407
408 len = usb_gadget_config_buf(is_source_sink
409 ? &source_sink_config
410 : &loopback_config,
411 buf, USB_BUFSIZ, function);
412 if (len < 0)
413 return len;
414 ((struct usb_config_descriptor *) buf)->bDescriptorType = type;
415 return len;
416}
417 151
418/*-------------------------------------------------------------------------*/ 152/*-------------------------------------------------------------------------*/
419 153
420static struct usb_request *alloc_ep_req(struct usb_ep *ep, unsigned length) 154struct usb_request *alloc_ep_req(struct usb_ep *ep)
421{ 155{
422 struct usb_request *req; 156 struct usb_request *req;
423 157
424 req = usb_ep_alloc_request(ep, GFP_ATOMIC); 158 req = usb_ep_alloc_request(ep, GFP_ATOMIC);
425 if (req) { 159 if (req) {
426 req->length = length; 160 req->length = buflen;
427 req->buf = kmalloc(length, GFP_ATOMIC); 161 req->buf = kmalloc(buflen, GFP_ATOMIC);
428 if (!req->buf) { 162 if (!req->buf) {
429 usb_ep_free_request(ep, req); 163 usb_ep_free_request(ep, req);
430 req = NULL; 164 req = NULL;
@@ -433,681 +167,73 @@ static struct usb_request *alloc_ep_req(struct usb_ep *ep, unsigned length)
433 return req; 167 return req;
434} 168}
435 169
436static void free_ep_req(struct usb_ep *ep, struct usb_request *req) 170void free_ep_req(struct usb_ep *ep, struct usb_request *req)
437{ 171{
438 kfree(req->buf); 172 kfree(req->buf);
439 usb_ep_free_request(ep, req); 173 usb_ep_free_request(ep, req);
440} 174}
441 175
442/*-------------------------------------------------------------------------*/ 176static void disable_ep(struct usb_composite_dev *cdev, struct usb_ep *ep)
443
444/*
445 * SOURCE/SINK FUNCTION ... a primary testing vehicle for USB peripherals,
446 * this just sinks bulk packets OUT to the peripheral and sources them IN
447 * to the host, optionally with specific data patterns.
448 *
449 * In terms of control messaging, this supports all the standard requests
450 * plus two that support control-OUT tests.
451 *
452 * Note that because this doesn't queue more than one request at a time,
453 * some other function must be used to test queueing logic. The network
454 * link (g_ether) is probably the best option for that.
455 */
456
457/* optionally require specific source/sink data patterns */
458
459static int
460check_read_data(
461 struct zero_dev *dev,
462 struct usb_ep *ep,
463 struct usb_request *req
464)
465{ 177{
466 unsigned i; 178 int value;
467 u8 *buf = req->buf; 179
468 180 if (ep->driver_data) {
469 for (i = 0; i < req->actual; i++, buf++) { 181 value = usb_ep_disable(ep);
470 switch (pattern) { 182 if (value < 0)
471 /* all-zeroes has no synchronization issues */ 183 DBG(cdev, "disable %s --> %d\n",
472 case 0: 184 ep->name, value);
473 if (*buf == 0) 185 ep->driver_data = NULL;
474 continue;
475 break;
476 /* mod63 stays in sync with short-terminated transfers,
477 * or otherwise when host and gadget agree on how large
478 * each usb transfer request should be. resync is done
479 * with set_interface or set_config.
480 */
481 case 1:
482 if (*buf == (u8)(i % 63))
483 continue;
484 break;
485 }
486 ERROR(dev, "bad OUT byte, buf[%d] = %d\n", i, *buf);
487 usb_ep_set_halt(ep);
488 return -EINVAL;
489 } 186 }
490 return 0;
491} 187}
492 188
493static void reinit_write_data(struct usb_ep *ep, struct usb_request *req) 189void disable_endpoints(struct usb_composite_dev *cdev,
190 struct usb_ep *in, struct usb_ep *out)
494{ 191{
495 unsigned i; 192 disable_ep(cdev, in);
496 u8 *buf = req->buf; 193 disable_ep(cdev, out);
497
498 switch (pattern) {
499 case 0:
500 memset(req->buf, 0, req->length);
501 break;
502 case 1:
503 for (i = 0; i < req->length; i++)
504 *buf++ = (u8) (i % 63);
505 break;
506 }
507}
508
509/* if there is only one request in the queue, there'll always be an
510 * irq delay between end of one request and start of the next.
511 * that prevents using hardware dma queues.
512 */
513static void source_sink_complete(struct usb_ep *ep, struct usb_request *req)
514{
515 struct zero_dev *dev = ep->driver_data;
516 int status = req->status;
517
518 switch (status) {
519
520 case 0: /* normal completion? */
521 if (ep == dev->out_ep) {
522 check_read_data(dev, ep, req);
523 memset(req->buf, 0x55, req->length);
524 } else
525 reinit_write_data(ep, req);
526 break;
527
528 /* this endpoint is normally active while we're configured */
529 case -ECONNABORTED: /* hardware forced ep reset */
530 case -ECONNRESET: /* request dequeued */
531 case -ESHUTDOWN: /* disconnect from host */
532 VDBG(dev, "%s gone (%d), %d/%d\n", ep->name, status,
533 req->actual, req->length);
534 if (ep == dev->out_ep)
535 check_read_data(dev, ep, req);
536 free_ep_req(ep, req);
537 return;
538
539 case -EOVERFLOW: /* buffer overrun on read means that
540 * we didn't provide a big enough
541 * buffer.
542 */
543 default:
544#if 1
545 DBG(dev, "%s complete --> %d, %d/%d\n", ep->name,
546 status, req->actual, req->length);
547#endif
548 case -EREMOTEIO: /* short read */
549 break;
550 }
551
552 status = usb_ep_queue(ep, req, GFP_ATOMIC);
553 if (status) {
554 ERROR(dev, "kill %s: resubmit %d bytes --> %d\n",
555 ep->name, req->length, status);
556 usb_ep_set_halt(ep);
557 /* FIXME recover later ... somehow */
558 }
559}
560
561static struct usb_request *source_sink_start_ep(struct usb_ep *ep)
562{
563 struct usb_request *req;
564 int status;
565
566 req = alloc_ep_req(ep, buflen);
567 if (!req)
568 return NULL;
569
570 memset(req->buf, 0, req->length);
571 req->complete = source_sink_complete;
572
573 if (strcmp(ep->name, EP_IN_NAME) == 0)
574 reinit_write_data(ep, req);
575 else
576 memset(req->buf, 0x55, req->length);
577
578 status = usb_ep_queue(ep, req, GFP_ATOMIC);
579 if (status) {
580 struct zero_dev *dev = ep->driver_data;
581
582 ERROR(dev, "start %s --> %d\n", ep->name, status);
583 free_ep_req(ep, req);
584 req = NULL;
585 }
586
587 return req;
588}
589
590static int set_source_sink_config(struct zero_dev *dev)
591{
592 int result = 0;
593 struct usb_ep *ep;
594 struct usb_gadget *gadget = dev->gadget;
595
596 gadget_for_each_ep(ep, gadget) {
597 const struct usb_endpoint_descriptor *d;
598
599 /* one endpoint writes (sources) zeroes in (to the host) */
600 if (strcmp(ep->name, EP_IN_NAME) == 0) {
601 d = ep_desc(gadget, &hs_source_desc, &fs_source_desc);
602 result = usb_ep_enable(ep, d);
603 if (result == 0) {
604 ep->driver_data = dev;
605 if (source_sink_start_ep(ep) != NULL) {
606 dev->in_ep = ep;
607 continue;
608 }
609 usb_ep_disable(ep);
610 result = -EIO;
611 }
612
613 /* one endpoint reads (sinks) anything out (from the host) */
614 } else if (strcmp(ep->name, EP_OUT_NAME) == 0) {
615 d = ep_desc(gadget, &hs_sink_desc, &fs_sink_desc);
616 result = usb_ep_enable(ep, d);
617 if (result == 0) {
618 ep->driver_data = dev;
619 if (source_sink_start_ep(ep) != NULL) {
620 dev->out_ep = ep;
621 continue;
622 }
623 usb_ep_disable(ep);
624 result = -EIO;
625 }
626
627 /* ignore any other endpoints */
628 } else
629 continue;
630
631 /* stop on error */
632 ERROR(dev, "can't start %s, result %d\n", ep->name, result);
633 break;
634 }
635 if (result == 0)
636 DBG(dev, "buflen %d\n", buflen);
637
638 /* caller is responsible for cleanup on error */
639 return result;
640}
641
642/*-------------------------------------------------------------------------*/
643
644static void loopback_complete(struct usb_ep *ep, struct usb_request *req)
645{
646 struct zero_dev *dev = ep->driver_data;
647 int status = req->status;
648
649 switch (status) {
650
651 case 0: /* normal completion? */
652 if (ep == dev->out_ep) {
653 /* loop this OUT packet back IN to the host */
654 req->zero = (req->actual < req->length);
655 req->length = req->actual;
656 status = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC);
657 if (status == 0)
658 return;
659
660 /* "should never get here" */
661 ERROR(dev, "can't loop %s to %s: %d\n",
662 ep->name, dev->in_ep->name,
663 status);
664 }
665
666 /* queue the buffer for some later OUT packet */
667 req->length = buflen;
668 status = usb_ep_queue(dev->out_ep, req, GFP_ATOMIC);
669 if (status == 0)
670 return;
671
672 /* "should never get here" */
673 /* FALLTHROUGH */
674
675 default:
676 ERROR(dev, "%s loop complete --> %d, %d/%d\n", ep->name,
677 status, req->actual, req->length);
678 /* FALLTHROUGH */
679
680 /* NOTE: since this driver doesn't maintain an explicit record
681 * of requests it submitted (just maintains qlen count), we
682 * rely on the hardware driver to clean up on disconnect or
683 * endpoint disable.
684 */
685 case -ECONNABORTED: /* hardware forced ep reset */
686 case -ECONNRESET: /* request dequeued */
687 case -ESHUTDOWN: /* disconnect from host */
688 free_ep_req(ep, req);
689 return;
690 }
691}
692
693static int set_loopback_config(struct zero_dev *dev)
694{
695 int result = 0;
696 struct usb_ep *ep;
697 struct usb_gadget *gadget = dev->gadget;
698
699 gadget_for_each_ep(ep, gadget) {
700 const struct usb_endpoint_descriptor *d;
701
702 /* one endpoint writes data back IN to the host */
703 if (strcmp(ep->name, EP_IN_NAME) == 0) {
704 d = ep_desc(gadget, &hs_source_desc, &fs_source_desc);
705 result = usb_ep_enable(ep, d);
706 if (result == 0) {
707 ep->driver_data = dev;
708 dev->in_ep = ep;
709 continue;
710 }
711
712 /* one endpoint just reads OUT packets */
713 } else if (strcmp(ep->name, EP_OUT_NAME) == 0) {
714 d = ep_desc(gadget, &hs_sink_desc, &fs_sink_desc);
715 result = usb_ep_enable(ep, d);
716 if (result == 0) {
717 ep->driver_data = dev;
718 dev->out_ep = ep;
719 continue;
720 }
721
722 /* ignore any other endpoints */
723 } else
724 continue;
725
726 /* stop on error */
727 ERROR(dev, "can't enable %s, result %d\n", ep->name, result);
728 break;
729 }
730
731 /* allocate a bunch of read buffers and queue them all at once.
732 * we buffer at most 'qlen' transfers; fewer if any need more
733 * than 'buflen' bytes each.
734 */
735 if (result == 0) {
736 struct usb_request *req;
737 unsigned i;
738
739 ep = dev->out_ep;
740 for (i = 0; i < qlen && result == 0; i++) {
741 req = alloc_ep_req(ep, buflen);
742 if (req) {
743 req->complete = loopback_complete;
744 result = usb_ep_queue(ep, req, GFP_ATOMIC);
745 if (result)
746 DBG(dev, "%s queue req --> %d\n",
747 ep->name, result);
748 } else
749 result = -ENOMEM;
750 }
751 }
752 if (result == 0)
753 DBG(dev, "qlen %d, buflen %d\n", qlen, buflen);
754
755 /* caller is responsible for cleanup on error */
756 return result;
757}
758
759/*-------------------------------------------------------------------------*/
760
761static void zero_reset_config(struct zero_dev *dev)
762{
763 if (dev->config == 0)
764 return;
765
766 DBG(dev, "reset config\n");
767
768 /* just disable endpoints, forcing completion of pending i/o.
769 * all our completion handlers free their requests in this case.
770 */
771 if (dev->in_ep) {
772 usb_ep_disable(dev->in_ep);
773 dev->in_ep = NULL;
774 }
775 if (dev->out_ep) {
776 usb_ep_disable(dev->out_ep);
777 dev->out_ep = NULL;
778 }
779 dev->config = 0;
780 del_timer(&dev->resume);
781}
782
783/* change our operational config. this code must agree with the code
784 * that returns config descriptors, and altsetting code.
785 *
786 * it's also responsible for power management interactions. some
787 * configurations might not work with our current power sources.
788 *
789 * note that some device controller hardware will constrain what this
790 * code can do, perhaps by disallowing more than one configuration or
791 * by limiting configuration choices (like the pxa2xx).
792 */
793static int zero_set_config(struct zero_dev *dev, unsigned number)
794{
795 int result = 0;
796 struct usb_gadget *gadget = dev->gadget;
797
798 if (number == dev->config)
799 return 0;
800
801 if (gadget_is_sa1100(gadget) && dev->config) {
802 /* tx fifo is full, but we can't clear it...*/
803 ERROR(dev, "can't change configurations\n");
804 return -ESPIPE;
805 }
806 zero_reset_config(dev);
807
808 switch (number) {
809 case CONFIG_SOURCE_SINK:
810 result = set_source_sink_config(dev);
811 break;
812 case CONFIG_LOOPBACK:
813 result = set_loopback_config(dev);
814 break;
815 default:
816 result = -EINVAL;
817 /* FALL THROUGH */
818 case 0:
819 return result;
820 }
821
822 if (!result && (!dev->in_ep || !dev->out_ep))
823 result = -ENODEV;
824 if (result)
825 zero_reset_config(dev);
826 else {
827 char *speed;
828
829 switch (gadget->speed) {
830 case USB_SPEED_LOW: speed = "low"; break;
831 case USB_SPEED_FULL: speed = "full"; break;
832 case USB_SPEED_HIGH: speed = "high"; break;
833 default: speed = "?"; break;
834 }
835
836 dev->config = number;
837 INFO(dev, "%s speed config #%d: %s\n", speed, number,
838 (number == CONFIG_SOURCE_SINK)
839 ? source_sink : loopback);
840 }
841 return result;
842}
843
844/*-------------------------------------------------------------------------*/
845
846static void zero_setup_complete(struct usb_ep *ep, struct usb_request *req)
847{
848 if (req->status || req->actual != req->length)
849 DBG((struct zero_dev *) ep->driver_data,
850 "setup complete --> %d, %d/%d\n",
851 req->status, req->actual, req->length);
852}
853
854/*
855 * The setup() callback implements all the ep0 functionality that's
856 * not handled lower down, in hardware or the hardware driver (like
857 * device and endpoint feature flags, and their status). It's all
858 * housekeeping for the gadget function we're implementing. Most of
859 * the work is in config-specific setup.
860 */
861static int
862zero_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
863{
864 struct zero_dev *dev = get_gadget_data(gadget);
865 struct usb_request *req = dev->req;
866 int value = -EOPNOTSUPP;
867 u16 w_index = le16_to_cpu(ctrl->wIndex);
868 u16 w_value = le16_to_cpu(ctrl->wValue);
869 u16 w_length = le16_to_cpu(ctrl->wLength);
870
871 /* usually this stores reply data in the pre-allocated ep0 buffer,
872 * but config change events will reconfigure hardware.
873 */
874 req->zero = 0;
875 switch (ctrl->bRequest) {
876
877 case USB_REQ_GET_DESCRIPTOR:
878 if (ctrl->bRequestType != USB_DIR_IN)
879 goto unknown;
880 switch (w_value >> 8) {
881
882 case USB_DT_DEVICE:
883 value = min(w_length, (u16) sizeof device_desc);
884 memcpy(req->buf, &device_desc, value);
885 break;
886 case USB_DT_DEVICE_QUALIFIER:
887 if (!gadget_is_dualspeed(gadget))
888 break;
889 value = min(w_length, (u16) sizeof dev_qualifier);
890 memcpy(req->buf, &dev_qualifier, value);
891 break;
892
893 case USB_DT_OTHER_SPEED_CONFIG:
894 if (!gadget_is_dualspeed(gadget))
895 break;
896 // FALLTHROUGH
897 case USB_DT_CONFIG:
898 value = config_buf(gadget, req->buf,
899 w_value >> 8,
900 w_value & 0xff);
901 if (value >= 0)
902 value = min(w_length, (u16) value);
903 break;
904
905 case USB_DT_STRING:
906 /* wIndex == language code.
907 * this driver only handles one language, you can
908 * add string tables for other languages, using
909 * any UTF-8 characters
910 */
911 value = usb_gadget_get_string(&stringtab,
912 w_value & 0xff, req->buf);
913 if (value >= 0)
914 value = min(w_length, (u16) value);
915 break;
916 }
917 break;
918
919 /* currently two configs, two speeds */
920 case USB_REQ_SET_CONFIGURATION:
921 if (ctrl->bRequestType != 0)
922 goto unknown;
923 if (gadget->a_hnp_support)
924 DBG(dev, "HNP available\n");
925 else if (gadget->a_alt_hnp_support)
926 DBG(dev, "HNP needs a different root port\n");
927 else
928 VDBG(dev, "HNP inactive\n");
929 spin_lock(&dev->lock);
930 value = zero_set_config(dev, w_value);
931 spin_unlock(&dev->lock);
932 break;
933 case USB_REQ_GET_CONFIGURATION:
934 if (ctrl->bRequestType != USB_DIR_IN)
935 goto unknown;
936 *(u8 *)req->buf = dev->config;
937 value = min(w_length, (u16) 1);
938 break;
939
940 /* until we add altsetting support, or other interfaces,
941 * only 0/0 are possible. pxa2xx only supports 0/0 (poorly)
942 * and already killed pending endpoint I/O.
943 */
944 case USB_REQ_SET_INTERFACE:
945 if (ctrl->bRequestType != USB_RECIP_INTERFACE)
946 goto unknown;
947 spin_lock(&dev->lock);
948 if (dev->config && w_index == 0 && w_value == 0) {
949 u8 config = dev->config;
950
951 /* resets interface configuration, forgets about
952 * previous transaction state (queued bufs, etc)
953 * and re-inits endpoint state (toggle etc)
954 * no response queued, just zero status == success.
955 * if we had more than one interface we couldn't
956 * use this "reset the config" shortcut.
957 */
958 zero_reset_config(dev);
959 zero_set_config(dev, config);
960 value = 0;
961 }
962 spin_unlock(&dev->lock);
963 break;
964 case USB_REQ_GET_INTERFACE:
965 if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE))
966 goto unknown;
967 if (!dev->config)
968 break;
969 if (w_index != 0) {
970 value = -EDOM;
971 break;
972 }
973 *(u8 *)req->buf = 0;
974 value = min(w_length, (u16) 1);
975 break;
976
977 /*
978 * These are the same vendor-specific requests supported by
979 * Intel's USB 2.0 compliance test devices. We exceed that
980 * device spec by allowing multiple-packet requests.
981 */
982 case 0x5b: /* control WRITE test -- fill the buffer */
983 if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR))
984 goto unknown;
985 if (w_value || w_index)
986 break;
987 /* just read that many bytes into the buffer */
988 if (w_length > USB_BUFSIZ)
989 break;
990 value = w_length;
991 break;
992 case 0x5c: /* control READ test -- return the buffer */
993 if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR))
994 goto unknown;
995 if (w_value || w_index)
996 break;
997 /* expect those bytes are still in the buffer; send back */
998 if (w_length > USB_BUFSIZ
999 || w_length != req->length)
1000 break;
1001 value = w_length;
1002 break;
1003
1004 default:
1005unknown:
1006 VDBG(dev,
1007 "unknown control req%02x.%02x v%04x i%04x l%d\n",
1008 ctrl->bRequestType, ctrl->bRequest,
1009 w_value, w_index, w_length);
1010 }
1011
1012 /* respond with data transfer before status phase? */
1013 if (value >= 0) {
1014 req->length = value;
1015 req->zero = value < w_length;
1016 value = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC);
1017 if (value < 0) {
1018 DBG(dev, "ep_queue --> %d\n", value);
1019 req->status = 0;
1020 zero_setup_complete(gadget->ep0, req);
1021 }
1022 }
1023
1024 /* device either stalls (value < 0) or reports success */
1025 return value;
1026}
1027
1028static void zero_disconnect(struct usb_gadget *gadget)
1029{
1030 struct zero_dev *dev = get_gadget_data(gadget);
1031 unsigned long flags;
1032
1033 spin_lock_irqsave(&dev->lock, flags);
1034 zero_reset_config(dev);
1035
1036 /* a more significant application might have some non-usb
1037 * activities to quiesce here, saving resources like power
1038 * or pushing the notification up a network stack.
1039 */
1040 spin_unlock_irqrestore(&dev->lock, flags);
1041
1042 /* next we may get setup() calls to enumerate new connections;
1043 * or an unbind() during shutdown (including removing module).
1044 */
1045}
1046
1047static void zero_autoresume(unsigned long _dev)
1048{
1049 struct zero_dev *dev = (struct zero_dev *) _dev;
1050 int status;
1051
1052 /* normally the host would be woken up for something
1053 * more significant than just a timer firing...
1054 */
1055 if (dev->gadget->speed != USB_SPEED_UNKNOWN) {
1056 status = usb_gadget_wakeup(dev->gadget);
1057 DBG(dev, "wakeup --> %d\n", status);
1058 }
1059} 194}
1060 195
1061/*-------------------------------------------------------------------------*/ 196/*-------------------------------------------------------------------------*/
1062 197
1063static void zero_unbind(struct usb_gadget *gadget) 198static int __init zero_bind(struct usb_composite_dev *cdev)
1064{ 199{
1065 struct zero_dev *dev = get_gadget_data(gadget);
1066
1067 DBG(dev, "unbind\n");
1068
1069 /* we've already been disconnected ... no i/o is active */
1070 if (dev->req) {
1071 dev->req->length = USB_BUFSIZ;
1072 free_ep_req(gadget->ep0, dev->req);
1073 }
1074 del_timer_sync(&dev->resume);
1075 kfree(dev);
1076 set_gadget_data(gadget, NULL);
1077}
1078
1079static int __init zero_bind(struct usb_gadget *gadget)
1080{
1081 struct zero_dev *dev;
1082 struct usb_ep *ep;
1083 int gcnum; 200 int gcnum;
201 struct usb_gadget *gadget = cdev->gadget;
202 int id;
1084 203
1085 /* FIXME this can't yet work right with SH ... it has only 204 /* Allocate string descriptor numbers ... note that string
1086 * one configuration, numbered one. 205 * contents can be overridden by the composite_dev glue.
1087 */ 206 */
1088 if (gadget_is_sh(gadget)) 207 id = usb_string_id(cdev);
1089 return -ENODEV; 208 if (id < 0)
1090 209 return id;
1091 /* Bulk-only drivers like this one SHOULD be able to 210 strings_dev[STRING_MANUFACTURER_IDX].id = id;
1092 * autoconfigure on any sane usb controller driver, 211 device_desc.iManufacturer = id;
1093 * but there may also be important quirks to address. 212
213 id = usb_string_id(cdev);
214 if (id < 0)
215 return id;
216 strings_dev[STRING_PRODUCT_IDX].id = id;
217 device_desc.iProduct = id;
218
219 id = usb_string_id(cdev);
220 if (id < 0)
221 return id;
222 strings_dev[STRING_SERIAL_IDX].id = id;
223 device_desc.iSerialNumber = id;
224
225 /* Register primary, then secondary configuration. Note that
226 * SH3 only allows one config...
1094 */ 227 */
1095 usb_ep_autoconfig_reset(gadget); 228 if (loopdefault) {
1096 ep = usb_ep_autoconfig(gadget, &fs_source_desc); 229 loopback_add(cdev);
1097 if (!ep) { 230 if (!gadget_is_sh(gadget))
1098autoconf_fail: 231 sourcesink_add(cdev);
1099 pr_err("%s: can't autoconfigure on %s\n", 232 } else {
1100 shortname, gadget->name); 233 sourcesink_add(cdev);
1101 return -ENODEV; 234 if (!gadget_is_sh(gadget))
235 loopback_add(cdev);
1102 } 236 }
1103 EP_IN_NAME = ep->name;
1104 ep->driver_data = ep; /* claim */
1105
1106 ep = usb_ep_autoconfig(gadget, &fs_sink_desc);
1107 if (!ep)
1108 goto autoconf_fail;
1109 EP_OUT_NAME = ep->name;
1110 ep->driver_data = ep; /* claim */
1111 237
1112 gcnum = usb_gadget_controller_number(gadget); 238 gcnum = usb_gadget_controller_number(gadget);
1113 if (gcnum >= 0) 239 if (gcnum >= 0)
@@ -1115,144 +241,44 @@ autoconf_fail:
1115 else { 241 else {
1116 /* gadget zero is so simple (for now, no altsettings) that 242 /* gadget zero is so simple (for now, no altsettings) that
1117 * it SHOULD NOT have problems with bulk-capable hardware. 243 * it SHOULD NOT have problems with bulk-capable hardware.
1118 * so warn about unrcognized controllers, don't panic. 244 * so just warn about unrcognized controllers -- don't panic.
1119 * 245 *
1120 * things like configuration and altsetting numbering 246 * things like configuration and altsetting numbering
1121 * can need hardware-specific attention though. 247 * can need hardware-specific attention though.
1122 */ 248 */
1123 pr_warning("%s: controller '%s' not recognized\n", 249 pr_warning("%s: controller '%s' not recognized\n",
1124 shortname, gadget->name); 250 longname, gadget->name);
1125 device_desc.bcdDevice = __constant_cpu_to_le16(0x9999); 251 device_desc.bcdDevice = __constant_cpu_to_le16(0x9999);
1126 } 252 }
1127 253
1128 254
1129 /* ok, we made sense of the hardware ... */ 255 INFO(cdev, "%s, version: " DRIVER_VERSION "\n", longname);
1130 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1131 if (!dev)
1132 return -ENOMEM;
1133 spin_lock_init(&dev->lock);
1134 dev->gadget = gadget;
1135 set_gadget_data(gadget, dev);
1136
1137 init_timer(&dev->resume);
1138 dev->resume.function = zero_autoresume;
1139 dev->resume.data = (unsigned long) dev;
1140
1141 /* preallocate control response and buffer */
1142 dev->req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL);
1143 if (!dev->req)
1144 goto enomem;
1145 dev->req->buf = kmalloc(USB_BUFSIZ, GFP_KERNEL);
1146 if (!dev->req->buf)
1147 goto enomem;
1148
1149 dev->req->complete = zero_setup_complete;
1150
1151 device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
1152
1153 if (gadget_is_dualspeed(gadget)) {
1154 /* assume ep0 uses the same value for both speeds ... */
1155 dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0;
1156
1157 /* and that all endpoints are dual-speed */
1158 hs_source_desc.bEndpointAddress =
1159 fs_source_desc.bEndpointAddress;
1160 hs_sink_desc.bEndpointAddress =
1161 fs_sink_desc.bEndpointAddress;
1162 }
1163
1164 if (gadget_is_otg(gadget)) {
1165 otg_descriptor.bmAttributes |= USB_OTG_HNP,
1166 source_sink_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1167 loopback_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1168 }
1169
1170 usb_gadget_set_selfpowered(gadget);
1171
1172 if (autoresume) {
1173 source_sink_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1174 loopback_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
1175 }
1176
1177 gadget->ep0->driver_data = dev;
1178
1179 INFO(dev, "%s, version: " DRIVER_VERSION "\n", longname);
1180 INFO(dev, "using %s, OUT %s IN %s\n", gadget->name,
1181 EP_OUT_NAME, EP_IN_NAME);
1182 256
1183 snprintf(manufacturer, sizeof manufacturer, "%s %s with %s", 257 snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
1184 init_utsname()->sysname, init_utsname()->release, 258 init_utsname()->sysname, init_utsname()->release,
1185 gadget->name); 259 gadget->name);
1186 260
1187 return 0; 261 return 0;
1188
1189enomem:
1190 zero_unbind(gadget);
1191 return -ENOMEM;
1192} 262}
1193 263
1194/*-------------------------------------------------------------------------*/ 264static struct usb_composite_driver zero_driver = {
1195 265 .name = "zero",
1196static void zero_suspend(struct usb_gadget *gadget) 266 .dev = &device_desc,
1197{ 267 .strings = dev_strings,
1198 struct zero_dev *dev = get_gadget_data(gadget);
1199
1200 if (gadget->speed == USB_SPEED_UNKNOWN)
1201 return;
1202
1203 if (autoresume) {
1204 mod_timer(&dev->resume, jiffies + (HZ * autoresume));
1205 DBG(dev, "suspend, wakeup in %d seconds\n", autoresume);
1206 } else
1207 DBG(dev, "suspend\n");
1208}
1209
1210static void zero_resume(struct usb_gadget *gadget)
1211{
1212 struct zero_dev *dev = get_gadget_data(gadget);
1213
1214 DBG(dev, "resume\n");
1215 del_timer(&dev->resume);
1216}
1217
1218
1219/*-------------------------------------------------------------------------*/
1220
1221static struct usb_gadget_driver zero_driver = {
1222#ifdef CONFIG_USB_GADGET_DUALSPEED
1223 .speed = USB_SPEED_HIGH,
1224#else
1225 .speed = USB_SPEED_FULL,
1226#endif
1227 .function = (char *) longname,
1228 .bind = zero_bind, 268 .bind = zero_bind,
1229 .unbind = __exit_p(zero_unbind),
1230
1231 .setup = zero_setup,
1232 .disconnect = zero_disconnect,
1233
1234 .suspend = zero_suspend,
1235 .resume = zero_resume,
1236
1237 .driver = {
1238 .name = (char *) shortname,
1239 .owner = THIS_MODULE,
1240 },
1241}; 269};
1242 270
1243MODULE_AUTHOR("David Brownell"); 271MODULE_AUTHOR("David Brownell");
1244MODULE_LICENSE("GPL"); 272MODULE_LICENSE("GPL");
1245 273
1246
1247static int __init init(void) 274static int __init init(void)
1248{ 275{
1249 return usb_gadget_register_driver(&zero_driver); 276 return usb_composite_register(&zero_driver);
1250} 277}
1251module_init(init); 278module_init(init);
1252 279
1253static void __exit cleanup(void) 280static void __exit cleanup(void)
1254{ 281{
1255 usb_gadget_unregister_driver(&zero_driver); 282 usb_composite_unregister(&zero_driver);
1256} 283}
1257module_exit(cleanup); 284module_exit(cleanup);
1258
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c
index 08a4335401a9..bf69f4739107 100644
--- a/drivers/usb/host/ehci-au1xxx.c
+++ b/drivers/usb/host/ehci-au1xxx.c
@@ -19,263 +19,304 @@
19#define USB_MCFG_RDCOMB (1<<30) 19#define USB_MCFG_RDCOMB (1<<30)
20#define USB_MCFG_SSDEN (1<<23) 20#define USB_MCFG_SSDEN (1<<23)
21#define USB_MCFG_PHYPLLEN (1<<19) 21#define USB_MCFG_PHYPLLEN (1<<19)
22#define USB_MCFG_UCECLKEN (1<<18)
22#define USB_MCFG_EHCCLKEN (1<<17) 23#define USB_MCFG_EHCCLKEN (1<<17)
24#ifdef CONFIG_DMA_COHERENT
23#define USB_MCFG_UCAM (1<<7) 25#define USB_MCFG_UCAM (1<<7)
26#else
27#define USB_MCFG_UCAM (0)
28#endif
24#define USB_MCFG_EBMEN (1<<3) 29#define USB_MCFG_EBMEN (1<<3)
25#define USB_MCFG_EMEMEN (1<<2) 30#define USB_MCFG_EMEMEN (1<<2)
26 31
27#define USBH_ENABLE_CE (USB_MCFG_PHYPLLEN | USB_MCFG_EHCCLKEN) 32#define USBH_ENABLE_CE (USB_MCFG_PHYPLLEN | USB_MCFG_EHCCLKEN)
33#define USBH_ENABLE_INIT (USB_MCFG_PFEN | USB_MCFG_RDCOMB | \
34 USBH_ENABLE_CE | USB_MCFG_SSDEN | \
35 USB_MCFG_UCAM | USB_MCFG_EBMEN | \
36 USB_MCFG_EMEMEN)
28 37
29#ifdef CONFIG_DMA_COHERENT
30#define USBH_ENABLE_INIT (USBH_ENABLE_CE \
31 | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
32 | USB_MCFG_SSDEN | USB_MCFG_UCAM \
33 | USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
34#else
35#define USBH_ENABLE_INIT (USBH_ENABLE_CE \
36 | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
37 | USB_MCFG_SSDEN \
38 | USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
39#endif
40#define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN) 38#define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
41 39
42extern int usb_disabled(void); 40extern int usb_disabled(void);
43 41
44/*-------------------------------------------------------------------------*/ 42static void au1xxx_start_ehc(void)
45
46static void au1xxx_start_ehc(struct platform_device *dev)
47{ 43{
48 pr_debug(__FILE__ ": starting Au1xxx EHCI USB Controller\n"); 44 /* enable clock to EHCI block and HS PHY PLL*/
49 45 au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_CE, USB_HOST_CONFIG);
50 /* write HW defaults again in case Yamon cleared them */ 46 au_sync();
51 if (au_readl(USB_HOST_CONFIG) == 0) {
52 au_writel(0x00d02000, USB_HOST_CONFIG);
53 au_readl(USB_HOST_CONFIG);
54 udelay(1000);
55 }
56 /* enable host controller */
57 au_writel(USBH_ENABLE_CE | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
58 au_readl(USB_HOST_CONFIG);
59 udelay(1000);
60 au_writel(USBH_ENABLE_INIT | au_readl(USB_HOST_CONFIG),
61 USB_HOST_CONFIG);
62 au_readl(USB_HOST_CONFIG);
63 udelay(1000); 47 udelay(1000);
64 48
65 pr_debug(__FILE__ ": Clock to USB host has been enabled\n"); 49 /* enable EHCI mmio */
50 au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_INIT, USB_HOST_CONFIG);
51 au_sync();
52 udelay(1000);
66} 53}
67 54
68static void au1xxx_stop_ehc(struct platform_device *dev) 55static void au1xxx_stop_ehc(void)
69{ 56{
70 pr_debug(__FILE__ ": stopping Au1xxx EHCI USB Controller\n"); 57 unsigned long c;
71 58
72 /* Disable mem */ 59 /* Disable mem */
73 au_writel(~USBH_DISABLE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); 60 au_writel(au_readl(USB_HOST_CONFIG) & ~USBH_DISABLE, USB_HOST_CONFIG);
61 au_sync();
74 udelay(1000); 62 udelay(1000);
75 /* Disable clock */ 63
76 au_writel(~USB_MCFG_EHCCLKEN & au_readl(USB_HOST_CONFIG), 64 /* Disable EHC clock. If the HS PHY is unused disable it too. */
77 USB_HOST_CONFIG); 65 c = au_readl(USB_HOST_CONFIG) & ~USB_MCFG_EHCCLKEN;
78 au_readl(USB_HOST_CONFIG); 66 if (!(c & USB_MCFG_UCECLKEN)) /* UDC disabled? */
67 c &= ~USB_MCFG_PHYPLLEN; /* yes: disable HS PHY PLL */
68 au_writel(c, USB_HOST_CONFIG);
69 au_sync();
79} 70}
80 71
81/*-------------------------------------------------------------------------*/ 72static const struct hc_driver ehci_au1xxx_hc_driver = {
73 .description = hcd_name,
74 .product_desc = "Au1xxx EHCI",
75 .hcd_priv_size = sizeof(struct ehci_hcd),
76
77 /*
78 * generic hardware linkage
79 */
80 .irq = ehci_irq,
81 .flags = HCD_MEMORY | HCD_USB2,
82
83 /*
84 * basic lifecycle operations
85 *
86 * FIXME -- ehci_init() doesn't do enough here.
87 * See ehci-ppc-soc for a complete implementation.
88 */
89 .reset = ehci_init,
90 .start = ehci_run,
91 .stop = ehci_stop,
92 .shutdown = ehci_shutdown,
82 93
83/* configure so an HC device and id are always provided */ 94 /*
84/* always called with process context; sleeping is OK */ 95 * managing i/o requests and associated device resources
96 */
97 .urb_enqueue = ehci_urb_enqueue,
98 .urb_dequeue = ehci_urb_dequeue,
99 .endpoint_disable = ehci_endpoint_disable,
85 100
86/** 101 /*
87 * usb_ehci_au1xxx_probe - initialize Au1xxx-based HCDs 102 * scheduling support
88 * Context: !in_interrupt() 103 */
89 * 104 .get_frame_number = ehci_get_frame,
90 * Allocates basic resources for this USB host controller, and 105
91 * then invokes the start() method for the HCD associated with it 106 /*
92 * through the hotplug entry's driver_data. 107 * root hub support
93 * 108 */
94 */ 109 .hub_status_data = ehci_hub_status_data,
95int usb_ehci_au1xxx_probe(const struct hc_driver *driver, 110 .hub_control = ehci_hub_control,
96 struct usb_hcd **hcd_out, struct platform_device *dev) 111 .bus_suspend = ehci_bus_suspend,
112 .bus_resume = ehci_bus_resume,
113 .relinquish_port = ehci_relinquish_port,
114 .port_handed_over = ehci_port_handed_over,
115};
116
117static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
97{ 118{
98 int retval;
99 struct usb_hcd *hcd; 119 struct usb_hcd *hcd;
100 struct ehci_hcd *ehci; 120 struct ehci_hcd *ehci;
121 int ret;
101 122
102#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT) 123 if (usb_disabled())
124 return -ENODEV;
103 125
126#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT)
104 /* Au1200 AB USB does not support coherent memory */ 127 /* Au1200 AB USB does not support coherent memory */
105 if (!(read_c0_prid() & 0xff)) { 128 if (!(read_c0_prid() & 0xff)) {
106 pr_info("%s: this is chip revision AB!\n", dev->name); 129 printk(KERN_INFO "%s: this is chip revision AB!\n", pdev->name);
107 pr_info("%s: update your board or re-configure the kernel\n", 130 printk(KERN_INFO "%s: update your board or re-configure"
108 dev->name); 131 " the kernel\n", pdev->name);
109 return -ENODEV; 132 return -ENODEV;
110 } 133 }
111#endif 134#endif
112 135
113 au1xxx_start_ehc(dev); 136 if (pdev->resource[1].flags != IORESOURCE_IRQ) {
114
115 if (dev->resource[1].flags != IORESOURCE_IRQ) {
116 pr_debug("resource[1] is not IORESOURCE_IRQ"); 137 pr_debug("resource[1] is not IORESOURCE_IRQ");
117 retval = -ENOMEM; 138 return -ENOMEM;
118 } 139 }
119 hcd = usb_create_hcd(driver, &dev->dev, "Au1xxx"); 140 hcd = usb_create_hcd(&ehci_au1xxx_hc_driver, &pdev->dev, "Au1xxx");
120 if (!hcd) 141 if (!hcd)
121 return -ENOMEM; 142 return -ENOMEM;
122 hcd->rsrc_start = dev->resource[0].start; 143
123 hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1; 144 hcd->rsrc_start = pdev->resource[0].start;
145 hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
124 146
125 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { 147 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
126 pr_debug("request_mem_region failed"); 148 pr_debug("request_mem_region failed");
127 retval = -EBUSY; 149 ret = -EBUSY;
128 goto err1; 150 goto err1;
129 } 151 }
130 152
131 hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); 153 hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
132 if (!hcd->regs) { 154 if (!hcd->regs) {
133 pr_debug("ioremap failed"); 155 pr_debug("ioremap failed");
134 retval = -ENOMEM; 156 ret = -ENOMEM;
135 goto err2; 157 goto err2;
136 } 158 }
137 159
160 au1xxx_start_ehc();
161
138 ehci = hcd_to_ehci(hcd); 162 ehci = hcd_to_ehci(hcd);
139 ehci->caps = hcd->regs; 163 ehci->caps = hcd->regs;
140 ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); 164 ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));
141 /* cache this readonly data; minimize chip reads */ 165 /* cache this readonly data; minimize chip reads */
142 ehci->hcs_params = readl(&ehci->caps->hcs_params); 166 ehci->hcs_params = readl(&ehci->caps->hcs_params);
143 167
144 /* ehci_hcd_init(hcd_to_ehci(hcd)); */ 168 ret = usb_add_hcd(hcd, pdev->resource[1].start,
145 169 IRQF_DISABLED | IRQF_SHARED);
146 retval = 170 if (ret == 0) {
147 usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED | IRQF_SHARED); 171 platform_set_drvdata(pdev, hcd);
148 if (retval == 0) 172 return ret;
149 return retval; 173 }
150 174
151 au1xxx_stop_ehc(dev); 175 au1xxx_stop_ehc();
152 iounmap(hcd->regs); 176 iounmap(hcd->regs);
153err2: 177err2:
154 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 178 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
155err1: 179err1:
156 usb_put_hcd(hcd); 180 usb_put_hcd(hcd);
157 return retval; 181 return ret;
158} 182}
159 183
160/* may be called without controller electrically present */ 184static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev)
161/* may be called with controller, bus, and devices active */
162
163/**
164 * usb_ehci_hcd_au1xxx_remove - shutdown processing for Au1xxx-based HCDs
165 * @dev: USB Host Controller being removed
166 * Context: !in_interrupt()
167 *
168 * Reverses the effect of usb_ehci_hcd_au1xxx_probe(), first invoking
169 * the HCD's stop() method. It is always called from a thread
170 * context, normally "rmmod", "apmd", or something similar.
171 *
172 */
173void usb_ehci_au1xxx_remove(struct usb_hcd *hcd, struct platform_device *dev)
174{ 185{
186 struct usb_hcd *hcd = platform_get_drvdata(pdev);
187
175 usb_remove_hcd(hcd); 188 usb_remove_hcd(hcd);
176 iounmap(hcd->regs); 189 iounmap(hcd->regs);
177 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 190 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
178 usb_put_hcd(hcd); 191 usb_put_hcd(hcd);
179 au1xxx_stop_ehc(dev); 192 au1xxx_stop_ehc();
193 platform_set_drvdata(pdev, NULL);
194
195 return 0;
180} 196}
181 197
182/*-------------------------------------------------------------------------*/ 198#ifdef CONFIG_PM
199static int ehci_hcd_au1xxx_drv_suspend(struct platform_device *pdev,
200 pm_message_t message)
201{
202 struct usb_hcd *hcd = platform_get_drvdata(pdev);
203 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
204 unsigned long flags;
205 int rc;
183 206
184static const struct hc_driver ehci_au1xxx_hc_driver = { 207 return 0;
185 .description = hcd_name, 208 rc = 0;
186 .product_desc = "Au1xxx EHCI",
187 .hcd_priv_size = sizeof(struct ehci_hcd),
188 209
189 /* 210 if (time_before(jiffies, ehci->next_statechange))
190 * generic hardware linkage 211 msleep(10);
191 */
192 .irq = ehci_irq,
193 .flags = HCD_MEMORY | HCD_USB2,
194 212
195 /* 213 /* Root hub was already suspended. Disable irq emission and
196 * basic lifecycle operations 214 * mark HW unaccessible, bail out if RH has been resumed. Use
215 * the spinlock to properly synchronize with possible pending
216 * RH suspend or resume activity.
197 * 217 *
198 * FIXME -- ehci_init() doesn't do enough here. 218 * This is still racy as hcd->state is manipulated outside of
199 * See ehci-ppc-soc for a complete implementation. 219 * any locks =P But that will be a different fix.
200 */
201 .reset = ehci_init,
202 .start = ehci_run,
203 .stop = ehci_stop,
204 .shutdown = ehci_shutdown,
205
206 /*
207 * managing i/o requests and associated device resources
208 */ 220 */
209 .urb_enqueue = ehci_urb_enqueue, 221 spin_lock_irqsave(&ehci->lock, flags);
210 .urb_dequeue = ehci_urb_dequeue, 222 if (hcd->state != HC_STATE_SUSPENDED) {
211 .endpoint_disable = ehci_endpoint_disable, 223 rc = -EINVAL;
224 goto bail;
225 }
226 ehci_writel(ehci, 0, &ehci->regs->intr_enable);
227 (void)ehci_readl(ehci, &ehci->regs->intr_enable);
212 228
213 /* 229 /* make sure snapshot being resumed re-enumerates everything */
214 * scheduling support 230 if (message.event == PM_EVENT_PRETHAW) {
215 */ 231 ehci_halt(ehci);
216 .get_frame_number = ehci_get_frame, 232 ehci_reset(ehci);
233 }
217 234
218 /* 235 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
219 * root hub support
220 */
221 .hub_status_data = ehci_hub_status_data,
222 .hub_control = ehci_hub_control,
223 .bus_suspend = ehci_bus_suspend,
224 .bus_resume = ehci_bus_resume,
225 .relinquish_port = ehci_relinquish_port,
226 .port_handed_over = ehci_port_handed_over,
227};
228 236
229/*-------------------------------------------------------------------------*/ 237 au1xxx_stop_ehc();
230 238
231static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) 239bail:
232{ 240 spin_unlock_irqrestore(&ehci->lock, flags);
233 struct usb_hcd *hcd = NULL;
234 int ret;
235 241
236 pr_debug("In ehci_hcd_au1xxx_drv_probe\n"); 242 // could save FLADJ in case of Vaux power loss
243 // ... we'd only use it to handle clock skew
237 244
238 if (usb_disabled()) 245 return rc;
239 return -ENODEV;
240
241 /* FIXME we only want one one probe() not two */
242 ret = usb_ehci_au1xxx_probe(&ehci_au1xxx_hc_driver, &hcd, pdev);
243 return ret;
244} 246}
245 247
246static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev) 248
249static int ehci_hcd_au1xxx_drv_resume(struct platform_device *pdev)
247{ 250{
248 struct usb_hcd *hcd = platform_get_drvdata(pdev); 251 struct usb_hcd *hcd = platform_get_drvdata(pdev);
252 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
249 253
250 /* FIXME we only want one one remove() not two */ 254 au1xxx_start_ehc();
251 usb_ehci_au1xxx_remove(hcd, pdev);
252 return 0;
253}
254 255
255 /*TBD*/ 256 // maybe restore FLADJ
256/*static int ehci_hcd_au1xxx_drv_suspend(struct device *dev)
257{
258 struct platform_device *pdev = to_platform_device(dev);
259 struct usb_hcd *hcd = dev_get_drvdata(dev);
260 257
261 return 0; 258 if (time_before(jiffies, ehci->next_statechange))
262} 259 msleep(100);
263static int ehci_hcd_au1xxx_drv_resume(struct device *dev) 260
264{ 261 /* Mark hardware accessible again as we are out of D3 state by now */
265 struct platform_device *pdev = to_platform_device(dev); 262 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
266 struct usb_hcd *hcd = dev_get_drvdata(dev); 263
264 /* If CF is still set, we maintained PCI Vaux power.
265 * Just undo the effect of ehci_pci_suspend().
266 */
267 if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF) {
268 int mask = INTR_MASK;
269
270 if (!hcd->self.root_hub->do_remote_wakeup)
271 mask &= ~STS_PCD;
272 ehci_writel(ehci, mask, &ehci->regs->intr_enable);
273 ehci_readl(ehci, &ehci->regs->intr_enable);
274 return 0;
275 }
276
277 ehci_dbg(ehci, "lost power, restarting\n");
278 usb_root_hub_lost_power(hcd->self.root_hub);
279
280 /* Else reset, to cope with power loss or flush-to-storage
281 * style "resume" having let BIOS kick in during reboot.
282 */
283 (void) ehci_halt(ehci);
284 (void) ehci_reset(ehci);
285
286 /* emptying the schedule aborts any urbs */
287 spin_lock_irq(&ehci->lock);
288 if (ehci->reclaim)
289 end_unlink_async(ehci);
290 ehci_work(ehci);
291 spin_unlock_irq(&ehci->lock);
292
293 ehci_writel(ehci, ehci->command, &ehci->regs->command);
294 ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
295 ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
296
297 /* here we "know" root ports should always stay powered */
298 ehci_port_power(ehci, 1);
299
300 hcd->state = HC_STATE_SUSPENDED;
267 301
268 return 0; 302 return 0;
269} 303}
270*/ 304
271MODULE_ALIAS("platform:au1xxx-ehci"); 305#else
306#define ehci_hcd_au1xxx_drv_suspend NULL
307#define ehci_hcd_au1xxx_drv_resume NULL
308#endif
309
272static struct platform_driver ehci_hcd_au1xxx_driver = { 310static struct platform_driver ehci_hcd_au1xxx_driver = {
273 .probe = ehci_hcd_au1xxx_drv_probe, 311 .probe = ehci_hcd_au1xxx_drv_probe,
274 .remove = ehci_hcd_au1xxx_drv_remove, 312 .remove = ehci_hcd_au1xxx_drv_remove,
275 .shutdown = usb_hcd_platform_shutdown, 313 .shutdown = usb_hcd_platform_shutdown,
276 /*.suspend = ehci_hcd_au1xxx_drv_suspend, */ 314 .suspend = ehci_hcd_au1xxx_drv_suspend,
277 /*.resume = ehci_hcd_au1xxx_drv_resume, */ 315 .resume = ehci_hcd_au1xxx_drv_resume,
278 .driver = { 316 .driver = {
279 .name = "au1xxx-ehci", 317 .name = "au1xxx-ehci",
318 .owner = THIS_MODULE,
280 } 319 }
281}; 320};
321
322MODULE_ALIAS("platform:au1xxx-ehci");
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c
index 0f82fdcaef09..b0f8ed5a7fb9 100644
--- a/drivers/usb/host/ehci-dbg.c
+++ b/drivers/usb/host/ehci-dbg.c
@@ -676,7 +676,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
676 "%s\n" 676 "%s\n"
677 "SUSPENDED (no register access)\n", 677 "SUSPENDED (no register access)\n",
678 hcd->self.controller->bus->name, 678 hcd->self.controller->bus->name,
679 hcd->self.controller->bus_id, 679 dev_name(hcd->self.controller),
680 hcd->product_desc); 680 hcd->product_desc);
681 goto done; 681 goto done;
682 } 682 }
@@ -688,7 +688,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
688 "%s\n" 688 "%s\n"
689 "EHCI %x.%02x, hcd state %d\n", 689 "EHCI %x.%02x, hcd state %d\n",
690 hcd->self.controller->bus->name, 690 hcd->self.controller->bus->name,
691 hcd->self.controller->bus_id, 691 dev_name(hcd->self.controller),
692 hcd->product_desc, 692 hcd->product_desc,
693 i >> 8, i & 0x0ff, hcd->state); 693 i >> 8, i & 0x0ff, hcd->state);
694 size -= temp; 694 size -= temp;
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
index 7370d6187c64..01c3da34f678 100644
--- a/drivers/usb/host/ehci-fsl.c
+++ b/drivers/usb/host/ehci-fsl.c
@@ -56,7 +56,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
56 pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; 56 pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
57 if (!pdata) { 57 if (!pdata) {
58 dev_err(&pdev->dev, 58 dev_err(&pdev->dev,
59 "No platform data for %s.\n", pdev->dev.bus_id); 59 "No platform data for %s.\n", dev_name(&pdev->dev));
60 return -ENODEV; 60 return -ENODEV;
61 } 61 }
62 62
@@ -69,7 +69,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
69 (pdata->operating_mode == FSL_USB2_DR_OTG))) { 69 (pdata->operating_mode == FSL_USB2_DR_OTG))) {
70 dev_err(&pdev->dev, 70 dev_err(&pdev->dev,
71 "Non Host Mode configured for %s. Wrong driver linked.\n", 71 "Non Host Mode configured for %s. Wrong driver linked.\n",
72 pdev->dev.bus_id); 72 dev_name(&pdev->dev));
73 return -ENODEV; 73 return -ENODEV;
74 } 74 }
75 75
@@ -77,12 +77,12 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
77 if (!res) { 77 if (!res) {
78 dev_err(&pdev->dev, 78 dev_err(&pdev->dev,
79 "Found HC with no IRQ. Check %s setup!\n", 79 "Found HC with no IRQ. Check %s setup!\n",
80 pdev->dev.bus_id); 80 dev_name(&pdev->dev));
81 return -ENODEV; 81 return -ENODEV;
82 } 82 }
83 irq = res->start; 83 irq = res->start;
84 84
85 hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id); 85 hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
86 if (!hcd) { 86 if (!hcd) {
87 retval = -ENOMEM; 87 retval = -ENOMEM;
88 goto err1; 88 goto err1;
@@ -92,7 +92,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
92 if (!res) { 92 if (!res) {
93 dev_err(&pdev->dev, 93 dev_err(&pdev->dev,
94 "Found HC with no register addr. Check %s setup!\n", 94 "Found HC with no register addr. Check %s setup!\n",
95 pdev->dev.bus_id); 95 dev_name(&pdev->dev));
96 retval = -ENODEV; 96 retval = -ENODEV;
97 goto err2; 97 goto err2;
98 } 98 }
@@ -132,7 +132,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver,
132 err2: 132 err2:
133 usb_put_hcd(hcd); 133 usb_put_hcd(hcd);
134 err1: 134 err1:
135 dev_err(&pdev->dev, "init %s fail, %d\n", pdev->dev.bus_id, retval); 135 dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), retval);
136 return retval; 136 return retval;
137} 137}
138 138
@@ -230,8 +230,13 @@ static void mpc83xx_usb_setup(struct usb_hcd *hcd)
230 230
231 /* put controller in host mode. */ 231 /* put controller in host mode. */
232 ehci_writel(ehci, 0x00000003, non_ehci + FSL_SOC_USB_USBMODE); 232 ehci_writel(ehci, 0x00000003, non_ehci + FSL_SOC_USB_USBMODE);
233#ifdef CONFIG_PPC_85xx
234 out_be32(non_ehci + FSL_SOC_USB_PRICTRL, 0x00000008);
235 out_be32(non_ehci + FSL_SOC_USB_AGECNTTHRSH, 0x00000080);
236#else
233 out_be32(non_ehci + FSL_SOC_USB_PRICTRL, 0x0000000c); 237 out_be32(non_ehci + FSL_SOC_USB_PRICTRL, 0x0000000c);
234 out_be32(non_ehci + FSL_SOC_USB_AGECNTTHRSH, 0x00000040); 238 out_be32(non_ehci + FSL_SOC_USB_AGECNTTHRSH, 0x00000040);
239#endif
235 out_be32(non_ehci + FSL_SOC_USB_SICTRL, 0x00000001); 240 out_be32(non_ehci + FSL_SOC_USB_SICTRL, 0x00000001);
236} 241}
237 242
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 369a8a5ea7bb..d9d53f289caf 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -84,7 +84,7 @@ static const char hcd_name [] = "ehci_hcd";
84#define EHCI_IAA_MSECS 10 /* arbitrary */ 84#define EHCI_IAA_MSECS 10 /* arbitrary */
85#define EHCI_IO_JIFFIES (HZ/10) /* io watchdog > irq_thresh */ 85#define EHCI_IO_JIFFIES (HZ/10) /* io watchdog > irq_thresh */
86#define EHCI_ASYNC_JIFFIES (HZ/20) /* async idle timeout */ 86#define EHCI_ASYNC_JIFFIES (HZ/20) /* async idle timeout */
87#define EHCI_SHRINK_JIFFIES (HZ/200) /* async qh unlink delay */ 87#define EHCI_SHRINK_FRAMES 5 /* async qh unlink delay */
88 88
89/* Initial IRQ latency: faster than hw default */ 89/* Initial IRQ latency: faster than hw default */
90static int log2_irq_thresh = 0; // 0 to 6 90static int log2_irq_thresh = 0; // 0 to 6
diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c
index 9d042f220097..f9575c409124 100644
--- a/drivers/usb/host/ehci-ixp4xx.c
+++ b/drivers/usb/host/ehci-ixp4xx.c
@@ -77,12 +77,12 @@ static int ixp4xx_ehci_probe(struct platform_device *pdev)
77 if (!res) { 77 if (!res) {
78 dev_err(&pdev->dev, 78 dev_err(&pdev->dev,
79 "Found HC with no IRQ. Check %s setup!\n", 79 "Found HC with no IRQ. Check %s setup!\n",
80 pdev->dev.bus_id); 80 dev_name(&pdev->dev));
81 return -ENODEV; 81 return -ENODEV;
82 } 82 }
83 irq = res->start; 83 irq = res->start;
84 84
85 hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id); 85 hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
86 if (!hcd) { 86 if (!hcd) {
87 retval = -ENOMEM; 87 retval = -ENOMEM;
88 goto fail_create_hcd; 88 goto fail_create_hcd;
@@ -92,7 +92,7 @@ static int ixp4xx_ehci_probe(struct platform_device *pdev)
92 if (!res) { 92 if (!res) {
93 dev_err(&pdev->dev, 93 dev_err(&pdev->dev,
94 "Found HC with no register addr. Check %s setup!\n", 94 "Found HC with no register addr. Check %s setup!\n",
95 pdev->dev.bus_id); 95 dev_name(&pdev->dev));
96 retval = -ENODEV; 96 retval = -ENODEV;
97 goto fail_request_resource; 97 goto fail_request_resource;
98 } 98 }
@@ -126,7 +126,7 @@ fail_ioremap:
126fail_request_resource: 126fail_request_resource:
127 usb_put_hcd(hcd); 127 usb_put_hcd(hcd);
128fail_create_hcd: 128fail_create_hcd:
129 dev_err(&pdev->dev, "init %s fail, %d\n", pdev->dev.bus_id, retval); 129 dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), retval);
130 return retval; 130 return retval;
131} 131}
132 132
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
index ab625f0ba1d9..5fbdc14e63b3 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -204,7 +204,7 @@ static int __init ehci_orion_drv_probe(struct platform_device *pdev)
204 if (irq <= 0) { 204 if (irq <= 0) {
205 dev_err(&pdev->dev, 205 dev_err(&pdev->dev,
206 "Found HC with no IRQ. Check %s setup!\n", 206 "Found HC with no IRQ. Check %s setup!\n",
207 pdev->dev.bus_id); 207 dev_name(&pdev->dev));
208 err = -ENODEV; 208 err = -ENODEV;
209 goto err1; 209 goto err1;
210 } 210 }
@@ -213,7 +213,7 @@ static int __init ehci_orion_drv_probe(struct platform_device *pdev)
213 if (!res) { 213 if (!res) {
214 dev_err(&pdev->dev, 214 dev_err(&pdev->dev,
215 "Found HC with no register addr. Check %s setup!\n", 215 "Found HC with no register addr. Check %s setup!\n",
216 pdev->dev.bus_id); 216 dev_name(&pdev->dev));
217 err = -ENODEV; 217 err = -ENODEV;
218 goto err1; 218 goto err1;
219 } 219 }
@@ -233,7 +233,7 @@ static int __init ehci_orion_drv_probe(struct platform_device *pdev)
233 } 233 }
234 234
235 hcd = usb_create_hcd(&ehci_orion_hc_driver, 235 hcd = usb_create_hcd(&ehci_orion_hc_driver,
236 &pdev->dev, pdev->dev.bus_id); 236 &pdev->dev, dev_name(&pdev->dev));
237 if (!hcd) { 237 if (!hcd) {
238 err = -ENOMEM; 238 err = -ENOMEM;
239 goto err3; 239 goto err3;
@@ -276,7 +276,7 @@ err2:
276 release_mem_region(res->start, res->end - res->start + 1); 276 release_mem_region(res->start, res->end - res->start + 1);
277err1: 277err1:
278 dev_err(&pdev->dev, "init %s fail, %d\n", 278 dev_err(&pdev->dev, "init %s fail, %d\n",
279 pdev->dev.bus_id, err); 279 dev_name(&pdev->dev), err);
280 280
281 return err; 281 return err;
282} 282}
diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c
index 37e6abeb794c..0eba894bcb01 100644
--- a/drivers/usb/host/ehci-ps3.c
+++ b/drivers/usb/host/ehci-ps3.c
@@ -128,7 +128,7 @@ static int ps3_ehci_probe(struct ps3_system_bus_device *dev)
128 128
129 dev->core.dma_mask = &dummy_mask; /* FIXME: for improper usb code */ 129 dev->core.dma_mask = &dummy_mask; /* FIXME: for improper usb code */
130 130
131 hcd = usb_create_hcd(&ps3_ehci_hc_driver, &dev->core, dev->core.bus_id); 131 hcd = usb_create_hcd(&ps3_ehci_hc_driver, &dev->core, dev_name(&dev->core));
132 132
133 if (!hcd) { 133 if (!hcd) {
134 dev_dbg(&dev->core, "%s:%d: usb_create_hcd failed\n", __func__, 134 dev_dbg(&dev->core, "%s:%d: usb_create_hcd failed\n", __func__,
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index b85b54160cda..2622b6596d7c 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -1116,8 +1116,7 @@ static void scan_async (struct ehci_hcd *ehci)
1116 struct ehci_qh *qh; 1116 struct ehci_qh *qh;
1117 enum ehci_timer_action action = TIMER_IO_WATCHDOG; 1117 enum ehci_timer_action action = TIMER_IO_WATCHDOG;
1118 1118
1119 if (!++(ehci->stamp)) 1119 ehci->stamp = ehci_readl(ehci, &ehci->regs->frame_index);
1120 ehci->stamp++;
1121 timer_action_done (ehci, TIMER_ASYNC_SHRINK); 1120 timer_action_done (ehci, TIMER_ASYNC_SHRINK);
1122rescan: 1121rescan:
1123 qh = ehci->async->qh_next.qh; 1122 qh = ehci->async->qh_next.qh;
@@ -1142,18 +1141,20 @@ rescan:
1142 } 1141 }
1143 } 1142 }
1144 1143
1145 /* unlink idle entries, reducing HC PCI usage as well 1144 /* unlink idle entries, reducing DMA usage as well
1146 * as HCD schedule-scanning costs. delay for any qh 1145 * as HCD schedule-scanning costs. delay for any qh
1147 * we just scanned, there's a not-unusual case that it 1146 * we just scanned, there's a not-unusual case that it
1148 * doesn't stay idle for long. 1147 * doesn't stay idle for long.
1149 * (plus, avoids some kind of re-activation race.) 1148 * (plus, avoids some kind of re-activation race.)
1150 */ 1149 */
1151 if (list_empty (&qh->qtd_list)) { 1150 if (list_empty(&qh->qtd_list)
1152 if (qh->stamp == ehci->stamp) 1151 && qh->qh_state == QH_STATE_LINKED) {
1152 if (!ehci->reclaim
1153 && ((ehci->stamp - qh->stamp) & 0x1fff)
1154 >= (EHCI_SHRINK_FRAMES * 8))
1155 start_unlink_async(ehci, qh);
1156 else
1153 action = TIMER_ASYNC_SHRINK; 1157 action = TIMER_ASYNC_SHRINK;
1154 else if (!ehci->reclaim
1155 && qh->qh_state == QH_STATE_LINKED)
1156 start_unlink_async (ehci, qh);
1157 } 1158 }
1158 1159
1159 qh = qh->qh_next.qh; 1160 qh = qh->qh_next.qh;
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 90245fd8bac4..5799298364fb 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -198,7 +198,10 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action)
198 break; 198 break;
199 // case TIMER_ASYNC_SHRINK: 199 // case TIMER_ASYNC_SHRINK:
200 default: 200 default:
201 t = EHCI_SHRINK_JIFFIES; 201 /* add a jiffie since we synch against the
202 * 8 KHz uframe counter.
203 */
204 t = DIV_ROUND_UP(EHCI_SHRINK_FRAMES * HZ, 1000) + 1;
202 break; 205 break;
203 } 206 }
204 mod_timer(&ehci->watchdog, t + jiffies); 207 mod_timer(&ehci->watchdog, t + jiffies);
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c
index 20b9a0d07420..31178e10cbbe 100644
--- a/drivers/usb/host/isp116x-hcd.c
+++ b/drivers/usb/host/isp116x-hcd.c
@@ -94,6 +94,10 @@ static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
94 u16 w; 94 u16 w;
95 int quot = len % 4; 95 int quot = len % 4;
96 96
97 /* buffer is already in 'usb data order', which is LE. */
98 /* When reading buffer as u16, we have to take care byte order */
99 /* doesn't get mixed up */
100
97 if ((unsigned long)dp2 & 1) { 101 if ((unsigned long)dp2 & 1) {
98 /* not aligned */ 102 /* not aligned */
99 for (; len > 1; len -= 2) { 103 for (; len > 1; len -= 2) {
@@ -105,8 +109,11 @@ static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
105 isp116x_write_data16(isp116x, (u16) * dp); 109 isp116x_write_data16(isp116x, (u16) * dp);
106 } else { 110 } else {
107 /* aligned */ 111 /* aligned */
108 for (; len > 1; len -= 2) 112 for (; len > 1; len -= 2) {
109 isp116x_raw_write_data16(isp116x, *dp2++); 113 /* Keep byte order ! */
114 isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++));
115 }
116
110 if (len) 117 if (len)
111 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2)); 118 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2));
112 } 119 }
@@ -124,6 +131,10 @@ static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
124 u16 w; 131 u16 w;
125 int quot = len % 4; 132 int quot = len % 4;
126 133
134 /* buffer is already in 'usb data order', which is LE. */
135 /* When reading buffer as u16, we have to take care byte order */
136 /* doesn't get mixed up */
137
127 if ((unsigned long)dp2 & 1) { 138 if ((unsigned long)dp2 & 1) {
128 /* not aligned */ 139 /* not aligned */
129 for (; len > 1; len -= 2) { 140 for (; len > 1; len -= 2) {
@@ -131,12 +142,16 @@ static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
131 *dp++ = w & 0xff; 142 *dp++ = w & 0xff;
132 *dp++ = (w >> 8) & 0xff; 143 *dp++ = (w >> 8) & 0xff;
133 } 144 }
145
134 if (len) 146 if (len)
135 *dp = 0xff & isp116x_read_data16(isp116x); 147 *dp = 0xff & isp116x_read_data16(isp116x);
136 } else { 148 } else {
137 /* aligned */ 149 /* aligned */
138 for (; len > 1; len -= 2) 150 for (; len > 1; len -= 2) {
139 *dp2++ = isp116x_raw_read_data16(isp116x); 151 /* Keep byte order! */
152 *dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x));
153 }
154
140 if (len) 155 if (len)
141 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x); 156 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x);
142 } 157 }
@@ -1592,7 +1607,7 @@ static int __devinit isp116x_probe(struct platform_device *pdev)
1592 } 1607 }
1593 1608
1594 /* allocate and initialize hcd */ 1609 /* allocate and initialize hcd */
1595 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, pdev->dev.bus_id); 1610 hcd = usb_create_hcd(&isp116x_hc_driver, &pdev->dev, dev_name(&pdev->dev));
1596 if (!hcd) { 1611 if (!hcd) {
1597 ret = -ENOMEM; 1612 ret = -ENOMEM;
1598 goto err5; 1613 goto err5;
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c
index 65aa5ecf569a..c858f2adb929 100644
--- a/drivers/usb/host/isp1760-hcd.c
+++ b/drivers/usb/host/isp1760-hcd.c
@@ -38,6 +38,7 @@ struct isp1760_hcd {
38 unsigned i_thresh; 38 unsigned i_thresh;
39 unsigned long reset_done; 39 unsigned long reset_done;
40 unsigned long next_statechange; 40 unsigned long next_statechange;
41 unsigned int devflags;
41}; 42};
42 43
43static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd) 44static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd)
@@ -378,9 +379,31 @@ static int isp1760_hc_setup(struct usb_hcd *hcd)
378{ 379{
379 struct isp1760_hcd *priv = hcd_to_priv(hcd); 380 struct isp1760_hcd *priv = hcd_to_priv(hcd);
380 int result; 381 int result;
381 u32 scratch; 382 u32 scratch, hwmode;
383
384 /* Setup HW Mode Control: This assumes a level active-low interrupt */
385 hwmode = HW_DATA_BUS_32BIT;
386
387 if (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16)
388 hwmode &= ~HW_DATA_BUS_32BIT;
389 if (priv->devflags & ISP1760_FLAG_ANALOG_OC)
390 hwmode |= HW_ANA_DIGI_OC;
391 if (priv->devflags & ISP1760_FLAG_DACK_POL_HIGH)
392 hwmode |= HW_DACK_POL_HIGH;
393 if (priv->devflags & ISP1760_FLAG_DREQ_POL_HIGH)
394 hwmode |= HW_DREQ_POL_HIGH;
395
396 /*
397 * We have to set this first in case we're in 16-bit mode.
398 * Write it twice to ensure correct upper bits if switching
399 * to 16-bit mode.
400 */
401 isp1760_writel(hwmode, hcd->regs + HC_HW_MODE_CTRL);
402 isp1760_writel(hwmode, hcd->regs + HC_HW_MODE_CTRL);
382 403
383 isp1760_writel(0xdeadbabe, hcd->regs + HC_SCRATCH_REG); 404 isp1760_writel(0xdeadbabe, hcd->regs + HC_SCRATCH_REG);
405 /* Change bus pattern */
406 scratch = isp1760_readl(hcd->regs + HC_CHIP_ID_REG);
384 scratch = isp1760_readl(hcd->regs + HC_SCRATCH_REG); 407 scratch = isp1760_readl(hcd->regs + HC_SCRATCH_REG);
385 if (scratch != 0xdeadbabe) { 408 if (scratch != 0xdeadbabe) {
386 printk(KERN_ERR "ISP1760: Scratch test failed.\n"); 409 printk(KERN_ERR "ISP1760: Scratch test failed.\n");
@@ -403,17 +426,29 @@ static int isp1760_hc_setup(struct usb_hcd *hcd)
403 426
404 /* Step 11 passed */ 427 /* Step 11 passed */
405 428
406 isp1760_writel(INTERRUPT_ENABLE_MASK, hcd->regs + HC_INTERRUPT_REG); 429 isp1760_info(priv, "bus width: %d, oc: %s\n",
407 isp1760_writel(INTERRUPT_ENABLE_MASK, hcd->regs + HC_INTERRUPT_ENABLE); 430 (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16) ?
431 16 : 32, (priv->devflags & ISP1760_FLAG_ANALOG_OC) ?
432 "analog" : "digital");
408 433
409 /* ATL reset */ 434 /* ATL reset */
410 scratch = isp1760_readl(hcd->regs + HC_HW_MODE_CTRL); 435 isp1760_writel(hwmode | ALL_ATX_RESET, hcd->regs + HC_HW_MODE_CTRL);
411 isp1760_writel(scratch | ALL_ATX_RESET, hcd->regs + HC_HW_MODE_CTRL);
412 mdelay(10); 436 mdelay(10);
413 isp1760_writel(scratch, hcd->regs + HC_HW_MODE_CTRL); 437 isp1760_writel(hwmode, hcd->regs + HC_HW_MODE_CTRL);
414 438
415 isp1760_writel(PORT1_POWER | PORT1_INIT2, hcd->regs + HC_PORT1_CTRL); 439 isp1760_writel(INTERRUPT_ENABLE_MASK, hcd->regs + HC_INTERRUPT_REG);
416 mdelay(10); 440 isp1760_writel(INTERRUPT_ENABLE_MASK, hcd->regs + HC_INTERRUPT_ENABLE);
441
442 /*
443 * PORT 1 Control register of the ISP1760 is the OTG control
444 * register on ISP1761.
445 */
446 if (!(priv->devflags & ISP1760_FLAG_ISP1761) &&
447 !(priv->devflags & ISP1760_FLAG_PORT1_DIS)) {
448 isp1760_writel(PORT1_POWER | PORT1_INIT2,
449 hcd->regs + HC_PORT1_CTRL);
450 mdelay(10);
451 }
417 452
418 priv->hcs_params = isp1760_readl(hcd->regs + HC_HCSPARAMS); 453 priv->hcs_params = isp1760_readl(hcd->regs + HC_HCSPARAMS);
419 454
@@ -453,8 +488,7 @@ static int isp1760_run(struct usb_hcd *hcd)
453 hcd->state = HC_STATE_RUNNING; 488 hcd->state = HC_STATE_RUNNING;
454 isp1760_enable_interrupts(hcd); 489 isp1760_enable_interrupts(hcd);
455 temp = isp1760_readl(hcd->regs + HC_HW_MODE_CTRL); 490 temp = isp1760_readl(hcd->regs + HC_HW_MODE_CTRL);
456 temp |= FINAL_HW_CONFIG; 491 isp1760_writel(temp | HW_GLOBAL_INTR_EN, hcd->regs + HC_HW_MODE_CTRL);
457 isp1760_writel(temp, hcd->regs + HC_HW_MODE_CTRL);
458 492
459 command = isp1760_readl(hcd->regs + HC_USBCMD); 493 command = isp1760_readl(hcd->regs + HC_USBCMD);
460 command &= ~(CMD_LRESET|CMD_RESET); 494 command &= ~(CMD_LRESET|CMD_RESET);
@@ -782,8 +816,8 @@ static void enqueue_one_int_qtd(u32 int_regs, u32 payload,
782 qtd->status |= slot << 16; 816 qtd->status |= slot << 16;
783} 817}
784 818
785void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, 819static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
786 struct isp1760_qtd *qtd) 820 struct isp1760_qtd *qtd)
787{ 821{
788 struct isp1760_hcd *priv = hcd_to_priv(hcd); 822 struct isp1760_hcd *priv = hcd_to_priv(hcd);
789 u32 skip_map, or_map; 823 u32 skip_map, or_map;
@@ -816,8 +850,8 @@ void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
816 isp1760_writel(buffstatus, hcd->regs + HC_BUFFER_STATUS_REG); 850 isp1760_writel(buffstatus, hcd->regs + HC_BUFFER_STATUS_REG);
817} 851}
818 852
819void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, 853static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
820 struct isp1760_qtd *qtd) 854 struct isp1760_qtd *qtd)
821{ 855{
822 struct isp1760_hcd *priv = hcd_to_priv(hcd); 856 struct isp1760_hcd *priv = hcd_to_priv(hcd);
823 u32 skip_map, or_map; 857 u32 skip_map, or_map;
@@ -1592,7 +1626,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
1592 struct inter_packet_info *ints; 1626 struct inter_packet_info *ints;
1593 u32 i; 1627 u32 i;
1594 u32 reg_base, or_reg, skip_reg; 1628 u32 reg_base, or_reg, skip_reg;
1595 int flags; 1629 unsigned long flags;
1596 struct ptd ptd; 1630 struct ptd ptd;
1597 1631
1598 switch (usb_pipetype(urb->pipe)) { 1632 switch (usb_pipetype(urb->pipe)) {
@@ -2061,7 +2095,7 @@ static void isp1760_endpoint_disable(struct usb_hcd *usb_hcd,
2061 struct isp1760_hcd *priv = hcd_to_priv(usb_hcd); 2095 struct isp1760_hcd *priv = hcd_to_priv(usb_hcd);
2062 struct isp1760_qh *qh; 2096 struct isp1760_qh *qh;
2063 struct isp1760_qtd *qtd; 2097 struct isp1760_qtd *qtd;
2064 u32 flags; 2098 unsigned long flags;
2065 2099
2066 spin_lock_irqsave(&priv->lock, flags); 2100 spin_lock_irqsave(&priv->lock, flags);
2067 qh = ep->hcpriv; 2101 qh = ep->hcpriv;
@@ -2112,6 +2146,7 @@ static int isp1760_get_frame(struct usb_hcd *hcd)
2112static void isp1760_stop(struct usb_hcd *hcd) 2146static void isp1760_stop(struct usb_hcd *hcd)
2113{ 2147{
2114 struct isp1760_hcd *priv = hcd_to_priv(hcd); 2148 struct isp1760_hcd *priv = hcd_to_priv(hcd);
2149 u32 temp;
2115 2150
2116 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1, 2151 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1,
2117 NULL, 0); 2152 NULL, 0);
@@ -2120,7 +2155,8 @@ static void isp1760_stop(struct usb_hcd *hcd)
2120 spin_lock_irq(&priv->lock); 2155 spin_lock_irq(&priv->lock);
2121 ehci_reset(priv); 2156 ehci_reset(priv);
2122 /* Disable IRQ */ 2157 /* Disable IRQ */
2123 isp1760_writel(HW_DATA_BUS_32BIT, hcd->regs + HC_HW_MODE_CTRL); 2158 temp = isp1760_readl(hcd->regs + HC_HW_MODE_CTRL);
2159 isp1760_writel(temp &= ~HW_GLOBAL_INTR_EN, hcd->regs + HC_HW_MODE_CTRL);
2124 spin_unlock_irq(&priv->lock); 2160 spin_unlock_irq(&priv->lock);
2125 2161
2126 isp1760_writel(0, hcd->regs + HC_CONFIGFLAG); 2162 isp1760_writel(0, hcd->regs + HC_CONFIGFLAG);
@@ -2128,10 +2164,11 @@ static void isp1760_stop(struct usb_hcd *hcd)
2128 2164
2129static void isp1760_shutdown(struct usb_hcd *hcd) 2165static void isp1760_shutdown(struct usb_hcd *hcd)
2130{ 2166{
2131 u32 command; 2167 u32 command, temp;
2132 2168
2133 isp1760_stop(hcd); 2169 isp1760_stop(hcd);
2134 isp1760_writel(HW_DATA_BUS_32BIT, hcd->regs + HC_HW_MODE_CTRL); 2170 temp = isp1760_readl(hcd->regs + HC_HW_MODE_CTRL);
2171 isp1760_writel(temp &= ~HW_GLOBAL_INTR_EN, hcd->regs + HC_HW_MODE_CTRL);
2135 2172
2136 command = isp1760_readl(hcd->regs + HC_USBCMD); 2173 command = isp1760_readl(hcd->regs + HC_USBCMD);
2137 command &= ~CMD_RUN; 2174 command &= ~CMD_RUN;
@@ -2183,7 +2220,8 @@ void deinit_kmem_cache(void)
2183} 2220}
2184 2221
2185struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq, 2222struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq,
2186 u64 irqflags, struct device *dev, const char *busname) 2223 u64 irqflags, struct device *dev, const char *busname,
2224 unsigned int devflags)
2187{ 2225{
2188 struct usb_hcd *hcd; 2226 struct usb_hcd *hcd;
2189 struct isp1760_hcd *priv; 2227 struct isp1760_hcd *priv;
@@ -2195,11 +2233,12 @@ struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq,
2195 /* prevent usb-core allocating DMA pages */ 2233 /* prevent usb-core allocating DMA pages */
2196 dev->dma_mask = NULL; 2234 dev->dma_mask = NULL;
2197 2235
2198 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev->bus_id); 2236 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
2199 if (!hcd) 2237 if (!hcd)
2200 return ERR_PTR(-ENOMEM); 2238 return ERR_PTR(-ENOMEM);
2201 2239
2202 priv = hcd_to_priv(hcd); 2240 priv = hcd_to_priv(hcd);
2241 priv->devflags = devflags;
2203 init_memory(priv); 2242 init_memory(priv);
2204 hcd->regs = ioremap(res_start, res_len); 2243 hcd->regs = ioremap(res_start, res_len);
2205 if (!hcd->regs) { 2244 if (!hcd->regs) {
diff --git a/drivers/usb/host/isp1760-hcd.h b/drivers/usb/host/isp1760-hcd.h
index 3d86d0f6b147..6473dd86993c 100644
--- a/drivers/usb/host/isp1760-hcd.h
+++ b/drivers/usb/host/isp1760-hcd.h
@@ -3,7 +3,8 @@
3 3
4/* exports for if */ 4/* exports for if */
5struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq, 5struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq,
6 u64 irqflags, struct device *dev, const char *busname); 6 u64 irqflags, struct device *dev, const char *busname,
7 unsigned int devflags);
7int init_kmem_once(void); 8int init_kmem_once(void);
8void deinit_kmem_cache(void); 9void deinit_kmem_cache(void);
9 10
@@ -31,6 +32,7 @@ void deinit_kmem_cache(void);
31/* Configuration Register */ 32/* Configuration Register */
32#define HC_HW_MODE_CTRL 0x300 33#define HC_HW_MODE_CTRL 0x300
33#define ALL_ATX_RESET (1 << 31) 34#define ALL_ATX_RESET (1 << 31)
35#define HW_ANA_DIGI_OC (1 << 15)
34#define HW_DATA_BUS_32BIT (1 << 8) 36#define HW_DATA_BUS_32BIT (1 << 8)
35#define HW_DACK_POL_HIGH (1 << 6) 37#define HW_DACK_POL_HIGH (1 << 6)
36#define HW_DREQ_POL_HIGH (1 << 5) 38#define HW_DREQ_POL_HIGH (1 << 5)
@@ -56,13 +58,14 @@ void deinit_kmem_cache(void);
56#define PORT1_POWER (3 << 3) 58#define PORT1_POWER (3 << 3)
57#define PORT1_INIT1 (1 << 7) 59#define PORT1_INIT1 (1 << 7)
58#define PORT1_INIT2 (1 << 23) 60#define PORT1_INIT2 (1 << 23)
61#define HW_OTG_CTRL_SET 0x374
62#define HW_OTG_CTRL_CLR 0x376
59 63
60/* Interrupt Register */ 64/* Interrupt Register */
61#define HC_INTERRUPT_REG 0x310 65#define HC_INTERRUPT_REG 0x310
62 66
63#define HC_INTERRUPT_ENABLE 0x314 67#define HC_INTERRUPT_ENABLE 0x314
64#define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT | HC_EOT_INT) 68#define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT | HC_EOT_INT)
65#define FINAL_HW_CONFIG (HW_GLOBAL_INTR_EN | HW_DATA_BUS_32BIT)
66 69
67#define HC_ISO_INT (1 << 9) 70#define HC_ISO_INT (1 << 9)
68#define HC_ATL_INT (1 << 8) 71#define HC_ATL_INT (1 << 8)
@@ -122,6 +125,19 @@ typedef void (packet_enqueue)(struct usb_hcd *hcd, struct isp1760_qh *qh,
122#define isp1760_err(priv, fmt, args...) \ 125#define isp1760_err(priv, fmt, args...) \
123 dev_err(priv_to_hcd(priv)->self.controller, fmt, ##args) 126 dev_err(priv_to_hcd(priv)->self.controller, fmt, ##args)
124 127
128/*
129 * Device flags that can vary from board to board. All of these
130 * indicate the most "atypical" case, so that a devflags of 0 is
131 * a sane default configuration.
132 */
133#define ISP1760_FLAG_PORT1_DIS 0x00000001 /* Port 1 disabled */
134#define ISP1760_FLAG_BUS_WIDTH_16 0x00000002 /* 16-bit data bus width */
135#define ISP1760_FLAG_OTG_EN 0x00000004 /* Port 1 supports OTG */
136#define ISP1760_FLAG_ANALOG_OC 0x00000008 /* Analog overcurrent */
137#define ISP1760_FLAG_DACK_POL_HIGH 0x00000010 /* DACK active high */
138#define ISP1760_FLAG_DREQ_POL_HIGH 0x00000020 /* DREQ active high */
139#define ISP1760_FLAG_ISP1761 0x00000040 /* Chip is ISP1761 */
140
125/* chip memory management */ 141/* chip memory management */
126struct memory_chunk { 142struct memory_chunk {
127 unsigned int start; 143 unsigned int start;
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c
index c9db3fe98726..051ef7b6bdc6 100644
--- a/drivers/usb/host/isp1760-if.c
+++ b/drivers/usb/host/isp1760-if.c
@@ -35,13 +35,15 @@ static int of_isp1760_probe(struct of_device *dev,
35 int virq; 35 int virq;
36 u64 res_len; 36 u64 res_len;
37 int ret; 37 int ret;
38 const unsigned int *prop;
39 unsigned int devflags = 0;
38 40
39 ret = of_address_to_resource(dp, 0, &memory); 41 ret = of_address_to_resource(dp, 0, &memory);
40 if (ret) 42 if (ret)
41 return -ENXIO; 43 return -ENXIO;
42 44
43 res = request_mem_region(memory.start, memory.end - memory.start + 1, 45 res = request_mem_region(memory.start, memory.end - memory.start + 1,
44 dev->dev.bus_id); 46 dev_name(&dev->dev));
45 if (!res) 47 if (!res)
46 return -EBUSY; 48 return -EBUSY;
47 49
@@ -55,8 +57,32 @@ static int of_isp1760_probe(struct of_device *dev,
55 virq = irq_create_of_mapping(oirq.controller, oirq.specifier, 57 virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
56 oirq.size); 58 oirq.size);
57 59
60 if (of_device_is_compatible(dp, "nxp,usb-isp1761"))
61 devflags |= ISP1760_FLAG_ISP1761;
62
63 if (of_get_property(dp, "port1-disable", NULL) != NULL)
64 devflags |= ISP1760_FLAG_PORT1_DIS;
65
66 /* Some systems wire up only 16 of the 32 data lines */
67 prop = of_get_property(dp, "bus-width", NULL);
68 if (prop && *prop == 16)
69 devflags |= ISP1760_FLAG_BUS_WIDTH_16;
70
71 if (of_get_property(dp, "port1-otg", NULL) != NULL)
72 devflags |= ISP1760_FLAG_OTG_EN;
73
74 if (of_get_property(dp, "analog-oc", NULL) != NULL)
75 devflags |= ISP1760_FLAG_ANALOG_OC;
76
77 if (of_get_property(dp, "dack-polarity", NULL) != NULL)
78 devflags |= ISP1760_FLAG_DACK_POL_HIGH;
79
80 if (of_get_property(dp, "dreq-polarity", NULL) != NULL)
81 devflags |= ISP1760_FLAG_DREQ_POL_HIGH;
82
58 hcd = isp1760_register(memory.start, res_len, virq, 83 hcd = isp1760_register(memory.start, res_len, virq,
59 IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev->dev.bus_id); 84 IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev),
85 devflags);
60 if (IS_ERR(hcd)) { 86 if (IS_ERR(hcd)) {
61 ret = PTR_ERR(hcd); 87 ret = PTR_ERR(hcd);
62 goto release_reg; 88 goto release_reg;
@@ -87,6 +113,9 @@ static struct of_device_id of_isp1760_match[] = {
87 { 113 {
88 .compatible = "nxp,usb-isp1760", 114 .compatible = "nxp,usb-isp1760",
89 }, 115 },
116 {
117 .compatible = "nxp,usb-isp1761",
118 },
90 { }, 119 { },
91}; 120};
92MODULE_DEVICE_TABLE(of, of_isp1760_match); 121MODULE_DEVICE_TABLE(of, of_isp1760_match);
@@ -116,6 +145,7 @@ static int __devinit isp1761_pci_probe(struct pci_dev *dev,
116 int length; 145 int length;
117 int status = 1; 146 int status = 1;
118 struct usb_hcd *hcd; 147 struct usb_hcd *hcd;
148 unsigned int devflags = 0;
119 149
120 if (usb_disabled()) 150 if (usb_disabled())
121 return -ENODEV; 151 return -ENODEV;
@@ -200,7 +230,8 @@ static int __devinit isp1761_pci_probe(struct pci_dev *dev,
200 230
201 dev->dev.dma_mask = NULL; 231 dev->dev.dma_mask = NULL;
202 hcd = isp1760_register(pci_mem_phy0, length, dev->irq, 232 hcd = isp1760_register(pci_mem_phy0, length, dev->irq,
203 IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev->dev.bus_id); 233 IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev),
234 devflags);
204 pci_set_drvdata(dev, hcd); 235 pci_set_drvdata(dev, hcd);
205 if (!hcd) 236 if (!hcd)
206 return 0; 237 return 0;
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
index e534f9de0f05..a5d8e550d897 100644
--- a/drivers/usb/host/ohci-at91.c
+++ b/drivers/usb/host/ohci-at91.c
@@ -91,7 +91,7 @@ static void at91_stop_hc(struct platform_device *pdev)
91 91
92/*-------------------------------------------------------------------------*/ 92/*-------------------------------------------------------------------------*/
93 93
94static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); 94static void usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *);
95 95
96/* configure so an HC device and id are always provided */ 96/* configure so an HC device and id are always provided */
97/* always called with process context; sleeping is OK */ 97/* always called with process context; sleeping is OK */
@@ -184,13 +184,14 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
184 * context, "rmmod" or something similar. 184 * context, "rmmod" or something similar.
185 * 185 *
186 */ 186 */
187static int usb_hcd_at91_remove(struct usb_hcd *hcd, 187static void usb_hcd_at91_remove(struct usb_hcd *hcd,
188 struct platform_device *pdev) 188 struct platform_device *pdev)
189{ 189{
190 usb_remove_hcd(hcd); 190 usb_remove_hcd(hcd);
191 at91_stop_hc(pdev); 191 at91_stop_hc(pdev);
192 iounmap(hcd->regs); 192 iounmap(hcd->regs);
193 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 193 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
194 usb_put_hcd(hcd);
194 195
195 if (cpu_is_at91sam9261()) 196 if (cpu_is_at91sam9261())
196 clk_put(hclk); 197 clk_put(hclk);
@@ -199,7 +200,6 @@ static int usb_hcd_at91_remove(struct usb_hcd *hcd,
199 fclk = iclk = hclk = NULL; 200 fclk = iclk = hclk = NULL;
200 201
201 dev_set_drvdata(&pdev->dev, NULL); 202 dev_set_drvdata(&pdev->dev, NULL);
202 return 0;
203} 203}
204 204
205/*-------------------------------------------------------------------------*/ 205/*-------------------------------------------------------------------------*/
@@ -309,7 +309,8 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev)
309 } 309 }
310 310
311 device_init_wakeup(&pdev->dev, 0); 311 device_init_wakeup(&pdev->dev, 0);
312 return usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev); 312 usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev);
313 return 0;
313} 314}
314 315
315#ifdef CONFIG_PM 316#ifdef CONFIG_PM
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c
index 68c17f5ea8ea..c0948008fe3d 100644
--- a/drivers/usb/host/ohci-au1xxx.c
+++ b/drivers/usb/host/ohci-au1xxx.c
@@ -34,7 +34,8 @@
34#ifdef __LITTLE_ENDIAN 34#ifdef __LITTLE_ENDIAN
35#define USBH_ENABLE_INIT (USBH_ENABLE_CE | USBH_ENABLE_E | USBH_ENABLE_C) 35#define USBH_ENABLE_INIT (USBH_ENABLE_CE | USBH_ENABLE_E | USBH_ENABLE_C)
36#elif __BIG_ENDIAN 36#elif __BIG_ENDIAN
37#define USBH_ENABLE_INIT (USBH_ENABLE_CE | USBH_ENABLE_E | USBH_ENABLE_C | USBH_ENABLE_BE) 37#define USBH_ENABLE_INIT (USBH_ENABLE_CE | USBH_ENABLE_E | USBH_ENABLE_C | \
38 USBH_ENABLE_BE)
38#else 39#else
39#error not byte order defined 40#error not byte order defined
40#endif 41#endif
@@ -46,213 +47,87 @@
46#define USB_MCFG_RDCOMB (1<<30) 47#define USB_MCFG_RDCOMB (1<<30)
47#define USB_MCFG_SSDEN (1<<23) 48#define USB_MCFG_SSDEN (1<<23)
48#define USB_MCFG_OHCCLKEN (1<<16) 49#define USB_MCFG_OHCCLKEN (1<<16)
50#ifdef CONFIG_DMA_COHERENT
49#define USB_MCFG_UCAM (1<<7) 51#define USB_MCFG_UCAM (1<<7)
52#else
53#define USB_MCFG_UCAM (0)
54#endif
50#define USB_MCFG_OBMEN (1<<1) 55#define USB_MCFG_OBMEN (1<<1)
51#define USB_MCFG_OMEMEN (1<<0) 56#define USB_MCFG_OMEMEN (1<<0)
52 57
53#define USBH_ENABLE_CE USB_MCFG_OHCCLKEN 58#define USBH_ENABLE_CE USB_MCFG_OHCCLKEN
54#ifdef CONFIG_DMA_COHERENT 59
55#define USBH_ENABLE_INIT (USB_MCFG_OHCCLKEN \ 60#define USBH_ENABLE_INIT (USB_MCFG_PFEN | USB_MCFG_RDCOMB | \
56 | USB_MCFG_PFEN | USB_MCFG_RDCOMB \ 61 USBH_ENABLE_CE | USB_MCFG_SSDEN | \
57 | USB_MCFG_SSDEN | USB_MCFG_UCAM \ 62 USB_MCFG_UCAM | \
58 | USB_MCFG_OBMEN | USB_MCFG_OMEMEN) 63 USB_MCFG_OBMEN | USB_MCFG_OMEMEN)
59#else 64
60#define USBH_ENABLE_INIT (USB_MCFG_OHCCLKEN \
61 | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
62 | USB_MCFG_SSDEN \
63 | USB_MCFG_OBMEN | USB_MCFG_OMEMEN)
64#endif
65#define USBH_DISABLE (USB_MCFG_OBMEN | USB_MCFG_OMEMEN) 65#define USBH_DISABLE (USB_MCFG_OBMEN | USB_MCFG_OMEMEN)
66 66
67#endif /* Au1200 */ 67#endif /* Au1200 */
68 68
69extern int usb_disabled(void); 69extern int usb_disabled(void);
70 70
71/*-------------------------------------------------------------------------*/ 71static void au1xxx_start_ohc(void)
72
73static void au1xxx_start_ohc(struct platform_device *dev)
74{ 72{
75 printk(KERN_DEBUG __FILE__
76 ": starting Au1xxx OHCI USB Controller\n");
77
78 /* enable host controller */ 73 /* enable host controller */
79
80#ifndef CONFIG_SOC_AU1200 74#ifndef CONFIG_SOC_AU1200
81
82 au_writel(USBH_ENABLE_CE, USB_HOST_CONFIG); 75 au_writel(USBH_ENABLE_CE, USB_HOST_CONFIG);
76 au_sync();
83 udelay(1000); 77 udelay(1000);
84 au_writel(USBH_ENABLE_INIT, USB_HOST_CONFIG);
85 udelay(1000);
86
87#else /* Au1200 */
88 78
89 /* write HW defaults again in case Yamon cleared them */ 79 au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_INIT, USB_HOST_CONFIG);
90 if (au_readl(USB_HOST_CONFIG) == 0) { 80 au_sync();
91 au_writel(0x00d02000, USB_HOST_CONFIG);
92 au_readl(USB_HOST_CONFIG);
93 udelay(1000);
94 }
95 au_writel(USBH_ENABLE_CE | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
96 au_readl(USB_HOST_CONFIG);
97 udelay(1000); 81 udelay(1000);
98 au_writel(USBH_ENABLE_INIT | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
99 au_readl(USB_HOST_CONFIG);
100 udelay(1000);
101
102#endif /* Au1200 */
103 82
104#ifndef CONFIG_SOC_AU1200
105 /* wait for reset complete (read register twice; see au1500 errata) */ 83 /* wait for reset complete (read register twice; see au1500 errata) */
106 while (au_readl(USB_HOST_CONFIG), 84 while (au_readl(USB_HOST_CONFIG),
107 !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD)) 85 !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD))
108#endif
109 udelay(1000); 86 udelay(1000);
110 87
111 printk(KERN_DEBUG __FILE__
112 ": Clock to USB host has been enabled \n");
113}
114
115static void au1xxx_stop_ohc(struct platform_device *dev)
116{
117 printk(KERN_DEBUG __FILE__
118 ": stopping Au1xxx OHCI USB Controller\n");
119
120#ifndef CONFIG_SOC_AU1200
121
122 /* Disable clock */
123 au_writel(au_readl(USB_HOST_CONFIG) & ~USBH_ENABLE_CE, USB_HOST_CONFIG);
124
125#else /* Au1200 */ 88#else /* Au1200 */
126 89 au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_CE, USB_HOST_CONFIG);
127 /* Disable mem */ 90 au_sync();
128 au_writel(~USBH_DISABLE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
129 udelay(1000); 91 udelay(1000);
130 /* Disable clock */ 92
131 au_writel(~USBH_ENABLE_CE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); 93 au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_INIT, USB_HOST_CONFIG);
132 au_readl(USB_HOST_CONFIG); 94 au_sync();
95 udelay(2000);
133#endif /* Au1200 */ 96#endif /* Au1200 */
134} 97}
135 98
136 99static void au1xxx_stop_ohc(void)
137/*-------------------------------------------------------------------------*/
138
139/* configure so an HC device and id are always provided */
140/* always called with process context; sleeping is OK */
141
142
143/**
144 * usb_ohci_au1xxx_probe - initialize Au1xxx-based HCDs
145 * Context: !in_interrupt()
146 *
147 * Allocates basic resources for this USB host controller, and
148 * then invokes the start() method for the HCD associated with it
149 * through the hotplug entry's driver_data.
150 *
151 */
152static int usb_ohci_au1xxx_probe(const struct hc_driver *driver,
153 struct platform_device *dev)
154{ 100{
155 int retval; 101#ifdef CONFIG_SOC_AU1200
156 struct usb_hcd *hcd; 102 /* Disable mem */
157 103 au_writel(au_readl(USB_HOST_CONFIG) & ~USBH_DISABLE, USB_HOST_CONFIG);
158#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT) 104 au_sync();
159 /* Au1200 AB USB does not support coherent memory */ 105 udelay(1000);
160 if (!(read_c0_prid() & 0xff)) {
161 pr_info("%s: this is chip revision AB !!\n",
162 dev->name);
163 pr_info("%s: update your board or re-configure the kernel\n",
164 dev->name);
165 return -ENODEV;
166 }
167#endif 106#endif
168 107 /* Disable clock */
169 if (dev->resource[1].flags != IORESOURCE_IRQ) { 108 au_writel(au_readl(USB_HOST_CONFIG) & ~USBH_ENABLE_CE, USB_HOST_CONFIG);
170 pr_debug("resource[1] is not IORESOURCE_IRQ\n"); 109 au_sync();
171 return -ENOMEM;
172 }
173
174 hcd = usb_create_hcd(driver, &dev->dev, "au1xxx");
175 if (!hcd)
176 return -ENOMEM;
177 hcd->rsrc_start = dev->resource[0].start;
178 hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
179
180 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
181 pr_debug("request_mem_region failed\n");
182 retval = -EBUSY;
183 goto err1;
184 }
185
186 hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
187 if (!hcd->regs) {
188 pr_debug("ioremap failed\n");
189 retval = -ENOMEM;
190 goto err2;
191 }
192
193 au1xxx_start_ohc(dev);
194 ohci_hcd_init(hcd_to_ohci(hcd));
195
196 retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED | IRQF_SHARED);
197 if (retval == 0)
198 return retval;
199
200 au1xxx_stop_ohc(dev);
201 iounmap(hcd->regs);
202 err2:
203 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
204 err1:
205 usb_put_hcd(hcd);
206 return retval;
207}
208
209
210/* may be called without controller electrically present */
211/* may be called with controller, bus, and devices active */
212
213/**
214 * usb_hcd_au1xxx_remove - shutdown processing for Au1xxx-based HCDs
215 * @dev: USB Host Controller being removed
216 * Context: !in_interrupt()
217 *
218 * Reverses the effect of usb_hcd_au1xxx_probe(), first invoking
219 * the HCD's stop() method. It is always called from a thread
220 * context, normally "rmmod", "apmd", or something similar.
221 *
222 */
223static void usb_ohci_au1xxx_remove(struct usb_hcd *hcd, struct platform_device *dev)
224{
225 usb_remove_hcd(hcd);
226 au1xxx_stop_ohc(dev);
227 iounmap(hcd->regs);
228 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
229 usb_put_hcd(hcd);
230} 110}
231 111
232/*-------------------------------------------------------------------------*/ 112static int __devinit ohci_au1xxx_start(struct usb_hcd *hcd)
233
234static int __devinit
235ohci_au1xxx_start (struct usb_hcd *hcd)
236{ 113{
237 struct ohci_hcd *ohci = hcd_to_ohci (hcd); 114 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
238 int ret; 115 int ret;
239 116
240 ohci_dbg (ohci, "ohci_au1xxx_start, ohci:%p", ohci); 117 ohci_dbg(ohci, "ohci_au1xxx_start, ohci:%p", ohci);
241 118
242 if ((ret = ohci_init (ohci)) < 0) 119 if ((ret = ohci_init(ohci)) < 0)
243 return ret; 120 return ret;
244 121
245 if ((ret = ohci_run (ohci)) < 0) { 122 if ((ret = ohci_run(ohci)) < 0) {
246 err ("can't start %s", hcd->self.bus_name); 123 err ("can't start %s", hcd->self.bus_name);
247 ohci_stop (hcd); 124 ohci_stop(hcd);
248 return ret; 125 return ret;
249 } 126 }
250 127
251 return 0; 128 return 0;
252} 129}
253 130
254/*-------------------------------------------------------------------------*/
255
256static const struct hc_driver ohci_au1xxx_hc_driver = { 131static const struct hc_driver ohci_au1xxx_hc_driver = {
257 .description = hcd_name, 132 .description = hcd_name,
258 .product_desc = "Au1xxx OHCI", 133 .product_desc = "Au1xxx OHCI",
@@ -296,18 +171,66 @@ static const struct hc_driver ohci_au1xxx_hc_driver = {
296 .start_port_reset = ohci_start_port_reset, 171 .start_port_reset = ohci_start_port_reset,
297}; 172};
298 173
299/*-------------------------------------------------------------------------*/
300
301static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev) 174static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
302{ 175{
303 int ret; 176 int ret;
304 177 struct usb_hcd *hcd;
305 pr_debug ("In ohci_hcd_au1xxx_drv_probe");
306 178
307 if (usb_disabled()) 179 if (usb_disabled())
308 return -ENODEV; 180 return -ENODEV;
309 181
310 ret = usb_ohci_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev); 182#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT)
183 /* Au1200 AB USB does not support coherent memory */
184 if (!(read_c0_prid() & 0xff)) {
185 printk(KERN_INFO "%s: this is chip revision AB !!\n",
186 pdev->name);
187 printk(KERN_INFO "%s: update your board or re-configure "
188 "the kernel\n", pdev->name);
189 return -ENODEV;
190 }
191#endif
192
193 if (pdev->resource[1].flags != IORESOURCE_IRQ) {
194 pr_debug("resource[1] is not IORESOURCE_IRQ\n");
195 return -ENOMEM;
196 }
197
198 hcd = usb_create_hcd(&ohci_au1xxx_hc_driver, &pdev->dev, "au1xxx");
199 if (!hcd)
200 return -ENOMEM;
201
202 hcd->rsrc_start = pdev->resource[0].start;
203 hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
204
205 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
206 pr_debug("request_mem_region failed\n");
207 ret = -EBUSY;
208 goto err1;
209 }
210
211 hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
212 if (!hcd->regs) {
213 pr_debug("ioremap failed\n");
214 ret = -ENOMEM;
215 goto err2;
216 }
217
218 au1xxx_start_ohc();
219 ohci_hcd_init(hcd_to_ohci(hcd));
220
221 ret = usb_add_hcd(hcd, pdev->resource[1].start,
222 IRQF_DISABLED | IRQF_SHARED);
223 if (ret == 0) {
224 platform_set_drvdata(pdev, hcd);
225 return ret;
226 }
227
228 au1xxx_stop_ohc();
229 iounmap(hcd->regs);
230err2:
231 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
232err1:
233 usb_put_hcd(hcd);
311 return ret; 234 return ret;
312} 235}
313 236
@@ -315,30 +238,78 @@ static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev)
315{ 238{
316 struct usb_hcd *hcd = platform_get_drvdata(pdev); 239 struct usb_hcd *hcd = platform_get_drvdata(pdev);
317 240
318 usb_ohci_au1xxx_remove(hcd, pdev); 241 usb_remove_hcd(hcd);
242 au1xxx_stop_ohc();
243 iounmap(hcd->regs);
244 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
245 usb_put_hcd(hcd);
246 platform_set_drvdata(pdev, NULL);
247
319 return 0; 248 return 0;
320} 249}
321 /*TBD*/ 250
322/*static int ohci_hcd_au1xxx_drv_suspend(struct platform_device *dev) 251#ifdef CONFIG_PM
252static int ohci_hcd_au1xxx_drv_suspend(struct platform_device *pdev,
253 pm_message_t message)
323{ 254{
324 struct usb_hcd *hcd = platform_get_drvdata(dev); 255 struct usb_hcd *hcd = platform_get_drvdata(pdev);
256 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
257 unsigned long flags;
258 int rc;
259
260 rc = 0;
261
262 /* Root hub was already suspended. Disable irq emission and
263 * mark HW unaccessible, bail out if RH has been resumed. Use
264 * the spinlock to properly synchronize with possible pending
265 * RH suspend or resume activity.
266 *
267 * This is still racy as hcd->state is manipulated outside of
268 * any locks =P But that will be a different fix.
269 */
270 spin_lock_irqsave(&ohci->lock, flags);
271 if (hcd->state != HC_STATE_SUSPENDED) {
272 rc = -EINVAL;
273 goto bail;
274 }
275 ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
276 (void)ohci_readl(ohci, &ohci->regs->intrdisable);
325 277
326 return 0; 278 /* make sure snapshot being resumed re-enumerates everything */
279 if (message.event == PM_EVENT_PRETHAW)
280 ohci_usb_reset(ohci);
281
282 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
283
284 au1xxx_stop_ohc();
285bail:
286 spin_unlock_irqrestore(&ohci->lock, flags);
287
288 return rc;
327} 289}
328static int ohci_hcd_au1xxx_drv_resume(struct platform_device *dev) 290
291static int ohci_hcd_au1xxx_drv_resume(struct platform_device *pdev)
329{ 292{
330 struct usb_hcd *hcd = platform_get_drvdata(dev); 293 struct usb_hcd *hcd = platform_get_drvdata(pdev);
294
295 au1xxx_start_ohc();
296
297 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
298 ohci_finish_controller_resume(hcd);
331 299
332 return 0; 300 return 0;
333} 301}
334*/ 302#else
303#define ohci_hcd_au1xxx_drv_suspend NULL
304#define ohci_hcd_au1xxx_drv_resume NULL
305#endif
335 306
336static struct platform_driver ohci_hcd_au1xxx_driver = { 307static struct platform_driver ohci_hcd_au1xxx_driver = {
337 .probe = ohci_hcd_au1xxx_drv_probe, 308 .probe = ohci_hcd_au1xxx_drv_probe,
338 .remove = ohci_hcd_au1xxx_drv_remove, 309 .remove = ohci_hcd_au1xxx_drv_remove,
339 .shutdown = usb_hcd_platform_shutdown, 310 .shutdown = usb_hcd_platform_shutdown,
340 /*.suspend = ohci_hcd_au1xxx_drv_suspend, */ 311 .suspend = ohci_hcd_au1xxx_drv_suspend,
341 /*.resume = ohci_hcd_au1xxx_drv_resume, */ 312 .resume = ohci_hcd_au1xxx_drv_resume,
342 .driver = { 313 .driver = {
343 .name = "au1xxx-ohci", 314 .name = "au1xxx-ohci",
344 .owner = THIS_MODULE, 315 .owner = THIS_MODULE,
diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c
index e06bfaebec54..7cef1d2f7ccc 100644
--- a/drivers/usb/host/ohci-dbg.c
+++ b/drivers/usb/host/ohci-dbg.c
@@ -651,7 +651,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
651 "%s\n" 651 "%s\n"
652 "%s version " DRIVER_VERSION "\n", 652 "%s version " DRIVER_VERSION "\n",
653 hcd->self.controller->bus->name, 653 hcd->self.controller->bus->name,
654 hcd->self.controller->bus_id, 654 dev_name(hcd->self.controller),
655 hcd->product_desc, 655 hcd->product_desc,
656 hcd_name); 656 hcd_name);
657 657
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index a8160d65f32b..26bc47941d01 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -974,7 +974,7 @@ MODULE_LICENSE ("GPL");
974#define PCI_DRIVER ohci_pci_driver 974#define PCI_DRIVER ohci_pci_driver
975#endif 975#endif
976 976
977#ifdef CONFIG_SA1111 977#if defined(CONFIG_ARCH_SA1100) && defined(CONFIG_SA1111)
978#include "ohci-sa1111.c" 978#include "ohci-sa1111.c"
979#define SA1111_DRIVER ohci_hcd_sa1111_driver 979#define SA1111_DRIVER ohci_hcd_sa1111_driver
980#endif 980#endif
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c
index a19a4f80a6e1..6e5e5f81ac90 100644
--- a/drivers/usb/host/ohci-omap.c
+++ b/drivers/usb/host/ohci-omap.c
@@ -329,7 +329,7 @@ static int usb_hcd_omap_probe (const struct hc_driver *driver,
329 } 329 }
330 330
331 331
332 hcd = usb_create_hcd (driver, &pdev->dev, pdev->dev.bus_id); 332 hcd = usb_create_hcd (driver, &pdev->dev, dev_name(&pdev->dev));
333 if (!hcd) { 333 if (!hcd) {
334 retval = -ENOMEM; 334 retval = -ENOMEM;
335 goto err0; 335 goto err0;
diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-pnx4008.c
index 28b458f20cc3..6ad8f2fc57b9 100644
--- a/drivers/usb/host/ohci-pnx4008.c
+++ b/drivers/usb/host/ohci-pnx4008.c
@@ -109,8 +109,6 @@ static struct clk *usb_clk;
109 109
110static int isp1301_probe(struct i2c_adapter *adap); 110static int isp1301_probe(struct i2c_adapter *adap);
111static int isp1301_detach(struct i2c_client *client); 111static int isp1301_detach(struct i2c_client *client);
112static int isp1301_command(struct i2c_client *client, unsigned int cmd,
113 void *arg);
114 112
115static const unsigned short normal_i2c[] = 113static const unsigned short normal_i2c[] =
116 { ISP1301_I2C_ADDR, ISP1301_I2C_ADDR + 1, I2C_CLIENT_END }; 114 { ISP1301_I2C_ADDR, ISP1301_I2C_ADDR + 1, I2C_CLIENT_END };
@@ -123,30 +121,37 @@ static struct i2c_client_address_data addr_data = {
123}; 121};
124 122
125struct i2c_driver isp1301_driver = { 123struct i2c_driver isp1301_driver = {
126 .class = I2C_CLASS_HWMON, 124 .driver = {
125 .name = "isp1301_pnx",
126 },
127 .attach_adapter = isp1301_probe, 127 .attach_adapter = isp1301_probe,
128 .detach_client = isp1301_detach, 128 .detach_client = isp1301_detach,
129 .command = isp1301_command
130}; 129};
131 130
132static int isp1301_attach(struct i2c_adapter *adap, int addr, int kind) 131static int isp1301_attach(struct i2c_adapter *adap, int addr, int kind)
133{ 132{
134 struct i2c_client *c; 133 struct i2c_client *c;
134 int err;
135 135
136 c = kzalloc(sizeof(*c), GFP_KERNEL); 136 c = kzalloc(sizeof(*c), GFP_KERNEL);
137
138 if (!c) 137 if (!c)
139 return -ENOMEM; 138 return -ENOMEM;
140 139
141 strcpy(c->name, "isp1301"); 140 strlcpy(c->name, "isp1301_pnx", I2C_NAME_SIZE);
142 c->flags = 0; 141 c->flags = 0;
143 c->addr = addr; 142 c->addr = addr;
144 c->adapter = adap; 143 c->adapter = adap;
145 c->driver = &isp1301_driver; 144 c->driver = &isp1301_driver;
146 145
146 err = i2c_attach_client(c);
147 if (err) {
148 kfree(c);
149 return err;
150 }
151
147 isp1301_i2c_client = c; 152 isp1301_i2c_client = c;
148 153
149 return i2c_attach_client(c); 154 return 0;
150} 155}
151 156
152static int isp1301_probe(struct i2c_adapter *adap) 157static int isp1301_probe(struct i2c_adapter *adap)
@@ -161,13 +166,6 @@ static int isp1301_detach(struct i2c_client *client)
161 return 0; 166 return 0;
162} 167}
163 168
164/* No commands defined */
165static int isp1301_command(struct i2c_client *client, unsigned int cmd,
166 void *arg)
167{
168 return 0;
169}
170
171static void i2c_write(u8 buf, u8 subaddr) 169static void i2c_write(u8 buf, u8 subaddr)
172{ 170{
173 char tmpbuf[2]; 171 char tmpbuf[2];
@@ -389,7 +387,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)
389 while ((__raw_readl(USB_OTG_CLK_STAT) & USB_CLOCK_MASK) != 387 while ((__raw_readl(USB_OTG_CLK_STAT) & USB_CLOCK_MASK) !=
390 USB_CLOCK_MASK) ; 388 USB_CLOCK_MASK) ;
391 389
392 hcd = usb_create_hcd (driver, &pdev->dev, pdev->dev.bus_id); 390 hcd = usb_create_hcd (driver, &pdev->dev, dev_name(&pdev->dev));
393 if (!hcd) { 391 if (!hcd) {
394 err("Failed to allocate HC buffer"); 392 err("Failed to allocate HC buffer");
395 ret = -ENOMEM; 393 ret = -ENOMEM;
diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c
index a67252791223..91e6e101a4cc 100644
--- a/drivers/usb/host/ohci-ppc-of.c
+++ b/drivers/usb/host/ohci-ppc-of.c
@@ -14,8 +14,8 @@
14 */ 14 */
15 15
16#include <linux/signal.h> 16#include <linux/signal.h>
17#include <linux/of_platform.h>
17 18
18#include <asm/of_platform.h>
19#include <asm/prom.h> 19#include <asm/prom.h>
20 20
21 21
diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c
index c1935ae537f8..55c95647f008 100644
--- a/drivers/usb/host/ohci-ps3.c
+++ b/drivers/usb/host/ohci-ps3.c
@@ -129,7 +129,7 @@ static int ps3_ohci_probe(struct ps3_system_bus_device *dev)
129 129
130 dev->core.dma_mask = &dummy_mask; /* FIXME: for improper usb code */ 130 dev->core.dma_mask = &dummy_mask; /* FIXME: for improper usb code */
131 131
132 hcd = usb_create_hcd(&ps3_ohci_hc_driver, &dev->core, dev->core.bus_id); 132 hcd = usb_create_hcd(&ps3_ohci_hc_driver, &dev->core, dev_name(&dev->core));
133 133
134 if (!hcd) { 134 if (!hcd) {
135 dev_dbg(&dev->core, "%s:%d: usb_create_hcd failed\n", __func__, 135 dev_dbg(&dev->core, "%s:%d: usb_create_hcd failed\n", __func__,
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
index 9b547407c934..6a9b4c557953 100644
--- a/drivers/usb/host/ohci-q.c
+++ b/drivers/usb/host/ohci-q.c
@@ -159,9 +159,6 @@ static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed)
159{ 159{
160 int branch; 160 int branch;
161 161
162 if (ohci_to_hcd(ohci)->state == HC_STATE_QUIESCING)
163 return -EAGAIN;
164
165 ed->state = ED_OPER; 162 ed->state = ED_OPER;
166 ed->ed_prev = NULL; 163 ed->ed_prev = NULL;
167 ed->ed_next = NULL; 164 ed->ed_next = NULL;
diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c
index e610698c6b60..21b164e4abeb 100644
--- a/drivers/usb/host/ohci-sm501.c
+++ b/drivers/usb/host/ohci-sm501.c
@@ -143,7 +143,7 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
143 goto err2; 143 goto err2;
144 } 144 }
145 145
146 hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id); 146 hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
147 if (!hcd) { 147 if (!hcd) {
148 retval = -ENOMEM; 148 retval = -ENOMEM;
149 goto err2; 149 goto err2;
diff --git a/drivers/usb/host/ohci-ssb.c b/drivers/usb/host/ohci-ssb.c
index 7275186db315..3660c83d80af 100644
--- a/drivers/usb/host/ohci-ssb.c
+++ b/drivers/usb/host/ohci-ssb.c
@@ -113,7 +113,7 @@ static int ssb_ohci_attach(struct ssb_device *dev)
113 ssb_device_enable(dev, flags); 113 ssb_device_enable(dev, flags);
114 114
115 hcd = usb_create_hcd(&ssb_ohci_hc_driver, dev->dev, 115 hcd = usb_create_hcd(&ssb_ohci_hc_driver, dev->dev,
116 dev->dev->bus_id); 116 dev_name(dev->dev));
117 if (!hcd) 117 if (!hcd)
118 goto err_dev_disable; 118 goto err_dev_disable;
119 ohcidev = hcd_to_ssb_ohci(hcd); 119 ohcidev = hcd_to_ssb_ohci(hcd);
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
index 16667342b3c3..d5f02dddb120 100644
--- a/drivers/usb/host/r8a66597-hcd.c
+++ b/drivers/usb/host/r8a66597-hcd.c
@@ -312,9 +312,9 @@ static void put_child_connect_map(struct r8a66597 *r8a66597, int address)
312static void set_pipe_reg_addr(struct r8a66597_pipe *pipe, u8 dma_ch) 312static void set_pipe_reg_addr(struct r8a66597_pipe *pipe, u8 dma_ch)
313{ 313{
314 u16 pipenum = pipe->info.pipenum; 314 u16 pipenum = pipe->info.pipenum;
315 unsigned long fifoaddr[] = {D0FIFO, D1FIFO, CFIFO}; 315 const unsigned long fifoaddr[] = {D0FIFO, D1FIFO, CFIFO};
316 unsigned long fifosel[] = {D0FIFOSEL, D1FIFOSEL, CFIFOSEL}; 316 const unsigned long fifosel[] = {D0FIFOSEL, D1FIFOSEL, CFIFOSEL};
317 unsigned long fifoctr[] = {D0FIFOCTR, D1FIFOCTR, CFIFOCTR}; 317 const unsigned long fifoctr[] = {D0FIFOCTR, D1FIFOCTR, CFIFOCTR};
318 318
319 if (dma_ch > R8A66597_PIPE_NO_DMA) /* dma fifo not use? */ 319 if (dma_ch > R8A66597_PIPE_NO_DMA) /* dma fifo not use? */
320 dma_ch = R8A66597_PIPE_NO_DMA; 320 dma_ch = R8A66597_PIPE_NO_DMA;
@@ -863,6 +863,32 @@ static void disable_r8a66597_pipe_all(struct r8a66597 *r8a66597,
863 dev->dma_map = 0; 863 dev->dma_map = 0;
864} 864}
865 865
866static u16 get_interval(struct urb *urb, __u8 interval)
867{
868 u16 time = 1;
869 int i;
870
871 if (urb->dev->speed == USB_SPEED_HIGH) {
872 if (interval > IITV)
873 time = IITV;
874 else
875 time = interval ? interval - 1 : 0;
876 } else {
877 if (interval > 128) {
878 time = IITV;
879 } else {
880 /* calculate the nearest value for PIPEPERI */
881 for (i = 0; i < 7; i++) {
882 if ((1 << i) < interval &&
883 (1 << (i + 1) > interval))
884 time = 1 << i;
885 }
886 }
887 }
888
889 return time;
890}
891
866static unsigned long get_timer_interval(struct urb *urb, __u8 interval) 892static unsigned long get_timer_interval(struct urb *urb, __u8 interval)
867{ 893{
868 __u8 i; 894 __u8 i;
@@ -901,10 +927,7 @@ static void init_pipe_info(struct r8a66597 *r8a66597, struct urb *urb,
901 info.interval = 0; 927 info.interval = 0;
902 info.timer_interval = 0; 928 info.timer_interval = 0;
903 } else { 929 } else {
904 if (ep->bInterval > IITV) 930 info.interval = get_interval(urb, ep->bInterval);
905 info.interval = IITV;
906 else
907 info.interval = ep->bInterval ? ep->bInterval - 1 : 0;
908 info.timer_interval = get_timer_interval(urb, ep->bInterval); 931 info.timer_interval = get_timer_interval(urb, ep->bInterval);
909 } 932 }
910 if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) 933 if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
@@ -2244,6 +2267,7 @@ static int __init r8a66597_probe(struct platform_device *pdev)
2244 struct r8a66597 *r8a66597; 2267 struct r8a66597 *r8a66597;
2245 int ret = 0; 2268 int ret = 0;
2246 int i; 2269 int i;
2270 unsigned long irq_trigger;
2247 2271
2248 if (pdev->dev.dma_mask) { 2272 if (pdev->dev.dma_mask) {
2249 ret = -EINVAL; 2273 ret = -EINVAL;
@@ -2302,7 +2326,11 @@ static int __init r8a66597_probe(struct platform_device *pdev)
2302 INIT_LIST_HEAD(&r8a66597->child_device); 2326 INIT_LIST_HEAD(&r8a66597->child_device);
2303 2327
2304 hcd->rsrc_start = res->start; 2328 hcd->rsrc_start = res->start;
2305 ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); 2329 if (irq_sense == INTL)
2330 irq_trigger = IRQF_TRIGGER_LOW;
2331 else
2332 irq_trigger = IRQF_TRIGGER_FALLING;
2333 ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger);
2306 if (ret != 0) { 2334 if (ret != 0) {
2307 err("Failed to add hcd"); 2335 err("Failed to add hcd");
2308 goto clean_up; 2336 goto clean_up;
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c
index 426575247b23..340d72da554a 100644
--- a/drivers/usb/host/sl811-hcd.c
+++ b/drivers/usb/host/sl811-hcd.c
@@ -1674,7 +1674,7 @@ sl811h_probe(struct platform_device *dev)
1674 } 1674 }
1675 1675
1676 /* allocate and initialize hcd */ 1676 /* allocate and initialize hcd */
1677 hcd = usb_create_hcd(&sl811h_hc_driver, &dev->dev, dev->dev.bus_id); 1677 hcd = usb_create_hcd(&sl811h_hc_driver, &dev->dev, dev_name(&dev->dev));
1678 if (!hcd) { 1678 if (!hcd) {
1679 retval = -ENOMEM; 1679 retval = -ENOMEM;
1680 goto err5; 1680 goto err5;
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c
index 9b6323f768b2..20ad3c48fcb2 100644
--- a/drivers/usb/host/u132-hcd.c
+++ b/drivers/usb/host/u132-hcd.c
@@ -3124,7 +3124,7 @@ static int __devinit u132_probe(struct platform_device *pdev)
3124 if (pdev->dev.dma_mask) 3124 if (pdev->dev.dma_mask)
3125 return -EINVAL; 3125 return -EINVAL;
3126 3126
3127 hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, pdev->dev.bus_id); 3127 hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, dev_name(&pdev->dev));
3128 if (!hcd) { 3128 if (!hcd) {
3129 printk(KERN_ERR "failed to create the usb hcd struct for U132\n" 3129 printk(KERN_ERR "failed to create the usb hcd struct for U132\n"
3130 ); 3130 );
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c
index 8e4427aebb14..885b585360b9 100644
--- a/drivers/usb/host/uhci-hub.c
+++ b/drivers/usb/host/uhci-hub.c
@@ -12,7 +12,7 @@
12 * (C) Copyright 2004 Alan Stern, stern@rowland.harvard.edu 12 * (C) Copyright 2004 Alan Stern, stern@rowland.harvard.edu
13 */ 13 */
14 14
15static __u8 root_hub_hub_des[] = 15static const __u8 root_hub_hub_des[] =
16{ 16{
17 0x09, /* __u8 bLength; */ 17 0x09, /* __u8 bLength; */
18 0x29, /* __u8 bDescriptorType; Hub-descriptor */ 18 0x29, /* __u8 bDescriptorType; Hub-descriptor */
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c
index 093938697426..d2f61d5510e7 100644
--- a/drivers/usb/misc/auerswald.c
+++ b/drivers/usb/misc/auerswald.c
@@ -1421,7 +1421,8 @@ ofail: mutex_unlock(&cp->mutex);
1421 1421
1422 1422
1423/* IOCTL functions */ 1423/* IOCTL functions */
1424static int auerchar_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 1424static long auerchar_ioctl(struct file *file, unsigned int cmd,
1425 unsigned long arg)
1425{ 1426{
1426 pauerchar_t ccp = (pauerchar_t) file->private_data; 1427 pauerchar_t ccp = (pauerchar_t) file->private_data;
1427 int ret = 0; 1428 int ret = 0;
@@ -1452,7 +1453,7 @@ static int auerchar_ioctl (struct inode *inode, struct file *file, unsigned int
1452 mutex_unlock(&ccp->mutex); 1453 mutex_unlock(&ccp->mutex);
1453 return -ENODEV; 1454 return -ENODEV;
1454 } 1455 }
1455 1456 lock_kernel();
1456 switch (cmd) { 1457 switch (cmd) {
1457 1458
1458 /* return != 0 if Transmitt channel ready to send */ 1459 /* return != 0 if Transmitt channel ready to send */
@@ -1547,9 +1548,10 @@ static int auerchar_ioctl (struct inode *inode, struct file *file, unsigned int
1547 1548
1548 default: 1549 default:
1549 dbg ("IOCTL_AU_UNKNOWN"); 1550 dbg ("IOCTL_AU_UNKNOWN");
1550 ret = -ENOIOCTLCMD; 1551 ret = -ENOTTY;
1551 break; 1552 break;
1552 } 1553 }
1554 unlock_kernel();
1553 /* release the mutexes */ 1555 /* release the mutexes */
1554 mutex_unlock(&cp->mutex); 1556 mutex_unlock(&cp->mutex);
1555 mutex_unlock(&ccp->mutex); 1557 mutex_unlock(&ccp->mutex);
@@ -1860,7 +1862,7 @@ static const struct file_operations auerswald_fops =
1860 .llseek = no_llseek, 1862 .llseek = no_llseek,
1861 .read = auerchar_read, 1863 .read = auerchar_read,
1862 .write = auerchar_write, 1864 .write = auerchar_write,
1863 .ioctl = auerchar_ioctl, 1865 .unlocked_ioctl = auerchar_ioctl,
1864 .open = auerchar_open, 1866 .open = auerchar_open,
1865 .release = auerchar_release, 1867 .release = auerchar_release,
1866}; 1868};
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c
index 20886c21e739..5d859ded5bbf 100644
--- a/drivers/usb/misc/emi62.c
+++ b/drivers/usb/misc/emi62.c
@@ -6,8 +6,6 @@
6 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License, as published by 7 * it under the terms of the GNU General Public License, as published by
8 * the Free Software Foundation, version 2. 8 * the Free Software Foundation, version 2.
9 *
10 * $Id: emi62.c,v 1.15 2002/04/23 06:13:59 tapio Exp $
11 */ 9 */
12#include <linux/kernel.h> 10#include <linux/kernel.h>
13#include <linux/errno.h> 11#include <linux/errno.h>
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index ec88b3bfee46..97c280971532 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -656,29 +656,6 @@ static int ftdi_elan_release(struct inode *inode, struct file *file)
656} 656}
657 657
658 658
659#define FTDI_ELAN_IOC_MAGIC 0xA1
660#define FTDI_ELAN_IOCDEBUG _IOC(_IOC_WRITE, FTDI_ELAN_IOC_MAGIC, 1, 132)
661static int ftdi_elan_ioctl(struct inode *inode, struct file *file,
662 unsigned int cmd, unsigned long arg)
663{
664 switch (cmd) {
665 case FTDI_ELAN_IOCDEBUG:{
666 char line[132];
667 int size = strncpy_from_user(line,
668 (const char __user *)arg, sizeof(line));
669 if (size < 0) {
670 return -EINVAL;
671 } else {
672 printk(KERN_ERR "TODO: ioctl %s\n", line);
673 return 0;
674 }
675 }
676 default:
677 return -EFAULT;
678 }
679}
680
681
682/* 659/*
683* 660*
684* blocking bulk reads are used to get data from the device 661* blocking bulk reads are used to get data from the device
@@ -1222,7 +1199,6 @@ error_1:
1222static const struct file_operations ftdi_elan_fops = { 1199static const struct file_operations ftdi_elan_fops = {
1223 .owner = THIS_MODULE, 1200 .owner = THIS_MODULE,
1224 .llseek = no_llseek, 1201 .llseek = no_llseek,
1225 .ioctl = ftdi_elan_ioctl,
1226 .read = ftdi_elan_read, 1202 .read = ftdi_elan_read,
1227 .write = ftdi_elan_write, 1203 .write = ftdi_elan_write,
1228 .open = ftdi_elan_open, 1204 .open = ftdi_elan_open,
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
index 1cb54a28347f..e6ca9979e3ae 100644
--- a/drivers/usb/misc/iowarrior.c
+++ b/drivers/usb/misc/iowarrior.c
@@ -474,8 +474,8 @@ exit:
474/** 474/**
475 * iowarrior_ioctl 475 * iowarrior_ioctl
476 */ 476 */
477static int iowarrior_ioctl(struct inode *inode, struct file *file, 477static long iowarrior_ioctl(struct file *file, unsigned int cmd,
478 unsigned int cmd, unsigned long arg) 478 unsigned long arg)
479{ 479{
480 struct iowarrior *dev = NULL; 480 struct iowarrior *dev = NULL;
481 __u8 *buffer; 481 __u8 *buffer;
@@ -493,6 +493,7 @@ static int iowarrior_ioctl(struct inode *inode, struct file *file,
493 return -ENOMEM; 493 return -ENOMEM;
494 494
495 /* lock this object */ 495 /* lock this object */
496 lock_kernel();
496 mutex_lock(&dev->mutex); 497 mutex_lock(&dev->mutex);
497 498
498 /* verify that the device wasn't unplugged */ 499 /* verify that the device wasn't unplugged */
@@ -584,6 +585,7 @@ static int iowarrior_ioctl(struct inode *inode, struct file *file,
584error_out: 585error_out:
585 /* unlock the device */ 586 /* unlock the device */
586 mutex_unlock(&dev->mutex); 587 mutex_unlock(&dev->mutex);
588 unlock_kernel();
587 kfree(buffer); 589 kfree(buffer);
588 return retval; 590 return retval;
589} 591}
@@ -719,7 +721,7 @@ static const struct file_operations iowarrior_fops = {
719 .owner = THIS_MODULE, 721 .owner = THIS_MODULE,
720 .write = iowarrior_write, 722 .write = iowarrior_write,
721 .read = iowarrior_read, 723 .read = iowarrior_read,
722 .ioctl = iowarrior_ioctl, 724 .unlocked_ioctl = iowarrior_ioctl,
723 .open = iowarrior_open, 725 .open = iowarrior_open,
724 .release = iowarrior_release, 726 .release = iowarrior_release,
725 .poll = iowarrior_poll, 727 .poll = iowarrior_poll,
diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c
index 330c18e390b8..248a12aacef6 100644
--- a/drivers/usb/misc/rio500.c
+++ b/drivers/usb/misc/rio500.c
@@ -104,9 +104,7 @@ static int close_rio(struct inode *inode, struct file *file)
104 return 0; 104 return 0;
105} 105}
106 106
107static int 107static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg)
108ioctl_rio(struct inode *inode, struct file *file, unsigned int cmd,
109 unsigned long arg)
110{ 108{
111 struct RioCommand rio_cmd; 109 struct RioCommand rio_cmd;
112 struct rio_usb_data *rio = &rio_instance; 110 struct rio_usb_data *rio = &rio_instance;
@@ -116,6 +114,7 @@ ioctl_rio(struct inode *inode, struct file *file, unsigned int cmd,
116 int retries; 114 int retries;
117 int retval=0; 115 int retval=0;
118 116
117 lock_kernel();
119 mutex_lock(&(rio->lock)); 118 mutex_lock(&(rio->lock));
120 /* Sanity check to make sure rio is connected, powered, etc */ 119 /* Sanity check to make sure rio is connected, powered, etc */
121 if (rio->present == 0 || rio->rio_dev == NULL) { 120 if (rio->present == 0 || rio->rio_dev == NULL) {
@@ -254,6 +253,7 @@ ioctl_rio(struct inode *inode, struct file *file, unsigned int cmd,
254 253
255err_out: 254err_out:
256 mutex_unlock(&(rio->lock)); 255 mutex_unlock(&(rio->lock));
256 unlock_kernel();
257 return retval; 257 return retval;
258} 258}
259 259
@@ -433,7 +433,7 @@ file_operations usb_rio_fops = {
433 .owner = THIS_MODULE, 433 .owner = THIS_MODULE,
434 .read = read_rio, 434 .read = read_rio,
435 .write = write_rio, 435 .write = write_rio,
436 .ioctl = ioctl_rio, 436 .unlocked_ioctl = ioctl_rio,
437 .open = open_rio, 437 .open = open_rio,
438 .release = close_rio, 438 .release = close_rio,
439}; 439};
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c
index 33182f4c2267..fbace41a7cba 100644
--- a/drivers/usb/misc/sisusbvga/sisusb.c
+++ b/drivers/usb/misc/sisusbvga/sisusb.c
@@ -2982,9 +2982,8 @@ sisusb_handle_command(struct sisusb_usb_data *sisusb, struct sisusb_command *y,
2982 return retval; 2982 return retval;
2983} 2983}
2984 2984
2985static int 2985static long
2986sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, 2986sisusb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
2987 unsigned long arg)
2988{ 2987{
2989 struct sisusb_usb_data *sisusb; 2988 struct sisusb_usb_data *sisusb;
2990 struct sisusb_info x; 2989 struct sisusb_info x;
@@ -2995,6 +2994,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
2995 if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) 2994 if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
2996 return -ENODEV; 2995 return -ENODEV;
2997 2996
2997 lock_kernel();
2998 mutex_lock(&sisusb->lock); 2998 mutex_lock(&sisusb->lock);
2999 2999
3000 /* Sanity check */ 3000 /* Sanity check */
@@ -3053,6 +3053,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
3053 3053
3054err_out: 3054err_out:
3055 mutex_unlock(&sisusb->lock); 3055 mutex_unlock(&sisusb->lock);
3056 unlock_kernel();
3056 return retval; 3057 return retval;
3057} 3058}
3058 3059
@@ -3066,9 +3067,7 @@ sisusb_compat_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
3066 case SISUSB_GET_CONFIG_SIZE: 3067 case SISUSB_GET_CONFIG_SIZE:
3067 case SISUSB_GET_CONFIG: 3068 case SISUSB_GET_CONFIG:
3068 case SISUSB_COMMAND: 3069 case SISUSB_COMMAND:
3069 lock_kernel(); 3070 retval = sisusb_ioctl(f, cmd, arg);
3070 retval = sisusb_ioctl(f->f_path.dentry->d_inode, f, cmd, arg);
3071 unlock_kernel();
3072 return retval; 3071 return retval;
3073 3072
3074 default: 3073 default:
@@ -3087,7 +3086,7 @@ static const struct file_operations usb_sisusb_fops = {
3087#ifdef SISUSB_NEW_CONFIG_COMPAT 3086#ifdef SISUSB_NEW_CONFIG_COMPAT
3088 .compat_ioctl = sisusb_compat_ioctl, 3087 .compat_ioctl = sisusb_compat_ioctl,
3089#endif 3088#endif
3090 .ioctl = sisusb_ioctl 3089 .unlocked_ioctl = sisusb_ioctl
3091}; 3090};
3092 3091
3093static struct usb_class_driver usb_sisusb_class = { 3092static struct usb_class_driver usb_sisusb_class = {
diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c
index 7f7021ee4189..2db4228fbb01 100644
--- a/drivers/usb/misc/usblcd.c
+++ b/drivers/usb/misc/usblcd.c
@@ -146,7 +146,7 @@ static ssize_t lcd_read(struct file *file, char __user * buffer, size_t count, l
146 return retval; 146 return retval;
147} 147}
148 148
149static int lcd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 149static long lcd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
150{ 150{
151 struct usb_lcd *dev; 151 struct usb_lcd *dev;
152 u16 bcdDevice; 152 u16 bcdDevice;
@@ -158,12 +158,14 @@ static int lcd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u
158 158
159 switch (cmd) { 159 switch (cmd) {
160 case IOCTL_GET_HARD_VERSION: 160 case IOCTL_GET_HARD_VERSION:
161 lock_kernel();
161 bcdDevice = le16_to_cpu((dev->udev)->descriptor.bcdDevice); 162 bcdDevice = le16_to_cpu((dev->udev)->descriptor.bcdDevice);
162 sprintf(buf,"%1d%1d.%1d%1d", 163 sprintf(buf,"%1d%1d.%1d%1d",
163 (bcdDevice & 0xF000)>>12, 164 (bcdDevice & 0xF000)>>12,
164 (bcdDevice & 0xF00)>>8, 165 (bcdDevice & 0xF00)>>8,
165 (bcdDevice & 0xF0)>>4, 166 (bcdDevice & 0xF0)>>4,
166 (bcdDevice & 0xF)); 167 (bcdDevice & 0xF));
168 unlock_kernel();
167 if (copy_to_user((void __user *)arg,buf,strlen(buf))!=0) 169 if (copy_to_user((void __user *)arg,buf,strlen(buf))!=0)
168 return -EFAULT; 170 return -EFAULT;
169 break; 171 break;
@@ -272,7 +274,7 @@ static const struct file_operations lcd_fops = {
272 .read = lcd_read, 274 .read = lcd_read,
273 .write = lcd_write, 275 .write = lcd_write,
274 .open = lcd_open, 276 .open = lcd_open,
275 .ioctl = lcd_ioctl, 277 .unlocked_ioctl = lcd_ioctl,
276 .release = lcd_release, 278 .release = lcd_release,
277}; 279};
278 280
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c
index 293a46247c3b..6566fc0a3228 100644
--- a/drivers/usb/mon/mon_bin.c
+++ b/drivers/usb/mon/mon_bin.c
@@ -1162,8 +1162,9 @@ int mon_bin_add(struct mon_bus *mbus, const struct usb_bus *ubus)
1162 if (minor >= MON_BIN_MAX_MINOR) 1162 if (minor >= MON_BIN_MAX_MINOR)
1163 return 0; 1163 return 0;
1164 1164
1165 dev = device_create(mon_bin_class, ubus? ubus->controller: NULL, 1165 dev = device_create_drvdata(mon_bin_class, ubus? ubus->controller: NULL,
1166 MKDEV(MAJOR(mon_bin_dev0), minor), "usbmon%d", minor); 1166 MKDEV(MAJOR(mon_bin_dev0), minor), NULL,
1167 "usbmon%d", minor);
1167 if (IS_ERR(dev)) 1168 if (IS_ERR(dev))
1168 return 0; 1169 return 0;
1169 1170
diff --git a/drivers/usb/mon/mon_stat.c b/drivers/usb/mon/mon_stat.c
index c7a595cd648a..ac8b0d5ce7f8 100644
--- a/drivers/usb/mon/mon_stat.c
+++ b/drivers/usb/mon/mon_stat.c
@@ -9,6 +9,7 @@
9 9
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/usb.h> 11#include <linux/usb.h>
12#include <linux/fs.h>
12#include <asm/uaccess.h> 13#include <asm/uaccess.h>
13 14
14#include "usb_mon.h" 15#include "usb_mon.h"
@@ -42,19 +43,8 @@ static ssize_t mon_stat_read(struct file *file, char __user *buf,
42 size_t nbytes, loff_t *ppos) 43 size_t nbytes, loff_t *ppos)
43{ 44{
44 struct snap *sp = file->private_data; 45 struct snap *sp = file->private_data;
45 loff_t pos = *ppos;
46 int cnt;
47 46
48 if (pos < 0 || pos >= sp->slen) 47 return simple_read_from_buffer(buf, nbytes, ppos, sp->str, sp->slen);
49 return 0;
50 if (nbytes == 0)
51 return 0;
52 if ((cnt = sp->slen - pos) > nbytes)
53 cnt = nbytes;
54 if (copy_to_user(buf, sp->str + pos, cnt))
55 return -EFAULT;
56 *ppos = pos + cnt;
57 return cnt;
58} 48}
59 49
60static int mon_stat_release(struct inode *inode, struct file *file) 50static int mon_stat_release(struct inode *inode, struct file *file)
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
index 9a7681b55266..8878c1767fc8 100644
--- a/drivers/usb/serial/Kconfig
+++ b/drivers/usb/serial/Kconfig
@@ -64,14 +64,6 @@ config USB_SERIAL_AIRCABLE
64 To compile this driver as a module, choose M here: the module 64 To compile this driver as a module, choose M here: the module
65 will be called aircable. 65 will be called aircable.
66 66
67config USB_SERIAL_AIRPRIME
68 tristate "USB AirPrime CDMA Wireless Driver"
69 help
70 Say Y here if you want to use a AirPrime CDMA Wireless PC card.
71
72 To compile this driver as a module, choose M here: the
73 module will be called airprime.
74
75config USB_SERIAL_ARK3116 67config USB_SERIAL_ARK3116
76 tristate "USB ARK Micro 3116 USB Serial Driver" 68 tristate "USB ARK Micro 3116 USB Serial Driver"
77 help 69 help
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile
index 17a762ab6769..6047f818adfe 100644
--- a/drivers/usb/serial/Makefile
+++ b/drivers/usb/serial/Makefile
@@ -12,7 +12,6 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o
12usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) 12usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
13 13
14obj-$(CONFIG_USB_SERIAL_AIRCABLE) += aircable.o 14obj-$(CONFIG_USB_SERIAL_AIRCABLE) += aircable.o
15obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o
16obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o 15obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o
17obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o 16obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o
18obj-$(CONFIG_USB_SERIAL_CH341) += ch341.o 17obj-$(CONFIG_USB_SERIAL_CH341) += ch341.o
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c
index db6f97a93c02..79ea98c66fa8 100644
--- a/drivers/usb/serial/aircable.c
+++ b/drivers/usb/serial/aircable.c
@@ -272,7 +272,7 @@ static void aircable_read(struct work_struct *work)
272 * 64 bytes, to ensure I do not get throttled. 272 * 64 bytes, to ensure I do not get throttled.
273 * Ask USB mailing list for better aproach. 273 * Ask USB mailing list for better aproach.
274 */ 274 */
275 tty = port->tty; 275 tty = port->port.tty;
276 276
277 if (!tty) { 277 if (!tty) {
278 schedule_work(&priv->rx_work); 278 schedule_work(&priv->rx_work);
@@ -378,13 +378,14 @@ static void aircable_shutdown(struct usb_serial *serial)
378 } 378 }
379} 379}
380 380
381static int aircable_write_room(struct usb_serial_port *port) 381static int aircable_write_room(struct tty_struct *tty)
382{ 382{
383 struct usb_serial_port *port = tty->driver_data;
383 struct aircable_private *priv = usb_get_serial_port_data(port); 384 struct aircable_private *priv = usb_get_serial_port_data(port);
384 return serial_buf_data_avail(priv->tx_buf); 385 return serial_buf_data_avail(priv->tx_buf);
385} 386}
386 387
387static int aircable_write(struct usb_serial_port *port, 388static int aircable_write(struct tty_struct *tty, struct usb_serial_port *port,
388 const unsigned char *source, int count) 389 const unsigned char *source, int count)
389{ 390{
390 struct aircable_private *priv = usb_get_serial_port_data(port); 391 struct aircable_private *priv = usb_get_serial_port_data(port);
@@ -466,7 +467,7 @@ static void aircable_read_bulk_callback(struct urb *urb)
466 467
467 if (status) { 468 if (status) {
468 dbg("%s - urb status = %d", __func__, status); 469 dbg("%s - urb status = %d", __func__, status);
469 if (!port->open_count) { 470 if (!port->port.count) {
470 dbg("%s - port is closed, exiting.", __func__); 471 dbg("%s - port is closed, exiting.", __func__);
471 return; 472 return;
472 } 473 }
@@ -494,7 +495,7 @@ static void aircable_read_bulk_callback(struct urb *urb)
494 usb_serial_debug_data(debug, &port->dev, __func__, 495 usb_serial_debug_data(debug, &port->dev, __func__,
495 urb->actual_length, urb->transfer_buffer); 496 urb->actual_length, urb->transfer_buffer);
496 497
497 tty = port->tty; 498 tty = port->port.tty;
498 if (tty && urb->actual_length) { 499 if (tty && urb->actual_length) {
499 if (urb->actual_length <= 2) { 500 if (urb->actual_length <= 2) {
500 /* This is an incomplete package */ 501 /* This is an incomplete package */
@@ -528,7 +529,7 @@ static void aircable_read_bulk_callback(struct urb *urb)
528 } 529 }
529 530
530 /* Schedule the next read _if_ we are still open */ 531 /* Schedule the next read _if_ we are still open */
531 if (port->open_count) { 532 if (port->port.count) {
532 usb_fill_bulk_urb(port->read_urb, port->serial->dev, 533 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
533 usb_rcvbulkpipe(port->serial->dev, 534 usb_rcvbulkpipe(port->serial->dev,
534 port->bulk_in_endpointAddress), 535 port->bulk_in_endpointAddress),
@@ -547,8 +548,9 @@ static void aircable_read_bulk_callback(struct urb *urb)
547} 548}
548 549
549/* Based on ftdi_sio.c throttle */ 550/* Based on ftdi_sio.c throttle */
550static void aircable_throttle(struct usb_serial_port *port) 551static void aircable_throttle(struct tty_struct *tty)
551{ 552{
553 struct usb_serial_port *port = tty->driver_data;
552 struct aircable_private *priv = usb_get_serial_port_data(port); 554 struct aircable_private *priv = usb_get_serial_port_data(port);
553 unsigned long flags; 555 unsigned long flags;
554 556
@@ -560,8 +562,9 @@ static void aircable_throttle(struct usb_serial_port *port)
560} 562}
561 563
562/* Based on ftdi_sio.c unthrottle */ 564/* Based on ftdi_sio.c unthrottle */
563static void aircable_unthrottle(struct usb_serial_port *port) 565static void aircable_unthrottle(struct tty_struct *tty)
564{ 566{
567 struct usb_serial_port *port = tty->driver_data;
565 struct aircable_private *priv = usb_get_serial_port_data(port); 568 struct aircable_private *priv = usb_get_serial_port_data(port);
566 int actually_throttled; 569 int actually_throttled;
567 unsigned long flags; 570 unsigned long flags;
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c
deleted file mode 100644
index 0798c14ce787..000000000000
--- a/drivers/usb/serial/airprime.c
+++ /dev/null
@@ -1,353 +0,0 @@
1/*
2 * AirPrime CDMA Wireless Serial USB driver
3 *
4 * Copyright (C) 2005-2006 Greg Kroah-Hartman <gregkh@suse.de>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/tty.h>
14#include <linux/tty_flip.h>
15#include <linux/module.h>
16#include <linux/usb.h>
17#include <linux/usb/serial.h>
18
19static struct usb_device_id id_table [] = {
20 { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */
21 { },
22};
23MODULE_DEVICE_TABLE(usb, id_table);
24
25#define URB_TRANSFER_BUFFER_SIZE 4096
26#define NUM_READ_URBS 4
27#define NUM_WRITE_URBS 4
28#define NUM_BULK_EPS 3
29#define MAX_BULK_EPS 6
30
31/* if overridden by the user, then use their value for the size of the
32 * read and write urbs, and the number of endpoints */
33static int buffer_size = URB_TRANSFER_BUFFER_SIZE;
34static int endpoints = NUM_BULK_EPS;
35static int debug;
36struct airprime_private {
37 spinlock_t lock;
38 int outstanding_urbs;
39 int throttled;
40 struct urb *read_urbp[NUM_READ_URBS];
41
42 /* Settings for the port */
43 int rts_state; /* Handshaking pins (outputs) */
44 int dtr_state;
45 int cts_state; /* Handshaking pins (inputs) */
46 int dsr_state;
47 int dcd_state;
48 int ri_state;
49};
50
51static int airprime_send_setup(struct usb_serial_port *port)
52{
53 struct usb_serial *serial = port->serial;
54 struct airprime_private *priv;
55
56 dbg("%s", __func__);
57
58 if (port->number != 0)
59 return 0;
60
61 priv = usb_get_serial_port_data(port);
62
63 if (port->tty) {
64 int val = 0;
65 if (priv->dtr_state)
66 val |= 0x01;
67 if (priv->rts_state)
68 val |= 0x02;
69
70 return usb_control_msg(serial->dev,
71 usb_rcvctrlpipe(serial->dev, 0),
72 0x22, 0x21, val, 0, NULL, 0,
73 USB_CTRL_SET_TIMEOUT);
74 }
75
76 return 0;
77}
78
79static void airprime_read_bulk_callback(struct urb *urb)
80{
81 struct usb_serial_port *port = urb->context;
82 unsigned char *data = urb->transfer_buffer;
83 struct tty_struct *tty;
84 int result;
85 int status = urb->status;
86
87 dbg("%s - port %d", __func__, port->number);
88
89 if (status) {
90 dbg("%s - nonzero read bulk status received: %d",
91 __func__, status);
92 return;
93 }
94 usb_serial_debug_data(debug, &port->dev, __func__,
95 urb->actual_length, data);
96
97 tty = port->tty;
98 if (tty && urb->actual_length) {
99 tty_insert_flip_string(tty, data, urb->actual_length);
100 tty_flip_buffer_push(tty);
101 }
102
103 result = usb_submit_urb(urb, GFP_ATOMIC);
104 if (result)
105 dev_err(&port->dev,
106 "%s - failed resubmitting read urb, error %d\n",
107 __func__, result);
108 return;
109}
110
111static void airprime_write_bulk_callback(struct urb *urb)
112{
113 struct usb_serial_port *port = urb->context;
114 struct airprime_private *priv = usb_get_serial_port_data(port);
115 int status = urb->status;
116 unsigned long flags;
117
118 dbg("%s - port %d", __func__, port->number);
119
120 /* free up the transfer buffer, as usb_free_urb() does not do this */
121 kfree(urb->transfer_buffer);
122
123 if (status)
124 dbg("%s - nonzero write bulk status received: %d",
125 __func__, status);
126 spin_lock_irqsave(&priv->lock, flags);
127 --priv->outstanding_urbs;
128 spin_unlock_irqrestore(&priv->lock, flags);
129
130 usb_serial_port_softint(port);
131}
132
133static int airprime_open(struct usb_serial_port *port, struct file *filp)
134{
135 struct airprime_private *priv = usb_get_serial_port_data(port);
136 struct usb_serial *serial = port->serial;
137 struct urb *urb;
138 char *buffer = NULL;
139 int i;
140 int result = 0;
141
142 dbg("%s - port %d", __func__, port->number);
143
144 /* initialize our private data structure if it isn't already created */
145 if (!priv) {
146 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
147 if (!priv) {
148 result = -ENOMEM;
149 goto out;
150 }
151 spin_lock_init(&priv->lock);
152 usb_set_serial_port_data(port, priv);
153 }
154
155 /* Set some sane defaults */
156 priv->rts_state = 1;
157 priv->dtr_state = 1;
158
159 for (i = 0; i < NUM_READ_URBS; ++i) {
160 buffer = kmalloc(buffer_size, GFP_KERNEL);
161 if (!buffer) {
162 dev_err(&port->dev, "%s - out of memory.\n",
163 __func__);
164 result = -ENOMEM;
165 goto errout;
166 }
167 urb = usb_alloc_urb(0, GFP_KERNEL);
168 if (!urb) {
169 kfree(buffer);
170 dev_err(&port->dev, "%s - no more urbs?\n",
171 __func__);
172 result = -ENOMEM;
173 goto errout;
174 }
175 usb_fill_bulk_urb(urb, serial->dev,
176 usb_rcvbulkpipe(serial->dev,
177 port->bulk_out_endpointAddress),
178 buffer, buffer_size,
179 airprime_read_bulk_callback, port);
180 result = usb_submit_urb(urb, GFP_KERNEL);
181 if (result) {
182 usb_free_urb(urb);
183 kfree(buffer);
184 dev_err(&port->dev,
185 "%s - failed submitting read urb %d for port %d, error %d\n",
186 __func__, i, port->number, result);
187 goto errout;
188 }
189 /* remember this urb so we can kill it when the
190 port is closed */
191 priv->read_urbp[i] = urb;
192 }
193
194 airprime_send_setup(port);
195
196 goto out;
197
198 errout:
199 /* some error happened, cancel any submitted urbs and clean up
200 anything that got allocated successfully */
201
202 while (i-- != 0) {
203 urb = priv->read_urbp[i];
204 buffer = urb->transfer_buffer;
205 usb_kill_urb(urb);
206 usb_free_urb(urb);
207 kfree(buffer);
208 }
209
210 out:
211 return result;
212}
213
214static void airprime_close(struct usb_serial_port *port, struct file *filp)
215{
216 struct airprime_private *priv = usb_get_serial_port_data(port);
217 int i;
218
219 dbg("%s - port %d", __func__, port->number);
220
221 priv->rts_state = 0;
222 priv->dtr_state = 0;
223
224 mutex_lock(&port->serial->disc_mutex);
225 if (!port->serial->disconnected)
226 airprime_send_setup(port);
227 mutex_unlock(&port->serial->disc_mutex);
228
229 for (i = 0; i < NUM_READ_URBS; ++i) {
230 usb_kill_urb(priv->read_urbp[i]);
231 kfree(priv->read_urbp[i]->transfer_buffer);
232 usb_free_urb(priv->read_urbp[i]);
233 }
234
235 /* free up private structure */
236 kfree(priv);
237 usb_set_serial_port_data(port, NULL);
238}
239
240static int airprime_write(struct usb_serial_port *port,
241 const unsigned char *buf, int count)
242{
243 struct airprime_private *priv = usb_get_serial_port_data(port);
244 struct usb_serial *serial = port->serial;
245 struct urb *urb;
246 unsigned char *buffer;
247 unsigned long flags;
248 int status;
249 dbg("%s - port %d", __func__, port->number);
250
251 spin_lock_irqsave(&priv->lock, flags);
252 if (priv->outstanding_urbs > NUM_WRITE_URBS) {
253 spin_unlock_irqrestore(&priv->lock, flags);
254 dbg("%s - write limit hit\n", __func__);
255 return 0;
256 }
257 spin_unlock_irqrestore(&priv->lock, flags);
258 buffer = kmalloc(count, GFP_ATOMIC);
259 if (!buffer) {
260 dev_err(&port->dev, "out of memory\n");
261 return -ENOMEM;
262 }
263 urb = usb_alloc_urb(0, GFP_ATOMIC);
264 if (!urb) {
265 dev_err(&port->dev, "no more free urbs\n");
266 kfree(buffer);
267 return -ENOMEM;
268 }
269 memcpy(buffer, buf, count);
270
271 usb_serial_debug_data(debug, &port->dev, __func__, count, buffer);
272
273 usb_fill_bulk_urb(urb, serial->dev,
274 usb_sndbulkpipe(serial->dev,
275 port->bulk_out_endpointAddress),
276 buffer, count,
277 airprime_write_bulk_callback, port);
278
279 /* send it down the pipe */
280 status = usb_submit_urb(urb, GFP_ATOMIC);
281 if (status) {
282 dev_err(&port->dev,
283 "%s - usb_submit_urb(write bulk) failed with status = %d\n",
284 __func__, status);
285 count = status;
286 kfree(buffer);
287 } else {
288 spin_lock_irqsave(&priv->lock, flags);
289 ++priv->outstanding_urbs;
290 spin_unlock_irqrestore(&priv->lock, flags);
291 }
292 /* we are done with this urb, so let the host driver
293 * really free it when it is finished with it */
294 usb_free_urb(urb);
295 return count;
296}
297
298static struct usb_driver airprime_driver = {
299 .name = "airprime",
300 .probe = usb_serial_probe,
301 .disconnect = usb_serial_disconnect,
302 .id_table = id_table,
303 .no_dynamic_id = 1,
304};
305
306static struct usb_serial_driver airprime_device = {
307 .driver = {
308 .owner = THIS_MODULE,
309 .name = "airprime",
310 },
311 .usb_driver = &airprime_driver,
312 .id_table = id_table,
313 .open = airprime_open,
314 .close = airprime_close,
315 .write = airprime_write,
316};
317
318static int __init airprime_init(void)
319{
320 int retval;
321
322 airprime_device.num_ports = endpoints;
323 if (endpoints < 0 || endpoints >= MAX_BULK_EPS)
324 airprime_device.num_ports = NUM_BULK_EPS;
325
326 retval = usb_serial_register(&airprime_device);
327 if (retval)
328 return retval;
329 retval = usb_register(&airprime_driver);
330 if (retval)
331 usb_serial_deregister(&airprime_device);
332 return retval;
333}
334
335static void __exit airprime_exit(void)
336{
337 dbg("%s", __func__);
338
339 usb_deregister(&airprime_driver);
340 usb_serial_deregister(&airprime_device);
341}
342
343module_init(airprime_init);
344module_exit(airprime_exit);
345MODULE_LICENSE("GPL");
346
347module_param(debug, bool, S_IRUGO | S_IWUSR);
348MODULE_PARM_DESC(debug, "Debug enabled");
349module_param(buffer_size, int, 0);
350MODULE_PARM_DESC(buffer_size,
351 "Size of the transfer buffers in bytes (default 4096)");
352module_param(endpoints, int, 0);
353MODULE_PARM_DESC(endpoints, "Number of bulk EPs to configure (default 3)");
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
index 77895c8f8f31..aec61880f36c 100644
--- a/drivers/usb/serial/ark3116.c
+++ b/drivers/usb/serial/ark3116.c
@@ -158,12 +158,13 @@ cleanup:
158 return -ENOMEM; 158 return -ENOMEM;
159} 159}
160 160
161static void ark3116_set_termios(struct usb_serial_port *port, 161static void ark3116_set_termios(struct tty_struct *tty,
162 struct usb_serial_port *port,
162 struct ktermios *old_termios) 163 struct ktermios *old_termios)
163{ 164{
164 struct usb_serial *serial = port->serial; 165 struct usb_serial *serial = port->serial;
165 struct ark3116_private *priv = usb_get_serial_port_data(port); 166 struct ark3116_private *priv = usb_get_serial_port_data(port);
166 struct ktermios *termios = port->tty->termios; 167 struct ktermios *termios = tty->termios;
167 unsigned int cflag = termios->c_cflag; 168 unsigned int cflag = termios->c_cflag;
168 unsigned long flags; 169 unsigned long flags;
169 int baud; 170 int baud;
@@ -177,8 +178,8 @@ static void ark3116_set_termios(struct usb_serial_port *port,
177 178
178 spin_lock_irqsave(&priv->lock, flags); 179 spin_lock_irqsave(&priv->lock, flags);
179 if (!priv->termios_initialized) { 180 if (!priv->termios_initialized) {
180 *(port->tty->termios) = tty_std_termios; 181 *termios = tty_std_termios;
181 port->tty->termios->c_cflag = B9600 | CS8 182 termios->c_cflag = B9600 | CS8
182 | CREAD | HUPCL | CLOCAL; 183 | CREAD | HUPCL | CLOCAL;
183 termios->c_ispeed = 9600; 184 termios->c_ispeed = 9600;
184 termios->c_ospeed = 9600; 185 termios->c_ospeed = 9600;
@@ -192,7 +193,7 @@ static void ark3116_set_termios(struct usb_serial_port *port,
192 buf = kmalloc(1, GFP_KERNEL); 193 buf = kmalloc(1, GFP_KERNEL);
193 if (!buf) { 194 if (!buf) {
194 dbg("error kmalloc"); 195 dbg("error kmalloc");
195 *port->tty->termios = *old_termios; 196 *termios = *old_termios;
196 return; 197 return;
197 } 198 }
198 199
@@ -243,7 +244,7 @@ static void ark3116_set_termios(struct usb_serial_port *port,
243 } 244 }
244 245
245 /* set baudrate */ 246 /* set baudrate */
246 baud = tty_get_baud_rate(port->tty); 247 baud = tty_get_baud_rate(tty);
247 248
248 switch (baud) { 249 switch (baud) {
249 case 75: 250 case 75:
@@ -262,11 +263,11 @@ static void ark3116_set_termios(struct usb_serial_port *port,
262 case 230400: 263 case 230400:
263 case 460800: 264 case 460800:
264 /* Report the resulting rate back to the caller */ 265 /* Report the resulting rate back to the caller */
265 tty_encode_baud_rate(port->tty, baud, baud); 266 tty_encode_baud_rate(tty, baud, baud);
266 break; 267 break;
267 /* set 9600 as default (if given baudrate is invalid for example) */ 268 /* set 9600 as default (if given baudrate is invalid for example) */
268 default: 269 default:
269 tty_encode_baud_rate(port->tty, 9600, 9600); 270 tty_encode_baud_rate(tty, 9600, 9600);
270 case 0: 271 case 0:
271 baud = 9600; 272 baud = 9600;
272 } 273 }
@@ -317,7 +318,8 @@ static void ark3116_set_termios(struct usb_serial_port *port,
317 return; 318 return;
318} 319}
319 320
320static int ark3116_open(struct usb_serial_port *port, struct file *filp) 321static int ark3116_open(struct tty_struct *tty, struct usb_serial_port *port,
322 struct file *filp)
321{ 323{
322 struct ktermios tmp_termios; 324 struct ktermios tmp_termios;
323 struct usb_serial *serial = port->serial; 325 struct usb_serial *serial = port->serial;
@@ -332,7 +334,7 @@ static int ark3116_open(struct usb_serial_port *port, struct file *filp)
332 return -ENOMEM; 334 return -ENOMEM;
333 } 335 }
334 336
335 result = usb_serial_generic_open(port, filp); 337 result = usb_serial_generic_open(tty, port, filp);
336 if (result) 338 if (result)
337 goto err_out; 339 goto err_out;
338 340
@@ -362,8 +364,8 @@ static int ark3116_open(struct usb_serial_port *port, struct file *filp)
362 ARK3116_RCV(serial, 124, 0xFE, 0xC0, 0x0000, 0x0006, 0xFF, buf); 364 ARK3116_RCV(serial, 124, 0xFE, 0xC0, 0x0000, 0x0006, 0xFF, buf);
363 365
364 /* initialise termios */ 366 /* initialise termios */
365 if (port->tty) 367 if (tty)
366 ark3116_set_termios(port, &tmp_termios); 368 ark3116_set_termios(tty, port, &tmp_termios);
367 369
368err_out: 370err_out:
369 kfree(buf); 371 kfree(buf);
@@ -371,9 +373,10 @@ err_out:
371 return result; 373 return result;
372} 374}
373 375
374static int ark3116_ioctl(struct usb_serial_port *port, struct file *file, 376static int ark3116_ioctl(struct tty_struct *tty, struct file *file,
375 unsigned int cmd, unsigned long arg) 377 unsigned int cmd, unsigned long arg)
376{ 378{
379 struct usb_serial_port *port = tty->driver_data;
377 struct serial_struct serstruct; 380 struct serial_struct serstruct;
378 void __user *user_arg = (void __user *)arg; 381 void __user *user_arg = (void __user *)arg;
379 382
@@ -403,8 +406,9 @@ static int ark3116_ioctl(struct usb_serial_port *port, struct file *file,
403 return -ENOIOCTLCMD; 406 return -ENOIOCTLCMD;
404} 407}
405 408
406static int ark3116_tiocmget(struct usb_serial_port *port, struct file *file) 409static int ark3116_tiocmget(struct tty_struct *tty, struct file *file)
407{ 410{
411 struct usb_serial_port *port = tty->driver_data;
408 struct usb_serial *serial = port->serial; 412 struct usb_serial *serial = port->serial;
409 char *buf; 413 char *buf;
410 char temp; 414 char temp;
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
index 0a322fc53d6e..2ebe06c3405a 100644
--- a/drivers/usb/serial/belkin_sa.c
+++ b/drivers/usb/serial/belkin_sa.c
@@ -7,13 +7,14 @@
7 * This program is largely derived from work by the linux-usb group 7 * This program is largely derived from work by the linux-usb group
8 * and associated source files. Please see the usb/serial files for 8 * and associated source files. Please see the usb/serial files for
9 * individual credits and copyrights. 9 * individual credits and copyrights.
10 * 10 *
11 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by 12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or 13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version. 14 * (at your option) any later version.
15 * 15 *
16 * See Documentation/usb/usb-serial.txt for more information on using this driver 16 * See Documentation/usb/usb-serial.txt for more information on using this
17 * driver
17 * 18 *
18 * TODO: 19 * TODO:
19 * -- Add true modem contol line query capability. Currently we track the 20 * -- Add true modem contol line query capability. Currently we track the
@@ -28,7 +29,8 @@
28 * compressed all the differnent device entries into 1. 29 * compressed all the differnent device entries into 1.
29 * 30 *
30 * 30-May-2001 gkh 31 * 30-May-2001 gkh
31 * switched from using spinlock to a semaphore, which fixes lots of problems. 32 * switched from using spinlock to a semaphore, which fixes lots of
33 * problems.
32 * 34 *
33 * 08-Apr-2001 gb 35 * 08-Apr-2001 gb
34 * - Identify version on module load. 36 * - Identify version on module load.
@@ -41,7 +43,7 @@
41 * - Added support for the old Belkin and Peracom devices. 43 * - Added support for the old Belkin and Peracom devices.
42 * - Made the port able to be opened multiple times. 44 * - Made the port able to be opened multiple times.
43 * - Added some defaults incase the line settings are things these devices 45 * - Added some defaults incase the line settings are things these devices
44 * can't support. 46 * can't support.
45 * 47 *
46 * 18-Oct-2000 William Greathouse 48 * 18-Oct-2000 William Greathouse
47 * Released into the wild (linux-usb-devel) 49 * Released into the wild (linux-usb-devel)
@@ -72,7 +74,7 @@
72#include <linux/tty_flip.h> 74#include <linux/tty_flip.h>
73#include <linux/module.h> 75#include <linux/module.h>
74#include <linux/spinlock.h> 76#include <linux/spinlock.h>
75#include <asm/uaccess.h> 77#include <linux/uaccess.h>
76#include <linux/usb.h> 78#include <linux/usb.h>
77#include <linux/usb/serial.h> 79#include <linux/usb/serial.h>
78#include "belkin_sa.h" 80#include "belkin_sa.h"
@@ -87,16 +89,19 @@ static int debug;
87#define DRIVER_DESC "USB Belkin Serial converter driver" 89#define DRIVER_DESC "USB Belkin Serial converter driver"
88 90
89/* function prototypes for a Belkin USB Serial Adapter F5U103 */ 91/* function prototypes for a Belkin USB Serial Adapter F5U103 */
90static int belkin_sa_startup (struct usb_serial *serial); 92static int belkin_sa_startup(struct usb_serial *serial);
91static void belkin_sa_shutdown (struct usb_serial *serial); 93static void belkin_sa_shutdown(struct usb_serial *serial);
92static int belkin_sa_open (struct usb_serial_port *port, struct file *filp); 94static int belkin_sa_open(struct tty_struct *tty,
93static void belkin_sa_close (struct usb_serial_port *port, struct file *filp); 95 struct usb_serial_port *port, struct file *filp);
94static void belkin_sa_read_int_callback (struct urb *urb); 96static void belkin_sa_close(struct tty_struct *tty,
95static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios * old); 97 struct usb_serial_port *port, struct file *filp);
96static int belkin_sa_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); 98static void belkin_sa_read_int_callback(struct urb *urb);
97static void belkin_sa_break_ctl (struct usb_serial_port *port, int break_state ); 99static void belkin_sa_set_termios(struct tty_struct *tty,
98static int belkin_sa_tiocmget (struct usb_serial_port *port, struct file *file); 100 struct usb_serial_port *port, struct ktermios * old);
99static int belkin_sa_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); 101static void belkin_sa_break_ctl(struct tty_struct *tty, int break_state);
102static int belkin_sa_tiocmget(struct tty_struct *tty, struct file *file);
103static int belkin_sa_tiocmset(struct tty_struct *tty, struct file *file,
104 unsigned int set, unsigned int clear);
100 105
101 106
102static struct usb_device_id id_table_combined [] = { 107static struct usb_device_id id_table_combined [] = {
@@ -106,10 +111,10 @@ static struct usb_device_id id_table_combined [] = {
106 { USB_DEVICE(GOHUBS_VID, GOHUBS_PID) }, 111 { USB_DEVICE(GOHUBS_VID, GOHUBS_PID) },
107 { USB_DEVICE(GOHUBS_VID, HANDYLINK_PID) }, 112 { USB_DEVICE(GOHUBS_VID, HANDYLINK_PID) },
108 { USB_DEVICE(BELKIN_DOCKSTATION_VID, BELKIN_DOCKSTATION_PID) }, 113 { USB_DEVICE(BELKIN_DOCKSTATION_VID, BELKIN_DOCKSTATION_PID) },
109 { } /* Terminating entry */ 114 { } /* Terminating entry */
110}; 115};
111 116
112MODULE_DEVICE_TABLE (usb, id_table_combined); 117MODULE_DEVICE_TABLE(usb, id_table_combined);
113 118
114static struct usb_driver belkin_driver = { 119static struct usb_driver belkin_driver = {
115 .name = "belkin", 120 .name = "belkin",
@@ -131,8 +136,8 @@ static struct usb_serial_driver belkin_device = {
131 .num_ports = 1, 136 .num_ports = 1,
132 .open = belkin_sa_open, 137 .open = belkin_sa_open,
133 .close = belkin_sa_close, 138 .close = belkin_sa_close,
134 .read_int_callback = belkin_sa_read_int_callback, /* How we get the status info */ 139 .read_int_callback = belkin_sa_read_int_callback,
135 .ioctl = belkin_sa_ioctl, 140 /* How we get the status info */
136 .set_termios = belkin_sa_set_termios, 141 .set_termios = belkin_sa_set_termios,
137 .break_ctl = belkin_sa_break_ctl, 142 .break_ctl = belkin_sa_break_ctl,
138 .tiocmget = belkin_sa_tiocmget, 143 .tiocmget = belkin_sa_tiocmget,
@@ -160,12 +165,12 @@ struct belkin_sa_private {
160#define WDR_TIMEOUT 5000 /* default urb timeout */ 165#define WDR_TIMEOUT 5000 /* default urb timeout */
161 166
162/* assumes that struct usb_serial *serial is available */ 167/* assumes that struct usb_serial *serial is available */
163#define BSA_USB_CMD(c,v) usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), \ 168#define BSA_USB_CMD(c, v) usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), \
164 (c), BELKIN_SA_SET_REQUEST_TYPE, \ 169 (c), BELKIN_SA_SET_REQUEST_TYPE, \
165 (v), 0, NULL, 0, WDR_TIMEOUT) 170 (v), 0, NULL, 0, WDR_TIMEOUT)
166 171
167/* do some startup allocations not currently performed by usb_serial_probe() */ 172/* do some startup allocations not currently performed by usb_serial_probe() */
168static int belkin_sa_startup (struct usb_serial *serial) 173static int belkin_sa_startup(struct usb_serial *serial)
169{ 174{
170 struct usb_device *dev = serial->dev; 175 struct usb_device *dev = serial->dev;
171 struct belkin_sa_private *priv; 176 struct belkin_sa_private *priv;
@@ -173,32 +178,35 @@ static int belkin_sa_startup (struct usb_serial *serial)
173 /* allocate the private data structure */ 178 /* allocate the private data structure */
174 priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL); 179 priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL);
175 if (!priv) 180 if (!priv)
176 return (-1); /* error */ 181 return -1; /* error */
177 /* set initial values for control structures */ 182 /* set initial values for control structures */
178 spin_lock_init(&priv->lock); 183 spin_lock_init(&priv->lock);
179 priv->control_state = 0; 184 priv->control_state = 0;
180 priv->last_lsr = 0; 185 priv->last_lsr = 0;
181 priv->last_msr = 0; 186 priv->last_msr = 0;
182 /* see comments at top of file */ 187 /* see comments at top of file */
183 priv->bad_flow_control = (le16_to_cpu(dev->descriptor.bcdDevice) <= 0x0206) ? 1 : 0; 188 priv->bad_flow_control =
184 info("bcdDevice: %04x, bfc: %d", le16_to_cpu(dev->descriptor.bcdDevice), priv->bad_flow_control); 189 (le16_to_cpu(dev->descriptor.bcdDevice) <= 0x0206) ? 1 : 0;
190 info("bcdDevice: %04x, bfc: %d",
191 le16_to_cpu(dev->descriptor.bcdDevice),
192 priv->bad_flow_control);
185 193
186 init_waitqueue_head(&serial->port[0]->write_wait); 194 init_waitqueue_head(&serial->port[0]->write_wait);
187 usb_set_serial_port_data(serial->port[0], priv); 195 usb_set_serial_port_data(serial->port[0], priv);
188 196
189 return (0); 197 return 0;
190} 198}
191 199
192 200
193static void belkin_sa_shutdown (struct usb_serial *serial) 201static void belkin_sa_shutdown(struct usb_serial *serial)
194{ 202{
195 struct belkin_sa_private *priv; 203 struct belkin_sa_private *priv;
196 int i; 204 int i;
197 205
198 dbg ("%s", __func__); 206 dbg("%s", __func__);
199 207
200 /* stop reads and writes on all ports */ 208 /* stop reads and writes on all ports */
201 for (i=0; i < serial->num_ports; ++i) { 209 for (i = 0; i < serial->num_ports; ++i) {
202 /* My special items, the standard routines free my urbs */ 210 /* My special items, the standard routines free my urbs */
203 priv = usb_get_serial_port_data(serial->port[i]); 211 priv = usb_get_serial_port_data(serial->port[i]);
204 kfree(priv); 212 kfree(priv);
@@ -206,7 +214,8 @@ static void belkin_sa_shutdown (struct usb_serial *serial)
206} 214}
207 215
208 216
209static int belkin_sa_open (struct usb_serial_port *port, struct file *filp) 217static int belkin_sa_open(struct tty_struct *tty,
218 struct usb_serial_port *port, struct file *filp)
210{ 219{
211 int retval = 0; 220 int retval = 0;
212 221
@@ -235,7 +244,8 @@ exit:
235} /* belkin_sa_open */ 244} /* belkin_sa_open */
236 245
237 246
238static void belkin_sa_close (struct usb_serial_port *port, struct file *filp) 247static void belkin_sa_close(struct tty_struct *tty,
248 struct usb_serial_port *port, struct file *filp)
239{ 249{
240 dbg("%s port %d", __func__, port->number); 250 dbg("%s port %d", __func__, port->number);
241 251
@@ -246,7 +256,7 @@ static void belkin_sa_close (struct usb_serial_port *port, struct file *filp)
246} /* belkin_sa_close */ 256} /* belkin_sa_close */
247 257
248 258
249static void belkin_sa_read_int_callback (struct urb *urb) 259static void belkin_sa_read_int_callback(struct urb *urb)
250{ 260{
251 struct usb_serial_port *port = urb->context; 261 struct usb_serial_port *port = urb->context;
252 struct belkin_sa_private *priv; 262 struct belkin_sa_private *priv;
@@ -272,7 +282,8 @@ static void belkin_sa_read_int_callback (struct urb *urb)
272 goto exit; 282 goto exit;
273 } 283 }
274 284
275 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 285 usb_serial_debug_data(debug, &port->dev, __func__,
286 urb->actual_length, data);
276 287
277 /* Handle known interrupt data */ 288 /* Handle known interrupt data */
278 /* ignore data[0] and data[1] */ 289 /* ignore data[0] and data[1] */
@@ -280,7 +291,7 @@ static void belkin_sa_read_int_callback (struct urb *urb)
280 priv = usb_get_serial_port_data(port); 291 priv = usb_get_serial_port_data(port);
281 spin_lock_irqsave(&priv->lock, flags); 292 spin_lock_irqsave(&priv->lock, flags);
282 priv->last_msr = data[BELKIN_SA_MSR_INDEX]; 293 priv->last_msr = data[BELKIN_SA_MSR_INDEX];
283 294
284 /* Record Control Line states */ 295 /* Record Control Line states */
285 if (priv->last_msr & BELKIN_SA_MSR_DSR) 296 if (priv->last_msr & BELKIN_SA_MSR_DSR)
286 priv->control_state |= TIOCM_DSR; 297 priv->control_state |= TIOCM_DSR;
@@ -311,7 +322,7 @@ static void belkin_sa_read_int_callback (struct urb *urb)
311 * to look in to this before committing any code. 322 * to look in to this before committing any code.
312 */ 323 */
313 if (priv->last_lsr & BELKIN_SA_LSR_ERR) { 324 if (priv->last_lsr & BELKIN_SA_LSR_ERR) {
314 tty = port->tty; 325 tty = port->port.tty;
315 /* Overrun Error */ 326 /* Overrun Error */
316 if (priv->last_lsr & BELKIN_SA_LSR_OE) { 327 if (priv->last_lsr & BELKIN_SA_LSR_OE) {
317 } 328 }
@@ -328,13 +339,14 @@ static void belkin_sa_read_int_callback (struct urb *urb)
328#endif 339#endif
329 spin_unlock_irqrestore(&priv->lock, flags); 340 spin_unlock_irqrestore(&priv->lock, flags);
330exit: 341exit:
331 retval = usb_submit_urb (urb, GFP_ATOMIC); 342 retval = usb_submit_urb(urb, GFP_ATOMIC);
332 if (retval) 343 if (retval)
333 err ("%s - usb_submit_urb failed with result %d", 344 err("%s - usb_submit_urb failed with result %d",
334 __func__, retval); 345 __func__, retval);
335} 346}
336 347
337static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 348static void belkin_sa_set_termios(struct tty_struct *tty,
349 struct usb_serial_port *port, struct ktermios *old_termios)
338{ 350{
339 struct usb_serial *serial = port->serial; 351 struct usb_serial *serial = port->serial;
340 struct belkin_sa_private *priv = usb_get_serial_port_data(port); 352 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
@@ -347,8 +359,8 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
347 unsigned long control_state; 359 unsigned long control_state;
348 int bad_flow_control; 360 int bad_flow_control;
349 speed_t baud; 361 speed_t baud;
350 struct ktermios *termios = port->tty->termios; 362 struct ktermios *termios = tty->termios;
351 363
352 iflag = termios->c_iflag; 364 iflag = termios->c_iflag;
353 cflag = termios->c_cflag; 365 cflag = termios->c_cflag;
354 366
@@ -359,25 +371,26 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
359 control_state = priv->control_state; 371 control_state = priv->control_state;
360 bad_flow_control = priv->bad_flow_control; 372 bad_flow_control = priv->bad_flow_control;
361 spin_unlock_irqrestore(&priv->lock, flags); 373 spin_unlock_irqrestore(&priv->lock, flags);
362 374
363 old_iflag = old_termios->c_iflag; 375 old_iflag = old_termios->c_iflag;
364 old_cflag = old_termios->c_cflag; 376 old_cflag = old_termios->c_cflag;
365 377
366 /* Set the baud rate */ 378 /* Set the baud rate */
367 if ((cflag & CBAUD) != (old_cflag & CBAUD)) { 379 if ((cflag & CBAUD) != (old_cflag & CBAUD)) {
368 /* reassert DTR and (maybe) RTS on transition from B0 */ 380 /* reassert DTR and (maybe) RTS on transition from B0 */
369 if( (old_cflag&CBAUD) == B0 ) { 381 if ((old_cflag & CBAUD) == B0) {
370 control_state |= (TIOCM_DTR|TIOCM_RTS); 382 control_state |= (TIOCM_DTR|TIOCM_RTS);
371 if (BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, 1) < 0) 383 if (BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, 1) < 0)
372 err("Set DTR error"); 384 err("Set DTR error");
373 /* don't set RTS if using hardware flow control */ 385 /* don't set RTS if using hardware flow control */
374 if (!(old_cflag & CRTSCTS)) 386 if (!(old_cflag & CRTSCTS))
375 if (BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, 1) < 0) 387 if (BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST
388 , 1) < 0)
376 err("Set RTS error"); 389 err("Set RTS error");
377 } 390 }
378 } 391 }
379 392
380 baud = tty_get_baud_rate(port->tty); 393 baud = tty_get_baud_rate(tty);
381 if (baud) { 394 if (baud) {
382 urb_value = BELKIN_SA_BAUD(baud); 395 urb_value = BELKIN_SA_BAUD(baud);
383 /* Clip to maximum speed */ 396 /* Clip to maximum speed */
@@ -387,12 +400,13 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
387 baud = BELKIN_SA_BAUD(urb_value); 400 baud = BELKIN_SA_BAUD(urb_value);
388 401
389 /* Report the actual baud rate back to the caller */ 402 /* Report the actual baud rate back to the caller */
390 tty_encode_baud_rate(port->tty, baud, baud); 403 tty_encode_baud_rate(tty, baud, baud);
391 if (BSA_USB_CMD(BELKIN_SA_SET_BAUDRATE_REQUEST, urb_value) < 0) 404 if (BSA_USB_CMD(BELKIN_SA_SET_BAUDRATE_REQUEST, urb_value) < 0)
392 err("Set baudrate error"); 405 err("Set baudrate error");
393 } else { 406 } else {
394 /* Disable flow control */ 407 /* Disable flow control */
395 if (BSA_USB_CMD(BELKIN_SA_SET_FLOW_CTRL_REQUEST, BELKIN_SA_FLOW_NONE) < 0) 408 if (BSA_USB_CMD(BELKIN_SA_SET_FLOW_CTRL_REQUEST,
409 BELKIN_SA_FLOW_NONE) < 0)
396 err("Disable flowcontrol error"); 410 err("Disable flowcontrol error");
397 /* Drop RTS and DTR */ 411 /* Drop RTS and DTR */
398 control_state &= ~(TIOCM_DTR | TIOCM_RTS); 412 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
@@ -403,9 +417,10 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
403 } 417 }
404 418
405 /* set the parity */ 419 /* set the parity */
406 if( (cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD)) ) { 420 if ((cflag ^ old_cflag) & (PARENB | PARODD)) {
407 if (cflag & PARENB) 421 if (cflag & PARENB)
408 urb_value = (cflag & PARODD) ? BELKIN_SA_PARITY_ODD : BELKIN_SA_PARITY_EVEN; 422 urb_value = (cflag & PARODD) ? BELKIN_SA_PARITY_ODD
423 : BELKIN_SA_PARITY_EVEN;
409 else 424 else
410 urb_value = BELKIN_SA_PARITY_NONE; 425 urb_value = BELKIN_SA_PARITY_NONE;
411 if (BSA_USB_CMD(BELKIN_SA_SET_PARITY_REQUEST, urb_value) < 0) 426 if (BSA_USB_CMD(BELKIN_SA_SET_PARITY_REQUEST, urb_value) < 0)
@@ -413,31 +428,40 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
413 } 428 }
414 429
415 /* set the number of data bits */ 430 /* set the number of data bits */
416 if( (cflag&CSIZE) != (old_cflag&CSIZE) ) { 431 if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
417 switch (cflag & CSIZE) { 432 switch (cflag & CSIZE) {
418 case CS5: urb_value = BELKIN_SA_DATA_BITS(5); break; 433 case CS5:
419 case CS6: urb_value = BELKIN_SA_DATA_BITS(6); break; 434 urb_value = BELKIN_SA_DATA_BITS(5);
420 case CS7: urb_value = BELKIN_SA_DATA_BITS(7); break; 435 break;
421 case CS8: urb_value = BELKIN_SA_DATA_BITS(8); break; 436 case CS6:
422 default: dbg("CSIZE was not CS5-CS8, using default of 8"); 437 urb_value = BELKIN_SA_DATA_BITS(6);
423 urb_value = BELKIN_SA_DATA_BITS(8); 438 break;
424 break; 439 case CS7:
440 urb_value = BELKIN_SA_DATA_BITS(7);
441 break;
442 case CS8:
443 urb_value = BELKIN_SA_DATA_BITS(8);
444 break;
445 default: dbg("CSIZE was not CS5-CS8, using default of 8");
446 urb_value = BELKIN_SA_DATA_BITS(8);
447 break;
425 } 448 }
426 if (BSA_USB_CMD(BELKIN_SA_SET_DATA_BITS_REQUEST, urb_value) < 0) 449 if (BSA_USB_CMD(BELKIN_SA_SET_DATA_BITS_REQUEST, urb_value) < 0)
427 err("Set data bits error"); 450 err("Set data bits error");
428 } 451 }
429 452
430 /* set the number of stop bits */ 453 /* set the number of stop bits */
431 if( (cflag&CSTOPB) != (old_cflag&CSTOPB) ) { 454 if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
432 urb_value = (cflag & CSTOPB) ? BELKIN_SA_STOP_BITS(2) : BELKIN_SA_STOP_BITS(1); 455 urb_value = (cflag & CSTOPB) ? BELKIN_SA_STOP_BITS(2)
433 if (BSA_USB_CMD(BELKIN_SA_SET_STOP_BITS_REQUEST, urb_value) < 0) 456 : BELKIN_SA_STOP_BITS(1);
457 if (BSA_USB_CMD(BELKIN_SA_SET_STOP_BITS_REQUEST,
458 urb_value) < 0)
434 err("Set stop bits error"); 459 err("Set stop bits error");
435 } 460 }
436 461
437 /* Set flow control */ 462 /* Set flow control */
438 if( (iflag&IXOFF) != (old_iflag&IXOFF) 463 if (((iflag ^ old_iflag) & (IXOFF | IXON)) ||
439 || (iflag&IXON) != (old_iflag&IXON) 464 ((cflag ^ old_cflag) & CRTSCTS)) {
440 || (cflag&CRTSCTS) != (old_cflag&CRTSCTS) ) {
441 urb_value = 0; 465 urb_value = 0;
442 if ((iflag & IXOFF) || (iflag & IXON)) 466 if ((iflag & IXOFF) || (iflag & IXON))
443 urb_value |= (BELKIN_SA_FLOW_OXON | BELKIN_SA_FLOW_IXON); 467 urb_value |= (BELKIN_SA_FLOW_OXON | BELKIN_SA_FLOW_IXON);
@@ -463,8 +487,9 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
463} /* belkin_sa_set_termios */ 487} /* belkin_sa_set_termios */
464 488
465 489
466static void belkin_sa_break_ctl( struct usb_serial_port *port, int break_state ) 490static void belkin_sa_break_ctl(struct tty_struct *tty, int break_state)
467{ 491{
492 struct usb_serial_port *port = tty->driver_data;
468 struct usb_serial *serial = port->serial; 493 struct usb_serial *serial = port->serial;
469 494
470 if (BSA_USB_CMD(BELKIN_SA_SET_BREAK_REQUEST, break_state ? 1 : 0) < 0) 495 if (BSA_USB_CMD(BELKIN_SA_SET_BREAK_REQUEST, break_state ? 1 : 0) < 0)
@@ -472,12 +497,13 @@ static void belkin_sa_break_ctl( struct usb_serial_port *port, int break_state )
472} 497}
473 498
474 499
475static int belkin_sa_tiocmget (struct usb_serial_port *port, struct file *file) 500static int belkin_sa_tiocmget(struct tty_struct *tty, struct file *file)
476{ 501{
502 struct usb_serial_port *port = tty->driver_data;
477 struct belkin_sa_private *priv = usb_get_serial_port_data(port); 503 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
478 unsigned long control_state; 504 unsigned long control_state;
479 unsigned long flags; 505 unsigned long flags;
480 506
481 dbg("%s", __func__); 507 dbg("%s", __func__);
482 508
483 spin_lock_irqsave(&priv->lock, flags); 509 spin_lock_irqsave(&priv->lock, flags);
@@ -488,9 +514,10 @@ static int belkin_sa_tiocmget (struct usb_serial_port *port, struct file *file)
488} 514}
489 515
490 516
491static int belkin_sa_tiocmset (struct usb_serial_port *port, struct file *file, 517static int belkin_sa_tiocmset(struct tty_struct *tty, struct file *file,
492 unsigned int set, unsigned int clear) 518 unsigned int set, unsigned int clear)
493{ 519{
520 struct usb_serial_port *port = tty->driver_data;
494 struct usb_serial *serial = port->serial; 521 struct usb_serial *serial = port->serial;
495 struct belkin_sa_private *priv = usb_get_serial_port_data(port); 522 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
496 unsigned long control_state; 523 unsigned long control_state;
@@ -498,7 +525,7 @@ static int belkin_sa_tiocmset (struct usb_serial_port *port, struct file *file,
498 int retval; 525 int retval;
499 int rts = 0; 526 int rts = 0;
500 int dtr = 0; 527 int dtr = 0;
501 528
502 dbg("%s", __func__); 529 dbg("%s", __func__);
503 530
504 spin_lock_irqsave(&priv->lock, flags); 531 spin_lock_irqsave(&priv->lock, flags);
@@ -540,29 +567,7 @@ exit:
540} 567}
541 568
542 569
543static int belkin_sa_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) 570static int __init belkin_sa_init(void)
544{
545 switch (cmd) {
546 case TIOCMIWAIT:
547 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
548 /* TODO */
549 return( 0 );
550
551 case TIOCGICOUNT:
552 /* return count of modemline transitions */
553 /* TODO */
554 return 0;
555
556 default:
557 dbg("belkin_sa_ioctl arg not supported - 0x%04x",cmd);
558 return(-ENOIOCTLCMD);
559 break;
560 }
561 return 0;
562} /* belkin_sa_ioctl */
563
564
565static int __init belkin_sa_init (void)
566{ 571{
567 int retval; 572 int retval;
568 retval = usb_serial_register(&belkin_device); 573 retval = usb_serial_register(&belkin_device);
@@ -582,17 +587,17 @@ failed_usb_serial_register:
582 587
583static void __exit belkin_sa_exit (void) 588static void __exit belkin_sa_exit (void)
584{ 589{
585 usb_deregister (&belkin_driver); 590 usb_deregister(&belkin_driver);
586 usb_serial_deregister (&belkin_device); 591 usb_serial_deregister(&belkin_device);
587} 592}
588 593
589 594
590module_init (belkin_sa_init); 595module_init(belkin_sa_init);
591module_exit (belkin_sa_exit); 596module_exit(belkin_sa_exit);
592 597
593MODULE_AUTHOR( DRIVER_AUTHOR ); 598MODULE_AUTHOR(DRIVER_AUTHOR);
594MODULE_DESCRIPTION( DRIVER_DESC ); 599MODULE_DESCRIPTION(DRIVER_DESC);
595MODULE_VERSION( DRIVER_VERSION ); 600MODULE_VERSION(DRIVER_VERSION);
596MODULE_LICENSE("GPL"); 601MODULE_LICENSE("GPL");
597 602
598module_param(debug, bool, S_IRUGO | S_IWUSR); 603module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/belkin_sa.h b/drivers/usb/serial/belkin_sa.h
index 9116b92f4622..c66a6730d38c 100644
--- a/drivers/usb/serial/belkin_sa.h
+++ b/drivers/usb/serial/belkin_sa.h
@@ -7,13 +7,14 @@
7 * This program is largely derived from work by the linux-usb group 7 * This program is largely derived from work by the linux-usb group
8 * and associated source files. Please see the usb/serial files for 8 * and associated source files. Please see the usb/serial files for
9 * individual credits and copyrights. 9 * individual credits and copyrights.
10 * 10 *
11 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by 12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or 13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version. 14 * (at your option) any later version.
15 * 15 *
16 * See Documentation/usb/usb-serial.txt for more information on using this driver 16 * See Documentation/usb/usb-serial.txt for more information on using this
17 * driver
17 * 18 *
18 * 12-Mar-2001 gkh 19 * 12-Mar-2001 gkh
19 * Added GoHubs GO-COM232 device id. 20 * Added GoHubs GO-COM232 device id.
@@ -27,7 +28,7 @@
27 * adapter, so pardon any stupid mistakes. All of the information 28 * adapter, so pardon any stupid mistakes. All of the information
28 * I am using to write this driver was acquired by using a modified 29 * I am using to write this driver was acquired by using a modified
29 * UsbSnoop on Windows2000. 30 * UsbSnoop on Windows2000.
30 * 31 *
31 */ 32 */
32 33
33#ifndef __LINUX_USB_SERIAL_BSA_H 34#ifndef __LINUX_USB_SERIAL_BSA_H
@@ -96,20 +97,20 @@
96 97
97/* 98/*
98 * It seems that the interrupt pipe is closely modelled after the 99 * It seems that the interrupt pipe is closely modelled after the
99 * 16550 register layout. This is probably because the adapter can 100 * 16550 register layout. This is probably because the adapter can
100 * be used in a "DOS" environment to simulate a standard hardware port. 101 * be used in a "DOS" environment to simulate a standard hardware port.
101 */ 102 */
102#define BELKIN_SA_LSR_INDEX 2 /* Line Status Register */ 103#define BELKIN_SA_LSR_INDEX 2 /* Line Status Register */
103#define BELKIN_SA_LSR_RDR 0x01 /* receive data ready */ 104#define BELKIN_SA_LSR_RDR 0x01 /* receive data ready */
104#define BELKIN_SA_LSR_OE 0x02 /* overrun error */ 105#define BELKIN_SA_LSR_OE 0x02 /* overrun error */
105#define BELKIN_SA_LSR_PE 0x04 /* parity error */ 106#define BELKIN_SA_LSR_PE 0x04 /* parity error */
106#define BELKIN_SA_LSR_FE 0x08 /* framing error */ 107#define BELKIN_SA_LSR_FE 0x08 /* framing error */
107#define BELKIN_SA_LSR_BI 0x10 /* break indicator */ 108#define BELKIN_SA_LSR_BI 0x10 /* break indicator */
108#define BELKIN_SA_LSR_THE 0x20 /* transmit holding register empty */ 109#define BELKIN_SA_LSR_THE 0x20 /* tx holding register empty */
109#define BELKIN_SA_LSR_TE 0x40 /* transmit register empty */ 110#define BELKIN_SA_LSR_TE 0x40 /* transmit register empty */
110#define BELKIN_SA_LSR_ERR 0x80 /* OE | PE | FE | BI */ 111#define BELKIN_SA_LSR_ERR 0x80 /* OE | PE | FE | BI */
111 112
112#define BELKIN_SA_MSR_INDEX 3 /* Modem Status Register */ 113#define BELKIN_SA_MSR_INDEX 3 /* Modem Status Register */
113#define BELKIN_SA_MSR_DCTS 0x01 /* Delta CTS */ 114#define BELKIN_SA_MSR_DCTS 0x01 /* Delta CTS */
114#define BELKIN_SA_MSR_DDSR 0x02 /* Delta DSR */ 115#define BELKIN_SA_MSR_DDSR 0x02 /* Delta DSR */
115#define BELKIN_SA_MSR_DRI 0x04 /* Delta RI */ 116#define BELKIN_SA_MSR_DRI 0x04 /* Delta RI */
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c
index 0b14aea8ebd5..83bbb5bca2ef 100644
--- a/drivers/usb/serial/bus.c
+++ b/drivers/usb/serial/bus.c
@@ -15,7 +15,8 @@
15#include <linux/usb.h> 15#include <linux/usb.h>
16#include <linux/usb/serial.h> 16#include <linux/usb/serial.h>
17 17
18static int usb_serial_device_match (struct device *dev, struct device_driver *drv) 18static int usb_serial_device_match(struct device *dev,
19 struct device_driver *drv)
19{ 20{
20 struct usb_serial_driver *driver; 21 struct usb_serial_driver *driver;
21 const struct usb_serial_port *port; 22 const struct usb_serial_port *port;
@@ -46,7 +47,7 @@ static ssize_t show_port_number(struct device *dev,
46 47
47static DEVICE_ATTR(port_number, S_IRUGO, show_port_number, NULL); 48static DEVICE_ATTR(port_number, S_IRUGO, show_port_number, NULL);
48 49
49static int usb_serial_device_probe (struct device *dev) 50static int usb_serial_device_probe(struct device *dev)
50{ 51{
51 struct usb_serial_driver *driver; 52 struct usb_serial_driver *driver;
52 struct usb_serial_port *port; 53 struct usb_serial_port *port;
@@ -66,7 +67,7 @@ static int usb_serial_device_probe (struct device *dev)
66 retval = -EIO; 67 retval = -EIO;
67 goto exit; 68 goto exit;
68 } 69 }
69 retval = driver->port_probe (port); 70 retval = driver->port_probe(port);
70 module_put(driver->driver.owner); 71 module_put(driver->driver.owner);
71 if (retval) 72 if (retval)
72 goto exit; 73 goto exit;
@@ -77,8 +78,8 @@ static int usb_serial_device_probe (struct device *dev)
77 goto exit; 78 goto exit;
78 79
79 minor = port->number; 80 minor = port->number;
80 tty_register_device (usb_serial_tty_driver, minor, dev); 81 tty_register_device(usb_serial_tty_driver, minor, dev);
81 dev_info(&port->serial->dev->dev, 82 dev_info(&port->serial->dev->dev,
82 "%s converter now attached to ttyUSB%d\n", 83 "%s converter now attached to ttyUSB%d\n",
83 driver->description, minor); 84 driver->description, minor);
84 85
@@ -86,7 +87,7 @@ exit:
86 return retval; 87 return retval;
87} 88}
88 89
89static int usb_serial_device_remove (struct device *dev) 90static int usb_serial_device_remove(struct device *dev)
90{ 91{
91 struct usb_serial_driver *driver; 92 struct usb_serial_driver *driver;
92 struct usb_serial_port *port; 93 struct usb_serial_port *port;
@@ -94,9 +95,8 @@ static int usb_serial_device_remove (struct device *dev)
94 int minor; 95 int minor;
95 96
96 port = to_usb_serial_port(dev); 97 port = to_usb_serial_port(dev);
97 if (!port) { 98 if (!port)
98 return -ENODEV; 99 return -ENODEV;
99 }
100 100
101 device_remove_file(&port->dev, &dev_attr_port_number); 101 device_remove_file(&port->dev, &dev_attr_port_number);
102 102
@@ -107,12 +107,12 @@ static int usb_serial_device_remove (struct device *dev)
107 retval = -EIO; 107 retval = -EIO;
108 goto exit; 108 goto exit;
109 } 109 }
110 retval = driver->port_remove (port); 110 retval = driver->port_remove(port);
111 module_put(driver->driver.owner); 111 module_put(driver->driver.owner);
112 } 112 }
113exit: 113exit:
114 minor = port->number; 114 minor = port->number;
115 tty_unregister_device (usb_serial_tty_driver, minor); 115 tty_unregister_device(usb_serial_tty_driver, minor);
116 dev_info(dev, "%s converter now disconnected from ttyUSB%d\n", 116 dev_info(dev, "%s converter now disconnected from ttyUSB%d\n",
117 driver->description, minor); 117 driver->description, minor);
118 118
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index 1f7c86bd8297..f61e3ca64305 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -232,7 +232,8 @@ error: kfree(priv);
232} 232}
233 233
234/* open this device, set default parameters */ 234/* open this device, set default parameters */
235static int ch341_open(struct usb_serial_port *port, struct file *filp) 235static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port,
236 struct file *filp)
236{ 237{
237 struct usb_serial *serial = port->serial; 238 struct usb_serial *serial = port->serial;
238 struct ch341_private *priv = usb_get_serial_port_data(serial->port[0]); 239 struct ch341_private *priv = usb_get_serial_port_data(serial->port[0]);
@@ -256,7 +257,7 @@ static int ch341_open(struct usb_serial_port *port, struct file *filp)
256 if (r) 257 if (r)
257 goto out; 258 goto out;
258 259
259 r = usb_serial_generic_open(port, filp); 260 r = usb_serial_generic_open(tty, port, filp);
260 261
261out: return r; 262out: return r;
262} 263}
@@ -264,11 +265,10 @@ out: return r;
264/* Old_termios contains the original termios settings and 265/* Old_termios contains the original termios settings and
265 * tty->termios contains the new setting to be used. 266 * tty->termios contains the new setting to be used.
266 */ 267 */
267static void ch341_set_termios(struct usb_serial_port *port, 268static void ch341_set_termios(struct tty_struct *tty,
268 struct ktermios *old_termios) 269 struct usb_serial_port *port, struct ktermios *old_termios)
269{ 270{
270 struct ch341_private *priv = usb_get_serial_port_data(port); 271 struct ch341_private *priv = usb_get_serial_port_data(port);
271 struct tty_struct *tty = port->tty;
272 unsigned baud_rate; 272 unsigned baud_rate;
273 273
274 dbg("ch341_set_termios()"); 274 dbg("ch341_set_termios()");
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 201184c3fb87..7b74238ad1c7 100644
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
@@ -6,7 +6,7 @@
6 * This program is free software; you can redistribute it and/or 6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version 7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation. 8 * 2 as published by the Free Software Foundation.
9 * 9 *
10 * Thanks to Randy Dunlap for the original version of this code. 10 * Thanks to Randy Dunlap for the original version of this code.
11 * 11 *
12 */ 12 */
@@ -67,7 +67,7 @@ static int usb_console_setup(struct console *co, char *options)
67 struct tty_struct *tty = NULL; 67 struct tty_struct *tty = NULL;
68 struct ktermios *termios = NULL, dummy; 68 struct ktermios *termios = NULL, dummy;
69 69
70 dbg ("%s", __func__); 70 dbg("%s", __func__);
71 71
72 if (options) { 72 if (options) {
73 baud = simple_strtoul(options, NULL, 10); 73 baud = simple_strtoul(options, NULL, 10);
@@ -81,55 +81,27 @@ static int usb_console_setup(struct console *co, char *options)
81 if (*s) 81 if (*s)
82 doflow = (*s++ == 'r'); 82 doflow = (*s++ == 'r');
83 } 83 }
84
85 /* Sane default */
86 if (baud == 0)
87 baud = 9600;
84 88
85 /* build a cflag setting */
86 switch (baud) {
87 case 1200:
88 cflag |= B1200;
89 break;
90 case 2400:
91 cflag |= B2400;
92 break;
93 case 4800:
94 cflag |= B4800;
95 break;
96 case 19200:
97 cflag |= B19200;
98 break;
99 case 38400:
100 cflag |= B38400;
101 break;
102 case 57600:
103 cflag |= B57600;
104 break;
105 case 115200:
106 cflag |= B115200;
107 break;
108 case 9600:
109 default:
110 cflag |= B9600;
111 /*
112 * Set this to a sane value to prevent a divide error
113 */
114 baud = 9600;
115 break;
116 }
117 switch (bits) { 89 switch (bits) {
118 case 7: 90 case 7:
119 cflag |= CS7; 91 cflag |= CS7;
120 break; 92 break;
121 default: 93 default:
122 case 8: 94 case 8:
123 cflag |= CS8; 95 cflag |= CS8;
124 break; 96 break;
125 } 97 }
126 switch (parity) { 98 switch (parity) {
127 case 'o': case 'O': 99 case 'o': case 'O':
128 cflag |= PARODD; 100 cflag |= PARODD;
129 break; 101 break;
130 case 'e': case 'E': 102 case 'e': case 'E':
131 cflag |= PARENB; 103 cflag |= PARENB;
132 break; 104 break;
133 } 105 }
134 co->cflag = cflag; 106 co->cflag = cflag;
135 107
@@ -140,17 +112,17 @@ static int usb_console_setup(struct console *co, char *options)
140 serial = usb_serial_get_by_index(co->index); 112 serial = usb_serial_get_by_index(co->index);
141 if (serial == NULL) { 113 if (serial == NULL) {
142 /* no device is connected yet, sorry :( */ 114 /* no device is connected yet, sorry :( */
143 err ("No USB device connected to ttyUSB%i", co->index); 115 err("No USB device connected to ttyUSB%i", co->index);
144 return -ENODEV; 116 return -ENODEV;
145 } 117 }
146 118
147 port = serial->port[0]; 119 port = serial->port[0];
148 port->tty = NULL; 120 port->port.tty = NULL;
149 121
150 info->port = port; 122 info->port = port;
151 123
152 ++port->open_count; 124 ++port->port.count;
153 if (port->open_count == 1) { 125 if (port->port.count == 1) {
154 if (serial->type->set_termios) { 126 if (serial->type->set_termios) {
155 /* 127 /*
156 * allocate a fake tty so the driver can initialize 128 * allocate a fake tty so the driver can initialize
@@ -171,15 +143,15 @@ static int usb_console_setup(struct console *co, char *options)
171 } 143 }
172 memset(&dummy, 0, sizeof(struct ktermios)); 144 memset(&dummy, 0, sizeof(struct ktermios));
173 tty->termios = termios; 145 tty->termios = termios;
174 port->tty = tty; 146 port->port.tty = tty;
175 } 147 }
176 148
177 /* only call the device specific open if this 149 /* only call the device specific open if this
178 * is the first time the port is opened */ 150 * is the first time the port is opened */
179 if (serial->type->open) 151 if (serial->type->open)
180 retval = serial->type->open(port, NULL); 152 retval = serial->type->open(NULL, port, NULL);
181 else 153 else
182 retval = usb_serial_generic_open(port, NULL); 154 retval = usb_serial_generic_open(NULL, port, NULL);
183 155
184 if (retval) { 156 if (retval) {
185 err("could not open USB console port"); 157 err("could not open USB console port");
@@ -188,9 +160,10 @@ static int usb_console_setup(struct console *co, char *options)
188 160
189 if (serial->type->set_termios) { 161 if (serial->type->set_termios) {
190 termios->c_cflag = cflag; 162 termios->c_cflag = cflag;
191 serial->type->set_termios(port, &dummy); 163 tty_termios_encode_baud_rate(termios, baud, baud);
164 serial->type->set_termios(NULL, port, &dummy);
192 165
193 port->tty = NULL; 166 port->port.tty = NULL;
194 kfree(termios); 167 kfree(termios);
195 kfree(tty); 168 kfree(tty);
196 } 169 }
@@ -203,15 +176,16 @@ out:
203 return retval; 176 return retval;
204free_termios: 177free_termios:
205 kfree(termios); 178 kfree(termios);
206 port->tty = NULL; 179 port->port.tty = NULL;
207free_tty: 180free_tty:
208 kfree(tty); 181 kfree(tty);
209reset_open_count: 182reset_open_count:
210 port->open_count = 0; 183 port->port.count = 0;
211goto out; 184goto out;
212} 185}
213 186
214static void usb_console_write(struct console *co, const char *buf, unsigned count) 187static void usb_console_write(struct console *co,
188 const char *buf, unsigned count)
215{ 189{
216 static struct usbcons_info *info = &usbcons_info; 190 static struct usbcons_info *info = &usbcons_info;
217 struct usb_serial_port *port = info->port; 191 struct usb_serial_port *port = info->port;
@@ -227,8 +201,8 @@ static void usb_console_write(struct console *co, const char *buf, unsigned coun
227 201
228 dbg("%s - port %d, %d byte(s)", __func__, port->number, count); 202 dbg("%s - port %d, %d byte(s)", __func__, port->number, count);
229 203
230 if (!port->open_count) { 204 if (!port->port.count) {
231 dbg ("%s - port not opened", __func__); 205 dbg("%s - port not opened", __func__);
232 return; 206 return;
233 } 207 }
234 208
@@ -236,26 +210,29 @@ static void usb_console_write(struct console *co, const char *buf, unsigned coun
236 unsigned int i; 210 unsigned int i;
237 unsigned int lf; 211 unsigned int lf;
238 /* search for LF so we can insert CR if necessary */ 212 /* search for LF so we can insert CR if necessary */
239 for (i=0, lf=0 ; i < count ; i++) { 213 for (i = 0, lf = 0 ; i < count ; i++) {
240 if (*(buf + i) == 10) { 214 if (*(buf + i) == 10) {
241 lf = 1; 215 lf = 1;
242 i++; 216 i++;
243 break; 217 break;
244 } 218 }
245 } 219 }
246 /* pass on to the driver specific version of this function if it is available */ 220 /* pass on to the driver specific version of this function if
221 it is available */
247 if (serial->type->write) 222 if (serial->type->write)
248 retval = serial->type->write(port, buf, i); 223 retval = serial->type->write(NULL, port, buf, i);
249 else 224 else
250 retval = usb_serial_generic_write(port, buf, i); 225 retval = usb_serial_generic_write(NULL, port, buf, i);
251 dbg("%s - return value : %d", __func__, retval); 226 dbg("%s - return value : %d", __func__, retval);
252 if (lf) { 227 if (lf) {
253 /* append CR after LF */ 228 /* append CR after LF */
254 unsigned char cr = 13; 229 unsigned char cr = 13;
255 if (serial->type->write) 230 if (serial->type->write)
256 retval = serial->type->write(port, &cr, 1); 231 retval = serial->type->write(NULL,
232 port, &cr, 1);
257 else 233 else
258 retval = usb_serial_generic_write(port, &cr, 1); 234 retval = usb_serial_generic_write(NULL,
235 port, &cr, 1);
259 dbg("%s - return value : %d", __func__, retval); 236 dbg("%s - return value : %d", __func__, retval);
260 } 237 }
261 buf += i; 238 buf += i;
@@ -273,18 +250,19 @@ static struct console usbcons = {
273 250
274void usb_serial_console_disconnect(struct usb_serial *serial) 251void usb_serial_console_disconnect(struct usb_serial *serial)
275{ 252{
276 if (serial && serial->port && serial->port[0] && serial->port[0] == usbcons_info.port) { 253 if (serial && serial->port && serial->port[0]
254 && serial->port[0] == usbcons_info.port) {
277 usb_serial_console_exit(); 255 usb_serial_console_exit();
278 usb_serial_put(serial); 256 usb_serial_put(serial);
279 } 257 }
280} 258}
281 259
282void usb_serial_console_init (int serial_debug, int minor) 260void usb_serial_console_init(int serial_debug, int minor)
283{ 261{
284 debug = serial_debug; 262 debug = serial_debug;
285 263
286 if (minor == 0) { 264 if (minor == 0) {
287 /* 265 /*
288 * Call register_console() if this is the first device plugged 266 * Call register_console() if this is the first device plugged
289 * in. If we call it earlier, then the callback to 267 * in. If we call it earlier, then the callback to
290 * console_setup() will fail, as there is not a device seen by 268 * console_setup() will fail, as there is not a device seen by
@@ -293,21 +271,21 @@ void usb_serial_console_init (int serial_debug, int minor)
293 /* 271 /*
294 * Register console. 272 * Register console.
295 * NOTES: 273 * NOTES:
296 * console_setup() is called (back) immediately (from register_console). 274 * console_setup() is called (back) immediately (from
297 * console_write() is called immediately from register_console iff 275 * register_console). console_write() is called immediately
298 * CON_PRINTBUFFER is set in flags. 276 * from register_console iff CON_PRINTBUFFER is set in flags.
299 */ 277 */
300 dbg ("registering the USB serial console."); 278 dbg("registering the USB serial console.");
301 register_console(&usbcons); 279 register_console(&usbcons);
302 } 280 }
303} 281}
304 282
305void usb_serial_console_exit (void) 283void usb_serial_console_exit(void)
306{ 284{
307 if (usbcons_info.port) { 285 if (usbcons_info.port) {
308 unregister_console(&usbcons); 286 unregister_console(&usbcons);
309 if (usbcons_info.port->open_count) 287 if (usbcons_info.port->port.count)
310 usbcons_info.port->open_count--; 288 usbcons_info.port->port.count--;
311 usbcons_info.port = NULL; 289 usbcons_info.port = NULL;
312 } 290 }
313} 291}
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
index f5b57b196c5a..442cba69cce5 100644
--- a/drivers/usb/serial/cp2101.c
+++ b/drivers/usb/serial/cp2101.c
@@ -25,7 +25,7 @@
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/moduleparam.h> 26#include <linux/moduleparam.h>
27#include <linux/usb.h> 27#include <linux/usb.h>
28#include <asm/uaccess.h> 28#include <linux/uaccess.h>
29#include <linux/usb/serial.h> 29#include <linux/usb/serial.h>
30 30
31/* 31/*
@@ -37,17 +37,20 @@
37/* 37/*
38 * Function Prototypes 38 * Function Prototypes
39 */ 39 */
40static int cp2101_open(struct usb_serial_port*, struct file*); 40static int cp2101_open(struct tty_struct *, struct usb_serial_port *,
41static void cp2101_cleanup(struct usb_serial_port*); 41 struct file *);
42static void cp2101_close(struct usb_serial_port*, struct file*); 42static void cp2101_cleanup(struct usb_serial_port *);
43static void cp2101_get_termios(struct usb_serial_port*); 43static void cp2101_close(struct tty_struct *, struct usb_serial_port *,
44static void cp2101_set_termios(struct usb_serial_port*, struct ktermios*); 44 struct file*);
45static int cp2101_tiocmget (struct usb_serial_port *, struct file *); 45static void cp2101_get_termios(struct tty_struct *);
46static int cp2101_tiocmset (struct usb_serial_port *, struct file *, 46static void cp2101_set_termios(struct tty_struct *, struct usb_serial_port *,
47 struct ktermios*);
48static int cp2101_tiocmget(struct tty_struct *, struct file *);
49static int cp2101_tiocmset(struct tty_struct *, struct file *,
47 unsigned int, unsigned int); 50 unsigned int, unsigned int);
48static void cp2101_break_ctl(struct usb_serial_port*, int); 51static void cp2101_break_ctl(struct tty_struct *, int);
49static int cp2101_startup (struct usb_serial *); 52static int cp2101_startup(struct usb_serial *);
50static void cp2101_shutdown(struct usb_serial*); 53static void cp2101_shutdown(struct usb_serial *);
51 54
52 55
53static int debug; 56static int debug;
@@ -93,7 +96,7 @@ static struct usb_device_id id_table [] = {
93 { } /* Terminating Entry */ 96 { } /* Terminating Entry */
94}; 97};
95 98
96MODULE_DEVICE_TABLE (usb, id_table); 99MODULE_DEVICE_TABLE(usb, id_table);
97 100
98static struct usb_driver cp2101_driver = { 101static struct usb_driver cp2101_driver = {
99 .name = "cp2101", 102 .name = "cp2101",
@@ -182,7 +185,7 @@ static struct usb_serial_driver cp2101_device = {
182 * 'data' is a pointer to a pre-allocated array of integers large 185 * 'data' is a pointer to a pre-allocated array of integers large
183 * enough to hold 'size' bytes (with 4 bytes to each integer) 186 * enough to hold 'size' bytes (with 4 bytes to each integer)
184 */ 187 */
185static int cp2101_get_config(struct usb_serial_port* port, u8 request, 188static int cp2101_get_config(struct usb_serial_port *port, u8 request,
186 unsigned int *data, int size) 189 unsigned int *data, int size)
187{ 190{
188 struct usb_serial *serial = port->serial; 191 struct usb_serial *serial = port->serial;
@@ -202,12 +205,12 @@ static int cp2101_get_config(struct usb_serial_port* port, u8 request,
202 request++; 205 request++;
203 206
204 /* Issue the request, attempting to read 'size' bytes */ 207 /* Issue the request, attempting to read 'size' bytes */
205 result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0), 208 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
206 request, REQTYPE_DEVICE_TO_HOST, 0x0000, 209 request, REQTYPE_DEVICE_TO_HOST, 0x0000,
207 0, buf, size, 300); 210 0, buf, size, 300);
208 211
209 /* Convert data into an array of integers */ 212 /* Convert data into an array of integers */
210 for (i=0; i<length; i++) 213 for (i = 0; i < length; i++)
211 data[i] = le32_to_cpu(buf[i]); 214 data[i] = le32_to_cpu(buf[i]);
212 215
213 kfree(buf); 216 kfree(buf);
@@ -228,7 +231,7 @@ static int cp2101_get_config(struct usb_serial_port* port, u8 request,
228 * Values less than 16 bits wide are sent directly 231 * Values less than 16 bits wide are sent directly
229 * 'size' is specified in bytes. 232 * 'size' is specified in bytes.
230 */ 233 */
231static int cp2101_set_config(struct usb_serial_port* port, u8 request, 234static int cp2101_set_config(struct usb_serial_port *port, u8 request,
232 unsigned int *data, int size) 235 unsigned int *data, int size)
233{ 236{
234 struct usb_serial *serial = port->serial; 237 struct usb_serial *serial = port->serial;
@@ -250,12 +253,12 @@ static int cp2101_set_config(struct usb_serial_port* port, u8 request,
250 buf[i] = cpu_to_le32(data[i]); 253 buf[i] = cpu_to_le32(data[i]);
251 254
252 if (size > 2) { 255 if (size > 2) {
253 result = usb_control_msg (serial->dev, 256 result = usb_control_msg(serial->dev,
254 usb_sndctrlpipe(serial->dev, 0), 257 usb_sndctrlpipe(serial->dev, 0),
255 request, REQTYPE_HOST_TO_DEVICE, 0x0000, 258 request, REQTYPE_HOST_TO_DEVICE, 0x0000,
256 0, buf, size, 300); 259 0, buf, size, 300);
257 } else { 260 } else {
258 result = usb_control_msg (serial->dev, 261 result = usb_control_msg(serial->dev,
259 usb_sndctrlpipe(serial->dev, 0), 262 usb_sndctrlpipe(serial->dev, 0),
260 request, REQTYPE_HOST_TO_DEVICE, data[0], 263 request, REQTYPE_HOST_TO_DEVICE, data[0],
261 0, NULL, 0, 300); 264 0, NULL, 0, 300);
@@ -271,7 +274,7 @@ static int cp2101_set_config(struct usb_serial_port* port, u8 request,
271 } 274 }
272 275
273 /* Single data value */ 276 /* Single data value */
274 result = usb_control_msg (serial->dev, 277 result = usb_control_msg(serial->dev,
275 usb_sndctrlpipe(serial->dev, 0), 278 usb_sndctrlpipe(serial->dev, 0),
276 request, REQTYPE_HOST_TO_DEVICE, data[0], 279 request, REQTYPE_HOST_TO_DEVICE, data[0],
277 0, NULL, 0, 300); 280 0, NULL, 0, 300);
@@ -283,13 +286,14 @@ static int cp2101_set_config(struct usb_serial_port* port, u8 request,
283 * Convenience function for calling cp2101_set_config on single data values 286 * Convenience function for calling cp2101_set_config on single data values
284 * without requiring an integer pointer 287 * without requiring an integer pointer
285 */ 288 */
286static inline int cp2101_set_config_single(struct usb_serial_port* port, 289static inline int cp2101_set_config_single(struct usb_serial_port *port,
287 u8 request, unsigned int data) 290 u8 request, unsigned int data)
288{ 291{
289 return cp2101_set_config(port, request, &data, 2); 292 return cp2101_set_config(port, request, &data, 2);
290} 293}
291 294
292static int cp2101_open (struct usb_serial_port *port, struct file *filp) 295static int cp2101_open(struct tty_struct *tty, struct usb_serial_port *port,
296 struct file *filp)
293{ 297{
294 struct usb_serial *serial = port->serial; 298 struct usb_serial *serial = port->serial;
295 int result; 299 int result;
@@ -303,7 +307,7 @@ static int cp2101_open (struct usb_serial_port *port, struct file *filp)
303 } 307 }
304 308
305 /* Start reading from the device */ 309 /* Start reading from the device */
306 usb_fill_bulk_urb (port->read_urb, serial->dev, 310 usb_fill_bulk_urb(port->read_urb, serial->dev,
307 usb_rcvbulkpipe(serial->dev, 311 usb_rcvbulkpipe(serial->dev,
308 port->bulk_in_endpointAddress), 312 port->bulk_in_endpointAddress),
309 port->read_urb->transfer_buffer, 313 port->read_urb->transfer_buffer,
@@ -318,15 +322,15 @@ static int cp2101_open (struct usb_serial_port *port, struct file *filp)
318 } 322 }
319 323
320 /* Configure the termios structure */ 324 /* Configure the termios structure */
321 cp2101_get_termios(port); 325 cp2101_get_termios(tty);
322 326
323 /* Set the DTR and RTS pins low */ 327 /* Set the DTR and RTS pins low */
324 cp2101_tiocmset(port, NULL, TIOCM_DTR | TIOCM_RTS, 0); 328 cp2101_tiocmset(tty, NULL, TIOCM_DTR | TIOCM_RTS, 0);
325 329
326 return 0; 330 return 0;
327} 331}
328 332
329static void cp2101_cleanup (struct usb_serial_port *port) 333static void cp2101_cleanup(struct usb_serial_port *port)
330{ 334{
331 struct usb_serial *serial = port->serial; 335 struct usb_serial *serial = port->serial;
332 336
@@ -341,7 +345,8 @@ static void cp2101_cleanup (struct usb_serial_port *port)
341 } 345 }
342} 346}
343 347
344static void cp2101_close (struct usb_serial_port *port, struct file * filp) 348static void cp2101_close(struct tty_struct *tty, struct usb_serial_port *port,
349 struct file *filp)
345{ 350{
346 dbg("%s - port %d", __func__, port->number); 351 dbg("%s - port %d", __func__, port->number);
347 352
@@ -362,19 +367,15 @@ static void cp2101_close (struct usb_serial_port *port, struct file * filp)
362 * from the device, corrects any unsupported values, and configures the 367 * from the device, corrects any unsupported values, and configures the
363 * termios structure to reflect the state of the device 368 * termios structure to reflect the state of the device
364 */ 369 */
365static void cp2101_get_termios (struct usb_serial_port *port) 370static void cp2101_get_termios (struct tty_struct *tty)
366{ 371{
372 struct usb_serial_port *port = tty->driver_data;
367 unsigned int cflag, modem_ctl[4]; 373 unsigned int cflag, modem_ctl[4];
368 int baud; 374 unsigned int baud;
369 int bits; 375 unsigned int bits;
370 376
371 dbg("%s - port %d", __func__, port->number); 377 dbg("%s - port %d", __func__, port->number);
372 378
373 if (!port->tty || !port->tty->termios) {
374 dbg("%s - no tty structures", __func__);
375 return;
376 }
377
378 cp2101_get_config(port, CP2101_BAUDRATE, &baud, 2); 379 cp2101_get_config(port, CP2101_BAUDRATE, &baud, 2);
379 /* Convert to baudrate */ 380 /* Convert to baudrate */
380 if (baud) 381 if (baud)
@@ -382,104 +383,102 @@ static void cp2101_get_termios (struct usb_serial_port *port)
382 383
383 dbg("%s - baud rate = %d", __func__, baud); 384 dbg("%s - baud rate = %d", __func__, baud);
384 385
385 tty_encode_baud_rate(port->tty, baud, baud); 386 tty_encode_baud_rate(tty, baud, baud);
386 cflag = port->tty->termios->c_cflag; 387 cflag = tty->termios->c_cflag;
387 388
388 cp2101_get_config(port, CP2101_BITS, &bits, 2); 389 cp2101_get_config(port, CP2101_BITS, &bits, 2);
389 cflag &= ~CSIZE; 390 cflag &= ~CSIZE;
390 switch(bits & BITS_DATA_MASK) { 391 switch (bits & BITS_DATA_MASK) {
391 case BITS_DATA_5: 392 case BITS_DATA_5:
392 dbg("%s - data bits = 5", __func__); 393 dbg("%s - data bits = 5", __func__);
393 cflag |= CS5; 394 cflag |= CS5;
394 break; 395 break;
395 case BITS_DATA_6: 396 case BITS_DATA_6:
396 dbg("%s - data bits = 6", __func__); 397 dbg("%s - data bits = 6", __func__);
397 cflag |= CS6; 398 cflag |= CS6;
398 break; 399 break;
399 case BITS_DATA_7: 400 case BITS_DATA_7:
400 dbg("%s - data bits = 7", __func__); 401 dbg("%s - data bits = 7", __func__);
401 cflag |= CS7; 402 cflag |= CS7;
402 break; 403 break;
403 case BITS_DATA_8: 404 case BITS_DATA_8:
404 dbg("%s - data bits = 8", __func__); 405 dbg("%s - data bits = 8", __func__);
405 cflag |= CS8; 406 cflag |= CS8;
406 break; 407 break;
407 case BITS_DATA_9: 408 case BITS_DATA_9:
408 dbg("%s - data bits = 9 (not supported, " 409 dbg("%s - data bits = 9 (not supported, using 8 data bits)",
409 "using 8 data bits)", __func__); 410 __func__);
410 cflag |= CS8; 411 cflag |= CS8;
411 bits &= ~BITS_DATA_MASK; 412 bits &= ~BITS_DATA_MASK;
412 bits |= BITS_DATA_8; 413 bits |= BITS_DATA_8;
413 cp2101_set_config(port, CP2101_BITS, &bits, 2); 414 cp2101_set_config(port, CP2101_BITS, &bits, 2);
414 break; 415 break;
415 default: 416 default:
416 dbg("%s - Unknown number of data bits, " 417 dbg("%s - Unknown number of data bits, using 8", __func__);
417 "using 8", __func__); 418 cflag |= CS8;
418 cflag |= CS8; 419 bits &= ~BITS_DATA_MASK;
419 bits &= ~BITS_DATA_MASK; 420 bits |= BITS_DATA_8;
420 bits |= BITS_DATA_8; 421 cp2101_set_config(port, CP2101_BITS, &bits, 2);
421 cp2101_set_config(port, CP2101_BITS, &bits, 2); 422 break;
422 break;
423 } 423 }
424 424
425 switch(bits & BITS_PARITY_MASK) { 425 switch (bits & BITS_PARITY_MASK) {
426 case BITS_PARITY_NONE: 426 case BITS_PARITY_NONE:
427 dbg("%s - parity = NONE", __func__); 427 dbg("%s - parity = NONE", __func__);
428 cflag &= ~PARENB; 428 cflag &= ~PARENB;
429 break; 429 break;
430 case BITS_PARITY_ODD: 430 case BITS_PARITY_ODD:
431 dbg("%s - parity = ODD", __func__); 431 dbg("%s - parity = ODD", __func__);
432 cflag |= (PARENB|PARODD); 432 cflag |= (PARENB|PARODD);
433 break; 433 break;
434 case BITS_PARITY_EVEN: 434 case BITS_PARITY_EVEN:
435 dbg("%s - parity = EVEN", __func__); 435 dbg("%s - parity = EVEN", __func__);
436 cflag &= ~PARODD; 436 cflag &= ~PARODD;
437 cflag |= PARENB; 437 cflag |= PARENB;
438 break; 438 break;
439 case BITS_PARITY_MARK: 439 case BITS_PARITY_MARK:
440 dbg("%s - parity = MARK (not supported, " 440 dbg("%s - parity = MARK (not supported, disabling parity)",
441 "disabling parity)", __func__); 441 __func__);
442 cflag &= ~PARENB; 442 cflag &= ~PARENB;
443 bits &= ~BITS_PARITY_MASK; 443 bits &= ~BITS_PARITY_MASK;
444 cp2101_set_config(port, CP2101_BITS, &bits, 2); 444 cp2101_set_config(port, CP2101_BITS, &bits, 2);
445 break; 445 break;
446 case BITS_PARITY_SPACE: 446 case BITS_PARITY_SPACE:
447 dbg("%s - parity = SPACE (not supported, " 447 dbg("%s - parity = SPACE (not supported, disabling parity)",
448 "disabling parity)", __func__); 448 __func__);
449 cflag &= ~PARENB; 449 cflag &= ~PARENB;
450 bits &= ~BITS_PARITY_MASK; 450 bits &= ~BITS_PARITY_MASK;
451 cp2101_set_config(port, CP2101_BITS, &bits, 2); 451 cp2101_set_config(port, CP2101_BITS, &bits, 2);
452 break; 452 break;
453 default: 453 default:
454 dbg("%s - Unknown parity mode, " 454 dbg("%s - Unknown parity mode, disabling parity", __func__);
455 "disabling parity", __func__); 455 cflag &= ~PARENB;
456 cflag &= ~PARENB; 456 bits &= ~BITS_PARITY_MASK;
457 bits &= ~BITS_PARITY_MASK; 457 cp2101_set_config(port, CP2101_BITS, &bits, 2);
458 cp2101_set_config(port, CP2101_BITS, &bits, 2); 458 break;
459 break;
460 } 459 }
461 460
462 cflag &= ~CSTOPB; 461 cflag &= ~CSTOPB;
463 switch(bits & BITS_STOP_MASK) { 462 switch (bits & BITS_STOP_MASK) {
464 case BITS_STOP_1: 463 case BITS_STOP_1:
465 dbg("%s - stop bits = 1", __func__); 464 dbg("%s - stop bits = 1", __func__);
466 break; 465 break;
467 case BITS_STOP_1_5: 466 case BITS_STOP_1_5:
468 dbg("%s - stop bits = 1.5 (not supported, " 467 dbg("%s - stop bits = 1.5 (not supported, using 1 stop bit)",
469 "using 1 stop bit)", __func__); 468 __func__);
470 bits &= ~BITS_STOP_MASK; 469 bits &= ~BITS_STOP_MASK;
471 cp2101_set_config(port, CP2101_BITS, &bits, 2); 470 cp2101_set_config(port, CP2101_BITS, &bits, 2);
472 break; 471 break;
473 case BITS_STOP_2: 472 case BITS_STOP_2:
474 dbg("%s - stop bits = 2", __func__); 473 dbg("%s - stop bits = 2", __func__);
475 cflag |= CSTOPB; 474 cflag |= CSTOPB;
476 break; 475 break;
477 default: 476 default:
478 dbg("%s - Unknown number of stop bits, " 477 dbg("%s - Unknown number of stop bits, using 1 stop bit",
479 "using 1 stop bit", __func__); 478 __func__);
480 bits &= ~BITS_STOP_MASK; 479 bits &= ~BITS_STOP_MASK;
481 cp2101_set_config(port, CP2101_BITS, &bits, 2); 480 cp2101_set_config(port, CP2101_BITS, &bits, 2);
482 break; 481 break;
483 } 482 }
484 483
485 cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); 484 cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16);
@@ -491,55 +490,53 @@ static void cp2101_get_termios (struct usb_serial_port *port)
491 cflag &= ~CRTSCTS; 490 cflag &= ~CRTSCTS;
492 } 491 }
493 492
494 port->tty->termios->c_cflag = cflag; 493 tty->termios->c_cflag = cflag;
495} 494}
496 495
497static void cp2101_set_termios (struct usb_serial_port *port, 496static void cp2101_set_termios(struct tty_struct *tty,
498 struct ktermios *old_termios) 497 struct usb_serial_port *port, struct ktermios *old_termios)
499{ 498{
500 unsigned int cflag, old_cflag; 499 unsigned int cflag, old_cflag;
501 int baud=0, bits; 500 unsigned int baud = 0, bits;
502 unsigned int modem_ctl[4]; 501 unsigned int modem_ctl[4];
503 502
504 dbg("%s - port %d", __func__, port->number); 503 dbg("%s - port %d", __func__, port->number);
505 504
506 if (!port->tty || !port->tty->termios) { 505 if (!tty)
507 dbg("%s - no tty structures", __func__);
508 return; 506 return;
509 }
510 port->tty->termios->c_cflag &= ~CMSPAR;
511 507
512 cflag = port->tty->termios->c_cflag; 508 tty->termios->c_cflag &= ~CMSPAR;
509 cflag = tty->termios->c_cflag;
513 old_cflag = old_termios->c_cflag; 510 old_cflag = old_termios->c_cflag;
514 baud = tty_get_baud_rate(port->tty); 511 baud = tty_get_baud_rate(tty);
515 512
516 /* If the baud rate is to be updated*/ 513 /* If the baud rate is to be updated*/
517 if (baud != tty_termios_baud_rate(old_termios)) { 514 if (baud != tty_termios_baud_rate(old_termios)) {
518 switch (baud) { 515 switch (baud) {
519 case 0: 516 case 0:
520 case 600: 517 case 600:
521 case 1200: 518 case 1200:
522 case 1800: 519 case 1800:
523 case 2400: 520 case 2400:
524 case 4800: 521 case 4800:
525 case 7200: 522 case 7200:
526 case 9600: 523 case 9600:
527 case 14400: 524 case 14400:
528 case 19200: 525 case 19200:
529 case 28800: 526 case 28800:
530 case 38400: 527 case 38400:
531 case 55854: 528 case 55854:
532 case 57600: 529 case 57600:
533 case 115200: 530 case 115200:
534 case 127117: 531 case 127117:
535 case 230400: 532 case 230400:
536 case 460800: 533 case 460800:
537 case 921600: 534 case 921600:
538 case 3686400: 535 case 3686400:
539 break; 536 break;
540 default: 537 default:
541 baud = 9600; 538 baud = 9600;
542 break; 539 break;
543 } 540 }
544 541
545 if (baud) { 542 if (baud) {
@@ -554,35 +551,35 @@ static void cp2101_set_termios (struct usb_serial_port *port,
554 } 551 }
555 } 552 }
556 /* Report back the resulting baud rate */ 553 /* Report back the resulting baud rate */
557 tty_encode_baud_rate(port->tty, baud, baud); 554 tty_encode_baud_rate(tty, baud, baud);
558 555
559 /* If the number of data bits is to be updated */ 556 /* If the number of data bits is to be updated */
560 if ((cflag & CSIZE) != (old_cflag & CSIZE)) { 557 if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
561 cp2101_get_config(port, CP2101_BITS, &bits, 2); 558 cp2101_get_config(port, CP2101_BITS, &bits, 2);
562 bits &= ~BITS_DATA_MASK; 559 bits &= ~BITS_DATA_MASK;
563 switch (cflag & CSIZE) { 560 switch (cflag & CSIZE) {
564 case CS5: 561 case CS5:
565 bits |= BITS_DATA_5; 562 bits |= BITS_DATA_5;
566 dbg("%s - data bits = 5", __func__); 563 dbg("%s - data bits = 5", __func__);
567 break; 564 break;
568 case CS6: 565 case CS6:
569 bits |= BITS_DATA_6; 566 bits |= BITS_DATA_6;
570 dbg("%s - data bits = 6", __func__); 567 dbg("%s - data bits = 6", __func__);
571 break; 568 break;
572 case CS7: 569 case CS7:
573 bits |= BITS_DATA_7; 570 bits |= BITS_DATA_7;
574 dbg("%s - data bits = 7", __func__); 571 dbg("%s - data bits = 7", __func__);
575 break; 572 break;
576 case CS8: 573 case CS8:
577 bits |= BITS_DATA_8; 574 bits |= BITS_DATA_8;
578 dbg("%s - data bits = 8", __func__); 575 dbg("%s - data bits = 8", __func__);
579 break; 576 break;
580 /*case CS9: 577 /*case CS9:
581 bits |= BITS_DATA_9; 578 bits |= BITS_DATA_9;
582 dbg("%s - data bits = 9", __func__); 579 dbg("%s - data bits = 9", __func__);
583 break;*/ 580 break;*/
584 default: 581 default:
585 dev_err(&port->dev, "cp2101 driver does not " 582 dev_err(&port->dev, "cp2101 driver does not "
586 "support the number of bits requested," 583 "support the number of bits requested,"
587 " using 8 bit mode\n"); 584 " using 8 bit mode\n");
588 bits |= BITS_DATA_8; 585 bits |= BITS_DATA_8;
@@ -651,10 +648,11 @@ static void cp2101_set_termios (struct usb_serial_port *port,
651 648
652} 649}
653 650
654static int cp2101_tiocmset (struct usb_serial_port *port, struct file *file, 651static int cp2101_tiocmset (struct tty_struct *tty, struct file *file,
655 unsigned int set, unsigned int clear) 652 unsigned int set, unsigned int clear)
656{ 653{
657 int control = 0; 654 struct usb_serial_port *port = tty->driver_data;
655 unsigned int control = 0;
658 656
659 dbg("%s - port %d", __func__, port->number); 657 dbg("%s - port %d", __func__, port->number);
660 658
@@ -681,9 +679,11 @@ static int cp2101_tiocmset (struct usb_serial_port *port, struct file *file,
681 679
682} 680}
683 681
684static int cp2101_tiocmget (struct usb_serial_port *port, struct file *file) 682static int cp2101_tiocmget (struct tty_struct *tty, struct file *file)
685{ 683{
686 int control, result; 684 struct usb_serial_port *port = tty->driver_data;
685 unsigned int control;
686 int result;
687 687
688 dbg("%s - port %d", __func__, port->number); 688 dbg("%s - port %d", __func__, port->number);
689 689
@@ -701,9 +701,10 @@ static int cp2101_tiocmget (struct usb_serial_port *port, struct file *file)
701 return result; 701 return result;
702} 702}
703 703
704static void cp2101_break_ctl (struct usb_serial_port *port, int break_state) 704static void cp2101_break_ctl (struct tty_struct *tty, int break_state)
705{ 705{
706 int state; 706 struct usb_serial_port *port = tty->driver_data;
707 unsigned int state;
707 708
708 dbg("%s - port %d", __func__, port->number); 709 dbg("%s - port %d", __func__, port->number);
709 if (break_state == 0) 710 if (break_state == 0)
@@ -711,30 +712,29 @@ static void cp2101_break_ctl (struct usb_serial_port *port, int break_state)
711 else 712 else
712 state = BREAK_ON; 713 state = BREAK_ON;
713 dbg("%s - turning break %s", __func__, 714 dbg("%s - turning break %s", __func__,
714 state==BREAK_OFF ? "off" : "on"); 715 state == BREAK_OFF ? "off" : "on");
715 cp2101_set_config(port, CP2101_BREAK, &state, 2); 716 cp2101_set_config(port, CP2101_BREAK, &state, 2);
716} 717}
717 718
718static int cp2101_startup (struct usb_serial *serial) 719static int cp2101_startup(struct usb_serial *serial)
719{ 720{
720 /* CP2101 buffers behave strangely unless device is reset */ 721 /* CP2101 buffers behave strangely unless device is reset */
721 usb_reset_device(serial->dev); 722 usb_reset_device(serial->dev);
722 return 0; 723 return 0;
723} 724}
724 725
725static void cp2101_shutdown (struct usb_serial *serial) 726static void cp2101_shutdown(struct usb_serial *serial)
726{ 727{
727 int i; 728 int i;
728 729
729 dbg("%s", __func__); 730 dbg("%s", __func__);
730 731
731 /* Stop reads and writes on all ports */ 732 /* Stop reads and writes on all ports */
732 for (i=0; i < serial->num_ports; ++i) { 733 for (i = 0; i < serial->num_ports; ++i)
733 cp2101_cleanup(serial->port[i]); 734 cp2101_cleanup(serial->port[i]);
734 }
735} 735}
736 736
737static int __init cp2101_init (void) 737static int __init cp2101_init(void)
738{ 738{
739 int retval; 739 int retval;
740 740
@@ -754,10 +754,10 @@ static int __init cp2101_init (void)
754 return 0; 754 return 0;
755} 755}
756 756
757static void __exit cp2101_exit (void) 757static void __exit cp2101_exit(void)
758{ 758{
759 usb_deregister (&cp2101_driver); 759 usb_deregister(&cp2101_driver);
760 usb_serial_deregister (&cp2101_device); 760 usb_serial_deregister(&cp2101_device);
761} 761}
762 762
763module_init(cp2101_init); 763module_init(cp2101_init);
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
index c164e2cf2752..b4d72351cb96 100644
--- a/drivers/usb/serial/cyberjack.c
+++ b/drivers/usb/serial/cyberjack.c
@@ -37,7 +37,7 @@
37#include <linux/tty_flip.h> 37#include <linux/tty_flip.h>
38#include <linux/module.h> 38#include <linux/module.h>
39#include <linux/spinlock.h> 39#include <linux/spinlock.h>
40#include <asm/uaccess.h> 40#include <linux/uaccess.h>
41#include <linux/usb.h> 41#include <linux/usb.h>
42#include <linux/usb/serial.h> 42#include <linux/usb/serial.h>
43 43
@@ -57,22 +57,25 @@ static int debug;
57#define CYBERJACK_PRODUCT_ID 0x0100 57#define CYBERJACK_PRODUCT_ID 0x0100
58 58
59/* Function prototypes */ 59/* Function prototypes */
60static int cyberjack_startup (struct usb_serial *serial); 60static int cyberjack_startup(struct usb_serial *serial);
61static void cyberjack_shutdown (struct usb_serial *serial); 61static void cyberjack_shutdown(struct usb_serial *serial);
62static int cyberjack_open (struct usb_serial_port *port, struct file *filp); 62static int cyberjack_open(struct tty_struct *tty,
63static void cyberjack_close (struct usb_serial_port *port, struct file *filp); 63 struct usb_serial_port *port, struct file *filp);
64static int cyberjack_write (struct usb_serial_port *port, const unsigned char *buf, int count); 64static void cyberjack_close(struct tty_struct *tty,
65static int cyberjack_write_room( struct usb_serial_port *port ); 65 struct usb_serial_port *port, struct file *filp);
66static void cyberjack_read_int_callback (struct urb *urb); 66static int cyberjack_write(struct tty_struct *tty,
67static void cyberjack_read_bulk_callback (struct urb *urb); 67 struct usb_serial_port *port, const unsigned char *buf, int count);
68static void cyberjack_write_bulk_callback (struct urb *urb); 68static int cyberjack_write_room(struct tty_struct *tty);
69static void cyberjack_read_int_callback(struct urb *urb);
70static void cyberjack_read_bulk_callback(struct urb *urb);
71static void cyberjack_write_bulk_callback(struct urb *urb);
69 72
70static struct usb_device_id id_table [] = { 73static struct usb_device_id id_table [] = {
71 { USB_DEVICE(CYBERJACK_VENDOR_ID, CYBERJACK_PRODUCT_ID) }, 74 { USB_DEVICE(CYBERJACK_VENDOR_ID, CYBERJACK_PRODUCT_ID) },
72 { } /* Terminating entry */ 75 { } /* Terminating entry */
73}; 76};
74 77
75MODULE_DEVICE_TABLE (usb, id_table); 78MODULE_DEVICE_TABLE(usb, id_table);
76 79
77static struct usb_driver cyberjack_driver = { 80static struct usb_driver cyberjack_driver = {
78 .name = "cyberjack", 81 .name = "cyberjack",
@@ -111,7 +114,7 @@ struct cyberjack_private {
111}; 114};
112 115
113/* do some startup allocations not currently performed by usb_serial_probe() */ 116/* do some startup allocations not currently performed by usb_serial_probe() */
114static int cyberjack_startup (struct usb_serial *serial) 117static int cyberjack_startup(struct usb_serial *serial)
115{ 118{
116 struct cyberjack_private *priv; 119 struct cyberjack_private *priv;
117 int i; 120 int i;
@@ -135,20 +138,20 @@ static int cyberjack_startup (struct usb_serial *serial)
135 for (i = 0; i < serial->num_ports; ++i) { 138 for (i = 0; i < serial->num_ports; ++i) {
136 int result; 139 int result;
137 serial->port[i]->interrupt_in_urb->dev = serial->dev; 140 serial->port[i]->interrupt_in_urb->dev = serial->dev;
138 result = usb_submit_urb(serial->port[i]->interrupt_in_urb, 141 result = usb_submit_urb(serial->port[i]->interrupt_in_urb,
139 GFP_KERNEL); 142 GFP_KERNEL);
140 if (result) 143 if (result)
141 err(" usb_submit_urb(read int) failed"); 144 err(" usb_submit_urb(read int) failed");
142 dbg("%s - usb_submit_urb(int urb)", __func__); 145 dbg("%s - usb_submit_urb(int urb)", __func__);
143 } 146 }
144 147
145 return( 0 ); 148 return 0;
146} 149}
147 150
148static void cyberjack_shutdown (struct usb_serial *serial) 151static void cyberjack_shutdown(struct usb_serial *serial)
149{ 152{
150 int i; 153 int i;
151 154
152 dbg("%s", __func__); 155 dbg("%s", __func__);
153 156
154 for (i = 0; i < serial->num_ports; ++i) { 157 for (i = 0; i < serial->num_ports; ++i) {
@@ -158,8 +161,9 @@ static void cyberjack_shutdown (struct usb_serial *serial)
158 usb_set_serial_port_data(serial->port[i], NULL); 161 usb_set_serial_port_data(serial->port[i], NULL);
159 } 162 }
160} 163}
161 164
162static int cyberjack_open (struct usb_serial_port *port, struct file *filp) 165static int cyberjack_open(struct tty_struct *tty,
166 struct usb_serial_port *port, struct file *filp)
163{ 167{
164 struct cyberjack_private *priv; 168 struct cyberjack_private *priv;
165 unsigned long flags; 169 unsigned long flags;
@@ -167,14 +171,15 @@ static int cyberjack_open (struct usb_serial_port *port, struct file *filp)
167 171
168 dbg("%s - port %d", __func__, port->number); 172 dbg("%s - port %d", __func__, port->number);
169 173
170 dbg("%s - usb_clear_halt", __func__ ); 174 dbg("%s - usb_clear_halt", __func__);
171 usb_clear_halt(port->serial->dev, port->write_urb->pipe); 175 usb_clear_halt(port->serial->dev, port->write_urb->pipe);
172 176
173 /* force low_latency on so that our tty_push actually forces 177 /* force low_latency on so that our tty_push actually forces
174 * the data through, otherwise it is scheduled, and with high 178 * the data through, otherwise it is scheduled, and with high
175 * data rates (like with OHCI) data can get lost. 179 * data rates (like with OHCI) data can get lost.
176 */ 180 */
177 port->tty->low_latency = 1; 181 if (tty)
182 tty->low_latency = 1;
178 183
179 priv = usb_get_serial_port_data(port); 184 priv = usb_get_serial_port_data(port);
180 spin_lock_irqsave(&priv->lock, flags); 185 spin_lock_irqsave(&priv->lock, flags);
@@ -186,7 +191,8 @@ static int cyberjack_open (struct usb_serial_port *port, struct file *filp)
186 return result; 191 return result;
187} 192}
188 193
189static void cyberjack_close (struct usb_serial_port *port, struct file *filp) 194static void cyberjack_close(struct tty_struct *tty,
195 struct usb_serial_port *port, struct file *filp)
190{ 196{
191 dbg("%s - port %d", __func__, port->number); 197 dbg("%s - port %d", __func__, port->number);
192 198
@@ -197,7 +203,8 @@ static void cyberjack_close (struct usb_serial_port *port, struct file *filp)
197 } 203 }
198} 204}
199 205
200static int cyberjack_write (struct usb_serial_port *port, const unsigned char *buf, int count) 206static int cyberjack_write(struct tty_struct *tty,
207 struct usb_serial_port *port, const unsigned char *buf, int count)
201{ 208{
202 struct usb_serial *serial = port->serial; 209 struct usb_serial *serial = port->serial;
203 struct cyberjack_private *priv = usb_get_serial_port_data(port); 210 struct cyberjack_private *priv = usb_get_serial_port_data(port);
@@ -223,7 +230,7 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
223 230
224 spin_lock_irqsave(&priv->lock, flags); 231 spin_lock_irqsave(&priv->lock, flags);
225 232
226 if( (count+priv->wrfilled) > sizeof(priv->wrbuf) ) { 233 if (count+priv->wrfilled > sizeof(priv->wrbuf)) {
227 /* To much data for buffer. Reset buffer. */ 234 /* To much data for buffer. Reset buffer. */
228 priv->wrfilled = 0; 235 priv->wrfilled = 0;
229 port->write_urb_busy = 0; 236 port->write_urb_busy = 0;
@@ -232,42 +239,43 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
232 } 239 }
233 240
234 /* Copy data */ 241 /* Copy data */
235 memcpy (priv->wrbuf+priv->wrfilled, buf, count); 242 memcpy(priv->wrbuf + priv->wrfilled, buf, count);
236 243
237 usb_serial_debug_data(debug, &port->dev, __func__, count, 244 usb_serial_debug_data(debug, &port->dev, __func__, count,
238 priv->wrbuf+priv->wrfilled); 245 priv->wrbuf + priv->wrfilled);
239 priv->wrfilled += count; 246 priv->wrfilled += count;
240 247
241 if( priv->wrfilled >= 3 ) { 248 if (priv->wrfilled >= 3) {
242 wrexpected = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3; 249 wrexpected = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;
243 dbg("%s - expected data: %d", __func__, wrexpected); 250 dbg("%s - expected data: %d", __func__, wrexpected);
244 } else { 251 } else
245 wrexpected = sizeof(priv->wrbuf); 252 wrexpected = sizeof(priv->wrbuf);
246 }
247 253
248 if( priv->wrfilled >= wrexpected ) { 254 if (priv->wrfilled >= wrexpected) {
249 /* We have enough data to begin transmission */ 255 /* We have enough data to begin transmission */
250 int length; 256 int length;
251 257
252 dbg("%s - transmitting data (frame 1)", __func__); 258 dbg("%s - transmitting data (frame 1)", __func__);
253 length = (wrexpected > port->bulk_out_size) ? port->bulk_out_size : wrexpected; 259 length = (wrexpected > port->bulk_out_size) ?
260 port->bulk_out_size : wrexpected;
254 261
255 memcpy (port->write_urb->transfer_buffer, priv->wrbuf, length ); 262 memcpy(port->write_urb->transfer_buffer, priv->wrbuf, length);
256 priv->wrsent=length; 263 priv->wrsent = length;
257 264
258 /* set up our urb */ 265 /* set up our urb */
259 usb_fill_bulk_urb(port->write_urb, serial->dev, 266 usb_fill_bulk_urb(port->write_urb, serial->dev,
260 usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), 267 usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
261 port->write_urb->transfer_buffer, length, 268 port->write_urb->transfer_buffer, length,
262 ((serial->type->write_bulk_callback) ? 269 ((serial->type->write_bulk_callback) ?
263 serial->type->write_bulk_callback : 270 serial->type->write_bulk_callback :
264 cyberjack_write_bulk_callback), 271 cyberjack_write_bulk_callback),
265 port); 272 port);
266 273
267 /* send the data out the bulk port */ 274 /* send the data out the bulk port */
268 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 275 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
269 if (result) { 276 if (result) {
270 err("%s - failed submitting write urb, error %d", __func__, result); 277 err("%s - failed submitting write urb, error %d",
278 __func__, result);
271 /* Throw away data. No better idea what to do with it. */ 279 /* Throw away data. No better idea what to do with it. */
272 priv->wrfilled = 0; 280 priv->wrfilled = 0;
273 priv->wrsent = 0; 281 priv->wrsent = 0;
@@ -276,12 +284,12 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
276 return 0; 284 return 0;
277 } 285 }
278 286
279 dbg("%s - priv->wrsent=%d", __func__,priv->wrsent); 287 dbg("%s - priv->wrsent=%d", __func__, priv->wrsent);
280 dbg("%s - priv->wrfilled=%d", __func__,priv->wrfilled); 288 dbg("%s - priv->wrfilled=%d", __func__, priv->wrfilled);
281 289
282 if( priv->wrsent>=priv->wrfilled ) { 290 if (priv->wrsent >= priv->wrfilled) {
283 dbg("%s - buffer cleaned", __func__); 291 dbg("%s - buffer cleaned", __func__);
284 memset( priv->wrbuf, 0, sizeof(priv->wrbuf) ); 292 memset(priv->wrbuf, 0, sizeof(priv->wrbuf));
285 priv->wrfilled = 0; 293 priv->wrfilled = 0;
286 priv->wrsent = 0; 294 priv->wrsent = 0;
287 } 295 }
@@ -289,16 +297,16 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
289 297
290 spin_unlock_irqrestore(&priv->lock, flags); 298 spin_unlock_irqrestore(&priv->lock, flags);
291 299
292 return (count); 300 return count;
293} 301}
294 302
295static int cyberjack_write_room( struct usb_serial_port *port ) 303static int cyberjack_write_room(struct tty_struct *tty)
296{ 304{
297 /* FIXME: .... */ 305 /* FIXME: .... */
298 return CYBERJACK_LOCAL_BUF_SIZE; 306 return CYBERJACK_LOCAL_BUF_SIZE;
299} 307}
300 308
301static void cyberjack_read_int_callback( struct urb *urb ) 309static void cyberjack_read_int_callback(struct urb *urb)
302{ 310{
303 struct usb_serial_port *port = urb->context; 311 struct usb_serial_port *port = urb->context;
304 struct cyberjack_private *priv = usb_get_serial_port_data(port); 312 struct cyberjack_private *priv = usb_get_serial_port_data(port);
@@ -312,10 +320,11 @@ static void cyberjack_read_int_callback( struct urb *urb )
312 if (status) 320 if (status)
313 return; 321 return;
314 322
315 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 323 usb_serial_debug_data(debug, &port->dev, __func__,
324 urb->actual_length, data);
316 325
317 /* React only to interrupts signaling a bulk_in transfer */ 326 /* React only to interrupts signaling a bulk_in transfer */
318 if( (urb->actual_length == 4) && (data[0] == 0x01) ) { 327 if (urb->actual_length == 4 && data[0] == 0x01) {
319 short old_rdtodo; 328 short old_rdtodo;
320 329
321 /* This is a announcement of coming bulk_ins. */ 330 /* This is a announcement of coming bulk_ins. */
@@ -325,8 +334,8 @@ static void cyberjack_read_int_callback( struct urb *urb )
325 334
326 old_rdtodo = priv->rdtodo; 335 old_rdtodo = priv->rdtodo;
327 336
328 if( (old_rdtodo+size)<(old_rdtodo) ) { 337 if (old_rdtodo + size < old_rdtodo) {
329 dbg( "To many bulk_in urbs to do." ); 338 dbg("To many bulk_in urbs to do.");
330 spin_unlock(&priv->lock); 339 spin_unlock(&priv->lock);
331 goto resubmit; 340 goto resubmit;
332 } 341 }
@@ -338,10 +347,10 @@ static void cyberjack_read_int_callback( struct urb *urb )
338 347
339 spin_unlock(&priv->lock); 348 spin_unlock(&priv->lock);
340 349
341 if( !old_rdtodo ) { 350 if (!old_rdtodo) {
342 port->read_urb->dev = port->serial->dev; 351 port->read_urb->dev = port->serial->dev;
343 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 352 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
344 if( result ) 353 if (result)
345 err("%s - failed resubmitting read urb, error %d", __func__, result); 354 err("%s - failed resubmitting read urb, error %d", __func__, result);
346 dbg("%s - usb_submit_urb(read urb)", __func__); 355 dbg("%s - usb_submit_urb(read urb)", __func__);
347 } 356 }
@@ -355,7 +364,7 @@ resubmit:
355 dbg("%s - usb_submit_urb(int urb)", __func__); 364 dbg("%s - usb_submit_urb(int urb)", __func__);
356} 365}
357 366
358static void cyberjack_read_bulk_callback (struct urb *urb) 367static void cyberjack_read_bulk_callback(struct urb *urb)
359{ 368{
360 struct usb_serial_port *port = urb->context; 369 struct usb_serial_port *port = urb->context;
361 struct cyberjack_private *priv = usb_get_serial_port_data(port); 370 struct cyberjack_private *priv = usb_get_serial_port_data(port);
@@ -367,14 +376,15 @@ static void cyberjack_read_bulk_callback (struct urb *urb)
367 376
368 dbg("%s - port %d", __func__, port->number); 377 dbg("%s - port %d", __func__, port->number);
369 378
370 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 379 usb_serial_debug_data(debug, &port->dev, __func__,
380 urb->actual_length, data);
371 if (status) { 381 if (status) {
372 dbg("%s - nonzero read bulk status received: %d", 382 dbg("%s - nonzero read bulk status received: %d",
373 __func__, status); 383 __func__, status);
374 return; 384 return;
375 } 385 }
376 386
377 tty = port->tty; 387 tty = port->port.tty;
378 if (!tty) { 388 if (!tty) {
379 dbg("%s - ignoring since device not open\n", __func__); 389 dbg("%s - ignoring since device not open\n", __func__);
380 return; 390 return;
@@ -382,15 +392,16 @@ static void cyberjack_read_bulk_callback (struct urb *urb)
382 if (urb->actual_length) { 392 if (urb->actual_length) {
383 tty_buffer_request_room(tty, urb->actual_length); 393 tty_buffer_request_room(tty, urb->actual_length);
384 tty_insert_flip_string(tty, data, urb->actual_length); 394 tty_insert_flip_string(tty, data, urb->actual_length);
385 tty_flip_buffer_push(tty); 395 tty_flip_buffer_push(tty);
386 } 396 }
387 397
388 spin_lock(&priv->lock); 398 spin_lock(&priv->lock);
389 399
390 /* Reduce urbs to do by one. */ 400 /* Reduce urbs to do by one. */
391 priv->rdtodo-=urb->actual_length; 401 priv->rdtodo -= urb->actual_length;
392 /* Just to be sure */ 402 /* Just to be sure */
393 if ( priv->rdtodo<0 ) priv->rdtodo = 0; 403 if (priv->rdtodo < 0)
404 priv->rdtodo = 0;
394 todo = priv->rdtodo; 405 todo = priv->rdtodo;
395 406
396 spin_unlock(&priv->lock); 407 spin_unlock(&priv->lock);
@@ -398,16 +409,17 @@ static void cyberjack_read_bulk_callback (struct urb *urb)
398 dbg("%s - rdtodo: %d", __func__, todo); 409 dbg("%s - rdtodo: %d", __func__, todo);
399 410
400 /* Continue to read if we have still urbs to do. */ 411 /* Continue to read if we have still urbs to do. */
401 if( todo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) { 412 if (todo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/) {
402 port->read_urb->dev = port->serial->dev; 413 port->read_urb->dev = port->serial->dev;
403 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 414 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
404 if (result) 415 if (result)
405 err("%s - failed resubmitting read urb, error %d", __func__, result); 416 err("%s - failed resubmitting read urb, error %d",
417 __func__, result);
406 dbg("%s - usb_submit_urb(read urb)", __func__); 418 dbg("%s - usb_submit_urb(read urb)", __func__);
407 } 419 }
408} 420}
409 421
410static void cyberjack_write_bulk_callback (struct urb *urb) 422static void cyberjack_write_bulk_callback(struct urb *urb)
411{ 423{
412 struct usb_serial_port *port = urb->context; 424 struct usb_serial_port *port = urb->context;
413 struct cyberjack_private *priv = usb_get_serial_port_data(port); 425 struct cyberjack_private *priv = usb_get_serial_port_data(port);
@@ -425,7 +437,7 @@ static void cyberjack_write_bulk_callback (struct urb *urb)
425 spin_lock(&priv->lock); 437 spin_lock(&priv->lock);
426 438
427 /* only do something if we have more data to send */ 439 /* only do something if we have more data to send */
428 if( priv->wrfilled ) { 440 if (priv->wrfilled) {
429 int length, blksize, result; 441 int length, blksize, result;
430 442
431 dbg("%s - transmitting data (frame n)", __func__); 443 dbg("%s - transmitting data (frame n)", __func__);
@@ -433,37 +445,39 @@ static void cyberjack_write_bulk_callback (struct urb *urb)
433 length = ((priv->wrfilled - priv->wrsent) > port->bulk_out_size) ? 445 length = ((priv->wrfilled - priv->wrsent) > port->bulk_out_size) ?
434 port->bulk_out_size : (priv->wrfilled - priv->wrsent); 446 port->bulk_out_size : (priv->wrfilled - priv->wrsent);
435 447
436 memcpy (port->write_urb->transfer_buffer, priv->wrbuf + priv->wrsent, 448 memcpy(port->write_urb->transfer_buffer,
437 length ); 449 priv->wrbuf + priv->wrsent, length);
438 priv->wrsent+=length; 450 priv->wrsent += length;
439 451
440 /* set up our urb */ 452 /* set up our urb */
441 usb_fill_bulk_urb(port->write_urb, port->serial->dev, 453 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
442 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress), 454 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress),
443 port->write_urb->transfer_buffer, length, 455 port->write_urb->transfer_buffer, length,
444 ((port->serial->type->write_bulk_callback) ? 456 ((port->serial->type->write_bulk_callback) ?
445 port->serial->type->write_bulk_callback : 457 port->serial->type->write_bulk_callback :
446 cyberjack_write_bulk_callback), 458 cyberjack_write_bulk_callback),
447 port); 459 port);
448 460
449 /* send the data out the bulk port */ 461 /* send the data out the bulk port */
450 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 462 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
451 if (result) { 463 if (result) {
452 err("%s - failed submitting write urb, error %d", __func__, result); 464 err("%s - failed submitting write urb, error %d",
465 __func__, result);
453 /* Throw away data. No better idea what to do with it. */ 466 /* Throw away data. No better idea what to do with it. */
454 priv->wrfilled = 0; 467 priv->wrfilled = 0;
455 priv->wrsent = 0; 468 priv->wrsent = 0;
456 goto exit; 469 goto exit;
457 } 470 }
458 471
459 dbg("%s - priv->wrsent=%d", __func__,priv->wrsent); 472 dbg("%s - priv->wrsent=%d", __func__, priv->wrsent);
460 dbg("%s - priv->wrfilled=%d", __func__,priv->wrfilled); 473 dbg("%s - priv->wrfilled=%d", __func__, priv->wrfilled);
461 474
462 blksize = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3; 475 blksize = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;
463 476
464 if( (priv->wrsent>=priv->wrfilled) || (priv->wrsent>=blksize) ) { 477 if (priv->wrsent >= priv->wrfilled ||
478 priv->wrsent >= blksize) {
465 dbg("%s - buffer cleaned", __func__); 479 dbg("%s - buffer cleaned", __func__);
466 memset( priv->wrbuf, 0, sizeof(priv->wrbuf) ); 480 memset(priv->wrbuf, 0, sizeof(priv->wrbuf));
467 priv->wrfilled = 0; 481 priv->wrfilled = 0;
468 priv->wrsent = 0; 482 priv->wrsent = 0;
469 } 483 }
@@ -474,14 +488,14 @@ exit:
474 usb_serial_port_softint(port); 488 usb_serial_port_softint(port);
475} 489}
476 490
477static int __init cyberjack_init (void) 491static int __init cyberjack_init(void)
478{ 492{
479 int retval; 493 int retval;
480 retval = usb_serial_register(&cyberjack_device); 494 retval = usb_serial_register(&cyberjack_device);
481 if (retval) 495 if (retval)
482 goto failed_usb_serial_register; 496 goto failed_usb_serial_register;
483 retval = usb_register(&cyberjack_driver); 497 retval = usb_register(&cyberjack_driver);
484 if (retval) 498 if (retval)
485 goto failed_usb_register; 499 goto failed_usb_register;
486 500
487 info(DRIVER_VERSION " " DRIVER_AUTHOR); 501 info(DRIVER_VERSION " " DRIVER_AUTHOR);
@@ -494,18 +508,18 @@ failed_usb_serial_register:
494 return retval; 508 return retval;
495} 509}
496 510
497static void __exit cyberjack_exit (void) 511static void __exit cyberjack_exit(void)
498{ 512{
499 usb_deregister (&cyberjack_driver); 513 usb_deregister(&cyberjack_driver);
500 usb_serial_deregister (&cyberjack_device); 514 usb_serial_deregister(&cyberjack_device);
501} 515}
502 516
503module_init(cyberjack_init); 517module_init(cyberjack_init);
504module_exit(cyberjack_exit); 518module_exit(cyberjack_exit);
505 519
506MODULE_AUTHOR( DRIVER_AUTHOR ); 520MODULE_AUTHOR(DRIVER_AUTHOR);
507MODULE_DESCRIPTION( DRIVER_DESC ); 521MODULE_DESCRIPTION(DRIVER_DESC);
508MODULE_VERSION( DRIVER_VERSION ); 522MODULE_VERSION(DRIVER_VERSION);
509MODULE_LICENSE("GPL"); 523MODULE_LICENSE("GPL");
510 524
511module_param(debug, bool, S_IRUGO | S_IWUSR); 525module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index 0230d3c0888a..22837a3f2f89 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -2,7 +2,7 @@
2 * USB Cypress M8 driver 2 * USB Cypress M8 driver
3 * 3 *
4 * Copyright (C) 2004 4 * Copyright (C) 2004
5 * Lonnie Mendez (dignome@gmail.com) 5 * Lonnie Mendez (dignome@gmail.com)
6 * Copyright (C) 2003,2004 6 * Copyright (C) 2003,2004
7 * Neil Whelchel (koyama@firstlight.net) 7 * Neil Whelchel (koyama@firstlight.net)
8 * 8 *
@@ -11,19 +11,21 @@
11 * the Free Software Foundation; either version 2 of the License, or 11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version. 12 * (at your option) any later version.
13 * 13 *
14 * See Documentation/usb/usb-serial.txt for more information on using this driver 14 * See Documentation/usb/usb-serial.txt for more information on using this
15 * driver
15 * 16 *
16 * See http://geocities.com/i0xox0i for information on this driver and the 17 * See http://geocities.com/i0xox0i for information on this driver and the
17 * earthmate usb device. 18 * earthmate usb device.
18 * 19 *
19 * Lonnie Mendez <dignome@gmail.com> 20 * Lonnie Mendez <dignome@gmail.com>
20 * 4-29-2005 21 * 4-29-2005
21 * Fixed problem where setting or retreiving the serial config would fail with 22 * Fixed problem where setting or retreiving the serial config would fail
22 * EPIPE. Removed CRTS toggling so the driver behaves more like other usbserial 23 * with EPIPE. Removed CRTS toggling so the driver behaves more like
23 * adapters. Issued new interval of 1ms instead of the default 10ms. As a 24 * other usbserial adapters. Issued new interval of 1ms instead of the
24 * result, transfer speed has been substantially increased. From avg. 850bps to 25 * default 10ms. As a result, transfer speed has been substantially
25 * avg. 3300bps. initial termios has also been modified. Cleaned up code and 26 * increased from avg. 850bps to avg. 3300bps. initial termios has also
26 * formatting issues so it is more readable. Replaced the C++ style comments. 27 * been modified. Cleaned up code and formatting issues so it is more
28 * readable. Replaced the C++ style comments.
27 * 29 *
28 * Lonnie Mendez <dignome@gmail.com> 30 * Lonnie Mendez <dignome@gmail.com>
29 * 12-15-2004 31 * 12-15-2004
@@ -42,10 +44,11 @@
42 * 44 *
43 */ 45 */
44 46
45/* Thanks to Neil Whelchel for writing the first cypress m8 implementation for linux. */ 47/* Thanks to Neil Whelchel for writing the first cypress m8 implementation
48 for linux. */
46/* Thanks to cypress for providing references for the hid reports. */ 49/* Thanks to cypress for providing references for the hid reports. */
47/* Thanks to Jiang Zhang for providing links and for general help. */ 50/* Thanks to Jiang Zhang for providing links and for general help. */
48/* Code originates and was built up from ftdi_sio, belkin, pl2303 and others. */ 51/* Code originates and was built up from ftdi_sio, belkin, pl2303 and others.*/
49 52
50 53
51#include <linux/kernel.h> 54#include <linux/kernel.h>
@@ -62,7 +65,7 @@
62#include <linux/usb/serial.h> 65#include <linux/usb/serial.h>
63#include <linux/serial.h> 66#include <linux/serial.h>
64#include <linux/delay.h> 67#include <linux/delay.h>
65#include <asm/uaccess.h> 68#include <linux/uaccess.h>
66 69
67#include "cypress_m8.h" 70#include "cypress_m8.h"
68 71
@@ -112,7 +115,7 @@ static struct usb_device_id id_table_combined [] = {
112 { } /* Terminating entry */ 115 { } /* Terminating entry */
113}; 116};
114 117
115MODULE_DEVICE_TABLE (usb, id_table_combined); 118MODULE_DEVICE_TABLE(usb, id_table_combined);
116 119
117static struct usb_driver cypress_driver = { 120static struct usb_driver cypress_driver = {
118 .name = "cypress", 121 .name = "cypress",
@@ -146,11 +149,13 @@ struct cypress_private {
146 __u8 rx_flags; /* throttling - used from whiteheat/ftdi_sio */ 149 __u8 rx_flags; /* throttling - used from whiteheat/ftdi_sio */
147 enum packet_format pkt_fmt; /* format to use for packet send / receive */ 150 enum packet_format pkt_fmt; /* format to use for packet send / receive */
148 int get_cfg_unsafe; /* If true, the CYPRESS_GET_CONFIG is unsafe */ 151 int get_cfg_unsafe; /* If true, the CYPRESS_GET_CONFIG is unsafe */
149 int baud_rate; /* stores current baud rate in integer form */ 152 int baud_rate; /* stores current baud rate in
153 integer form */
150 int isthrottled; /* if throttled, discard reads */ 154 int isthrottled; /* if throttled, discard reads */
151 wait_queue_head_t delta_msr_wait; /* used for TIOCMIWAIT */ 155 wait_queue_head_t delta_msr_wait; /* used for TIOCMIWAIT */
152 char prev_status, diff_status; /* used for TIOCMIWAIT */ 156 char prev_status, diff_status; /* used for TIOCMIWAIT */
153 /* we pass a pointer to this as the arguement sent to cypress_set_termios old_termios */ 157 /* we pass a pointer to this as the arguement sent to
158 cypress_set_termios old_termios */
154 struct ktermios tmp_termios; /* stores the old termios settings */ 159 struct ktermios tmp_termios; /* stores the old termios settings */
155}; 160};
156 161
@@ -163,33 +168,41 @@ struct cypress_buf {
163}; 168};
164 169
165/* function prototypes for the Cypress USB to serial device */ 170/* function prototypes for the Cypress USB to serial device */
166static int cypress_earthmate_startup (struct usb_serial *serial); 171static int cypress_earthmate_startup(struct usb_serial *serial);
167static int cypress_hidcom_startup (struct usb_serial *serial); 172static int cypress_hidcom_startup(struct usb_serial *serial);
168static int cypress_ca42v2_startup (struct usb_serial *serial); 173static int cypress_ca42v2_startup(struct usb_serial *serial);
169static void cypress_shutdown (struct usb_serial *serial); 174static void cypress_shutdown(struct usb_serial *serial);
170static int cypress_open (struct usb_serial_port *port, struct file *filp); 175static int cypress_open(struct tty_struct *tty,
171static void cypress_close (struct usb_serial_port *port, struct file *filp); 176 struct usb_serial_port *port, struct file *filp);
172static int cypress_write (struct usb_serial_port *port, const unsigned char *buf, int count); 177static void cypress_close(struct tty_struct *tty,
173static void cypress_send (struct usb_serial_port *port); 178 struct usb_serial_port *port, struct file *filp);
174static int cypress_write_room (struct usb_serial_port *port); 179static int cypress_write(struct tty_struct *tty, struct usb_serial_port *port,
175static int cypress_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); 180 const unsigned char *buf, int count);
176static void cypress_set_termios (struct usb_serial_port *port, struct ktermios * old); 181static void cypress_send(struct usb_serial_port *port);
177static int cypress_tiocmget (struct usb_serial_port *port, struct file *file); 182static int cypress_write_room(struct tty_struct *tty);
178static int cypress_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); 183static int cypress_ioctl(struct tty_struct *tty, struct file *file,
179static int cypress_chars_in_buffer (struct usb_serial_port *port); 184 unsigned int cmd, unsigned long arg);
180static void cypress_throttle (struct usb_serial_port *port); 185static void cypress_set_termios(struct tty_struct *tty,
181static void cypress_unthrottle (struct usb_serial_port *port); 186 struct usb_serial_port *port, struct ktermios *old);
182static void cypress_set_dead (struct usb_serial_port *port); 187static int cypress_tiocmget(struct tty_struct *tty, struct file *file);
183static void cypress_read_int_callback (struct urb *urb); 188static int cypress_tiocmset(struct tty_struct *tty, struct file *file,
184static void cypress_write_int_callback (struct urb *urb); 189 unsigned int set, unsigned int clear);
190static int cypress_chars_in_buffer(struct tty_struct *tty);
191static void cypress_throttle(struct tty_struct *tty);
192static void cypress_unthrottle(struct tty_struct *tty);
193static void cypress_set_dead(struct usb_serial_port *port);
194static void cypress_read_int_callback(struct urb *urb);
195static void cypress_write_int_callback(struct urb *urb);
185/* write buffer functions */ 196/* write buffer functions */
186static struct cypress_buf *cypress_buf_alloc(unsigned int size); 197static struct cypress_buf *cypress_buf_alloc(unsigned int size);
187static void cypress_buf_free(struct cypress_buf *cb); 198static void cypress_buf_free(struct cypress_buf *cb);
188static void cypress_buf_clear(struct cypress_buf *cb); 199static void cypress_buf_clear(struct cypress_buf *cb);
189static unsigned int cypress_buf_data_avail(struct cypress_buf *cb); 200static unsigned int cypress_buf_data_avail(struct cypress_buf *cb);
190static unsigned int cypress_buf_space_avail(struct cypress_buf *cb); 201static unsigned int cypress_buf_space_avail(struct cypress_buf *cb);
191static unsigned int cypress_buf_put(struct cypress_buf *cb, const char *buf, unsigned int count); 202static unsigned int cypress_buf_put(struct cypress_buf *cb,
192static unsigned int cypress_buf_get(struct cypress_buf *cb, char *buf, unsigned int count); 203 const char *buf, unsigned int count);
204static unsigned int cypress_buf_get(struct cypress_buf *cb,
205 char *buf, unsigned int count);
193 206
194 207
195static struct usb_serial_driver cypress_earthmate_device = { 208static struct usb_serial_driver cypress_earthmate_device = {
@@ -247,7 +260,7 @@ static struct usb_serial_driver cypress_hidcom_device = {
247static struct usb_serial_driver cypress_ca42v2_device = { 260static struct usb_serial_driver cypress_ca42v2_device = {
248 .driver = { 261 .driver = {
249 .owner = THIS_MODULE, 262 .owner = THIS_MODULE,
250 .name = "nokiaca42v2", 263 .name = "nokiaca42v2",
251 }, 264 },
252 .description = "Nokia CA-42 V2 Adapter", 265 .description = "Nokia CA-42 V2 Adapter",
253 .usb_driver = &cypress_driver, 266 .usb_driver = &cypress_driver,
@@ -322,8 +335,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
322 335
323 336
324/* This function can either set or retrieve the current serial line settings */ 337/* This function can either set or retrieve the current serial line settings */
325static int cypress_serial_control (struct usb_serial_port *port, speed_t baud_rate, int data_bits, int stop_bits, 338static int cypress_serial_control(struct tty_struct *tty,
326 int parity_enable, int parity_type, int reset, int cypress_request_type) 339 struct usb_serial_port *port, speed_t baud_rate, int data_bits,
340 int stop_bits, int parity_enable, int parity_type, int reset,
341 int cypress_request_type)
327{ 342{
328 int new_baudrate = 0, retval = 0, tries = 0; 343 int new_baudrate = 0, retval = 0, tries = 0;
329 struct cypress_private *priv; 344 struct cypress_private *priv;
@@ -331,111 +346,114 @@ static int cypress_serial_control (struct usb_serial_port *port, speed_t baud_ra
331 unsigned long flags; 346 unsigned long flags;
332 347
333 dbg("%s", __func__); 348 dbg("%s", __func__);
334 349
335 priv = usb_get_serial_port_data(port); 350 priv = usb_get_serial_port_data(port);
336 351
337 if (!priv->comm_is_ok) 352 if (!priv->comm_is_ok)
338 return -ENODEV; 353 return -ENODEV;
339 354
340 switch(cypress_request_type) { 355 switch (cypress_request_type) {
341 case CYPRESS_SET_CONFIG: 356 case CYPRESS_SET_CONFIG:
357 new_baudrate = priv->baud_rate;
358 /* 0 means 'Hang up' so doesn't change the true bit rate */
359 if (baud_rate == 0)
342 new_baudrate = priv->baud_rate; 360 new_baudrate = priv->baud_rate;
343 /* 0 means 'Hang up' so doesn't change the true bit rate */ 361 /* Change of speed ? */
344 if (baud_rate == 0) 362 else if (baud_rate != priv->baud_rate) {
345 new_baudrate = priv->baud_rate; 363 dbg("%s - baud rate is changing", __func__);
346 /* Change of speed ? */ 364 retval = analyze_baud_rate(port, baud_rate);
347 else if (baud_rate != priv->baud_rate) { 365 if (retval >= 0) {
348 dbg("%s - baud rate is changing", __func__); 366 new_baudrate = retval;
349 retval = analyze_baud_rate(port, baud_rate); 367 dbg("%s - New baud rate set to %d",
350 if (retval >= 0) { 368 __func__, new_baudrate);
351 new_baudrate = retval;
352 dbg("%s - New baud rate set to %d",
353 __func__, new_baudrate);
354 }
355 }
356 dbg("%s - baud rate is being sent as %d", __func__, new_baudrate);
357
358 memset(feature_buffer, 0, sizeof(feature_buffer));
359 /* fill the feature_buffer with new configuration */
360 *((u_int32_t *)feature_buffer) = new_baudrate;
361
362 feature_buffer[4] |= data_bits; /* assign data bits in 2 bit space ( max 3 ) */
363 /* 1 bit gap */
364 feature_buffer[4] |= (stop_bits << 3); /* assign stop bits in 1 bit space */
365 feature_buffer[4] |= (parity_enable << 4); /* assign parity flag in 1 bit space */
366 feature_buffer[4] |= (parity_type << 5); /* assign parity type in 1 bit space */
367 /* 1 bit gap */
368 feature_buffer[4] |= (reset << 7); /* assign reset at end of byte, 1 bit space */
369
370 dbg("%s - device is being sent this feature report:", __func__);
371 dbg("%s - %02X - %02X - %02X - %02X - %02X", __func__, feature_buffer[0], feature_buffer[1],
372 feature_buffer[2], feature_buffer[3], feature_buffer[4]);
373
374 do {
375 retval = usb_control_msg(port->serial->dev,
376 usb_sndctrlpipe(port->serial->dev, 0),
377 HID_REQ_SET_REPORT,
378 USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
379 0x0300, 0, feature_buffer,
380 sizeof(feature_buffer), 500);
381
382 if (tries++ >= 3)
383 break;
384
385 } while (retval != sizeof(feature_buffer) &&
386 retval != -ENODEV);
387
388 if (retval != sizeof(feature_buffer)) {
389 err("%s - failed sending serial line settings - %d", __func__, retval);
390 cypress_set_dead(port);
391 } else {
392 spin_lock_irqsave(&priv->lock, flags);
393 priv->baud_rate = new_baudrate;
394 priv->current_config = feature_buffer[4];
395 spin_unlock_irqrestore(&priv->lock, flags);
396 /* If we asked for a speed change encode it */
397 if (baud_rate)
398 tty_encode_baud_rate(port->tty,
399 new_baudrate, new_baudrate);
400 }
401 break;
402 case CYPRESS_GET_CONFIG:
403 if (priv->get_cfg_unsafe) {
404 /* Not implemented for this device,
405 and if we try to do it we're likely
406 to crash the hardware. */
407 return -ENOTTY;
408 }
409 dbg("%s - retreiving serial line settings", __func__);
410 /* set initial values in feature buffer */
411 memset(feature_buffer, 0, sizeof(feature_buffer));
412
413 do {
414 retval = usb_control_msg(port->serial->dev,
415 usb_rcvctrlpipe(port->serial->dev, 0),
416 HID_REQ_GET_REPORT,
417 USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
418 0x0300, 0, feature_buffer,
419 sizeof(feature_buffer), 500);
420
421 if (tries++ >= 3)
422 break;
423
424 } while (retval != sizeof(feature_buffer) &&
425 retval != -ENODEV);
426
427 if (retval != sizeof(feature_buffer)) {
428 err("%s - failed to retrieve serial line settings - %d", __func__, retval);
429 cypress_set_dead(port);
430 return retval;
431 } else {
432 spin_lock_irqsave(&priv->lock, flags);
433
434 /* store the config in one byte, and later use bit masks to check values */
435 priv->current_config = feature_buffer[4];
436 priv->baud_rate = *((u_int32_t *)feature_buffer);
437 spin_unlock_irqrestore(&priv->lock, flags);
438 } 369 }
370 }
371 dbg("%s - baud rate is being sent as %d",
372 __func__, new_baudrate);
373
374 memset(feature_buffer, 0, sizeof(feature_buffer));
375 /* fill the feature_buffer with new configuration */
376 *((u_int32_t *)feature_buffer) = new_baudrate;
377 feature_buffer[4] |= data_bits; /* assign data bits in 2 bit space ( max 3 ) */
378 /* 1 bit gap */
379 feature_buffer[4] |= (stop_bits << 3); /* assign stop bits in 1 bit space */
380 feature_buffer[4] |= (parity_enable << 4); /* assign parity flag in 1 bit space */
381 feature_buffer[4] |= (parity_type << 5); /* assign parity type in 1 bit space */
382 /* 1 bit gap */
383 feature_buffer[4] |= (reset << 7); /* assign reset at end of byte, 1 bit space */
384
385 dbg("%s - device is being sent this feature report:",
386 __func__);
387 dbg("%s - %02X - %02X - %02X - %02X - %02X", __func__,
388 feature_buffer[0], feature_buffer[1],
389 feature_buffer[2], feature_buffer[3],
390 feature_buffer[4]);
391
392 do {
393 retval = usb_control_msg(port->serial->dev,
394 usb_sndctrlpipe(port->serial->dev, 0),
395 HID_REQ_SET_REPORT,
396 USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
397 0x0300, 0, feature_buffer,
398 sizeof(feature_buffer), 500);
399
400 if (tries++ >= 3)
401 break;
402
403 } while (retval != sizeof(feature_buffer) &&
404 retval != -ENODEV);
405
406 if (retval != sizeof(feature_buffer)) {
407 err("%s - failed sending serial line settings - %d",
408 __func__, retval);
409 cypress_set_dead(port);
410 } else {
411 spin_lock_irqsave(&priv->lock, flags);
412 priv->baud_rate = new_baudrate;
413 priv->current_config = feature_buffer[4];
414 spin_unlock_irqrestore(&priv->lock, flags);
415 /* If we asked for a speed change encode it */
416 if (baud_rate)
417 tty_encode_baud_rate(tty,
418 new_baudrate, new_baudrate);
419 }
420 break;
421 case CYPRESS_GET_CONFIG:
422 if (priv->get_cfg_unsafe) {
423 /* Not implemented for this device,
424 and if we try to do it we're likely
425 to crash the hardware. */
426 return -ENOTTY;
427 }
428 dbg("%s - retreiving serial line settings", __func__);
429 /* set initial values in feature buffer */
430 memset(feature_buffer, 0, sizeof(feature_buffer));
431
432 do {
433 retval = usb_control_msg(port->serial->dev,
434 usb_rcvctrlpipe(port->serial->dev, 0),
435 HID_REQ_GET_REPORT,
436 USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
437 0x0300, 0, feature_buffer,
438 sizeof(feature_buffer), 500);
439
440 if (tries++ >= 3)
441 break;
442 } while (retval != sizeof(feature_buffer)
443 && retval != -ENODEV);
444
445 if (retval != sizeof(feature_buffer)) {
446 err("%s - failed to retrieve serial line settings - %d", __func__, retval);
447 cypress_set_dead(port);
448 return retval;
449 } else {
450 spin_lock_irqsave(&priv->lock, flags);
451 /* store the config in one byte, and later
452 use bit masks to check values */
453 priv->current_config = feature_buffer[4];
454 priv->baud_rate = *((u_int32_t *)feature_buffer);
455 spin_unlock_irqrestore(&priv->lock, flags);
456 }
439 } 457 }
440 spin_lock_irqsave(&priv->lock, flags); 458 spin_lock_irqsave(&priv->lock, flags);
441 ++priv->cmd_count; 459 ++priv->cmd_count;
@@ -468,14 +486,14 @@ static void cypress_set_dead(struct usb_serial_port *port)
468 *****************************************************************************/ 486 *****************************************************************************/
469 487
470 488
471static int generic_startup (struct usb_serial *serial) 489static int generic_startup(struct usb_serial *serial)
472{ 490{
473 struct cypress_private *priv; 491 struct cypress_private *priv;
474 struct usb_serial_port *port = serial->port[0]; 492 struct usb_serial_port *port = serial->port[0];
475 493
476 dbg("%s - port %d", __func__, port->number); 494 dbg("%s - port %d", __func__, port->number);
477 495
478 priv = kzalloc(sizeof (struct cypress_private), GFP_KERNEL); 496 priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL);
479 if (!priv) 497 if (!priv)
480 return -ENOMEM; 498 return -ENOMEM;
481 499
@@ -487,9 +505,9 @@ static int generic_startup (struct usb_serial *serial)
487 return -ENOMEM; 505 return -ENOMEM;
488 } 506 }
489 init_waitqueue_head(&priv->delta_msr_wait); 507 init_waitqueue_head(&priv->delta_msr_wait);
490 508
491 usb_reset_configuration (serial->dev); 509 usb_reset_configuration(serial->dev);
492 510
493 priv->cmd_ctrl = 0; 511 priv->cmd_ctrl = 0;
494 priv->line_control = 0; 512 priv->line_control = 0;
495 priv->termios_initialized = 0; 513 priv->termios_initialized = 0;
@@ -500,30 +518,30 @@ static int generic_startup (struct usb_serial *serial)
500 small. Otherwise we can use the slightly more compact 518 small. Otherwise we can use the slightly more compact
501 format. This is in accordance with the cypress_m8 serial 519 format. This is in accordance with the cypress_m8 serial
502 converter app note. */ 520 converter app note. */
503 if (port->interrupt_out_size > 9) { 521 if (port->interrupt_out_size > 9)
504 priv->pkt_fmt = packet_format_1; 522 priv->pkt_fmt = packet_format_1;
505 } else { 523 else
506 priv->pkt_fmt = packet_format_2; 524 priv->pkt_fmt = packet_format_2;
507 } 525
508 if (interval > 0) { 526 if (interval > 0) {
509 priv->write_urb_interval = interval; 527 priv->write_urb_interval = interval;
510 priv->read_urb_interval = interval; 528 priv->read_urb_interval = interval;
511 dbg("%s - port %d read & write intervals forced to %d", 529 dbg("%s - port %d read & write intervals forced to %d",
512 __func__,port->number,interval); 530 __func__, port->number, interval);
513 } else { 531 } else {
514 priv->write_urb_interval = port->interrupt_out_urb->interval; 532 priv->write_urb_interval = port->interrupt_out_urb->interval;
515 priv->read_urb_interval = port->interrupt_in_urb->interval; 533 priv->read_urb_interval = port->interrupt_in_urb->interval;
516 dbg("%s - port %d intervals: read=%d write=%d", 534 dbg("%s - port %d intervals: read=%d write=%d",
517 __func__,port->number, 535 __func__, port->number,
518 priv->read_urb_interval,priv->write_urb_interval); 536 priv->read_urb_interval, priv->write_urb_interval);
519 } 537 }
520 usb_set_serial_port_data(port, priv); 538 usb_set_serial_port_data(port, priv);
521 539
522 return 0; 540 return 0;
523} 541}
524 542
525 543
526static int cypress_earthmate_startup (struct usb_serial *serial) 544static int cypress_earthmate_startup(struct usb_serial *serial)
527{ 545{
528 struct cypress_private *priv; 546 struct cypress_private *priv;
529 struct usb_serial_port *port = serial->port[0]; 547 struct usb_serial_port *port = serial->port[0];
@@ -541,7 +559,8 @@ static int cypress_earthmate_startup (struct usb_serial *serial)
541 /* All Earthmate devices use the separated-count packet 559 /* All Earthmate devices use the separated-count packet
542 format! Idiotic. */ 560 format! Idiotic. */
543 priv->pkt_fmt = packet_format_1; 561 priv->pkt_fmt = packet_format_1;
544 if (serial->dev->descriptor.idProduct != cpu_to_le16(PRODUCT_ID_EARTHMATEUSB)) { 562 if (serial->dev->descriptor.idProduct !=
563 cpu_to_le16(PRODUCT_ID_EARTHMATEUSB)) {
545 /* The old original USB Earthmate seemed able to 564 /* The old original USB Earthmate seemed able to
546 handle GET_CONFIG requests; everything they've 565 handle GET_CONFIG requests; everything they've
547 produced since that time crashes if this command is 566 produced since that time crashes if this command is
@@ -555,7 +574,7 @@ static int cypress_earthmate_startup (struct usb_serial *serial)
555} /* cypress_earthmate_startup */ 574} /* cypress_earthmate_startup */
556 575
557 576
558static int cypress_hidcom_startup (struct usb_serial *serial) 577static int cypress_hidcom_startup(struct usb_serial *serial)
559{ 578{
560 struct cypress_private *priv; 579 struct cypress_private *priv;
561 580
@@ -569,12 +588,12 @@ static int cypress_hidcom_startup (struct usb_serial *serial)
569 588
570 priv = usb_get_serial_port_data(serial->port[0]); 589 priv = usb_get_serial_port_data(serial->port[0]);
571 priv->chiptype = CT_CYPHIDCOM; 590 priv->chiptype = CT_CYPHIDCOM;
572 591
573 return 0; 592 return 0;
574} /* cypress_hidcom_startup */ 593} /* cypress_hidcom_startup */
575 594
576 595
577static int cypress_ca42v2_startup (struct usb_serial *serial) 596static int cypress_ca42v2_startup(struct usb_serial *serial)
578{ 597{
579 struct cypress_private *priv; 598 struct cypress_private *priv;
580 599
@@ -593,11 +612,11 @@ static int cypress_ca42v2_startup (struct usb_serial *serial)
593} /* cypress_ca42v2_startup */ 612} /* cypress_ca42v2_startup */
594 613
595 614
596static void cypress_shutdown (struct usb_serial *serial) 615static void cypress_shutdown(struct usb_serial *serial)
597{ 616{
598 struct cypress_private *priv; 617 struct cypress_private *priv;
599 618
600 dbg ("%s - port %d", __func__, serial->port[0]->number); 619 dbg("%s - port %d", __func__, serial->port[0]->number);
601 620
602 /* all open ports are closed at this point */ 621 /* all open ports are closed at this point */
603 622
@@ -611,7 +630,8 @@ static void cypress_shutdown (struct usb_serial *serial)
611} 630}
612 631
613 632
614static int cypress_open (struct usb_serial_port *port, struct file *filp) 633static int cypress_open(struct tty_struct *tty,
634 struct usb_serial_port *port, struct file *filp)
615{ 635{
616 struct cypress_private *priv = usb_get_serial_port_data(port); 636 struct cypress_private *priv = usb_get_serial_port_data(port);
617 struct usb_serial *serial = port->serial; 637 struct usb_serial *serial = port->serial;
@@ -636,37 +656,44 @@ static int cypress_open (struct usb_serial_port *port, struct file *filp)
636 spin_unlock_irqrestore(&priv->lock, flags); 656 spin_unlock_irqrestore(&priv->lock, flags);
637 657
638 /* setting to zero could cause data loss */ 658 /* setting to zero could cause data loss */
639 port->tty->low_latency = 1; 659 if (tty)
660 tty->low_latency = 1;
640 661
641 /* raise both lines and set termios */ 662 /* raise both lines and set termios */
642 spin_lock_irqsave(&priv->lock, flags); 663 spin_lock_irqsave(&priv->lock, flags);
643 priv->line_control = CONTROL_DTR | CONTROL_RTS; 664 priv->line_control = CONTROL_DTR | CONTROL_RTS;
644 priv->cmd_ctrl = 1; 665 priv->cmd_ctrl = 1;
645 spin_unlock_irqrestore(&priv->lock, flags); 666 spin_unlock_irqrestore(&priv->lock, flags);
646 result = cypress_write(port, NULL, 0); 667 result = cypress_write(tty, port, NULL, 0);
647 668
648 if (result) { 669 if (result) {
649 dev_err(&port->dev, "%s - failed setting the control lines - error %d\n", __func__, result); 670 dev_err(&port->dev,
671 "%s - failed setting the control lines - error %d\n",
672 __func__, result);
650 return result; 673 return result;
651 } else 674 } else
652 dbg("%s - success setting the control lines", __func__); 675 dbg("%s - success setting the control lines", __func__);
653 676
654 cypress_set_termios(port, &priv->tmp_termios); 677 if (tty)
678 cypress_set_termios(tty, port, &priv->tmp_termios);
655 679
656 /* setup the port and start reading from the device */ 680 /* setup the port and start reading from the device */
657 if(!port->interrupt_in_urb){ 681 if (!port->interrupt_in_urb) {
658 err("%s - interrupt_in_urb is empty!", __func__); 682 err("%s - interrupt_in_urb is empty!", __func__);
659 return(-1); 683 return -1;
660 } 684 }
661 685
662 usb_fill_int_urb(port->interrupt_in_urb, serial->dev, 686 usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
663 usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), 687 usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
664 port->interrupt_in_urb->transfer_buffer, port->interrupt_in_urb->transfer_buffer_length, 688 port->interrupt_in_urb->transfer_buffer,
689 port->interrupt_in_urb->transfer_buffer_length,
665 cypress_read_int_callback, port, priv->read_urb_interval); 690 cypress_read_int_callback, port, priv->read_urb_interval);
666 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 691 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
667 692
668 if (result){ 693 if (result) {
669 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 694 dev_err(&port->dev,
695 "%s - failed submitting read urb, error %d\n",
696 __func__, result);
670 cypress_set_dead(port); 697 cypress_set_dead(port);
671 } 698 }
672 699
@@ -674,7 +701,8 @@ static int cypress_open (struct usb_serial_port *port, struct file *filp)
674} /* cypress_open */ 701} /* cypress_open */
675 702
676 703
677static void cypress_close(struct usb_serial_port *port, struct file * filp) 704static void cypress_close(struct tty_struct *tty,
705 struct usb_serial_port *port, struct file *filp)
678{ 706{
679 struct cypress_private *priv = usb_get_serial_port_data(port); 707 struct cypress_private *priv = usb_get_serial_port_data(port);
680 unsigned int c_cflag; 708 unsigned int c_cflag;
@@ -688,7 +716,7 @@ static void cypress_close(struct usb_serial_port *port, struct file * filp)
688 spin_lock_irq(&priv->lock); 716 spin_lock_irq(&priv->lock);
689 timeout = CYPRESS_CLOSING_WAIT; 717 timeout = CYPRESS_CLOSING_WAIT;
690 init_waitqueue_entry(&wait, current); 718 init_waitqueue_entry(&wait, current);
691 add_wait_queue(&port->tty->write_wait, &wait); 719 add_wait_queue(&tty->write_wait, &wait);
692 for (;;) { 720 for (;;) {
693 set_current_state(TASK_INTERRUPTIBLE); 721 set_current_state(TASK_INTERRUPTIBLE);
694 if (cypress_buf_data_avail(priv->buf) == 0 722 if (cypress_buf_data_avail(priv->buf) == 0
@@ -701,7 +729,7 @@ static void cypress_close(struct usb_serial_port *port, struct file * filp)
701 spin_lock_irq(&priv->lock); 729 spin_lock_irq(&priv->lock);
702 } 730 }
703 set_current_state(TASK_RUNNING); 731 set_current_state(TASK_RUNNING);
704 remove_wait_queue(&port->tty->write_wait, &wait); 732 remove_wait_queue(&tty->write_wait, &wait);
705 /* clear out any remaining data in the buffer */ 733 /* clear out any remaining data in the buffer */
706 cypress_buf_clear(priv->buf); 734 cypress_buf_clear(priv->buf);
707 spin_unlock_irq(&priv->lock); 735 spin_unlock_irq(&priv->lock);
@@ -713,19 +741,21 @@ static void cypress_close(struct usb_serial_port *port, struct file * filp)
713 return; 741 return;
714 } 742 }
715 /* wait for characters to drain from device */ 743 /* wait for characters to drain from device */
716 bps = tty_get_baud_rate(port->tty); 744 if (tty) {
717 if (bps > 1200) 745 bps = tty_get_baud_rate(tty);
718 timeout = max((HZ*2560)/bps,HZ/10); 746 if (bps > 1200)
719 else 747 timeout = max((HZ * 2560) / bps, HZ / 10);
720 timeout = 2*HZ; 748 else
721 schedule_timeout_interruptible(timeout); 749 timeout = 2 * HZ;
750 schedule_timeout_interruptible(timeout);
751 }
722 752
723 dbg("%s - stopping urbs", __func__); 753 dbg("%s - stopping urbs", __func__);
724 usb_kill_urb (port->interrupt_in_urb); 754 usb_kill_urb(port->interrupt_in_urb);
725 usb_kill_urb (port->interrupt_out_urb); 755 usb_kill_urb(port->interrupt_out_urb);
726 756
727 if (port->tty) { 757 if (tty) {
728 c_cflag = port->tty->termios->c_cflag; 758 c_cflag = tty->termios->c_cflag;
729 if (c_cflag & HUPCL) { 759 if (c_cflag & HUPCL) {
730 /* drop dtr and rts */ 760 /* drop dtr and rts */
731 priv = usb_get_serial_port_data(port); 761 priv = usb_get_serial_port_data(port);
@@ -733,22 +763,23 @@ static void cypress_close(struct usb_serial_port *port, struct file * filp)
733 priv->line_control = 0; 763 priv->line_control = 0;
734 priv->cmd_ctrl = 1; 764 priv->cmd_ctrl = 1;
735 spin_unlock_irq(&priv->lock); 765 spin_unlock_irq(&priv->lock);
736 cypress_write(port, NULL, 0); 766 cypress_write(tty, port, NULL, 0);
737 } 767 }
738 } 768 }
739 769
740 if (stats) 770 if (stats)
741 dev_info (&port->dev, "Statistics: %d Bytes In | %d Bytes Out | %d Commands Issued\n", 771 dev_info(&port->dev, "Statistics: %d Bytes In | %d Bytes Out | %d Commands Issued\n",
742 priv->bytes_in, priv->bytes_out, priv->cmd_count); 772 priv->bytes_in, priv->bytes_out, priv->cmd_count);
743 mutex_unlock(&port->serial->disc_mutex); 773 mutex_unlock(&port->serial->disc_mutex);
744} /* cypress_close */ 774} /* cypress_close */
745 775
746 776
747static int cypress_write(struct usb_serial_port *port, const unsigned char *buf, int count) 777static int cypress_write(struct tty_struct *tty, struct usb_serial_port *port,
778 const unsigned char *buf, int count)
748{ 779{
749 struct cypress_private *priv = usb_get_serial_port_data(port); 780 struct cypress_private *priv = usb_get_serial_port_data(port);
750 unsigned long flags; 781 unsigned long flags;
751 782
752 dbg("%s - port %d, %d bytes", __func__, port->number, count); 783 dbg("%s - port %d, %d bytes", __func__, port->number, count);
753 784
754 /* line control commands, which need to be executed immediately, 785 /* line control commands, which need to be executed immediately,
@@ -758,10 +789,10 @@ static int cypress_write(struct usb_serial_port *port, const unsigned char *buf,
758 count = 0; 789 count = 0;
759 goto finish; 790 goto finish;
760 } 791 }
761 792
762 if (!count) 793 if (!count)
763 return count; 794 return count;
764 795
765 spin_lock_irqsave(&priv->lock, flags); 796 spin_lock_irqsave(&priv->lock, flags);
766 count = cypress_buf_put(priv->buf, buf, count); 797 count = cypress_buf_put(priv->buf, buf, count);
767 spin_unlock_irqrestore(&priv->lock, flags); 798 spin_unlock_irqrestore(&priv->lock, flags);
@@ -778,13 +809,14 @@ static void cypress_send(struct usb_serial_port *port)
778 int count = 0, result, offset, actual_size; 809 int count = 0, result, offset, actual_size;
779 struct cypress_private *priv = usb_get_serial_port_data(port); 810 struct cypress_private *priv = usb_get_serial_port_data(port);
780 unsigned long flags; 811 unsigned long flags;
781 812
782 if (!priv->comm_is_ok) 813 if (!priv->comm_is_ok)
783 return; 814 return;
784 815
785 dbg("%s - port %d", __func__, port->number); 816 dbg("%s - port %d", __func__, port->number);
786 dbg("%s - interrupt out size is %d", __func__, port->interrupt_out_size); 817 dbg("%s - interrupt out size is %d", __func__,
787 818 port->interrupt_out_size);
819
788 spin_lock_irqsave(&priv->lock, flags); 820 spin_lock_irqsave(&priv->lock, flags);
789 if (priv->write_urb_in_use) { 821 if (priv->write_urb_in_use) {
790 dbg("%s - can't write, urb in use", __func__); 822 dbg("%s - can't write, urb in use", __func__);
@@ -794,7 +826,8 @@ static void cypress_send(struct usb_serial_port *port)
794 spin_unlock_irqrestore(&priv->lock, flags); 826 spin_unlock_irqrestore(&priv->lock, flags);
795 827
796 /* clear buffer */ 828 /* clear buffer */
797 memset(port->interrupt_out_urb->transfer_buffer, 0, port->interrupt_out_size); 829 memset(port->interrupt_out_urb->transfer_buffer, 0,
830 port->interrupt_out_size);
798 831
799 spin_lock_irqsave(&priv->lock, flags); 832 spin_lock_irqsave(&priv->lock, flags);
800 switch (priv->pkt_fmt) { 833 switch (priv->pkt_fmt) {
@@ -825,9 +858,8 @@ static void cypress_send(struct usb_serial_port *port)
825 count = cypress_buf_get(priv->buf, &port->interrupt_out_buffer[offset], 858 count = cypress_buf_get(priv->buf, &port->interrupt_out_buffer[offset],
826 port->interrupt_out_size-offset); 859 port->interrupt_out_size-offset);
827 860
828 if (count == 0) { 861 if (count == 0)
829 return; 862 return;
830 }
831 863
832 switch (priv->pkt_fmt) { 864 switch (priv->pkt_fmt) {
833 default: 865 default:
@@ -851,26 +883,29 @@ send:
851 actual_size = count + 883 actual_size = count +
852 (priv->pkt_fmt == packet_format_1 ? 2 : 1); 884 (priv->pkt_fmt == packet_format_1 ? 2 : 1);
853 885
854 usb_serial_debug_data(debug, &port->dev, __func__, port->interrupt_out_size, 886 usb_serial_debug_data(debug, &port->dev, __func__,
855 port->interrupt_out_urb->transfer_buffer); 887 port->interrupt_out_size,
888 port->interrupt_out_urb->transfer_buffer);
856 889
857 usb_fill_int_urb(port->interrupt_out_urb, port->serial->dev, 890 usb_fill_int_urb(port->interrupt_out_urb, port->serial->dev,
858 usb_sndintpipe(port->serial->dev, port->interrupt_out_endpointAddress), 891 usb_sndintpipe(port->serial->dev, port->interrupt_out_endpointAddress),
859 port->interrupt_out_buffer, port->interrupt_out_size, 892 port->interrupt_out_buffer, port->interrupt_out_size,
860 cypress_write_int_callback, port, priv->write_urb_interval); 893 cypress_write_int_callback, port, priv->write_urb_interval);
861 result = usb_submit_urb (port->interrupt_out_urb, GFP_ATOMIC); 894 result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC);
862 if (result) { 895 if (result) {
863 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, 896 dev_err(&port->dev,
864 result); 897 "%s - failed submitting write urb, error %d\n",
898 __func__, result);
865 priv->write_urb_in_use = 0; 899 priv->write_urb_in_use = 0;
866 cypress_set_dead(port); 900 cypress_set_dead(port);
867 } 901 }
868 902
869 spin_lock_irqsave(&priv->lock, flags); 903 spin_lock_irqsave(&priv->lock, flags);
870 if (priv->cmd_ctrl) { 904 if (priv->cmd_ctrl)
871 priv->cmd_ctrl = 0; 905 priv->cmd_ctrl = 0;
872 } 906
873 priv->bytes_out += count; /* do not count the line control and size bytes */ 907 /* do not count the line control and size bytes */
908 priv->bytes_out += count;
874 spin_unlock_irqrestore(&priv->lock, flags); 909 spin_unlock_irqrestore(&priv->lock, flags);
875 910
876 usb_serial_port_softint(port); 911 usb_serial_port_softint(port);
@@ -878,8 +913,9 @@ send:
878 913
879 914
880/* returns how much space is available in the soft buffer */ 915/* returns how much space is available in the soft buffer */
881static int cypress_write_room(struct usb_serial_port *port) 916static int cypress_write_room(struct tty_struct *tty)
882{ 917{
918 struct usb_serial_port *port = tty->driver_data;
883 struct cypress_private *priv = usb_get_serial_port_data(port); 919 struct cypress_private *priv = usb_get_serial_port_data(port);
884 int room = 0; 920 int room = 0;
885 unsigned long flags; 921 unsigned long flags;
@@ -895,13 +931,14 @@ static int cypress_write_room(struct usb_serial_port *port)
895} 931}
896 932
897 933
898static int cypress_tiocmget (struct usb_serial_port *port, struct file *file) 934static int cypress_tiocmget(struct tty_struct *tty, struct file *file)
899{ 935{
936 struct usb_serial_port *port = tty->driver_data;
900 struct cypress_private *priv = usb_get_serial_port_data(port); 937 struct cypress_private *priv = usb_get_serial_port_data(port);
901 __u8 status, control; 938 __u8 status, control;
902 unsigned int result = 0; 939 unsigned int result = 0;
903 unsigned long flags; 940 unsigned long flags;
904 941
905 dbg("%s - port %d", __func__, port->number); 942 dbg("%s - port %d", __func__, port->number);
906 943
907 spin_lock_irqsave(&priv->lock, flags); 944 spin_lock_irqsave(&priv->lock, flags);
@@ -922,12 +959,13 @@ static int cypress_tiocmget (struct usb_serial_port *port, struct file *file)
922} 959}
923 960
924 961
925static int cypress_tiocmset (struct usb_serial_port *port, struct file *file, 962static int cypress_tiocmset(struct tty_struct *tty, struct file *file,
926 unsigned int set, unsigned int clear) 963 unsigned int set, unsigned int clear)
927{ 964{
965 struct usb_serial_port *port = tty->driver_data;
928 struct cypress_private *priv = usb_get_serial_port_data(port); 966 struct cypress_private *priv = usb_get_serial_port_data(port);
929 unsigned long flags; 967 unsigned long flags;
930 968
931 dbg("%s - port %d", __func__, port->number); 969 dbg("%s - port %d", __func__, port->number);
932 970
933 spin_lock_irqsave(&priv->lock, flags); 971 spin_lock_irqsave(&priv->lock, flags);
@@ -942,63 +980,60 @@ static int cypress_tiocmset (struct usb_serial_port *port, struct file *file,
942 priv->cmd_ctrl = 1; 980 priv->cmd_ctrl = 1;
943 spin_unlock_irqrestore(&priv->lock, flags); 981 spin_unlock_irqrestore(&priv->lock, flags);
944 982
945 return cypress_write(port, NULL, 0); 983 return cypress_write(tty, port, NULL, 0);
946} 984}
947 985
948 986
949static int cypress_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) 987static int cypress_ioctl(struct tty_struct *tty, struct file *file,
988 unsigned int cmd, unsigned long arg)
950{ 989{
990 struct usb_serial_port *port = tty->driver_data;
951 struct cypress_private *priv = usb_get_serial_port_data(port); 991 struct cypress_private *priv = usb_get_serial_port_data(port);
952 992
953 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd); 993 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd);
954 994
955 switch (cmd) { 995 switch (cmd) {
956 /* This code comes from drivers/char/serial.c and ftdi_sio.c */ 996 /* This code comes from drivers/char/serial.c and ftdi_sio.c */
957 case TIOCMIWAIT: 997 case TIOCMIWAIT:
958 while (priv != NULL) { 998 while (priv != NULL) {
959 interruptible_sleep_on(&priv->delta_msr_wait); 999 interruptible_sleep_on(&priv->delta_msr_wait);
960 /* see if a signal did it */ 1000 /* see if a signal did it */
961 if (signal_pending(current)) 1001 if (signal_pending(current))
962 return -ERESTARTSYS; 1002 return -ERESTARTSYS;
963 else { 1003 else {
964 char diff = priv->diff_status; 1004 char diff = priv->diff_status;
965 1005 if (diff == 0)
966 if (diff == 0) { 1006 return -EIO; /* no change => error */
967 return -EIO; /* no change => error */ 1007
968 } 1008 /* consume all events */
969 1009 priv->diff_status = 0;
970 /* consume all events */ 1010
971 priv->diff_status = 0; 1011 /* return 0 if caller wanted to know about
972 1012 these bits */
973 /* return 0 if caller wanted to know about these bits */ 1013 if (((arg & TIOCM_RNG) && (diff & UART_RI)) ||
974 if ( ((arg & TIOCM_RNG) && (diff & UART_RI)) || 1014 ((arg & TIOCM_DSR) && (diff & UART_DSR)) ||
975 ((arg & TIOCM_DSR) && (diff & UART_DSR)) || 1015 ((arg & TIOCM_CD) && (diff & UART_CD)) ||
976 ((arg & TIOCM_CD) && (diff & UART_CD)) || 1016 ((arg & TIOCM_CTS) && (diff & UART_CTS)))
977 ((arg & TIOCM_CTS) && (diff & UART_CTS)) ) { 1017 return 0;
978 return 0; 1018 /* otherwise caller can't care less about what
979 } 1019 * happened, and so we continue to wait for
980 /* otherwise caller can't care less about what happened, 1020 * more events.
981 * and so we continue to wait for more events. 1021 */
982 */
983 }
984 } 1022 }
985 return 0; 1023 }
986 break; 1024 return 0;
987 default: 1025 default:
988 break; 1026 break;
989 } 1027 }
990
991 dbg("%s - arg not supported - it was 0x%04x - check include/asm/ioctls.h", __func__, cmd); 1028 dbg("%s - arg not supported - it was 0x%04x - check include/asm/ioctls.h", __func__, cmd);
992
993 return -ENOIOCTLCMD; 1029 return -ENOIOCTLCMD;
994} /* cypress_ioctl */ 1030} /* cypress_ioctl */
995 1031
996 1032
997static void cypress_set_termios (struct usb_serial_port *port, 1033static void cypress_set_termios(struct tty_struct *tty,
998 struct ktermios *old_termios) 1034 struct usb_serial_port *port, struct ktermios *old_termios)
999{ 1035{
1000 struct cypress_private *priv = usb_get_serial_port_data(port); 1036 struct cypress_private *priv = usb_get_serial_port_data(port);
1001 struct tty_struct *tty;
1002 int data_bits, stop_bits, parity_type, parity_enable; 1037 int data_bits, stop_bits, parity_type, parity_enable;
1003 unsigned cflag, iflag; 1038 unsigned cflag, iflag;
1004 unsigned long flags; 1039 unsigned long flags;
@@ -1007,8 +1042,6 @@ static void cypress_set_termios (struct usb_serial_port *port,
1007 1042
1008 dbg("%s - port %d", __func__, port->number); 1043 dbg("%s - port %d", __func__, port->number);
1009 1044
1010 tty = port->tty;
1011
1012 spin_lock_irqsave(&priv->lock, flags); 1045 spin_lock_irqsave(&priv->lock, flags);
1013 if (!priv->termios_initialized) { 1046 if (!priv->termios_initialized) {
1014 if (priv->chiptype == CT_EARTHMATE) { 1047 if (priv->chiptype == CT_EARTHMATE) {
@@ -1060,28 +1093,24 @@ static void cypress_set_termios (struct usb_serial_port *port,
1060 } else 1093 } else
1061 parity_enable = parity_type = 0; 1094 parity_enable = parity_type = 0;
1062 1095
1063 if (cflag & CSIZE) { 1096 switch (cflag & CSIZE) {
1064 switch (cflag & CSIZE) { 1097 case CS5:
1065 case CS5: 1098 data_bits = 0;
1066 data_bits = 0; 1099 break;
1067 break; 1100 case CS6:
1068 case CS6: 1101 data_bits = 1;
1069 data_bits = 1; 1102 break;
1070 break; 1103 case CS7:
1071 case CS7: 1104 data_bits = 2;
1072 data_bits = 2; 1105 break;
1073 break; 1106 case CS8:
1074 case CS8:
1075 data_bits = 3;
1076 break;
1077 default:
1078 err("%s - CSIZE was set, but not CS5-CS8",
1079 __func__);
1080 data_bits = 3;
1081 }
1082 } else
1083 data_bits = 3; 1107 data_bits = 3;
1084 1108 break;
1109 default:
1110 err("%s - CSIZE was set, but not CS5-CS8",
1111 __func__);
1112 data_bits = 3;
1113 }
1085 spin_lock_irqsave(&priv->lock, flags); 1114 spin_lock_irqsave(&priv->lock, flags);
1086 oldlines = priv->line_control; 1115 oldlines = priv->line_control;
1087 if ((cflag & CBAUD) == B0) { 1116 if ((cflag & CBAUD) == B0) {
@@ -1096,19 +1125,21 @@ static void cypress_set_termios (struct usb_serial_port *port,
1096 "%d data_bits (+5)", __func__, stop_bits, 1125 "%d data_bits (+5)", __func__, stop_bits,
1097 parity_enable, parity_type, data_bits); 1126 parity_enable, parity_type, data_bits);
1098 1127
1099 cypress_serial_control(port, tty_get_baud_rate(tty), data_bits, stop_bits, 1128 cypress_serial_control(tty, port, tty_get_baud_rate(tty),
1100 parity_enable, parity_type, 0, CYPRESS_SET_CONFIG); 1129 data_bits, stop_bits,
1130 parity_enable, parity_type,
1131 0, CYPRESS_SET_CONFIG);
1101 1132
1102 /* we perform a CYPRESS_GET_CONFIG so that the current settings are 1133 /* we perform a CYPRESS_GET_CONFIG so that the current settings are
1103 * filled into the private structure this should confirm that all is 1134 * filled into the private structure this should confirm that all is
1104 * working if it returns what we just set */ 1135 * working if it returns what we just set */
1105 cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG); 1136 cypress_serial_control(tty, port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG);
1106 1137
1107 /* Here we can define custom tty settings for devices; the main tty 1138 /* Here we can define custom tty settings for devices; the main tty
1108 * termios flag base comes from empeg.c */ 1139 * termios flag base comes from empeg.c */
1109 1140
1110 spin_lock_irqsave(&priv->lock, flags); 1141 spin_lock_irqsave(&priv->lock, flags);
1111 if ( (priv->chiptype == CT_EARTHMATE) && (priv->baud_rate == 4800) ) { 1142 if (priv->chiptype == CT_EARTHMATE && priv->baud_rate == 4800) {
1112 dbg("Using custom termios settings for a baud rate of " 1143 dbg("Using custom termios settings for a baud rate of "
1113 "4800bps."); 1144 "4800bps.");
1114 /* define custom termios settings for NMEA protocol */ 1145 /* define custom termios settings for NMEA protocol */
@@ -1142,20 +1173,21 @@ static void cypress_set_termios (struct usb_serial_port *port,
1142 /* if necessary, set lines */ 1173 /* if necessary, set lines */
1143 if (linechange) { 1174 if (linechange) {
1144 priv->cmd_ctrl = 1; 1175 priv->cmd_ctrl = 1;
1145 cypress_write(port, NULL, 0); 1176 cypress_write(tty, port, NULL, 0);
1146 } 1177 }
1147} /* cypress_set_termios */ 1178} /* cypress_set_termios */
1148 1179
1149 1180
1150/* returns amount of data still left in soft buffer */ 1181/* returns amount of data still left in soft buffer */
1151static int cypress_chars_in_buffer(struct usb_serial_port *port) 1182static int cypress_chars_in_buffer(struct tty_struct *tty)
1152{ 1183{
1184 struct usb_serial_port *port = tty->driver_data;
1153 struct cypress_private *priv = usb_get_serial_port_data(port); 1185 struct cypress_private *priv = usb_get_serial_port_data(port);
1154 int chars = 0; 1186 int chars = 0;
1155 unsigned long flags; 1187 unsigned long flags;
1156 1188
1157 dbg("%s - port %d", __func__, port->number); 1189 dbg("%s - port %d", __func__, port->number);
1158 1190
1159 spin_lock_irqsave(&priv->lock, flags); 1191 spin_lock_irqsave(&priv->lock, flags);
1160 chars = cypress_buf_data_avail(priv->buf); 1192 chars = cypress_buf_data_avail(priv->buf);
1161 spin_unlock_irqrestore(&priv->lock, flags); 1193 spin_unlock_irqrestore(&priv->lock, flags);
@@ -1165,8 +1197,9 @@ static int cypress_chars_in_buffer(struct usb_serial_port *port)
1165} 1197}
1166 1198
1167 1199
1168static void cypress_throttle (struct usb_serial_port *port) 1200static void cypress_throttle(struct tty_struct *tty)
1169{ 1201{
1202 struct usb_serial_port *port = tty->driver_data;
1170 struct cypress_private *priv = usb_get_serial_port_data(port); 1203 struct cypress_private *priv = usb_get_serial_port_data(port);
1171 unsigned long flags; 1204 unsigned long flags;
1172 1205
@@ -1178,8 +1211,9 @@ static void cypress_throttle (struct usb_serial_port *port)
1178} 1211}
1179 1212
1180 1213
1181static void cypress_unthrottle (struct usb_serial_port *port) 1214static void cypress_unthrottle(struct tty_struct *tty)
1182{ 1215{
1216 struct usb_serial_port *port = tty->driver_data;
1183 struct cypress_private *priv = usb_get_serial_port_data(port); 1217 struct cypress_private *priv = usb_get_serial_port_data(port);
1184 int actually_throttled, result; 1218 int actually_throttled, result;
1185 unsigned long flags; 1219 unsigned long flags;
@@ -1232,12 +1266,13 @@ static void cypress_read_int_callback(struct urb *urb)
1232 /* precursor to disconnect so just go away */ 1266 /* precursor to disconnect so just go away */
1233 return; 1267 return;
1234 case -EPIPE: 1268 case -EPIPE:
1235 usb_clear_halt(port->serial->dev,0x81); 1269 usb_clear_halt(port->serial->dev, 0x81);
1236 break; 1270 break;
1237 default: 1271 default:
1238 /* something ugly is going on... */ 1272 /* something ugly is going on... */
1239 dev_err(&urb->dev->dev,"%s - unexpected nonzero read status received: %d\n", 1273 dev_err(&urb->dev->dev,
1240 __func__, status); 1274 "%s - unexpected nonzero read status received: %d\n",
1275 __func__, status);
1241 cypress_set_dead(port); 1276 cypress_set_dead(port);
1242 return; 1277 return;
1243 } 1278 }
@@ -1251,7 +1286,7 @@ static void cypress_read_int_callback(struct urb *urb)
1251 } 1286 }
1252 spin_unlock_irqrestore(&priv->lock, flags); 1287 spin_unlock_irqrestore(&priv->lock, flags);
1253 1288
1254 tty = port->tty; 1289 tty = port->port.tty;
1255 if (!tty) { 1290 if (!tty) {
1256 dbg("%s - bad tty pointer - exiting", __func__); 1291 dbg("%s - bad tty pointer - exiting", __func__);
1257 return; 1292 return;
@@ -1285,8 +1320,8 @@ static void cypress_read_int_callback(struct urb *urb)
1285 goto continue_read; 1320 goto continue_read;
1286 } 1321 }
1287 1322
1288 usb_serial_debug_data (debug, &port->dev, __func__, 1323 usb_serial_debug_data(debug, &port->dev, __func__,
1289 urb->actual_length, data); 1324 urb->actual_length, data);
1290 1325
1291 spin_lock_irqsave(&priv->lock, flags); 1326 spin_lock_irqsave(&priv->lock, flags);
1292 /* check to see if status has changed */ 1327 /* check to see if status has changed */
@@ -1327,7 +1362,7 @@ static void cypress_read_int_callback(struct urb *urb)
1327 data[i]); 1362 data[i]);
1328 tty_insert_flip_char(tty, data[i], tty_flag); 1363 tty_insert_flip_char(tty, data[i], tty_flag);
1329 } 1364 }
1330 tty_flip_buffer_push(port->tty); 1365 tty_flip_buffer_push(port->port.tty);
1331 } 1366 }
1332 1367
1333 spin_lock_irqsave(&priv->lock, flags); 1368 spin_lock_irqsave(&priv->lock, flags);
@@ -1339,13 +1374,14 @@ continue_read:
1339 1374
1340 /* Continue trying to always read... unless the port has closed. */ 1375 /* Continue trying to always read... unless the port has closed. */
1341 1376
1342 if (port->open_count > 0 && priv->comm_is_ok) { 1377 if (port->port.count > 0 && priv->comm_is_ok) {
1343 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev, 1378 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev,
1344 usb_rcvintpipe(port->serial->dev, 1379 usb_rcvintpipe(port->serial->dev,
1345 port->interrupt_in_endpointAddress), 1380 port->interrupt_in_endpointAddress),
1346 port->interrupt_in_urb->transfer_buffer, 1381 port->interrupt_in_urb->transfer_buffer,
1347 port->interrupt_in_urb->transfer_buffer_length, 1382 port->interrupt_in_urb->transfer_buffer_length,
1348 cypress_read_int_callback, port, priv->read_urb_interval); 1383 cypress_read_int_callback, port,
1384 priv->read_urb_interval);
1349 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1385 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1350 if (result) { 1386 if (result) {
1351 dev_err(&urb->dev->dev, "%s - failed resubmitting " 1387 dev_err(&urb->dev->dev, "%s - failed resubmitting "
@@ -1369,42 +1405,43 @@ static void cypress_write_int_callback(struct urb *urb)
1369 dbg("%s - port %d", __func__, port->number); 1405 dbg("%s - port %d", __func__, port->number);
1370 1406
1371 switch (status) { 1407 switch (status) {
1372 case 0: 1408 case 0:
1373 /* success */ 1409 /* success */
1410 break;
1411 case -ECONNRESET:
1412 case -ENOENT:
1413 case -ESHUTDOWN:
1414 /* this urb is terminated, clean up */
1415 dbg("%s - urb shutting down with status: %d",
1416 __func__, status);
1417 priv->write_urb_in_use = 0;
1418 return;
1419 case -EPIPE: /* no break needed; clear halt and resubmit */
1420 if (!priv->comm_is_ok)
1374 break; 1421 break;
1375 case -ECONNRESET: 1422 usb_clear_halt(port->serial->dev, 0x02);
1376 case -ENOENT: 1423 /* error in the urb, so we have to resubmit it */
1377 case -ESHUTDOWN: 1424 dbg("%s - nonzero write bulk status received: %d",
1378 /* this urb is terminated, clean up */ 1425 __func__, status);
1379 dbg("%s - urb shutting down with status: %d", 1426 port->interrupt_out_urb->transfer_buffer_length = 1;
1380 __func__, status); 1427 port->interrupt_out_urb->dev = port->serial->dev;
1381 priv->write_urb_in_use = 0; 1428 result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC);
1429 if (!result)
1382 return; 1430 return;
1383 case -EPIPE: /* no break needed; clear halt and resubmit */ 1431 dev_err(&urb->dev->dev,
1384 if (!priv->comm_is_ok) 1432 "%s - failed resubmitting write urb, error %d\n",
1385 break; 1433 __func__, result);
1386 usb_clear_halt(port->serial->dev, 0x02); 1434 cypress_set_dead(port);
1387 /* error in the urb, so we have to resubmit it */ 1435 break;
1388 dbg("%s - nonzero write bulk status received: %d", 1436 default:
1389 __func__, status); 1437 dev_err(&urb->dev->dev,
1390 port->interrupt_out_urb->transfer_buffer_length = 1; 1438 "%s - unexpected nonzero write status received: %d\n",
1391 port->interrupt_out_urb->dev = port->serial->dev; 1439 __func__, status);
1392 result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC); 1440 cypress_set_dead(port);
1393 if (!result) 1441 break;
1394 return;
1395 dev_err(&urb->dev->dev, "%s - failed resubmitting write urb, error %d\n",
1396 __func__, result);
1397 cypress_set_dead(port);
1398 break;
1399 default:
1400 dev_err(&urb->dev->dev,"%s - unexpected nonzero write status received: %d\n",
1401 __func__, status);
1402 cypress_set_dead(port);
1403 break;
1404 } 1442 }
1405
1406 priv->write_urb_in_use = 0; 1443 priv->write_urb_in_use = 0;
1407 1444
1408 /* send any buffered data */ 1445 /* send any buffered data */
1409 cypress_send(port); 1446 cypress_send(port);
1410} 1447}
@@ -1486,7 +1523,8 @@ static void cypress_buf_clear(struct cypress_buf *cb)
1486static unsigned int cypress_buf_data_avail(struct cypress_buf *cb) 1523static unsigned int cypress_buf_data_avail(struct cypress_buf *cb)
1487{ 1524{
1488 if (cb != NULL) 1525 if (cb != NULL)
1489 return ((cb->buf_size + cb->buf_put - cb->buf_get) % cb->buf_size); 1526 return (cb->buf_size + cb->buf_put - cb->buf_get)
1527 % cb->buf_size;
1490 else 1528 else
1491 return 0; 1529 return 0;
1492} 1530}
@@ -1502,7 +1540,8 @@ static unsigned int cypress_buf_data_avail(struct cypress_buf *cb)
1502static unsigned int cypress_buf_space_avail(struct cypress_buf *cb) 1540static unsigned int cypress_buf_space_avail(struct cypress_buf *cb)
1503{ 1541{
1504 if (cb != NULL) 1542 if (cb != NULL)
1505 return ((cb->buf_size + cb->buf_get - cb->buf_put - 1) % cb->buf_size); 1543 return (cb->buf_size + cb->buf_get - cb->buf_put - 1)
1544 % cb->buf_size;
1506 else 1545 else
1507 return 0; 1546 return 0;
1508} 1547}
@@ -1602,9 +1641,9 @@ static unsigned int cypress_buf_get(struct cypress_buf *cb, char *buf,
1602static int __init cypress_init(void) 1641static int __init cypress_init(void)
1603{ 1642{
1604 int retval; 1643 int retval;
1605 1644
1606 dbg("%s", __func__); 1645 dbg("%s", __func__);
1607 1646
1608 retval = usb_serial_register(&cypress_earthmate_device); 1647 retval = usb_serial_register(&cypress_earthmate_device);
1609 if (retval) 1648 if (retval)
1610 goto failed_em_register; 1649 goto failed_em_register;
@@ -1632,23 +1671,23 @@ failed_em_register:
1632} 1671}
1633 1672
1634 1673
1635static void __exit cypress_exit (void) 1674static void __exit cypress_exit(void)
1636{ 1675{
1637 dbg("%s", __func__); 1676 dbg("%s", __func__);
1638 1677
1639 usb_deregister (&cypress_driver); 1678 usb_deregister(&cypress_driver);
1640 usb_serial_deregister (&cypress_earthmate_device); 1679 usb_serial_deregister(&cypress_earthmate_device);
1641 usb_serial_deregister (&cypress_hidcom_device); 1680 usb_serial_deregister(&cypress_hidcom_device);
1642 usb_serial_deregister (&cypress_ca42v2_device); 1681 usb_serial_deregister(&cypress_ca42v2_device);
1643} 1682}
1644 1683
1645 1684
1646module_init(cypress_init); 1685module_init(cypress_init);
1647module_exit(cypress_exit); 1686module_exit(cypress_exit);
1648 1687
1649MODULE_AUTHOR( DRIVER_AUTHOR ); 1688MODULE_AUTHOR(DRIVER_AUTHOR);
1650MODULE_DESCRIPTION( DRIVER_DESC ); 1689MODULE_DESCRIPTION(DRIVER_DESC);
1651MODULE_VERSION( DRIVER_VERSION ); 1690MODULE_VERSION(DRIVER_VERSION);
1652MODULE_LICENSE("GPL"); 1691MODULE_LICENSE("GPL");
1653 1692
1654module_param(debug, bool, S_IRUGO | S_IWUSR); 1693module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h
index 0388065bb794..e772b01ac3ac 100644
--- a/drivers/usb/serial/cypress_m8.h
+++ b/drivers/usb/serial/cypress_m8.h
@@ -54,7 +54,7 @@
54#define UART_DSR 0x20 /* data set ready - flow control - device to host */ 54#define UART_DSR 0x20 /* data set ready - flow control - device to host */
55#define CONTROL_RTS 0x10 /* request to send - flow control - host to device */ 55#define CONTROL_RTS 0x10 /* request to send - flow control - host to device */
56#define UART_CTS 0x10 /* clear to send - flow control - device to host */ 56#define UART_CTS 0x10 /* clear to send - flow control - device to host */
57#define UART_RI 0x10 /* ring indicator - modem - device to host */ 57#define UART_RI 0x10 /* ring indicator - modem - device to host */
58#define UART_CD 0x40 /* carrier detect - modem - device to host */ 58#define UART_CD 0x40 /* carrier detect - modem - device to host */
59#define CYP_ERROR 0x08 /* received from input report - device to host */ 59#define CYP_ERROR 0x08 /* received from input report - device to host */
60/* Note - the below has nothing to to with the "feature report" reset */ 60/* Note - the below has nothing to to with the "feature report" reset */
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
index 04a56f300ea6..240aad1acaab 100644
--- a/drivers/usb/serial/digi_acceleport.c
+++ b/drivers/usb/serial/digi_acceleport.c
@@ -15,7 +15,7 @@
15* Al Borchers (borchers@steinerpoint.com) 15* Al Borchers (borchers@steinerpoint.com)
16* 16*
17* (12/03/2001) gkh 17* (12/03/2001) gkh
18* switched to using port->open_count instead of private version. 18* switched to using port->port.count instead of private version.
19* Removed port->active 19* Removed port->active
20* 20*
21* (04/08/2001) gb 21* (04/08/2001) gb
@@ -229,8 +229,6 @@
229* in case a wake up is lost. 229* in case a wake up is lost.
230* - Following Documentation/DocBook/kernel-locking.pdf no spin locks 230* - Following Documentation/DocBook/kernel-locking.pdf no spin locks
231* are held when calling copy_to/from_user or printk. 231* are held when calling copy_to/from_user or printk.
232*
233* $Id: digi_acceleport.c,v 1.80.1.2 2000/11/02 05:45:08 root Exp $
234*/ 232*/
235 233
236#include <linux/kernel.h> 234#include <linux/kernel.h>
@@ -243,7 +241,7 @@
243#include <linux/module.h> 241#include <linux/module.h>
244#include <linux/spinlock.h> 242#include <linux/spinlock.h>
245#include <linux/workqueue.h> 243#include <linux/workqueue.h>
246#include <asm/uaccess.h> 244#include <linux/uaccess.h>
247#include <linux/usb.h> 245#include <linux/usb.h>
248#include <linux/wait.h> 246#include <linux/wait.h>
249#include <linux/usb/serial.h> 247#include <linux/usb/serial.h>
@@ -443,22 +441,23 @@ static int digi_set_modem_signals(struct usb_serial_port *port,
443 unsigned int modem_signals, int interruptible); 441 unsigned int modem_signals, int interruptible);
444static int digi_transmit_idle(struct usb_serial_port *port, 442static int digi_transmit_idle(struct usb_serial_port *port,
445 unsigned long timeout); 443 unsigned long timeout);
446static void digi_rx_throttle (struct usb_serial_port *port); 444static void digi_rx_throttle(struct tty_struct *tty);
447static void digi_rx_unthrottle (struct usb_serial_port *port); 445static void digi_rx_unthrottle(struct tty_struct *tty);
448static void digi_set_termios(struct usb_serial_port *port, 446static void digi_set_termios(struct tty_struct *tty,
449 struct ktermios *old_termios); 447 struct usb_serial_port *port, struct ktermios *old_termios);
450static void digi_break_ctl(struct usb_serial_port *port, int break_state); 448static void digi_break_ctl(struct tty_struct *tty, int break_state);
451static int digi_ioctl(struct usb_serial_port *port, struct file *file, 449static int digi_tiocmget(struct tty_struct *tty, struct file *file);
452 unsigned int cmd, unsigned long arg); 450static int digi_tiocmset(struct tty_struct *tty, struct file *file,
453static int digi_tiocmget(struct usb_serial_port *port, struct file *file);
454static int digi_tiocmset(struct usb_serial_port *port, struct file *file,
455 unsigned int set, unsigned int clear); 451 unsigned int set, unsigned int clear);
456static int digi_write(struct usb_serial_port *port, const unsigned char *buf, int count); 452static int digi_write(struct tty_struct *tty, struct usb_serial_port *port,
453 const unsigned char *buf, int count);
457static void digi_write_bulk_callback(struct urb *urb); 454static void digi_write_bulk_callback(struct urb *urb);
458static int digi_write_room(struct usb_serial_port *port); 455static int digi_write_room(struct tty_struct *tty);
459static int digi_chars_in_buffer(struct usb_serial_port *port); 456static int digi_chars_in_buffer(struct tty_struct *tty);
460static int digi_open(struct usb_serial_port *port, struct file *filp); 457static int digi_open(struct tty_struct *tty, struct usb_serial_port *port,
461static void digi_close(struct usb_serial_port *port, struct file *filp); 458 struct file *filp);
459static void digi_close(struct tty_struct *tty, struct usb_serial_port *port,
460 struct file *filp);
462static int digi_startup_device(struct usb_serial *serial); 461static int digi_startup_device(struct usb_serial *serial);
463static int digi_startup(struct usb_serial *serial); 462static int digi_startup(struct usb_serial *serial);
464static void digi_shutdown(struct usb_serial *serial); 463static void digi_shutdown(struct usb_serial *serial);
@@ -487,7 +486,7 @@ static struct usb_device_id id_table_4 [] = {
487 { } /* Terminating entry */ 486 { } /* Terminating entry */
488}; 487};
489 488
490MODULE_DEVICE_TABLE (usb, id_table_combined); 489MODULE_DEVICE_TABLE(usb, id_table_combined);
491 490
492static struct usb_driver digi_driver = { 491static struct usb_driver digi_driver = {
493 .name = "digi_acceleport", 492 .name = "digi_acceleport",
@@ -518,7 +517,6 @@ static struct usb_serial_driver digi_acceleport_2_device = {
518 .chars_in_buffer = digi_chars_in_buffer, 517 .chars_in_buffer = digi_chars_in_buffer,
519 .throttle = digi_rx_throttle, 518 .throttle = digi_rx_throttle,
520 .unthrottle = digi_rx_unthrottle, 519 .unthrottle = digi_rx_unthrottle,
521 .ioctl = digi_ioctl,
522 .set_termios = digi_set_termios, 520 .set_termios = digi_set_termios,
523 .break_ctl = digi_break_ctl, 521 .break_ctl = digi_break_ctl,
524 .tiocmget = digi_tiocmget, 522 .tiocmget = digi_tiocmget,
@@ -545,7 +543,6 @@ static struct usb_serial_driver digi_acceleport_4_device = {
545 .chars_in_buffer = digi_chars_in_buffer, 543 .chars_in_buffer = digi_chars_in_buffer,
546 .throttle = digi_rx_throttle, 544 .throttle = digi_rx_throttle,
547 .unthrottle = digi_rx_unthrottle, 545 .unthrottle = digi_rx_unthrottle,
548 .ioctl = digi_ioctl,
549 .set_termios = digi_set_termios, 546 .set_termios = digi_set_termios,
550 .break_ctl = digi_break_ctl, 547 .break_ctl = digi_break_ctl,
551 .tiocmget = digi_tiocmget, 548 .tiocmget = digi_tiocmget,
@@ -558,21 +555,22 @@ static struct usb_serial_driver digi_acceleport_4_device = {
558/* Functions */ 555/* Functions */
559 556
560/* 557/*
561* Cond Wait Interruptible Timeout Irqrestore 558 * Cond Wait Interruptible Timeout Irqrestore
562* 559 *
563* Do spin_unlock_irqrestore and interruptible_sleep_on_timeout 560 * Do spin_unlock_irqrestore and interruptible_sleep_on_timeout
564* so that wake ups are not lost if they occur between the unlock 561 * so that wake ups are not lost if they occur between the unlock
565* and the sleep. In other words, spin_unlock_irqrestore and 562 * and the sleep. In other words, spin_unlock_irqrestore and
566* interruptible_sleep_on_timeout are "atomic" with respect to 563 * interruptible_sleep_on_timeout are "atomic" with respect to
567* wake ups. This is used to implement condition variables. 564 * wake ups. This is used to implement condition variables.
568* 565 *
569* interruptible_sleep_on_timeout is deprecated and has been replaced 566 * interruptible_sleep_on_timeout is deprecated and has been replaced
570* with the equivalent code. 567 * with the equivalent code.
571*/ 568 */
572 569
573static long cond_wait_interruptible_timeout_irqrestore( 570static long cond_wait_interruptible_timeout_irqrestore(
574 wait_queue_head_t *q, long timeout, 571 wait_queue_head_t *q, long timeout,
575 spinlock_t *lock, unsigned long flags) 572 spinlock_t *lock, unsigned long flags)
573__releases(lock)
576{ 574{
577 DEFINE_WAIT(wait); 575 DEFINE_WAIT(wait);
578 576
@@ -586,15 +584,16 @@ static long cond_wait_interruptible_timeout_irqrestore(
586 584
587 585
588/* 586/*
589* Digi Wakeup Write 587 * Digi Wakeup Write
590* 588 *
591* Wake up port, line discipline, and tty processes sleeping 589 * Wake up port, line discipline, and tty processes sleeping
592* on writes. 590 * on writes.
593*/ 591 */
594 592
595static void digi_wakeup_write_lock(struct work_struct *work) 593static void digi_wakeup_write_lock(struct work_struct *work)
596{ 594{
597 struct digi_port *priv = container_of(work, struct digi_port, dp_wakeup_work); 595 struct digi_port *priv =
596 container_of(work, struct digi_port, dp_wakeup_work);
598 struct usb_serial_port *port = priv->dp_port; 597 struct usb_serial_port *port = priv->dp_port;
599 unsigned long flags; 598 unsigned long flags;
600 599
@@ -605,20 +604,20 @@ static void digi_wakeup_write_lock(struct work_struct *work)
605 604
606static void digi_wakeup_write(struct usb_serial_port *port) 605static void digi_wakeup_write(struct usb_serial_port *port)
607{ 606{
608 tty_wakeup(port->tty); 607 tty_wakeup(port->port.tty);
609} 608}
610 609
611 610
612/* 611/*
613* Digi Write OOB Command 612 * Digi Write OOB Command
614* 613 *
615* Write commands on the out of band port. Commands are 4 614 * Write commands on the out of band port. Commands are 4
616* bytes each, multiple commands can be sent at once, and 615 * bytes each, multiple commands can be sent at once, and
617* no command will be split across USB packets. Returns 0 616 * no command will be split across USB packets. Returns 0
618* if successful, -EINTR if interrupted while sleeping and 617 * if successful, -EINTR if interrupted while sleeping and
619* the interruptible flag is true, or a negative error 618 * the interruptible flag is true, or a negative error
620* returned by usb_submit_urb. 619 * returned by usb_submit_urb.
621*/ 620 */
622 621
623static int digi_write_oob_command(struct usb_serial_port *port, 622static int digi_write_oob_command(struct usb_serial_port *port,
624 unsigned char *buf, int count, int interruptible) 623 unsigned char *buf, int count, int interruptible)
@@ -633,8 +632,8 @@ static int digi_write_oob_command(struct usb_serial_port *port,
633 dbg("digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, count); 632 dbg("digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, count);
634 633
635 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); 634 spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
636 while(count > 0) { 635 while (count > 0) {
637 while(oob_port->write_urb->status == -EINPROGRESS 636 while (oob_port->write_urb->status == -EINPROGRESS
638 || oob_priv->dp_write_urb_in_use) { 637 || oob_priv->dp_write_urb_in_use) {
639 cond_wait_interruptible_timeout_irqrestore( 638 cond_wait_interruptible_timeout_irqrestore(
640 &oob_port->write_wait, DIGI_RETRY_TIMEOUT, 639 &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
@@ -651,7 +650,8 @@ static int digi_write_oob_command(struct usb_serial_port *port,
651 memcpy(oob_port->write_urb->transfer_buffer, buf, len); 650 memcpy(oob_port->write_urb->transfer_buffer, buf, len);
652 oob_port->write_urb->transfer_buffer_length = len; 651 oob_port->write_urb->transfer_buffer_length = len;
653 oob_port->write_urb->dev = port->serial->dev; 652 oob_port->write_urb->dev = port->serial->dev;
654 if ((ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0) { 653 ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC);
654 if (ret == 0) {
655 oob_priv->dp_write_urb_in_use = 1; 655 oob_priv->dp_write_urb_in_use = 1;
656 count -= len; 656 count -= len;
657 buf += len; 657 buf += len;
@@ -666,16 +666,16 @@ static int digi_write_oob_command(struct usb_serial_port *port,
666 666
667 667
668/* 668/*
669* Digi Write In Band Command 669 * Digi Write In Band Command
670* 670 *
671* Write commands on the given port. Commands are 4 671 * Write commands on the given port. Commands are 4
672* bytes each, multiple commands can be sent at once, and 672 * bytes each, multiple commands can be sent at once, and
673* no command will be split across USB packets. If timeout 673 * no command will be split across USB packets. If timeout
674* is non-zero, write in band command will return after 674 * is non-zero, write in band command will return after
675* waiting unsuccessfully for the URB status to clear for 675 * waiting unsuccessfully for the URB status to clear for
676* timeout ticks. Returns 0 if successful, or a negative 676 * timeout ticks. Returns 0 if successful, or a negative
677* error returned by digi_write. 677 * error returned by digi_write.
678*/ 678 */
679 679
680static int digi_write_inb_command(struct usb_serial_port *port, 680static int digi_write_inb_command(struct usb_serial_port *port,
681 unsigned char *buf, int count, unsigned long timeout) 681 unsigned char *buf, int count, unsigned long timeout)
@@ -695,9 +695,10 @@ static int digi_write_inb_command(struct usb_serial_port *port,
695 timeout = ULONG_MAX; 695 timeout = ULONG_MAX;
696 696
697 spin_lock_irqsave(&priv->dp_port_lock, flags); 697 spin_lock_irqsave(&priv->dp_port_lock, flags);
698 while(count > 0 && ret == 0) { 698 while (count > 0 && ret == 0) {
699 while((port->write_urb->status == -EINPROGRESS 699 while ((port->write_urb->status == -EINPROGRESS
700 || priv->dp_write_urb_in_use) && time_before(jiffies, timeout)) { 700 || priv->dp_write_urb_in_use)
701 && time_before(jiffies, timeout)) {
701 cond_wait_interruptible_timeout_irqrestore( 702 cond_wait_interruptible_timeout_irqrestore(
702 &port->write_wait, DIGI_RETRY_TIMEOUT, 703 &port->write_wait, DIGI_RETRY_TIMEOUT,
703 &priv->dp_port_lock, flags); 704 &priv->dp_port_lock, flags);
@@ -728,7 +729,8 @@ static int digi_write_inb_command(struct usb_serial_port *port,
728 } 729 }
729 port->write_urb->dev = port->serial->dev; 730 port->write_urb->dev = port->serial->dev;
730 731
731 if ((ret = usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0) { 732 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
733 if (ret == 0) {
732 priv->dp_write_urb_in_use = 1; 734 priv->dp_write_urb_in_use = 1;
733 priv->dp_out_buf_len = 0; 735 priv->dp_out_buf_len = 0;
734 count -= len; 736 count -= len;
@@ -746,14 +748,14 @@ static int digi_write_inb_command(struct usb_serial_port *port,
746 748
747 749
748/* 750/*
749* Digi Set Modem Signals 751 * Digi Set Modem Signals
750* 752 *
751* Sets or clears DTR and RTS on the port, according to the 753 * Sets or clears DTR and RTS on the port, according to the
752* modem_signals argument. Use TIOCM_DTR and TIOCM_RTS flags 754 * modem_signals argument. Use TIOCM_DTR and TIOCM_RTS flags
753* for the modem_signals argument. Returns 0 if successful, 755 * for the modem_signals argument. Returns 0 if successful,
754* -EINTR if interrupted while sleeping, or a non-zero error 756 * -EINTR if interrupted while sleeping, or a non-zero error
755* returned by usb_submit_urb. 757 * returned by usb_submit_urb.
756*/ 758 */
757 759
758static int digi_set_modem_signals(struct usb_serial_port *port, 760static int digi_set_modem_signals(struct usb_serial_port *port,
759 unsigned int modem_signals, int interruptible) 761 unsigned int modem_signals, int interruptible)
@@ -761,7 +763,7 @@ static int digi_set_modem_signals(struct usb_serial_port *port,
761 763
762 int ret; 764 int ret;
763 struct digi_port *port_priv = usb_get_serial_port_data(port); 765 struct digi_port *port_priv = usb_get_serial_port_data(port);
764 struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port; 766 struct usb_serial_port *oob_port = (struct usb_serial_port *) ((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
765 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port); 767 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
766 unsigned char *data = oob_port->write_urb->transfer_buffer; 768 unsigned char *data = oob_port->write_urb->transfer_buffer;
767 unsigned long flags = 0; 769 unsigned long flags = 0;
@@ -773,7 +775,8 @@ static int digi_set_modem_signals(struct usb_serial_port *port,
773 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); 775 spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
774 spin_lock(&port_priv->dp_port_lock); 776 spin_lock(&port_priv->dp_port_lock);
775 777
776 while(oob_port->write_urb->status == -EINPROGRESS || oob_priv->dp_write_urb_in_use) { 778 while (oob_port->write_urb->status == -EINPROGRESS ||
779 oob_priv->dp_write_urb_in_use) {
777 spin_unlock(&port_priv->dp_port_lock); 780 spin_unlock(&port_priv->dp_port_lock);
778 cond_wait_interruptible_timeout_irqrestore( 781 cond_wait_interruptible_timeout_irqrestore(
779 &oob_port->write_wait, DIGI_RETRY_TIMEOUT, 782 &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
@@ -785,17 +788,20 @@ static int digi_set_modem_signals(struct usb_serial_port *port,
785 } 788 }
786 data[0] = DIGI_CMD_SET_DTR_SIGNAL; 789 data[0] = DIGI_CMD_SET_DTR_SIGNAL;
787 data[1] = port_priv->dp_port_num; 790 data[1] = port_priv->dp_port_num;
788 data[2] = (modem_signals&TIOCM_DTR) ? DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE; 791 data[2] = (modem_signals & TIOCM_DTR) ?
792 DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE;
789 data[3] = 0; 793 data[3] = 0;
790 data[4] = DIGI_CMD_SET_RTS_SIGNAL; 794 data[4] = DIGI_CMD_SET_RTS_SIGNAL;
791 data[5] = port_priv->dp_port_num; 795 data[5] = port_priv->dp_port_num;
792 data[6] = (modem_signals&TIOCM_RTS) ? DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE; 796 data[6] = (modem_signals & TIOCM_RTS) ?
797 DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE;
793 data[7] = 0; 798 data[7] = 0;
794 799
795 oob_port->write_urb->transfer_buffer_length = 8; 800 oob_port->write_urb->transfer_buffer_length = 8;
796 oob_port->write_urb->dev = port->serial->dev; 801 oob_port->write_urb->dev = port->serial->dev;
797 802
798 if ((ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0) { 803 ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC);
804 if (ret == 0) {
799 oob_priv->dp_write_urb_in_use = 1; 805 oob_priv->dp_write_urb_in_use = 1;
800 port_priv->dp_modem_signals = 806 port_priv->dp_modem_signals =
801 (port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS)) 807 (port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS))
@@ -809,16 +815,16 @@ static int digi_set_modem_signals(struct usb_serial_port *port,
809} 815}
810 816
811/* 817/*
812* Digi Transmit Idle 818 * Digi Transmit Idle
813* 819 *
814* Digi transmit idle waits, up to timeout ticks, for the transmitter 820 * Digi transmit idle waits, up to timeout ticks, for the transmitter
815* to go idle. It returns 0 if successful or a negative error. 821 * to go idle. It returns 0 if successful or a negative error.
816* 822 *
817* There are race conditions here if more than one process is calling 823 * There are race conditions here if more than one process is calling
818* digi_transmit_idle on the same port at the same time. However, this 824 * digi_transmit_idle on the same port at the same time. However, this
819* is only called from close, and only one process can be in close on a 825 * is only called from close, and only one process can be in close on a
820* port at a time, so its ok. 826 * port at a time, so its ok.
821*/ 827 */
822 828
823static int digi_transmit_idle(struct usb_serial_port *port, 829static int digi_transmit_idle(struct usb_serial_port *port,
824 unsigned long timeout) 830 unsigned long timeout)
@@ -837,12 +843,13 @@ static int digi_transmit_idle(struct usb_serial_port *port,
837 843
838 timeout += jiffies; 844 timeout += jiffies;
839 845
840 if ((ret = digi_write_inb_command(port, buf, 2, timeout - jiffies)) != 0) 846 ret = digi_write_inb_command(port, buf, 2, timeout - jiffies);
847 if (ret != 0)
841 return ret; 848 return ret;
842 849
843 spin_lock_irqsave(&priv->dp_port_lock, flags); 850 spin_lock_irqsave(&priv->dp_port_lock, flags);
844 851
845 while(time_before(jiffies, timeout) && !priv->dp_transmit_idle) { 852 while (time_before(jiffies, timeout) && !priv->dp_transmit_idle) {
846 cond_wait_interruptible_timeout_irqrestore( 853 cond_wait_interruptible_timeout_irqrestore(
847 &priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT, 854 &priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT,
848 &priv->dp_port_lock, flags); 855 &priv->dp_port_lock, flags);
@@ -857,9 +864,10 @@ static int digi_transmit_idle(struct usb_serial_port *port,
857} 864}
858 865
859 866
860static void digi_rx_throttle(struct usb_serial_port *port) 867static void digi_rx_throttle(struct tty_struct *tty)
861{ 868{
862 unsigned long flags; 869 unsigned long flags;
870 struct usb_serial_port *port = tty->driver_data;
863 struct digi_port *priv = usb_get_serial_port_data(port); 871 struct digi_port *priv = usb_get_serial_port_data(port);
864 872
865 873
@@ -873,10 +881,11 @@ static void digi_rx_throttle(struct usb_serial_port *port)
873} 881}
874 882
875 883
876static void digi_rx_unthrottle(struct usb_serial_port *port) 884static void digi_rx_unthrottle(struct tty_struct *tty)
877{ 885{
878 int ret = 0; 886 int ret = 0;
879 unsigned long flags; 887 unsigned long flags;
888 struct usb_serial_port *port = tty->driver_data;
880 struct digi_port *priv = usb_get_serial_port_data(port); 889 struct digi_port *priv = usb_get_serial_port_data(port);
881 890
882 dbg("digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num); 891 dbg("digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num);
@@ -901,26 +910,25 @@ static void digi_rx_unthrottle(struct usb_serial_port *port)
901} 910}
902 911
903 912
904static void digi_set_termios(struct usb_serial_port *port, 913static void digi_set_termios(struct tty_struct *tty,
905 struct ktermios *old_termios) 914 struct usb_serial_port *port, struct ktermios *old_termios)
906{ 915{
907
908 struct digi_port *priv = usb_get_serial_port_data(port); 916 struct digi_port *priv = usb_get_serial_port_data(port);
909 struct tty_struct *tty = port->tty;
910 unsigned int iflag = tty->termios->c_iflag; 917 unsigned int iflag = tty->termios->c_iflag;
911 unsigned int cflag = tty->termios->c_cflag; 918 unsigned int cflag = tty->termios->c_cflag;
912 unsigned int old_iflag = old_termios->c_iflag; 919 unsigned int old_iflag = old_termios->c_iflag;
913 unsigned int old_cflag = old_termios->c_cflag; 920 unsigned int old_cflag = old_termios->c_cflag;
914 unsigned char buf[32]; 921 unsigned char buf[32];
915 unsigned int modem_signals; 922 unsigned int modem_signals;
916 int arg,ret; 923 int arg, ret;
917 int i = 0; 924 int i = 0;
918 speed_t baud; 925 speed_t baud;
919 926
920 dbg("digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x", priv->dp_port_num, iflag, old_iflag, cflag, old_cflag); 927 dbg("digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x", priv->dp_port_num, iflag, old_iflag, cflag, old_cflag);
921 928
922 /* set baud rate */ 929 /* set baud rate */
923 if ((baud = tty_get_baud_rate(tty)) != tty_termios_baud_rate(old_termios)) { 930 baud = tty_get_baud_rate(tty);
931 if (baud != tty_termios_baud_rate(old_termios)) {
924 arg = -1; 932 arg = -1;
925 933
926 /* reassert DTR and (maybe) RTS on transition from B0 */ 934 /* reassert DTR and (maybe) RTS on transition from B0 */
@@ -934,30 +942,30 @@ static void digi_set_termios(struct usb_serial_port *port,
934 digi_set_modem_signals(port, modem_signals, 1); 942 digi_set_modem_signals(port, modem_signals, 1);
935 } 943 }
936 switch (baud) { 944 switch (baud) {
937 /* drop DTR and RTS on transition to B0 */ 945 /* drop DTR and RTS on transition to B0 */
938 case 0: digi_set_modem_signals(port, 0, 1); break; 946 case 0: digi_set_modem_signals(port, 0, 1); break;
939 case 50: arg = DIGI_BAUD_50; break; 947 case 50: arg = DIGI_BAUD_50; break;
940 case 75: arg = DIGI_BAUD_75; break; 948 case 75: arg = DIGI_BAUD_75; break;
941 case 110: arg = DIGI_BAUD_110; break; 949 case 110: arg = DIGI_BAUD_110; break;
942 case 150: arg = DIGI_BAUD_150; break; 950 case 150: arg = DIGI_BAUD_150; break;
943 case 200: arg = DIGI_BAUD_200; break; 951 case 200: arg = DIGI_BAUD_200; break;
944 case 300: arg = DIGI_BAUD_300; break; 952 case 300: arg = DIGI_BAUD_300; break;
945 case 600: arg = DIGI_BAUD_600; break; 953 case 600: arg = DIGI_BAUD_600; break;
946 case 1200: arg = DIGI_BAUD_1200; break; 954 case 1200: arg = DIGI_BAUD_1200; break;
947 case 1800: arg = DIGI_BAUD_1800; break; 955 case 1800: arg = DIGI_BAUD_1800; break;
948 case 2400: arg = DIGI_BAUD_2400; break; 956 case 2400: arg = DIGI_BAUD_2400; break;
949 case 4800: arg = DIGI_BAUD_4800; break; 957 case 4800: arg = DIGI_BAUD_4800; break;
950 case 9600: arg = DIGI_BAUD_9600; break; 958 case 9600: arg = DIGI_BAUD_9600; break;
951 case 19200: arg = DIGI_BAUD_19200; break; 959 case 19200: arg = DIGI_BAUD_19200; break;
952 case 38400: arg = DIGI_BAUD_38400; break; 960 case 38400: arg = DIGI_BAUD_38400; break;
953 case 57600: arg = DIGI_BAUD_57600; break; 961 case 57600: arg = DIGI_BAUD_57600; break;
954 case 115200: arg = DIGI_BAUD_115200; break; 962 case 115200: arg = DIGI_BAUD_115200; break;
955 case 230400: arg = DIGI_BAUD_230400; break; 963 case 230400: arg = DIGI_BAUD_230400; break;
956 case 460800: arg = DIGI_BAUD_460800; break; 964 case 460800: arg = DIGI_BAUD_460800; break;
957 default: 965 default:
958 arg = DIGI_BAUD_9600; 966 arg = DIGI_BAUD_9600;
959 baud = 9600; 967 baud = 9600;
960 break; 968 break;
961 } 969 }
962 if (arg != -1) { 970 if (arg != -1) {
963 buf[i++] = DIGI_CMD_SET_BAUD_RATE; 971 buf[i++] = DIGI_CMD_SET_BAUD_RATE;
@@ -1083,14 +1091,16 @@ static void digi_set_termios(struct usb_serial_port *port,
1083 buf[i++] = arg; 1091 buf[i++] = arg;
1084 buf[i++] = 0; 1092 buf[i++] = 0;
1085 } 1093 }
1086 if ((ret = digi_write_oob_command(port, buf, i, 1)) != 0) 1094 ret = digi_write_oob_command(port, buf, i, 1);
1095 if (ret != 0)
1087 dbg("digi_set_termios: write oob failed, ret=%d", ret); 1096 dbg("digi_set_termios: write oob failed, ret=%d", ret);
1088 tty_encode_baud_rate(tty, baud, baud); 1097 tty_encode_baud_rate(tty, baud, baud);
1089} 1098}
1090 1099
1091 1100
1092static void digi_break_ctl(struct usb_serial_port *port, int break_state) 1101static void digi_break_ctl(struct tty_struct *tty, int break_state)
1093{ 1102{
1103 struct usb_serial_port *port = tty->driver_data;
1094 unsigned char buf[4]; 1104 unsigned char buf[4];
1095 1105
1096 buf[0] = DIGI_CMD_BREAK_CONTROL; 1106 buf[0] = DIGI_CMD_BREAK_CONTROL;
@@ -1101,8 +1111,9 @@ static void digi_break_ctl(struct usb_serial_port *port, int break_state)
1101} 1111}
1102 1112
1103 1113
1104static int digi_tiocmget(struct usb_serial_port *port, struct file *file) 1114static int digi_tiocmget(struct tty_struct *tty, struct file *file)
1105{ 1115{
1116 struct usb_serial_port *port = tty->driver_data;
1106 struct digi_port *priv = usb_get_serial_port_data(port); 1117 struct digi_port *priv = usb_get_serial_port_data(port);
1107 unsigned int val; 1118 unsigned int val;
1108 unsigned long flags; 1119 unsigned long flags;
@@ -1116,9 +1127,10 @@ static int digi_tiocmget(struct usb_serial_port *port, struct file *file)
1116} 1127}
1117 1128
1118 1129
1119static int digi_tiocmset(struct usb_serial_port *port, struct file *file, 1130static int digi_tiocmset(struct tty_struct *tty, struct file *file,
1120 unsigned int set, unsigned int clear) 1131 unsigned int set, unsigned int clear)
1121{ 1132{
1133 struct usb_serial_port *port = tty->driver_data;
1122 struct digi_port *priv = usb_get_serial_port_data(port); 1134 struct digi_port *priv = usb_get_serial_port_data(port);
1123 unsigned int val; 1135 unsigned int val;
1124 unsigned long flags; 1136 unsigned long flags;
@@ -1132,30 +1144,11 @@ static int digi_tiocmset(struct usb_serial_port *port, struct file *file,
1132} 1144}
1133 1145
1134 1146
1135static int digi_ioctl(struct usb_serial_port *port, struct file *file, 1147static int digi_write(struct tty_struct *tty, struct usb_serial_port *port,
1136 unsigned int cmd, unsigned long arg) 1148 const unsigned char *buf, int count)
1137{
1138 struct digi_port *priv = usb_get_serial_port_data(port);
1139 dbg("digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd);
1140
1141 switch (cmd) {
1142 case TIOCMIWAIT:
1143 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
1144 /* TODO */
1145 return 0;
1146 case TIOCGICOUNT:
1147 /* return count of modemline transitions */
1148 /* TODO */
1149 return 0;
1150 }
1151 return -ENOIOCTLCMD;
1152
1153}
1154
1155static int digi_write(struct usb_serial_port *port, const unsigned char *buf, int count)
1156{ 1149{
1157 1150
1158 int ret,data_len,new_len; 1151 int ret, data_len, new_len;
1159 struct digi_port *priv = usb_get_serial_port_data(port); 1152 struct digi_port *priv = usb_get_serial_port_data(port);
1160 unsigned char *data = port->write_urb->transfer_buffer; 1153 unsigned char *data = port->write_urb->transfer_buffer;
1161 unsigned long flags = 0; 1154 unsigned long flags = 0;
@@ -1173,7 +1166,8 @@ static int digi_write(struct usb_serial_port *port, const unsigned char *buf, in
1173 spin_lock_irqsave(&priv->dp_port_lock, flags); 1166 spin_lock_irqsave(&priv->dp_port_lock, flags);
1174 1167
1175 /* wait for urb status clear to submit another urb */ 1168 /* wait for urb status clear to submit another urb */
1176 if (port->write_urb->status == -EINPROGRESS || priv->dp_write_urb_in_use) { 1169 if (port->write_urb->status == -EINPROGRESS ||
1170 priv->dp_write_urb_in_use) {
1177 /* buffer data if count is 1 (probably put_char) if possible */ 1171 /* buffer data if count is 1 (probably put_char) if possible */
1178 if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) { 1172 if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) {
1179 priv->dp_out_buf[priv->dp_out_buf_len++] = *buf; 1173 priv->dp_out_buf[priv->dp_out_buf_len++] = *buf;
@@ -1208,7 +1202,8 @@ static int digi_write(struct usb_serial_port *port, const unsigned char *buf, in
1208 /* copy in new data */ 1202 /* copy in new data */
1209 memcpy(data, buf, new_len); 1203 memcpy(data, buf, new_len);
1210 1204
1211 if ((ret = usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0) { 1205 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1206 if (ret == 0) {
1212 priv->dp_write_urb_in_use = 1; 1207 priv->dp_write_urb_in_use = 1;
1213 ret = new_len; 1208 ret = new_len;
1214 priv->dp_out_buf_len = 0; 1209 priv->dp_out_buf_len = 0;
@@ -1222,7 +1217,7 @@ static int digi_write(struct usb_serial_port *port, const unsigned char *buf, in
1222 dbg("digi_write: returning %d", ret); 1217 dbg("digi_write: returning %d", ret);
1223 return ret; 1218 return ret;
1224 1219
1225} 1220}
1226 1221
1227static void digi_write_bulk_callback(struct urb *urb) 1222static void digi_write_bulk_callback(struct urb *urb)
1228{ 1223{
@@ -1237,13 +1232,13 @@ static void digi_write_bulk_callback(struct urb *urb)
1237 dbg("digi_write_bulk_callback: TOP, urb->status=%d", status); 1232 dbg("digi_write_bulk_callback: TOP, urb->status=%d", status);
1238 1233
1239 /* port and serial sanity check */ 1234 /* port and serial sanity check */
1240 if (port == NULL || (priv=usb_get_serial_port_data(port)) == NULL) { 1235 if (port == NULL || (priv = usb_get_serial_port_data(port)) == NULL) {
1241 err("%s: port or port->private is NULL, status=%d", 1236 err("%s: port or port->private is NULL, status=%d",
1242 __func__, status); 1237 __func__, status);
1243 return; 1238 return;
1244 } 1239 }
1245 serial = port->serial; 1240 serial = port->serial;
1246 if (serial == NULL || (serial_priv=usb_get_serial_data(serial)) == NULL) { 1241 if (serial == NULL || (serial_priv = usb_get_serial_data(serial)) == NULL) {
1247 err("%s: serial or serial->private is NULL, status=%d", 1242 err("%s: serial or serial->private is NULL, status=%d",
1248 __func__, status); 1243 __func__, status);
1249 return; 1244 return;
@@ -1262,17 +1257,19 @@ static void digi_write_bulk_callback(struct urb *urb)
1262 /* try to send any buffered data on this port, if it is open */ 1257 /* try to send any buffered data on this port, if it is open */
1263 spin_lock(&priv->dp_port_lock); 1258 spin_lock(&priv->dp_port_lock);
1264 priv->dp_write_urb_in_use = 0; 1259 priv->dp_write_urb_in_use = 0;
1265 if (port->open_count && port->write_urb->status != -EINPROGRESS 1260 if (port->port.count && port->write_urb->status != -EINPROGRESS
1266 && priv->dp_out_buf_len > 0) { 1261 && priv->dp_out_buf_len > 0) {
1267 *((unsigned char *)(port->write_urb->transfer_buffer)) 1262 *((unsigned char *)(port->write_urb->transfer_buffer))
1268 = (unsigned char)DIGI_CMD_SEND_DATA; 1263 = (unsigned char)DIGI_CMD_SEND_DATA;
1269 *((unsigned char *)(port->write_urb->transfer_buffer)+1) 1264 *((unsigned char *)(port->write_urb->transfer_buffer) + 1)
1270 = (unsigned char)priv->dp_out_buf_len; 1265 = (unsigned char)priv->dp_out_buf_len;
1271 port->write_urb->transfer_buffer_length = priv->dp_out_buf_len+2; 1266 port->write_urb->transfer_buffer_length =
1267 priv->dp_out_buf_len + 2;
1272 port->write_urb->dev = serial->dev; 1268 port->write_urb->dev = serial->dev;
1273 memcpy(port->write_urb->transfer_buffer+2, priv->dp_out_buf, 1269 memcpy(port->write_urb->transfer_buffer + 2, priv->dp_out_buf,
1274 priv->dp_out_buf_len); 1270 priv->dp_out_buf_len);
1275 if ((ret = usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0) { 1271 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1272 if (ret == 0) {
1276 priv->dp_write_urb_in_use = 1; 1273 priv->dp_write_urb_in_use = 1;
1277 priv->dp_out_buf_len = 0; 1274 priv->dp_out_buf_len = 0;
1278 } 1275 }
@@ -1289,16 +1286,17 @@ static void digi_write_bulk_callback(struct urb *urb)
1289 __func__, ret, priv->dp_port_num); 1286 __func__, ret, priv->dp_port_num);
1290} 1287}
1291 1288
1292static int digi_write_room(struct usb_serial_port *port) 1289static int digi_write_room(struct tty_struct *tty)
1293{ 1290{
1294 1291 struct usb_serial_port *port = tty->driver_data;
1295 int room;
1296 struct digi_port *priv = usb_get_serial_port_data(port); 1292 struct digi_port *priv = usb_get_serial_port_data(port);
1293 int room;
1297 unsigned long flags = 0; 1294 unsigned long flags = 0;
1298 1295
1299 spin_lock_irqsave(&priv->dp_port_lock, flags); 1296 spin_lock_irqsave(&priv->dp_port_lock, flags);
1300 1297
1301 if (port->write_urb->status == -EINPROGRESS || priv->dp_write_urb_in_use) 1298 if (port->write_urb->status == -EINPROGRESS ||
1299 priv->dp_write_urb_in_use)
1302 room = 0; 1300 room = 0;
1303 else 1301 else
1304 room = port->bulk_out_size - 2 - priv->dp_out_buf_len; 1302 room = port->bulk_out_size - 2 - priv->dp_out_buf_len;
@@ -1309,12 +1307,11 @@ static int digi_write_room(struct usb_serial_port *port)
1309 1307
1310} 1308}
1311 1309
1312static int digi_chars_in_buffer(struct usb_serial_port *port) 1310static int digi_chars_in_buffer(struct tty_struct *tty)
1313{ 1311{
1314 1312 struct usb_serial_port *port = tty->driver_data;
1315 struct digi_port *priv = usb_get_serial_port_data(port); 1313 struct digi_port *priv = usb_get_serial_port_data(port);
1316 1314
1317
1318 if (port->write_urb->status == -EINPROGRESS 1315 if (port->write_urb->status == -EINPROGRESS
1319 || priv->dp_write_urb_in_use) { 1316 || priv->dp_write_urb_in_use) {
1320 dbg("digi_chars_in_buffer: port=%d, chars=%d", 1317 dbg("digi_chars_in_buffer: port=%d, chars=%d",
@@ -1330,7 +1327,8 @@ static int digi_chars_in_buffer(struct usb_serial_port *port)
1330} 1327}
1331 1328
1332 1329
1333static int digi_open(struct usb_serial_port *port, struct file *filp) 1330static int digi_open(struct tty_struct *tty, struct usb_serial_port *port,
1331 struct file *filp)
1334{ 1332{
1335 int ret; 1333 int ret;
1336 unsigned char buf[32]; 1334 unsigned char buf[32];
@@ -1339,7 +1337,7 @@ static int digi_open(struct usb_serial_port *port, struct file *filp)
1339 unsigned long flags = 0; 1337 unsigned long flags = 0;
1340 1338
1341 dbg("digi_open: TOP: port=%d, open_count=%d", 1339 dbg("digi_open: TOP: port=%d, open_count=%d",
1342 priv->dp_port_num, port->open_count); 1340 priv->dp_port_num, port->port.count);
1343 1341
1344 /* be sure the device is started up */ 1342 /* be sure the device is started up */
1345 if (digi_startup_device(port->serial) != 0) 1343 if (digi_startup_device(port->serial) != 0)
@@ -1354,7 +1352,7 @@ static int digi_open(struct usb_serial_port *port, struct file *filp)
1354 } 1352 }
1355 1353
1356 /* wait for a close in progress to finish */ 1354 /* wait for a close in progress to finish */
1357 while(priv->dp_in_close) { 1355 while (priv->dp_in_close) {
1358 cond_wait_interruptible_timeout_irqrestore( 1356 cond_wait_interruptible_timeout_irqrestore(
1359 &priv->dp_close_wait, DIGI_RETRY_TIMEOUT, 1357 &priv->dp_close_wait, DIGI_RETRY_TIMEOUT,
1360 &priv->dp_port_lock, flags); 1358 &priv->dp_port_lock, flags);
@@ -1364,7 +1362,7 @@ static int digi_open(struct usb_serial_port *port, struct file *filp)
1364 } 1362 }
1365 1363
1366 spin_unlock_irqrestore(&priv->dp_port_lock, flags); 1364 spin_unlock_irqrestore(&priv->dp_port_lock, flags);
1367 1365
1368 /* read modem signals automatically whenever they change */ 1366 /* read modem signals automatically whenever they change */
1369 buf[0] = DIGI_CMD_READ_INPUT_SIGNALS; 1367 buf[0] = DIGI_CMD_READ_INPUT_SIGNALS;
1370 buf[1] = priv->dp_port_num; 1368 buf[1] = priv->dp_port_num;
@@ -1377,13 +1375,16 @@ static int digi_open(struct usb_serial_port *port, struct file *filp)
1377 buf[6] = DIGI_FLUSH_TX | DIGI_FLUSH_RX; 1375 buf[6] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
1378 buf[7] = 0; 1376 buf[7] = 0;
1379 1377
1380 if ((ret = digi_write_oob_command(port, buf, 8, 1)) != 0) 1378 ret = digi_write_oob_command(port, buf, 8, 1);
1379 if (ret != 0)
1381 dbg("digi_open: write oob failed, ret=%d", ret); 1380 dbg("digi_open: write oob failed, ret=%d", ret);
1382 1381
1383 /* set termios settings */ 1382 /* set termios settings */
1384 not_termios.c_cflag = ~port->tty->termios->c_cflag; 1383 if (tty) {
1385 not_termios.c_iflag = ~port->tty->termios->c_iflag; 1384 not_termios.c_cflag = ~tty->termios->c_cflag;
1386 digi_set_termios(port, &not_termios); 1385 not_termios.c_iflag = ~tty->termios->c_iflag;
1386 digi_set_termios(tty, port, &not_termios);
1387 }
1387 1388
1388 /* set DTR and RTS */ 1389 /* set DTR and RTS */
1389 digi_set_modem_signals(port, TIOCM_DTR|TIOCM_RTS, 1); 1390 digi_set_modem_signals(port, TIOCM_DTR|TIOCM_RTS, 1);
@@ -1392,16 +1393,16 @@ static int digi_open(struct usb_serial_port *port, struct file *filp)
1392} 1393}
1393 1394
1394 1395
1395static void digi_close(struct usb_serial_port *port, struct file *filp) 1396static void digi_close(struct tty_struct *tty, struct usb_serial_port *port,
1397 struct file *filp)
1396{ 1398{
1397 DEFINE_WAIT(wait); 1399 DEFINE_WAIT(wait);
1398 int ret; 1400 int ret;
1399 unsigned char buf[32]; 1401 unsigned char buf[32];
1400 struct tty_struct *tty = port->tty;
1401 struct digi_port *priv = usb_get_serial_port_data(port); 1402 struct digi_port *priv = usb_get_serial_port_data(port);
1402 1403
1403 dbg("digi_close: TOP: port=%d, open_count=%d", 1404 dbg("digi_close: TOP: port=%d, open_count=%d",
1404 priv->dp_port_num, port->open_count); 1405 priv->dp_port_num, port->port.count);
1405 1406
1406 mutex_lock(&port->serial->disc_mutex); 1407 mutex_lock(&port->serial->disc_mutex);
1407 /* if disconnected, just clear flags */ 1408 /* if disconnected, just clear flags */
@@ -1426,9 +1427,8 @@ static void digi_close(struct usb_serial_port *port, struct file *filp)
1426 1427
1427 if (port->serial->dev) { 1428 if (port->serial->dev) {
1428 /* wait for transmit idle */ 1429 /* wait for transmit idle */
1429 if ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0) { 1430 if ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0)
1430 digi_transmit_idle(port, DIGI_CLOSE_TIMEOUT); 1431 digi_transmit_idle(port, DIGI_CLOSE_TIMEOUT);
1431 }
1432 /* drop DTR and RTS */ 1432 /* drop DTR and RTS */
1433 digi_set_modem_signals(port, 0, 0); 1433 digi_set_modem_signals(port, 0, 0);
1434 1434
@@ -1462,11 +1462,13 @@ static void digi_close(struct usb_serial_port *port, struct file *filp)
1462 buf[18] = DIGI_FLUSH_TX | DIGI_FLUSH_RX; 1462 buf[18] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
1463 buf[19] = 0; 1463 buf[19] = 0;
1464 1464
1465 if ((ret = digi_write_oob_command(port, buf, 20, 0)) != 0) 1465 ret = digi_write_oob_command(port, buf, 20, 0);
1466 if (ret != 0)
1466 dbg("digi_close: write oob failed, ret=%d", ret); 1467 dbg("digi_close: write oob failed, ret=%d", ret);
1467 1468
1468 /* wait for final commands on oob port to complete */ 1469 /* wait for final commands on oob port to complete */
1469 prepare_to_wait(&priv->dp_flush_wait, &wait, TASK_INTERRUPTIBLE); 1470 prepare_to_wait(&priv->dp_flush_wait, &wait,
1471 TASK_INTERRUPTIBLE);
1470 schedule_timeout(DIGI_CLOSE_TIMEOUT); 1472 schedule_timeout(DIGI_CLOSE_TIMEOUT);
1471 finish_wait(&priv->dp_flush_wait, &wait); 1473 finish_wait(&priv->dp_flush_wait, &wait);
1472 1474
@@ -1486,15 +1488,15 @@ exit:
1486 1488
1487 1489
1488/* 1490/*
1489* Digi Startup Device 1491 * Digi Startup Device
1490* 1492 *
1491* Starts reads on all ports. Must be called AFTER startup, with 1493 * Starts reads on all ports. Must be called AFTER startup, with
1492* urbs initialized. Returns 0 if successful, non-zero error otherwise. 1494 * urbs initialized. Returns 0 if successful, non-zero error otherwise.
1493*/ 1495 */
1494 1496
1495static int digi_startup_device(struct usb_serial *serial) 1497static int digi_startup_device(struct usb_serial *serial)
1496{ 1498{
1497 int i,ret = 0; 1499 int i, ret = 0;
1498 struct digi_serial *serial_priv = usb_get_serial_data(serial); 1500 struct digi_serial *serial_priv = usb_get_serial_data(serial);
1499 struct usb_serial_port *port; 1501 struct usb_serial_port *port;
1500 1502
@@ -1512,7 +1514,8 @@ static int digi_startup_device(struct usb_serial *serial)
1512 for (i = 0; i < serial->type->num_ports + 1; i++) { 1514 for (i = 0; i < serial->type->num_ports + 1; i++) {
1513 port = serial->port[i]; 1515 port = serial->port[i];
1514 port->write_urb->dev = port->serial->dev; 1516 port->write_urb->dev = port->serial->dev;
1515 if ((ret = usb_submit_urb(port->read_urb, GFP_KERNEL)) != 0) { 1517 ret = usb_submit_urb(port->read_urb, GFP_KERNEL);
1518 if (ret != 0) {
1516 err("%s: usb_submit_urb failed, ret=%d, port=%d", 1519 err("%s: usb_submit_urb failed, ret=%d, port=%d",
1517 __func__, ret, i); 1520 __func__, ret, i);
1518 break; 1521 break;
@@ -1533,7 +1536,7 @@ static int digi_startup(struct usb_serial *serial)
1533 1536
1534 /* allocate the private data structures for all ports */ 1537 /* allocate the private data structures for all ports */
1535 /* number of regular ports + 1 for the out-of-band port */ 1538 /* number of regular ports + 1 for the out-of-band port */
1536 for(i = 0; i < serial->type->num_ports + 1; i++) { 1539 for (i = 0; i < serial->type->num_ports + 1; i++) {
1537 /* allocate port private structure */ 1540 /* allocate port private structure */
1538 priv = kmalloc(sizeof(struct digi_port), GFP_KERNEL); 1541 priv = kmalloc(sizeof(struct digi_port), GFP_KERNEL);
1539 if (priv == NULL) { 1542 if (priv == NULL) {
@@ -1596,7 +1599,7 @@ static void digi_shutdown(struct usb_serial *serial)
1596 1599
1597 /* free the private data structures for all ports */ 1600 /* free the private data structures for all ports */
1598 /* number of regular ports + 1 for the out-of-band port */ 1601 /* number of regular ports + 1 for the out-of-band port */
1599 for(i = 0; i < serial->type->num_ports + 1; i++) 1602 for (i = 0; i < serial->type->num_ports + 1; i++)
1600 kfree(usb_get_serial_port_data(serial->port[i])); 1603 kfree(usb_get_serial_port_data(serial->port[i]));
1601 kfree(usb_get_serial_data(serial)); 1604 kfree(usb_get_serial_data(serial));
1602} 1605}
@@ -1619,7 +1622,7 @@ static void digi_read_bulk_callback(struct urb *urb)
1619 return; 1622 return;
1620 } 1623 }
1621 if (port->serial == NULL || 1624 if (port->serial == NULL ||
1622 (serial_priv=usb_get_serial_data(port->serial)) == NULL) { 1625 (serial_priv = usb_get_serial_data(port->serial)) == NULL) {
1623 err("%s: serial is bad or serial->private is NULL, status=%d", 1626 err("%s: serial is bad or serial->private is NULL, status=%d",
1624 __func__, status); 1627 __func__, status);
1625 return; 1628 return;
@@ -1643,45 +1646,46 @@ static void digi_read_bulk_callback(struct urb *urb)
1643 1646
1644 /* continue read */ 1647 /* continue read */
1645 urb->dev = port->serial->dev; 1648 urb->dev = port->serial->dev;
1646 if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 1649 ret = usb_submit_urb(urb, GFP_ATOMIC);
1650 if (ret != 0) {
1647 err("%s: failed resubmitting urb, ret=%d, port=%d", 1651 err("%s: failed resubmitting urb, ret=%d, port=%d",
1648 __func__, ret, priv->dp_port_num); 1652 __func__, ret, priv->dp_port_num);
1649 } 1653 }
1650 1654
1651} 1655}
1652 1656
1653/* 1657/*
1654* Digi Read INB Callback 1658 * Digi Read INB Callback
1655* 1659 *
1656* Digi Read INB Callback handles reads on the in band ports, sending 1660 * Digi Read INB Callback handles reads on the in band ports, sending
1657* the data on to the tty subsystem. When called we know port and 1661 * the data on to the tty subsystem. When called we know port and
1658* port->private are not NULL and port->serial has been validated. 1662 * port->private are not NULL and port->serial has been validated.
1659* It returns 0 if successful, 1 if successful but the port is 1663 * It returns 0 if successful, 1 if successful but the port is
1660* throttled, and -1 if the sanity checks failed. 1664 * throttled, and -1 if the sanity checks failed.
1661*/ 1665 */
1662 1666
1663static int digi_read_inb_callback(struct urb *urb) 1667static int digi_read_inb_callback(struct urb *urb)
1664{ 1668{
1665 1669
1666 struct usb_serial_port *port = urb->context; 1670 struct usb_serial_port *port = urb->context;
1667 struct tty_struct *tty = port->tty; 1671 struct tty_struct *tty = port->port.tty;
1668 struct digi_port *priv = usb_get_serial_port_data(port); 1672 struct digi_port *priv = usb_get_serial_port_data(port);
1669 int opcode = ((unsigned char *)urb->transfer_buffer)[0]; 1673 int opcode = ((unsigned char *)urb->transfer_buffer)[0];
1670 int len = ((unsigned char *)urb->transfer_buffer)[1]; 1674 int len = ((unsigned char *)urb->transfer_buffer)[1];
1671 int port_status = ((unsigned char *)urb->transfer_buffer)[2]; 1675 int port_status = ((unsigned char *)urb->transfer_buffer)[2];
1672 unsigned char *data = ((unsigned char *)urb->transfer_buffer)+3; 1676 unsigned char *data = ((unsigned char *)urb->transfer_buffer) + 3;
1673 int flag,throttled; 1677 int flag, throttled;
1674 int i; 1678 int i;
1675 int status = urb->status; 1679 int status = urb->status;
1676 1680
1677 /* do not process callbacks on closed ports */ 1681 /* do not process callbacks on closed ports */
1678 /* but do continue the read chain */ 1682 /* but do continue the read chain */
1679 if (port->open_count == 0) 1683 if (port->port.count == 0)
1680 return 0; 1684 return 0;
1681 1685
1682 /* short/multiple packet check */ 1686 /* short/multiple packet check */
1683 if (urb->actual_length != len + 2) { 1687 if (urb->actual_length != len + 2) {
1684 err("%s: INCOMPLETE OR MULTIPLE PACKET, urb->status=%d, " 1688 err("%s: INCOMPLETE OR MULTIPLE PACKET, urb->status=%d, "
1685 "port=%d, opcode=%d, len=%d, actual_length=%d, " 1689 "port=%d, opcode=%d, len=%d, actual_length=%d, "
1686 "status=%d", __func__, status, priv->dp_port_num, 1690 "status=%d", __func__, status, priv->dp_port_num,
1687 opcode, len, urb->actual_length, port_status); 1691 opcode, len, urb->actual_length, port_status);
@@ -1723,8 +1727,9 @@ static int digi_read_inb_callback(struct urb *urb)
1723 if (flag == TTY_NORMAL) 1727 if (flag == TTY_NORMAL)
1724 tty_insert_flip_string(tty, data, len); 1728 tty_insert_flip_string(tty, data, len);
1725 else { 1729 else {
1726 for(i = 0; i < len; i++) 1730 for (i = 0; i < len; i++)
1727 tty_insert_flip_char(tty, data[i], flag); 1731 tty_insert_flip_char(tty,
1732 data[i], flag);
1728 } 1733 }
1729 tty_flip_buffer_push(tty); 1734 tty_flip_buffer_push(tty);
1730 } 1735 }
@@ -1736,19 +1741,19 @@ static int digi_read_inb_callback(struct urb *urb)
1736 else if (opcode != DIGI_CMD_RECEIVE_DATA) 1741 else if (opcode != DIGI_CMD_RECEIVE_DATA)
1737 dbg("%s: unknown opcode: %d", __func__, opcode); 1742 dbg("%s: unknown opcode: %d", __func__, opcode);
1738 1743
1739 return(throttled ? 1 : 0); 1744 return throttled ? 1 : 0;
1740 1745
1741} 1746}
1742 1747
1743 1748
1744/* 1749/*
1745* Digi Read OOB Callback 1750 * Digi Read OOB Callback
1746* 1751 *
1747* Digi Read OOB Callback handles reads on the out of band port. 1752 * Digi Read OOB Callback handles reads on the out of band port.
1748* When called we know port and port->private are not NULL and 1753 * When called we know port and port->private are not NULL and
1749* the port->serial is valid. It returns 0 if successful, and 1754 * the port->serial is valid. It returns 0 if successful, and
1750* -1 if the sanity checks failed. 1755 * -1 if the sanity checks failed.
1751*/ 1756 */
1752 1757
1753static int digi_read_oob_callback(struct urb *urb) 1758static int digi_read_oob_callback(struct urb *urb)
1754{ 1759{
@@ -1758,12 +1763,13 @@ static int digi_read_oob_callback(struct urb *urb)
1758 struct digi_port *priv = usb_get_serial_port_data(port); 1763 struct digi_port *priv = usb_get_serial_port_data(port);
1759 int opcode, line, status, val; 1764 int opcode, line, status, val;
1760 int i; 1765 int i;
1766 unsigned int rts;
1761 1767
1762 dbg("digi_read_oob_callback: port=%d, len=%d", 1768 dbg("digi_read_oob_callback: port=%d, len=%d",
1763 priv->dp_port_num, urb->actual_length); 1769 priv->dp_port_num, urb->actual_length);
1764 1770
1765 /* handle each oob command */ 1771 /* handle each oob command */
1766 for(i = 0; i < urb->actual_length - 3;) { 1772 for (i = 0; i < urb->actual_length - 3;) {
1767 opcode = ((unsigned char *)urb->transfer_buffer)[i++]; 1773 opcode = ((unsigned char *)urb->transfer_buffer)[i++];
1768 line = ((unsigned char *)urb->transfer_buffer)[i++]; 1774 line = ((unsigned char *)urb->transfer_buffer)[i++];
1769 status = ((unsigned char *)urb->transfer_buffer)[i++]; 1775 status = ((unsigned char *)urb->transfer_buffer)[i++];
@@ -1777,27 +1783,29 @@ static int digi_read_oob_callback(struct urb *urb)
1777 1783
1778 port = serial->port[line]; 1784 port = serial->port[line];
1779 1785
1780 if ((priv=usb_get_serial_port_data(port)) == NULL) 1786 priv = usb_get_serial_port_data(port);
1787 if (priv == NULL)
1781 return -1; 1788 return -1;
1782 1789
1790 rts = 0;
1791 if (port->port.count)
1792 rts = port->port.tty->termios->c_cflag & CRTSCTS;
1793
1783 if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) { 1794 if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
1784 spin_lock(&priv->dp_port_lock); 1795 spin_lock(&priv->dp_port_lock);
1785 /* convert from digi flags to termiox flags */ 1796 /* convert from digi flags to termiox flags */
1786 if (val & DIGI_READ_INPUT_SIGNALS_CTS) { 1797 if (val & DIGI_READ_INPUT_SIGNALS_CTS) {
1787 priv->dp_modem_signals |= TIOCM_CTS; 1798 priv->dp_modem_signals |= TIOCM_CTS;
1788 /* port must be open to use tty struct */ 1799 /* port must be open to use tty struct */
1789 if (port->open_count 1800 if (rts) {
1790 && port->tty->termios->c_cflag & CRTSCTS) { 1801 port->port.tty->hw_stopped = 0;
1791 port->tty->hw_stopped = 0;
1792 digi_wakeup_write(port); 1802 digi_wakeup_write(port);
1793 } 1803 }
1794 } else { 1804 } else {
1795 priv->dp_modem_signals &= ~TIOCM_CTS; 1805 priv->dp_modem_signals &= ~TIOCM_CTS;
1796 /* port must be open to use tty struct */ 1806 /* port must be open to use tty struct */
1797 if (port->open_count 1807 if (rts)
1798 && port->tty->termios->c_cflag & CRTSCTS) { 1808 port->port.tty->hw_stopped = 1;
1799 port->tty->hw_stopped = 1;
1800 }
1801 } 1809 }
1802 if (val & DIGI_READ_INPUT_SIGNALS_DSR) 1810 if (val & DIGI_READ_INPUT_SIGNALS_DSR)
1803 priv->dp_modem_signals |= TIOCM_DSR; 1811 priv->dp_modem_signals |= TIOCM_DSR;
@@ -1834,7 +1842,7 @@ static int __init digi_init(void)
1834 if (retval) 1842 if (retval)
1835 goto failed_acceleport_2_device; 1843 goto failed_acceleport_2_device;
1836 retval = usb_serial_register(&digi_acceleport_4_device); 1844 retval = usb_serial_register(&digi_acceleport_4_device);
1837 if (retval) 1845 if (retval)
1838 goto failed_acceleport_4_device; 1846 goto failed_acceleport_4_device;
1839 retval = usb_register(&digi_driver); 1847 retval = usb_register(&digi_driver);
1840 if (retval) 1848 if (retval)
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
index c5ec309a3cb1..a6ab5b58d9ca 100644
--- a/drivers/usb/serial/empeg.c
+++ b/drivers/usb/serial/empeg.c
@@ -11,36 +11,39 @@
11 * it under the terms of the GNU General Public License, as published by 11 * it under the terms of the GNU General Public License, as published by
12 * the Free Software Foundation, version 2. 12 * the Free Software Foundation, version 2.
13 * 13 *
14 * See Documentation/usb/usb-serial.txt for more information on using this driver 14 * See Documentation/usb/usb-serial.txt for more information on using this
15 * 15 * driver
16 *
16 * (07/16/2001) gb 17 * (07/16/2001) gb
17 * remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this 18 * remove unused code in empeg_close() (thanks to Oliver Neukum for
18 * out) and rewrote empeg_set_termios(). 19 * pointing this out) and rewrote empeg_set_termios().
19 * 20 *
20 * (05/30/2001) gkh 21 * (05/30/2001) gkh
21 * switched from using spinlock to a semaphore, which fixes lots of problems. 22 * switched from using spinlock to a semaphore, which fixes lots of
23 * problems.
22 * 24 *
23 * (04/08/2001) gb 25 * (04/08/2001) gb
24 * Identify version on module load. 26 * Identify version on module load.
25 * 27 *
26 * (01/22/2001) gb 28 * (01/22/2001) gb
27 * Added write_room() and chars_in_buffer() support. 29 * Added write_room() and chars_in_buffer() support.
28 * 30 *
29 * (12/21/2000) gb 31 * (12/21/2000) gb
30 * Moved termio stuff inside the port->active check. 32 * Moved termio stuff inside the port->active check.
31 * Moved MOD_DEC_USE_COUNT to end of empeg_close(). 33 * Moved MOD_DEC_USE_COUNT to end of empeg_close().
32 * 34 *
33 * (12/03/2000) gb 35 * (12/03/2000) gb
34 * Added port->tty->ldisc.set_termios(port->tty, NULL) to empeg_open() 36 * Added port->port.tty->ldisc.set_termios(port->port.tty, NULL) to
35 * This notifies the tty driver that the termios have changed. 37 * empeg_open(). This notifies the tty driver that the termios have
36 * 38 * changed.
39 *
37 * (11/13/2000) gb 40 * (11/13/2000) gb
38 * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to empeg_open() 41 * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to
39 * (It only needs to be set once - Doh!) 42 * empeg_open() (It only needs to be set once - Doh!)
40 * 43 *
41 * (11/11/2000) gb 44 * (11/11/2000) gb
42 * Updated to work with id_table structure. 45 * Updated to work with id_table structure.
43 * 46 *
44 * (11/04/2000) gb 47 * (11/04/2000) gb
45 * Forked this from visor.c, and hacked it up to work with an 48 * Forked this from visor.c, and hacked it up to work with an
46 * Empeg ltd. empeg-car player. Constructive criticism welcomed. 49 * Empeg ltd. empeg-car player. Constructive criticism welcomed.
@@ -48,7 +51,7 @@
48 * use of his code, and for his guidance, advice and patience. :) 51 * use of his code, and for his guidance, advice and patience. :)
49 * A 'Thank You' is in order for John Ripley of Empeg ltd for his 52 * A 'Thank You' is in order for John Ripley of Empeg ltd for his
50 * advice, and patience too. 53 * advice, and patience too.
51 * 54 *
52 */ 55 */
53 56
54#include <linux/kernel.h> 57#include <linux/kernel.h>
@@ -60,7 +63,7 @@
60#include <linux/tty_flip.h> 63#include <linux/tty_flip.h>
61#include <linux/module.h> 64#include <linux/module.h>
62#include <linux/spinlock.h> 65#include <linux/spinlock.h>
63#include <asm/uaccess.h> 66#include <linux/uaccess.h>
64#include <linux/usb.h> 67#include <linux/usb.h>
65#include <linux/usb/serial.h> 68#include <linux/usb/serial.h>
66 69
@@ -77,31 +80,30 @@ static int debug;
77#define EMPEG_PRODUCT_ID 0x0001 80#define EMPEG_PRODUCT_ID 0x0001
78 81
79/* function prototypes for an empeg-car player */ 82/* function prototypes for an empeg-car player */
80static int empeg_open (struct usb_serial_port *port, struct file *filp); 83static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
81static void empeg_close (struct usb_serial_port *port, struct file *filp); 84 struct file *filp);
82static int empeg_write (struct usb_serial_port *port, 85static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port,
83 const unsigned char *buf, 86 struct file *filp);
84 int count); 87static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port,
85static int empeg_write_room (struct usb_serial_port *port); 88 const unsigned char *buf,
86static int empeg_chars_in_buffer (struct usb_serial_port *port); 89 int count);
87static void empeg_throttle (struct usb_serial_port *port); 90static int empeg_write_room(struct tty_struct *tty);
88static void empeg_unthrottle (struct usb_serial_port *port); 91static int empeg_chars_in_buffer(struct tty_struct *tty);
89static int empeg_startup (struct usb_serial *serial); 92static void empeg_throttle(struct tty_struct *tty);
90static void empeg_shutdown (struct usb_serial *serial); 93static void empeg_unthrottle(struct tty_struct *tty);
91static int empeg_ioctl (struct usb_serial_port *port, 94static int empeg_startup(struct usb_serial *serial);
92 struct file * file, 95static void empeg_shutdown(struct usb_serial *serial);
93 unsigned int cmd, 96static void empeg_set_termios(struct tty_struct *tty,
94 unsigned long arg); 97 struct usb_serial_port *port, struct ktermios *old_termios);
95static void empeg_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); 98static void empeg_write_bulk_callback(struct urb *urb);
96static void empeg_write_bulk_callback (struct urb *urb); 99static void empeg_read_bulk_callback(struct urb *urb);
97static void empeg_read_bulk_callback (struct urb *urb);
98 100
99static struct usb_device_id id_table [] = { 101static struct usb_device_id id_table [] = {
100 { USB_DEVICE(EMPEG_VENDOR_ID, EMPEG_PRODUCT_ID) }, 102 { USB_DEVICE(EMPEG_VENDOR_ID, EMPEG_PRODUCT_ID) },
101 { } /* Terminating entry */ 103 { } /* Terminating entry */
102}; 104};
103 105
104MODULE_DEVICE_TABLE (usb, id_table); 106MODULE_DEVICE_TABLE(usb, id_table);
105 107
106static struct usb_driver empeg_driver = { 108static struct usb_driver empeg_driver = {
107 .name = "empeg", 109 .name = "empeg",
@@ -125,7 +127,6 @@ static struct usb_serial_driver empeg_device = {
125 .unthrottle = empeg_unthrottle, 127 .unthrottle = empeg_unthrottle,
126 .attach = empeg_startup, 128 .attach = empeg_startup,
127 .shutdown = empeg_shutdown, 129 .shutdown = empeg_shutdown,
128 .ioctl = empeg_ioctl,
129 .set_termios = empeg_set_termios, 130 .set_termios = empeg_set_termios,
130 .write = empeg_write, 131 .write = empeg_write,
131 .write_room = empeg_write_room, 132 .write_room = empeg_write_room,
@@ -145,7 +146,8 @@ static int bytes_out;
145/****************************************************************************** 146/******************************************************************************
146 * Empeg specific driver functions 147 * Empeg specific driver functions
147 ******************************************************************************/ 148 ******************************************************************************/
148static int empeg_open (struct usb_serial_port *port, struct file *filp) 149static int empeg_open(struct tty_struct *tty, struct usb_serial_port *port,
150 struct file *filp)
149{ 151{
150 struct usb_serial *serial = port->serial; 152 struct usb_serial *serial = port->serial;
151 int result = 0; 153 int result = 0;
@@ -153,7 +155,7 @@ static int empeg_open (struct usb_serial_port *port, struct file *filp)
153 dbg("%s - port %d", __func__, port->number); 155 dbg("%s - port %d", __func__, port->number);
154 156
155 /* Force default termio settings */ 157 /* Force default termio settings */
156 empeg_set_termios (port, NULL) ; 158 empeg_set_termios(tty, port, NULL) ;
157 159
158 bytes_in = 0; 160 bytes_in = 0;
159 bytes_out = 0; 161 bytes_out = 0;
@@ -161,7 +163,7 @@ static int empeg_open (struct usb_serial_port *port, struct file *filp)
161 /* Start reading from the device */ 163 /* Start reading from the device */
162 usb_fill_bulk_urb( 164 usb_fill_bulk_urb(
163 port->read_urb, 165 port->read_urb,
164 serial->dev, 166 serial->dev,
165 usb_rcvbulkpipe(serial->dev, 167 usb_rcvbulkpipe(serial->dev,
166 port->bulk_in_endpointAddress), 168 port->bulk_in_endpointAddress),
167 port->read_urb->transfer_buffer, 169 port->read_urb->transfer_buffer,
@@ -172,13 +174,16 @@ static int empeg_open (struct usb_serial_port *port, struct file *filp)
172 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 174 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
173 175
174 if (result) 176 if (result)
175 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 177 dev_err(&port->dev,
178 "%s - failed submitting read urb, error %d\n",
179 __func__, result);
176 180
177 return result; 181 return result;
178} 182}
179 183
180 184
181static void empeg_close (struct usb_serial_port *port, struct file * filp) 185static void empeg_close(struct tty_struct *tty, struct usb_serial_port *port,
186 struct file *filp)
182{ 187{
183 dbg("%s - port %d", __func__, port->number); 188 dbg("%s - port %d", __func__, port->number);
184 189
@@ -189,7 +194,8 @@ static void empeg_close (struct usb_serial_port *port, struct file * filp)
189} 194}
190 195
191 196
192static int empeg_write (struct usb_serial_port *port, const unsigned char *buf, int count) 197static int empeg_write(struct tty_struct *tty, struct usb_serial_port *port,
198 const unsigned char *buf, int count)
193{ 199{
194 struct usb_serial *serial = port->serial; 200 struct usb_serial *serial = port->serial;
195 struct urb *urb; 201 struct urb *urb;
@@ -203,11 +209,10 @@ static int empeg_write (struct usb_serial_port *port, const unsigned char *buf,
203 dbg("%s - port %d", __func__, port->number); 209 dbg("%s - port %d", __func__, port->number);
204 210
205 while (count > 0) { 211 while (count > 0) {
206
207 /* try to find a free urb in our list of them */ 212 /* try to find a free urb in our list of them */
208 urb = NULL; 213 urb = NULL;
209 214
210 spin_lock_irqsave (&write_urb_pool_lock, flags); 215 spin_lock_irqsave(&write_urb_pool_lock, flags);
211 216
212 for (i = 0; i < NUM_URBS; ++i) { 217 for (i = 0; i < NUM_URBS; ++i) {
213 if (write_urb_pool[i]->status != -EINPROGRESS) { 218 if (write_urb_pool[i]->status != -EINPROGRESS) {
@@ -216,7 +221,7 @@ static int empeg_write (struct usb_serial_port *port, const unsigned char *buf,
216 } 221 }
217 } 222 }
218 223
219 spin_unlock_irqrestore (&write_urb_pool_lock, flags); 224 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
220 225
221 if (urb == NULL) { 226 if (urb == NULL) {
222 dbg("%s - no more free urbs", __func__); 227 dbg("%s - no more free urbs", __func__);
@@ -224,25 +229,27 @@ static int empeg_write (struct usb_serial_port *port, const unsigned char *buf,
224 } 229 }
225 230
226 if (urb->transfer_buffer == NULL) { 231 if (urb->transfer_buffer == NULL) {
227 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC); 232 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
228 if (urb->transfer_buffer == NULL) { 233 if (urb->transfer_buffer == NULL) {
229 dev_err(&port->dev, "%s no more kernel memory...\n", __func__); 234 dev_err(&port->dev,
235 "%s no more kernel memory...\n",
236 __func__);
230 goto exit; 237 goto exit;
231 } 238 }
232 } 239 }
233 240
234 transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE); 241 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
235 242
236 memcpy (urb->transfer_buffer, current_position, transfer_size); 243 memcpy(urb->transfer_buffer, current_position, transfer_size);
237 244
238 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size, urb->transfer_buffer); 245 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size, urb->transfer_buffer);
239 246
240 /* build up our urb */ 247 /* build up our urb */
241 usb_fill_bulk_urb ( 248 usb_fill_bulk_urb(
242 urb, 249 urb,
243 serial->dev, 250 serial->dev,
244 usb_sndbulkpipe(serial->dev, 251 usb_sndbulkpipe(serial->dev,
245 port->bulk_out_endpointAddress), 252 port->bulk_out_endpointAddress),
246 urb->transfer_buffer, 253 urb->transfer_buffer,
247 transfer_size, 254 transfer_size,
248 empeg_write_bulk_callback, 255 empeg_write_bulk_callback,
@@ -262,66 +269,57 @@ static int empeg_write (struct usb_serial_port *port, const unsigned char *buf,
262 bytes_out += transfer_size; 269 bytes_out += transfer_size;
263 270
264 } 271 }
265
266exit: 272exit:
267 return bytes_sent; 273 return bytes_sent;
268 274}
269}
270 275
271 276
272static int empeg_write_room (struct usb_serial_port *port) 277static int empeg_write_room(struct tty_struct *tty)
273{ 278{
279 struct usb_serial_port *port = tty->driver_data;
274 unsigned long flags; 280 unsigned long flags;
275 int i; 281 int i;
276 int room = 0; 282 int room = 0;
277 283
278 dbg("%s - port %d", __func__, port->number); 284 dbg("%s - port %d", __func__, port->number);
279 285
280 spin_lock_irqsave (&write_urb_pool_lock, flags); 286 spin_lock_irqsave(&write_urb_pool_lock, flags);
281
282 /* tally up the number of bytes available */ 287 /* tally up the number of bytes available */
283 for (i = 0; i < NUM_URBS; ++i) { 288 for (i = 0; i < NUM_URBS; ++i) {
284 if (write_urb_pool[i]->status != -EINPROGRESS) { 289 if (write_urb_pool[i]->status != -EINPROGRESS)
285 room += URB_TRANSFER_BUFFER_SIZE; 290 room += URB_TRANSFER_BUFFER_SIZE;
286 } 291 }
287 } 292 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
288
289 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
290
291 dbg("%s - returns %d", __func__, room); 293 dbg("%s - returns %d", __func__, room);
292 294 return room;
293 return (room);
294 295
295} 296}
296 297
297 298
298static int empeg_chars_in_buffer (struct usb_serial_port *port) 299static int empeg_chars_in_buffer(struct tty_struct *tty)
299{ 300{
301 struct usb_serial_port *port = tty->driver_data;
300 unsigned long flags; 302 unsigned long flags;
301 int i; 303 int i;
302 int chars = 0; 304 int chars = 0;
303 305
304 dbg("%s - port %d", __func__, port->number); 306 dbg("%s - port %d", __func__, port->number);
305 307
306 spin_lock_irqsave (&write_urb_pool_lock, flags); 308 spin_lock_irqsave(&write_urb_pool_lock, flags);
307 309
308 /* tally up the number of bytes waiting */ 310 /* tally up the number of bytes waiting */
309 for (i = 0; i < NUM_URBS; ++i) { 311 for (i = 0; i < NUM_URBS; ++i) {
310 if (write_urb_pool[i]->status == -EINPROGRESS) { 312 if (write_urb_pool[i]->status == -EINPROGRESS)
311 chars += URB_TRANSFER_BUFFER_SIZE; 313 chars += URB_TRANSFER_BUFFER_SIZE;
312 }
313 } 314 }
314 315
315 spin_unlock_irqrestore (&write_urb_pool_lock, flags); 316 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
316
317 dbg("%s - returns %d", __func__, chars); 317 dbg("%s - returns %d", __func__, chars);
318 318 return chars;
319 return (chars);
320
321} 319}
322 320
323 321
324static void empeg_write_bulk_callback (struct urb *urb) 322static void empeg_write_bulk_callback(struct urb *urb)
325{ 323{
326 struct usb_serial_port *port = urb->context; 324 struct usb_serial_port *port = urb->context;
327 int status = urb->status; 325 int status = urb->status;
@@ -338,7 +336,7 @@ static void empeg_write_bulk_callback (struct urb *urb)
338} 336}
339 337
340 338
341static void empeg_read_bulk_callback (struct urb *urb) 339static void empeg_read_bulk_callback(struct urb *urb)
342{ 340{
343 struct usb_serial_port *port = urb->context; 341 struct usb_serial_port *port = urb->context;
344 struct tty_struct *tty; 342 struct tty_struct *tty;
@@ -354,9 +352,9 @@ static void empeg_read_bulk_callback (struct urb *urb)
354 return; 352 return;
355 } 353 }
356 354
357 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 355 usb_serial_debug_data(debug, &port->dev, __func__,
358 356 urb->actual_length, data);
359 tty = port->tty; 357 tty = port->port.tty;
360 358
361 if (urb->actual_length) { 359 if (urb->actual_length) {
362 tty_buffer_request_room(tty, urb->actual_length); 360 tty_buffer_request_room(tty, urb->actual_length);
@@ -368,7 +366,7 @@ static void empeg_read_bulk_callback (struct urb *urb)
368 /* Continue trying to always read */ 366 /* Continue trying to always read */
369 usb_fill_bulk_urb( 367 usb_fill_bulk_urb(
370 port->read_urb, 368 port->read_urb,
371 port->serial->dev, 369 port->serial->dev,
372 usb_rcvbulkpipe(port->serial->dev, 370 usb_rcvbulkpipe(port->serial->dev,
373 port->bulk_in_endpointAddress), 371 port->bulk_in_endpointAddress),
374 port->read_urb->transfer_buffer, 372 port->read_urb->transfer_buffer,
@@ -379,38 +377,39 @@ static void empeg_read_bulk_callback (struct urb *urb)
379 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 377 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
380 378
381 if (result) 379 if (result)
382 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 380 dev_err(&urb->dev->dev,
381 "%s - failed resubmitting read urb, error %d\n",
382 __func__, result);
383 383
384 return; 384 return;
385 385
386} 386}
387 387
388 388
389static void empeg_throttle (struct usb_serial_port *port) 389static void empeg_throttle(struct tty_struct *tty)
390{ 390{
391 struct usb_serial_port *port = tty->driver_data;
391 dbg("%s - port %d", __func__, port->number); 392 dbg("%s - port %d", __func__, port->number);
392 usb_kill_urb(port->read_urb); 393 usb_kill_urb(port->read_urb);
393} 394}
394 395
395 396
396static void empeg_unthrottle (struct usb_serial_port *port) 397static void empeg_unthrottle(struct tty_struct *tty)
397{ 398{
399 struct usb_serial_port *port = tty->driver_data;
398 int result; 400 int result;
399
400 dbg("%s - port %d", __func__, port->number); 401 dbg("%s - port %d", __func__, port->number);
401 402
402 port->read_urb->dev = port->serial->dev; 403 port->read_urb->dev = port->serial->dev;
403
404 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 404 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
405
406 if (result) 405 if (result)
407 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 406 dev_err(&port->dev,
408 407 "%s - failed submitting read urb, error %d\n",
409 return; 408 __func__, result);
410} 409}
411 410
412 411
413static int empeg_startup (struct usb_serial *serial) 412static int empeg_startup(struct usb_serial *serial)
414{ 413{
415 int r; 414 int r;
416 415
@@ -422,7 +421,7 @@ static int empeg_startup (struct usb_serial *serial)
422 return -ENODEV; 421 return -ENODEV;
423 } 422 }
424 dbg("%s - reset config", __func__); 423 dbg("%s - reset config", __func__);
425 r = usb_reset_configuration (serial->dev); 424 r = usb_reset_configuration(serial->dev);
426 425
427 /* continue on with initialization */ 426 /* continue on with initialization */
428 return r; 427 return r;
@@ -430,34 +429,27 @@ static int empeg_startup (struct usb_serial *serial)
430} 429}
431 430
432 431
433static void empeg_shutdown (struct usb_serial *serial) 432static void empeg_shutdown(struct usb_serial *serial)
434{ 433{
435 dbg ("%s", __func__); 434 dbg("%s", __func__);
436}
437
438
439static int empeg_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
440{
441 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd);
442
443 return -ENOIOCTLCMD;
444} 435}
445 436
446 437
447static void empeg_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 438static void empeg_set_termios(struct tty_struct *tty,
439 struct usb_serial_port *port, struct ktermios *old_termios)
448{ 440{
449 struct ktermios *termios = port->tty->termios; 441 struct ktermios *termios = tty->termios;
450 dbg("%s - port %d", __func__, port->number); 442 dbg("%s - port %d", __func__, port->number);
451 443
452 /* 444 /*
453 * The empeg-car player wants these particular tty settings. 445 * The empeg-car player wants these particular tty settings.
454 * You could, for example, change the baud rate, however the 446 * You could, for example, change the baud rate, however the
455 * player only supports 115200 (currently), so there is really 447 * player only supports 115200 (currently), so there is really
456 * no point in support for changes to the tty settings. 448 * no point in support for changes to the tty settings.
457 * (at least for now) 449 * (at least for now)
458 * 450 *
459 * The default requirements for this device are: 451 * The default requirements for this device are:
460 */ 452 */
461 termios->c_iflag 453 termios->c_iflag
462 &= ~(IGNBRK /* disable ignore break */ 454 &= ~(IGNBRK /* disable ignore break */
463 | BRKINT /* disable break causes interrupt */ 455 | BRKINT /* disable break causes interrupt */
@@ -491,18 +483,18 @@ static void empeg_set_termios (struct usb_serial_port *port, struct ktermios *ol
491 * this is bad as it opens up the possibility of dropping bytes 483 * this is bad as it opens up the possibility of dropping bytes
492 * on the floor. We don't want to drop bytes on the floor. :) 484 * on the floor. We don't want to drop bytes on the floor. :)
493 */ 485 */
494 port->tty->low_latency = 1; 486 tty->low_latency = 1;
495 tty_encode_baud_rate(port->tty, 115200, 115200); 487 tty_encode_baud_rate(tty, 115200, 115200);
496} 488}
497 489
498 490
499static int __init empeg_init (void) 491static int __init empeg_init(void)
500{ 492{
501 struct urb *urb; 493 struct urb *urb;
502 int i, retval; 494 int i, retval;
503 495
504 /* create our write urb pool and transfer buffers */ 496 /* create our write urb pool and transfer buffers */
505 spin_lock_init (&write_urb_pool_lock); 497 spin_lock_init(&write_urb_pool_lock);
506 for (i = 0; i < NUM_URBS; ++i) { 498 for (i = 0; i < NUM_URBS; ++i) {
507 urb = usb_alloc_urb(0, GFP_KERNEL); 499 urb = usb_alloc_urb(0, GFP_KERNEL);
508 write_urb_pool[i] = urb; 500 write_urb_pool[i] = urb;
@@ -511,9 +503,10 @@ static int __init empeg_init (void)
511 continue; 503 continue;
512 } 504 }
513 505
514 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); 506 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
507 GFP_KERNEL);
515 if (!urb->transfer_buffer) { 508 if (!urb->transfer_buffer) {
516 err("%s - out of memory for urb buffers.", 509 err("%s - out of memory for urb buffers.",
517 __func__); 510 __func__);
518 continue; 511 continue;
519 } 512 }
@@ -542,36 +535,36 @@ failed_usb_serial_register:
542} 535}
543 536
544 537
545static void __exit empeg_exit (void) 538static void __exit empeg_exit(void)
546{ 539{
547 int i; 540 int i;
548 unsigned long flags; 541 unsigned long flags;
549 542
550 usb_deregister(&empeg_driver); 543 usb_deregister(&empeg_driver);
551 usb_serial_deregister (&empeg_device); 544 usb_serial_deregister(&empeg_device);
552 545
553 spin_lock_irqsave (&write_urb_pool_lock, flags); 546 spin_lock_irqsave(&write_urb_pool_lock, flags);
554 547
555 for (i = 0; i < NUM_URBS; ++i) { 548 for (i = 0; i < NUM_URBS; ++i) {
556 if (write_urb_pool[i]) { 549 if (write_urb_pool[i]) {
557 /* FIXME - uncomment the following usb_kill_urb call when 550 /* FIXME - uncomment the following usb_kill_urb call
558 * the host controllers get fixed to set urb->dev = NULL after 551 * when the host controllers get fixed to set urb->dev
559 * the urb is finished. Otherwise this call oopses. */ 552 * = NULL after the urb is finished. Otherwise this
553 * call oopses. */
560 /* usb_kill_urb(write_urb_pool[i]); */ 554 /* usb_kill_urb(write_urb_pool[i]); */
561 kfree(write_urb_pool[i]->transfer_buffer); 555 kfree(write_urb_pool[i]->transfer_buffer);
562 usb_free_urb (write_urb_pool[i]); 556 usb_free_urb(write_urb_pool[i]);
563 } 557 }
564 } 558 }
565 559 spin_unlock_irqrestore(&write_urb_pool_lock, flags);
566 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
567} 560}
568 561
569 562
570module_init(empeg_init); 563module_init(empeg_init);
571module_exit(empeg_exit); 564module_exit(empeg_exit);
572 565
573MODULE_AUTHOR( DRIVER_AUTHOR ); 566MODULE_AUTHOR(DRIVER_AUTHOR);
574MODULE_DESCRIPTION( DRIVER_DESC ); 567MODULE_DESCRIPTION(DRIVER_DESC);
575MODULE_LICENSE("GPL"); 568MODULE_LICENSE("GPL");
576 569
577module_param(debug, bool, S_IRUGO | S_IWUSR); 570module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c
index cc4fbd9d60be..711e84f6ed82 100644
--- a/drivers/usb/serial/ezusb.c
+++ b/drivers/usb/serial/ezusb.c
@@ -20,7 +20,8 @@
20/* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ 20/* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
21#define CPUCS_REG 0x7F92 21#define CPUCS_REG 0x7F92
22 22
23int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest) 23int ezusb_writememory(struct usb_serial *serial, int address,
24 unsigned char *data, int length, __u8 request)
24{ 25{
25 int result; 26 int result;
26 unsigned char *transfer_buffer; 27 unsigned char *transfer_buffer;
@@ -33,26 +34,27 @@ int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *da
33 34
34 transfer_buffer = kmemdup(data, length, GFP_KERNEL); 35 transfer_buffer = kmemdup(data, length, GFP_KERNEL);
35 if (!transfer_buffer) { 36 if (!transfer_buffer) {
36 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __func__, length); 37 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n",
38 __func__, length);
37 return -ENOMEM; 39 return -ENOMEM;
38 } 40 }
39 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer, length, 3000); 41 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
40 kfree (transfer_buffer); 42 request, 0x40, address, 0, transfer_buffer, length, 3000);
43 kfree(transfer_buffer);
41 return result; 44 return result;
42} 45}
46EXPORT_SYMBOL_GPL(ezusb_writememory);
43 47
44int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit) 48int ezusb_set_reset(struct usb_serial *serial, unsigned char reset_bit)
45{ 49{
46 int response; 50 int response;
47 51
48 /* dbg("%s - %d", __func__, reset_bit); */ 52 /* dbg("%s - %d", __func__, reset_bit); */
49 response = ezusb_writememory (serial, CPUCS_REG, &reset_bit, 1, 0xa0); 53 response = ezusb_writememory(serial, CPUCS_REG, &reset_bit, 1, 0xa0);
50 if (response < 0) 54 if (response < 0)
51 dev_err(&serial->dev->dev, "%s- %d failed\n", __func__, reset_bit); 55 dev_err(&serial->dev->dev, "%s- %d failed\n",
56 __func__, reset_bit);
52 return response; 57 return response;
53} 58}
54
55
56EXPORT_SYMBOL_GPL(ezusb_writememory);
57EXPORT_SYMBOL_GPL(ezusb_set_reset); 59EXPORT_SYMBOL_GPL(ezusb_set_reset);
58 60
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 0ff4a3971e45..838717250145 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -12,7 +12,8 @@
12 * the Free Software Foundation; either version 2 of the License, or 12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version. 13 * (at your option) any later version.
14 * 14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver 15 * See Documentation/usb/usb-serial.txt for more information on using this
16 * driver
16 * 17 *
17 * See http://ftdi-usb-sio.sourceforge.net for upto date testing info 18 * See http://ftdi-usb-sio.sourceforge.net for upto date testing info
18 * and extra documentation 19 * and extra documentation
@@ -25,7 +26,8 @@
25/* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */ 26/* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
26/* Thanx to FTDI for so kindly providing details of the protocol required */ 27/* Thanx to FTDI for so kindly providing details of the protocol required */
27/* to talk to the device */ 28/* to talk to the device */
28/* Thanx to gkh and the rest of the usb dev group for all code I have assimilated :-) */ 29/* Thanx to gkh and the rest of the usb dev group for all code I have
30 assimilated :-) */
29 31
30#include <linux/kernel.h> 32#include <linux/kernel.h>
31#include <linux/errno.h> 33#include <linux/errno.h>
@@ -36,7 +38,7 @@
36#include <linux/tty_flip.h> 38#include <linux/tty_flip.h>
37#include <linux/module.h> 39#include <linux/module.h>
38#include <linux/spinlock.h> 40#include <linux/spinlock.h>
39#include <asm/uaccess.h> 41#include <linux/uaccess.h>
40#include <linux/usb.h> 42#include <linux/usb.h>
41#include <linux/serial.h> 43#include <linux/serial.h>
42#include <linux/usb/serial.h> 44#include <linux/usb/serial.h>
@@ -55,17 +57,22 @@ static __u16 product;
55 57
56struct ftdi_private { 58struct ftdi_private {
57 ftdi_chip_type_t chip_type; 59 ftdi_chip_type_t chip_type;
58 /* type of the device, either SIO or FT8U232AM */ 60 /* type of device, either SIO or FT8U232AM */
59 int baud_base; /* baud base clock for divisor setting */ 61 int baud_base; /* baud base clock for divisor setting */
60 int custom_divisor; /* custom_divisor kludge, this is for baud_base (different from what goes to the chip!) */ 62 int custom_divisor; /* custom_divisor kludge, this is for
63 baud_base (different from what goes to the
64 chip!) */
61 __u16 last_set_data_urb_value ; 65 __u16 last_set_data_urb_value ;
62 /* the last data state set - needed for doing a break */ 66 /* the last data state set - needed for doing
63 int write_offset; /* This is the offset in the usb data block to write the serial data - 67 * a break
64 * it is different between devices 68 */
69 int write_offset; /* This is the offset in the usb data block to
70 * write the serial data - it varies between
71 * devices
65 */ 72 */
66 int flags; /* some ASYNC_xxxx flags are supported */ 73 int flags; /* some ASYNC_xxxx flags are supported */
67 unsigned long last_dtr_rts; /* saved modem control outputs */ 74 unsigned long last_dtr_rts; /* saved modem control outputs */
68 wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ 75 wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
69 char prev_status, diff_status; /* Used for TIOCMIWAIT */ 76 char prev_status, diff_status; /* Used for TIOCMIWAIT */
70 __u8 rx_flags; /* receive state flags (throttling) */ 77 __u8 rx_flags; /* receive state flags (throttling) */
71 spinlock_t rx_lock; /* spinlock for receive state */ 78 spinlock_t rx_lock; /* spinlock for receive state */
@@ -76,8 +83,10 @@ struct ftdi_private {
76 83
77 __u16 interface; /* FT2232C port interface (0 for FT232/245) */ 84 __u16 interface; /* FT2232C port interface (0 for FT232/245) */
78 85
79 speed_t force_baud; /* if non-zero, force the baud rate to this value */ 86 speed_t force_baud; /* if non-zero, force the baud rate to
80 int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ 87 this value */
88 int force_rtscts; /* if non-zero, force RTS-CTS to always
89 be enabled */
81 90
82 spinlock_t tx_lock; /* spinlock for transmit state */ 91 spinlock_t tx_lock; /* spinlock for transmit state */
83 unsigned long tx_bytes; 92 unsigned long tx_bytes;
@@ -88,13 +97,14 @@ struct ftdi_private {
88/* struct ftdi_sio_quirk is used by devices requiring special attention. */ 97/* struct ftdi_sio_quirk is used by devices requiring special attention. */
89struct ftdi_sio_quirk { 98struct ftdi_sio_quirk {
90 int (*probe)(struct usb_serial *); 99 int (*probe)(struct usb_serial *);
91 void (*port_probe)(struct ftdi_private *); /* Special settings for probed ports. */ 100 /* Special settings for probed ports. */
101 void (*port_probe)(struct ftdi_private *);
92}; 102};
93 103
94static int ftdi_jtag_probe (struct usb_serial *serial); 104static int ftdi_jtag_probe(struct usb_serial *serial);
95static int ftdi_mtxorb_hack_setup (struct usb_serial *serial); 105static int ftdi_mtxorb_hack_setup(struct usb_serial *serial);
96static void ftdi_USB_UIRT_setup (struct ftdi_private *priv); 106static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
97static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv); 107static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
98 108
99static struct ftdi_sio_quirk ftdi_jtag_quirk = { 109static struct ftdi_sio_quirk ftdi_jtag_quirk = {
100 .probe = ftdi_jtag_probe, 110 .probe = ftdi_jtag_probe,
@@ -174,270 +184,270 @@ static struct usb_device_id id_table_combined [] = {
174 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) }, 184 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
175 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, 185 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
176 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, 186 { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
177 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0100_PID) }, 187 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
178 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0101_PID) }, 188 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
179 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0102_PID) }, 189 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
180 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0103_PID) }, 190 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
181 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0104_PID) }, 191 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
182 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0105_PID) }, 192 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
183 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0106_PID) }, 193 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
184 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0107_PID) }, 194 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
185 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0108_PID) }, 195 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
186 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0109_PID) }, 196 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
187 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010A_PID) }, 197 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
188 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010B_PID) }, 198 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
189 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010C_PID) }, 199 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
190 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010D_PID) }, 200 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
191 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010E_PID) }, 201 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
192 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010F_PID) }, 202 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
193 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0110_PID) }, 203 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
194 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0111_PID) }, 204 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
195 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0112_PID) }, 205 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
196 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0113_PID) }, 206 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
197 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0114_PID) }, 207 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
198 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0115_PID) }, 208 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
199 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0116_PID) }, 209 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
200 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0117_PID) }, 210 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
201 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0118_PID) }, 211 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
202 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0119_PID) }, 212 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
203 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011A_PID) }, 213 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
204 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011B_PID) }, 214 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
205 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011C_PID) }, 215 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
206 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011D_PID) }, 216 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
207 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011E_PID) }, 217 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
208 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011F_PID) }, 218 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
209 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0120_PID) }, 219 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
210 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0121_PID) }, 220 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
211 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0122_PID) }, 221 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
212 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0123_PID) }, 222 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
213 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0124_PID) }, 223 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
214 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0125_PID) }, 224 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
215 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0126_PID) }, 225 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
216 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0127_PID), 226 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID),
217 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 227 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
218 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0128_PID) }, 228 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
219 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0129_PID) }, 229 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
220 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012A_PID) }, 230 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
221 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012B_PID) }, 231 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
222 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012C_PID), 232 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID),
223 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 233 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
224 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012D_PID) }, 234 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
225 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012E_PID) }, 235 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
226 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012F_PID) }, 236 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
227 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0130_PID) }, 237 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
228 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0131_PID) }, 238 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
229 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0132_PID) }, 239 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
230 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0133_PID) }, 240 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
231 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0134_PID) }, 241 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
232 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0135_PID) }, 242 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
233 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0136_PID) }, 243 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
234 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0137_PID) }, 244 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
235 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0138_PID) }, 245 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
236 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0139_PID) }, 246 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
237 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013A_PID) }, 247 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
238 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013B_PID) }, 248 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
239 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013C_PID) }, 249 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
240 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013D_PID) }, 250 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
241 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013E_PID) }, 251 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
242 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013F_PID) }, 252 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
243 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0140_PID) }, 253 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
244 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0141_PID) }, 254 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
245 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0142_PID) }, 255 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
246 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0143_PID) }, 256 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
247 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0144_PID) }, 257 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
248 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0145_PID) }, 258 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
249 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0146_PID) }, 259 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
250 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0147_PID) }, 260 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
251 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0148_PID) }, 261 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
252 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0149_PID) }, 262 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
253 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014A_PID) }, 263 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
254 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014B_PID) }, 264 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
255 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014C_PID) }, 265 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
256 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014D_PID) }, 266 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
257 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014E_PID) }, 267 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
258 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014F_PID) }, 268 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
259 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0150_PID) }, 269 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
260 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0151_PID) }, 270 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
261 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0152_PID) }, 271 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
262 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0153_PID), 272 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID),
263 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 273 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
264 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0154_PID), 274 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID),
265 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 275 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
266 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0155_PID), 276 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID),
267 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 277 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
268 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0156_PID), 278 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID),
269 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 279 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
270 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0157_PID), 280 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID),
271 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 281 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
272 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0158_PID), 282 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID),
273 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 283 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
274 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0159_PID) }, 284 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
275 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015A_PID) }, 285 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
276 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015B_PID) }, 286 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
277 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015C_PID) }, 287 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
278 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015D_PID) }, 288 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
279 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015E_PID) }, 289 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
280 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015F_PID) }, 290 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
281 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0160_PID) }, 291 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
282 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0161_PID) }, 292 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
283 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0162_PID) }, 293 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
284 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0163_PID) }, 294 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
285 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0164_PID) }, 295 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
286 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0165_PID) }, 296 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
287 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0166_PID) }, 297 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
288 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0167_PID) }, 298 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
289 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0168_PID) }, 299 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
290 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0169_PID) }, 300 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
291 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016A_PID) }, 301 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
292 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016B_PID) }, 302 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
293 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016C_PID) }, 303 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
294 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016D_PID) }, 304 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
295 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016E_PID) }, 305 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
296 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016F_PID) }, 306 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
297 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0170_PID) }, 307 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
298 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0171_PID) }, 308 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
299 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0172_PID) }, 309 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
300 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0173_PID) }, 310 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
301 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0174_PID) }, 311 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
302 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0175_PID) }, 312 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
303 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0176_PID) }, 313 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
304 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0177_PID) }, 314 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
305 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0178_PID) }, 315 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
306 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0179_PID) }, 316 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
307 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017A_PID) }, 317 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
308 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017B_PID) }, 318 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
309 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017C_PID) }, 319 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
310 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017D_PID) }, 320 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
311 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017E_PID) }, 321 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
312 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017F_PID) }, 322 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
313 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0180_PID) }, 323 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
314 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0181_PID) }, 324 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
315 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0182_PID) }, 325 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
316 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0183_PID) }, 326 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
317 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0184_PID) }, 327 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
318 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0185_PID) }, 328 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
319 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0186_PID) }, 329 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
320 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0187_PID) }, 330 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
321 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0188_PID) }, 331 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
322 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0189_PID) }, 332 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
323 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018A_PID) }, 333 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
324 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018B_PID) }, 334 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
325 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018C_PID) }, 335 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
326 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018D_PID) }, 336 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
327 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018E_PID) }, 337 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
328 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018F_PID) }, 338 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
329 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0190_PID) }, 339 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
330 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0191_PID) }, 340 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
331 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0192_PID) }, 341 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
332 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0193_PID) }, 342 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
333 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0194_PID) }, 343 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
334 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0195_PID) }, 344 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
335 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0196_PID) }, 345 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
336 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0197_PID) }, 346 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
337 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0198_PID) }, 347 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
338 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0199_PID) }, 348 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
339 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019A_PID) }, 349 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
340 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019B_PID) }, 350 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
341 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019C_PID) }, 351 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
342 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019D_PID) }, 352 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
343 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019E_PID) }, 353 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
344 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019F_PID) }, 354 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
345 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A0_PID) }, 355 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
346 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A1_PID) }, 356 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
347 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A2_PID) }, 357 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
348 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A3_PID) }, 358 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
349 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A4_PID) }, 359 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
350 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A5_PID) }, 360 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
351 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A6_PID) }, 361 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
352 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A7_PID) }, 362 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
353 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A8_PID) }, 363 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
354 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A9_PID) }, 364 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
355 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AA_PID) }, 365 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
356 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AB_PID) }, 366 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
357 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AC_PID) }, 367 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
358 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AD_PID) }, 368 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
359 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AE_PID) }, 369 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
360 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AF_PID) }, 370 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
361 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B0_PID) }, 371 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
362 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B1_PID) }, 372 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
363 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B2_PID) }, 373 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
364 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B3_PID) }, 374 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
365 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B4_PID) }, 375 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
366 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B5_PID) }, 376 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
367 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B6_PID) }, 377 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
368 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B7_PID) }, 378 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
369 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B8_PID) }, 379 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
370 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B9_PID) }, 380 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
371 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BA_PID) }, 381 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
372 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BB_PID) }, 382 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
373 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BC_PID) }, 383 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
374 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BD_PID) }, 384 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
375 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BE_PID) }, 385 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
376 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BF_PID) }, 386 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
377 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C0_PID) }, 387 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
378 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C1_PID) }, 388 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
379 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C2_PID) }, 389 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
380 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C3_PID) }, 390 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
381 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C4_PID) }, 391 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
382 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C5_PID) }, 392 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
383 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C6_PID) }, 393 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
384 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C7_PID) }, 394 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
385 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C8_PID) }, 395 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
386 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C9_PID) }, 396 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
387 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CA_PID) }, 397 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
388 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CB_PID) }, 398 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
389 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CC_PID) }, 399 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
390 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CD_PID) }, 400 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
391 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CE_PID) }, 401 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
392 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CF_PID) }, 402 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
393 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D0_PID) }, 403 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
394 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D1_PID) }, 404 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
395 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D2_PID) }, 405 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
396 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D3_PID) }, 406 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
397 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D4_PID) }, 407 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
398 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D5_PID) }, 408 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
399 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D6_PID) }, 409 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
400 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D7_PID) }, 410 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
401 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D8_PID) }, 411 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
402 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D9_PID) }, 412 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
403 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DA_PID) }, 413 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
404 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DB_PID) }, 414 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
405 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DC_PID) }, 415 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
406 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DD_PID) }, 416 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
407 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DE_PID) }, 417 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
408 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DF_PID) }, 418 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
409 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E0_PID) }, 419 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
410 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E1_PID) }, 420 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
411 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E2_PID) }, 421 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
412 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E3_PID) }, 422 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
413 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E4_PID) }, 423 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
414 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E5_PID) }, 424 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
415 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E6_PID) }, 425 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
416 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E7_PID) }, 426 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
417 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E8_PID) }, 427 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
418 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E9_PID) }, 428 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
419 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EA_PID) }, 429 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
420 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EB_PID) }, 430 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
421 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EC_PID) }, 431 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
422 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01ED_PID) }, 432 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
423 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EE_PID) }, 433 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
424 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EF_PID) }, 434 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
425 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F0_PID) }, 435 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
426 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F1_PID) }, 436 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
427 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F2_PID) }, 437 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
428 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F3_PID) }, 438 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
429 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F4_PID) }, 439 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
430 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F5_PID) }, 440 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
431 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F6_PID) }, 441 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
432 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F7_PID) }, 442 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
433 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F8_PID) }, 443 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
434 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F9_PID) }, 444 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
435 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FA_PID) }, 445 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
436 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FB_PID) }, 446 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
437 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FC_PID) }, 447 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
438 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FD_PID) }, 448 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
439 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FE_PID) }, 449 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
440 { USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FF_PID) }, 450 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
441 { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, 451 { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
442 { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, 452 { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
443 { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, 453 { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
@@ -642,7 +652,7 @@ static struct usb_device_id id_table_combined [] = {
642 { } /* Terminating entry */ 652 { } /* Terminating entry */
643}; 653};
644 654
645MODULE_DEVICE_TABLE (usb, id_table_combined); 655MODULE_DEVICE_TABLE(usb, id_table_combined);
646 656
647static struct usb_driver ftdi_driver = { 657static struct usb_driver ftdi_driver = {
648 .name = "ftdi_sio", 658 .name = "ftdi_sio",
@@ -678,30 +688,37 @@ static const char *ftdi_chip_name[] = {
678 | ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP) 688 | ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP)
679 689
680/* function prototypes for a FTDI serial converter */ 690/* function prototypes for a FTDI serial converter */
681static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id); 691static int ftdi_sio_probe(struct usb_serial *serial,
682static void ftdi_shutdown (struct usb_serial *serial); 692 const struct usb_device_id *id);
683static int ftdi_sio_port_probe (struct usb_serial_port *port); 693static void ftdi_shutdown(struct usb_serial *serial);
684static int ftdi_sio_port_remove (struct usb_serial_port *port); 694static int ftdi_sio_port_probe(struct usb_serial_port *port);
685static int ftdi_open (struct usb_serial_port *port, struct file *filp); 695static int ftdi_sio_port_remove(struct usb_serial_port *port);
686static void ftdi_close (struct usb_serial_port *port, struct file *filp); 696static int ftdi_open(struct tty_struct *tty,
687static int ftdi_write (struct usb_serial_port *port, const unsigned char *buf, int count); 697 struct usb_serial_port *port, struct file *filp);
688static int ftdi_write_room (struct usb_serial_port *port); 698static void ftdi_close(struct tty_struct *tty,
689static int ftdi_chars_in_buffer (struct usb_serial_port *port); 699 struct usb_serial_port *port, struct file *filp);
690static void ftdi_write_bulk_callback (struct urb *urb); 700static int ftdi_write(struct tty_struct *tty, struct usb_serial_port *port,
691static void ftdi_read_bulk_callback (struct urb *urb); 701 const unsigned char *buf, int count);
692static void ftdi_process_read (struct work_struct *work); 702static int ftdi_write_room(struct tty_struct *tty);
693static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios * old); 703static int ftdi_chars_in_buffer(struct tty_struct *tty);
694static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file); 704static void ftdi_write_bulk_callback(struct urb *urb);
695static int ftdi_tiocmset (struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear); 705static void ftdi_read_bulk_callback(struct urb *urb);
696static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); 706static void ftdi_process_read(struct work_struct *work);
697static void ftdi_break_ctl (struct usb_serial_port *port, int break_state ); 707static void ftdi_set_termios(struct tty_struct *tty,
698static void ftdi_throttle (struct usb_serial_port *port); 708 struct usb_serial_port *port, struct ktermios *old);
699static void ftdi_unthrottle (struct usb_serial_port *port); 709static int ftdi_tiocmget(struct tty_struct *tty, struct file *file);
700 710static int ftdi_tiocmset(struct tty_struct *tty, struct file *file,
701static unsigned short int ftdi_232am_baud_base_to_divisor (int baud, int base); 711 unsigned int set, unsigned int clear);
702static unsigned short int ftdi_232am_baud_to_divisor (int baud); 712static int ftdi_ioctl(struct tty_struct *tty, struct file *file,
703static __u32 ftdi_232bm_baud_base_to_divisor (int baud, int base); 713 unsigned int cmd, unsigned long arg);
704static __u32 ftdi_232bm_baud_to_divisor (int baud); 714static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
715static void ftdi_throttle(struct tty_struct *tty);
716static void ftdi_unthrottle(struct tty_struct *tty);
717
718static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
719static unsigned short int ftdi_232am_baud_to_divisor(int baud);
720static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
721static __u32 ftdi_232bm_baud_to_divisor(int baud);
705 722
706static struct usb_serial_driver ftdi_sio_device = { 723static struct usb_serial_driver ftdi_sio_device = {
707 .driver = { 724 .driver = {
@@ -752,44 +769,54 @@ static struct usb_serial_driver ftdi_sio_device = {
752static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base) 769static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
753{ 770{
754 unsigned short int divisor; 771 unsigned short int divisor;
755 int divisor3 = base / 2 / baud; // divisor shifted 3 bits to the left 772 /* divisor shifted 3 bits to the left */
756 if ((divisor3 & 0x7) == 7) divisor3 ++; // round x.7/8 up to x+1 773 int divisor3 = base / 2 / baud;
774 if ((divisor3 & 0x7) == 7)
775 divisor3++; /* round x.7/8 up to x+1 */
757 divisor = divisor3 >> 3; 776 divisor = divisor3 >> 3;
758 divisor3 &= 0x7; 777 divisor3 &= 0x7;
759 if (divisor3 == 1) divisor |= 0xc000; else // 0.125 778 if (divisor3 == 1)
760 if (divisor3 >= 4) divisor |= 0x4000; else // 0.5 779 divisor |= 0xc000;
761 if (divisor3 != 0) divisor |= 0x8000; // 0.25 780 else if (divisor3 >= 4)
762 if (divisor == 1) divisor = 0; /* special case for maximum baud rate */ 781 divisor |= 0x4000;
782 else if (divisor3 != 0)
783 divisor |= 0x8000;
784 else if (divisor == 1)
785 divisor = 0; /* special case for maximum baud rate */
763 return divisor; 786 return divisor;
764} 787}
765 788
766static unsigned short int ftdi_232am_baud_to_divisor(int baud) 789static unsigned short int ftdi_232am_baud_to_divisor(int baud)
767{ 790{
768 return(ftdi_232am_baud_base_to_divisor(baud, 48000000)); 791 return ftdi_232am_baud_base_to_divisor(baud, 48000000);
769} 792}
770 793
771static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base) 794static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
772{ 795{
773 static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 }; 796 static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
774 __u32 divisor; 797 __u32 divisor;
775 int divisor3 = base / 2 / baud; // divisor shifted 3 bits to the left 798 /* divisor shifted 3 bits to the left */
799 int divisor3 = base / 2 / baud;
776 divisor = divisor3 >> 3; 800 divisor = divisor3 >> 3;
777 divisor |= (__u32)divfrac[divisor3 & 0x7] << 14; 801 divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
778 /* Deal with special cases for highest baud rates. */ 802 /* Deal with special cases for highest baud rates. */
779 if (divisor == 1) divisor = 0; else // 1.0 803 if (divisor == 1)
780 if (divisor == 0x4001) divisor = 1; // 1.5 804 divisor = 0;
805 else if (divisor == 0x4001)
806 divisor = 1;
781 return divisor; 807 return divisor;
782} 808}
783 809
784static __u32 ftdi_232bm_baud_to_divisor(int baud) 810static __u32 ftdi_232bm_baud_to_divisor(int baud)
785{ 811{
786 return(ftdi_232bm_baud_base_to_divisor(baud, 48000000)); 812 return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
787} 813}
788 814
789#define set_mctrl(port, set) update_mctrl((port), (set), 0) 815#define set_mctrl(port, set) update_mctrl((port), (set), 0)
790#define clear_mctrl(port, clear) update_mctrl((port), 0, (clear)) 816#define clear_mctrl(port, clear) update_mctrl((port), 0, (clear))
791 817
792static int update_mctrl(struct usb_serial_port *port, unsigned int set, unsigned int clear) 818static int update_mctrl(struct usb_serial_port *port, unsigned int set,
819 unsigned int clear)
793{ 820{
794 struct ftdi_private *priv = usb_get_serial_port_data(port); 821 struct ftdi_private *priv = usb_get_serial_port_data(port);
795 char *buf; 822 char *buf;
@@ -843,42 +870,8 @@ static int update_mctrl(struct usb_serial_port *port, unsigned int set, unsigned
843} 870}
844 871
845 872
846static __u32 get_ftdi_divisor(struct usb_serial_port * port); 873static __u32 get_ftdi_divisor(struct tty_struct *tty,
847 874 struct usb_serial_port *port)
848
849static int change_speed(struct usb_serial_port *port)
850{
851 struct ftdi_private *priv = usb_get_serial_port_data(port);
852 char *buf;
853 __u16 urb_value;
854 __u16 urb_index;
855 __u32 urb_index_value;
856 int rv;
857
858 buf = kmalloc(1, GFP_NOIO);
859 if (!buf)
860 return -ENOMEM;
861
862 urb_index_value = get_ftdi_divisor(port);
863 urb_value = (__u16)urb_index_value;
864 urb_index = (__u16)(urb_index_value >> 16);
865 if (priv->interface) { /* FT2232C */
866 urb_index = (__u16)((urb_index << 8) | priv->interface);
867 }
868
869 rv = usb_control_msg(port->serial->dev,
870 usb_sndctrlpipe(port->serial->dev, 0),
871 FTDI_SIO_SET_BAUDRATE_REQUEST,
872 FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
873 urb_value, urb_index,
874 buf, 0, WDR_SHORT_TIMEOUT);
875
876 kfree(buf);
877 return rv;
878}
879
880
881static __u32 get_ftdi_divisor(struct usb_serial_port * port)
882{ /* get_ftdi_divisor */ 875{ /* get_ftdi_divisor */
883 struct ftdi_private *priv = usb_get_serial_port_data(port); 876 struct ftdi_private *priv = usb_get_serial_port_data(port);
884 __u32 div_value = 0; 877 __u32 div_value = 0;
@@ -886,48 +879,56 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
886 int baud; 879 int baud;
887 880
888 /* 881 /*
889 * The logic involved in setting the baudrate can be cleanly split in 3 steps. 882 * The logic involved in setting the baudrate can be cleanly split into
890 * Obtaining the actual baud rate is a little tricky since unix traditionally 883 * 3 steps.
891 * somehow ignored the possibility to set non-standard baud rates.
892 * 1. Standard baud rates are set in tty->termios->c_cflag 884 * 1. Standard baud rates are set in tty->termios->c_cflag
893 * 2. If these are not enough, you can set any speed using alt_speed as follows: 885 * 2. If these are not enough, you can set any speed using alt_speed as
886 * follows:
894 * - set tty->termios->c_cflag speed to B38400 887 * - set tty->termios->c_cflag speed to B38400
895 * - set your real speed in tty->alt_speed; it gets ignored when 888 * - set your real speed in tty->alt_speed; it gets ignored when
896 * alt_speed==0, (or) 889 * alt_speed==0, (or)
897 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as follows: 890 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as
898 * flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP], this just 891 * follows:
899 * sets alt_speed to (HI: 57600, VHI: 115200, SHI: 230400, WARP: 460800) 892 * flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP],
893 * this just sets alt_speed to (HI: 57600, VHI: 115200,
894 * SHI: 230400, WARP: 460800)
900 * ** Steps 1, 2 are done courtesy of tty_get_baud_rate 895 * ** Steps 1, 2 are done courtesy of tty_get_baud_rate
901 * 3. You can also set baud rate by setting custom divisor as follows 896 * 3. You can also set baud rate by setting custom divisor as follows
902 * - set tty->termios->c_cflag speed to B38400 897 * - set tty->termios->c_cflag speed to B38400
903 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as follows: 898 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as
899 * follows:
904 * o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST 900 * o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
905 * o custom_divisor set to baud_base / your_new_baudrate 901 * o custom_divisor set to baud_base / your_new_baudrate
906 * ** Step 3 is done courtesy of code borrowed from serial.c - I should really 902 * ** Step 3 is done courtesy of code borrowed from serial.c
907 * spend some time and separate+move this common code to serial.c, it is 903 * I should really spend some time and separate + move this common
908 * replicated in nearly every serial driver you see. 904 * code to serial.c, it is replicated in nearly every serial driver
905 * you see.
909 */ 906 */
910 907
911 /* 1. Get the baud rate from the tty settings, this observes alt_speed hack */ 908 /* 1. Get the baud rate from the tty settings, this observes
909 alt_speed hack */
912 910
913 baud = tty_get_baud_rate(port->tty); 911 baud = tty_get_baud_rate(tty);
914 dbg("%s - tty_get_baud_rate reports speed %d", __func__, baud); 912 dbg("%s - tty_get_baud_rate reports speed %d", __func__, baud);
915 913
916 /* 2. Observe async-compatible custom_divisor hack, update baudrate if needed */ 914 /* 2. Observe async-compatible custom_divisor hack, update baudrate
915 if needed */
917 916
918 if (baud == 38400 && 917 if (baud == 38400 &&
919 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) && 918 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
920 (priv->custom_divisor)) { 919 (priv->custom_divisor)) {
921 baud = priv->baud_base / priv->custom_divisor; 920 baud = priv->baud_base / priv->custom_divisor;
922 dbg("%s - custom divisor %d sets baud rate to %d", __func__, priv->custom_divisor, baud); 921 dbg("%s - custom divisor %d sets baud rate to %d",
922 __func__, priv->custom_divisor, baud);
923 } 923 }
924 924
925 /* 3. Convert baudrate to device-specific divisor */ 925 /* 3. Convert baudrate to device-specific divisor */
926 926
927 if (!baud) baud = 9600; 927 if (!baud)
928 switch(priv->chip_type) { 928 baud = 9600;
929 switch (priv->chip_type) {
929 case SIO: /* SIO chip */ 930 case SIO: /* SIO chip */
930 switch(baud) { 931 switch (baud) {
931 case 300: div_value = ftdi_sio_b300; break; 932 case 300: div_value = ftdi_sio_b300; break;
932 case 600: div_value = ftdi_sio_b600; break; 933 case 600: div_value = ftdi_sio_b600; break;
933 case 1200: div_value = ftdi_sio_b1200; break; 934 case 1200: div_value = ftdi_sio_b1200; break;
@@ -940,7 +941,8 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
940 case 115200: div_value = ftdi_sio_b115200; break; 941 case 115200: div_value = ftdi_sio_b115200; break;
941 } /* baud */ 942 } /* baud */
942 if (div_value == 0) { 943 if (div_value == 0) {
943 dbg("%s - Baudrate (%d) requested is not supported", __func__, baud); 944 dbg("%s - Baudrate (%d) requested is not supported",
945 __func__, baud);
944 div_value = ftdi_sio_b9600; 946 div_value = ftdi_sio_b9600;
945 baud = 9600; 947 baud = 9600;
946 div_okay = 0; 948 div_okay = 0;
@@ -950,7 +952,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
950 if (baud <= 3000000) { 952 if (baud <= 3000000) {
951 div_value = ftdi_232am_baud_to_divisor(baud); 953 div_value = ftdi_232am_baud_to_divisor(baud);
952 } else { 954 } else {
953 dbg("%s - Baud rate too high!", __func__); 955 dbg("%s - Baud rate too high!", __func__);
954 baud = 9600; 956 baud = 9600;
955 div_value = ftdi_232am_baud_to_divisor(9600); 957 div_value = ftdi_232am_baud_to_divisor(9600);
956 div_okay = 0; 958 div_okay = 0;
@@ -962,7 +964,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
962 if (baud <= 3000000) { 964 if (baud <= 3000000) {
963 div_value = ftdi_232bm_baud_to_divisor(baud); 965 div_value = ftdi_232bm_baud_to_divisor(baud);
964 } else { 966 } else {
965 dbg("%s - Baud rate too high!", __func__); 967 dbg("%s - Baud rate too high!", __func__);
966 div_value = ftdi_232bm_baud_to_divisor(9600); 968 div_value = ftdi_232bm_baud_to_divisor(9600);
967 div_okay = 0; 969 div_okay = 0;
968 baud = 9600; 970 baud = 9600;
@@ -976,12 +978,45 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port)
976 ftdi_chip_name[priv->chip_type]); 978 ftdi_chip_name[priv->chip_type]);
977 } 979 }
978 980
979 tty_encode_baud_rate(port->tty, baud, baud); 981 tty_encode_baud_rate(tty, baud, baud);
980 return(div_value); 982 return div_value;
983}
984
985static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
986{
987 struct ftdi_private *priv = usb_get_serial_port_data(port);
988 char *buf;
989 __u16 urb_value;
990 __u16 urb_index;
991 __u32 urb_index_value;
992 int rv;
993
994 buf = kmalloc(1, GFP_NOIO);
995 if (!buf)
996 return -ENOMEM;
997
998 urb_index_value = get_ftdi_divisor(tty, port);
999 urb_value = (__u16)urb_index_value;
1000 urb_index = (__u16)(urb_index_value >> 16);
1001 if (priv->interface) { /* FT2232C */
1002 urb_index = (__u16)((urb_index << 8) | priv->interface);
1003 }
1004
1005 rv = usb_control_msg(port->serial->dev,
1006 usb_sndctrlpipe(port->serial->dev, 0),
1007 FTDI_SIO_SET_BAUDRATE_REQUEST,
1008 FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
1009 urb_value, urb_index,
1010 buf, 0, WDR_SHORT_TIMEOUT);
1011
1012 kfree(buf);
1013 return rv;
981} 1014}
982 1015
983 1016
984static int get_serial_info(struct usb_serial_port * port, struct serial_struct __user * retinfo) 1017
1018static int get_serial_info(struct usb_serial_port *port,
1019 struct serial_struct __user *retinfo)
985{ 1020{
986 struct ftdi_private *priv = usb_get_serial_port_data(port); 1021 struct ftdi_private *priv = usb_get_serial_port_data(port);
987 struct serial_struct tmp; 1022 struct serial_struct tmp;
@@ -998,7 +1033,8 @@ static int get_serial_info(struct usb_serial_port * port, struct serial_struct _
998} /* get_serial_info */ 1033} /* get_serial_info */
999 1034
1000 1035
1001static int set_serial_info(struct usb_serial_port * port, struct serial_struct __user * newinfo) 1036static int set_serial_info(struct tty_struct *tty,
1037 struct usb_serial_port *port, struct serial_struct __user *newinfo)
1002{ /* set_serial_info */ 1038{ /* set_serial_info */
1003 struct ftdi_private *priv = usb_get_serial_port_data(port); 1039 struct ftdi_private *priv = usb_get_serial_port_data(port);
1004 struct serial_struct new_serial; 1040 struct serial_struct new_serial;
@@ -1006,7 +1042,7 @@ static int set_serial_info(struct usb_serial_port * port, struct serial_struct _
1006 1042
1007 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) 1043 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1008 return -EFAULT; 1044 return -EFAULT;
1009 old_priv = * priv; 1045 old_priv = *priv;
1010 1046
1011 /* Do error checking and permission checking */ 1047 /* Do error checking and permission checking */
1012 1048
@@ -1027,33 +1063,32 @@ static int set_serial_info(struct usb_serial_port * port, struct serial_struct _
1027 /* Make the changes - these are privileged changes! */ 1063 /* Make the changes - these are privileged changes! */
1028 1064
1029 priv->flags = ((priv->flags & ~ASYNC_FLAGS) | 1065 priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
1030 (new_serial.flags & ASYNC_FLAGS)); 1066 (new_serial.flags & ASYNC_FLAGS));
1031 priv->custom_divisor = new_serial.custom_divisor; 1067 priv->custom_divisor = new_serial.custom_divisor;
1032 1068
1033 port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1069 tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1034 1070
1035check_and_exit: 1071check_and_exit:
1036 if ((old_priv.flags & ASYNC_SPD_MASK) != 1072 if ((old_priv.flags & ASYNC_SPD_MASK) !=
1037 (priv->flags & ASYNC_SPD_MASK)) { 1073 (priv->flags & ASYNC_SPD_MASK)) {
1038 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) 1074 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1039 port->tty->alt_speed = 57600; 1075 tty->alt_speed = 57600;
1040 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) 1076 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1041 port->tty->alt_speed = 115200; 1077 tty->alt_speed = 115200;
1042 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) 1078 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1043 port->tty->alt_speed = 230400; 1079 tty->alt_speed = 230400;
1044 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) 1080 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1045 port->tty->alt_speed = 460800; 1081 tty->alt_speed = 460800;
1046 else 1082 else
1047 port->tty->alt_speed = 0; 1083 tty->alt_speed = 0;
1048 } 1084 }
1049 if (((old_priv.flags & ASYNC_SPD_MASK) != 1085 if (((old_priv.flags & ASYNC_SPD_MASK) !=
1050 (priv->flags & ASYNC_SPD_MASK)) || 1086 (priv->flags & ASYNC_SPD_MASK)) ||
1051 (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) && 1087 (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1052 (old_priv.custom_divisor != priv->custom_divisor))) { 1088 (old_priv.custom_divisor != priv->custom_divisor))) {
1053 change_speed(port); 1089 change_speed(tty, port);
1054 } 1090 }
1055 1091 return 0;
1056 return (0);
1057 1092
1058} /* set_serial_info */ 1093} /* set_serial_info */
1059 1094
@@ -1082,11 +1117,10 @@ static void ftdi_determine_type(struct usb_serial_port *port)
1082 priv->chip_type = FT2232C; 1117 priv->chip_type = FT2232C;
1083 /* Determine interface code. */ 1118 /* Determine interface code. */
1084 inter = serial->interface->altsetting->desc.bInterfaceNumber; 1119 inter = serial->interface->altsetting->desc.bInterfaceNumber;
1085 if (inter == 0) { 1120 if (inter == 0)
1086 priv->interface = PIT_SIOA; 1121 priv->interface = PIT_SIOA;
1087 } else { 1122 else
1088 priv->interface = PIT_SIOB; 1123 priv->interface = PIT_SIOB;
1089 }
1090 /* BM-type devices have a bug where bcdDevice gets set 1124 /* BM-type devices have a bug where bcdDevice gets set
1091 * to 0x200 when iSerialNumber is 0. */ 1125 * to 0x200 when iSerialNumber is 0. */
1092 if (version < 0x500) { 1126 if (version < 0x500) {
@@ -1120,7 +1154,8 @@ static void ftdi_determine_type(struct usb_serial_port *port)
1120 * *************************************************************************** 1154 * ***************************************************************************
1121 */ 1155 */
1122 1156
1123static ssize_t show_latency_timer(struct device *dev, struct device_attribute *attr, char *buf) 1157static ssize_t show_latency_timer(struct device *dev,
1158 struct device_attribute *attr, char *buf)
1124{ 1159{
1125 struct usb_serial_port *port = to_usb_serial_port(dev); 1160 struct usb_serial_port *port = to_usb_serial_port(dev);
1126 struct ftdi_private *priv = usb_get_serial_port_data(port); 1161 struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -1129,14 +1164,14 @@ static ssize_t show_latency_timer(struct device *dev, struct device_attribute *a
1129 int rv = 0; 1164 int rv = 0;
1130 1165
1131 1166
1132 dbg("%s",__func__); 1167 dbg("%s", __func__);
1133 1168
1134 rv = usb_control_msg(udev, 1169 rv = usb_control_msg(udev,
1135 usb_rcvctrlpipe(udev, 0), 1170 usb_rcvctrlpipe(udev, 0),
1136 FTDI_SIO_GET_LATENCY_TIMER_REQUEST, 1171 FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
1137 FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE, 1172 FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
1138 0, priv->interface, 1173 0, priv->interface,
1139 (char*) &latency, 1, WDR_TIMEOUT); 1174 (char *) &latency, 1, WDR_TIMEOUT);
1140 1175
1141 if (rv < 0) { 1176 if (rv < 0) {
1142 dev_err(dev, "Unable to read latency timer: %i\n", rv); 1177 dev_err(dev, "Unable to read latency timer: %i\n", rv);
@@ -1146,8 +1181,9 @@ static ssize_t show_latency_timer(struct device *dev, struct device_attribute *a
1146} 1181}
1147 1182
1148/* Write a new value of the latency timer, in units of milliseconds. */ 1183/* Write a new value of the latency timer, in units of milliseconds. */
1149static ssize_t store_latency_timer(struct device *dev, struct device_attribute *attr, const char *valbuf, 1184static ssize_t store_latency_timer(struct device *dev,
1150 size_t count) 1185 struct device_attribute *attr, const char *valbuf,
1186 size_t count)
1151{ 1187{
1152 struct usb_serial_port *port = to_usb_serial_port(dev); 1188 struct usb_serial_port *port = to_usb_serial_port(dev);
1153 struct ftdi_private *priv = usb_get_serial_port_data(port); 1189 struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -1175,8 +1211,8 @@ static ssize_t store_latency_timer(struct device *dev, struct device_attribute *
1175 1211
1176/* Write an event character directly to the FTDI register. The ASCII 1212/* Write an event character directly to the FTDI register. The ASCII
1177 value is in the low 8 bits, with the enable bit in the 9th bit. */ 1213 value is in the low 8 bits, with the enable bit in the 9th bit. */
1178static ssize_t store_event_char(struct device *dev, struct device_attribute *attr, const char *valbuf, 1214static ssize_t store_event_char(struct device *dev,
1179 size_t count) 1215 struct device_attribute *attr, const char *valbuf, size_t count)
1180{ 1216{
1181 struct usb_serial_port *port = to_usb_serial_port(dev); 1217 struct usb_serial_port *port = to_usb_serial_port(dev);
1182 struct ftdi_private *priv = usb_get_serial_port_data(port); 1218 struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -1202,7 +1238,8 @@ static ssize_t store_event_char(struct device *dev, struct device_attribute *att
1202 return count; 1238 return count;
1203} 1239}
1204 1240
1205static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer, store_latency_timer); 1241static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer,
1242 store_latency_timer);
1206static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char); 1243static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
1207 1244
1208static int create_sysfs_attrs(struct usb_serial_port *port) 1245static int create_sysfs_attrs(struct usb_serial_port *port)
@@ -1210,7 +1247,7 @@ static int create_sysfs_attrs(struct usb_serial_port *port)
1210 struct ftdi_private *priv = usb_get_serial_port_data(port); 1247 struct ftdi_private *priv = usb_get_serial_port_data(port);
1211 int retval = 0; 1248 int retval = 0;
1212 1249
1213 dbg("%s",__func__); 1250 dbg("%s", __func__);
1214 1251
1215 /* XXX I've no idea if the original SIO supports the event_char 1252 /* XXX I've no idea if the original SIO supports the event_char
1216 * sysfs parameter, so I'm playing it safe. */ 1253 * sysfs parameter, so I'm playing it safe. */
@@ -1232,7 +1269,7 @@ static void remove_sysfs_attrs(struct usb_serial_port *port)
1232{ 1269{
1233 struct ftdi_private *priv = usb_get_serial_port_data(port); 1270 struct ftdi_private *priv = usb_get_serial_port_data(port);
1234 1271
1235 dbg("%s",__func__); 1272 dbg("%s", __func__);
1236 1273
1237 /* XXX see create_sysfs_attrs */ 1274 /* XXX see create_sysfs_attrs */
1238 if (priv->chip_type != SIO) { 1275 if (priv->chip_type != SIO) {
@@ -1253,9 +1290,11 @@ static void remove_sysfs_attrs(struct usb_serial_port *port)
1253 */ 1290 */
1254 1291
1255/* Probe function to check for special devices */ 1292/* Probe function to check for special devices */
1256static int ftdi_sio_probe (struct usb_serial *serial, const struct usb_device_id *id) 1293static int ftdi_sio_probe(struct usb_serial *serial,
1294 const struct usb_device_id *id)
1257{ 1295{
1258 struct ftdi_sio_quirk *quirk = (struct ftdi_sio_quirk *)id->driver_info; 1296 struct ftdi_sio_quirk *quirk =
1297 (struct ftdi_sio_quirk *)id->driver_info;
1259 1298
1260 if (quirk && quirk->probe) { 1299 if (quirk && quirk->probe) {
1261 int ret = quirk->probe(serial); 1300 int ret = quirk->probe(serial);
@@ -1274,17 +1313,18 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
1274 struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial); 1313 struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
1275 1314
1276 1315
1277 dbg("%s",__func__); 1316 dbg("%s", __func__);
1278 1317
1279 priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL); 1318 priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
1280 if (!priv){ 1319 if (!priv) {
1281 err("%s- kmalloc(%Zd) failed.", __func__, sizeof(struct ftdi_private)); 1320 err("%s- kmalloc(%Zd) failed.", __func__,
1321 sizeof(struct ftdi_private));
1282 return -ENOMEM; 1322 return -ENOMEM;
1283 } 1323 }
1284 1324
1285 spin_lock_init(&priv->rx_lock); 1325 spin_lock_init(&priv->rx_lock);
1286 spin_lock_init(&priv->tx_lock); 1326 spin_lock_init(&priv->tx_lock);
1287 init_waitqueue_head(&priv->delta_msr_wait); 1327 init_waitqueue_head(&priv->delta_msr_wait);
1288 /* This will push the characters through immediately rather 1328 /* This will push the characters through immediately rather
1289 than queue a task to deliver them */ 1329 than queue a task to deliver them */
1290 priv->flags = ASYNC_LOW_LATENCY; 1330 priv->flags = ASYNC_LOW_LATENCY;
@@ -1294,9 +1334,9 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
1294 1334
1295 /* Increase the size of read buffers */ 1335 /* Increase the size of read buffers */
1296 kfree(port->bulk_in_buffer); 1336 kfree(port->bulk_in_buffer);
1297 port->bulk_in_buffer = kmalloc (BUFSZ, GFP_KERNEL); 1337 port->bulk_in_buffer = kmalloc(BUFSZ, GFP_KERNEL);
1298 if (!port->bulk_in_buffer) { 1338 if (!port->bulk_in_buffer) {
1299 kfree (priv); 1339 kfree(priv);
1300 return -ENOMEM; 1340 return -ENOMEM;
1301 } 1341 }
1302 if (port->read_urb) { 1342 if (port->read_urb) {
@@ -1309,7 +1349,7 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
1309 1349
1310 /* Free port's existing write urb and transfer buffer. */ 1350 /* Free port's existing write urb and transfer buffer. */
1311 if (port->write_urb) { 1351 if (port->write_urb) {
1312 usb_free_urb (port->write_urb); 1352 usb_free_urb(port->write_urb);
1313 port->write_urb = NULL; 1353 port->write_urb = NULL;
1314 } 1354 }
1315 kfree(port->bulk_out_buffer); 1355 kfree(port->bulk_out_buffer);
@@ -1317,7 +1357,7 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
1317 1357
1318 usb_set_serial_port_data(port, priv); 1358 usb_set_serial_port_data(port, priv);
1319 1359
1320 ftdi_determine_type (port); 1360 ftdi_determine_type(port);
1321 create_sysfs_attrs(port); 1361 create_sysfs_attrs(port);
1322 return 0; 1362 return 0;
1323} 1363}
@@ -1325,9 +1365,9 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
1325/* Setup for the USB-UIRT device, which requires hardwired 1365/* Setup for the USB-UIRT device, which requires hardwired
1326 * baudrate (38400 gets mapped to 312500) */ 1366 * baudrate (38400 gets mapped to 312500) */
1327/* Called from usbserial:serial_probe */ 1367/* Called from usbserial:serial_probe */
1328static void ftdi_USB_UIRT_setup (struct ftdi_private *priv) 1368static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
1329{ 1369{
1330 dbg("%s",__func__); 1370 dbg("%s", __func__);
1331 1371
1332 priv->flags |= ASYNC_SPD_CUST; 1372 priv->flags |= ASYNC_SPD_CUST;
1333 priv->custom_divisor = 77; 1373 priv->custom_divisor = 77;
@@ -1336,9 +1376,10 @@ static void ftdi_USB_UIRT_setup (struct ftdi_private *priv)
1336 1376
1337/* Setup for the HE-TIRA1 device, which requires hardwired 1377/* Setup for the HE-TIRA1 device, which requires hardwired
1338 * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled. */ 1378 * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled. */
1339static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv) 1379
1380static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
1340{ 1381{
1341 dbg("%s",__func__); 1382 dbg("%s", __func__);
1342 1383
1343 priv->flags |= ASYNC_SPD_CUST; 1384 priv->flags |= ASYNC_SPD_CUST;
1344 priv->custom_divisor = 240; 1385 priv->custom_divisor = 240;
@@ -1356,7 +1397,7 @@ static int ftdi_jtag_probe(struct usb_serial *serial)
1356 struct usb_device *udev = serial->dev; 1397 struct usb_device *udev = serial->dev;
1357 struct usb_interface *interface = serial->interface; 1398 struct usb_interface *interface = serial->interface;
1358 1399
1359 dbg("%s",__func__); 1400 dbg("%s", __func__);
1360 1401
1361 if (interface == udev->actconfig->interface[0]) { 1402 if (interface == udev->actconfig->interface[0]) {
1362 info("Ignoring serial port reserved for JTAG"); 1403 info("Ignoring serial port reserved for JTAG");
@@ -1390,7 +1431,7 @@ static int ftdi_mtxorb_hack_setup(struct usb_serial *serial)
1390 * calls __serial_close for each open of the port 1431 * calls __serial_close for each open of the port
1391 * shutdown is called then (ie ftdi_shutdown) 1432 * shutdown is called then (ie ftdi_shutdown)
1392 */ 1433 */
1393static void ftdi_shutdown (struct usb_serial *serial) 1434static void ftdi_shutdown(struct usb_serial *serial)
1394{ 1435{
1395 dbg("%s", __func__); 1436 dbg("%s", __func__);
1396} 1437}
@@ -1404,7 +1445,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port)
1404 remove_sysfs_attrs(port); 1445 remove_sysfs_attrs(port);
1405 1446
1406 /* all open ports are closed at this point 1447 /* all open ports are closed at this point
1407 * (by usbserial.c:__serial_close, which calls ftdi_close) 1448 * (by usbserial.c:__serial_close, which calls ftdi_close)
1408 */ 1449 */
1409 1450
1410 if (priv) { 1451 if (priv) {
@@ -1415,7 +1456,8 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port)
1415 return 0; 1456 return 0;
1416} 1457}
1417 1458
1418static int ftdi_open (struct usb_serial_port *port, struct file *filp) 1459static int ftdi_open(struct tty_struct *tty,
1460 struct usb_serial_port *port, struct file *filp)
1419{ /* ftdi_open */ 1461{ /* ftdi_open */
1420 struct usb_device *dev = port->serial->dev; 1462 struct usb_device *dev = port->serial->dev;
1421 struct ftdi_private *priv = usb_get_serial_port_data(port); 1463 struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -1433,8 +1475,8 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
1433 priv->rx_bytes = 0; 1475 priv->rx_bytes = 0;
1434 spin_unlock_irqrestore(&priv->rx_lock, flags); 1476 spin_unlock_irqrestore(&priv->rx_lock, flags);
1435 1477
1436 if (port->tty) 1478 if (tty)
1437 port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1479 tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1438 1480
1439 /* No error checking for this (will get errors later anyway) */ 1481 /* No error checking for this (will get errors later anyway) */
1440 /* See ftdi_sio.h for description of what is reset */ 1482 /* See ftdi_sio.h for description of what is reset */
@@ -1448,8 +1490,8 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
1448 This is same behaviour as serial.c/rs_open() - Kuba */ 1490 This is same behaviour as serial.c/rs_open() - Kuba */
1449 1491
1450 /* ftdi_set_termios will send usb control messages */ 1492 /* ftdi_set_termios will send usb control messages */
1451 if (port->tty) 1493 if (tty)
1452 ftdi_set_termios(port, port->tty->termios); 1494 ftdi_set_termios(tty, port, tty->termios);
1453 1495
1454 /* FIXME: Flow control might be enabled, so it should be checked - 1496 /* FIXME: Flow control might be enabled, so it should be checked -
1455 we have no control of defaults! */ 1497 we have no control of defaults! */
@@ -1464,12 +1506,14 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
1464 /* Start reading from the device */ 1506 /* Start reading from the device */
1465 priv->rx_processed = 0; 1507 priv->rx_processed = 0;
1466 usb_fill_bulk_urb(port->read_urb, dev, 1508 usb_fill_bulk_urb(port->read_urb, dev,
1467 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress), 1509 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
1468 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, 1510 port->read_urb->transfer_buffer,
1469 ftdi_read_bulk_callback, port); 1511 port->read_urb->transfer_buffer_length,
1512 ftdi_read_bulk_callback, port);
1470 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 1513 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
1471 if (result) 1514 if (result)
1472 err("%s - failed submitting read urb, error %d", __func__, result); 1515 err("%s - failed submitting read urb, error %d",
1516 __func__, result);
1473 1517
1474 1518
1475 return result; 1519 return result;
@@ -1485,16 +1529,17 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
1485 * 1529 *
1486 */ 1530 */
1487 1531
1488static void ftdi_close (struct usb_serial_port *port, struct file *filp) 1532static void ftdi_close(struct tty_struct *tty,
1533 struct usb_serial_port *port, struct file *filp)
1489{ /* ftdi_close */ 1534{ /* ftdi_close */
1490 unsigned int c_cflag = port->tty->termios->c_cflag; 1535 unsigned int c_cflag = tty->termios->c_cflag;
1491 struct ftdi_private *priv = usb_get_serial_port_data(port); 1536 struct ftdi_private *priv = usb_get_serial_port_data(port);
1492 char buf[1]; 1537 char buf[1];
1493 1538
1494 dbg("%s", __func__); 1539 dbg("%s", __func__);
1495 1540
1496 mutex_lock(&port->serial->disc_mutex); 1541 mutex_lock(&port->serial->disc_mutex);
1497 if (c_cflag & HUPCL && !port->serial->disconnected){ 1542 if (c_cflag & HUPCL && !port->serial->disconnected) {
1498 /* Disable flow control */ 1543 /* Disable flow control */
1499 if (usb_control_msg(port->serial->dev, 1544 if (usb_control_msg(port->serial->dev,
1500 usb_sndctrlpipe(port->serial->dev, 0), 1545 usb_sndctrlpipe(port->serial->dev, 0),
@@ -1527,7 +1572,7 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp)
1527 * 1572 *
1528 * The new devices do not require this byte 1573 * The new devices do not require this byte
1529 */ 1574 */
1530static int ftdi_write (struct usb_serial_port *port, 1575static int ftdi_write(struct tty_struct *tty, struct usb_serial_port *port,
1531 const unsigned char *buf, int count) 1576 const unsigned char *buf, int count)
1532{ /* ftdi_write */ 1577{ /* ftdi_write */
1533 struct ftdi_private *priv = usb_get_serial_port_data(port); 1578 struct ftdi_private *priv = usb_get_serial_port_data(port);
@@ -1554,7 +1599,7 @@ static int ftdi_write (struct usb_serial_port *port,
1554 spin_unlock_irqrestore(&priv->tx_lock, flags); 1599 spin_unlock_irqrestore(&priv->tx_lock, flags);
1555 1600
1556 data_offset = priv->write_offset; 1601 data_offset = priv->write_offset;
1557 dbg("data_offset set to %d",data_offset); 1602 dbg("data_offset set to %d", data_offset);
1558 1603
1559 /* Determine total transfer size */ 1604 /* Determine total transfer size */
1560 transfer_size = count; 1605 transfer_size = count;
@@ -1565,7 +1610,7 @@ static int ftdi_write (struct usb_serial_port *port,
1565 (PKTSZ - data_offset))); 1610 (PKTSZ - data_offset)));
1566 } 1611 }
1567 1612
1568 buffer = kmalloc (transfer_size, GFP_ATOMIC); 1613 buffer = kmalloc(transfer_size, GFP_ATOMIC);
1569 if (!buffer) { 1614 if (!buffer) {
1570 err("%s ran out of kernel memory for urb ...", __func__); 1615 err("%s ran out of kernel memory for urb ...", __func__);
1571 count = -ENOMEM; 1616 count = -ENOMEM;
@@ -1581,20 +1626,20 @@ static int ftdi_write (struct usb_serial_port *port,
1581 1626
1582 /* Copy data */ 1627 /* Copy data */
1583 if (data_offset > 0) { 1628 if (data_offset > 0) {
1584 /* Original sio requires control byte at start of each packet. */ 1629 /* Original sio requires control byte at start of
1630 each packet. */
1585 int user_pktsz = PKTSZ - data_offset; 1631 int user_pktsz = PKTSZ - data_offset;
1586 int todo = count; 1632 int todo = count;
1587 unsigned char *first_byte = buffer; 1633 unsigned char *first_byte = buffer;
1588 const unsigned char *current_position = buf; 1634 const unsigned char *current_position = buf;
1589 1635
1590 while (todo > 0) { 1636 while (todo > 0) {
1591 if (user_pktsz > todo) { 1637 if (user_pktsz > todo)
1592 user_pktsz = todo; 1638 user_pktsz = todo;
1593 }
1594 /* Write the control byte at the front of the packet*/ 1639 /* Write the control byte at the front of the packet*/
1595 *first_byte = 1 | ((user_pktsz) << 2); 1640 *first_byte = 1 | ((user_pktsz) << 2);
1596 /* Copy data for packet */ 1641 /* Copy data for packet */
1597 memcpy (first_byte + data_offset, 1642 memcpy(first_byte + data_offset,
1598 current_position, user_pktsz); 1643 current_position, user_pktsz);
1599 first_byte += user_pktsz + data_offset; 1644 first_byte += user_pktsz + data_offset;
1600 current_position += user_pktsz; 1645 current_position += user_pktsz;
@@ -1603,20 +1648,23 @@ static int ftdi_write (struct usb_serial_port *port,
1603 } else { 1648 } else {
1604 /* No control byte required. */ 1649 /* No control byte required. */
1605 /* Copy in the data to send */ 1650 /* Copy in the data to send */
1606 memcpy (buffer, buf, count); 1651 memcpy(buffer, buf, count);
1607 } 1652 }
1608 1653
1609 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size, buffer); 1654 usb_serial_debug_data(debug, &port->dev, __func__,
1655 transfer_size, buffer);
1610 1656
1611 /* fill the buffer and send it */ 1657 /* fill the buffer and send it */
1612 usb_fill_bulk_urb(urb, port->serial->dev, 1658 usb_fill_bulk_urb(urb, port->serial->dev,
1613 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress), 1659 usb_sndbulkpipe(port->serial->dev,
1614 buffer, transfer_size, 1660 port->bulk_out_endpointAddress),
1615 ftdi_write_bulk_callback, port); 1661 buffer, transfer_size,
1662 ftdi_write_bulk_callback, port);
1616 1663
1617 status = usb_submit_urb(urb, GFP_ATOMIC); 1664 status = usb_submit_urb(urb, GFP_ATOMIC);
1618 if (status) { 1665 if (status) {
1619 err("%s - failed submitting write urb, error %d", __func__, status); 1666 err("%s - failed submitting write urb, error %d",
1667 __func__, status);
1620 count = status; 1668 count = status;
1621 goto error; 1669 goto error;
1622 } else { 1670 } else {
@@ -1635,7 +1683,7 @@ static int ftdi_write (struct usb_serial_port *port,
1635error: 1683error:
1636 usb_free_urb(urb); 1684 usb_free_urb(urb);
1637error_no_urb: 1685error_no_urb:
1638 kfree (buffer); 1686 kfree(buffer);
1639error_no_buffer: 1687error_no_buffer:
1640 spin_lock_irqsave(&priv->tx_lock, flags); 1688 spin_lock_irqsave(&priv->tx_lock, flags);
1641 priv->tx_outstanding_urbs--; 1689 priv->tx_outstanding_urbs--;
@@ -1646,7 +1694,7 @@ error_no_buffer:
1646 1694
1647/* This function may get called when the device is closed */ 1695/* This function may get called when the device is closed */
1648 1696
1649static void ftdi_write_bulk_callback (struct urb *urb) 1697static void ftdi_write_bulk_callback(struct urb *urb)
1650{ 1698{
1651 unsigned long flags; 1699 unsigned long flags;
1652 struct usb_serial_port *port = urb->context; 1700 struct usb_serial_port *port = urb->context;
@@ -1656,7 +1704,7 @@ static void ftdi_write_bulk_callback (struct urb *urb)
1656 int status = urb->status; 1704 int status = urb->status;
1657 1705
1658 /* free up the transfer buffer, as usb_free_urb() does not do this */ 1706 /* free up the transfer buffer, as usb_free_urb() does not do this */
1659 kfree (urb->transfer_buffer); 1707 kfree(urb->transfer_buffer);
1660 1708
1661 dbg("%s - port %d", __func__, port->number); 1709 dbg("%s - port %d", __func__, port->number);
1662 1710
@@ -1686,8 +1734,9 @@ static void ftdi_write_bulk_callback (struct urb *urb)
1686} /* ftdi_write_bulk_callback */ 1734} /* ftdi_write_bulk_callback */
1687 1735
1688 1736
1689static int ftdi_write_room( struct usb_serial_port *port ) 1737static int ftdi_write_room(struct tty_struct *tty)
1690{ 1738{
1739 struct usb_serial_port *port = tty->driver_data;
1691 struct ftdi_private *priv = usb_get_serial_port_data(port); 1740 struct ftdi_private *priv = usb_get_serial_port_data(port);
1692 int room; 1741 int room;
1693 unsigned long flags; 1742 unsigned long flags;
@@ -1707,11 +1756,11 @@ static int ftdi_write_room( struct usb_serial_port *port )
1707 } 1756 }
1708 spin_unlock_irqrestore(&priv->tx_lock, flags); 1757 spin_unlock_irqrestore(&priv->tx_lock, flags);
1709 return room; 1758 return room;
1710} /* ftdi_write_room */ 1759}
1711
1712 1760
1713static int ftdi_chars_in_buffer (struct usb_serial_port *port) 1761static int ftdi_chars_in_buffer(struct tty_struct *tty)
1714{ /* ftdi_chars_in_buffer */ 1762{
1763 struct usb_serial_port *port = tty->driver_data;
1715 struct ftdi_private *priv = usb_get_serial_port_data(port); 1764 struct ftdi_private *priv = usb_get_serial_port_data(port);
1716 int buffered; 1765 int buffered;
1717 unsigned long flags; 1766 unsigned long flags;
@@ -1726,12 +1775,10 @@ static int ftdi_chars_in_buffer (struct usb_serial_port *port)
1726 buffered = 0; 1775 buffered = 0;
1727 } 1776 }
1728 return buffered; 1777 return buffered;
1729} /* ftdi_chars_in_buffer */ 1778}
1730
1731
1732 1779
1733static void ftdi_read_bulk_callback (struct urb *urb) 1780static void ftdi_read_bulk_callback(struct urb *urb)
1734{ /* ftdi_read_bulk_callback */ 1781{
1735 struct usb_serial_port *port = urb->context; 1782 struct usb_serial_port *port = urb->context;
1736 struct tty_struct *tty; 1783 struct tty_struct *tty;
1737 struct ftdi_private *priv; 1784 struct ftdi_private *priv;
@@ -1740,19 +1787,21 @@ static void ftdi_read_bulk_callback (struct urb *urb)
1740 int status = urb->status; 1787 int status = urb->status;
1741 1788
1742 if (urb->number_of_packets > 0) { 1789 if (urb->number_of_packets > 0) {
1743 err("%s transfer_buffer_length %d actual_length %d number of packets %d",__func__, 1790 err("%s transfer_buffer_length %d actual_length %d number of packets %d",
1744 urb->transfer_buffer_length, urb->actual_length, urb->number_of_packets ); 1791 __func__,
1745 err("%s transfer_flags %x ", __func__,urb->transfer_flags ); 1792 urb->transfer_buffer_length,
1793 urb->actual_length, urb->number_of_packets);
1794 err("%s transfer_flags %x ", __func__, urb->transfer_flags);
1746 } 1795 }
1747 1796
1748 dbg("%s - port %d", __func__, port->number); 1797 dbg("%s - port %d", __func__, port->number);
1749 1798
1750 if (port->open_count <= 0) 1799 if (port->port.count <= 0)
1751 return; 1800 return;
1752 1801
1753 tty = port->tty; 1802 tty = port->port.tty;
1754 if (!tty) { 1803 if (!tty) {
1755 dbg("%s - bad tty pointer - exiting",__func__); 1804 dbg("%s - bad tty pointer - exiting", __func__);
1756 return; 1805 return;
1757 } 1806 }
1758 1807
@@ -1762,14 +1811,13 @@ static void ftdi_read_bulk_callback (struct urb *urb)
1762 return; 1811 return;
1763 } 1812 }
1764 1813
1765 if (urb != port->read_urb) { 1814 if (urb != port->read_urb)
1766 err("%s - Not my urb!", __func__); 1815 err("%s - Not my urb!", __func__);
1767 }
1768 1816
1769 if (status) { 1817 if (status) {
1770 /* This will happen at close every time so it is a dbg not an err */ 1818 /* This will happen at close every time so it is a dbg not an
1771 dbg("(this is ok on close) nonzero read bulk status received: " 1819 err */
1772 "%d", status); 1820 dbg("(this is ok on close) nonzero read bulk status received: %d", status);
1773 return; 1821 return;
1774 } 1822 }
1775 1823
@@ -1785,7 +1833,7 @@ static void ftdi_read_bulk_callback (struct urb *urb)
1785} /* ftdi_read_bulk_callback */ 1833} /* ftdi_read_bulk_callback */
1786 1834
1787 1835
1788static void ftdi_process_read (struct work_struct *work) 1836static void ftdi_process_read(struct work_struct *work)
1789{ /* ftdi_process_read */ 1837{ /* ftdi_process_read */
1790 struct ftdi_private *priv = 1838 struct ftdi_private *priv =
1791 container_of(work, struct ftdi_private, rx_work.work); 1839 container_of(work, struct ftdi_private, rx_work.work);
@@ -1803,12 +1851,12 @@ static void ftdi_process_read (struct work_struct *work)
1803 1851
1804 dbg("%s - port %d", __func__, port->number); 1852 dbg("%s - port %d", __func__, port->number);
1805 1853
1806 if (port->open_count <= 0) 1854 if (port->port.count <= 0)
1807 return; 1855 return;
1808 1856
1809 tty = port->tty; 1857 tty = port->port.tty;
1810 if (!tty) { 1858 if (!tty) {
1811 dbg("%s - bad tty pointer - exiting",__func__); 1859 dbg("%s - bad tty pointer - exiting", __func__);
1812 return; 1860 return;
1813 } 1861 }
1814 1862
@@ -1832,11 +1880,11 @@ static void ftdi_process_read (struct work_struct *work)
1832 urb->actual_length - priv->rx_processed); 1880 urb->actual_length - priv->rx_processed);
1833 } else { 1881 } else {
1834 /* The first two bytes of every read packet are status */ 1882 /* The first two bytes of every read packet are status */
1835 if (urb->actual_length > 2) { 1883 if (urb->actual_length > 2)
1836 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 1884 usb_serial_debug_data(debug, &port->dev, __func__,
1837 } else { 1885 urb->actual_length, data);
1838 dbg("Status only: %03oo %03oo",data[0],data[1]); 1886 else
1839 } 1887 dbg("Status only: %03oo %03oo", data[0], data[1]);
1840 } 1888 }
1841 1889
1842 1890
@@ -1846,16 +1894,19 @@ static void ftdi_process_read (struct work_struct *work)
1846 /* if CD is dropped and the line is not CLOCAL then we should hangup */ 1894 /* if CD is dropped and the line is not CLOCAL then we should hangup */
1847 1895
1848 need_flip = 0; 1896 need_flip = 0;
1849 for (packet_offset = priv->rx_processed; packet_offset < urb->actual_length; packet_offset += PKTSZ) { 1897 for (packet_offset = priv->rx_processed;
1898 packet_offset < urb->actual_length; packet_offset += PKTSZ) {
1850 int length; 1899 int length;
1851 1900
1852 /* Compare new line status to the old one, signal if different */ 1901 /* Compare new line status to the old one, signal if different/
1853 /* N.B. packet may be processed more than once, but differences 1902 N.B. packet may be processed more than once, but differences
1854 * are only processed once. */ 1903 are only processed once. */
1855 if (priv != NULL) { 1904 if (priv != NULL) {
1856 char new_status = data[packet_offset+0] & FTDI_STATUS_B0_MASK; 1905 char new_status = data[packet_offset + 0] &
1906 FTDI_STATUS_B0_MASK;
1857 if (new_status != priv->prev_status) { 1907 if (new_status != priv->prev_status) {
1858 priv->diff_status |= new_status ^ priv->prev_status; 1908 priv->diff_status |=
1909 new_status ^ priv->prev_status;
1859 wake_up_interruptible(&priv->delta_msr_wait); 1910 wake_up_interruptible(&priv->delta_msr_wait);
1860 priv->prev_status = new_status; 1911 priv->prev_status = new_status;
1861 } 1912 }
@@ -1872,30 +1923,31 @@ static void ftdi_process_read (struct work_struct *work)
1872 break; 1923 break;
1873 } 1924 }
1874 if (tty_buffer_request_room(tty, length) < length) { 1925 if (tty_buffer_request_room(tty, length) < length) {
1875 /* break out & wait for throttling/unthrottling to happen */ 1926 /* break out & wait for throttling/unthrottling to
1927 happen */
1876 dbg("%s - receive room low", __func__); 1928 dbg("%s - receive room low", __func__);
1877 break; 1929 break;
1878 } 1930 }
1879 1931
1880 /* Handle errors and break */ 1932 /* Handle errors and break */
1881 error_flag = TTY_NORMAL; 1933 error_flag = TTY_NORMAL;
1882 /* Although the device uses a bitmask and hence can have multiple */ 1934 /* Although the device uses a bitmask and hence can have
1883 /* errors on a packet - the order here sets the priority the */ 1935 multiple errors on a packet - the order here sets the
1884 /* error is returned to the tty layer */ 1936 priority the error is returned to the tty layer */
1885 1937
1886 if ( data[packet_offset+1] & FTDI_RS_OE ) { 1938 if (data[packet_offset+1] & FTDI_RS_OE) {
1887 error_flag = TTY_OVERRUN; 1939 error_flag = TTY_OVERRUN;
1888 dbg("OVERRRUN error"); 1940 dbg("OVERRRUN error");
1889 } 1941 }
1890 if ( data[packet_offset+1] & FTDI_RS_BI ) { 1942 if (data[packet_offset+1] & FTDI_RS_BI) {
1891 error_flag = TTY_BREAK; 1943 error_flag = TTY_BREAK;
1892 dbg("BREAK received"); 1944 dbg("BREAK received");
1893 } 1945 }
1894 if ( data[packet_offset+1] & FTDI_RS_PE ) { 1946 if (data[packet_offset+1] & FTDI_RS_PE) {
1895 error_flag = TTY_PARITY; 1947 error_flag = TTY_PARITY;
1896 dbg("PARITY error"); 1948 dbg("PARITY error");
1897 } 1949 }
1898 if ( data[packet_offset+1] & FTDI_RS_FE ) { 1950 if (data[packet_offset+1] & FTDI_RS_FE) {
1899 error_flag = TTY_FRAME; 1951 error_flag = TTY_FRAME;
1900 dbg("FRAMING error"); 1952 dbg("FRAMING error");
1901 } 1953 }
@@ -1904,7 +1956,8 @@ static void ftdi_process_read (struct work_struct *work)
1904 /* Note that the error flag is duplicated for 1956 /* Note that the error flag is duplicated for
1905 every character received since we don't know 1957 every character received since we don't know
1906 which character it applied to */ 1958 which character it applied to */
1907 tty_insert_flip_char(tty, data[packet_offset+i], error_flag); 1959 tty_insert_flip_char(tty,
1960 data[packet_offset + i], error_flag);
1908 } 1961 }
1909 need_flip = 1; 1962 need_flip = 1;
1910 } 1963 }
@@ -1912,19 +1965,19 @@ static void ftdi_process_read (struct work_struct *work)
1912#ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW 1965#ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW
1913 /* if a parity error is detected you get status packets forever 1966 /* if a parity error is detected you get status packets forever
1914 until a character is sent without a parity error. 1967 until a character is sent without a parity error.
1915 This doesn't work well since the application receives a never 1968 This doesn't work well since the application receives a
1916 ending stream of bad data - even though new data hasn't been sent. 1969 never ending stream of bad data - even though new data
1917 Therefore I (bill) have taken this out. 1970 hasn't been sent. Therefore I (bill) have taken this out.
1918 However - this might make sense for framing errors and so on 1971 However - this might make sense for framing errors and so on
1919 so I am leaving the code in for now. 1972 so I am leaving the code in for now.
1920 */ 1973 */
1921 else { 1974 else {
1922 if (error_flag != TTY_NORMAL){ 1975 if (error_flag != TTY_NORMAL) {
1923 dbg("error_flag is not normal"); 1976 dbg("error_flag is not normal");
1924 /* In this case it is just status - if that is an error send a bad character */ 1977 /* In this case it is just status - if that is
1925 if(tty->flip.count >= TTY_FLIPBUF_SIZE) { 1978 an error send a bad character */
1979 if (tty->flip.count >= TTY_FLIPBUF_SIZE)
1926 tty_flip_buffer_push(tty); 1980 tty_flip_buffer_push(tty);
1927 }
1928 tty_insert_flip_char(tty, 0xff, error_flag); 1981 tty_insert_flip_char(tty, 0xff, error_flag);
1929 need_flip = 1; 1982 need_flip = 1;
1930 } 1983 }
@@ -1933,9 +1986,8 @@ static void ftdi_process_read (struct work_struct *work)
1933 } /* "for(packet_offset=0..." */ 1986 } /* "for(packet_offset=0..." */
1934 1987
1935 /* Low latency */ 1988 /* Low latency */
1936 if (need_flip) { 1989 if (need_flip)
1937 tty_flip_buffer_push(tty); 1990 tty_flip_buffer_push(tty);
1938 }
1939 1991
1940 if (packet_offset < urb->actual_length) { 1992 if (packet_offset < urb->actual_length) {
1941 /* not completely processed - record progress */ 1993 /* not completely processed - record progress */
@@ -1954,12 +2006,11 @@ static void ftdi_process_read (struct work_struct *work)
1954 } 2006 }
1955 spin_unlock_irqrestore(&priv->rx_lock, flags); 2007 spin_unlock_irqrestore(&priv->rx_lock, flags);
1956 /* if the port is closed stop trying to read */ 2008 /* if the port is closed stop trying to read */
1957 if (port->open_count > 0){ 2009 if (port->port.count > 0)
1958 /* delay processing of remainder */ 2010 /* delay processing of remainder */
1959 schedule_delayed_work(&priv->rx_work, 1); 2011 schedule_delayed_work(&priv->rx_work, 1);
1960 } else { 2012 else
1961 dbg("%s - port is closed", __func__); 2013 dbg("%s - port is closed", __func__);
1962 }
1963 return; 2014 return;
1964 } 2015 }
1965 2016
@@ -1967,24 +2018,26 @@ static void ftdi_process_read (struct work_struct *work)
1967 priv->rx_processed = 0; 2018 priv->rx_processed = 0;
1968 2019
1969 /* if the port is closed stop trying to read */ 2020 /* if the port is closed stop trying to read */
1970 if (port->open_count > 0){ 2021 if (port->port.count > 0) {
1971 /* Continue trying to always read */ 2022 /* Continue trying to always read */
1972 usb_fill_bulk_urb(port->read_urb, port->serial->dev, 2023 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
1973 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress), 2024 usb_rcvbulkpipe(port->serial->dev,
1974 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, 2025 port->bulk_in_endpointAddress),
1975 ftdi_read_bulk_callback, port); 2026 port->read_urb->transfer_buffer,
2027 port->read_urb->transfer_buffer_length,
2028 ftdi_read_bulk_callback, port);
1976 2029
1977 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 2030 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1978 if (result) 2031 if (result)
1979 err("%s - failed resubmitting read urb, error %d", __func__, result); 2032 err("%s - failed resubmitting read urb, error %d",
2033 __func__, result);
1980 } 2034 }
1981
1982 return;
1983} /* ftdi_process_read */ 2035} /* ftdi_process_read */
1984 2036
1985 2037
1986static void ftdi_break_ctl( struct usb_serial_port *port, int break_state ) 2038static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
1987{ 2039{
2040 struct usb_serial_port *port = tty->driver_data;
1988 struct ftdi_private *priv = usb_get_serial_port_data(port); 2041 struct ftdi_private *priv = usb_get_serial_port_data(port);
1989 __u16 urb_value = 0; 2042 __u16 urb_value = 0;
1990 char buf[1]; 2043 char buf[1];
@@ -1993,22 +2046,23 @@ static void ftdi_break_ctl( struct usb_serial_port *port, int break_state )
1993 /* see drivers/char/tty_io.c to see it used */ 2046 /* see drivers/char/tty_io.c to see it used */
1994 /* last_set_data_urb_value NEVER has the break bit set in it */ 2047 /* last_set_data_urb_value NEVER has the break bit set in it */
1995 2048
1996 if (break_state) { 2049 if (break_state)
1997 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK; 2050 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
1998 } else { 2051 else
1999 urb_value = priv->last_set_data_urb_value; 2052 urb_value = priv->last_set_data_urb_value;
2000 }
2001 2053
2002 2054 if (usb_control_msg(port->serial->dev,
2003 if (usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0), 2055 usb_sndctrlpipe(port->serial->dev, 0),
2004 FTDI_SIO_SET_DATA_REQUEST, 2056 FTDI_SIO_SET_DATA_REQUEST,
2005 FTDI_SIO_SET_DATA_REQUEST_TYPE, 2057 FTDI_SIO_SET_DATA_REQUEST_TYPE,
2006 urb_value , priv->interface, 2058 urb_value , priv->interface,
2007 buf, 0, WDR_TIMEOUT) < 0) { 2059 buf, 0, WDR_TIMEOUT) < 0) {
2008 err("%s FAILED to enable/disable break state (state was %d)", __func__,break_state); 2060 err("%s FAILED to enable/disable break state (state was %d)",
2061 __func__, break_state);
2009 } 2062 }
2010 2063
2011 dbg("%s break state is %d - urb is %d", __func__,break_state, urb_value); 2064 dbg("%s break state is %d - urb is %d", __func__,
2065 break_state, urb_value);
2012 2066
2013} 2067}
2014 2068
@@ -2018,26 +2072,28 @@ static void ftdi_break_ctl( struct usb_serial_port *port, int break_state )
2018 * WARNING: set_termios calls this with old_termios in kernel space 2072 * WARNING: set_termios calls this with old_termios in kernel space
2019 */ 2073 */
2020 2074
2021static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 2075static void ftdi_set_termios(struct tty_struct *tty,
2076 struct usb_serial_port *port, struct ktermios *old_termios)
2022{ /* ftdi_termios */ 2077{ /* ftdi_termios */
2023 struct usb_device *dev = port->serial->dev; 2078 struct usb_device *dev = port->serial->dev;
2024 struct ftdi_private *priv = usb_get_serial_port_data(port); 2079 struct ftdi_private *priv = usb_get_serial_port_data(port);
2025 struct ktermios *termios = port->tty->termios; 2080 struct ktermios *termios = tty->termios;
2026 unsigned int cflag = termios->c_cflag; 2081 unsigned int cflag = termios->c_cflag;
2027 __u16 urb_value; /* will hold the new flags */ 2082 __u16 urb_value; /* will hold the new flags */
2028 char buf[1]; /* Perhaps I should dynamically alloc this? */ 2083 char buf[1]; /* Perhaps I should dynamically alloc this? */
2029 2084
2030 // Added for xon/xoff support 2085 /* Added for xon/xoff support */
2031 unsigned int iflag = termios->c_iflag; 2086 unsigned int iflag = termios->c_iflag;
2032 unsigned char vstop; 2087 unsigned char vstop;
2033 unsigned char vstart; 2088 unsigned char vstart;
2034 2089
2035 dbg("%s", __func__); 2090 dbg("%s", __func__);
2036 2091
2037 /* Force baud rate if this device requires it, unless it is set to B0. */ 2092 /* Force baud rate if this device requires it, unless it is set to
2093 B0. */
2038 if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) { 2094 if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
2039 dbg("%s: forcing baud rate for this device", __func__); 2095 dbg("%s: forcing baud rate for this device", __func__);
2040 tty_encode_baud_rate(port->tty, priv->force_baud, 2096 tty_encode_baud_rate(tty, priv->force_baud,
2041 priv->force_baud); 2097 priv->force_baud);
2042 } 2098 }
2043 2099
@@ -2053,8 +2109,8 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2053 not - so just do the change regardless - should be able to 2109 not - so just do the change regardless - should be able to
2054 compare old_termios and tty->termios */ 2110 compare old_termios and tty->termios */
2055 /* NOTE These routines can get interrupted by 2111 /* NOTE These routines can get interrupted by
2056 ftdi_sio_read_bulk_callback - need to examine what this 2112 ftdi_sio_read_bulk_callback - need to examine what this means -
2057 means - don't see any problems yet */ 2113 don't see any problems yet */
2058 2114
2059 /* Set number of data bits, parity, stop bits */ 2115 /* Set number of data bits, parity, stop bits */
2060 2116
@@ -2078,8 +2134,8 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2078 } 2134 }
2079 } 2135 }
2080 2136
2081 /* This is needed by the break command since it uses the same command - but is 2137 /* This is needed by the break command since it uses the same command
2082 * or'ed with this value */ 2138 - but is or'ed with this value */
2083 priv->last_set_data_urb_value = urb_value; 2139 priv->last_set_data_urb_value = urb_value;
2084 2140
2085 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 2141 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
@@ -2091,7 +2147,7 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2091 } 2147 }
2092 2148
2093 /* Now do the baudrate */ 2149 /* Now do the baudrate */
2094 if ((cflag & CBAUD) == B0 ) { 2150 if ((cflag & CBAUD) == B0) {
2095 /* Disable flow control */ 2151 /* Disable flow control */
2096 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 2152 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2097 FTDI_SIO_SET_FLOW_CTRL_REQUEST, 2153 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
@@ -2104,13 +2160,11 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2104 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS); 2160 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2105 } else { 2161 } else {
2106 /* set the baudrate determined before */ 2162 /* set the baudrate determined before */
2107 if (change_speed(port)) { 2163 if (change_speed(tty, port))
2108 err("%s urb failed to set baudrate", __func__); 2164 err("%s urb failed to set baudrate", __func__);
2109 }
2110 /* Ensure RTS and DTR are raised when baudrate changed from 0 */ 2165 /* Ensure RTS and DTR are raised when baudrate changed from 0 */
2111 if (!old_termios || (old_termios->c_cflag & CBAUD) == B0) { 2166 if (!old_termios || (old_termios->c_cflag & CBAUD) == B0)
2112 set_mctrl(port, TIOCM_DTR | TIOCM_RTS); 2167 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
2113 }
2114 } 2168 }
2115 2169
2116 /* Set flow control */ 2170 /* Set flow control */
@@ -2130,18 +2184,22 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2130 /* 2184 /*
2131 * Xon/Xoff code 2185 * Xon/Xoff code
2132 * 2186 *
2133 * Check the IXOFF status in the iflag component of the termios structure 2187 * Check the IXOFF status in the iflag component of the
2134 * if IXOFF is not set, the pre-xon/xoff code is executed. 2188 * termios structure. If IXOFF is not set, the pre-xon/xoff
2135 */ 2189 * code is executed.
2190 */
2136 if (iflag & IXOFF) { 2191 if (iflag & IXOFF) {
2137 dbg("%s request to enable xonxoff iflag=%04x",__func__,iflag); 2192 dbg("%s request to enable xonxoff iflag=%04x",
2138 // Try to enable the XON/XOFF on the ftdi_sio 2193 __func__, iflag);
2139 // Set the vstart and vstop -- could have been done up above where 2194 /* Try to enable the XON/XOFF on the ftdi_sio
2140 // a lot of other dereferencing is done but that would be very 2195 * Set the vstart and vstop -- could have been done up
2141 // inefficient as vstart and vstop are not always needed 2196 * above where a lot of other dereferencing is done but
2197 * that would be very inefficient as vstart and vstop
2198 * are not always needed.
2199 */
2142 vstart = termios->c_cc[VSTART]; 2200 vstart = termios->c_cc[VSTART];
2143 vstop = termios->c_cc[VSTOP]; 2201 vstop = termios->c_cc[VSTOP];
2144 urb_value=(vstop << 8) | (vstart); 2202 urb_value = (vstop << 8) | (vstart);
2145 2203
2146 if (usb_control_msg(dev, 2204 if (usb_control_msg(dev,
2147 usb_sndctrlpipe(dev, 0), 2205 usb_sndctrlpipe(dev, 0),
@@ -2153,8 +2211,9 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2153 err("urb failed to set to xon/xoff flow control"); 2211 err("urb failed to set to xon/xoff flow control");
2154 } 2212 }
2155 } else { 2213 } else {
2156 /* else clause to only run if cfag ! CRTSCTS and iflag ! XOFF */ 2214 /* else clause to only run if cflag ! CRTSCTS and iflag
2157 /* CHECKME Assuming XON/XOFF handled by tty stack - not by device */ 2215 * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
2216 * stack - not by device */
2158 dbg("%s Turning off hardware flow control", __func__); 2217 dbg("%s Turning off hardware flow control", __func__);
2159 if (usb_control_msg(dev, 2218 if (usb_control_msg(dev,
2160 usb_sndctrlpipe(dev, 0), 2219 usb_sndctrlpipe(dev, 0),
@@ -2168,11 +2227,11 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct ktermios *old
2168 2227
2169 } 2228 }
2170 return; 2229 return;
2171} /* ftdi_termios */ 2230}
2172
2173 2231
2174static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file) 2232static int ftdi_tiocmget(struct tty_struct *tty, struct file *file)
2175{ 2233{
2234 struct usb_serial_port *port = tty->driver_data;
2176 struct ftdi_private *priv = usb_get_serial_port_data(port); 2235 struct ftdi_private *priv = usb_get_serial_port_data(port);
2177 unsigned char buf[2]; 2236 unsigned char buf[2];
2178 int ret; 2237 int ret;
@@ -2181,32 +2240,35 @@ static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file)
2181 switch (priv->chip_type) { 2240 switch (priv->chip_type) {
2182 case SIO: 2241 case SIO:
2183 /* Request the status from the device */ 2242 /* Request the status from the device */
2184 if ((ret = usb_control_msg(port->serial->dev, 2243 ret = usb_control_msg(port->serial->dev,
2185 usb_rcvctrlpipe(port->serial->dev, 0), 2244 usb_rcvctrlpipe(port->serial->dev, 0),
2186 FTDI_SIO_GET_MODEM_STATUS_REQUEST, 2245 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2187 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE, 2246 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2188 0, 0, 2247 0, 0,
2189 buf, 1, WDR_TIMEOUT)) < 0 ) { 2248 buf, 1, WDR_TIMEOUT);
2249 if (ret < 0) {
2190 err("%s Could not get modem status of device - err: %d", __func__, 2250 err("%s Could not get modem status of device - err: %d", __func__,
2191 ret); 2251 ret);
2192 return(ret); 2252 return ret;
2193 } 2253 }
2194 break; 2254 break;
2195 case FT8U232AM: 2255 case FT8U232AM:
2196 case FT232BM: 2256 case FT232BM:
2197 case FT2232C: 2257 case FT2232C:
2198 case FT232RL: 2258 case FT232RL:
2199 /* the 8U232AM returns a two byte value (the sio is a 1 byte value) - in the same 2259 /* the 8U232AM returns a two byte value (the sio is a 1 byte
2200 format as the data returned from the in point */ 2260 value) - in the same format as the data returned from the in
2201 if ((ret = usb_control_msg(port->serial->dev, 2261 point */
2202 usb_rcvctrlpipe(port->serial->dev, 0), 2262 ret = usb_control_msg(port->serial->dev,
2203 FTDI_SIO_GET_MODEM_STATUS_REQUEST, 2263 usb_rcvctrlpipe(port->serial->dev, 0),
2204 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE, 2264 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2205 0, priv->interface, 2265 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2206 buf, 2, WDR_TIMEOUT)) < 0 ) { 2266 0, priv->interface,
2267 buf, 2, WDR_TIMEOUT);
2268 if (ret < 0) {
2207 err("%s Could not get modem status of device - err: %d", __func__, 2269 err("%s Could not get modem status of device - err: %d", __func__,
2208 ret); 2270 ret);
2209 return(ret); 2271 return ret;
2210 } 2272 }
2211 break; 2273 break;
2212 default: 2274 default:
@@ -2221,15 +2283,19 @@ static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file)
2221 priv->last_dtr_rts; 2283 priv->last_dtr_rts;
2222} 2284}
2223 2285
2224static int ftdi_tiocmset(struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear) 2286static int ftdi_tiocmset(struct tty_struct *tty, struct file *file,
2287 unsigned int set, unsigned int clear)
2225{ 2288{
2289 struct usb_serial_port *port = tty->driver_data;
2226 dbg("%s TIOCMSET", __func__); 2290 dbg("%s TIOCMSET", __func__);
2227 return update_mctrl(port, set, clear); 2291 return update_mctrl(port, set, clear);
2228} 2292}
2229 2293
2230 2294
2231static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) 2295static int ftdi_ioctl(struct tty_struct *tty, struct file *file,
2296 unsigned int cmd, unsigned long arg)
2232{ 2297{
2298 struct usb_serial_port *port = tty->driver_data;
2233 struct ftdi_private *priv = usb_get_serial_port_data(port); 2299 struct ftdi_private *priv = usb_get_serial_port_data(port);
2234 2300
2235 dbg("%s cmd 0x%04x", __func__, cmd); 2301 dbg("%s cmd 0x%04x", __func__, cmd);
@@ -2238,10 +2304,12 @@ static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigne
2238 switch (cmd) { 2304 switch (cmd) {
2239 2305
2240 case TIOCGSERIAL: /* gets serial port data */ 2306 case TIOCGSERIAL: /* gets serial port data */
2241 return get_serial_info(port, (struct serial_struct __user *) arg); 2307 return get_serial_info(port,
2308 (struct serial_struct __user *) arg);
2242 2309
2243 case TIOCSSERIAL: /* sets serial port data */ 2310 case TIOCSSERIAL: /* sets serial port data */
2244 return set_serial_info(port, (struct serial_struct __user *) arg); 2311 return set_serial_info(tty, port,
2312 (struct serial_struct __user *) arg);
2245 2313
2246 /* 2314 /*
2247 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change 2315 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
@@ -2260,45 +2328,41 @@ static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigne
2260 else { 2328 else {
2261 char diff = priv->diff_status; 2329 char diff = priv->diff_status;
2262 2330
2263 if (diff == 0) { 2331 if (diff == 0)
2264 return -EIO; /* no change => error */ 2332 return -EIO; /* no change => error */
2265 }
2266 2333
2267 /* Consume all events */ 2334 /* Consume all events */
2268 priv->diff_status = 0; 2335 priv->diff_status = 0;
2269 2336
2270 /* Return 0 if caller wanted to know about these bits */ 2337 /* Return 0 if caller wanted to know about
2271 if ( ((arg & TIOCM_RNG) && (diff & FTDI_RS0_RI)) || 2338 these bits */
2272 ((arg & TIOCM_DSR) && (diff & FTDI_RS0_DSR)) || 2339 if (((arg & TIOCM_RNG) && (diff & FTDI_RS0_RI)) ||
2273 ((arg & TIOCM_CD) && (diff & FTDI_RS0_RLSD)) || 2340 ((arg & TIOCM_DSR) && (diff & FTDI_RS0_DSR)) ||
2274 ((arg & TIOCM_CTS) && (diff & FTDI_RS0_CTS)) ) { 2341 ((arg & TIOCM_CD) && (diff & FTDI_RS0_RLSD)) ||
2342 ((arg & TIOCM_CTS) && (diff & FTDI_RS0_CTS))) {
2275 return 0; 2343 return 0;
2276 } 2344 }
2277 /* 2345 /*
2278 * Otherwise caller can't care less about what happened, 2346 * Otherwise caller can't care less about what
2279 * and so we continue to wait for more events. 2347 * happened,and so we continue to wait for more
2348 * events.
2280 */ 2349 */
2281 } 2350 }
2282 } 2351 }
2283 return(0); 2352 return 0;
2284 break;
2285 default: 2353 default:
2286 break; 2354 break;
2287
2288 } 2355 }
2289 2356 /* This is not necessarily an error - turns out the higher layers
2290 2357 * will do some ioctls themselves (see comment above)
2291 /* This is not necessarily an error - turns out the higher layers will do
2292 * some ioctls itself (see comment above)
2293 */ 2358 */
2294 dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __func__, cmd); 2359 dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __func__, cmd);
2360 return -ENOIOCTLCMD;
2361}
2295 2362
2296 return(-ENOIOCTLCMD); 2363static void ftdi_throttle(struct tty_struct *tty)
2297} /* ftdi_ioctl */
2298
2299
2300static void ftdi_throttle (struct usb_serial_port *port)
2301{ 2364{
2365 struct usb_serial_port *port = tty->driver_data;
2302 struct ftdi_private *priv = usb_get_serial_port_data(port); 2366 struct ftdi_private *priv = usb_get_serial_port_data(port);
2303 unsigned long flags; 2367 unsigned long flags;
2304 2368
@@ -2310,8 +2374,9 @@ static void ftdi_throttle (struct usb_serial_port *port)
2310} 2374}
2311 2375
2312 2376
2313static void ftdi_unthrottle (struct usb_serial_port *port) 2377static void ftdi_unthrottle(struct tty_struct *tty)
2314{ 2378{
2379 struct usb_serial_port *port = tty->driver_data;
2315 struct ftdi_private *priv = usb_get_serial_port_data(port); 2380 struct ftdi_private *priv = usb_get_serial_port_data(port);
2316 int actually_throttled; 2381 int actually_throttled;
2317 unsigned long flags; 2382 unsigned long flags;
@@ -2327,7 +2392,7 @@ static void ftdi_unthrottle (struct usb_serial_port *port)
2327 schedule_delayed_work(&priv->rx_work, 0); 2392 schedule_delayed_work(&priv->rx_work, 0);
2328} 2393}
2329 2394
2330static int __init ftdi_init (void) 2395static int __init ftdi_init(void)
2331{ 2396{
2332 int retval; 2397 int retval;
2333 2398
@@ -2357,13 +2422,13 @@ failed_sio_register:
2357} 2422}
2358 2423
2359 2424
2360static void __exit ftdi_exit (void) 2425static void __exit ftdi_exit(void)
2361{ 2426{
2362 2427
2363 dbg("%s", __func__); 2428 dbg("%s", __func__);
2364 2429
2365 usb_deregister (&ftdi_driver); 2430 usb_deregister(&ftdi_driver);
2366 usb_serial_deregister (&ftdi_sio_device); 2431 usb_serial_deregister(&ftdi_sio_device);
2367 2432
2368} 2433}
2369 2434
@@ -2371,8 +2436,8 @@ static void __exit ftdi_exit (void)
2371module_init(ftdi_init); 2436module_init(ftdi_init);
2372module_exit(ftdi_exit); 2437module_exit(ftdi_exit);
2373 2438
2374MODULE_AUTHOR( DRIVER_AUTHOR ); 2439MODULE_AUTHOR(DRIVER_AUTHOR);
2375MODULE_DESCRIPTION( DRIVER_DESC ); 2440MODULE_DESCRIPTION(DRIVER_DESC);
2376MODULE_LICENSE("GPL"); 2441MODULE_LICENSE("GPL");
2377 2442
2378module_param(debug, bool, S_IRUGO | S_IWUSR); 2443module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
index 8302eca893ea..a577ea44dcf9 100644
--- a/drivers/usb/serial/ftdi_sio.h
+++ b/drivers/usb/serial/ftdi_sio.h
@@ -1,20 +1,20 @@
1/* 1/*
2 * Definitions for the FTDI USB Single Port Serial Converter - 2 * Definitions for the FTDI USB Single Port Serial Converter -
3 * known as FTDI_SIO (Serial Input/Output application of the chipset) 3 * known as FTDI_SIO (Serial Input/Output application of the chipset)
4 * 4 *
5 * The example I have is known as the USC-1000 which is available from 5 * The example I have is known as the USC-1000 which is available from
6 * http://www.dse.co.nz - cat no XH4214 It looks similar to this: 6 * http://www.dse.co.nz - cat no XH4214 It looks similar to this:
7 * http://www.dansdata.com/usbser.htm but I can't be sure There are other 7 * http://www.dansdata.com/usbser.htm but I can't be sure There are other
8 * USC-1000s which don't look like my device though so beware! 8 * USC-1000s which don't look like my device though so beware!
9 * 9 *
10 * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side, 10 * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side,
11 * USB on the other. 11 * USB on the other.
12 * 12 *
13 * Thanx to FTDI (http://www.ftdi.co.uk) for so kindly providing details 13 * Thanx to FTDI (http://www.ftdi.co.uk) for so kindly providing details
14 * of the protocol required to talk to the device and ongoing assistence 14 * of the protocol required to talk to the device and ongoing assistence
15 * during development. 15 * during development.
16 * 16 *
17 * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the 17 * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the
18 * FTDI_SIO implementation. 18 * FTDI_SIO implementation.
19 * 19 *
20 * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais 20 * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais
@@ -472,7 +472,7 @@
472/* 472/*
473 * DSS-20 Sync Station for Sony Ericsson P800 473 * DSS-20 Sync Station for Sony Ericsson P800
474 */ 474 */
475#define FTDI_DSS20_PID 0xFC82 475#define FTDI_DSS20_PID 0xFC82
476 476
477/* 477/*
478 * Home Electronics (www.home-electro.com) USB gadgets 478 * Home Electronics (www.home-electro.com) USB gadgets
@@ -884,7 +884,7 @@
884/* 884/*
885 * BmRequestType: 0100 0000B 885 * BmRequestType: 0100 0000B
886 * bRequest: FTDI_SIO_RESET 886 * bRequest: FTDI_SIO_RESET
887 * wValue: Control Value 887 * wValue: Control Value
888 * 0 = Reset SIO 888 * 0 = Reset SIO
889 * 1 = Purge RX buffer 889 * 1 = Purge RX buffer
890 * 2 = Purge TX buffer 890 * 2 = Purge TX buffer
@@ -952,7 +952,7 @@
952 * 101 - add .625 to divisor 952 * 101 - add .625 to divisor
953 * 110 - add .750 to divisor 953 * 110 - add .750 to divisor
954 * 111 - add .875 to divisor 954 * 111 - add .875 to divisor
955 * Bits 15 to 0 of the 17-bit divisor are placed in the urb value. Bit 16 is 955 * Bits 15 to 0 of the 17-bit divisor are placed in the urb value. Bit 16 is
956 * placed in bit 0 of the urb index. 956 * placed in bit 0 of the urb index.
957 * 957 *
958 * Note that there are a couple of special cases to support the highest baud 958 * Note that there are a couple of special cases to support the highest baud
@@ -971,8 +971,8 @@ typedef enum {
971} ftdi_chip_type_t; 971} ftdi_chip_type_t;
972 972
973typedef enum { 973typedef enum {
974 ftdi_sio_b300 = 0, 974 ftdi_sio_b300 = 0,
975 ftdi_sio_b600 = 1, 975 ftdi_sio_b600 = 1,
976 ftdi_sio_b1200 = 2, 976 ftdi_sio_b1200 = 2,
977 ftdi_sio_b2400 = 3, 977 ftdi_sio_b2400 = 3,
978 ftdi_sio_b4800 = 4, 978 ftdi_sio_b4800 = 4,
@@ -981,7 +981,7 @@ typedef enum {
981 ftdi_sio_b38400 = 7, 981 ftdi_sio_b38400 = 7,
982 ftdi_sio_b57600 = 8, 982 ftdi_sio_b57600 = 8,
983 ftdi_sio_b115200 = 9 983 ftdi_sio_b115200 = 9
984} FTDI_SIO_baudrate_t ; 984} FTDI_SIO_baudrate_t;
985 985
986/* 986/*
987 * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor values 987 * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor values
@@ -990,19 +990,19 @@ typedef enum {
990 990
991#define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA 991#define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA
992#define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40 992#define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40
993#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 ) 993#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8)
994#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 ) 994#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8)
995#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 ) 995#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8)
996#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 ) 996#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8)
997#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 ) 997#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8)
998#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11 ) 998#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
999#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11 ) 999#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
1000#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11 ) 1000#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
1001#define FTDI_SIO_SET_BREAK (0x1 << 14) 1001#define FTDI_SIO_SET_BREAK (0x1 << 14)
1002/* FTDI_SIO_SET_DATA */ 1002/* FTDI_SIO_SET_DATA */
1003 1003
1004/* 1004/*
1005 * BmRequestType: 0100 0000B 1005 * BmRequestType: 0100 0000B
1006 * bRequest: FTDI_SIO_SET_DATA 1006 * bRequest: FTDI_SIO_SET_DATA
1007 * wValue: Data characteristics (see below) 1007 * wValue: Data characteristics (see below)
1008 * wIndex: Port 1008 * wIndex: Port
@@ -1035,7 +1035,7 @@ typedef enum {
1035#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40 1035#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40
1036#define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL 1036#define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL
1037 1037
1038/* 1038/*
1039 * BmRequestType: 0100 0000B 1039 * BmRequestType: 0100 0000B
1040 * bRequest: FTDI_SIO_MODEM_CTRL 1040 * bRequest: FTDI_SIO_MODEM_CTRL
1041 * wValue: ControlValue (see below) 1041 * wValue: ControlValue (see below)
@@ -1049,11 +1049,11 @@ typedef enum {
1049 */ 1049 */
1050 1050
1051#define FTDI_SIO_SET_DTR_MASK 0x1 1051#define FTDI_SIO_SET_DTR_MASK 0x1
1052#define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK << 8)) 1052#define FTDI_SIO_SET_DTR_HIGH (1 | (FTDI_SIO_SET_DTR_MASK << 8))
1053#define FTDI_SIO_SET_DTR_LOW ( 0 | ( FTDI_SIO_SET_DTR_MASK << 8)) 1053#define FTDI_SIO_SET_DTR_LOW (0 | (FTDI_SIO_SET_DTR_MASK << 8))
1054#define FTDI_SIO_SET_RTS_MASK 0x2 1054#define FTDI_SIO_SET_RTS_MASK 0x2
1055#define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 )) 1055#define FTDI_SIO_SET_RTS_HIGH (2 | (FTDI_SIO_SET_RTS_MASK << 8))
1056#define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 )) 1056#define FTDI_SIO_SET_RTS_LOW (0 | (FTDI_SIO_SET_RTS_MASK << 8))
1057 1057
1058/* 1058/*
1059 * ControlValue 1059 * ControlValue
@@ -1076,7 +1076,7 @@ typedef enum {
1076/* FTDI_SIO_SET_FLOW_CTRL */ 1076/* FTDI_SIO_SET_FLOW_CTRL */
1077#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40 1077#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40
1078#define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL 1078#define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL
1079#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0 1079#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
1080#define FTDI_SIO_RTS_CTS_HS (0x1 << 8) 1080#define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
1081#define FTDI_SIO_DTR_DSR_HS (0x2 << 8) 1081#define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
1082#define FTDI_SIO_XON_XOFF_HS (0x4 << 8) 1082#define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
@@ -1085,7 +1085,7 @@ typedef enum {
1085 * bRequest: FTDI_SIO_SET_FLOW_CTRL 1085 * bRequest: FTDI_SIO_SET_FLOW_CTRL
1086 * wValue: Xoff/Xon 1086 * wValue: Xoff/Xon
1087 * wIndex: Protocol/Port - hIndex is protocl / lIndex is port 1087 * wIndex: Protocol/Port - hIndex is protocl / lIndex is port
1088 * wLength: 0 1088 * wLength: 0
1089 * Data: None 1089 * Data: None
1090 * 1090 *
1091 * hIndex protocol is: 1091 * hIndex protocol is:
@@ -1101,10 +1101,10 @@ typedef enum {
1101 * 1101 *
1102 * A value of zero in the hIndex field disables handshaking 1102 * A value of zero in the hIndex field disables handshaking
1103 * 1103 *
1104 * If Xon/Xoff handshaking is specified, the hValue field should contain the XOFF character 1104 * If Xon/Xoff handshaking is specified, the hValue field should contain the XOFF character
1105 * and the lValue field contains the XON character. 1105 * and the lValue field contains the XON character.
1106 */ 1106 */
1107 1107
1108/* 1108/*
1109 * FTDI_SIO_GET_LATENCY_TIMER 1109 * FTDI_SIO_GET_LATENCY_TIMER
1110 * 1110 *
@@ -1118,7 +1118,7 @@ typedef enum {
1118#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER 1118#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER
1119#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0 1119#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0
1120 1120
1121/* 1121/*
1122 * BmRequestType: 1100 0000b 1122 * BmRequestType: 1100 0000b
1123 * bRequest: FTDI_SIO_GET_LATENCY_TIMER 1123 * bRequest: FTDI_SIO_GET_LATENCY_TIMER
1124 * wValue: 0 1124 * wValue: 0
@@ -1127,7 +1127,7 @@ typedef enum {
1127 * Data: latency (on return) 1127 * Data: latency (on return)
1128 */ 1128 */
1129 1129
1130/* 1130/*
1131 * FTDI_SIO_SET_LATENCY_TIMER 1131 * FTDI_SIO_SET_LATENCY_TIMER
1132 * 1132 *
1133 * Set the timeout interval. The FTDI collects data from the slave 1133 * Set the timeout interval. The FTDI collects data from the slave
@@ -1140,7 +1140,7 @@ typedef enum {
1140#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER 1140#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER
1141#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40 1141#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40
1142 1142
1143/* 1143/*
1144 * BmRequestType: 0100 0000b 1144 * BmRequestType: 0100 0000b
1145 * bRequest: FTDI_SIO_SET_LATENCY_TIMER 1145 * bRequest: FTDI_SIO_SET_LATENCY_TIMER
1146 * wValue: Latency (milliseconds) 1146 * wValue: Latency (milliseconds)
@@ -1155,7 +1155,7 @@ typedef enum {
1155 */ 1155 */
1156 1156
1157/* 1157/*
1158 * FTDI_SIO_SET_EVENT_CHAR 1158 * FTDI_SIO_SET_EVENT_CHAR
1159 * 1159 *
1160 * Set the special event character for the specified communications port. 1160 * Set the special event character for the specified communications port.
1161 * If the device sees this character it will immediately return the 1161 * If the device sees this character it will immediately return the
@@ -1168,7 +1168,7 @@ typedef enum {
1168#define FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40 1168#define FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40
1169 1169
1170 1170
1171/* 1171/*
1172 * BmRequestType: 0100 0000b 1172 * BmRequestType: 0100 0000b
1173 * bRequest: FTDI_SIO_SET_EVENT_CHAR 1173 * bRequest: FTDI_SIO_SET_EVENT_CHAR
1174 * wValue: EventChar 1174 * wValue: EventChar
@@ -1184,12 +1184,12 @@ typedef enum {
1184 * B9..15 Reserved 1184 * B9..15 Reserved
1185 * 1185 *
1186 */ 1186 */
1187 1187
1188/* FTDI_SIO_SET_ERROR_CHAR */ 1188/* FTDI_SIO_SET_ERROR_CHAR */
1189 1189
1190/* Set the parity error replacement character for the specified communications port */ 1190/* Set the parity error replacement character for the specified communications port */
1191 1191
1192/* 1192/*
1193 * BmRequestType: 0100 0000b 1193 * BmRequestType: 0100 0000b
1194 * bRequest: FTDI_SIO_SET_EVENT_CHAR 1194 * bRequest: FTDI_SIO_SET_EVENT_CHAR
1195 * wValue: Error Char 1195 * wValue: Error Char
@@ -1215,15 +1215,15 @@ typedef enum {
1215#define FTDI_SIO_DSR_MASK 0x20 1215#define FTDI_SIO_DSR_MASK 0x20
1216#define FTDI_SIO_RI_MASK 0x40 1216#define FTDI_SIO_RI_MASK 0x40
1217#define FTDI_SIO_RLSD_MASK 0x80 1217#define FTDI_SIO_RLSD_MASK 0x80
1218/* 1218/*
1219 * BmRequestType: 1100 0000b 1219 * BmRequestType: 1100 0000b
1220 * bRequest: FTDI_SIO_GET_MODEM_STATUS 1220 * bRequest: FTDI_SIO_GET_MODEM_STATUS
1221 * wValue: zero 1221 * wValue: zero
1222 * wIndex: Port 1222 * wIndex: Port
1223 * wLength: 1 1223 * wLength: 1
1224 * Data: Status 1224 * Data: Status
1225 * 1225 *
1226 * One byte of data is returned 1226 * One byte of data is returned
1227 * B0..3 0 1227 * B0..3 0
1228 * B4 CTS 1228 * B4 CTS
1229 * 0 = inactive 1229 * 0 = inactive
@@ -1236,15 +1236,15 @@ typedef enum {
1236 * 1 = active 1236 * 1 = active
1237 * B7 Receive Line Signal Detect (RLSD) 1237 * B7 Receive Line Signal Detect (RLSD)
1238 * 0 = inactive 1238 * 0 = inactive
1239 * 1 = active 1239 * 1 = active
1240 */ 1240 */
1241 1241
1242 1242
1243 1243
1244/* Descriptors returned by the device 1244/* Descriptors returned by the device
1245 * 1245 *
1246 * Device Descriptor 1246 * Device Descriptor
1247 * 1247 *
1248 * Offset Field Size Value Description 1248 * Offset Field Size Value Description
1249 * 0 bLength 1 0x12 Size of descriptor in bytes 1249 * 0 bLength 1 0x12 Size of descriptor in bytes
1250 * 1 bDescriptorType 1 0x01 DEVICE Descriptor Type 1250 * 1 bDescriptorType 1 0x01 DEVICE Descriptor Type
@@ -1260,9 +1260,9 @@ typedef enum {
1260 * 15 iProduct 1 0x02 Index of prod string desc 1260 * 15 iProduct 1 0x02 Index of prod string desc
1261 * 16 iSerialNumber 1 0x02 Index of serial nmr string desc 1261 * 16 iSerialNumber 1 0x02 Index of serial nmr string desc
1262 * 17 bNumConfigurations 1 0x01 Number of possible configurations 1262 * 17 bNumConfigurations 1 0x01 Number of possible configurations
1263 * 1263 *
1264 * Configuration Descriptor 1264 * Configuration Descriptor
1265 * 1265 *
1266 * Offset Field Size Value 1266 * Offset Field Size Value
1267 * 0 bLength 1 0x09 Size of descriptor in bytes 1267 * 0 bLength 1 0x09 Size of descriptor in bytes
1268 * 1 bDescriptorType 1 0x02 CONFIGURATION Descriptor Type 1268 * 1 bDescriptorType 1 0x02 CONFIGURATION Descriptor Type
@@ -1272,9 +1272,9 @@ typedef enum {
1272 * 6 iConfiguration 1 0x02 Index of config string descriptor 1272 * 6 iConfiguration 1 0x02 Index of config string descriptor
1273 * 7 bmAttributes 1 0x20 Config characteristics Remote Wakeup 1273 * 7 bmAttributes 1 0x20 Config characteristics Remote Wakeup
1274 * 8 MaxPower 1 0x1E Max power consumption 1274 * 8 MaxPower 1 0x1E Max power consumption
1275 * 1275 *
1276 * Interface Descriptor 1276 * Interface Descriptor
1277 * 1277 *
1278 * Offset Field Size Value 1278 * Offset Field Size Value
1279 * 0 bLength 1 0x09 Size of descriptor in bytes 1279 * 0 bLength 1 0x09 Size of descriptor in bytes
1280 * 1 bDescriptorType 1 0x04 INTERFACE Descriptor Type 1280 * 1 bDescriptorType 1 0x04 INTERFACE Descriptor Type
@@ -1285,9 +1285,9 @@ typedef enum {
1285 * 6 bInterfaceSubClass 1 0xFF Subclass Code 1285 * 6 bInterfaceSubClass 1 0xFF Subclass Code
1286 * 7 bInterfaceProtocol 1 0xFF Protocol Code 1286 * 7 bInterfaceProtocol 1 0xFF Protocol Code
1287 * 8 iInterface 1 0x02 Index of interface string description 1287 * 8 iInterface 1 0x02 Index of interface string description
1288 * 1288 *
1289 * IN Endpoint Descriptor 1289 * IN Endpoint Descriptor
1290 * 1290 *
1291 * Offset Field Size Value 1291 * Offset Field Size Value
1292 * 0 bLength 1 0x07 Size of descriptor in bytes 1292 * 0 bLength 1 0x07 Size of descriptor in bytes
1293 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type 1293 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type
@@ -1295,9 +1295,9 @@ typedef enum {
1295 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk 1295 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk
1296 * 4 bNumEndpoints 2 0x0040 maximum packet size 1296 * 4 bNumEndpoints 2 0x0040 maximum packet size
1297 * 5 bInterval 1 0x00 Interval for polling endpoint 1297 * 5 bInterval 1 0x00 Interval for polling endpoint
1298 * 1298 *
1299 * OUT Endpoint Descriptor 1299 * OUT Endpoint Descriptor
1300 * 1300 *
1301 * Offset Field Size Value 1301 * Offset Field Size Value
1302 * 0 bLength 1 0x07 Size of descriptor in bytes 1302 * 0 bLength 1 0x07 Size of descriptor in bytes
1303 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type 1303 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type
@@ -1305,17 +1305,17 @@ typedef enum {
1305 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk 1305 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk
1306 * 4 bNumEndpoints 2 0x0040 maximum packet size 1306 * 4 bNumEndpoints 2 0x0040 maximum packet size
1307 * 5 bInterval 1 0x00 Interval for polling endpoint 1307 * 5 bInterval 1 0x00 Interval for polling endpoint
1308 * 1308 *
1309 * DATA FORMAT 1309 * DATA FORMAT
1310 * 1310 *
1311 * IN Endpoint 1311 * IN Endpoint
1312 * 1312 *
1313 * The device reserves the first two bytes of data on this endpoint to contain the current 1313 * The device reserves the first two bytes of data on this endpoint to contain the current
1314 * values of the modem and line status registers. In the absence of data, the device 1314 * values of the modem and line status registers. In the absence of data, the device
1315 * generates a message consisting of these two status bytes every 40 ms 1315 * generates a message consisting of these two status bytes every 40 ms
1316 * 1316 *
1317 * Byte 0: Modem Status 1317 * Byte 0: Modem Status
1318 * 1318 *
1319 * Offset Description 1319 * Offset Description
1320 * B0 Reserved - must be 1 1320 * B0 Reserved - must be 1
1321 * B1 Reserved - must be 0 1321 * B1 Reserved - must be 0
@@ -1325,9 +1325,9 @@ typedef enum {
1325 * B5 Data Set Ready (DSR) 1325 * B5 Data Set Ready (DSR)
1326 * B6 Ring Indicator (RI) 1326 * B6 Ring Indicator (RI)
1327 * B7 Receive Line Signal Detect (RLSD) 1327 * B7 Receive Line Signal Detect (RLSD)
1328 * 1328 *
1329 * Byte 1: Line Status 1329 * Byte 1: Line Status
1330 * 1330 *
1331 * Offset Description 1331 * Offset Description
1332 * B0 Data Ready (DR) 1332 * B0 Data Ready (DR)
1333 * B1 Overrun Error (OE) 1333 * B1 Overrun Error (OE)
@@ -1337,7 +1337,7 @@ typedef enum {
1337 * B5 Transmitter Holding Register (THRE) 1337 * B5 Transmitter Holding Register (THRE)
1338 * B6 Transmitter Empty (TEMT) 1338 * B6 Transmitter Empty (TEMT)
1339 * B7 Error in RCVR FIFO 1339 * B7 Error in RCVR FIFO
1340 * 1340 *
1341 */ 1341 */
1342#define FTDI_RS0_CTS (1 << 4) 1342#define FTDI_RS0_CTS (1 << 4)
1343#define FTDI_RS0_DSR (1 << 5) 1343#define FTDI_RS0_DSR (1 << 5)
@@ -1355,17 +1355,17 @@ typedef enum {
1355 1355
1356/* 1356/*
1357 * OUT Endpoint 1357 * OUT Endpoint
1358 * 1358 *
1359 * This device reserves the first bytes of data on this endpoint contain the length 1359 * This device reserves the first bytes of data on this endpoint contain the length
1360 * and port identifier of the message. For the FTDI USB Serial converter the port 1360 * and port identifier of the message. For the FTDI USB Serial converter the port
1361 * identifier is always 1. 1361 * identifier is always 1.
1362 * 1362 *
1363 * Byte 0: Line Status 1363 * Byte 0: Line Status
1364 * 1364 *
1365 * Offset Description 1365 * Offset Description
1366 * B0 Reserved - must be 1 1366 * B0 Reserved - must be 1
1367 * B1 Reserved - must be 0 1367 * B1 Reserved - must be 0
1368 * B2..7 Length of message - (not including Byte 0) 1368 * B2..7 Length of message - (not including Byte 0)
1369 * 1369 *
1370 */ 1370 */
1371 1371
diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c
index e8ba2cb5995d..d30f736d2cc5 100644
--- a/drivers/usb/serial/funsoft.c
+++ b/drivers/usb/serial/funsoft.c
@@ -14,7 +14,7 @@
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/usb.h> 15#include <linux/usb.h>
16#include <linux/usb/serial.h> 16#include <linux/usb/serial.h>
17#include <asm/uaccess.h> 17#include <linux/uaccess.h>
18 18
19static int debug; 19static int debug;
20 20
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
index 8ce5a56a48e3..2e663f1afd5e 100644
--- a/drivers/usb/serial/garmin_gps.c
+++ b/drivers/usb/serial/garmin_gps.c
@@ -33,7 +33,7 @@
33#include <linux/tty_flip.h> 33#include <linux/tty_flip.h>
34#include <linux/module.h> 34#include <linux/module.h>
35#include <linux/spinlock.h> 35#include <linux/spinlock.h>
36#include <asm/uaccess.h> 36#include <linux/uaccess.h>
37#include <asm/atomic.h> 37#include <asm/atomic.h>
38#include <linux/usb.h> 38#include <linux/usb.h>
39#include <linux/usb/serial.h> 39#include <linux/usb/serial.h>
@@ -44,7 +44,7 @@
44static int initial_mode = 1; 44static int initial_mode = 1;
45 45
46/* debug flag */ 46/* debug flag */
47static int debug = 0; 47static int debug;
48 48
49#define GARMIN_VENDOR_ID 0x091E 49#define GARMIN_VENDOR_ID 0x091E
50 50
@@ -56,7 +56,7 @@ static int debug = 0;
56#define VERSION_MINOR 31 56#define VERSION_MINOR 31
57 57
58#define _STR(s) #s 58#define _STR(s) #s
59#define _DRIVER_VERSION(a,b) "v" _STR(a) "." _STR(b) 59#define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b)
60#define DRIVER_VERSION _DRIVER_VERSION(VERSION_MAJOR, VERSION_MINOR) 60#define DRIVER_VERSION _DRIVER_VERSION(VERSION_MAJOR, VERSION_MINOR)
61#define DRIVER_AUTHOR "hermann kneissel" 61#define DRIVER_AUTHOR "hermann kneissel"
62#define DRIVER_DESC "garmin gps driver" 62#define DRIVER_DESC "garmin gps driver"
@@ -65,37 +65,37 @@ static int debug = 0;
65#define EINVPKT 1000 /* invalid packet structure */ 65#define EINVPKT 1000 /* invalid packet structure */
66 66
67 67
68// size of the header of a packet using the usb protocol 68/* size of the header of a packet using the usb protocol */
69#define GARMIN_PKTHDR_LENGTH 12 69#define GARMIN_PKTHDR_LENGTH 12
70 70
71// max. possible size of a packet using the serial protocol 71/* max. possible size of a packet using the serial protocol */
72#define MAX_SERIAL_PKT_SIZ (3+255+3) 72#define MAX_SERIAL_PKT_SIZ (3 + 255 + 3)
73 73
74// max. possible size of a packet with worst case stuffing 74/* max. possible size of a packet with worst case stuffing */
75#define MAX_SERIAL_PKT_SIZ_STUFFED MAX_SERIAL_PKT_SIZ+256 75#define MAX_SERIAL_PKT_SIZ_STUFFED (MAX_SERIAL_PKT_SIZ + 256)
76 76
77// size of a buffer able to hold a complete (no stuffing) packet 77/* size of a buffer able to hold a complete (no stuffing) packet
78// (the document protocol does not contain packets with a larger 78 * (the document protocol does not contain packets with a larger
79// size, but in theory a packet may be 64k+12 bytes - if in 79 * size, but in theory a packet may be 64k+12 bytes - if in
80// later protocol versions larger packet sizes occur, this value 80 * later protocol versions larger packet sizes occur, this value
81// should be increased accordingly, so the input buffer is always 81 * should be increased accordingly, so the input buffer is always
82// large enough the store a complete packet inclusive header) 82 * large enough the store a complete packet inclusive header) */
83#define GPS_IN_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ) 83#define GPS_IN_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ)
84 84
85// size of a buffer able to hold a complete (incl. stuffing) packet 85/* size of a buffer able to hold a complete (incl. stuffing) packet */
86#define GPS_OUT_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ_STUFFED) 86#define GPS_OUT_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ_STUFFED)
87 87
88// where to place the packet id of a serial packet, so we can 88/* where to place the packet id of a serial packet, so we can
89// prepend the usb-packet header without the need to move the 89 * prepend the usb-packet header without the need to move the
90// packets data 90 * packets data */
91#define GSP_INITIAL_OFFSET (GARMIN_PKTHDR_LENGTH-2) 91#define GSP_INITIAL_OFFSET (GARMIN_PKTHDR_LENGTH-2)
92 92
93// max. size of incoming private packets (header+1 param) 93/* max. size of incoming private packets (header+1 param) */
94#define PRIVPKTSIZ (GARMIN_PKTHDR_LENGTH+4) 94#define PRIVPKTSIZ (GARMIN_PKTHDR_LENGTH+4)
95 95
96#define GARMIN_LAYERID_TRANSPORT 0 96#define GARMIN_LAYERID_TRANSPORT 0
97#define GARMIN_LAYERID_APPL 20 97#define GARMIN_LAYERID_APPL 20
98// our own layer-id to use for some control mechanisms 98/* our own layer-id to use for some control mechanisms */
99#define GARMIN_LAYERID_PRIVATE 0x01106E4B 99#define GARMIN_LAYERID_PRIVATE 0x01106E4B
100 100
101#define GARMIN_PKTID_PVT_DATA 51 101#define GARMIN_PKTID_PVT_DATA 51
@@ -103,7 +103,7 @@ static int debug = 0;
103 103
104#define CMND_ABORT_TRANSFER 0 104#define CMND_ABORT_TRANSFER 0
105 105
106// packet ids used in private layer 106/* packet ids used in private layer */
107#define PRIV_PKTID_SET_DEBUG 1 107#define PRIV_PKTID_SET_DEBUG 1
108#define PRIV_PKTID_SET_MODE 2 108#define PRIV_PKTID_SET_MODE 2
109#define PRIV_PKTID_INFO_REQ 3 109#define PRIV_PKTID_INFO_REQ 3
@@ -121,7 +121,8 @@ static int debug = 0;
121struct garmin_packet { 121struct garmin_packet {
122 struct list_head list; 122 struct list_head list;
123 int seq; 123 int seq;
124 int size; // the real size of the data array, always > 0 124 /* the real size of the data array, always > 0 */
125 int size;
125 __u8 data[1]; 126 __u8 data[1];
126}; 127};
127 128
@@ -164,7 +165,7 @@ struct garmin_data {
164#define MODE_NATIVE 0 165#define MODE_NATIVE 0
165#define MODE_GARMIN_SERIAL 1 166#define MODE_GARMIN_SERIAL 1
166 167
167// Flags used in garmin_data.flags: 168/* Flags used in garmin_data.flags: */
168#define FLAGS_SESSION_REPLY_MASK 0x00C0 169#define FLAGS_SESSION_REPLY_MASK 0x00C0
169#define FLAGS_SESSION_REPLY1_SEEN 0x0080 170#define FLAGS_SESSION_REPLY1_SEEN 0x0080
170#define FLAGS_SESSION_REPLY2_SEEN 0x0040 171#define FLAGS_SESSION_REPLY2_SEEN 0x0040
@@ -185,7 +186,7 @@ struct garmin_data {
185 186
186 187
187/* function prototypes */ 188/* function prototypes */
188static void gsp_next_packet(struct garmin_data * garmin_data_p); 189static void gsp_next_packet(struct garmin_data *garmin_data_p);
189static int garmin_write_bulk(struct usb_serial_port *port, 190static int garmin_write_bulk(struct usb_serial_port *port,
190 const unsigned char *buf, int count, 191 const unsigned char *buf, int count,
191 int dismiss_ack); 192 int dismiss_ack);
@@ -217,12 +218,13 @@ static unsigned char const PRIVATE_REQ[]
217 218
218 219
219static struct usb_device_id id_table [] = { 220static struct usb_device_id id_table [] = {
220 /* the same device id seems to be used by all usb enabled gps devices */ 221 /* the same device id seems to be used by all
221 { USB_DEVICE(GARMIN_VENDOR_ID, 3 ) }, 222 usb enabled GPS devices */
223 { USB_DEVICE(GARMIN_VENDOR_ID, 3) },
222 { } /* Terminating entry */ 224 { } /* Terminating entry */
223}; 225};
224 226
225MODULE_DEVICE_TABLE (usb, id_table); 227MODULE_DEVICE_TABLE(usb, id_table);
226 228
227static struct usb_driver garmin_driver = { 229static struct usb_driver garmin_driver = {
228 .name = "garmin_gps", 230 .name = "garmin_gps",
@@ -233,9 +235,10 @@ static struct usb_driver garmin_driver = {
233}; 235};
234 236
235 237
236static inline int noResponseFromAppLayer(struct garmin_data * garmin_data_p) 238static inline int noResponseFromAppLayer(struct garmin_data *garmin_data_p)
237{ 239{
238 return atomic_read(&garmin_data_p->req_count) == atomic_read(&garmin_data_p->resp_count); 240 return atomic_read(&garmin_data_p->req_count) ==
241 atomic_read(&garmin_data_p->resp_count);
239} 242}
240 243
241 244
@@ -261,10 +264,10 @@ static inline int getDataLength(const __u8 *usbPacket)
261 */ 264 */
262static inline int isAbortTrfCmnd(const unsigned char *buf) 265static inline int isAbortTrfCmnd(const unsigned char *buf)
263{ 266{
264 if (0 == memcmp(buf, GARMIN_STOP_TRANSFER_REQ, 267 if (0 == memcmp(buf, GARMIN_STOP_TRANSFER_REQ,
265 sizeof(GARMIN_STOP_TRANSFER_REQ)) || 268 sizeof(GARMIN_STOP_TRANSFER_REQ)) ||
266 0 == memcmp(buf, GARMIN_STOP_TRANSFER_REQ_V2, 269 0 == memcmp(buf, GARMIN_STOP_TRANSFER_REQ_V2,
267 sizeof(GARMIN_STOP_TRANSFER_REQ_V2))) 270 sizeof(GARMIN_STOP_TRANSFER_REQ_V2)))
268 return 1; 271 return 1;
269 else 272 else
270 return 0; 273 return 0;
@@ -275,11 +278,11 @@ static inline int isAbortTrfCmnd(const unsigned char *buf)
275static void send_to_tty(struct usb_serial_port *port, 278static void send_to_tty(struct usb_serial_port *port,
276 char *data, unsigned int actual_length) 279 char *data, unsigned int actual_length)
277{ 280{
278 struct tty_struct *tty = port->tty; 281 struct tty_struct *tty = port->port.tty;
279 282
280 if (tty && actual_length) { 283 if (tty && actual_length) {
281 284
282 usb_serial_debug_data(debug, &port->dev, 285 usb_serial_debug_data(debug, &port->dev,
283 __func__, actual_length, data); 286 __func__, actual_length, data);
284 287
285 tty_buffer_request_room(tty, actual_length); 288 tty_buffer_request_room(tty, actual_length);
@@ -296,7 +299,7 @@ static void send_to_tty(struct usb_serial_port *port,
296/* 299/*
297 * queue a received (usb-)packet for later processing 300 * queue a received (usb-)packet for later processing
298 */ 301 */
299static int pkt_add(struct garmin_data * garmin_data_p, 302static int pkt_add(struct garmin_data *garmin_data_p,
300 unsigned char *data, unsigned int data_length) 303 unsigned char *data, unsigned int data_length)
301{ 304{
302 int state = 0; 305 int state = 0;
@@ -307,7 +310,7 @@ static int pkt_add(struct garmin_data * garmin_data_p,
307 /* process only packets containg data ... */ 310 /* process only packets containg data ... */
308 if (data_length) { 311 if (data_length) {
309 pkt = kmalloc(sizeof(struct garmin_packet)+data_length, 312 pkt = kmalloc(sizeof(struct garmin_packet)+data_length,
310 GFP_ATOMIC); 313 GFP_ATOMIC);
311 if (pkt == NULL) { 314 if (pkt == NULL) {
312 dev_err(&garmin_data_p->port->dev, "out of memory\n"); 315 dev_err(&garmin_data_p->port->dev, "out of memory\n");
313 return 0; 316 return 0;
@@ -325,16 +328,15 @@ static int pkt_add(struct garmin_data * garmin_data_p,
325 328
326 /* in serial mode, if someone is waiting for data from 329 /* in serial mode, if someone is waiting for data from
327 the device, iconvert and send the next packet to tty. */ 330 the device, iconvert and send the next packet to tty. */
328 if (result && (state == STATE_GSP_WAIT_DATA)) { 331 if (result && (state == STATE_GSP_WAIT_DATA))
329 gsp_next_packet(garmin_data_p); 332 gsp_next_packet(garmin_data_p);
330 }
331 } 333 }
332 return result; 334 return result;
333} 335}
334 336
335 337
336/* get the next pending packet */ 338/* get the next pending packet */
337static struct garmin_packet *pkt_pop(struct garmin_data * garmin_data_p) 339static struct garmin_packet *pkt_pop(struct garmin_data *garmin_data_p)
338{ 340{
339 unsigned long flags; 341 unsigned long flags;
340 struct garmin_packet *result = NULL; 342 struct garmin_packet *result = NULL;
@@ -350,7 +352,7 @@ static struct garmin_packet *pkt_pop(struct garmin_data * garmin_data_p)
350 352
351 353
352/* free up all queued data */ 354/* free up all queued data */
353static void pkt_clear(struct garmin_data * garmin_data_p) 355static void pkt_clear(struct garmin_data *garmin_data_p)
354{ 356{
355 unsigned long flags; 357 unsigned long flags;
356 struct garmin_packet *result = NULL; 358 struct garmin_packet *result = NULL;
@@ -372,7 +374,7 @@ static void pkt_clear(struct garmin_data * garmin_data_p)
372 ******************************************************************************/ 374 ******************************************************************************/
373 375
374/* send an ack packet back to the tty */ 376/* send an ack packet back to the tty */
375static int gsp_send_ack(struct garmin_data * garmin_data_p, __u8 pkt_id) 377static int gsp_send_ack(struct garmin_data *garmin_data_p, __u8 pkt_id)
376{ 378{
377 __u8 pkt[10]; 379 __u8 pkt[10];
378 __u8 cksum = 0; 380 __u8 cksum = 0;
@@ -391,9 +393,8 @@ static int gsp_send_ack(struct garmin_data * garmin_data_p, __u8 pkt_id)
391 *ptr++ = pkt_id; 393 *ptr++ = pkt_id;
392 cksum += pkt_id; 394 cksum += pkt_id;
393 395
394 if (pkt_id == DLE) { 396 if (pkt_id == DLE)
395 *ptr++ = DLE; 397 *ptr++ = DLE;
396 }
397 398
398 *ptr++ = 0; 399 *ptr++ = 0;
399 *ptr++ = 0xFF & (-cksum); 400 *ptr++ = 0xFF & (-cksum);
@@ -415,12 +416,12 @@ static int gsp_send_ack(struct garmin_data * garmin_data_p, __u8 pkt_id)
415 * at GSP_INITIAL_OFFSET. 416 * at GSP_INITIAL_OFFSET.
416 * 417 *
417 * count - number of bytes in the input buffer including space reserved for 418 * count - number of bytes in the input buffer including space reserved for
418 * the usb header: GSP_INITIAL_OFFSET + number of bytes in packet 419 * the usb header: GSP_INITIAL_OFFSET + number of bytes in packet
419 * (including pkt-id, data-length a. cksum) 420 * (including pkt-id, data-length a. cksum)
420 */ 421 */
421static int gsp_rec_packet(struct garmin_data * garmin_data_p, int count) 422static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count)
422{ 423{
423 const __u8* recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET; 424 const __u8 *recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET;
424 __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer; 425 __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer;
425 426
426 int cksum = 0; 427 int cksum = 0;
@@ -440,8 +441,8 @@ static int gsp_rec_packet(struct garmin_data * garmin_data_p, int count)
440 cksum += *recpkt++; 441 cksum += *recpkt++;
441 cksum += *recpkt++; 442 cksum += *recpkt++;
442 443
443 // sanity check, remove after test ... 444 /* sanity check, remove after test ... */
444 if ((__u8*)&(usbdata[3]) != recpkt) { 445 if ((__u8 *)&(usbdata[3]) != recpkt) {
445 dbg("%s - ptr mismatch %p - %p", 446 dbg("%s - ptr mismatch %p - %p",
446 __func__, &(usbdata[4]), recpkt); 447 __func__, &(usbdata[4]), recpkt);
447 return -EINVPKT; 448 return -EINVPKT;
@@ -462,7 +463,7 @@ static int gsp_rec_packet(struct garmin_data * garmin_data_p, int count)
462 usbdata[1] = __cpu_to_le32(pktid); 463 usbdata[1] = __cpu_to_le32(pktid);
463 usbdata[2] = __cpu_to_le32(size); 464 usbdata[2] = __cpu_to_le32(size);
464 465
465 garmin_write_bulk (garmin_data_p->port, garmin_data_p->inbuffer, 466 garmin_write_bulk(garmin_data_p->port, garmin_data_p->inbuffer,
466 GARMIN_PKTHDR_LENGTH+size, 0); 467 GARMIN_PKTHDR_LENGTH+size, 0);
467 468
468 /* if this was an abort-transfer command, flush all 469 /* if this was an abort-transfer command, flush all
@@ -495,7 +496,7 @@ static int gsp_rec_packet(struct garmin_data * garmin_data_p, int count)
495 * if the input is an abort command, drop all queued data. 496 * if the input is an abort command, drop all queued data.
496 */ 497 */
497 498
498static int gsp_receive(struct garmin_data * garmin_data_p, 499static int gsp_receive(struct garmin_data *garmin_data_p,
499 const unsigned char *buf, int count) 500 const unsigned char *buf, int count)
500{ 501{
501 unsigned long flags; 502 unsigned long flags;
@@ -504,10 +505,11 @@ static int gsp_receive(struct garmin_data * garmin_data_p,
504 int i = 0; 505 int i = 0;
505 __u8 *dest; 506 __u8 *dest;
506 int size; 507 int size;
507 // dleSeen: set if last byte read was a DLE 508 /* dleSeen: set if last byte read was a DLE */
508 int dleSeen; 509 int dleSeen;
509 // skip: if set, skip incoming data until possible start of 510 /* skip: if set, skip incoming data until possible start of
510 // new packet 511 * new packet
512 */
511 int skip; 513 int skip;
512 __u8 data; 514 __u8 data;
513 515
@@ -521,14 +523,13 @@ static int gsp_receive(struct garmin_data * garmin_data_p,
521 dbg("%s - dle=%d skip=%d size=%d count=%d", 523 dbg("%s - dle=%d skip=%d size=%d count=%d",
522 __func__, dleSeen, skip, size, count); 524 __func__, dleSeen, skip, size, count);
523 525
524 if (size == 0) { 526 if (size == 0)
525 size = GSP_INITIAL_OFFSET; 527 size = GSP_INITIAL_OFFSET;
526 }
527 528
528 while (offs < count) { 529 while (offs < count) {
529 530
530 data = *(buf+offs); 531 data = *(buf+offs);
531 offs ++; 532 offs++;
532 533
533 if (data == DLE) { 534 if (data == DLE) {
534 if (skip) { /* start of a new pkt */ 535 if (skip) { /* start of a new pkt */
@@ -554,9 +555,8 @@ static int gsp_receive(struct garmin_data * garmin_data_p,
554 ack_or_nak_seen = NAK; 555 ack_or_nak_seen = NAK;
555 dbg("NAK packet complete."); 556 dbg("NAK packet complete.");
556 } else { 557 } else {
557 dbg("packet complete " 558 dbg("packet complete - id=0x%X.",
558 "- id=0x%X.", 559 0xFF & data);
559 0xFF & data);
560 gsp_rec_packet(garmin_data_p, size); 560 gsp_rec_packet(garmin_data_p, size);
561 } 561 }
562 562
@@ -589,7 +589,7 @@ static int gsp_receive(struct garmin_data * garmin_data_p,
589 589
590 garmin_data_p->insize = size; 590 garmin_data_p->insize = size;
591 591
592 // copy flags back to structure 592 /* copy flags back to structure */
593 if (skip) 593 if (skip)
594 garmin_data_p->flags |= FLAGS_GSP_SKIP; 594 garmin_data_p->flags |= FLAGS_GSP_SKIP;
595 else 595 else
@@ -600,16 +600,13 @@ static int gsp_receive(struct garmin_data * garmin_data_p,
600 else 600 else
601 garmin_data_p->flags &= ~FLAGS_GSP_DLESEEN; 601 garmin_data_p->flags &= ~FLAGS_GSP_DLESEEN;
602 602
603 if (ack_or_nak_seen) { 603 if (ack_or_nak_seen)
604 garmin_data_p->state = STATE_GSP_WAIT_DATA; 604 garmin_data_p->state = STATE_GSP_WAIT_DATA;
605 }
606 605
607 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 606 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
608 607
609 if (ack_or_nak_seen) { 608 if (ack_or_nak_seen)
610 gsp_next_packet(garmin_data_p); 609 gsp_next_packet(garmin_data_p);
611 }
612
613 return count; 610 return count;
614} 611}
615 612
@@ -623,7 +620,7 @@ static int gsp_receive(struct garmin_data * garmin_data_p,
623 * 620 *
624 * return <0 on error, 0 if packet is incomplete or > 0 if packet was sent 621 * return <0 on error, 0 if packet is incomplete or > 0 if packet was sent
625 */ 622 */
626static int gsp_send(struct garmin_data * garmin_data_p, 623static int gsp_send(struct garmin_data *garmin_data_p,
627 const unsigned char *buf, int count) 624 const unsigned char *buf, int count)
628{ 625{
629 const unsigned char *src; 626 const unsigned char *src;
@@ -631,11 +628,11 @@ static int gsp_send(struct garmin_data * garmin_data_p,
631 int pktid = 0; 628 int pktid = 0;
632 int datalen = 0; 629 int datalen = 0;
633 int cksum = 0; 630 int cksum = 0;
634 int i=0; 631 int i = 0;
635 int k; 632 int k;
636 633
637 dbg("%s - state %d - %d bytes.", __func__, 634 dbg("%s - state %d - %d bytes.", __func__,
638 garmin_data_p->state, count); 635 garmin_data_p->state, count);
639 636
640 k = garmin_data_p->outsize; 637 k = garmin_data_p->outsize;
641 if ((k+count) > GPS_OUT_BUFSIZ) { 638 if ((k+count) > GPS_OUT_BUFSIZ) {
@@ -650,7 +647,7 @@ static int gsp_send(struct garmin_data * garmin_data_p,
650 647
651 if (k >= GARMIN_PKTHDR_LENGTH) { 648 if (k >= GARMIN_PKTHDR_LENGTH) {
652 pktid = getPacketId(garmin_data_p->outbuffer); 649 pktid = getPacketId(garmin_data_p->outbuffer);
653 datalen= getDataLength(garmin_data_p->outbuffer); 650 datalen = getDataLength(garmin_data_p->outbuffer);
654 i = GARMIN_PKTHDR_LENGTH + datalen; 651 i = GARMIN_PKTHDR_LENGTH + datalen;
655 if (k < i) 652 if (k < i)
656 return 0; 653 return 0;
@@ -658,19 +655,18 @@ static int gsp_send(struct garmin_data * garmin_data_p,
658 return 0; 655 return 0;
659 } 656 }
660 657
661 dbg("%s - %d bytes in buffer, %d bytes in pkt.", __func__, 658 dbg("%s - %d bytes in buffer, %d bytes in pkt.", __func__, k, i);
662 k, i);
663 659
664 /* garmin_data_p->outbuffer now contains a complete packet */ 660 /* garmin_data_p->outbuffer now contains a complete packet */
665 661
666 usb_serial_debug_data(debug, &garmin_data_p->port->dev, 662 usb_serial_debug_data(debug, &garmin_data_p->port->dev,
667 __func__, k, garmin_data_p->outbuffer); 663 __func__, k, garmin_data_p->outbuffer);
668 664
669 garmin_data_p->outsize = 0; 665 garmin_data_p->outsize = 0;
670 666
671 if (GARMIN_LAYERID_APPL != getLayerId(garmin_data_p->outbuffer)) { 667 if (GARMIN_LAYERID_APPL != getLayerId(garmin_data_p->outbuffer)) {
672 dbg("not an application packet (%d)", 668 dbg("not an application packet (%d)",
673 getLayerId(garmin_data_p->outbuffer)); 669 getLayerId(garmin_data_p->outbuffer));
674 return -1; 670 return -1;
675 } 671 }
676 672
@@ -688,14 +684,14 @@ static int gsp_send(struct garmin_data * garmin_data_p,
688 684
689 k = 0; 685 k = 0;
690 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH; 686 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH;
691 for (i=0; i<datalen; i++) { 687 for (i = 0; i < datalen; i++) {
692 if (*src++ == DLE) 688 if (*src++ == DLE)
693 k++; 689 k++;
694 } 690 }
695 691
696 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH; 692 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH;
697 if (k > (GARMIN_PKTHDR_LENGTH-2)) { 693 if (k > (GARMIN_PKTHDR_LENGTH-2)) {
698 /* can't add stuffing DLEs in place, move data to end 694 /* can't add stuffing DLEs in place, move data to end
699 of buffer ... */ 695 of buffer ... */
700 dst = garmin_data_p->outbuffer+GPS_OUT_BUFSIZ-datalen; 696 dst = garmin_data_p->outbuffer+GPS_OUT_BUFSIZ-datalen;
701 memcpy(dst, src, datalen); 697 memcpy(dst, src, datalen);
@@ -712,14 +708,14 @@ static int gsp_send(struct garmin_data * garmin_data_p,
712 if (datalen == DLE) 708 if (datalen == DLE)
713 *dst++ = DLE; 709 *dst++ = DLE;
714 710
715 for (i=0; i<datalen; i++) { 711 for (i = 0; i < datalen; i++) {
716 __u8 c = *src++; 712 __u8 c = *src++;
717 *dst++ = c; 713 *dst++ = c;
718 cksum += c; 714 cksum += c;
719 if (c == DLE) 715 if (c == DLE)
720 *dst++ = DLE; 716 *dst++ = DLE;
721 } 717 }
722 718
723 cksum = 0xFF & -cksum; 719 cksum = 0xFF & -cksum;
724 *dst++ = cksum; 720 *dst++ = cksum;
725 if (cksum == DLE) 721 if (cksum == DLE)
@@ -744,7 +740,7 @@ static int gsp_send(struct garmin_data * garmin_data_p,
744/* 740/*
745 * Process the next pending data packet - if there is one 741 * Process the next pending data packet - if there is one
746 */ 742 */
747static void gsp_next_packet(struct garmin_data * garmin_data_p) 743static void gsp_next_packet(struct garmin_data *garmin_data_p)
748{ 744{
749 struct garmin_packet *pkt = NULL; 745 struct garmin_packet *pkt = NULL;
750 746
@@ -774,17 +770,17 @@ static void gsp_next_packet(struct garmin_data * garmin_data_p)
774 * buf contains the data read, it may span more than one packet 770 * buf contains the data read, it may span more than one packet
775 * or even incomplete packets 771 * or even incomplete packets
776 */ 772 */
777static int nat_receive(struct garmin_data * garmin_data_p, 773static int nat_receive(struct garmin_data *garmin_data_p,
778 const unsigned char *buf, int count) 774 const unsigned char *buf, int count)
779{ 775{
780 unsigned long flags; 776 unsigned long flags;
781 __u8 * dest; 777 __u8 *dest;
782 int offs = 0; 778 int offs = 0;
783 int result = count; 779 int result = count;
784 int len; 780 int len;
785 781
786 while (offs < count) { 782 while (offs < count) {
787 // if buffer contains header, copy rest of data 783 /* if buffer contains header, copy rest of data */
788 if (garmin_data_p->insize >= GARMIN_PKTHDR_LENGTH) 784 if (garmin_data_p->insize >= GARMIN_PKTHDR_LENGTH)
789 len = GARMIN_PKTHDR_LENGTH 785 len = GARMIN_PKTHDR_LENGTH
790 +getDataLength(garmin_data_p->inbuffer); 786 +getDataLength(garmin_data_p->inbuffer);
@@ -792,9 +788,9 @@ static int nat_receive(struct garmin_data * garmin_data_p,
792 len = GARMIN_PKTHDR_LENGTH; 788 len = GARMIN_PKTHDR_LENGTH;
793 789
794 if (len >= GPS_IN_BUFSIZ) { 790 if (len >= GPS_IN_BUFSIZ) {
795 /* seem to be an invalid packet, ignore rest of input */ 791 /* seems to be an invalid packet, ignore rest
796 dbg("%s - packet size too large: %d", 792 of input */
797 __func__, len); 793 dbg("%s - packet size too large: %d", __func__, len);
798 garmin_data_p->insize = 0; 794 garmin_data_p->insize = 0;
799 count = 0; 795 count = 0;
800 result = -EINVPKT; 796 result = -EINVPKT;
@@ -804,7 +800,7 @@ static int nat_receive(struct garmin_data * garmin_data_p,
804 len = (count-offs); 800 len = (count-offs);
805 if (len > 0) { 801 if (len > 0) {
806 dest = garmin_data_p->inbuffer 802 dest = garmin_data_p->inbuffer
807 +garmin_data_p->insize; 803 + garmin_data_p->insize;
808 memcpy(dest, buf+offs, len); 804 memcpy(dest, buf+offs, len);
809 garmin_data_p->insize += len; 805 garmin_data_p->insize += len;
810 offs += len; 806 offs += len;
@@ -816,17 +812,19 @@ static int nat_receive(struct garmin_data * garmin_data_p,
816 len = GARMIN_PKTHDR_LENGTH+ 812 len = GARMIN_PKTHDR_LENGTH+
817 getDataLength(garmin_data_p->inbuffer); 813 getDataLength(garmin_data_p->inbuffer);
818 if (garmin_data_p->insize >= len) { 814 if (garmin_data_p->insize >= len) {
819 garmin_write_bulk (garmin_data_p->port, 815 garmin_write_bulk(garmin_data_p->port,
820 garmin_data_p->inbuffer, 816 garmin_data_p->inbuffer,
821 len, 0); 817 len, 0);
822 garmin_data_p->insize = 0; 818 garmin_data_p->insize = 0;
823 819
824 /* if this was an abort-transfer command, 820 /* if this was an abort-transfer command,
825 flush all queued data. */ 821 flush all queued data. */
826 if (isAbortTrfCmnd(garmin_data_p->inbuffer)) { 822 if (isAbortTrfCmnd(garmin_data_p->inbuffer)) {
827 spin_lock_irqsave(&garmin_data_p->lock, flags); 823 spin_lock_irqsave(&garmin_data_p->lock,
824 flags);
828 garmin_data_p->flags |= FLAGS_DROP_DATA; 825 garmin_data_p->flags |= FLAGS_DROP_DATA;
829 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 826 spin_unlock_irqrestore(
827 &garmin_data_p->lock, flags);
830 pkt_clear(garmin_data_p); 828 pkt_clear(garmin_data_p);
831 } 829 }
832 } 830 }
@@ -842,7 +840,7 @@ static int nat_receive(struct garmin_data * garmin_data_p,
842 840
843static void priv_status_resp(struct usb_serial_port *port) 841static void priv_status_resp(struct usb_serial_port *port)
844{ 842{
845 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 843 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
846 __le32 *pkt = (__le32 *)garmin_data_p->privpkt; 844 __le32 *pkt = (__le32 *)garmin_data_p->privpkt;
847 845
848 pkt[0] = __cpu_to_le32(GARMIN_LAYERID_PRIVATE); 846 pkt[0] = __cpu_to_le32(GARMIN_LAYERID_PRIVATE);
@@ -852,7 +850,7 @@ static void priv_status_resp(struct usb_serial_port *port)
852 pkt[4] = __cpu_to_le32(garmin_data_p->mode); 850 pkt[4] = __cpu_to_le32(garmin_data_p->mode);
853 pkt[5] = __cpu_to_le32(garmin_data_p->serial_num); 851 pkt[5] = __cpu_to_le32(garmin_data_p->serial_num);
854 852
855 send_to_tty(port, (__u8*)pkt, 6*4); 853 send_to_tty(port, (__u8 *)pkt, 6 * 4);
856} 854}
857 855
858 856
@@ -864,7 +862,7 @@ static int process_resetdev_request(struct usb_serial_port *port)
864{ 862{
865 unsigned long flags; 863 unsigned long flags;
866 int status; 864 int status;
867 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 865 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
868 866
869 spin_lock_irqsave(&garmin_data_p->lock, flags); 867 spin_lock_irqsave(&garmin_data_p->lock, flags);
870 garmin_data_p->flags &= ~(CLEAR_HALT_REQUIRED); 868 garmin_data_p->flags &= ~(CLEAR_HALT_REQUIRED);
@@ -872,8 +870,8 @@ static int process_resetdev_request(struct usb_serial_port *port)
872 garmin_data_p->serial_num = 0; 870 garmin_data_p->serial_num = 0;
873 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 871 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
874 872
875 usb_kill_urb (port->interrupt_in_urb); 873 usb_kill_urb(port->interrupt_in_urb);
876 dbg("%s - usb_reset_device", __func__ ); 874 dbg("%s - usb_reset_device", __func__);
877 status = usb_reset_device(port->serial->dev); 875 status = usb_reset_device(port->serial->dev);
878 if (status) 876 if (status)
879 dbg("%s - usb_reset_device failed: %d", 877 dbg("%s - usb_reset_device failed: %d",
@@ -886,7 +884,7 @@ static int process_resetdev_request(struct usb_serial_port *port)
886/* 884/*
887 * clear all cached data 885 * clear all cached data
888 */ 886 */
889static int garmin_clear(struct garmin_data * garmin_data_p) 887static int garmin_clear(struct garmin_data *garmin_data_p)
890{ 888{
891 unsigned long flags; 889 unsigned long flags;
892 int status = 0; 890 int status = 0;
@@ -896,8 +894,7 @@ static int garmin_clear(struct garmin_data * garmin_data_p)
896 if (port != NULL && atomic_read(&garmin_data_p->resp_count)) { 894 if (port != NULL && atomic_read(&garmin_data_p->resp_count)) {
897 /* send a terminate command */ 895 /* send a terminate command */
898 status = garmin_write_bulk(port, GARMIN_STOP_TRANSFER_REQ, 896 status = garmin_write_bulk(port, GARMIN_STOP_TRANSFER_REQ,
899 sizeof(GARMIN_STOP_TRANSFER_REQ), 897 sizeof(GARMIN_STOP_TRANSFER_REQ), 1);
900 1);
901 } 898 }
902 899
903 /* flush all queued data */ 900 /* flush all queued data */
@@ -920,28 +917,26 @@ static int garmin_init_session(struct usb_serial_port *port)
920{ 917{
921 unsigned long flags; 918 unsigned long flags;
922 struct usb_serial *serial = port->serial; 919 struct usb_serial *serial = port->serial;
923 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 920 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
924 int status = 0; 921 int status = 0;
925 922
926 if (status == 0) { 923 if (status == 0) {
927 usb_kill_urb (port->interrupt_in_urb); 924 usb_kill_urb(port->interrupt_in_urb);
928 925
929 dbg("%s - adding interrupt input", __func__); 926 dbg("%s - adding interrupt input", __func__);
930 port->interrupt_in_urb->dev = serial->dev; 927 port->interrupt_in_urb->dev = serial->dev;
931 status = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 928 status = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
932 if (status) 929 if (status)
933 dev_err(&serial->dev->dev, 930 dev_err(&serial->dev->dev,
934 "%s - failed submitting interrupt urb," 931 "%s - failed submitting interrupt urb, error %d\n",
935 " error %d\n", 932 __func__, status);
936 __func__, status);
937 } 933 }
938 934
939 if (status == 0) { 935 if (status == 0) {
940 dbg("%s - starting session ...", __func__); 936 dbg("%s - starting session ...", __func__);
941 garmin_data_p->state = STATE_ACTIVE; 937 garmin_data_p->state = STATE_ACTIVE;
942 status = garmin_write_bulk(port, GARMIN_START_SESSION_REQ, 938 status = garmin_write_bulk(port, GARMIN_START_SESSION_REQ,
943 sizeof(GARMIN_START_SESSION_REQ), 939 sizeof(GARMIN_START_SESSION_REQ), 0);
944 0);
945 940
946 if (status >= 0) { 941 if (status >= 0) {
947 942
@@ -951,14 +946,14 @@ static int garmin_init_session(struct usb_serial_port *port)
951 946
952 /* not needed, but the win32 driver does it too ... */ 947 /* not needed, but the win32 driver does it too ... */
953 status = garmin_write_bulk(port, 948 status = garmin_write_bulk(port,
954 GARMIN_START_SESSION_REQ2, 949 GARMIN_START_SESSION_REQ2,
955 sizeof(GARMIN_START_SESSION_REQ2), 950 sizeof(GARMIN_START_SESSION_REQ2), 0);
956 0);
957 if (status >= 0) { 951 if (status >= 0) {
958 status = 0; 952 status = 0;
959 spin_lock_irqsave(&garmin_data_p->lock, flags); 953 spin_lock_irqsave(&garmin_data_p->lock, flags);
960 garmin_data_p->ignorePkts++; 954 garmin_data_p->ignorePkts++;
961 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 955 spin_unlock_irqrestore(&garmin_data_p->lock,
956 flags);
962 } 957 }
963 } 958 }
964 } 959 }
@@ -970,11 +965,12 @@ static int garmin_init_session(struct usb_serial_port *port)
970 965
971 966
972 967
973static int garmin_open (struct usb_serial_port *port, struct file *filp) 968static int garmin_open(struct tty_struct *tty,
969 struct usb_serial_port *port, struct file *filp)
974{ 970{
975 unsigned long flags; 971 unsigned long flags;
976 int status = 0; 972 int status = 0;
977 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 973 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
978 974
979 dbg("%s - port %d", __func__, port->number); 975 dbg("%s - port %d", __func__, port->number);
980 976
@@ -983,8 +979,8 @@ static int garmin_open (struct usb_serial_port *port, struct file *filp)
983 * through, otherwise it is scheduled, and with high data rates (like 979 * through, otherwise it is scheduled, and with high data rates (like
984 * with OHCI) data can get lost. 980 * with OHCI) data can get lost.
985 */ 981 */
986 if (port->tty) 982 if (tty)
987 port->tty->low_latency = 1; 983 tty->low_latency = 1;
988 984
989 spin_lock_irqsave(&garmin_data_p->lock, flags); 985 spin_lock_irqsave(&garmin_data_p->lock, flags);
990 garmin_data_p->mode = initial_mode; 986 garmin_data_p->mode = initial_mode;
@@ -995,23 +991,22 @@ static int garmin_open (struct usb_serial_port *port, struct file *filp)
995 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 991 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
996 992
997 /* shutdown any bulk reads that might be going on */ 993 /* shutdown any bulk reads that might be going on */
998 usb_kill_urb (port->write_urb); 994 usb_kill_urb(port->write_urb);
999 usb_kill_urb (port->read_urb); 995 usb_kill_urb(port->read_urb);
1000 996
1001 if (garmin_data_p->state == STATE_RESET) { 997 if (garmin_data_p->state == STATE_RESET)
1002 status = garmin_init_session(port); 998 status = garmin_init_session(port);
1003 }
1004 999
1005 garmin_data_p->state = STATE_ACTIVE; 1000 garmin_data_p->state = STATE_ACTIVE;
1006
1007 return status; 1001 return status;
1008} 1002}
1009 1003
1010 1004
1011static void garmin_close (struct usb_serial_port *port, struct file * filp) 1005static void garmin_close(struct tty_struct *tty,
1006 struct usb_serial_port *port, struct file *filp)
1012{ 1007{
1013 struct usb_serial *serial = port->serial; 1008 struct usb_serial *serial = port->serial;
1014 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1009 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1015 1010
1016 dbg("%s - port %d - mode=%d state=%d flags=0x%X", __func__, 1011 dbg("%s - port %d - mode=%d state=%d flags=0x%X", __func__,
1017 port->number, garmin_data_p->mode, 1012 port->number, garmin_data_p->mode,
@@ -1025,8 +1020,8 @@ static void garmin_close (struct usb_serial_port *port, struct file * filp)
1025 garmin_clear(garmin_data_p); 1020 garmin_clear(garmin_data_p);
1026 1021
1027 /* shutdown our urbs */ 1022 /* shutdown our urbs */
1028 usb_kill_urb (port->read_urb); 1023 usb_kill_urb(port->read_urb);
1029 usb_kill_urb (port->write_urb); 1024 usb_kill_urb(port->write_urb);
1030 1025
1031 if (!port->serial->disconnected) { 1026 if (!port->serial->disconnected) {
1032 if (noResponseFromAppLayer(garmin_data_p) || 1027 if (noResponseFromAppLayer(garmin_data_p) ||
@@ -1042,21 +1037,22 @@ static void garmin_close (struct usb_serial_port *port, struct file * filp)
1042 mutex_unlock(&port->serial->disc_mutex); 1037 mutex_unlock(&port->serial->disc_mutex);
1043} 1038}
1044 1039
1045 1040static void garmin_write_bulk_callback(struct urb *urb)
1046static void garmin_write_bulk_callback (struct urb *urb)
1047{ 1041{
1048 unsigned long flags; 1042 unsigned long flags;
1049 struct usb_serial_port *port = urb->context; 1043 struct usb_serial_port *port = urb->context;
1050 int status = urb->status; 1044 int status = urb->status;
1051 1045
1052 if (port) { 1046 if (port) {
1053 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1047 struct garmin_data *garmin_data_p =
1048 usb_get_serial_port_data(port);
1054 1049
1055 dbg("%s - port %d", __func__, port->number); 1050 dbg("%s - port %d", __func__, port->number);
1056 1051
1057 if (GARMIN_LAYERID_APPL == getLayerId(urb->transfer_buffer) 1052 if (GARMIN_LAYERID_APPL == getLayerId(urb->transfer_buffer)
1058 && (garmin_data_p->mode == MODE_GARMIN_SERIAL)) { 1053 && (garmin_data_p->mode == MODE_GARMIN_SERIAL)) {
1059 gsp_send_ack(garmin_data_p, ((__u8 *)urb->transfer_buffer)[4]); 1054 gsp_send_ack(garmin_data_p,
1055 ((__u8 *)urb->transfer_buffer)[4]);
1060 } 1056 }
1061 1057
1062 if (status) { 1058 if (status) {
@@ -1070,20 +1066,21 @@ static void garmin_write_bulk_callback (struct urb *urb)
1070 usb_serial_port_softint(port); 1066 usb_serial_port_softint(port);
1071 } 1067 }
1072 1068
1073 /* Ignore errors that resulted from garmin_write_bulk with dismiss_ack=1 */ 1069 /* Ignore errors that resulted from garmin_write_bulk with
1070 dismiss_ack = 1 */
1074 1071
1075 /* free up the transfer buffer, as usb_free_urb() does not do this */ 1072 /* free up the transfer buffer, as usb_free_urb() does not do this */
1076 kfree (urb->transfer_buffer); 1073 kfree(urb->transfer_buffer);
1077} 1074}
1078 1075
1079 1076
1080static int garmin_write_bulk (struct usb_serial_port *port, 1077static int garmin_write_bulk(struct usb_serial_port *port,
1081 const unsigned char *buf, int count, 1078 const unsigned char *buf, int count,
1082 int dismiss_ack) 1079 int dismiss_ack)
1083{ 1080{
1084 unsigned long flags; 1081 unsigned long flags;
1085 struct usb_serial *serial = port->serial; 1082 struct usb_serial *serial = port->serial;
1086 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1083 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1087 struct urb *urb; 1084 struct urb *urb;
1088 unsigned char *buffer; 1085 unsigned char *buffer;
1089 int status; 1086 int status;
@@ -1095,7 +1092,7 @@ static int garmin_write_bulk (struct usb_serial_port *port,
1095 garmin_data_p->flags &= ~FLAGS_DROP_DATA; 1092 garmin_data_p->flags &= ~FLAGS_DROP_DATA;
1096 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 1093 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1097 1094
1098 buffer = kmalloc (count, GFP_ATOMIC); 1095 buffer = kmalloc(count, GFP_ATOMIC);
1099 if (!buffer) { 1096 if (!buffer) {
1100 dev_err(&port->dev, "out of memory\n"); 1097 dev_err(&port->dev, "out of memory\n");
1101 return -ENOMEM; 1098 return -ENOMEM;
@@ -1104,17 +1101,17 @@ static int garmin_write_bulk (struct usb_serial_port *port,
1104 urb = usb_alloc_urb(0, GFP_ATOMIC); 1101 urb = usb_alloc_urb(0, GFP_ATOMIC);
1105 if (!urb) { 1102 if (!urb) {
1106 dev_err(&port->dev, "no more free urbs\n"); 1103 dev_err(&port->dev, "no more free urbs\n");
1107 kfree (buffer); 1104 kfree(buffer);
1108 return -ENOMEM; 1105 return -ENOMEM;
1109 } 1106 }
1110 1107
1111 memcpy (buffer, buf, count); 1108 memcpy(buffer, buf, count);
1112 1109
1113 usb_serial_debug_data(debug, &port->dev, __func__, count, buffer); 1110 usb_serial_debug_data(debug, &port->dev, __func__, count, buffer);
1114 1111
1115 usb_fill_bulk_urb (urb, serial->dev, 1112 usb_fill_bulk_urb(urb, serial->dev,
1116 usb_sndbulkpipe (serial->dev, 1113 usb_sndbulkpipe(serial->dev,
1117 port->bulk_out_endpointAddress), 1114 port->bulk_out_endpointAddress),
1118 buffer, count, 1115 buffer, count,
1119 garmin_write_bulk_callback, 1116 garmin_write_bulk_callback,
1120 dismiss_ack ? NULL : port); 1117 dismiss_ack ? NULL : port);
@@ -1132,33 +1129,29 @@ static int garmin_write_bulk (struct usb_serial_port *port,
1132 status = usb_submit_urb(urb, GFP_ATOMIC); 1129 status = usb_submit_urb(urb, GFP_ATOMIC);
1133 if (status) { 1130 if (status) {
1134 dev_err(&port->dev, 1131 dev_err(&port->dev,
1135 "%s - usb_submit_urb(write bulk) " 1132 "%s - usb_submit_urb(write bulk) failed with status = %d\n",
1136 "failed with status = %d\n",
1137 __func__, status); 1133 __func__, status);
1138 count = status; 1134 count = status;
1139 } 1135 }
1140 1136
1141 /* we are done with this urb, so let the host driver 1137 /* we are done with this urb, so let the host driver
1142 * really free it when it is finished with it */ 1138 * really free it when it is finished with it */
1143 usb_free_urb (urb); 1139 usb_free_urb(urb);
1144 1140
1145 return count; 1141 return count;
1146} 1142}
1147 1143
1148 1144static int garmin_write(struct tty_struct *tty, struct usb_serial_port *port,
1149 1145 const unsigned char *buf, int count)
1150static int garmin_write (struct usb_serial_port *port,
1151 const unsigned char *buf, int count)
1152{ 1146{
1153 int pktid, pktsiz, len; 1147 int pktid, pktsiz, len;
1154 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1148 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1155 __le32 *privpkt = (__le32 *)garmin_data_p->privpkt; 1149 __le32 *privpkt = (__le32 *)garmin_data_p->privpkt;
1156 1150
1157 usb_serial_debug_data(debug, &port->dev, __func__, count, buf); 1151 usb_serial_debug_data(debug, &port->dev, __func__, count, buf);
1158 1152
1159 /* check for our private packets */ 1153 /* check for our private packets */
1160 if (count >= GARMIN_PKTHDR_LENGTH) { 1154 if (count >= GARMIN_PKTHDR_LENGTH) {
1161
1162 len = PRIVPKTSIZ; 1155 len = PRIVPKTSIZ;
1163 if (count < len) 1156 if (count < len)
1164 len = count; 1157 len = count;
@@ -1169,15 +1162,16 @@ static int garmin_write (struct usb_serial_port *port,
1169 pktid = getPacketId(garmin_data_p->privpkt); 1162 pktid = getPacketId(garmin_data_p->privpkt);
1170 1163
1171 if (count == (GARMIN_PKTHDR_LENGTH+pktsiz) 1164 if (count == (GARMIN_PKTHDR_LENGTH+pktsiz)
1172 && GARMIN_LAYERID_PRIVATE == getLayerId(garmin_data_p->privpkt)) { 1165 && GARMIN_LAYERID_PRIVATE ==
1166 getLayerId(garmin_data_p->privpkt)) {
1173 1167
1174 dbg("%s - processing private request %d", 1168 dbg("%s - processing private request %d",
1175 __func__, pktid); 1169 __func__, pktid);
1176 1170
1177 // drop all unfinished transfers 1171 /* drop all unfinished transfers */
1178 garmin_clear(garmin_data_p); 1172 garmin_clear(garmin_data_p);
1179 1173
1180 switch(pktid) { 1174 switch (pktid) {
1181 1175
1182 case PRIV_PKTID_SET_DEBUG: 1176 case PRIV_PKTID_SET_DEBUG:
1183 if (pktsiz != 4) 1177 if (pktsiz != 4)
@@ -1226,44 +1220,31 @@ static int garmin_write (struct usb_serial_port *port,
1226} 1220}
1227 1221
1228 1222
1229static int garmin_write_room (struct usb_serial_port *port) 1223static int garmin_write_room(struct tty_struct *tty)
1230{ 1224{
1225 struct usb_serial_port *port = tty->driver_data;
1231 /* 1226 /*
1232 * Report back the bytes currently available in the output buffer. 1227 * Report back the bytes currently available in the output buffer.
1233 */ 1228 */
1234 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1229 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1235 return GPS_OUT_BUFSIZ-garmin_data_p->outsize; 1230 return GPS_OUT_BUFSIZ-garmin_data_p->outsize;
1236} 1231}
1237 1232
1238 1233
1239static int garmin_chars_in_buffer (struct usb_serial_port *port) 1234static void garmin_read_process(struct garmin_data *garmin_data_p,
1240{
1241 /*
1242 * Report back the number of bytes currently in our input buffer.
1243 * Will this lock up the driver - the buffer contains an incomplete
1244 * package which will not be written to the device until it
1245 * has been completed ?
1246 */
1247 //struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1248 //return garmin_data_p->insize;
1249 return 0;
1250}
1251
1252
1253static void garmin_read_process(struct garmin_data * garmin_data_p,
1254 unsigned char *data, unsigned data_length) 1235 unsigned char *data, unsigned data_length)
1255{ 1236{
1256 if (garmin_data_p->flags & FLAGS_DROP_DATA) { 1237 if (garmin_data_p->flags & FLAGS_DROP_DATA) {
1257 /* abort-transfer cmd is actice */ 1238 /* abort-transfer cmd is actice */
1258 dbg("%s - pkt dropped", __func__); 1239 dbg("%s - pkt dropped", __func__);
1259 } else if (garmin_data_p->state != STATE_DISCONNECTED && 1240 } else if (garmin_data_p->state != STATE_DISCONNECTED &&
1260 garmin_data_p->state != STATE_RESET ) { 1241 garmin_data_p->state != STATE_RESET) {
1261 1242
1262 /* remember any appl.layer packets, so we know 1243 /* remember any appl.layer packets, so we know
1263 if a reset is required or not when closing 1244 if a reset is required or not when closing
1264 the device */ 1245 the device */
1265 if (0 == memcmp(data, GARMIN_APP_LAYER_REPLY, 1246 if (0 == memcmp(data, GARMIN_APP_LAYER_REPLY,
1266 sizeof(GARMIN_APP_LAYER_REPLY))) { 1247 sizeof(GARMIN_APP_LAYER_REPLY))) {
1267 atomic_inc(&garmin_data_p->resp_count); 1248 atomic_inc(&garmin_data_p->resp_count);
1268 } 1249 }
1269 1250
@@ -1273,9 +1254,8 @@ static void garmin_read_process(struct garmin_data * garmin_data_p,
1273 if (garmin_data_p->flags & FLAGS_QUEUING) { 1254 if (garmin_data_p->flags & FLAGS_QUEUING) {
1274 pkt_add(garmin_data_p, data, data_length); 1255 pkt_add(garmin_data_p, data, data_length);
1275 } else if (garmin_data_p->mode == MODE_GARMIN_SERIAL) { 1256 } else if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1276 if (getLayerId(data) == GARMIN_LAYERID_APPL) { 1257 if (getLayerId(data) == GARMIN_LAYERID_APPL)
1277 pkt_add(garmin_data_p, data, data_length); 1258 pkt_add(garmin_data_p, data, data_length);
1278 }
1279 } else { 1259 } else {
1280 send_to_tty(garmin_data_p->port, data, data_length); 1260 send_to_tty(garmin_data_p->port, data, data_length);
1281 } 1261 }
@@ -1283,12 +1263,12 @@ static void garmin_read_process(struct garmin_data * garmin_data_p,
1283} 1263}
1284 1264
1285 1265
1286static void garmin_read_bulk_callback (struct urb *urb) 1266static void garmin_read_bulk_callback(struct urb *urb)
1287{ 1267{
1288 unsigned long flags; 1268 unsigned long flags;
1289 struct usb_serial_port *port = urb->context; 1269 struct usb_serial_port *port = urb->context;
1290 struct usb_serial *serial = port->serial; 1270 struct usb_serial *serial = port->serial;
1291 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1271 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1292 unsigned char *data = urb->transfer_buffer; 1272 unsigned char *data = urb->transfer_buffer;
1293 int status = urb->status; 1273 int status = urb->status;
1294 int retval; 1274 int retval;
@@ -1306,7 +1286,7 @@ static void garmin_read_bulk_callback (struct urb *urb)
1306 return; 1286 return;
1307 } 1287 }
1308 1288
1309 usb_serial_debug_data(debug, &port->dev, 1289 usb_serial_debug_data(debug, &port->dev,
1310 __func__, urb->actual_length, data); 1290 __func__, urb->actual_length, data);
1311 1291
1312 garmin_read_process(garmin_data_p, data, urb->actual_length); 1292 garmin_read_process(garmin_data_p, data, urb->actual_length);
@@ -1340,13 +1320,13 @@ static void garmin_read_bulk_callback (struct urb *urb)
1340} 1320}
1341 1321
1342 1322
1343static void garmin_read_int_callback (struct urb *urb) 1323static void garmin_read_int_callback(struct urb *urb)
1344{ 1324{
1345 unsigned long flags; 1325 unsigned long flags;
1346 int retval; 1326 int retval;
1347 struct usb_serial_port *port = urb->context; 1327 struct usb_serial_port *port = urb->context;
1348 struct usb_serial *serial = port->serial; 1328 struct usb_serial *serial = port->serial;
1349 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1329 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1350 unsigned char *data = urb->transfer_buffer; 1330 unsigned char *data = urb->transfer_buffer;
1351 int status = urb->status; 1331 int status = urb->status;
1352 1332
@@ -1372,30 +1352,31 @@ static void garmin_read_int_callback (struct urb *urb)
1372 1352
1373 if (urb->actual_length == sizeof(GARMIN_BULK_IN_AVAIL_REPLY) && 1353 if (urb->actual_length == sizeof(GARMIN_BULK_IN_AVAIL_REPLY) &&
1374 0 == memcmp(data, GARMIN_BULK_IN_AVAIL_REPLY, 1354 0 == memcmp(data, GARMIN_BULK_IN_AVAIL_REPLY,
1375 sizeof(GARMIN_BULK_IN_AVAIL_REPLY))) { 1355 sizeof(GARMIN_BULK_IN_AVAIL_REPLY))) {
1376 1356
1377 dbg("%s - bulk data available.", __func__); 1357 dbg("%s - bulk data available.", __func__);
1378 1358
1379 if (0 == (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) { 1359 if (0 == (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) {
1380 1360
1381 /* bulk data available */ 1361 /* bulk data available */
1382 usb_fill_bulk_urb (port->read_urb, serial->dev, 1362 usb_fill_bulk_urb(port->read_urb, serial->dev,
1383 usb_rcvbulkpipe (serial->dev, 1363 usb_rcvbulkpipe(serial->dev,
1384 port->bulk_in_endpointAddress), 1364 port->bulk_in_endpointAddress),
1385 port->read_urb->transfer_buffer, 1365 port->read_urb->transfer_buffer,
1386 port->read_urb->transfer_buffer_length, 1366 port->read_urb->transfer_buffer_length,
1387 garmin_read_bulk_callback, port); 1367 garmin_read_bulk_callback, port);
1388 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC); 1368 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1389 if (retval) { 1369 if (retval) {
1390 dev_err(&port->dev, 1370 dev_err(&port->dev,
1391 "%s - failed submitting read urb, error %d\n", 1371 "%s - failed submitting read urb, error %d\n",
1392 __func__, retval); 1372 __func__, retval);
1393 } else { 1373 } else {
1394 spin_lock_irqsave(&garmin_data_p->lock, flags); 1374 spin_lock_irqsave(&garmin_data_p->lock, flags);
1395 garmin_data_p->flags |= FLAGS_BULK_IN_ACTIVE; 1375 garmin_data_p->flags |= FLAGS_BULK_IN_ACTIVE;
1396 /* do not send this packet to the user */ 1376 /* do not send this packet to the user */
1397 garmin_data_p->ignorePkts = 1; 1377 garmin_data_p->ignorePkts = 1;
1398 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 1378 spin_unlock_irqrestore(&garmin_data_p->lock,
1379 flags);
1399 } 1380 }
1400 } else { 1381 } else {
1401 /* bulk-in transfer still active */ 1382 /* bulk-in transfer still active */
@@ -1406,15 +1387,15 @@ static void garmin_read_int_callback (struct urb *urb)
1406 1387
1407 } else if (urb->actual_length == (4+sizeof(GARMIN_START_SESSION_REPLY)) 1388 } else if (urb->actual_length == (4+sizeof(GARMIN_START_SESSION_REPLY))
1408 && 0 == memcmp(data, GARMIN_START_SESSION_REPLY, 1389 && 0 == memcmp(data, GARMIN_START_SESSION_REPLY,
1409 sizeof(GARMIN_START_SESSION_REPLY))) { 1390 sizeof(GARMIN_START_SESSION_REPLY))) {
1410 1391
1411 spin_lock_irqsave(&garmin_data_p->lock, flags); 1392 spin_lock_irqsave(&garmin_data_p->lock, flags);
1412 garmin_data_p->flags |= FLAGS_SESSION_REPLY1_SEEN; 1393 garmin_data_p->flags |= FLAGS_SESSION_REPLY1_SEEN;
1413 spin_unlock_irqrestore(&garmin_data_p->lock, flags); 1394 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1414 1395
1415 /* save the serial number */ 1396 /* save the serial number */
1416 garmin_data_p->serial_num 1397 garmin_data_p->serial_num = __le32_to_cpup(
1417 = __le32_to_cpup((__le32*)(data+GARMIN_PKTHDR_LENGTH)); 1398 (__le32 *)(data+GARMIN_PKTHDR_LENGTH));
1418 1399
1419 dbg("%s - start-of-session reply seen - serial %u.", 1400 dbg("%s - start-of-session reply seen - serial %u.",
1420 __func__, garmin_data_p->serial_num); 1401 __func__, garmin_data_p->serial_num);
@@ -1433,7 +1414,7 @@ static void garmin_read_int_callback (struct urb *urb)
1433 } 1414 }
1434 1415
1435 port->interrupt_in_urb->dev = port->serial->dev; 1416 port->interrupt_in_urb->dev = port->serial->dev;
1436 retval = usb_submit_urb (urb, GFP_ATOMIC); 1417 retval = usb_submit_urb(urb, GFP_ATOMIC);
1437 if (retval) 1418 if (retval)
1438 dev_err(&urb->dev->dev, 1419 dev_err(&urb->dev->dev,
1439 "%s - Error %d submitting interrupt urb\n", 1420 "%s - Error %d submitting interrupt urb\n",
@@ -1446,7 +1427,7 @@ static void garmin_read_int_callback (struct urb *urb)
1446 * and then sets a timer to call itself again until all queued data 1427 * and then sets a timer to call itself again until all queued data
1447 * is sent. 1428 * is sent.
1448 */ 1429 */
1449static int garmin_flush_queue(struct garmin_data * garmin_data_p) 1430static int garmin_flush_queue(struct garmin_data *garmin_data_p)
1450{ 1431{
1451 unsigned long flags; 1432 unsigned long flags;
1452 struct garmin_packet *pkt; 1433 struct garmin_packet *pkt;
@@ -1468,10 +1449,11 @@ static int garmin_flush_queue(struct garmin_data * garmin_data_p)
1468} 1449}
1469 1450
1470 1451
1471static void garmin_throttle (struct usb_serial_port *port) 1452static void garmin_throttle(struct tty_struct *tty)
1472{ 1453{
1454 struct usb_serial_port *port = tty->driver_data;
1455 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1473 unsigned long flags; 1456 unsigned long flags;
1474 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1475 1457
1476 dbg("%s - port %d", __func__, port->number); 1458 dbg("%s - port %d", __func__, port->number);
1477 /* set flag, data received will be put into a queue 1459 /* set flag, data received will be put into a queue
@@ -1482,10 +1464,11 @@ static void garmin_throttle (struct usb_serial_port *port)
1482} 1464}
1483 1465
1484 1466
1485static void garmin_unthrottle (struct usb_serial_port *port) 1467static void garmin_unthrottle(struct tty_struct *tty)
1486{ 1468{
1469 struct usb_serial_port *port = tty->driver_data;
1470 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1487 unsigned long flags; 1471 unsigned long flags;
1488 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1489 int status; 1472 int status;
1490 1473
1491 dbg("%s - port %d", __func__, port->number); 1474 dbg("%s - port %d", __func__, port->number);
@@ -1507,8 +1490,6 @@ static void garmin_unthrottle (struct usb_serial_port *port)
1507 } 1490 }
1508} 1491}
1509 1492
1510
1511
1512/* 1493/*
1513 * The timer is currently only used to send queued packets to 1494 * The timer is currently only used to send queued packets to
1514 * the tty in cases where the protocol provides no own handshaking 1495 * the tty in cases where the protocol provides no own handshaking
@@ -1526,11 +1507,11 @@ static void timeout_handler(unsigned long data)
1526 1507
1527 1508
1528 1509
1529static int garmin_attach (struct usb_serial *serial) 1510static int garmin_attach(struct usb_serial *serial)
1530{ 1511{
1531 int status = 0; 1512 int status = 0;
1532 struct usb_serial_port *port = serial->port[0]; 1513 struct usb_serial_port *port = serial->port[0];
1533 struct garmin_data * garmin_data_p = NULL; 1514 struct garmin_data *garmin_data_p = NULL;
1534 1515
1535 dbg("%s", __func__); 1516 dbg("%s", __func__);
1536 1517
@@ -1542,7 +1523,7 @@ static int garmin_attach (struct usb_serial *serial)
1542 init_timer(&garmin_data_p->timer); 1523 init_timer(&garmin_data_p->timer);
1543 spin_lock_init(&garmin_data_p->lock); 1524 spin_lock_init(&garmin_data_p->lock);
1544 INIT_LIST_HEAD(&garmin_data_p->pktlist); 1525 INIT_LIST_HEAD(&garmin_data_p->pktlist);
1545 //garmin_data_p->timer.expires = jiffies + session_timeout; 1526 /* garmin_data_p->timer.expires = jiffies + session_timeout; */
1546 garmin_data_p->timer.data = (unsigned long)garmin_data_p; 1527 garmin_data_p->timer.data = (unsigned long)garmin_data_p;
1547 garmin_data_p->timer.function = timeout_handler; 1528 garmin_data_p->timer.function = timeout_handler;
1548 garmin_data_p->port = port; 1529 garmin_data_p->port = port;
@@ -1556,16 +1537,16 @@ static int garmin_attach (struct usb_serial *serial)
1556} 1537}
1557 1538
1558 1539
1559static void garmin_shutdown (struct usb_serial *serial) 1540static void garmin_shutdown(struct usb_serial *serial)
1560{ 1541{
1561 struct usb_serial_port *port = serial->port[0]; 1542 struct usb_serial_port *port = serial->port[0];
1562 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port); 1543 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1563 1544
1564 dbg("%s", __func__); 1545 dbg("%s", __func__);
1565 1546
1566 usb_kill_urb (port->interrupt_in_urb); 1547 usb_kill_urb(port->interrupt_in_urb);
1567 del_timer_sync(&garmin_data_p->timer); 1548 del_timer_sync(&garmin_data_p->timer);
1568 kfree (garmin_data_p); 1549 kfree(garmin_data_p);
1569 usb_set_serial_port_data(port, NULL); 1550 usb_set_serial_port_data(port, NULL);
1570} 1551}
1571 1552
@@ -1588,7 +1569,6 @@ static struct usb_serial_driver garmin_device = {
1588 .shutdown = garmin_shutdown, 1569 .shutdown = garmin_shutdown,
1589 .write = garmin_write, 1570 .write = garmin_write,
1590 .write_room = garmin_write_room, 1571 .write_room = garmin_write_room,
1591 .chars_in_buffer = garmin_chars_in_buffer,
1592 .write_bulk_callback = garmin_write_bulk_callback, 1572 .write_bulk_callback = garmin_write_bulk_callback,
1593 .read_bulk_callback = garmin_read_bulk_callback, 1573 .read_bulk_callback = garmin_read_bulk_callback,
1594 .read_int_callback = garmin_read_int_callback, 1574 .read_int_callback = garmin_read_int_callback,
@@ -1596,7 +1576,7 @@ static struct usb_serial_driver garmin_device = {
1596 1576
1597 1577
1598 1578
1599static int __init garmin_init (void) 1579static int __init garmin_init(void)
1600{ 1580{
1601 int retval; 1581 int retval;
1602 1582
@@ -1616,10 +1596,10 @@ failed_garmin_register:
1616} 1596}
1617 1597
1618 1598
1619static void __exit garmin_exit (void) 1599static void __exit garmin_exit(void)
1620{ 1600{
1621 usb_deregister (&garmin_driver); 1601 usb_deregister(&garmin_driver);
1622 usb_serial_deregister (&garmin_device); 1602 usb_serial_deregister(&garmin_device);
1623} 1603}
1624 1604
1625 1605
@@ -1628,8 +1608,8 @@ static void __exit garmin_exit (void)
1628module_init(garmin_init); 1608module_init(garmin_init);
1629module_exit(garmin_exit); 1609module_exit(garmin_exit);
1630 1610
1631MODULE_AUTHOR( DRIVER_AUTHOR ); 1611MODULE_AUTHOR(DRIVER_AUTHOR);
1632MODULE_DESCRIPTION( DRIVER_DESC ); 1612MODULE_DESCRIPTION(DRIVER_DESC);
1633MODULE_LICENSE("GPL"); 1613MODULE_LICENSE("GPL");
1634 1614
1635module_param(debug, bool, S_IWUSR | S_IRUGO); 1615module_param(debug, bool, S_IWUSR | S_IRUGO);
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
index 537f12a027c2..fe84c88ec20c 100644
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -18,7 +18,7 @@
18#include <linux/moduleparam.h> 18#include <linux/moduleparam.h>
19#include <linux/usb.h> 19#include <linux/usb.h>
20#include <linux/usb/serial.h> 20#include <linux/usb/serial.h>
21#include <asm/uaccess.h> 21#include <linux/uaccess.h>
22 22
23 23
24static int debug; 24static int debug;
@@ -81,7 +81,7 @@ static int generic_probe(struct usb_interface *interface,
81} 81}
82#endif 82#endif
83 83
84int usb_serial_generic_register (int _debug) 84int usb_serial_generic_register(int _debug)
85{ 85{
86 int retval = 0; 86 int retval = 0;
87 87
@@ -89,10 +89,11 @@ int usb_serial_generic_register (int _debug)
89#ifdef CONFIG_USB_SERIAL_GENERIC 89#ifdef CONFIG_USB_SERIAL_GENERIC
90 generic_device_ids[0].idVendor = vendor; 90 generic_device_ids[0].idVendor = vendor;
91 generic_device_ids[0].idProduct = product; 91 generic_device_ids[0].idProduct = product;
92 generic_device_ids[0].match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT; 92 generic_device_ids[0].match_flags =
93 USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
93 94
94 /* register our generic driver with ourselves */ 95 /* register our generic driver with ourselves */
95 retval = usb_serial_register (&usb_serial_generic_device); 96 retval = usb_serial_register(&usb_serial_generic_device);
96 if (retval) 97 if (retval)
97 goto exit; 98 goto exit;
98 retval = usb_register(&generic_driver); 99 retval = usb_register(&generic_driver);
@@ -103,16 +104,17 @@ exit:
103 return retval; 104 return retval;
104} 105}
105 106
106void usb_serial_generic_deregister (void) 107void usb_serial_generic_deregister(void)
107{ 108{
108#ifdef CONFIG_USB_SERIAL_GENERIC 109#ifdef CONFIG_USB_SERIAL_GENERIC
109 /* remove our generic driver */ 110 /* remove our generic driver */
110 usb_deregister(&generic_driver); 111 usb_deregister(&generic_driver);
111 usb_serial_deregister (&usb_serial_generic_device); 112 usb_serial_deregister(&usb_serial_generic_device);
112#endif 113#endif
113} 114}
114 115
115int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp) 116int usb_serial_generic_open(struct tty_struct *tty,
117 struct usb_serial_port *port, struct file *filp)
116{ 118{
117 struct usb_serial *serial = port->serial; 119 struct usb_serial *serial = port->serial;
118 int result = 0; 120 int result = 0;
@@ -120,11 +122,11 @@ int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp)
120 122
121 dbg("%s - port %d", __func__, port->number); 123 dbg("%s - port %d", __func__, port->number);
122 124
123 /* force low_latency on so that our tty_push actually forces the data through, 125 /* force low_latency on so that our tty_push actually forces the data
124 otherwise it is scheduled, and with high data rates (like with OHCI) data 126 through, otherwise it is scheduled, and with high data rates (like
125 can get lost. */ 127 with OHCI) data can get lost. */
126 if (port->tty) 128 if (tty)
127 port->tty->low_latency = 1; 129 tty->low_latency = 1;
128 130
129 /* clear the throttle flags */ 131 /* clear the throttle flags */
130 spin_lock_irqsave(&port->lock, flags); 132 spin_lock_irqsave(&port->lock, flags);
@@ -135,8 +137,9 @@ int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp)
135 /* if we have a bulk endpoint, start reading from it */ 137 /* if we have a bulk endpoint, start reading from it */
136 if (serial->num_bulk_in) { 138 if (serial->num_bulk_in) {
137 /* Start reading from the device */ 139 /* Start reading from the device */
138 usb_fill_bulk_urb (port->read_urb, serial->dev, 140 usb_fill_bulk_urb(port->read_urb, serial->dev,
139 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), 141 usb_rcvbulkpipe(serial->dev,
142 port->bulk_in_endpointAddress),
140 port->read_urb->transfer_buffer, 143 port->read_urb->transfer_buffer,
141 port->read_urb->transfer_buffer_length, 144 port->read_urb->transfer_buffer_length,
142 ((serial->type->read_bulk_callback) ? 145 ((serial->type->read_bulk_callback) ?
@@ -145,14 +148,16 @@ int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp)
145 port); 148 port);
146 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 149 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
147 if (result) 150 if (result)
148 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 151 dev_err(&port->dev,
152 "%s - failed resubmitting read urb, error %d\n",
153 __func__, result);
149 } 154 }
150 155
151 return result; 156 return result;
152} 157}
153EXPORT_SYMBOL_GPL(usb_serial_generic_open); 158EXPORT_SYMBOL_GPL(usb_serial_generic_open);
154 159
155static void generic_cleanup (struct usb_serial_port *port) 160static void generic_cleanup(struct usb_serial_port *port)
156{ 161{
157 struct usb_serial *serial = port->serial; 162 struct usb_serial *serial = port->serial;
158 163
@@ -182,7 +187,7 @@ int usb_serial_generic_resume(struct usb_serial *serial)
182#endif 187#endif
183 for (i = 0; i < serial->num_ports; i++) { 188 for (i = 0; i < serial->num_ports; i++) {
184 port = serial->port[i]; 189 port = serial->port[i];
185 if (port->open_count && port->read_urb) { 190 if (port->port.count && port->read_urb) {
186 r = usb_submit_urb(port->read_urb, GFP_NOIO); 191 r = usb_submit_urb(port->read_urb, GFP_NOIO);
187 if (r < 0) 192 if (r < 0)
188 c++; 193 c++;
@@ -192,13 +197,15 @@ int usb_serial_generic_resume(struct usb_serial *serial)
192 return c ? -EIO : 0; 197 return c ? -EIO : 0;
193} 198}
194 199
195void usb_serial_generic_close (struct usb_serial_port *port, struct file * filp) 200void usb_serial_generic_close(struct tty_struct *tty,
201 struct usb_serial_port *port, struct file *filp)
196{ 202{
197 dbg("%s - port %d", __func__, port->number); 203 dbg("%s - port %d", __func__, port->number);
198 generic_cleanup (port); 204 generic_cleanup(port);
199} 205}
200 206
201int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *buf, int count) 207int usb_serial_generic_write(struct tty_struct *tty,
208 struct usb_serial_port *port, const unsigned char *buf, int count)
202{ 209{
203 struct usb_serial *serial = port->serial; 210 struct usb_serial *serial = port->serial;
204 int result; 211 int result;
@@ -208,7 +215,7 @@ int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *
208 215
209 if (count == 0) { 216 if (count == 0) {
210 dbg("%s - write request of 0 bytes", __func__); 217 dbg("%s - write request of 0 bytes", __func__);
211 return (0); 218 return 0;
212 } 219 }
213 220
214 /* only do something if we have a bulk out endpoint */ 221 /* only do something if we have a bulk out endpoint */
@@ -223,27 +230,32 @@ int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *
223 port->write_urb_busy = 1; 230 port->write_urb_busy = 1;
224 spin_unlock_irqrestore(&port->lock, flags); 231 spin_unlock_irqrestore(&port->lock, flags);
225 232
226 count = (count > port->bulk_out_size) ? port->bulk_out_size : count; 233 count = (count > port->bulk_out_size) ?
234 port->bulk_out_size : count;
227 235
228 memcpy (port->write_urb->transfer_buffer, buf, count); 236 memcpy(port->write_urb->transfer_buffer, buf, count);
229 data = port->write_urb->transfer_buffer; 237 data = port->write_urb->transfer_buffer;
230 usb_serial_debug_data(debug, &port->dev, __func__, count, data); 238 usb_serial_debug_data(debug, &port->dev, __func__, count, data);
231 239
232 /* set up our urb */ 240 /* set up our urb */
233 usb_fill_bulk_urb (port->write_urb, serial->dev, 241 usb_fill_bulk_urb(port->write_urb, serial->dev,
234 usb_sndbulkpipe (serial->dev, 242 usb_sndbulkpipe(serial->dev,
235 port->bulk_out_endpointAddress), 243 port->bulk_out_endpointAddress),
236 port->write_urb->transfer_buffer, count, 244 port->write_urb->transfer_buffer, count,
237 ((serial->type->write_bulk_callback) ? 245 ((serial->type->write_bulk_callback) ?
238 serial->type->write_bulk_callback : 246 serial->type->write_bulk_callback :
239 usb_serial_generic_write_bulk_callback), port); 247 usb_serial_generic_write_bulk_callback),
248 port);
240 249
241 /* send the data out the bulk port */ 250 /* send the data out the bulk port */
242 port->write_urb_busy = 1; 251 port->write_urb_busy = 1;
243 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 252 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
244 if (result) { 253 if (result) {
245 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result); 254 dev_err(&port->dev,
246 /* don't have to grab the lock here, as we will retry if != 0 */ 255 "%s - failed submitting write urb, error %d\n",
256 __func__, result);
257 /* don't have to grab the lock here, as we will
258 retry if != 0 */
247 port->write_urb_busy = 0; 259 port->write_urb_busy = 0;
248 } else 260 } else
249 result = count; 261 result = count;
@@ -255,8 +267,9 @@ int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *
255 return 0; 267 return 0;
256} 268}
257 269
258int usb_serial_generic_write_room (struct usb_serial_port *port) 270int usb_serial_generic_write_room(struct tty_struct *tty)
259{ 271{
272 struct usb_serial_port *port = tty->driver_data;
260 struct usb_serial *serial = port->serial; 273 struct usb_serial *serial = port->serial;
261 int room = 0; 274 int room = 0;
262 275
@@ -272,8 +285,9 @@ int usb_serial_generic_write_room (struct usb_serial_port *port)
272 return room; 285 return room;
273} 286}
274 287
275int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port) 288int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)
276{ 289{
290 struct usb_serial_port *port = tty->driver_data;
277 struct usb_serial *serial = port->serial; 291 struct usb_serial *serial = port->serial;
278 int chars = 0; 292 int chars = 0;
279 293
@@ -286,7 +300,7 @@ int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port)
286 } 300 }
287 301
288 dbg("%s - returns %d", __func__, chars); 302 dbg("%s - returns %d", __func__, chars);
289 return (chars); 303 return chars;
290} 304}
291 305
292 306
@@ -297,24 +311,26 @@ static void resubmit_read_urb(struct usb_serial_port *port, gfp_t mem_flags)
297 int result; 311 int result;
298 312
299 /* Continue reading from device */ 313 /* Continue reading from device */
300 usb_fill_bulk_urb (urb, serial->dev, 314 usb_fill_bulk_urb(urb, serial->dev,
301 usb_rcvbulkpipe (serial->dev, 315 usb_rcvbulkpipe(serial->dev,
302 port->bulk_in_endpointAddress), 316 port->bulk_in_endpointAddress),
303 urb->transfer_buffer, 317 urb->transfer_buffer,
304 urb->transfer_buffer_length, 318 urb->transfer_buffer_length,
305 ((serial->type->read_bulk_callback) ? 319 ((serial->type->read_bulk_callback) ?
306 serial->type->read_bulk_callback : 320 serial->type->read_bulk_callback :
307 usb_serial_generic_read_bulk_callback), port); 321 usb_serial_generic_read_bulk_callback), port);
308 result = usb_submit_urb(urb, mem_flags); 322 result = usb_submit_urb(urb, mem_flags);
309 if (result) 323 if (result)
310 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 324 dev_err(&port->dev,
325 "%s - failed resubmitting read urb, error %d\n",
326 __func__, result);
311} 327}
312 328
313/* Push data to tty layer and resubmit the bulk read URB */ 329/* Push data to tty layer and resubmit the bulk read URB */
314static void flush_and_resubmit_read_urb (struct usb_serial_port *port) 330static void flush_and_resubmit_read_urb(struct usb_serial_port *port)
315{ 331{
316 struct urb *urb = port->read_urb; 332 struct urb *urb = port->read_urb;
317 struct tty_struct *tty = port->tty; 333 struct tty_struct *tty = port->port.tty;
318 int room; 334 int room;
319 335
320 /* Push data to tty */ 336 /* Push data to tty */
@@ -329,7 +345,7 @@ static void flush_and_resubmit_read_urb (struct usb_serial_port *port)
329 resubmit_read_urb(port, GFP_ATOMIC); 345 resubmit_read_urb(port, GFP_ATOMIC);
330} 346}
331 347
332void usb_serial_generic_read_bulk_callback (struct urb *urb) 348void usb_serial_generic_read_bulk_callback(struct urb *urb)
333{ 349{
334 struct usb_serial_port *port = urb->context; 350 struct usb_serial_port *port = urb->context;
335 unsigned char *data = urb->transfer_buffer; 351 unsigned char *data = urb->transfer_buffer;
@@ -344,20 +360,21 @@ void usb_serial_generic_read_bulk_callback (struct urb *urb)
344 return; 360 return;
345 } 361 }
346 362
347 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 363 usb_serial_debug_data(debug, &port->dev, __func__,
364 urb->actual_length, data);
348 365
349 /* Throttle the device if requested by tty */ 366 /* Throttle the device if requested by tty */
350 spin_lock_irqsave(&port->lock, flags); 367 spin_lock_irqsave(&port->lock, flags);
351 if (!(port->throttled = port->throttle_req)) { 368 port->throttled = port->throttle_req;
369 if (!port->throttled) {
352 spin_unlock_irqrestore(&port->lock, flags); 370 spin_unlock_irqrestore(&port->lock, flags);
353 flush_and_resubmit_read_urb(port); 371 flush_and_resubmit_read_urb(port);
354 } else { 372 } else
355 spin_unlock_irqrestore(&port->lock, flags); 373 spin_unlock_irqrestore(&port->lock, flags);
356 }
357} 374}
358EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); 375EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback);
359 376
360void usb_serial_generic_write_bulk_callback (struct urb *urb) 377void usb_serial_generic_write_bulk_callback(struct urb *urb)
361{ 378{
362 struct usb_serial_port *port = urb->context; 379 struct usb_serial_port *port = urb->context;
363 int status = urb->status; 380 int status = urb->status;
@@ -374,8 +391,9 @@ void usb_serial_generic_write_bulk_callback (struct urb *urb)
374} 391}
375EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback); 392EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
376 393
377void usb_serial_generic_throttle (struct usb_serial_port *port) 394void usb_serial_generic_throttle(struct tty_struct *tty)
378{ 395{
396 struct usb_serial_port *port = tty->driver_data;
379 unsigned long flags; 397 unsigned long flags;
380 398
381 dbg("%s - port %d", __func__, port->number); 399 dbg("%s - port %d", __func__, port->number);
@@ -387,8 +405,9 @@ void usb_serial_generic_throttle (struct usb_serial_port *port)
387 spin_unlock_irqrestore(&port->lock, flags); 405 spin_unlock_irqrestore(&port->lock, flags);
388} 406}
389 407
390void usb_serial_generic_unthrottle (struct usb_serial_port *port) 408void usb_serial_generic_unthrottle(struct tty_struct *tty)
391{ 409{
410 struct usb_serial_port *port = tty->driver_data;
392 int was_throttled; 411 int was_throttled;
393 unsigned long flags; 412 unsigned long flags;
394 413
@@ -406,15 +425,14 @@ void usb_serial_generic_unthrottle (struct usb_serial_port *port)
406 } 425 }
407} 426}
408 427
409void usb_serial_generic_shutdown (struct usb_serial *serial) 428void usb_serial_generic_shutdown(struct usb_serial *serial)
410{ 429{
411 int i; 430 int i;
412 431
413 dbg("%s", __func__); 432 dbg("%s", __func__);
414 433
415 /* stop reads and writes on all ports */ 434 /* stop reads and writes on all ports */
416 for (i=0; i < serial->num_ports; ++i) { 435 for (i = 0; i < serial->num_ports; ++i)
417 generic_cleanup(serial->port[i]); 436 generic_cleanup(serial->port[i]);
418 }
419} 437}
420 438
diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c
index 75b88b356ebc..ab905869e959 100644
--- a/drivers/usb/serial/hp4x.c
+++ b/drivers/usb/serial/hp4x.c
@@ -9,7 +9,8 @@
9 * the Free Software Foundation; either version 2 of the License, or 9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version. 10 * (at your option) any later version.
11 * 11 *
12 * See Documentation/usb/usb-serial.txt for more information on using this driver 12 * See Documentation/usb/usb-serial.txt for more information on using this
13 * driver
13 */ 14 */
14 15
15#include <linux/kernel.h> 16#include <linux/kernel.h>
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index 2fd449bcfa35..bfa508ddb0fe 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -44,7 +44,7 @@
44#include <linux/wait.h> 44#include <linux/wait.h>
45#include <linux/firmware.h> 45#include <linux/firmware.h>
46#include <linux/ihex.h> 46#include <linux/ihex.h>
47#include <asm/uaccess.h> 47#include <linux/uaccess.h>
48#include <linux/usb.h> 48#include <linux/usb.h>
49#include <linux/usb/serial.h> 49#include <linux/usb/serial.h>
50#include "io_edgeport.h" 50#include "io_edgeport.h"
@@ -66,16 +66,16 @@
66 66
67/* receive port state */ 67/* receive port state */
68enum RXSTATE { 68enum RXSTATE {
69 EXPECT_HDR1 = 0, /* Expect header byte 1 */ 69 EXPECT_HDR1 = 0, /* Expect header byte 1 */
70 EXPECT_HDR2 = 1, /* Expect header byte 2 */ 70 EXPECT_HDR2 = 1, /* Expect header byte 2 */
71 EXPECT_DATA = 2, /* Expect 'RxBytesRemaining' data */ 71 EXPECT_DATA = 2, /* Expect 'RxBytesRemaining' data */
72 EXPECT_HDR3 = 3, /* Expect header byte 3 (for status hdrs only) */ 72 EXPECT_HDR3 = 3, /* Expect header byte 3 (for status hdrs only) */
73}; 73};
74 74
75 75
76/* Transmit Fifo 76/* Transmit Fifo
77 * This Transmit queue is an extension of the edgeport Rx buffer. 77 * This Transmit queue is an extension of the edgeport Rx buffer.
78 * The maximum amount of data buffered in both the edgeport 78 * The maximum amount of data buffered in both the edgeport
79 * Rx buffer (maxTxCredits) and this buffer will never exceed maxTxCredits. 79 * Rx buffer (maxTxCredits) and this buffer will never exceed maxTxCredits.
80 */ 80 */
81struct TxFifo { 81struct TxFifo {
@@ -132,12 +132,12 @@ struct edgeport_serial {
132 int is_epic; /* flag if EPiC device or not */ 132 int is_epic; /* flag if EPiC device or not */
133 133
134 __u8 interrupt_in_endpoint; /* the interrupt endpoint handle */ 134 __u8 interrupt_in_endpoint; /* the interrupt endpoint handle */
135 unsigned char * interrupt_in_buffer; /* the buffer we use for the interrupt endpoint */ 135 unsigned char *interrupt_in_buffer; /* the buffer we use for the interrupt endpoint */
136 struct urb * interrupt_read_urb; /* our interrupt urb */ 136 struct urb *interrupt_read_urb; /* our interrupt urb */
137 137
138 __u8 bulk_in_endpoint; /* the bulk in endpoint handle */ 138 __u8 bulk_in_endpoint; /* the bulk in endpoint handle */
139 unsigned char * bulk_in_buffer; /* the buffer we use for the bulk in endpoint */ 139 unsigned char *bulk_in_buffer; /* the buffer we use for the bulk in endpoint */
140 struct urb * read_urb; /* our bulk read urb */ 140 struct urb *read_urb; /* our bulk read urb */
141 bool read_in_progress; 141 bool read_in_progress;
142 spinlock_t es_lock; 142 spinlock_t es_lock;
143 143
@@ -162,16 +162,17 @@ struct divisor_table_entry {
162 __u16 Divisor; 162 __u16 Divisor;
163}; 163};
164 164
165// 165/*
166// Define table of divisors for Rev A EdgePort/4 hardware 166 * Define table of divisors for Rev A EdgePort/4 hardware
167// These assume a 3.6864MHz crystal, the standard /16, and 167 * These assume a 3.6864MHz crystal, the standard /16, and
168// MCR.7 = 0. 168 * MCR.7 = 0.
169// 169 */
170
170static const struct divisor_table_entry divisor_table[] = { 171static const struct divisor_table_entry divisor_table[] = {
171 { 50, 4608}, 172 { 50, 4608},
172 { 75, 3072}, 173 { 75, 3072},
173 { 110, 2095}, /* 2094.545455 => 230450 => .0217 % over */ 174 { 110, 2095}, /* 2094.545455 => 230450 => .0217 % over */
174 { 134, 1713}, /* 1713.011152 => 230398.5 => .00065% under */ 175 { 134, 1713}, /* 1713.011152 => 230398.5 => .00065% under */
175 { 150, 1536}, 176 { 150, 1536},
176 { 300, 768}, 177 { 300, 768},
177 { 600, 384}, 178 { 600, 384},
@@ -194,64 +195,86 @@ static int debug;
194 195
195static int low_latency = 1; /* tty low latency flag, on by default */ 196static int low_latency = 1; /* tty low latency flag, on by default */
196 197
197static atomic_t CmdUrbs; /* Number of outstanding Command Write Urbs */ 198static atomic_t CmdUrbs; /* Number of outstanding Command Write Urbs */
198 199
199 200
200/* local function prototypes */ 201/* local function prototypes */
201 202
202/* function prototypes for all URB callbacks */ 203/* function prototypes for all URB callbacks */
203static void edge_interrupt_callback (struct urb *urb); 204static void edge_interrupt_callback(struct urb *urb);
204static void edge_bulk_in_callback (struct urb *urb); 205static void edge_bulk_in_callback(struct urb *urb);
205static void edge_bulk_out_data_callback (struct urb *urb); 206static void edge_bulk_out_data_callback(struct urb *urb);
206static void edge_bulk_out_cmd_callback (struct urb *urb); 207static void edge_bulk_out_cmd_callback(struct urb *urb);
207 208
208/* function prototypes for the usbserial callbacks */ 209/* function prototypes for the usbserial callbacks */
209static int edge_open (struct usb_serial_port *port, struct file *filp); 210static int edge_open(struct tty_struct *tty, struct usb_serial_port *port,
210static void edge_close (struct usb_serial_port *port, struct file *filp); 211 struct file *filp);
211static int edge_write (struct usb_serial_port *port, const unsigned char *buf, int count); 212static void edge_close(struct tty_struct *tty, struct usb_serial_port *port,
212static int edge_write_room (struct usb_serial_port *port); 213 struct file *filp);
213static int edge_chars_in_buffer (struct usb_serial_port *port); 214static int edge_write(struct tty_struct *tty, struct usb_serial_port *port,
214static void edge_throttle (struct usb_serial_port *port); 215 const unsigned char *buf, int count);
215static void edge_unthrottle (struct usb_serial_port *port); 216static int edge_write_room(struct tty_struct *tty);
216static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); 217static int edge_chars_in_buffer(struct tty_struct *tty);
217static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg); 218static void edge_throttle(struct tty_struct *tty);
218static void edge_break (struct usb_serial_port *port, int break_state); 219static void edge_unthrottle(struct tty_struct *tty);
219static int edge_tiocmget (struct usb_serial_port *port, struct file *file); 220static void edge_set_termios(struct tty_struct *tty,
220static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); 221 struct usb_serial_port *port,
221static int edge_startup (struct usb_serial *serial); 222 struct ktermios *old_termios);
222static void edge_shutdown (struct usb_serial *serial); 223static int edge_ioctl(struct tty_struct *tty, struct file *file,
223 224 unsigned int cmd, unsigned long arg);
225static void edge_break(struct tty_struct *tty, int break_state);
226static int edge_tiocmget(struct tty_struct *tty, struct file *file);
227static int edge_tiocmset(struct tty_struct *tty, struct file *file,
228 unsigned int set, unsigned int clear);
229static int edge_startup(struct usb_serial *serial);
230static void edge_shutdown(struct usb_serial *serial);
224 231
225#include "io_tables.h" /* all of the devices that this driver supports */ 232#include "io_tables.h" /* all of the devices that this driver supports */
226 233
227/* function prototypes for all of our local functions */ 234/* function prototypes for all of our local functions */
228static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned char *buffer, __u16 bufferLength); 235
229static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2, __u8 byte3); 236static void process_rcvd_data(struct edgeport_serial *edge_serial,
230static void edge_tty_recv (struct device *dev, struct tty_struct *tty, unsigned char *data, int length); 237 unsigned char *buffer, __u16 bufferLength);
231static void handle_new_msr (struct edgeport_port *edge_port, __u8 newMsr); 238static void process_rcvd_status(struct edgeport_serial *edge_serial,
232static void handle_new_lsr (struct edgeport_port *edge_port, __u8 lsrData, __u8 lsr, __u8 data); 239 __u8 byte2, __u8 byte3);
233static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u8 param); 240static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
234static int calc_baud_rate_divisor (int baud_rate, int *divisor); 241 unsigned char *data, int length);
235static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRate); 242static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr);
236static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios); 243static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
237static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 regNum, __u8 regValue); 244 __u8 lsr, __u8 data);
238static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer, int writeLength); 245static int send_iosp_ext_cmd(struct edgeport_port *edge_port, __u8 command,
239static void send_more_port_data (struct edgeport_serial *edge_serial, struct edgeport_port *edge_port); 246 __u8 param);
240 247static int calc_baud_rate_divisor(int baud_rate, int *divisor);
241static int sram_write (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, const __u8 *data); 248static int send_cmd_write_baud_rate(struct edgeport_port *edge_port,
242static int rom_read (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data); 249 int baudRate);
243static int rom_write (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, const __u8 *data); 250static void change_port_settings(struct tty_struct *tty,
244static void get_manufacturing_desc (struct edgeport_serial *edge_serial); 251 struct edgeport_port *edge_port,
245static void get_boot_desc (struct edgeport_serial *edge_serial); 252 struct ktermios *old_termios);
246static void load_application_firmware (struct edgeport_serial *edge_serial); 253static int send_cmd_write_uart_register(struct edgeport_port *edge_port,
247 254 __u8 regNum, __u8 regValue);
248static void unicode_to_ascii(char *string, int buflen, __le16 *unicode, int unicode_size); 255static int write_cmd_usb(struct edgeport_port *edge_port,
249 256 unsigned char *buffer, int writeLength);
250 257static void send_more_port_data(struct edgeport_serial *edge_serial,
251// ************************************************************************ 258 struct edgeport_port *edge_port);
252// ************************************************************************ 259
253// ************************************************************************ 260static int sram_write(struct usb_serial *serial, __u16 extAddr, __u16 addr,
254// ************************************************************************ 261 __u16 length, const __u8 *data);
262static int rom_read(struct usb_serial *serial, __u16 extAddr, __u16 addr,
263 __u16 length, __u8 *data);
264static int rom_write(struct usb_serial *serial, __u16 extAddr, __u16 addr,
265 __u16 length, const __u8 *data);
266static void get_manufacturing_desc(struct edgeport_serial *edge_serial);
267static void get_boot_desc(struct edgeport_serial *edge_serial);
268static void load_application_firmware(struct edgeport_serial *edge_serial);
269
270static void unicode_to_ascii(char *string, int buflen,
271 __le16 *unicode, int unicode_size);
272
273
274/* ************************************************************************ */
275/* ************************************************************************ */
276/* ************************************************************************ */
277/* ************************************************************************ */
255 278
256/************************************************************************ 279/************************************************************************
257 * * 280 * *
@@ -261,7 +284,7 @@ static void unicode_to_ascii(char *string, int buflen, __le16 *unicode, int unic
261 * embedded in this driver * 284 * embedded in this driver *
262 * * 285 * *
263 ************************************************************************/ 286 ************************************************************************/
264static void update_edgeport_E2PROM (struct edgeport_serial *edge_serial) 287static void update_edgeport_E2PROM(struct edgeport_serial *edge_serial)
265{ 288{
266 __u32 BootCurVer; 289 __u32 BootCurVer;
267 __u32 BootNewVer; 290 __u32 BootNewVer;
@@ -275,16 +298,14 @@ static void update_edgeport_E2PROM (struct edgeport_serial *edge_serial)
275 int response; 298 int response;
276 299
277 switch (edge_serial->product_info.iDownloadFile) { 300 switch (edge_serial->product_info.iDownloadFile) {
278 case EDGE_DOWNLOAD_FILE_I930: 301 case EDGE_DOWNLOAD_FILE_I930:
279 fw_name = "edgeport/boot.fw"; 302 fw_name = "edgeport/boot.fw";
280 break; 303 break;
281 304 case EDGE_DOWNLOAD_FILE_80251:
282 case EDGE_DOWNLOAD_FILE_80251: 305 fw_name = "edgeport/boot2.fw";
283 fw_name = "edgeport/boot2.fw"; 306 break;
284 break; 307 default:
285 308 return;
286 default:
287 return;
288 } 309 }
289 310
290 response = request_ihex_firmware(&fw, fw_name, 311 response = request_ihex_firmware(&fw, fw_name,
@@ -300,7 +321,7 @@ static void update_edgeport_E2PROM (struct edgeport_serial *edge_serial)
300 BootMinorVersion = rec->data[1]; 321 BootMinorVersion = rec->data[1];
301 BootBuildNumber = (rec->data[2] << 8) | rec->data[3]; 322 BootBuildNumber = (rec->data[2] << 8) | rec->data[3];
302 323
303 // Check Boot Image Version 324 /* Check Boot Image Version */
304 BootCurVer = (edge_serial->boot_descriptor.MajorVersion << 24) + 325 BootCurVer = (edge_serial->boot_descriptor.MajorVersion << 24) +
305 (edge_serial->boot_descriptor.MinorVersion << 16) + 326 (edge_serial->boot_descriptor.MinorVersion << 16) +
306 le16_to_cpu(edge_serial->boot_descriptor.BuildNumber); 327 le16_to_cpu(edge_serial->boot_descriptor.BuildNumber);
@@ -352,29 +373,29 @@ static void update_edgeport_E2PROM (struct edgeport_serial *edge_serial)
352 * Get string descriptor from device * 373 * Get string descriptor from device *
353 * * 374 * *
354 ************************************************************************/ 375 ************************************************************************/
355static int get_string (struct usb_device *dev, int Id, char *string, int buflen) 376static int get_string(struct usb_device *dev, int Id, char *string, int buflen)
356{ 377{
357 struct usb_string_descriptor StringDesc; 378 struct usb_string_descriptor StringDesc;
358 struct usb_string_descriptor *pStringDesc; 379 struct usb_string_descriptor *pStringDesc;
359 380
360 dbg("%s - USB String ID = %d", __func__, Id ); 381 dbg("%s - USB String ID = %d", __func__, Id);
361 382
362 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, &StringDesc, sizeof(StringDesc))) { 383 if (!usb_get_descriptor(dev, USB_DT_STRING, Id,
384 &StringDesc, sizeof(StringDesc)))
363 return 0; 385 return 0;
364 }
365 386
366 pStringDesc = kmalloc (StringDesc.bLength, GFP_KERNEL); 387 pStringDesc = kmalloc(StringDesc.bLength, GFP_KERNEL);
367 388 if (!pStringDesc)
368 if (!pStringDesc) {
369 return 0; 389 return 0;
370 }
371 390
372 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, pStringDesc, StringDesc.bLength )) { 391 if (!usb_get_descriptor(dev, USB_DT_STRING, Id,
392 pStringDesc, StringDesc.bLength)) {
373 kfree(pStringDesc); 393 kfree(pStringDesc);
374 return 0; 394 return 0;
375 } 395 }
376 396
377 unicode_to_ascii(string, buflen, pStringDesc->wData, pStringDesc->bLength/2); 397 unicode_to_ascii(string, buflen,
398 pStringDesc->wData, pStringDesc->bLength/2);
378 399
379 kfree(pStringDesc); 400 kfree(pStringDesc);
380 dbg("%s - USB String %s", __func__, string); 401 dbg("%s - USB String %s", __func__, string);
@@ -388,24 +409,24 @@ static int get_string (struct usb_device *dev, int Id, char *string, int buflen)
388 * Get string descriptor from device 409 * Get string descriptor from device
389 * 410 *
390 ************************************************************************/ 411 ************************************************************************/
391static int get_string_desc (struct usb_device *dev, int Id, struct usb_string_descriptor **pRetDesc) 412static int get_string_desc(struct usb_device *dev, int Id,
413 struct usb_string_descriptor **pRetDesc)
392{ 414{
393 struct usb_string_descriptor StringDesc; 415 struct usb_string_descriptor StringDesc;
394 struct usb_string_descriptor *pStringDesc; 416 struct usb_string_descriptor *pStringDesc;
395 417
396 dbg("%s - USB String ID = %d", __func__, Id ); 418 dbg("%s - USB String ID = %d", __func__, Id);
397 419
398 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, &StringDesc, sizeof(StringDesc))) { 420 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, &StringDesc,
421 sizeof(StringDesc)))
399 return 0; 422 return 0;
400 }
401 423
402 pStringDesc = kmalloc (StringDesc.bLength, GFP_KERNEL); 424 pStringDesc = kmalloc(StringDesc.bLength, GFP_KERNEL);
403 425 if (!pStringDesc)
404 if (!pStringDesc) {
405 return -1; 426 return -1;
406 }
407 427
408 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, pStringDesc, StringDesc.bLength )) { 428 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, pStringDesc,
429 StringDesc.bLength)) {
409 kfree(pStringDesc); 430 kfree(pStringDesc);
410 return -1; 431 return -1;
411 } 432 }
@@ -417,25 +438,30 @@ static int get_string_desc (struct usb_device *dev, int Id, struct usb_string_de
417 438
418static void dump_product_info(struct edgeport_product_info *product_info) 439static void dump_product_info(struct edgeport_product_info *product_info)
419{ 440{
420 // Dump Product Info structure 441 /* Dump Product Info structure */
421 dbg("**Product Information:"); 442 dbg("**Product Information:");
422 dbg(" ProductId %x", product_info->ProductId ); 443 dbg(" ProductId %x", product_info->ProductId);
423 dbg(" NumPorts %d", product_info->NumPorts ); 444 dbg(" NumPorts %d", product_info->NumPorts);
424 dbg(" ProdInfoVer %d", product_info->ProdInfoVer ); 445 dbg(" ProdInfoVer %d", product_info->ProdInfoVer);
425 dbg(" IsServer %d", product_info->IsServer); 446 dbg(" IsServer %d", product_info->IsServer);
426 dbg(" IsRS232 %d", product_info->IsRS232 ); 447 dbg(" IsRS232 %d", product_info->IsRS232);
427 dbg(" IsRS422 %d", product_info->IsRS422 ); 448 dbg(" IsRS422 %d", product_info->IsRS422);
428 dbg(" IsRS485 %d", product_info->IsRS485 ); 449 dbg(" IsRS485 %d", product_info->IsRS485);
429 dbg(" RomSize %d", product_info->RomSize ); 450 dbg(" RomSize %d", product_info->RomSize);
430 dbg(" RamSize %d", product_info->RamSize ); 451 dbg(" RamSize %d", product_info->RamSize);
431 dbg(" CpuRev %x", product_info->CpuRev ); 452 dbg(" CpuRev %x", product_info->CpuRev);
432 dbg(" BoardRev %x", product_info->BoardRev); 453 dbg(" BoardRev %x", product_info->BoardRev);
433 dbg(" BootMajorVersion %d.%d.%d", product_info->BootMajorVersion, 454 dbg(" BootMajorVersion %d.%d.%d", product_info->BootMajorVersion,
434 product_info->BootMinorVersion, 455 product_info->BootMinorVersion,
435 le16_to_cpu(product_info->BootBuildNumber)); 456 le16_to_cpu(product_info->BootBuildNumber));
436 dbg(" ManufactureDescDate %d/%d/%d", product_info->ManufactureDescDate[0], 457 dbg(" FirmwareMajorVersion %d.%d.%d",
437 product_info->ManufactureDescDate[1], 458 product_info->FirmwareMajorVersion,
438 product_info->ManufactureDescDate[2]+1900); 459 product_info->FirmwareMinorVersion,
460 le16_to_cpu(product_info->FirmwareBuildNumber));
461 dbg(" ManufactureDescDate %d/%d/%d",
462 product_info->ManufactureDescDate[0],
463 product_info->ManufactureDescDate[1],
464 product_info->ManufactureDescDate[2]+1900);
439 dbg(" iDownloadFile 0x%x", product_info->iDownloadFile); 465 dbg(" iDownloadFile 0x%x", product_info->iDownloadFile);
440 dbg(" EpicVer %d", product_info->EpicVer); 466 dbg(" EpicVer %d", product_info->EpicVer);
441} 467}
@@ -444,55 +470,60 @@ static void get_product_info(struct edgeport_serial *edge_serial)
444{ 470{
445 struct edgeport_product_info *product_info = &edge_serial->product_info; 471 struct edgeport_product_info *product_info = &edge_serial->product_info;
446 472
447 memset (product_info, 0, sizeof(struct edgeport_product_info)); 473 memset(product_info, 0, sizeof(struct edgeport_product_info));
448 474
449 product_info->ProductId = (__u16)(le16_to_cpu(edge_serial->serial->dev->descriptor.idProduct) & ~ION_DEVICE_ID_80251_NETCHIP); 475 product_info->ProductId = (__u16)(le16_to_cpu(edge_serial->serial->dev->descriptor.idProduct) & ~ION_DEVICE_ID_80251_NETCHIP);
450 product_info->NumPorts = edge_serial->manuf_descriptor.NumPorts; 476 product_info->NumPorts = edge_serial->manuf_descriptor.NumPorts;
451 product_info->ProdInfoVer = 0; 477 product_info->ProdInfoVer = 0;
452 478
453 product_info->RomSize = edge_serial->manuf_descriptor.RomSize; 479 product_info->RomSize = edge_serial->manuf_descriptor.RomSize;
454 product_info->RamSize = edge_serial->manuf_descriptor.RamSize; 480 product_info->RamSize = edge_serial->manuf_descriptor.RamSize;
455 product_info->CpuRev = edge_serial->manuf_descriptor.CpuRev; 481 product_info->CpuRev = edge_serial->manuf_descriptor.CpuRev;
456 product_info->BoardRev = edge_serial->manuf_descriptor.BoardRev; 482 product_info->BoardRev = edge_serial->manuf_descriptor.BoardRev;
457 483
458 product_info->BootMajorVersion = edge_serial->boot_descriptor.MajorVersion; 484 product_info->BootMajorVersion =
459 product_info->BootMinorVersion = edge_serial->boot_descriptor.MinorVersion; 485 edge_serial->boot_descriptor.MajorVersion;
460 product_info->BootBuildNumber = edge_serial->boot_descriptor.BuildNumber; 486 product_info->BootMinorVersion =
461 487 edge_serial->boot_descriptor.MinorVersion;
462 memcpy(product_info->ManufactureDescDate, edge_serial->manuf_descriptor.DescDate, sizeof(edge_serial->manuf_descriptor.DescDate)); 488 product_info->BootBuildNumber =
463 489 edge_serial->boot_descriptor.BuildNumber;
464 // check if this is 2nd generation hardware 490
465 if (le16_to_cpu(edge_serial->serial->dev->descriptor.idProduct) & ION_DEVICE_ID_80251_NETCHIP) { 491 memcpy(product_info->ManufactureDescDate,
466 product_info->iDownloadFile = EDGE_DOWNLOAD_FILE_80251; 492 edge_serial->manuf_descriptor.DescDate,
467 } else { 493 sizeof(edge_serial->manuf_descriptor.DescDate));
468 product_info->iDownloadFile = EDGE_DOWNLOAD_FILE_I930; 494
469 } 495 /* check if this is 2nd generation hardware */
470 496 if (le16_to_cpu(edge_serial->serial->dev->descriptor.idProduct)
471 // Determine Product type and set appropriate flags 497 & ION_DEVICE_ID_80251_NETCHIP)
498 product_info->iDownloadFile = EDGE_DOWNLOAD_FILE_80251;
499 else
500 product_info->iDownloadFile = EDGE_DOWNLOAD_FILE_I930;
501
502 /* Determine Product type and set appropriate flags */
472 switch (DEVICE_ID_FROM_USB_PRODUCT_ID(product_info->ProductId)) { 503 switch (DEVICE_ID_FROM_USB_PRODUCT_ID(product_info->ProductId)) {
473 case ION_DEVICE_ID_EDGEPORT_COMPATIBLE: 504 case ION_DEVICE_ID_EDGEPORT_COMPATIBLE:
474 case ION_DEVICE_ID_EDGEPORT_4T: 505 case ION_DEVICE_ID_EDGEPORT_4T:
475 case ION_DEVICE_ID_EDGEPORT_4: 506 case ION_DEVICE_ID_EDGEPORT_4:
476 case ION_DEVICE_ID_EDGEPORT_2: 507 case ION_DEVICE_ID_EDGEPORT_2:
477 case ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU: 508 case ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU:
478 case ION_DEVICE_ID_EDGEPORT_8: 509 case ION_DEVICE_ID_EDGEPORT_8:
479 case ION_DEVICE_ID_EDGEPORT_421: 510 case ION_DEVICE_ID_EDGEPORT_421:
480 case ION_DEVICE_ID_EDGEPORT_21: 511 case ION_DEVICE_ID_EDGEPORT_21:
481 case ION_DEVICE_ID_EDGEPORT_2_DIN: 512 case ION_DEVICE_ID_EDGEPORT_2_DIN:
482 case ION_DEVICE_ID_EDGEPORT_4_DIN: 513 case ION_DEVICE_ID_EDGEPORT_4_DIN:
483 case ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU: 514 case ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU:
484 product_info->IsRS232 = 1; 515 product_info->IsRS232 = 1;
485 break; 516 break;
486 517
487 case ION_DEVICE_ID_EDGEPORT_2I: // Edgeport/2 RS422/RS485 518 case ION_DEVICE_ID_EDGEPORT_2I: /* Edgeport/2 RS422/RS485 */
488 product_info->IsRS422 = 1; 519 product_info->IsRS422 = 1;
489 product_info->IsRS485 = 1; 520 product_info->IsRS485 = 1;
490 break; 521 break;
491 522
492 case ION_DEVICE_ID_EDGEPORT_8I: // Edgeport/4 RS422 523 case ION_DEVICE_ID_EDGEPORT_8I: /* Edgeport/4 RS422 */
493 case ION_DEVICE_ID_EDGEPORT_4I: // Edgeport/4 RS422 524 case ION_DEVICE_ID_EDGEPORT_4I: /* Edgeport/4 RS422 */
494 product_info->IsRS422 = 1; 525 product_info->IsRS422 = 1;
495 break; 526 break;
496 } 527 }
497 528
498 dump_product_info(product_info); 529 dump_product_info(product_info);
@@ -520,32 +551,32 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
520 ep->is_epic = 1; 551 ep->is_epic = 1;
521 memset(product_info, 0, sizeof(struct edgeport_product_info)); 552 memset(product_info, 0, sizeof(struct edgeport_product_info));
522 553
523 product_info->NumPorts = epic->NumPorts; 554 product_info->NumPorts = epic->NumPorts;
524 product_info->ProdInfoVer = 0; 555 product_info->ProdInfoVer = 0;
525 product_info->FirmwareMajorVersion = epic->MajorVersion; 556 product_info->FirmwareMajorVersion = epic->MajorVersion;
526 product_info->FirmwareMinorVersion = epic->MinorVersion; 557 product_info->FirmwareMinorVersion = epic->MinorVersion;
527 product_info->FirmwareBuildNumber = epic->BuildNumber; 558 product_info->FirmwareBuildNumber = epic->BuildNumber;
528 product_info->iDownloadFile = epic->iDownloadFile; 559 product_info->iDownloadFile = epic->iDownloadFile;
529 product_info->EpicVer = epic->EpicVer; 560 product_info->EpicVer = epic->EpicVer;
530 product_info->Epic = epic->Supports; 561 product_info->Epic = epic->Supports;
531 product_info->ProductId = ION_DEVICE_ID_EDGEPORT_COMPATIBLE; 562 product_info->ProductId = ION_DEVICE_ID_EDGEPORT_COMPATIBLE;
532 dump_product_info(product_info); 563 dump_product_info(product_info);
533 564
534 bits = &ep->epic_descriptor.Supports; 565 bits = &ep->epic_descriptor.Supports;
535 dbg("**EPIC descriptor:"); 566 dbg("**EPIC descriptor:");
536 dbg(" VendEnableSuspend: %s", bits->VendEnableSuspend ? "TRUE": "FALSE"); 567 dbg(" VendEnableSuspend: %s", bits->VendEnableSuspend ? "TRUE": "FALSE");
537 dbg(" IOSPOpen : %s", bits->IOSPOpen ? "TRUE": "FALSE" ); 568 dbg(" IOSPOpen : %s", bits->IOSPOpen ? "TRUE": "FALSE");
538 dbg(" IOSPClose : %s", bits->IOSPClose ? "TRUE": "FALSE" ); 569 dbg(" IOSPClose : %s", bits->IOSPClose ? "TRUE": "FALSE");
539 dbg(" IOSPChase : %s", bits->IOSPChase ? "TRUE": "FALSE" ); 570 dbg(" IOSPChase : %s", bits->IOSPChase ? "TRUE": "FALSE");
540 dbg(" IOSPSetRxFlow : %s", bits->IOSPSetRxFlow ? "TRUE": "FALSE" ); 571 dbg(" IOSPSetRxFlow : %s", bits->IOSPSetRxFlow ? "TRUE": "FALSE");
541 dbg(" IOSPSetTxFlow : %s", bits->IOSPSetTxFlow ? "TRUE": "FALSE" ); 572 dbg(" IOSPSetTxFlow : %s", bits->IOSPSetTxFlow ? "TRUE": "FALSE");
542 dbg(" IOSPSetXChar : %s", bits->IOSPSetXChar ? "TRUE": "FALSE" ); 573 dbg(" IOSPSetXChar : %s", bits->IOSPSetXChar ? "TRUE": "FALSE");
543 dbg(" IOSPRxCheck : %s", bits->IOSPRxCheck ? "TRUE": "FALSE" ); 574 dbg(" IOSPRxCheck : %s", bits->IOSPRxCheck ? "TRUE": "FALSE");
544 dbg(" IOSPSetClrBreak : %s", bits->IOSPSetClrBreak ? "TRUE": "FALSE" ); 575 dbg(" IOSPSetClrBreak : %s", bits->IOSPSetClrBreak ? "TRUE": "FALSE");
545 dbg(" IOSPWriteMCR : %s", bits->IOSPWriteMCR ? "TRUE": "FALSE" ); 576 dbg(" IOSPWriteMCR : %s", bits->IOSPWriteMCR ? "TRUE": "FALSE");
546 dbg(" IOSPWriteLCR : %s", bits->IOSPWriteLCR ? "TRUE": "FALSE" ); 577 dbg(" IOSPWriteLCR : %s", bits->IOSPWriteLCR ? "TRUE": "FALSE");
547 dbg(" IOSPSetBaudRate : %s", bits->IOSPSetBaudRate ? "TRUE": "FALSE" ); 578 dbg(" IOSPSetBaudRate : %s", bits->IOSPSetBaudRate ? "TRUE": "FALSE");
548 dbg(" TrueEdgeport : %s", bits->TrueEdgeport ? "TRUE": "FALSE" ); 579 dbg(" TrueEdgeport : %s", bits->TrueEdgeport ? "TRUE": "FALSE");
549 } 580 }
550 581
551 return result; 582 return result;
@@ -561,10 +592,10 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
561 592
562/***************************************************************************** 593/*****************************************************************************
563 * edge_interrupt_callback 594 * edge_interrupt_callback
564 * this is the callback function for when we have received data on the 595 * this is the callback function for when we have received data on the
565 * interrupt endpoint. 596 * interrupt endpoint.
566 *****************************************************************************/ 597 *****************************************************************************/
567static void edge_interrupt_callback (struct urb *urb) 598static void edge_interrupt_callback(struct urb *urb)
568{ 599{
569 struct edgeport_serial *edge_serial = urb->context; 600 struct edgeport_serial *edge_serial = urb->context;
570 struct edgeport_port *edge_port; 601 struct edgeport_port *edge_port;
@@ -589,17 +620,17 @@ static void edge_interrupt_callback (struct urb *urb)
589 case -ESHUTDOWN: 620 case -ESHUTDOWN:
590 /* this urb is terminated, clean up */ 621 /* this urb is terminated, clean up */
591 dbg("%s - urb shutting down with status: %d", 622 dbg("%s - urb shutting down with status: %d",
592 __func__, status); 623 __func__, status);
593 return; 624 return;
594 default: 625 default:
595 dbg("%s - nonzero urb status received: %d", 626 dbg("%s - nonzero urb status received: %d", __func__, status);
596 __func__, status);
597 goto exit; 627 goto exit;
598 } 628 }
599 629
600 // process this interrupt-read even if there are no ports open 630 /* process this interrupt-read even if there are no ports open */
601 if (length) { 631 if (length) {
602 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __func__, length, data); 632 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev,
633 __func__, length, data);
603 634
604 if (length > 1) { 635 if (length > 1) {
605 bytes_avail = data[0] | (data[1] << 8); 636 bytes_avail = data[0] | (data[1] << 8);
@@ -613,7 +644,8 @@ static void edge_interrupt_callback (struct urb *urb)
613 dbg("%s - posting a read", __func__); 644 dbg("%s - posting a read", __func__);
614 edge_serial->read_in_progress = true; 645 edge_serial->read_in_progress = true;
615 646
616 /* we have pending bytes on the bulk in pipe, send a request */ 647 /* we have pending bytes on the
648 bulk in pipe, send a request */
617 edge_serial->read_urb->dev = edge_serial->serial->dev; 649 edge_serial->read_urb->dev = edge_serial->serial->dev;
618 result = usb_submit_urb(edge_serial->read_urb, GFP_ATOMIC); 650 result = usb_submit_urb(edge_serial->read_urb, GFP_ATOMIC);
619 if (result) { 651 if (result) {
@@ -627,7 +659,8 @@ static void edge_interrupt_callback (struct urb *urb)
627 /* grab the txcredits for the ports if available */ 659 /* grab the txcredits for the ports if available */
628 position = 2; 660 position = 2;
629 portNumber = 0; 661 portNumber = 0;
630 while ((position < length) && (portNumber < edge_serial->serial->num_ports)) { 662 while ((position < length) &&
663 (portNumber < edge_serial->serial->num_ports)) {
631 txCredits = data[position] | (data[position+1] << 8); 664 txCredits = data[position] | (data[position+1] << 8);
632 if (txCredits) { 665 if (txCredits) {
633 port = edge_serial->serial->port[portNumber]; 666 port = edge_serial->serial->port[portNumber];
@@ -636,14 +669,19 @@ static void edge_interrupt_callback (struct urb *urb)
636 spin_lock(&edge_port->ep_lock); 669 spin_lock(&edge_port->ep_lock);
637 edge_port->txCredits += txCredits; 670 edge_port->txCredits += txCredits;
638 spin_unlock(&edge_port->ep_lock); 671 spin_unlock(&edge_port->ep_lock);
639 dbg("%s - txcredits for port%d = %d", __func__, portNumber, edge_port->txCredits); 672 dbg("%s - txcredits for port%d = %d",
640 673 __func__, portNumber,
641 /* tell the tty driver that something has changed */ 674 edge_port->txCredits);
642 if (edge_port->port->tty) 675
643 tty_wakeup(edge_port->port->tty); 676 /* tell the tty driver that something
644 677 has changed */
645 // Since we have more credit, check if more data can be sent 678 if (edge_port->port->port.tty)
646 send_more_port_data(edge_serial, edge_port); 679 tty_wakeup(edge_port->port->port.tty);
680
681 /* Since we have more credit, check
682 if more data can be sent */
683 send_more_port_data(edge_serial,
684 edge_port);
647 } 685 }
648 } 686 }
649 position += 2; 687 position += 2;
@@ -652,19 +690,20 @@ static void edge_interrupt_callback (struct urb *urb)
652 } 690 }
653 691
654exit: 692exit:
655 result = usb_submit_urb (urb, GFP_ATOMIC); 693 result = usb_submit_urb(urb, GFP_ATOMIC);
656 if (result) { 694 if (result)
657 dev_err(&urb->dev->dev, "%s - Error %d submitting control urb\n", __func__, result); 695 dev_err(&urb->dev->dev,
658 } 696 "%s - Error %d submitting control urb\n",
697 __func__, result);
659} 698}
660 699
661 700
662/***************************************************************************** 701/*****************************************************************************
663 * edge_bulk_in_callback 702 * edge_bulk_in_callback
664 * this is the callback function for when we have received data on the 703 * this is the callback function for when we have received data on the
665 * bulk in endpoint. 704 * bulk in endpoint.
666 *****************************************************************************/ 705 *****************************************************************************/
667static void edge_bulk_in_callback (struct urb *urb) 706static void edge_bulk_in_callback(struct urb *urb)
668{ 707{
669 struct edgeport_serial *edge_serial = urb->context; 708 struct edgeport_serial *edge_serial = urb->context;
670 unsigned char *data = urb->transfer_buffer; 709 unsigned char *data = urb->transfer_buffer;
@@ -689,16 +728,18 @@ static void edge_bulk_in_callback (struct urb *urb)
689 728
690 raw_data_length = urb->actual_length; 729 raw_data_length = urb->actual_length;
691 730
692 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __func__, raw_data_length, data); 731 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev,
732 __func__, raw_data_length, data);
693 733
694 spin_lock(&edge_serial->es_lock); 734 spin_lock(&edge_serial->es_lock);
695 735
696 /* decrement our rxBytes available by the number that we just got */ 736 /* decrement our rxBytes available by the number that we just got */
697 edge_serial->rxBytesAvail -= raw_data_length; 737 edge_serial->rxBytesAvail -= raw_data_length;
698 738
699 dbg("%s - Received = %d, rxBytesAvail %d", __func__, raw_data_length, edge_serial->rxBytesAvail); 739 dbg("%s - Received = %d, rxBytesAvail %d", __func__,
740 raw_data_length, edge_serial->rxBytesAvail);
700 741
701 process_rcvd_data (edge_serial, data, urb->actual_length); 742 process_rcvd_data(edge_serial, data, urb->actual_length);
702 743
703 /* check to see if there's any more data for us to read */ 744 /* check to see if there's any more data for us to read */
704 if (edge_serial->rxBytesAvail > 0) { 745 if (edge_serial->rxBytesAvail > 0) {
@@ -721,10 +762,10 @@ static void edge_bulk_in_callback (struct urb *urb)
721 762
722/***************************************************************************** 763/*****************************************************************************
723 * edge_bulk_out_data_callback 764 * edge_bulk_out_data_callback
724 * this is the callback function for when we have finished sending serial data 765 * this is the callback function for when we have finished sending
725 * on the bulk out endpoint. 766 * serial data on the bulk out endpoint.
726 *****************************************************************************/ 767 *****************************************************************************/
727static void edge_bulk_out_data_callback (struct urb *urb) 768static void edge_bulk_out_data_callback(struct urb *urb)
728{ 769{
729 struct edgeport_port *edge_port = urb->context; 770 struct edgeport_port *edge_port = urb->context;
730 struct tty_struct *tty; 771 struct tty_struct *tty;
@@ -737,27 +778,29 @@ static void edge_bulk_out_data_callback (struct urb *urb)
737 __func__, status); 778 __func__, status);
738 } 779 }
739 780
740 tty = edge_port->port->tty; 781 tty = edge_port->port->port.tty;
741 782
742 if (tty && edge_port->open) { 783 if (tty && edge_port->open) {
743 /* let the tty driver wakeup if it has a special write_wakeup function */ 784 /* let the tty driver wakeup if it has a special
785 write_wakeup function */
744 tty_wakeup(tty); 786 tty_wakeup(tty);
745 } 787 }
746 788
747 // Release the Write URB 789 /* Release the Write URB */
748 edge_port->write_in_progress = false; 790 edge_port->write_in_progress = false;
749 791
750 // Check if more data needs to be sent 792 /* Check if more data needs to be sent */
751 send_more_port_data((struct edgeport_serial *)(usb_get_serial_data(edge_port->port->serial)), edge_port); 793 send_more_port_data((struct edgeport_serial *)
794 (usb_get_serial_data(edge_port->port->serial)), edge_port);
752} 795}
753 796
754 797
755/***************************************************************************** 798/*****************************************************************************
756 * BulkOutCmdCallback 799 * BulkOutCmdCallback
757 * this is the callback function for when we have finished sending a command 800 * this is the callback function for when we have finished sending a
758 * on the bulk out endpoint. 801 * command on the bulk out endpoint.
759 *****************************************************************************/ 802 *****************************************************************************/
760static void edge_bulk_out_cmd_callback (struct urb *urb) 803static void edge_bulk_out_cmd_callback(struct urb *urb)
761{ 804{
762 struct edgeport_port *edge_port = urb->context; 805 struct edgeport_port *edge_port = urb->context;
763 struct tty_struct *tty; 806 struct tty_struct *tty;
@@ -766,22 +809,24 @@ static void edge_bulk_out_cmd_callback (struct urb *urb)
766 dbg("%s", __func__); 809 dbg("%s", __func__);
767 810
768 atomic_dec(&CmdUrbs); 811 atomic_dec(&CmdUrbs);
769 dbg("%s - FREE URB %p (outstanding %d)", __func__, urb, atomic_read(&CmdUrbs)); 812 dbg("%s - FREE URB %p (outstanding %d)", __func__,
813 urb, atomic_read(&CmdUrbs));
770 814
771 815
772 /* clean up the transfer buffer */ 816 /* clean up the transfer buffer */
773 kfree(urb->transfer_buffer); 817 kfree(urb->transfer_buffer);
774 818
775 /* Free the command urb */ 819 /* Free the command urb */
776 usb_free_urb (urb); 820 usb_free_urb(urb);
777 821
778 if (status) { 822 if (status) {
779 dbg("%s - nonzero write bulk status received: %d", __func__, status); 823 dbg("%s - nonzero write bulk status received: %d",
824 __func__, status);
780 return; 825 return;
781 } 826 }
782 827
783 /* Get pointer to tty */ 828 /* Get pointer to tty */
784 tty = edge_port->port->tty; 829 tty = edge_port->port->port.tty;
785 830
786 /* tell the tty driver that something has changed */ 831 /* tell the tty driver that something has changed */
787 if (tty && edge_port->open) 832 if (tty && edge_port->open)
@@ -803,7 +848,8 @@ static void edge_bulk_out_cmd_callback (struct urb *urb)
803 * If successful, we return 0 848 * If successful, we return 0
804 * Otherwise we return a negative error number. 849 * Otherwise we return a negative error number.
805 *****************************************************************************/ 850 *****************************************************************************/
806static int edge_open (struct usb_serial_port *port, struct file * filp) 851static int edge_open(struct tty_struct *tty,
852 struct usb_serial_port *port, struct file *filp)
807{ 853{
808 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 854 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
809 struct usb_serial *serial; 855 struct usb_serial *serial;
@@ -815,55 +861,62 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
815 if (edge_port == NULL) 861 if (edge_port == NULL)
816 return -ENODEV; 862 return -ENODEV;
817 863
818 if (port->tty) 864 if (tty)
819 port->tty->low_latency = low_latency; 865 tty->low_latency = low_latency;
820 866
821 /* see if we've set up our endpoint info yet (can't set it up in edge_startup 867 /* see if we've set up our endpoint info yet (can't set it up
822 as the structures were not set up at that time.) */ 868 in edge_startup as the structures were not set up at that time.) */
823 serial = port->serial; 869 serial = port->serial;
824 edge_serial = usb_get_serial_data(serial); 870 edge_serial = usb_get_serial_data(serial);
825 if (edge_serial == NULL) { 871 if (edge_serial == NULL)
826 return -ENODEV; 872 return -ENODEV;
827 }
828 if (edge_serial->interrupt_in_buffer == NULL) { 873 if (edge_serial->interrupt_in_buffer == NULL) {
829 struct usb_serial_port *port0 = serial->port[0]; 874 struct usb_serial_port *port0 = serial->port[0];
830 875
831 /* not set up yet, so do it now */ 876 /* not set up yet, so do it now */
832 edge_serial->interrupt_in_buffer = port0->interrupt_in_buffer; 877 edge_serial->interrupt_in_buffer =
833 edge_serial->interrupt_in_endpoint = port0->interrupt_in_endpointAddress; 878 port0->interrupt_in_buffer;
879 edge_serial->interrupt_in_endpoint =
880 port0->interrupt_in_endpointAddress;
834 edge_serial->interrupt_read_urb = port0->interrupt_in_urb; 881 edge_serial->interrupt_read_urb = port0->interrupt_in_urb;
835 edge_serial->bulk_in_buffer = port0->bulk_in_buffer; 882 edge_serial->bulk_in_buffer = port0->bulk_in_buffer;
836 edge_serial->bulk_in_endpoint = port0->bulk_in_endpointAddress; 883 edge_serial->bulk_in_endpoint =
884 port0->bulk_in_endpointAddress;
837 edge_serial->read_urb = port0->read_urb; 885 edge_serial->read_urb = port0->read_urb;
838 edge_serial->bulk_out_endpoint = port0->bulk_out_endpointAddress; 886 edge_serial->bulk_out_endpoint =
839 887 port0->bulk_out_endpointAddress;
888
840 /* set up our interrupt urb */ 889 /* set up our interrupt urb */
841 usb_fill_int_urb(edge_serial->interrupt_read_urb, 890 usb_fill_int_urb(edge_serial->interrupt_read_urb,
842 serial->dev, 891 serial->dev,
843 usb_rcvintpipe(serial->dev, 892 usb_rcvintpipe(serial->dev,
844 port0->interrupt_in_endpointAddress), 893 port0->interrupt_in_endpointAddress),
845 port0->interrupt_in_buffer, 894 port0->interrupt_in_buffer,
846 edge_serial->interrupt_read_urb->transfer_buffer_length, 895 edge_serial->interrupt_read_urb->transfer_buffer_length,
847 edge_interrupt_callback, edge_serial, 896 edge_interrupt_callback, edge_serial,
848 edge_serial->interrupt_read_urb->interval); 897 edge_serial->interrupt_read_urb->interval);
849 898
850 /* set up our bulk in urb */ 899 /* set up our bulk in urb */
851 usb_fill_bulk_urb(edge_serial->read_urb, serial->dev, 900 usb_fill_bulk_urb(edge_serial->read_urb, serial->dev,
852 usb_rcvbulkpipe(serial->dev, 901 usb_rcvbulkpipe(serial->dev,
853 port0->bulk_in_endpointAddress), 902 port0->bulk_in_endpointAddress),
854 port0->bulk_in_buffer, 903 port0->bulk_in_buffer,
855 edge_serial->read_urb->transfer_buffer_length, 904 edge_serial->read_urb->transfer_buffer_length,
856 edge_bulk_in_callback, edge_serial); 905 edge_bulk_in_callback, edge_serial);
857 edge_serial->read_in_progress = false; 906 edge_serial->read_in_progress = false;
858 907
859 /* start interrupt read for this edgeport 908 /* start interrupt read for this edgeport
860 * this interrupt will continue as long as the edgeport is connected */ 909 * this interrupt will continue as long
861 response = usb_submit_urb (edge_serial->interrupt_read_urb, GFP_KERNEL); 910 * as the edgeport is connected */
911 response = usb_submit_urb(edge_serial->interrupt_read_urb,
912 GFP_KERNEL);
862 if (response) { 913 if (response) {
863 dev_err(&port->dev, "%s - Error %d submitting control urb\n", __func__, response); 914 dev_err(&port->dev,
915 "%s - Error %d submitting control urb\n",
916 __func__, response);
864 } 917 }
865 } 918 }
866 919
867 /* initialize our wait queues */ 920 /* initialize our wait queues */
868 init_waitqueue_head(&edge_port->wait_open); 921 init_waitqueue_head(&edge_port->wait_open);
869 init_waitqueue_head(&edge_port->wait_chase); 922 init_waitqueue_head(&edge_port->wait_chase);
@@ -871,26 +924,29 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
871 init_waitqueue_head(&edge_port->wait_command); 924 init_waitqueue_head(&edge_port->wait_command);
872 925
873 /* initialize our icount structure */ 926 /* initialize our icount structure */
874 memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount)); 927 memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount));
875 928
876 /* initialize our port settings */ 929 /* initialize our port settings */
877 edge_port->txCredits = 0; /* Can't send any data yet */ 930 edge_port->txCredits = 0; /* Can't send any data yet */
878 edge_port->shadowMCR = MCR_MASTER_IE; /* Must always set this bit to enable ints! */ 931 /* Must always set this bit to enable ints! */
932 edge_port->shadowMCR = MCR_MASTER_IE;
879 edge_port->chaseResponsePending = false; 933 edge_port->chaseResponsePending = false;
880 934
881 /* send a open port command */ 935 /* send a open port command */
882 edge_port->openPending = true; 936 edge_port->openPending = true;
883 edge_port->open = false; 937 edge_port->open = false;
884 response = send_iosp_ext_cmd (edge_port, IOSP_CMD_OPEN_PORT, 0); 938 response = send_iosp_ext_cmd(edge_port, IOSP_CMD_OPEN_PORT, 0);
885 939
886 if (response < 0) { 940 if (response < 0) {
887 dev_err(&port->dev, "%s - error sending open port command\n", __func__); 941 dev_err(&port->dev, "%s - error sending open port command\n",
942 __func__);
888 edge_port->openPending = false; 943 edge_port->openPending = false;
889 return -ENODEV; 944 return -ENODEV;
890 } 945 }
891 946
892 /* now wait for the port to be completely opened */ 947 /* now wait for the port to be completely opened */
893 wait_event_timeout(edge_port->wait_open, !edge_port->openPending, OPEN_TIMEOUT); 948 wait_event_timeout(edge_port->wait_open, !edge_port->openPending,
949 OPEN_TIMEOUT);
894 950
895 if (!edge_port->open) { 951 if (!edge_port->open) {
896 /* open timed out */ 952 /* open timed out */
@@ -904,25 +960,26 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
904 edge_port->txfifo.tail = 0; 960 edge_port->txfifo.tail = 0;
905 edge_port->txfifo.count = 0; 961 edge_port->txfifo.count = 0;
906 edge_port->txfifo.size = edge_port->maxTxCredits; 962 edge_port->txfifo.size = edge_port->maxTxCredits;
907 edge_port->txfifo.fifo = kmalloc (edge_port->maxTxCredits, GFP_KERNEL); 963 edge_port->txfifo.fifo = kmalloc(edge_port->maxTxCredits, GFP_KERNEL);
908 964
909 if (!edge_port->txfifo.fifo) { 965 if (!edge_port->txfifo.fifo) {
910 dbg("%s - no memory", __func__); 966 dbg("%s - no memory", __func__);
911 edge_close (port, filp); 967 edge_close(tty, port, filp);
912 return -ENOMEM; 968 return -ENOMEM;
913 } 969 }
914 970
915 /* Allocate a URB for the write */ 971 /* Allocate a URB for the write */
916 edge_port->write_urb = usb_alloc_urb (0, GFP_KERNEL); 972 edge_port->write_urb = usb_alloc_urb(0, GFP_KERNEL);
917 edge_port->write_in_progress = false; 973 edge_port->write_in_progress = false;
918 974
919 if (!edge_port->write_urb) { 975 if (!edge_port->write_urb) {
920 dbg("%s - no memory", __func__); 976 dbg("%s - no memory", __func__);
921 edge_close (port, filp); 977 edge_close(tty, port, filp);
922 return -ENOMEM; 978 return -ENOMEM;
923 } 979 }
924 980
925 dbg("%s(%d) - Initialize TX fifo to %d bytes", __func__, port->number, edge_port->maxTxCredits); 981 dbg("%s(%d) - Initialize TX fifo to %d bytes",
982 __func__, port->number, edge_port->maxTxCredits);
926 983
927 dbg("%s exited", __func__); 984 dbg("%s exited", __func__);
928 985
@@ -948,27 +1005,28 @@ static void block_until_chase_response(struct edgeport_port *edge_port)
948 int loop = 10; 1005 int loop = 10;
949 1006
950 while (1) { 1007 while (1) {
951 // Save Last credits 1008 /* Save Last credits */
952 lastCredits = edge_port->txCredits; 1009 lastCredits = edge_port->txCredits;
953 1010
954 // Did we get our Chase response 1011 /* Did we get our Chase response */
955 if (!edge_port->chaseResponsePending) { 1012 if (!edge_port->chaseResponsePending) {
956 dbg("%s - Got Chase Response", __func__); 1013 dbg("%s - Got Chase Response", __func__);
957 1014
958 // did we get all of our credit back? 1015 /* did we get all of our credit back? */
959 if (edge_port->txCredits == edge_port->maxTxCredits ) { 1016 if (edge_port->txCredits == edge_port->maxTxCredits) {
960 dbg("%s - Got all credits", __func__); 1017 dbg("%s - Got all credits", __func__);
961 return; 1018 return;
962 } 1019 }
963 } 1020 }
964 1021
965 // Block the thread for a while 1022 /* Block the thread for a while */
966 prepare_to_wait(&edge_port->wait_chase, &wait, TASK_UNINTERRUPTIBLE); 1023 prepare_to_wait(&edge_port->wait_chase, &wait,
1024 TASK_UNINTERRUPTIBLE);
967 schedule_timeout(timeout); 1025 schedule_timeout(timeout);
968 finish_wait(&edge_port->wait_chase, &wait); 1026 finish_wait(&edge_port->wait_chase, &wait);
969 1027
970 if (lastCredits == edge_port->txCredits) { 1028 if (lastCredits == edge_port->txCredits) {
971 // No activity.. count down. 1029 /* No activity.. count down. */
972 loop--; 1030 loop--;
973 if (loop == 0) { 1031 if (loop == 0) {
974 edge_port->chaseResponsePending = false; 1032 edge_port->chaseResponsePending = false;
@@ -976,8 +1034,9 @@ static void block_until_chase_response(struct edgeport_port *edge_port)
976 return; 1034 return;
977 } 1035 }
978 } else { 1036 } else {
979 // Reset timeout value back to 10 seconds 1037 /* Reset timeout value back to 10 seconds */
980 dbg("%s - Last %d, Current %d", __func__, lastCredits, edge_port->txCredits); 1038 dbg("%s - Last %d, Current %d", __func__,
1039 lastCredits, edge_port->txCredits);
981 loop = 10; 1040 loop = 10;
982 } 1041 }
983 } 1042 }
@@ -994,7 +1053,7 @@ static void block_until_chase_response(struct edgeport_port *edge_port)
994 * 3. A timeout of 3 seconds without activity has expired 1053 * 3. A timeout of 3 seconds without activity has expired
995 * 1054 *
996 ************************************************************************/ 1055 ************************************************************************/
997static void block_until_tx_empty (struct edgeport_port *edge_port) 1056static void block_until_tx_empty(struct edgeport_port *edge_port)
998{ 1057{
999 DEFINE_WAIT(wait); 1058 DEFINE_WAIT(wait);
1000 struct TxFifo *fifo = &edge_port->txfifo; 1059 struct TxFifo *fifo = &edge_port->txfifo;
@@ -1003,31 +1062,32 @@ static void block_until_tx_empty (struct edgeport_port *edge_port)
1003 int loop = 30; 1062 int loop = 30;
1004 1063
1005 while (1) { 1064 while (1) {
1006 // Save Last count 1065 /* Save Last count */
1007 lastCount = fifo->count; 1066 lastCount = fifo->count;
1008 1067
1009 // Is the Edgeport Buffer empty? 1068 /* Is the Edgeport Buffer empty? */
1010 if (lastCount == 0) { 1069 if (lastCount == 0) {
1011 dbg("%s - TX Buffer Empty", __func__); 1070 dbg("%s - TX Buffer Empty", __func__);
1012 return; 1071 return;
1013 } 1072 }
1014 1073
1015 // Block the thread for a while 1074 /* Block the thread for a while */
1016 prepare_to_wait (&edge_port->wait_chase, &wait, TASK_UNINTERRUPTIBLE); 1075 prepare_to_wait(&edge_port->wait_chase, &wait,
1076 TASK_UNINTERRUPTIBLE);
1017 schedule_timeout(timeout); 1077 schedule_timeout(timeout);
1018 finish_wait(&edge_port->wait_chase, &wait); 1078 finish_wait(&edge_port->wait_chase, &wait);
1019 1079
1020 dbg("%s wait", __func__); 1080 dbg("%s wait", __func__);
1021 1081
1022 if (lastCount == fifo->count) { 1082 if (lastCount == fifo->count) {
1023 // No activity.. count down. 1083 /* No activity.. count down. */
1024 loop--; 1084 loop--;
1025 if (loop == 0) { 1085 if (loop == 0) {
1026 dbg("%s - TIMEOUT", __func__); 1086 dbg("%s - TIMEOUT", __func__);
1027 return; 1087 return;
1028 } 1088 }
1029 } else { 1089 } else {
1030 // Reset timeout value back to seconds 1090 /* Reset timeout value back to seconds */
1031 loop = 30; 1091 loop = 30;
1032 } 1092 }
1033 } 1093 }
@@ -1038,20 +1098,21 @@ static void block_until_tx_empty (struct edgeport_port *edge_port)
1038 * edge_close 1098 * edge_close
1039 * this function is called by the tty driver when a port is closed 1099 * this function is called by the tty driver when a port is closed
1040 *****************************************************************************/ 1100 *****************************************************************************/
1041static void edge_close (struct usb_serial_port *port, struct file * filp) 1101static void edge_close(struct tty_struct *tty,
1102 struct usb_serial_port *port, struct file *filp)
1042{ 1103{
1043 struct edgeport_serial *edge_serial; 1104 struct edgeport_serial *edge_serial;
1044 struct edgeport_port *edge_port; 1105 struct edgeport_port *edge_port;
1045 int status; 1106 int status;
1046 1107
1047 dbg("%s - port %d", __func__, port->number); 1108 dbg("%s - port %d", __func__, port->number);
1048 1109
1049 edge_serial = usb_get_serial_data(port->serial); 1110 edge_serial = usb_get_serial_data(port->serial);
1050 edge_port = usb_get_serial_port_data(port); 1111 edge_port = usb_get_serial_port_data(port);
1051 if ((edge_serial == NULL) || (edge_port == NULL)) 1112 if (edge_serial == NULL || edge_port == NULL)
1052 return; 1113 return;
1053 1114
1054 // block until tx is empty 1115 /* block until tx is empty */
1055 block_until_tx_empty(edge_port); 1116 block_until_tx_empty(edge_port);
1056 1117
1057 edge_port->closePending = true; 1118 edge_port->closePending = true;
@@ -1063,13 +1124,12 @@ static void edge_close (struct usb_serial_port *port, struct file * filp)
1063 edge_port->chaseResponsePending = true; 1124 edge_port->chaseResponsePending = true;
1064 1125
1065 dbg("%s - Sending IOSP_CMD_CHASE_PORT", __func__); 1126 dbg("%s - Sending IOSP_CMD_CHASE_PORT", __func__);
1066 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CHASE_PORT, 0); 1127 status = send_iosp_ext_cmd(edge_port, IOSP_CMD_CHASE_PORT, 0);
1067 if (status == 0) { 1128 if (status == 0)
1068 // block until chase finished 1129 /* block until chase finished */
1069 block_until_chase_response(edge_port); 1130 block_until_chase_response(edge_port);
1070 } else { 1131 else
1071 edge_port->chaseResponsePending = false; 1132 edge_port->chaseResponsePending = false;
1072 }
1073 } 1133 }
1074 1134
1075 if ((!edge_serial->is_epic) || 1135 if ((!edge_serial->is_epic) ||
@@ -1077,10 +1137,10 @@ static void edge_close (struct usb_serial_port *port, struct file * filp)
1077 (edge_serial->epic_descriptor.Supports.IOSPClose))) { 1137 (edge_serial->epic_descriptor.Supports.IOSPClose))) {
1078 /* close the port */ 1138 /* close the port */
1079 dbg("%s - Sending IOSP_CMD_CLOSE_PORT", __func__); 1139 dbg("%s - Sending IOSP_CMD_CLOSE_PORT", __func__);
1080 send_iosp_ext_cmd (edge_port, IOSP_CMD_CLOSE_PORT, 0); 1140 send_iosp_ext_cmd(edge_port, IOSP_CMD_CLOSE_PORT, 0);
1081 } 1141 }
1082 1142
1083 //port->close = true; 1143 /* port->close = true; */
1084 edge_port->closePending = false; 1144 edge_port->closePending = false;
1085 edge_port->open = false; 1145 edge_port->open = false;
1086 edge_port->openPending = false; 1146 edge_port->openPending = false;
@@ -1088,7 +1148,8 @@ static void edge_close (struct usb_serial_port *port, struct file * filp)
1088 usb_kill_urb(edge_port->write_urb); 1148 usb_kill_urb(edge_port->write_urb);
1089 1149
1090 if (edge_port->write_urb) { 1150 if (edge_port->write_urb) {
1091 /* if this urb had a transfer buffer already (old transfer) free it */ 1151 /* if this urb had a transfer buffer already
1152 (old transfer) free it */
1092 kfree(edge_port->write_urb->transfer_buffer); 1153 kfree(edge_port->write_urb->transfer_buffer);
1093 usb_free_urb(edge_port->write_urb); 1154 usb_free_urb(edge_port->write_urb);
1094 edge_port->write_urb = NULL; 1155 edge_port->write_urb = NULL;
@@ -1097,16 +1158,17 @@ static void edge_close (struct usb_serial_port *port, struct file * filp)
1097 edge_port->txfifo.fifo = NULL; 1158 edge_port->txfifo.fifo = NULL;
1098 1159
1099 dbg("%s exited", __func__); 1160 dbg("%s exited", __func__);
1100} 1161}
1101 1162
1102/***************************************************************************** 1163/*****************************************************************************
1103 * SerialWrite 1164 * SerialWrite
1104 * this function is called by the tty driver when data should be written to 1165 * this function is called by the tty driver when data should be written
1105 * the port. 1166 * to the port.
1106 * If successful, we return the number of bytes written, otherwise we return 1167 * If successful, we return the number of bytes written, otherwise we
1107 * a negative error number. 1168 * return a negative error number.
1108 *****************************************************************************/ 1169 *****************************************************************************/
1109static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count) 1170static int edge_write(struct tty_struct *tty, struct usb_serial_port *port,
1171 const unsigned char *data, int count)
1110{ 1172{
1111 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1173 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1112 struct TxFifo *fifo; 1174 struct TxFifo *fifo;
@@ -1121,66 +1183,76 @@ static int edge_write (struct usb_serial_port *port, const unsigned char *data,
1121 if (edge_port == NULL) 1183 if (edge_port == NULL)
1122 return -ENODEV; 1184 return -ENODEV;
1123 1185
1124 // get a pointer to the Tx fifo 1186 /* get a pointer to the Tx fifo */
1125 fifo = &edge_port->txfifo; 1187 fifo = &edge_port->txfifo;
1126 1188
1127 spin_lock_irqsave(&edge_port->ep_lock, flags); 1189 spin_lock_irqsave(&edge_port->ep_lock, flags);
1128 1190
1129 // calculate number of bytes to put in fifo 1191 /* calculate number of bytes to put in fifo */
1130 copySize = min ((unsigned int)count, (edge_port->txCredits - fifo->count)); 1192 copySize = min((unsigned int)count,
1193 (edge_port->txCredits - fifo->count));
1131 1194
1132 dbg("%s(%d) of %d byte(s) Fifo room %d -- will copy %d bytes", __func__, 1195 dbg("%s(%d) of %d byte(s) Fifo room %d -- will copy %d bytes",
1133 port->number, count, edge_port->txCredits - fifo->count, copySize); 1196 __func__, port->number, count,
1197 edge_port->txCredits - fifo->count, copySize);
1134 1198
1135 /* catch writes of 0 bytes which the tty driver likes to give us, and when txCredits is empty */ 1199 /* catch writes of 0 bytes which the tty driver likes to give us,
1200 and when txCredits is empty */
1136 if (copySize == 0) { 1201 if (copySize == 0) {
1137 dbg("%s - copySize = Zero", __func__); 1202 dbg("%s - copySize = Zero", __func__);
1138 goto finish_write; 1203 goto finish_write;
1139 } 1204 }
1140 1205
1141 // queue the data 1206 /* queue the data
1142 // since we can never overflow the buffer we do not have to check for full condition 1207 * since we can never overflow the buffer we do not have to check for a
1143 1208 * full condition
1144 // the copy is done is two parts -- first fill to the end of the buffer 1209 *
1145 // then copy the reset from the start of the buffer 1210 * the copy is done is two parts -- first fill to the end of the buffer
1146 1211 * then copy the reset from the start of the buffer
1212 */
1147 bytesleft = fifo->size - fifo->head; 1213 bytesleft = fifo->size - fifo->head;
1148 firsthalf = min (bytesleft, copySize); 1214 firsthalf = min(bytesleft, copySize);
1149 dbg("%s - copy %d bytes of %d into fifo ", __func__, firsthalf, bytesleft); 1215 dbg("%s - copy %d bytes of %d into fifo ", __func__,
1216 firsthalf, bytesleft);
1150 1217
1151 /* now copy our data */ 1218 /* now copy our data */
1152 memcpy(&fifo->fifo[fifo->head], data, firsthalf); 1219 memcpy(&fifo->fifo[fifo->head], data, firsthalf);
1153 usb_serial_debug_data(debug, &port->dev, __func__, firsthalf, &fifo->fifo[fifo->head]); 1220 usb_serial_debug_data(debug, &port->dev, __func__,
1221 firsthalf, &fifo->fifo[fifo->head]);
1154 1222
1155 // update the index and size 1223 /* update the index and size */
1156 fifo->head += firsthalf; 1224 fifo->head += firsthalf;
1157 fifo->count += firsthalf; 1225 fifo->count += firsthalf;
1158 1226
1159 // wrap the index 1227 /* wrap the index */
1160 if (fifo->head == fifo->size) { 1228 if (fifo->head == fifo->size)
1161 fifo->head = 0; 1229 fifo->head = 0;
1162 }
1163 1230
1164 secondhalf = copySize-firsthalf; 1231 secondhalf = copySize-firsthalf;
1165 1232
1166 if (secondhalf) { 1233 if (secondhalf) {
1167 dbg("%s - copy rest of data %d", __func__, secondhalf); 1234 dbg("%s - copy rest of data %d", __func__, secondhalf);
1168 memcpy(&fifo->fifo[fifo->head], &data[firsthalf], secondhalf); 1235 memcpy(&fifo->fifo[fifo->head], &data[firsthalf], secondhalf);
1169 usb_serial_debug_data(debug, &port->dev, __func__, secondhalf, &fifo->fifo[fifo->head]); 1236 usb_serial_debug_data(debug, &port->dev, __func__,
1170 // update the index and size 1237 secondhalf, &fifo->fifo[fifo->head]);
1238 /* update the index and size */
1171 fifo->count += secondhalf; 1239 fifo->count += secondhalf;
1172 fifo->head += secondhalf; 1240 fifo->head += secondhalf;
1173 // No need to check for wrap since we can not get to end of fifo in this part 1241 /* No need to check for wrap since we can not get to end of
1242 * the fifo in this part
1243 */
1174 } 1244 }
1175 1245
1176finish_write: 1246finish_write:
1177 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 1247 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1178 1248
1179 send_more_port_data((struct edgeport_serial *)usb_get_serial_data(port->serial), edge_port); 1249 send_more_port_data((struct edgeport_serial *)
1250 usb_get_serial_data(port->serial), edge_port);
1180 1251
1181 dbg("%s wrote %d byte(s) TxCredits %d, Fifo %d", __func__, copySize, edge_port->txCredits, fifo->count); 1252 dbg("%s wrote %d byte(s) TxCredits %d, Fifo %d", __func__,
1253 copySize, edge_port->txCredits, fifo->count);
1182 1254
1183 return copySize; 1255 return copySize;
1184} 1256}
1185 1257
1186 1258
@@ -1197,7 +1269,8 @@ finish_write:
1197 * can transmit more. 1269 * can transmit more.
1198 * 1270 *
1199 ************************************************************************/ 1271 ************************************************************************/
1200static void send_more_port_data(struct edgeport_serial *edge_serial, struct edgeport_port *edge_port) 1272static void send_more_port_data(struct edgeport_serial *edge_serial,
1273 struct edgeport_port *edge_port)
1201{ 1274{
1202 struct TxFifo *fifo = &edge_port->txfifo; 1275 struct TxFifo *fifo = &edge_port->txfifo;
1203 struct urb *urb; 1276 struct urb *urb;
@@ -1216,67 +1289,78 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge
1216 if (edge_port->write_in_progress || 1289 if (edge_port->write_in_progress ||
1217 !edge_port->open || 1290 !edge_port->open ||
1218 (fifo->count == 0)) { 1291 (fifo->count == 0)) {
1219 dbg("%s(%d) EXIT - fifo %d, PendingWrite = %d", __func__, edge_port->port->number, fifo->count, edge_port->write_in_progress); 1292 dbg("%s(%d) EXIT - fifo %d, PendingWrite = %d",
1293 __func__, edge_port->port->number,
1294 fifo->count, edge_port->write_in_progress);
1220 goto exit_send; 1295 goto exit_send;
1221 } 1296 }
1222 1297
1223 // since the amount of data in the fifo will always fit into the 1298 /* since the amount of data in the fifo will always fit into the
1224 // edgeport buffer we do not need to check the write length 1299 * edgeport buffer we do not need to check the write length
1225 1300 *
1226 // Do we have enough credits for this port to make it worthwhile 1301 * Do we have enough credits for this port to make it worthwhile
1227 // to bother queueing a write. If it's too small, say a few bytes, 1302 * to bother queueing a write. If it's too small, say a few bytes,
1228 // it's better to wait for more credits so we can do a larger 1303 * it's better to wait for more credits so we can do a larger write.
1229 // write. 1304 */
1230 if (edge_port->txCredits < EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(edge_port->maxTxCredits,EDGE_FW_BULK_MAX_PACKET_SIZE)) { 1305 if (edge_port->txCredits < EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(edge_port->maxTxCredits, EDGE_FW_BULK_MAX_PACKET_SIZE)) {
1231 dbg("%s(%d) Not enough credit - fifo %d TxCredit %d", __func__, edge_port->port->number, fifo->count, edge_port->txCredits ); 1306 dbg("%s(%d) Not enough credit - fifo %d TxCredit %d",
1307 __func__, edge_port->port->number, fifo->count,
1308 edge_port->txCredits);
1232 goto exit_send; 1309 goto exit_send;
1233 } 1310 }
1234 1311
1235 // lock this write 1312 /* lock this write */
1236 edge_port->write_in_progress = true; 1313 edge_port->write_in_progress = true;
1237 1314
1238 // get a pointer to the write_urb 1315 /* get a pointer to the write_urb */
1239 urb = edge_port->write_urb; 1316 urb = edge_port->write_urb;
1240 1317
1241 /* make sure transfer buffer is freed */ 1318 /* make sure transfer buffer is freed */
1242 kfree(urb->transfer_buffer); 1319 kfree(urb->transfer_buffer);
1243 urb->transfer_buffer = NULL; 1320 urb->transfer_buffer = NULL;
1244 1321
1245 /* build the data header for the buffer and port that we are about to send out */ 1322 /* build the data header for the buffer and port that we are about
1323 to send out */
1246 count = fifo->count; 1324 count = fifo->count;
1247 buffer = kmalloc (count+2, GFP_ATOMIC); 1325 buffer = kmalloc(count+2, GFP_ATOMIC);
1248 if (buffer == NULL) { 1326 if (buffer == NULL) {
1249 dev_err(&edge_port->port->dev, "%s - no more kernel memory...\n", __func__); 1327 dev_err(&edge_port->port->dev,
1328 "%s - no more kernel memory...\n", __func__);
1250 edge_port->write_in_progress = false; 1329 edge_port->write_in_progress = false;
1251 goto exit_send; 1330 goto exit_send;
1252 } 1331 }
1253 buffer[0] = IOSP_BUILD_DATA_HDR1 (edge_port->port->number - edge_port->port->serial->minor, count); 1332 buffer[0] = IOSP_BUILD_DATA_HDR1(edge_port->port->number
1254 buffer[1] = IOSP_BUILD_DATA_HDR2 (edge_port->port->number - edge_port->port->serial->minor, count); 1333 - edge_port->port->serial->minor, count);
1334 buffer[1] = IOSP_BUILD_DATA_HDR2(edge_port->port->number
1335 - edge_port->port->serial->minor, count);
1255 1336
1256 /* now copy our data */ 1337 /* now copy our data */
1257 bytesleft = fifo->size - fifo->tail; 1338 bytesleft = fifo->size - fifo->tail;
1258 firsthalf = min (bytesleft, count); 1339 firsthalf = min(bytesleft, count);
1259 memcpy(&buffer[2], &fifo->fifo[fifo->tail], firsthalf); 1340 memcpy(&buffer[2], &fifo->fifo[fifo->tail], firsthalf);
1260 fifo->tail += firsthalf; 1341 fifo->tail += firsthalf;
1261 fifo->count -= firsthalf; 1342 fifo->count -= firsthalf;
1262 if (fifo->tail == fifo->size) { 1343 if (fifo->tail == fifo->size)
1263 fifo->tail = 0; 1344 fifo->tail = 0;
1264 }
1265 1345
1266 secondhalf = count-firsthalf; 1346 secondhalf = count-firsthalf;
1267 if (secondhalf) { 1347 if (secondhalf) {
1268 memcpy(&buffer[2+firsthalf], &fifo->fifo[fifo->tail], secondhalf); 1348 memcpy(&buffer[2+firsthalf], &fifo->fifo[fifo->tail],
1349 secondhalf);
1269 fifo->tail += secondhalf; 1350 fifo->tail += secondhalf;
1270 fifo->count -= secondhalf; 1351 fifo->count -= secondhalf;
1271 } 1352 }
1272 1353
1273 if (count) 1354 if (count)
1274 usb_serial_debug_data(debug, &edge_port->port->dev, __func__, count, &buffer[2]); 1355 usb_serial_debug_data(debug, &edge_port->port->dev,
1356 __func__, count, &buffer[2]);
1275 1357
1276 /* fill up the urb with all of our data and submit it */ 1358 /* fill up the urb with all of our data and submit it */
1277 usb_fill_bulk_urb (urb, edge_serial->serial->dev, 1359 usb_fill_bulk_urb(urb, edge_serial->serial->dev,
1278 usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint), 1360 usb_sndbulkpipe(edge_serial->serial->dev,
1279 buffer, count+2, edge_bulk_out_data_callback, edge_port); 1361 edge_serial->bulk_out_endpoint),
1362 buffer, count+2,
1363 edge_bulk_out_data_callback, edge_port);
1280 1364
1281 /* decrement the number of credits we have by the number we just sent */ 1365 /* decrement the number of credits we have by the number we just sent */
1282 edge_port->txCredits -= count; 1366 edge_port->txCredits -= count;
@@ -1286,14 +1370,17 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge
1286 status = usb_submit_urb(urb, GFP_ATOMIC); 1370 status = usb_submit_urb(urb, GFP_ATOMIC);
1287 if (status) { 1371 if (status) {
1288 /* something went wrong */ 1372 /* something went wrong */
1289 dev_err(&edge_port->port->dev, "%s - usb_submit_urb(write bulk) failed, status = %d, data lost\n", __func__, status); 1373 dev_err(&edge_port->port->dev,
1374 "%s - usb_submit_urb(write bulk) failed, status = %d, data lost\n",
1375 __func__, status);
1290 edge_port->write_in_progress = false; 1376 edge_port->write_in_progress = false;
1291 1377
1292 /* revert the credits as something bad happened. */ 1378 /* revert the credits as something bad happened. */
1293 edge_port->txCredits += count; 1379 edge_port->txCredits += count;
1294 edge_port->icount.tx -= count; 1380 edge_port->icount.tx -= count;
1295 } 1381 }
1296 dbg("%s wrote %d byte(s) TxCredit %d, Fifo %d", __func__, count, edge_port->txCredits, fifo->count); 1382 dbg("%s wrote %d byte(s) TxCredit %d, Fifo %d",
1383 __func__, count, edge_port->txCredits, fifo->count);
1297 1384
1298exit_send: 1385exit_send:
1299 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 1386 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
@@ -1302,14 +1389,14 @@ exit_send:
1302 1389
1303/***************************************************************************** 1390/*****************************************************************************
1304 * edge_write_room 1391 * edge_write_room
1305 * this function is called by the tty driver when it wants to know how many 1392 * this function is called by the tty driver when it wants to know how
1306 * bytes of data we can accept for a specific port. 1393 * many bytes of data we can accept for a specific port. If successful,
1307 * If successful, we return the amount of room that we have for this port 1394 * we return the amount of room that we have for this port (the txCredits)
1308 * (the txCredits), 1395 * otherwise we return a negative error number.
1309 * Otherwise we return a negative error number.
1310 *****************************************************************************/ 1396 *****************************************************************************/
1311static int edge_write_room (struct usb_serial_port *port) 1397static int edge_write_room(struct tty_struct *tty)
1312{ 1398{
1399 struct usb_serial_port *port = tty->driver_data;
1313 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1400 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1314 int room; 1401 int room;
1315 unsigned long flags; 1402 unsigned long flags;
@@ -1317,18 +1404,18 @@ static int edge_write_room (struct usb_serial_port *port)
1317 dbg("%s", __func__); 1404 dbg("%s", __func__);
1318 1405
1319 if (edge_port == NULL) 1406 if (edge_port == NULL)
1320 return -ENODEV; 1407 return 0;
1321 if (edge_port->closePending) 1408 if (edge_port->closePending)
1322 return -ENODEV; 1409 return 0;
1323 1410
1324 dbg("%s - port %d", __func__, port->number); 1411 dbg("%s - port %d", __func__, port->number);
1325 1412
1326 if (!edge_port->open) { 1413 if (!edge_port->open) {
1327 dbg("%s - port not opened", __func__); 1414 dbg("%s - port not opened", __func__);
1328 return -EINVAL; 1415 return 0;
1329 } 1416 }
1330 1417
1331 // total of both buffers is still txCredit 1418 /* total of both buffers is still txCredit */
1332 spin_lock_irqsave(&edge_port->ep_lock, flags); 1419 spin_lock_irqsave(&edge_port->ep_lock, flags);
1333 room = edge_port->txCredits - edge_port->txfifo.count; 1420 room = edge_port->txCredits - edge_port->txfifo.count;
1334 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 1421 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
@@ -1340,15 +1427,16 @@ static int edge_write_room (struct usb_serial_port *port)
1340 1427
1341/***************************************************************************** 1428/*****************************************************************************
1342 * edge_chars_in_buffer 1429 * edge_chars_in_buffer
1343 * this function is called by the tty driver when it wants to know how many 1430 * this function is called by the tty driver when it wants to know how
1344 * bytes of data we currently have outstanding in the port (data that has 1431 * many bytes of data we currently have outstanding in the port (data that
1345 * been written, but hasn't made it out the port yet) 1432 * has been written, but hasn't made it out the port yet)
1346 * If successful, we return the number of bytes left to be written in the 1433 * If successful, we return the number of bytes left to be written in the
1347 * system, 1434 * system,
1348 * Otherwise we return a negative error number. 1435 * Otherwise we return a negative error number.
1349 *****************************************************************************/ 1436 *****************************************************************************/
1350static int edge_chars_in_buffer (struct usb_serial_port *port) 1437static int edge_chars_in_buffer(struct tty_struct *tty)
1351{ 1438{
1439 struct usb_serial_port *port = tty->driver_data;
1352 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1440 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1353 int num_chars; 1441 int num_chars;
1354 unsigned long flags; 1442 unsigned long flags;
@@ -1356,20 +1444,22 @@ static int edge_chars_in_buffer (struct usb_serial_port *port)
1356 dbg("%s", __func__); 1444 dbg("%s", __func__);
1357 1445
1358 if (edge_port == NULL) 1446 if (edge_port == NULL)
1359 return -ENODEV; 1447 return 0;
1360 if (edge_port->closePending) 1448 if (edge_port->closePending)
1361 return -ENODEV; 1449 return 0;
1362 1450
1363 if (!edge_port->open) { 1451 if (!edge_port->open) {
1364 dbg("%s - port not opened", __func__); 1452 dbg("%s - port not opened", __func__);
1365 return -EINVAL; 1453 return 0;
1366 } 1454 }
1367 1455
1368 spin_lock_irqsave(&edge_port->ep_lock, flags); 1456 spin_lock_irqsave(&edge_port->ep_lock, flags);
1369 num_chars = edge_port->maxTxCredits - edge_port->txCredits + edge_port->txfifo.count; 1457 num_chars = edge_port->maxTxCredits - edge_port->txCredits +
1458 edge_port->txfifo.count;
1370 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 1459 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1371 if (num_chars) { 1460 if (num_chars) {
1372 dbg("%s(port %d) - returns %d", __func__, port->number, num_chars); 1461 dbg("%s(port %d) - returns %d", __func__,
1462 port->number, num_chars);
1373 } 1463 }
1374 1464
1375 return num_chars; 1465 return num_chars;
@@ -1381,10 +1471,10 @@ static int edge_chars_in_buffer (struct usb_serial_port *port)
1381 * this function is called by the tty driver when it wants to stop the data 1471 * this function is called by the tty driver when it wants to stop the data
1382 * being read from the port. 1472 * being read from the port.
1383 *****************************************************************************/ 1473 *****************************************************************************/
1384static void edge_throttle (struct usb_serial_port *port) 1474static void edge_throttle(struct tty_struct *tty)
1385{ 1475{
1476 struct usb_serial_port *port = tty->driver_data;
1386 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1477 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1387 struct tty_struct *tty;
1388 int status; 1478 int status;
1389 1479
1390 dbg("%s - port %d", __func__, port->number); 1480 dbg("%s - port %d", __func__, port->number);
@@ -1397,28 +1487,21 @@ static void edge_throttle (struct usb_serial_port *port)
1397 return; 1487 return;
1398 } 1488 }
1399 1489
1400 tty = port->tty;
1401 if (!tty) {
1402 dbg ("%s - no tty available", __func__);
1403 return;
1404 }
1405
1406 /* if we are implementing XON/XOFF, send the stop character */ 1490 /* if we are implementing XON/XOFF, send the stop character */
1407 if (I_IXOFF(tty)) { 1491 if (I_IXOFF(tty)) {
1408 unsigned char stop_char = STOP_CHAR(tty); 1492 unsigned char stop_char = STOP_CHAR(tty);
1409 status = edge_write (port, &stop_char, 1); 1493 status = edge_write(tty, port, &stop_char, 1);
1410 if (status <= 0) { 1494 if (status <= 0)
1411 return; 1495 return;
1412 }
1413 } 1496 }
1414 1497
1415 /* if we are implementing RTS/CTS, toggle that line */ 1498 /* if we are implementing RTS/CTS, toggle that line */
1416 if (tty->termios->c_cflag & CRTSCTS) { 1499 if (tty->termios->c_cflag & CRTSCTS) {
1417 edge_port->shadowMCR &= ~MCR_RTS; 1500 edge_port->shadowMCR &= ~MCR_RTS;
1418 status = send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR); 1501 status = send_cmd_write_uart_register(edge_port, MCR,
1419 if (status != 0) { 1502 edge_port->shadowMCR);
1503 if (status != 0)
1420 return; 1504 return;
1421 }
1422 } 1505 }
1423 1506
1424 return; 1507 return;
@@ -1427,13 +1510,13 @@ static void edge_throttle (struct usb_serial_port *port)
1427 1510
1428/***************************************************************************** 1511/*****************************************************************************
1429 * edge_unthrottle 1512 * edge_unthrottle
1430 * this function is called by the tty driver when it wants to resume the data 1513 * this function is called by the tty driver when it wants to resume the
1431 * being read from the port (called after SerialThrottle is called) 1514 * data being read from the port (called after SerialThrottle is called)
1432 *****************************************************************************/ 1515 *****************************************************************************/
1433static void edge_unthrottle (struct usb_serial_port *port) 1516static void edge_unthrottle(struct tty_struct *tty)
1434{ 1517{
1518 struct usb_serial_port *port = tty->driver_data;
1435 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1519 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1436 struct tty_struct *tty;
1437 int status; 1520 int status;
1438 1521
1439 dbg("%s - port %d", __func__, port->number); 1522 dbg("%s - port %d", __func__, port->number);
@@ -1446,43 +1529,31 @@ static void edge_unthrottle (struct usb_serial_port *port)
1446 return; 1529 return;
1447 } 1530 }
1448 1531
1449 tty = port->tty;
1450 if (!tty) {
1451 dbg ("%s - no tty available", __func__);
1452 return;
1453 }
1454
1455 /* if we are implementing XON/XOFF, send the start character */ 1532 /* if we are implementing XON/XOFF, send the start character */
1456 if (I_IXOFF(tty)) { 1533 if (I_IXOFF(tty)) {
1457 unsigned char start_char = START_CHAR(tty); 1534 unsigned char start_char = START_CHAR(tty);
1458 status = edge_write (port, &start_char, 1); 1535 status = edge_write(tty, port, &start_char, 1);
1459 if (status <= 0) { 1536 if (status <= 0)
1460 return; 1537 return;
1461 }
1462 } 1538 }
1463
1464 /* if we are implementing RTS/CTS, toggle that line */ 1539 /* if we are implementing RTS/CTS, toggle that line */
1465 if (tty->termios->c_cflag & CRTSCTS) { 1540 if (tty->termios->c_cflag & CRTSCTS) {
1466 edge_port->shadowMCR |= MCR_RTS; 1541 edge_port->shadowMCR |= MCR_RTS;
1467 status = send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR); 1542 send_cmd_write_uart_register(edge_port, MCR,
1468 if (status != 0) { 1543 edge_port->shadowMCR);
1469 return;
1470 }
1471 } 1544 }
1472
1473 return;
1474} 1545}
1475 1546
1476 1547
1477/***************************************************************************** 1548/*****************************************************************************
1478 * SerialSetTermios 1549 * SerialSetTermios
1479 * this function is called by the tty driver when it wants to change the termios structure 1550 * this function is called by the tty driver when it wants to change
1551 * the termios structure
1480 *****************************************************************************/ 1552 *****************************************************************************/
1481static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 1553static void edge_set_termios(struct tty_struct *tty,
1554 struct usb_serial_port *port, struct ktermios *old_termios)
1482{ 1555{
1483 /* FIXME: This function appears unused ?? */
1484 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1556 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1485 struct tty_struct *tty = port->tty;
1486 unsigned int cflag; 1557 unsigned int cflag;
1487 1558
1488 cflag = tty->termios->c_cflag; 1559 cflag = tty->termios->c_cflag;
@@ -1502,9 +1573,7 @@ static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old
1502 } 1573 }
1503 1574
1504 /* change the port settings to the new ones specified */ 1575 /* change the port settings to the new ones specified */
1505 change_port_settings (edge_port, old_termios); 1576 change_port_settings(tty, edge_port, old_termios);
1506
1507 return;
1508} 1577}
1509 1578
1510 1579
@@ -1516,9 +1585,10 @@ static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old
1516 * release the bus after transmitting. This must be done when 1585 * release the bus after transmitting. This must be done when
1517 * the transmit shift register is empty, not be done when the 1586 * the transmit shift register is empty, not be done when the
1518 * transmit holding register is empty. This functionality 1587 * transmit holding register is empty. This functionality
1519 * allows an RS485 driver to be written in user space. 1588 * allows an RS485 driver to be written in user space.
1520 *****************************************************************************/ 1589 *****************************************************************************/
1521static int get_lsr_info(struct edgeport_port *edge_port, unsigned int __user *value) 1590static int get_lsr_info(struct edgeport_port *edge_port,
1591 unsigned int __user *value)
1522{ 1592{
1523 unsigned int result = 0; 1593 unsigned int result = 0;
1524 unsigned long flags; 1594 unsigned long flags;
@@ -1536,25 +1606,10 @@ static int get_lsr_info(struct edgeport_port *edge_port, unsigned int __user *va
1536 return 0; 1606 return 0;
1537} 1607}
1538 1608
1539static int get_number_bytes_avail(struct edgeport_port *edge_port, unsigned int __user *value) 1609static int edge_tiocmset(struct tty_struct *tty, struct file *file,
1540{ 1610 unsigned int set, unsigned int clear)
1541 unsigned int result = 0;
1542 struct tty_struct *tty = edge_port->port->tty;
1543
1544 if (!tty)
1545 return -ENOIOCTLCMD;
1546
1547 result = tty->read_cnt;
1548
1549 dbg("%s(%d) = %d", __func__, edge_port->port->number, result);
1550 if (copy_to_user(value, &result, sizeof(int)))
1551 return -EFAULT;
1552 //return 0;
1553 return -ENOIOCTLCMD;
1554}
1555
1556static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear)
1557{ 1611{
1612 struct usb_serial_port *port = tty->driver_data;
1558 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1613 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1559 unsigned int mcr; 1614 unsigned int mcr;
1560 1615
@@ -1582,8 +1637,9 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig
1582 return 0; 1637 return 0;
1583} 1638}
1584 1639
1585static int edge_tiocmget(struct usb_serial_port *port, struct file *file) 1640static int edge_tiocmget(struct tty_struct *tty, struct file *file)
1586{ 1641{
1642 struct usb_serial_port *port = tty->driver_data;
1587 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1643 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1588 unsigned int result = 0; 1644 unsigned int result = 0;
1589 unsigned int msr; 1645 unsigned int msr;
@@ -1606,7 +1662,8 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
1606 return result; 1662 return result;
1607} 1663}
1608 1664
1609static int get_serial_info(struct edgeport_port *edge_port, struct serial_struct __user *retinfo) 1665static int get_serial_info(struct edgeport_port *edge_port,
1666 struct serial_struct __user *retinfo)
1610{ 1667{
1611 struct serial_struct tmp; 1668 struct serial_struct tmp;
1612 1669
@@ -1624,9 +1681,6 @@ static int get_serial_info(struct edgeport_port *edge_port, struct serial_struct
1624 tmp.baud_base = 9600; 1681 tmp.baud_base = 9600;
1625 tmp.close_delay = 5*HZ; 1682 tmp.close_delay = 5*HZ;
1626 tmp.closing_wait = 30*HZ; 1683 tmp.closing_wait = 30*HZ;
1627// tmp.custom_divisor = state->custom_divisor;
1628// tmp.hub6 = state->hub6;
1629// tmp.io_type = state->io_type;
1630 1684
1631 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 1685 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1632 return -EFAULT; 1686 return -EFAULT;
@@ -1639,8 +1693,10 @@ static int get_serial_info(struct edgeport_port *edge_port, struct serial_struct
1639 * SerialIoctl 1693 * SerialIoctl
1640 * this function handles any ioctl calls to the driver 1694 * this function handles any ioctl calls to the driver
1641 *****************************************************************************/ 1695 *****************************************************************************/
1642static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg) 1696static int edge_ioctl(struct tty_struct *tty, struct file *file,
1697 unsigned int cmd, unsigned long arg)
1643{ 1698{
1699 struct usb_serial_port *port = tty->driver_data;
1644 DEFINE_WAIT(wait); 1700 DEFINE_WAIT(wait);
1645 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1701 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1646 struct async_icount cnow; 1702 struct async_icount cnow;
@@ -1650,71 +1706,61 @@ static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned
1650 dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd); 1706 dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd);
1651 1707
1652 switch (cmd) { 1708 switch (cmd) {
1653 // return number of bytes available 1709 case TIOCSERGETLSR:
1654 case TIOCINQ: 1710 dbg("%s (%d) TIOCSERGETLSR", __func__, port->number);
1655 dbg("%s (%d) TIOCINQ", __func__, port->number); 1711 return get_lsr_info(edge_port, (unsigned int __user *) arg);
1656 return get_number_bytes_avail(edge_port, (unsigned int __user *) arg); 1712
1657 break; 1713 case TIOCGSERIAL:
1658 1714 dbg("%s (%d) TIOCGSERIAL", __func__, port->number);
1659 case TIOCSERGETLSR: 1715 return get_serial_info(edge_port, (struct serial_struct __user *) arg);
1660 dbg("%s (%d) TIOCSERGETLSR", __func__, port->number); 1716
1661 return get_lsr_info(edge_port, (unsigned int __user *) arg); 1717 case TIOCMIWAIT:
1662 return 0; 1718 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
1663 1719 cprev = edge_port->icount;
1664 case TIOCGSERIAL: 1720 while (1) {
1665 dbg("%s (%d) TIOCGSERIAL", __func__, port->number); 1721 prepare_to_wait(&edge_port->delta_msr_wait,
1666 return get_serial_info(edge_port, (struct serial_struct __user *) arg); 1722 &wait, TASK_INTERRUPTIBLE);
1667 1723 schedule();
1668 case TIOCSSERIAL: 1724 finish_wait(&edge_port->delta_msr_wait, &wait);
1669 dbg("%s (%d) TIOCSSERIAL", __func__, port->number); 1725 /* see if a signal did it */
1670 break; 1726 if (signal_pending(current))
1671 1727 return -ERESTARTSYS;
1672 case TIOCMIWAIT: 1728 cnow = edge_port->icount;
1673 dbg("%s (%d) TIOCMIWAIT", __func__, port->number); 1729 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
1674 cprev = edge_port->icount; 1730 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
1675 while (1) { 1731 return -EIO; /* no change => error */
1676 prepare_to_wait(&edge_port->delta_msr_wait, &wait, TASK_INTERRUPTIBLE); 1732 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1677 schedule(); 1733 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1678 finish_wait(&edge_port->delta_msr_wait, &wait); 1734 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1679 /* see if a signal did it */ 1735 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
1680 if (signal_pending(current)) 1736 return 0;
1681 return -ERESTARTSYS;
1682 cnow = edge_port->icount;
1683 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
1684 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
1685 return -EIO; /* no change => error */
1686 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1687 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1688 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1689 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
1690 return 0;
1691 }
1692 cprev = cnow;
1693 } 1737 }
1694 /* NOTREACHED */ 1738 cprev = cnow;
1695 break; 1739 }
1740 /* NOTREACHED */
1741 break;
1696 1742
1697 case TIOCGICOUNT: 1743 case TIOCGICOUNT:
1698 cnow = edge_port->icount; 1744 cnow = edge_port->icount;
1699 memset(&icount, 0, sizeof(icount)); 1745 memset(&icount, 0, sizeof(icount));
1700 icount.cts = cnow.cts; 1746 icount.cts = cnow.cts;
1701 icount.dsr = cnow.dsr; 1747 icount.dsr = cnow.dsr;
1702 icount.rng = cnow.rng; 1748 icount.rng = cnow.rng;
1703 icount.dcd = cnow.dcd; 1749 icount.dcd = cnow.dcd;
1704 icount.rx = cnow.rx; 1750 icount.rx = cnow.rx;
1705 icount.tx = cnow.tx; 1751 icount.tx = cnow.tx;
1706 icount.frame = cnow.frame; 1752 icount.frame = cnow.frame;
1707 icount.overrun = cnow.overrun; 1753 icount.overrun = cnow.overrun;
1708 icount.parity = cnow.parity; 1754 icount.parity = cnow.parity;
1709 icount.brk = cnow.brk; 1755 icount.brk = cnow.brk;
1710 icount.buf_overrun = cnow.buf_overrun; 1756 icount.buf_overrun = cnow.buf_overrun;
1711 1757
1712 dbg("%s (%d) TIOCGICOUNT RX=%d, TX=%d", __func__, port->number, icount.rx, icount.tx ); 1758 dbg("%s (%d) TIOCGICOUNT RX=%d, TX=%d",
1713 if (copy_to_user((void __user *)arg, &icount, sizeof(icount))) 1759 __func__, port->number, icount.rx, icount.tx);
1714 return -EFAULT; 1760 if (copy_to_user((void __user *)arg, &icount, sizeof(icount)))
1715 return 0; 1761 return -EFAULT;
1762 return 0;
1716 } 1763 }
1717
1718 return -ENOIOCTLCMD; 1764 return -ENOIOCTLCMD;
1719} 1765}
1720 1766
@@ -1723,8 +1769,9 @@ static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned
1723 * SerialBreak 1769 * SerialBreak
1724 * this function sends a break to the port 1770 * this function sends a break to the port
1725 *****************************************************************************/ 1771 *****************************************************************************/
1726static void edge_break (struct usb_serial_port *port, int break_state) 1772static void edge_break(struct tty_struct *tty, int break_state)
1727{ 1773{
1774 struct usb_serial_port *port = tty->driver_data;
1728 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1775 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1729 struct edgeport_serial *edge_serial = usb_get_serial_data(port->serial); 1776 struct edgeport_serial *edge_serial = usb_get_serial_data(port->serial);
1730 int status; 1777 int status;
@@ -1736,9 +1783,9 @@ static void edge_break (struct usb_serial_port *port, int break_state)
1736 edge_port->chaseResponsePending = true; 1783 edge_port->chaseResponsePending = true;
1737 1784
1738 dbg("%s - Sending IOSP_CMD_CHASE_PORT", __func__); 1785 dbg("%s - Sending IOSP_CMD_CHASE_PORT", __func__);
1739 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CHASE_PORT, 0); 1786 status = send_iosp_ext_cmd(edge_port, IOSP_CMD_CHASE_PORT, 0);
1740 if (status == 0) { 1787 if (status == 0) {
1741 // block until chase finished 1788 /* block until chase finished */
1742 block_until_chase_response(edge_port); 1789 block_until_chase_response(edge_port);
1743 } else { 1790 } else {
1744 edge_port->chaseResponsePending = false; 1791 edge_port->chaseResponsePending = false;
@@ -1750,14 +1797,16 @@ static void edge_break (struct usb_serial_port *port, int break_state)
1750 (edge_serial->epic_descriptor.Supports.IOSPSetClrBreak))) { 1797 (edge_serial->epic_descriptor.Supports.IOSPSetClrBreak))) {
1751 if (break_state == -1) { 1798 if (break_state == -1) {
1752 dbg("%s - Sending IOSP_CMD_SET_BREAK", __func__); 1799 dbg("%s - Sending IOSP_CMD_SET_BREAK", __func__);
1753 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_SET_BREAK, 0); 1800 status = send_iosp_ext_cmd(edge_port,
1801 IOSP_CMD_SET_BREAK, 0);
1754 } else { 1802 } else {
1755 dbg("%s - Sending IOSP_CMD_CLEAR_BREAK", __func__); 1803 dbg("%s - Sending IOSP_CMD_CLEAR_BREAK", __func__);
1756 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CLEAR_BREAK, 0); 1804 status = send_iosp_ext_cmd(edge_port,
1757 } 1805 IOSP_CMD_CLEAR_BREAK, 0);
1758 if (status) {
1759 dbg("%s - error sending break set/clear command.", __func__);
1760 } 1806 }
1807 if (status)
1808 dbg("%s - error sending break set/clear command.",
1809 __func__);
1761 } 1810 }
1762 1811
1763 return; 1812 return;
@@ -1768,7 +1817,8 @@ static void edge_break (struct usb_serial_port *port, int break_state)
1768 * process_rcvd_data 1817 * process_rcvd_data
1769 * this function handles the data received on the bulk in pipe. 1818 * this function handles the data received on the bulk in pipe.
1770 *****************************************************************************/ 1819 *****************************************************************************/
1771static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned char * buffer, __u16 bufferLength) 1820static void process_rcvd_data(struct edgeport_serial *edge_serial,
1821 unsigned char *buffer, __u16 bufferLength)
1772{ 1822{
1773 struct usb_serial_port *port; 1823 struct usb_serial_port *port;
1774 struct edgeport_port *edge_port; 1824 struct edgeport_port *edge_port;
@@ -1789,105 +1839,123 @@ static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned cha
1789 lastBufferLength = bufferLength; 1839 lastBufferLength = bufferLength;
1790 1840
1791 switch (edge_serial->rxState) { 1841 switch (edge_serial->rxState) {
1792 case EXPECT_HDR1: 1842 case EXPECT_HDR1:
1793 edge_serial->rxHeader1 = *buffer; 1843 edge_serial->rxHeader1 = *buffer;
1794 ++buffer; 1844 ++buffer;
1795 --bufferLength; 1845 --bufferLength;
1796 1846
1797 if (bufferLength == 0) { 1847 if (bufferLength == 0) {
1798 edge_serial->rxState = EXPECT_HDR2; 1848 edge_serial->rxState = EXPECT_HDR2;
1849 break;
1850 }
1851 /* otherwise, drop on through */
1852 case EXPECT_HDR2:
1853 edge_serial->rxHeader2 = *buffer;
1854 ++buffer;
1855 --bufferLength;
1856
1857 dbg("%s - Hdr1=%02X Hdr2=%02X", __func__,
1858 edge_serial->rxHeader1, edge_serial->rxHeader2);
1859 /* Process depending on whether this header is
1860 * data or status */
1861
1862 if (IS_CMD_STAT_HDR(edge_serial->rxHeader1)) {
1863 /* Decode this status header and go to
1864 * EXPECT_HDR1 (if we can process the status
1865 * with only 2 bytes), or go to EXPECT_HDR3 to
1866 * get the third byte. */
1867 edge_serial->rxPort =
1868 IOSP_GET_HDR_PORT(edge_serial->rxHeader1);
1869 edge_serial->rxStatusCode =
1870 IOSP_GET_STATUS_CODE(
1871 edge_serial->rxHeader1);
1872
1873 if (!IOSP_STATUS_IS_2BYTE(
1874 edge_serial->rxStatusCode)) {
1875 /* This status needs additional bytes.
1876 * Save what we have and then wait for
1877 * more data.
1878 */
1879 edge_serial->rxStatusParam
1880 = edge_serial->rxHeader2;
1881 edge_serial->rxState = EXPECT_HDR3;
1799 break; 1882 break;
1800 } 1883 }
1801 /* otherwise, drop on through */ 1884 /* We have all the header bytes, process the
1802 1885 status now */
1803 case EXPECT_HDR2: 1886 process_rcvd_status(edge_serial,
1804 edge_serial->rxHeader2 = *buffer; 1887 edge_serial->rxHeader2, 0);
1805 ++buffer; 1888 edge_serial->rxState = EXPECT_HDR1;
1806 --bufferLength; 1889 break;
1807 1890 } else {
1808 dbg("%s - Hdr1=%02X Hdr2=%02X", __func__, edge_serial->rxHeader1, edge_serial->rxHeader2); 1891 edge_serial->rxPort =
1809 1892 IOSP_GET_HDR_PORT(edge_serial->rxHeader1);
1810 // Process depending on whether this header is 1893 edge_serial->rxBytesRemaining =
1811 // data or status 1894 IOSP_GET_HDR_DATA_LEN(
1812 1895 edge_serial->rxHeader1,
1813 if (IS_CMD_STAT_HDR(edge_serial->rxHeader1)) { 1896 edge_serial->rxHeader2);
1814 // Decode this status header and goto EXPECT_HDR1 (if we 1897 dbg("%s - Data for Port %u Len %u",
1815 // can process the status with only 2 bytes), or goto 1898 __func__,
1816 // EXPECT_HDR3 to get the third byte. 1899 edge_serial->rxPort,
1817 1900 edge_serial->rxBytesRemaining);
1818 edge_serial->rxPort = IOSP_GET_HDR_PORT(edge_serial->rxHeader1); 1901
1819 edge_serial->rxStatusCode = IOSP_GET_STATUS_CODE(edge_serial->rxHeader1); 1902 /* ASSERT(DevExt->RxPort < DevExt->NumPorts);
1820 1903 * ASSERT(DevExt->RxBytesRemaining <
1821 if (!IOSP_STATUS_IS_2BYTE(edge_serial->rxStatusCode)) { 1904 * IOSP_MAX_DATA_LENGTH);
1822 // This status needs additional bytes. Save what we have 1905 */
1823 // and then wait for more data.
1824 edge_serial->rxStatusParam = edge_serial->rxHeader2;
1825
1826 edge_serial->rxState = EXPECT_HDR3;
1827 break;
1828 }
1829 1906
1830 // We have all the header bytes, process the status now 1907 if (bufferLength == 0) {
1831 process_rcvd_status (edge_serial, edge_serial->rxHeader2, 0); 1908 edge_serial->rxState = EXPECT_DATA;
1832 edge_serial->rxState = EXPECT_HDR1;
1833 break; 1909 break;
1834 } else {
1835 edge_serial->rxPort = IOSP_GET_HDR_PORT(edge_serial->rxHeader1);
1836 edge_serial->rxBytesRemaining = IOSP_GET_HDR_DATA_LEN(edge_serial->rxHeader1, edge_serial->rxHeader2);
1837
1838 dbg("%s - Data for Port %u Len %u", __func__, edge_serial->rxPort, edge_serial->rxBytesRemaining);
1839
1840 //ASSERT( DevExt->RxPort < DevExt->NumPorts );
1841 //ASSERT( DevExt->RxBytesRemaining < IOSP_MAX_DATA_LENGTH );
1842
1843 if (bufferLength == 0 ) {
1844 edge_serial->rxState = EXPECT_DATA;
1845 break;
1846 }
1847 // Else, drop through
1848 } 1910 }
1911 /* Else, drop through */
1912 }
1913 case EXPECT_DATA: /* Expect data */
1914 if (bufferLength < edge_serial->rxBytesRemaining) {
1915 rxLen = bufferLength;
1916 /* Expect data to start next buffer */
1917 edge_serial->rxState = EXPECT_DATA;
1918 } else {
1919 /* BufLen >= RxBytesRemaining */
1920 rxLen = edge_serial->rxBytesRemaining;
1921 /* Start another header next time */
1922 edge_serial->rxState = EXPECT_HDR1;
1923 }
1849 1924
1850 case EXPECT_DATA: // Expect data 1925 bufferLength -= rxLen;
1851 1926 edge_serial->rxBytesRemaining -= rxLen;
1852 if (bufferLength < edge_serial->rxBytesRemaining) {
1853 rxLen = bufferLength;
1854 edge_serial->rxState = EXPECT_DATA; // Expect data to start next buffer
1855 } else {
1856 // BufLen >= RxBytesRemaining
1857 rxLen = edge_serial->rxBytesRemaining;
1858 edge_serial->rxState = EXPECT_HDR1; // Start another header next time
1859 }
1860 1927
1861 bufferLength -= rxLen; 1928 /* spit this data back into the tty driver if this
1862 edge_serial->rxBytesRemaining -= rxLen; 1929 port is open */
1863 1930 if (rxLen) {
1864 /* spit this data back into the tty driver if this port is open */ 1931 port = edge_serial->serial->port[
1865 if (rxLen) { 1932 edge_serial->rxPort];
1866 port = edge_serial->serial->port[edge_serial->rxPort]; 1933 edge_port = usb_get_serial_port_data(port);
1867 edge_port = usb_get_serial_port_data(port); 1934 if (edge_port->open) {
1868 if (edge_port->open) { 1935 tty = edge_port->port->port.tty;
1869 tty = edge_port->port->tty; 1936 if (tty) {
1870 if (tty) { 1937 dbg("%s - Sending %d bytes to TTY for port %d",
1871 dbg("%s - Sending %d bytes to TTY for port %d", __func__, rxLen, edge_serial->rxPort); 1938 __func__, rxLen, edge_serial->rxPort);
1872 edge_tty_recv(&edge_serial->serial->dev->dev, tty, buffer, rxLen); 1939 edge_tty_recv(&edge_serial->serial->dev->dev, tty, buffer, rxLen);
1873 }
1874 edge_port->icount.rx += rxLen;
1875 } 1940 }
1876 buffer += rxLen; 1941 edge_port->icount.rx += rxLen;
1877 } 1942 }
1943 buffer += rxLen;
1944 }
1945 break;
1878 1946
1879 break; 1947 case EXPECT_HDR3: /* Expect 3rd byte of status header */
1880 1948 edge_serial->rxHeader3 = *buffer;
1881 case EXPECT_HDR3: // Expect 3rd byte of status header 1949 ++buffer;
1882 edge_serial->rxHeader3 = *buffer; 1950 --bufferLength;
1883 ++buffer; 1951
1884 --bufferLength; 1952 /* We have all the header bytes, process the
1885 1953 status now */
1886 // We have all the header bytes, process the status now 1954 process_rcvd_status(edge_serial,
1887 process_rcvd_status (edge_serial, edge_serial->rxStatusParam, edge_serial->rxHeader3); 1955 edge_serial->rxStatusParam,
1888 edge_serial->rxState = EXPECT_HDR1; 1956 edge_serial->rxHeader3);
1889 break; 1957 edge_serial->rxState = EXPECT_HDR1;
1890 1958 break;
1891 } 1959 }
1892 } 1960 }
1893} 1961}
@@ -1895,9 +1963,11 @@ static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned cha
1895 1963
1896/***************************************************************************** 1964/*****************************************************************************
1897 * process_rcvd_status 1965 * process_rcvd_status
1898 * this function handles the any status messages received on the bulk in pipe. 1966 * this function handles the any status messages received on the
1967 * bulk in pipe.
1899 *****************************************************************************/ 1968 *****************************************************************************/
1900static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2, __u8 byte3) 1969static void process_rcvd_status(struct edgeport_serial *edge_serial,
1970 __u8 byte2, __u8 byte3)
1901{ 1971{
1902 struct usb_serial_port *port; 1972 struct usb_serial_port *port;
1903 struct edgeport_port *edge_port; 1973 struct edgeport_port *edge_port;
@@ -1907,7 +1977,9 @@ static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2
1907 port = edge_serial->serial->port[edge_serial->rxPort]; 1977 port = edge_serial->serial->port[edge_serial->rxPort];
1908 edge_port = usb_get_serial_port_data(port); 1978 edge_port = usb_get_serial_port_data(port);
1909 if (edge_port == NULL) { 1979 if (edge_port == NULL) {
1910 dev_err(&edge_serial->serial->dev->dev, "%s - edge_port == NULL for port %d\n", __func__, edge_serial->rxPort); 1980 dev_err(&edge_serial->serial->dev->dev,
1981 "%s - edge_port == NULL for port %d\n",
1982 __func__, edge_serial->rxPort);
1911 return; 1983 return;
1912 } 1984 }
1913 1985
@@ -1915,22 +1987,28 @@ static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2
1915 1987
1916 if (code == IOSP_EXT_STATUS) { 1988 if (code == IOSP_EXT_STATUS) {
1917 switch (byte2) { 1989 switch (byte2) {
1918 case IOSP_EXT_STATUS_CHASE_RSP: 1990 case IOSP_EXT_STATUS_CHASE_RSP:
1919 // we want to do EXT status regardless of port open/closed 1991 /* we want to do EXT status regardless of port
1920 dbg("%s - Port %u EXT CHASE_RSP Data = %02x", __func__, edge_serial->rxPort, byte3 ); 1992 * open/closed */
1921 // Currently, the only EXT_STATUS is Chase, so process here instead of one more call 1993 dbg("%s - Port %u EXT CHASE_RSP Data = %02x",
1922 // to one more subroutine. If/when more EXT_STATUS, there'll be more work to do. 1994 __func__, edge_serial->rxPort, byte3);
1923 // Also, we currently clear flag and close the port regardless of content of above's Byte3. 1995 /* Currently, the only EXT_STATUS is Chase, so process
1924 // We could choose to do something else when Byte3 says Timeout on Chase from Edgeport, 1996 * here instead of one more call to one more subroutine
1925 // like wait longer in block_until_chase_response, but for now we don't. 1997 * If/when more EXT_STATUS, there'll be more work to do
1926 edge_port->chaseResponsePending = false; 1998 * Also, we currently clear flag and close the port
1927 wake_up (&edge_port->wait_chase); 1999 * regardless of content of above's Byte3.
1928 return; 2000 * We could choose to do something else when Byte3 says
2001 * Timeout on Chase from Edgeport, like wait longer in
2002 * block_until_chase_response, but for now we don't.
2003 */
2004 edge_port->chaseResponsePending = false;
2005 wake_up(&edge_port->wait_chase);
2006 return;
1929 2007
1930 case IOSP_EXT_STATUS_RX_CHECK_RSP: 2008 case IOSP_EXT_STATUS_RX_CHECK_RSP:
1931 dbg("%s ========== Port %u CHECK_RSP Sequence = %02x =============\n", __func__, edge_serial->rxPort, byte3 ); 2009 dbg("%s ========== Port %u CHECK_RSP Sequence = %02x =============\n", __func__, edge_serial->rxPort, byte3);
1932 //Port->RxCheckRsp = true; 2010 /* Port->RxCheckRsp = true; */
1933 return; 2011 return;
1934 } 2012 }
1935 } 2013 }
1936 2014
@@ -1938,11 +2016,14 @@ static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2
1938 edge_port->txCredits = GET_TX_BUFFER_SIZE(byte3); 2016 edge_port->txCredits = GET_TX_BUFFER_SIZE(byte3);
1939 edge_port->maxTxCredits = edge_port->txCredits; 2017 edge_port->maxTxCredits = edge_port->txCredits;
1940 dbg("%s - Port %u Open Response Inital MSR = %02x TxBufferSize = %d", __func__, edge_serial->rxPort, byte2, edge_port->txCredits); 2018 dbg("%s - Port %u Open Response Inital MSR = %02x TxBufferSize = %d", __func__, edge_serial->rxPort, byte2, edge_port->txCredits);
1941 handle_new_msr (edge_port, byte2); 2019 handle_new_msr(edge_port, byte2);
1942 2020
1943 /* send the current line settings to the port so we are in sync with any further termios calls */ 2021 /* send the current line settings to the port so we are
1944 if (edge_port->port->tty) 2022 in sync with any further termios calls */
1945 change_port_settings (edge_port, edge_port->port->tty->termios); 2023 /* FIXME: locking on tty */
2024 if (edge_port->port->port.tty)
2025 change_port_settings(edge_port->port->port.tty,
2026 edge_port, edge_port->port->port.tty->termios);
1946 2027
1947 /* we have completed the open */ 2028 /* we have completed the open */
1948 edge_port->openPending = false; 2029 edge_port->openPending = false;
@@ -1951,45 +2032,49 @@ static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2
1951 return; 2032 return;
1952 } 2033 }
1953 2034
1954 // If port is closed, silently discard all rcvd status. We can 2035 /* If port is closed, silently discard all rcvd status. We can
1955 // have cases where buffered status is received AFTER the close 2036 * have cases where buffered status is received AFTER the close
1956 // port command is sent to the Edgeport. 2037 * port command is sent to the Edgeport.
1957 if (!edge_port->open || edge_port->closePending) { 2038 */
2039 if (!edge_port->open || edge_port->closePending)
1958 return; 2040 return;
1959 }
1960 2041
1961 switch (code) { 2042 switch (code) {
1962 // Not currently sent by Edgeport 2043 /* Not currently sent by Edgeport */
1963 case IOSP_STATUS_LSR: 2044 case IOSP_STATUS_LSR:
1964 dbg("%s - Port %u LSR Status = %02x", __func__, edge_serial->rxPort, byte2); 2045 dbg("%s - Port %u LSR Status = %02x",
1965 handle_new_lsr(edge_port, false, byte2, 0); 2046 __func__, edge_serial->rxPort, byte2);
1966 break; 2047 handle_new_lsr(edge_port, false, byte2, 0);
2048 break;
1967 2049
1968 case IOSP_STATUS_LSR_DATA: 2050 case IOSP_STATUS_LSR_DATA:
1969 dbg("%s - Port %u LSR Status = %02x, Data = %02x", __func__, edge_serial->rxPort, byte2, byte3); 2051 dbg("%s - Port %u LSR Status = %02x, Data = %02x",
1970 // byte2 is LSR Register 2052 __func__, edge_serial->rxPort, byte2, byte3);
1971 // byte3 is broken data byte 2053 /* byte2 is LSR Register */
1972 handle_new_lsr(edge_port, true, byte2, byte3); 2054 /* byte3 is broken data byte */
1973 break; 2055 handle_new_lsr(edge_port, true, byte2, byte3);
1974 // 2056 break;
1975 // case IOSP_EXT_4_STATUS: 2057 /*
1976 // dbg("%s - Port %u LSR Status = %02x Data = %02x", __func__, edge_serial->rxPort, byte2, byte3); 2058 * case IOSP_EXT_4_STATUS:
1977 // break; 2059 * dbg("%s - Port %u LSR Status = %02x Data = %02x",
1978 // 2060 * __func__, edge_serial->rxPort, byte2, byte3);
1979 case IOSP_STATUS_MSR: 2061 * break;
1980 dbg("%s - Port %u MSR Status = %02x", __func__, edge_serial->rxPort, byte2); 2062 */
1981 2063 case IOSP_STATUS_MSR:
1982 // Process this new modem status and generate appropriate 2064 dbg("%s - Port %u MSR Status = %02x",
1983 // events, etc, based on the new status. This routine 2065 __func__, edge_serial->rxPort, byte2);
1984 // also saves the MSR in Port->ShadowMsr. 2066 /*
1985 handle_new_msr(edge_port, byte2); 2067 * Process this new modem status and generate appropriate
1986 break; 2068 * events, etc, based on the new status. This routine
2069 * also saves the MSR in Port->ShadowMsr.
2070 */
2071 handle_new_msr(edge_port, byte2);
2072 break;
1987 2073
1988 default: 2074 default:
1989 dbg("%s - Unrecognized IOSP status code %u\n", __func__, code); 2075 dbg("%s - Unrecognized IOSP status code %u\n", __func__, code);
1990 break; 2076 break;
1991 } 2077 }
1992
1993 return; 2078 return;
1994} 2079}
1995 2080
@@ -1998,7 +2083,8 @@ static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2
1998 * edge_tty_recv 2083 * edge_tty_recv
1999 * this function passes data on to the tty flip buffer 2084 * this function passes data on to the tty flip buffer
2000 *****************************************************************************/ 2085 *****************************************************************************/
2001static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length) 2086static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
2087 unsigned char *data, int length)
2002{ 2088{
2003 int cnt; 2089 int cnt;
2004 2090
@@ -2007,7 +2093,7 @@ static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned c
2007 if (cnt < length) { 2093 if (cnt < length) {
2008 dev_err(dev, "%s - dropping data, %d bytes lost\n", 2094 dev_err(dev, "%s - dropping data, %d bytes lost\n",
2009 __func__, length - cnt); 2095 __func__, length - cnt);
2010 if(cnt == 0) 2096 if (cnt == 0)
2011 break; 2097 break;
2012 } 2098 }
2013 tty_insert_flip_string(tty, data, cnt); 2099 tty_insert_flip_string(tty, data, cnt);
@@ -2029,22 +2115,19 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr)
2029 2115
2030 dbg("%s %02x", __func__, newMsr); 2116 dbg("%s %02x", __func__, newMsr);
2031 2117
2032 if (newMsr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) { 2118 if (newMsr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR |
2119 EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
2033 icount = &edge_port->icount; 2120 icount = &edge_port->icount;
2034 2121
2035 /* update input line counters */ 2122 /* update input line counters */
2036 if (newMsr & EDGEPORT_MSR_DELTA_CTS) { 2123 if (newMsr & EDGEPORT_MSR_DELTA_CTS)
2037 icount->cts++; 2124 icount->cts++;
2038 } 2125 if (newMsr & EDGEPORT_MSR_DELTA_DSR)
2039 if (newMsr & EDGEPORT_MSR_DELTA_DSR) {
2040 icount->dsr++; 2126 icount->dsr++;
2041 } 2127 if (newMsr & EDGEPORT_MSR_DELTA_CD)
2042 if (newMsr & EDGEPORT_MSR_DELTA_CD) {
2043 icount->dcd++; 2128 icount->dcd++;
2044 } 2129 if (newMsr & EDGEPORT_MSR_DELTA_RI)
2045 if (newMsr & EDGEPORT_MSR_DELTA_RI) {
2046 icount->rng++; 2130 icount->rng++;
2047 }
2048 wake_up_interruptible(&edge_port->delta_msr_wait); 2131 wake_up_interruptible(&edge_port->delta_msr_wait);
2049 } 2132 }
2050 2133
@@ -2059,42 +2142,41 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr)
2059 * handle_new_lsr 2142 * handle_new_lsr
2060 * this function handles any change to the lsr register for a port. 2143 * this function handles any change to the lsr register for a port.
2061 *****************************************************************************/ 2144 *****************************************************************************/
2062static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData, __u8 lsr, __u8 data) 2145static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
2146 __u8 lsr, __u8 data)
2063{ 2147{
2064 __u8 newLsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK)); 2148 __u8 newLsr = (__u8) (lsr & (__u8)
2065 struct async_icount *icount; 2149 (LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK));
2150 struct async_icount *icount;
2066 2151
2067 dbg("%s - %02x", __func__, newLsr); 2152 dbg("%s - %02x", __func__, newLsr);
2068 2153
2069 edge_port->shadowLSR = lsr; 2154 edge_port->shadowLSR = lsr;
2070 2155
2071 if (newLsr & LSR_BREAK) { 2156 if (newLsr & LSR_BREAK) {
2072 // 2157 /*
2073 // Parity and Framing errors only count if they 2158 * Parity and Framing errors only count if they
2074 // occur exclusive of a break being 2159 * occur exclusive of a break being
2075 // received. 2160 * received.
2076 // 2161 */
2077 newLsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); 2162 newLsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
2078 } 2163 }
2079 2164
2080 /* Place LSR data byte into Rx buffer */ 2165 /* Place LSR data byte into Rx buffer */
2081 if (lsrData && edge_port->port->tty) 2166 if (lsrData && edge_port->port->port.tty)
2082 edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1); 2167 edge_tty_recv(&edge_port->port->dev,
2168 edge_port->port->port.tty, &data, 1);
2083 2169
2084 /* update input line counters */ 2170 /* update input line counters */
2085 icount = &edge_port->icount; 2171 icount = &edge_port->icount;
2086 if (newLsr & LSR_BREAK) { 2172 if (newLsr & LSR_BREAK)
2087 icount->brk++; 2173 icount->brk++;
2088 } 2174 if (newLsr & LSR_OVER_ERR)
2089 if (newLsr & LSR_OVER_ERR) {
2090 icount->overrun++; 2175 icount->overrun++;
2091 } 2176 if (newLsr & LSR_PAR_ERR)
2092 if (newLsr & LSR_PAR_ERR) {
2093 icount->parity++; 2177 icount->parity++;
2094 } 2178 if (newLsr & LSR_FRM_ERR)
2095 if (newLsr & LSR_FRM_ERR) {
2096 icount->frame++; 2179 icount->frame++;
2097 }
2098 2180
2099 return; 2181 return;
2100} 2182}
@@ -2102,12 +2184,13 @@ static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData, __u8 l
2102 2184
2103/**************************************************************************** 2185/****************************************************************************
2104 * sram_write 2186 * sram_write
2105 * writes a number of bytes to the Edgeport device's sram starting at the 2187 * writes a number of bytes to the Edgeport device's sram starting at the
2106 * given address. 2188 * given address.
2107 * If successful returns the number of bytes written, otherwise it returns 2189 * If successful returns the number of bytes written, otherwise it returns
2108 * a negative error number of the problem. 2190 * a negative error number of the problem.
2109 ****************************************************************************/ 2191 ****************************************************************************/
2110static int sram_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, const __u8 *data) 2192static int sram_write(struct usb_serial *serial, __u16 extAddr, __u16 addr,
2193 __u16 length, const __u8 *data)
2111{ 2194{
2112 int result; 2195 int result;
2113 __u16 current_length; 2196 __u16 current_length;
@@ -2115,32 +2198,37 @@ static int sram_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, __u1
2115 2198
2116 dbg("%s - %x, %x, %d", __func__, extAddr, addr, length); 2199 dbg("%s - %x, %x, %d", __func__, extAddr, addr, length);
2117 2200
2118 transfer_buffer = kmalloc (64, GFP_KERNEL); 2201 transfer_buffer = kmalloc(64, GFP_KERNEL);
2119 if (!transfer_buffer) { 2202 if (!transfer_buffer) {
2120 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __func__, 64); 2203 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n",
2204 __func__, 64);
2121 return -ENOMEM; 2205 return -ENOMEM;
2122 } 2206 }
2123 2207
2124 /* need to split these writes up into 64 byte chunks */ 2208 /* need to split these writes up into 64 byte chunks */
2125 result = 0; 2209 result = 0;
2126 while (length > 0) { 2210 while (length > 0) {
2127 if (length > 64) { 2211 if (length > 64)
2128 current_length = 64; 2212 current_length = 64;
2129 } else { 2213 else
2130 current_length = length; 2214 current_length = length;
2131 } 2215
2132// dbg("%s - writing %x, %x, %d", __func__, extAddr, addr, current_length); 2216/* dbg("%s - writing %x, %x, %d", __func__,
2133 memcpy (transfer_buffer, data, current_length); 2217 extAddr, addr, current_length); */
2134 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), USB_REQUEST_ION_WRITE_RAM, 2218 memcpy(transfer_buffer, data, current_length);
2135 0x40, addr, extAddr, transfer_buffer, current_length, 300); 2219 result = usb_control_msg(serial->dev,
2220 usb_sndctrlpipe(serial->dev, 0),
2221 USB_REQUEST_ION_WRITE_RAM,
2222 0x40, addr, extAddr, transfer_buffer,
2223 current_length, 300);
2136 if (result < 0) 2224 if (result < 0)
2137 break; 2225 break;
2138 length -= current_length; 2226 length -= current_length;
2139 addr += current_length; 2227 addr += current_length;
2140 data += current_length; 2228 data += current_length;
2141 } 2229 }
2142 2230
2143 kfree (transfer_buffer); 2231 kfree(transfer_buffer);
2144 return result; 2232 return result;
2145} 2233}
2146 2234
@@ -2152,40 +2240,45 @@ static int sram_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, __u1
2152 * If successful returns the number of bytes written, otherwise it returns 2240 * If successful returns the number of bytes written, otherwise it returns
2153 * a negative error number of the problem. 2241 * a negative error number of the problem.
2154 ****************************************************************************/ 2242 ****************************************************************************/
2155static int rom_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, const __u8 *data) 2243static int rom_write(struct usb_serial *serial, __u16 extAddr, __u16 addr,
2244 __u16 length, const __u8 *data)
2156{ 2245{
2157 int result; 2246 int result;
2158 __u16 current_length; 2247 __u16 current_length;
2159 unsigned char *transfer_buffer; 2248 unsigned char *transfer_buffer;
2160 2249
2161// dbg("%s - %x, %x, %d", __func__, extAddr, addr, length); 2250/* dbg("%s - %x, %x, %d", __func__, extAddr, addr, length); */
2162 2251
2163 transfer_buffer = kmalloc (64, GFP_KERNEL); 2252 transfer_buffer = kmalloc(64, GFP_KERNEL);
2164 if (!transfer_buffer) { 2253 if (!transfer_buffer) {
2165 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __func__, 64); 2254 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n",
2255 __func__, 64);
2166 return -ENOMEM; 2256 return -ENOMEM;
2167 } 2257 }
2168 2258
2169 /* need to split these writes up into 64 byte chunks */ 2259 /* need to split these writes up into 64 byte chunks */
2170 result = 0; 2260 result = 0;
2171 while (length > 0) { 2261 while (length > 0) {
2172 if (length > 64) { 2262 if (length > 64)
2173 current_length = 64; 2263 current_length = 64;
2174 } else { 2264 else
2175 current_length = length; 2265 current_length = length;
2176 } 2266/* dbg("%s - writing %x, %x, %d", __func__,
2177// dbg("%s - writing %x, %x, %d", __func__, extAddr, addr, current_length); 2267 extAddr, addr, current_length); */
2178 memcpy (transfer_buffer, data, current_length); 2268 memcpy(transfer_buffer, data, current_length);
2179 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), USB_REQUEST_ION_WRITE_ROM, 2269 result = usb_control_msg(serial->dev,
2180 0x40, addr, extAddr, transfer_buffer, current_length, 300); 2270 usb_sndctrlpipe(serial->dev, 0),
2271 USB_REQUEST_ION_WRITE_ROM, 0x40,
2272 addr, extAddr,
2273 transfer_buffer, current_length, 300);
2181 if (result < 0) 2274 if (result < 0)
2182 break; 2275 break;
2183 length -= current_length; 2276 length -= current_length;
2184 addr += current_length; 2277 addr += current_length;
2185 data += current_length; 2278 data += current_length;
2186 } 2279 }
2187 2280
2188 kfree (transfer_buffer); 2281 kfree(transfer_buffer);
2189 return result; 2282 return result;
2190} 2283}
2191 2284
@@ -2197,7 +2290,8 @@ static int rom_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16
2197 * If successful returns the number of bytes read, otherwise it returns 2290 * If successful returns the number of bytes read, otherwise it returns
2198 * a negative error number of the problem. 2291 * a negative error number of the problem.
2199 ****************************************************************************/ 2292 ****************************************************************************/
2200static int rom_read (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data) 2293static int rom_read(struct usb_serial *serial, __u16 extAddr,
2294 __u16 addr, __u16 length, __u8 *data)
2201{ 2295{
2202 int result; 2296 int result;
2203 __u16 current_length; 2297 __u16 current_length;
@@ -2205,32 +2299,36 @@ static int rom_read (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16
2205 2299
2206 dbg("%s - %x, %x, %d", __func__, extAddr, addr, length); 2300 dbg("%s - %x, %x, %d", __func__, extAddr, addr, length);
2207 2301
2208 transfer_buffer = kmalloc (64, GFP_KERNEL); 2302 transfer_buffer = kmalloc(64, GFP_KERNEL);
2209 if (!transfer_buffer) { 2303 if (!transfer_buffer) {
2210 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __func__, 64); 2304 dev_err(&serial->dev->dev,
2305 "%s - kmalloc(%d) failed.\n", __func__, 64);
2211 return -ENOMEM; 2306 return -ENOMEM;
2212 } 2307 }
2213 2308
2214 /* need to split these reads up into 64 byte chunks */ 2309 /* need to split these reads up into 64 byte chunks */
2215 result = 0; 2310 result = 0;
2216 while (length > 0) { 2311 while (length > 0) {
2217 if (length > 64) { 2312 if (length > 64)
2218 current_length = 64; 2313 current_length = 64;
2219 } else { 2314 else
2220 current_length = length; 2315 current_length = length;
2221 } 2316/* dbg("%s - %x, %x, %d", __func__,
2222// dbg("%s - %x, %x, %d", __func__, extAddr, addr, current_length); 2317 extAddr, addr, current_length); */
2223 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), USB_REQUEST_ION_READ_ROM, 2318 result = usb_control_msg(serial->dev,
2224 0xC0, addr, extAddr, transfer_buffer, current_length, 300); 2319 usb_rcvctrlpipe(serial->dev, 0),
2320 USB_REQUEST_ION_READ_ROM,
2321 0xC0, addr, extAddr, transfer_buffer,
2322 current_length, 300);
2225 if (result < 0) 2323 if (result < 0)
2226 break; 2324 break;
2227 memcpy (data, transfer_buffer, current_length); 2325 memcpy(data, transfer_buffer, current_length);
2228 length -= current_length; 2326 length -= current_length;
2229 addr += current_length; 2327 addr += current_length;
2230 data += current_length; 2328 data += current_length;
2231 } 2329 }
2232 2330
2233 kfree (transfer_buffer); 2331 kfree(transfer_buffer);
2234 return result; 2332 return result;
2235} 2333}
2236 2334
@@ -2239,7 +2337,8 @@ static int rom_read (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16
2239 * send_iosp_ext_cmd 2337 * send_iosp_ext_cmd
2240 * Is used to send a IOSP message to the Edgeport device 2338 * Is used to send a IOSP message to the Edgeport device
2241 ****************************************************************************/ 2339 ****************************************************************************/
2242static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u8 param) 2340static int send_iosp_ext_cmd(struct edgeport_port *edge_port,
2341 __u8 command, __u8 param)
2243{ 2342{
2244 unsigned char *buffer; 2343 unsigned char *buffer;
2245 unsigned char *currentCommand; 2344 unsigned char *currentCommand;
@@ -2248,19 +2347,20 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u
2248 2347
2249 dbg("%s - %d, %d", __func__, command, param); 2348 dbg("%s - %d, %d", __func__, command, param);
2250 2349
2251 buffer = kmalloc (10, GFP_ATOMIC); 2350 buffer = kmalloc(10, GFP_ATOMIC);
2252 if (!buffer) { 2351 if (!buffer) {
2253 dev_err(&edge_port->port->dev, "%s - kmalloc(%d) failed.\n", __func__, 10); 2352 dev_err(&edge_port->port->dev,
2353 "%s - kmalloc(%d) failed.\n", __func__, 10);
2254 return -ENOMEM; 2354 return -ENOMEM;
2255 } 2355 }
2256 2356
2257 currentCommand = buffer; 2357 currentCommand = buffer;
2258 2358
2259 MAKE_CMD_EXT_CMD (&currentCommand, &length, 2359 MAKE_CMD_EXT_CMD(&currentCommand, &length,
2260 edge_port->port->number - edge_port->port->serial->minor, 2360 edge_port->port->number - edge_port->port->serial->minor,
2261 command, param); 2361 command, param);
2262 2362
2263 status = write_cmd_usb (edge_port, buffer, length); 2363 status = write_cmd_usb(edge_port, buffer, length);
2264 if (status) { 2364 if (status) {
2265 /* something bad happened, let's free up the memory */ 2365 /* something bad happened, let's free up the memory */
2266 kfree(buffer); 2366 kfree(buffer);
@@ -2274,43 +2374,50 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u
2274 * write_cmd_usb 2374 * write_cmd_usb
2275 * this function writes the given buffer out to the bulk write endpoint. 2375 * this function writes the given buffer out to the bulk write endpoint.
2276 *****************************************************************************/ 2376 *****************************************************************************/
2277static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer, int length) 2377static int write_cmd_usb(struct edgeport_port *edge_port,
2378 unsigned char *buffer, int length)
2278{ 2379{
2279 struct edgeport_serial *edge_serial = usb_get_serial_data(edge_port->port->serial); 2380 struct edgeport_serial *edge_serial =
2381 usb_get_serial_data(edge_port->port->serial);
2280 int status = 0; 2382 int status = 0;
2281 struct urb *urb; 2383 struct urb *urb;
2282 int timeout; 2384 int timeout;
2283 2385
2284 usb_serial_debug_data(debug, &edge_port->port->dev, __func__, length, buffer); 2386 usb_serial_debug_data(debug, &edge_port->port->dev,
2387 __func__, length, buffer);
2285 2388
2286 /* Allocate our next urb */ 2389 /* Allocate our next urb */
2287 urb = usb_alloc_urb (0, GFP_ATOMIC); 2390 urb = usb_alloc_urb(0, GFP_ATOMIC);
2288 if (!urb) 2391 if (!urb)
2289 return -ENOMEM; 2392 return -ENOMEM;
2290 2393
2291 atomic_inc(&CmdUrbs); 2394 atomic_inc(&CmdUrbs);
2292 dbg("%s - ALLOCATE URB %p (outstanding %d)", __func__, urb, atomic_read(&CmdUrbs)); 2395 dbg("%s - ALLOCATE URB %p (outstanding %d)",
2396 __func__, urb, atomic_read(&CmdUrbs));
2293 2397
2294 usb_fill_bulk_urb (urb, edge_serial->serial->dev, 2398 usb_fill_bulk_urb(urb, edge_serial->serial->dev,
2295 usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint), 2399 usb_sndbulkpipe(edge_serial->serial->dev,
2296 buffer, length, edge_bulk_out_cmd_callback, edge_port); 2400 edge_serial->bulk_out_endpoint),
2401 buffer, length, edge_bulk_out_cmd_callback, edge_port);
2297 2402
2298 edge_port->commandPending = true; 2403 edge_port->commandPending = true;
2299 status = usb_submit_urb(urb, GFP_ATOMIC); 2404 status = usb_submit_urb(urb, GFP_ATOMIC);
2300 2405
2301 if (status) { 2406 if (status) {
2302 /* something went wrong */ 2407 /* something went wrong */
2303 dev_err(&edge_port->port->dev, "%s - usb_submit_urb(write command) failed, status = %d\n", __func__, status); 2408 dev_err(&edge_port->port->dev,
2409 "%s - usb_submit_urb(write command) failed, status = %d\n",
2410 __func__, status);
2304 usb_kill_urb(urb); 2411 usb_kill_urb(urb);
2305 usb_free_urb(urb); 2412 usb_free_urb(urb);
2306 atomic_dec(&CmdUrbs); 2413 atomic_dec(&CmdUrbs);
2307 return status; 2414 return status;
2308 } 2415 }
2309 2416
2310 // wait for command to finish 2417 /* wait for command to finish */
2311 timeout = COMMAND_TIMEOUT; 2418 timeout = COMMAND_TIMEOUT;
2312#if 0 2419#if 0
2313 wait_event (&edge_port->wait_command, !edge_port->commandPending); 2420 wait_event(&edge_port->wait_command, !edge_port->commandPending);
2314 2421
2315 if (edge_port->commandPending) { 2422 if (edge_port->commandPending) {
2316 /* command timed out */ 2423 /* command timed out */
@@ -2327,15 +2434,18 @@ static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer
2327 * this function sends the proper command to change the baud rate of the 2434 * this function sends the proper command to change the baud rate of the
2328 * specified port. 2435 * specified port.
2329 *****************************************************************************/ 2436 *****************************************************************************/
2330static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRate) 2437static int send_cmd_write_baud_rate(struct edgeport_port *edge_port,
2438 int baudRate)
2331{ 2439{
2332 struct edgeport_serial *edge_serial = usb_get_serial_data(edge_port->port->serial); 2440 struct edgeport_serial *edge_serial =
2441 usb_get_serial_data(edge_port->port->serial);
2333 unsigned char *cmdBuffer; 2442 unsigned char *cmdBuffer;
2334 unsigned char *currCmd; 2443 unsigned char *currCmd;
2335 int cmdLen = 0; 2444 int cmdLen = 0;
2336 int divisor; 2445 int divisor;
2337 int status; 2446 int status;
2338 unsigned char number = edge_port->port->number - edge_port->port->serial->minor; 2447 unsigned char number =
2448 edge_port->port->number - edge_port->port->serial->minor;
2339 2449
2340 if (edge_serial->is_epic && 2450 if (edge_serial->is_epic &&
2341 !edge_serial->epic_descriptor.Supports.IOSPSetBaudRate) { 2451 !edge_serial->epic_descriptor.Supports.IOSPSetBaudRate) {
@@ -2344,36 +2454,40 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa
2344 return 0; 2454 return 0;
2345 } 2455 }
2346 2456
2347 dbg("%s - port = %d, baud = %d", __func__, edge_port->port->number, baudRate); 2457 dbg("%s - port = %d, baud = %d", __func__,
2458 edge_port->port->number, baudRate);
2348 2459
2349 status = calc_baud_rate_divisor (baudRate, &divisor); 2460 status = calc_baud_rate_divisor(baudRate, &divisor);
2350 if (status) { 2461 if (status) {
2351 dev_err(&edge_port->port->dev, "%s - bad baud rate\n", __func__); 2462 dev_err(&edge_port->port->dev, "%s - bad baud rate\n",
2463 __func__);
2352 return status; 2464 return status;
2353 } 2465 }
2354 2466
2355 // Alloc memory for the string of commands. 2467 /* Alloc memory for the string of commands. */
2356 cmdBuffer = kmalloc (0x100, GFP_ATOMIC); 2468 cmdBuffer = kmalloc(0x100, GFP_ATOMIC);
2357 if (!cmdBuffer) { 2469 if (!cmdBuffer) {
2358 dev_err(&edge_port->port->dev, "%s - kmalloc(%d) failed.\n", __func__, 0x100); 2470 dev_err(&edge_port->port->dev,
2471 "%s - kmalloc(%d) failed.\n", __func__, 0x100);
2359 return -ENOMEM; 2472 return -ENOMEM;
2360 } 2473 }
2361 currCmd = cmdBuffer; 2474 currCmd = cmdBuffer;
2362 2475
2363 // Enable access to divisor latch 2476 /* Enable access to divisor latch */
2364 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, LCR, LCR_DL_ENABLE ); 2477 MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, number, LCR, LCR_DL_ENABLE);
2365 2478
2366 // Write the divisor itself 2479 /* Write the divisor itself */
2367 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, DLL, LOW8 (divisor) ); 2480 MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, number, DLL, LOW8(divisor));
2368 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, DLM, HIGH8(divisor) ); 2481 MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, number, DLM, HIGH8(divisor));
2369 2482
2370 // Restore original value to disable access to divisor latch 2483 /* Restore original value to disable access to divisor latch */
2371 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, LCR, edge_port->shadowLCR); 2484 MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, number, LCR,
2485 edge_port->shadowLCR);
2372 2486
2373 status = write_cmd_usb(edge_port, cmdBuffer, cmdLen ); 2487 status = write_cmd_usb(edge_port, cmdBuffer, cmdLen);
2374 if (status) { 2488 if (status) {
2375 /* something bad happened, let's free up the memory */ 2489 /* something bad happened, let's free up the memory */
2376 kfree (cmdBuffer); 2490 kfree(cmdBuffer);
2377 } 2491 }
2378 2492
2379 return status; 2493 return status;
@@ -2385,7 +2499,7 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa
2385 * this function calculates the proper baud rate divisor for the specified 2499 * this function calculates the proper baud rate divisor for the specified
2386 * baud rate. 2500 * baud rate.
2387 *****************************************************************************/ 2501 *****************************************************************************/
2388static int calc_baud_rate_divisor (int baudrate, int *divisor) 2502static int calc_baud_rate_divisor(int baudrate, int *divisor)
2389{ 2503{
2390 int i; 2504 int i;
2391 __u16 custom; 2505 __u16 custom;
@@ -2394,17 +2508,17 @@ static int calc_baud_rate_divisor (int baudrate, int *divisor)
2394 dbg("%s - %d", __func__, baudrate); 2508 dbg("%s - %d", __func__, baudrate);
2395 2509
2396 for (i = 0; i < ARRAY_SIZE(divisor_table); i++) { 2510 for (i = 0; i < ARRAY_SIZE(divisor_table); i++) {
2397 if ( divisor_table[i].BaudRate == baudrate ) { 2511 if (divisor_table[i].BaudRate == baudrate) {
2398 *divisor = divisor_table[i].Divisor; 2512 *divisor = divisor_table[i].Divisor;
2399 return 0; 2513 return 0;
2400 } 2514 }
2401 } 2515 }
2402 2516
2403 // We have tried all of the standard baud rates 2517 /* We have tried all of the standard baud rates
2404 // lets try to calculate the divisor for this baud rate 2518 * lets try to calculate the divisor for this baud rate
2405 // Make sure the baud rate is reasonable 2519 * Make sure the baud rate is reasonable */
2406 if (baudrate > 50 && baudrate < 230400) { 2520 if (baudrate > 50 && baudrate < 230400) {
2407 // get divisor 2521 /* get divisor */
2408 custom = (__u16)((230400L + baudrate/2) / baudrate); 2522 custom = (__u16)((230400L + baudrate/2) / baudrate);
2409 2523
2410 *divisor = custom; 2524 *divisor = custom;
@@ -2419,17 +2533,20 @@ static int calc_baud_rate_divisor (int baudrate, int *divisor)
2419 2533
2420/***************************************************************************** 2534/*****************************************************************************
2421 * send_cmd_write_uart_register 2535 * send_cmd_write_uart_register
2422 * this function builds up a uart register message and sends to to the device. 2536 * this function builds up a uart register message and sends to to the device.
2423 *****************************************************************************/ 2537 *****************************************************************************/
2424static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 regNum, __u8 regValue) 2538static int send_cmd_write_uart_register(struct edgeport_port *edge_port,
2539 __u8 regNum, __u8 regValue)
2425{ 2540{
2426 struct edgeport_serial *edge_serial = usb_get_serial_data(edge_port->port->serial); 2541 struct edgeport_serial *edge_serial =
2542 usb_get_serial_data(edge_port->port->serial);
2427 unsigned char *cmdBuffer; 2543 unsigned char *cmdBuffer;
2428 unsigned char *currCmd; 2544 unsigned char *currCmd;
2429 unsigned long cmdLen = 0; 2545 unsigned long cmdLen = 0;
2430 int status; 2546 int status;
2431 2547
2432 dbg("%s - write to %s register 0x%02x", (regNum == MCR) ? "MCR" : "LCR", __func__, regValue); 2548 dbg("%s - write to %s register 0x%02x",
2549 (regNum == MCR) ? "MCR" : "LCR", __func__, regValue);
2433 2550
2434 if (edge_serial->is_epic && 2551 if (edge_serial->is_epic &&
2435 !edge_serial->epic_descriptor.Supports.IOSPWriteMCR && 2552 !edge_serial->epic_descriptor.Supports.IOSPWriteMCR &&
@@ -2441,27 +2558,26 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r
2441 if (edge_serial->is_epic && 2558 if (edge_serial->is_epic &&
2442 !edge_serial->epic_descriptor.Supports.IOSPWriteLCR && 2559 !edge_serial->epic_descriptor.Supports.IOSPWriteLCR &&
2443 regNum == LCR) { 2560 regNum == LCR) {
2444 dbg ("SendCmdWriteUartReg - Not writing to LCR Register"); 2561 dbg("SendCmdWriteUartReg - Not writing to LCR Register");
2445 return 0; 2562 return 0;
2446 } 2563 }
2447 2564
2448 // Alloc memory for the string of commands. 2565 /* Alloc memory for the string of commands. */
2449 cmdBuffer = kmalloc (0x10, GFP_ATOMIC); 2566 cmdBuffer = kmalloc(0x10, GFP_ATOMIC);
2450 if (cmdBuffer == NULL ) { 2567 if (cmdBuffer == NULL)
2451 return -ENOMEM; 2568 return -ENOMEM;
2452 }
2453 2569
2454 currCmd = cmdBuffer; 2570 currCmd = cmdBuffer;
2455 2571
2456 // Build a cmd in the buffer to write the given register 2572 /* Build a cmd in the buffer to write the given register */
2457 MAKE_CMD_WRITE_REG (&currCmd, &cmdLen, 2573 MAKE_CMD_WRITE_REG(&currCmd, &cmdLen,
2458 edge_port->port->number - edge_port->port->serial->minor, 2574 edge_port->port->number - edge_port->port->serial->minor,
2459 regNum, regValue); 2575 regNum, regValue);
2460 2576
2461 status = write_cmd_usb(edge_port, cmdBuffer, cmdLen); 2577 status = write_cmd_usb(edge_port, cmdBuffer, cmdLen);
2462 if (status) { 2578 if (status) {
2463 /* something bad happened, let's free up the memory */ 2579 /* something bad happened, let's free up the memory */
2464 kfree (cmdBuffer); 2580 kfree(cmdBuffer);
2465 } 2581 }
2466 2582
2467 return status; 2583 return status;
@@ -2470,16 +2586,15 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r
2470 2586
2471/***************************************************************************** 2587/*****************************************************************************
2472 * change_port_settings 2588 * change_port_settings
2473 * This routine is called to set the UART on the device to match the specified 2589 * This routine is called to set the UART on the device to match the
2474 * new settings. 2590 * specified new settings.
2475 *****************************************************************************/ 2591 *****************************************************************************/
2476#ifndef CMSPAR 2592
2477#define CMSPAR 0 2593static void change_port_settings(struct tty_struct *tty,
2478#endif 2594 struct edgeport_port *edge_port, struct ktermios *old_termios)
2479static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios)
2480{ 2595{
2481 struct edgeport_serial *edge_serial = usb_get_serial_data(edge_port->port->serial); 2596 struct edgeport_serial *edge_serial =
2482 struct tty_struct *tty; 2597 usb_get_serial_data(edge_port->port->serial);
2483 int baud; 2598 int baud;
2484 unsigned cflag; 2599 unsigned cflag;
2485 __u8 mask = 0xff; 2600 __u8 mask = 0xff;
@@ -2498,21 +2613,26 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2498 return; 2613 return;
2499 } 2614 }
2500 2615
2501 tty = edge_port->port->tty;
2502 if ((!tty) ||
2503 (!tty->termios)) {
2504 dbg("%s - no tty structures", __func__);
2505 return;
2506 }
2507
2508 cflag = tty->termios->c_cflag; 2616 cflag = tty->termios->c_cflag;
2509 2617
2510 switch (cflag & CSIZE) { 2618 switch (cflag & CSIZE) {
2511 case CS5: lData = LCR_BITS_5; mask = 0x1f; dbg("%s - data bits = 5", __func__); break; 2619 case CS5:
2512 case CS6: lData = LCR_BITS_6; mask = 0x3f; dbg("%s - data bits = 6", __func__); break; 2620 lData = LCR_BITS_5; mask = 0x1f;
2513 case CS7: lData = LCR_BITS_7; mask = 0x7f; dbg("%s - data bits = 7", __func__); break; 2621 dbg("%s - data bits = 5", __func__);
2514 default: 2622 break;
2515 case CS8: lData = LCR_BITS_8; dbg("%s - data bits = 8", __func__); break; 2623 case CS6:
2624 lData = LCR_BITS_6; mask = 0x3f;
2625 dbg("%s - data bits = 6", __func__);
2626 break;
2627 case CS7:
2628 lData = LCR_BITS_7; mask = 0x7f;
2629 dbg("%s - data bits = 7", __func__);
2630 break;
2631 default:
2632 case CS8:
2633 lData = LCR_BITS_8;
2634 dbg("%s - data bits = 8", __func__);
2635 break;
2516 } 2636 }
2517 2637
2518 lParity = LCR_PAR_NONE; 2638 lParity = LCR_PAR_NONE;
@@ -2554,7 +2674,8 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2554 dbg("%s - RTS/CTS is disabled", __func__); 2674 dbg("%s - RTS/CTS is disabled", __func__);
2555 } 2675 }
2556 2676
2557 /* if we are implementing XON/XOFF, set the start and stop character in the device */ 2677 /* if we are implementing XON/XOFF, set the start and stop character
2678 in the device */
2558 if (I_IXOFF(tty) || I_IXON(tty)) { 2679 if (I_IXOFF(tty) || I_IXON(tty)) {
2559 unsigned char stop_char = STOP_CHAR(tty); 2680 unsigned char stop_char = STOP_CHAR(tty);
2560 unsigned char start_char = START_CHAR(tty); 2681 unsigned char start_char = START_CHAR(tty);
@@ -2562,14 +2683,17 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2562 if ((!edge_serial->is_epic) || 2683 if ((!edge_serial->is_epic) ||
2563 ((edge_serial->is_epic) && 2684 ((edge_serial->is_epic) &&
2564 (edge_serial->epic_descriptor.Supports.IOSPSetXChar))) { 2685 (edge_serial->epic_descriptor.Supports.IOSPSetXChar))) {
2565 send_iosp_ext_cmd(edge_port, IOSP_CMD_SET_XON_CHAR, start_char); 2686 send_iosp_ext_cmd(edge_port,
2566 send_iosp_ext_cmd(edge_port, IOSP_CMD_SET_XOFF_CHAR, stop_char); 2687 IOSP_CMD_SET_XON_CHAR, start_char);
2688 send_iosp_ext_cmd(edge_port,
2689 IOSP_CMD_SET_XOFF_CHAR, stop_char);
2567 } 2690 }
2568 2691
2569 /* if we are implementing INBOUND XON/XOFF */ 2692 /* if we are implementing INBOUND XON/XOFF */
2570 if (I_IXOFF(tty)) { 2693 if (I_IXOFF(tty)) {
2571 rxFlow |= IOSP_RX_FLOW_XON_XOFF; 2694 rxFlow |= IOSP_RX_FLOW_XON_XOFF;
2572 dbg("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", __func__, start_char, stop_char); 2695 dbg("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2696 __func__, start_char, stop_char);
2573 } else { 2697 } else {
2574 dbg("%s - INBOUND XON/XOFF is disabled", __func__); 2698 dbg("%s - INBOUND XON/XOFF is disabled", __func__);
2575 } 2699 }
@@ -2577,7 +2701,8 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2577 /* if we are implementing OUTBOUND XON/XOFF */ 2701 /* if we are implementing OUTBOUND XON/XOFF */
2578 if (I_IXON(tty)) { 2702 if (I_IXON(tty)) {
2579 txFlow |= IOSP_TX_FLOW_XON_XOFF; 2703 txFlow |= IOSP_TX_FLOW_XON_XOFF;
2580 dbg("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", __func__, start_char, stop_char); 2704 dbg("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2705 __func__, start_char, stop_char);
2581 } else { 2706 } else {
2582 dbg("%s - OUTBOUND XON/XOFF is disabled", __func__); 2707 dbg("%s - OUTBOUND XON/XOFF is disabled", __func__);
2583 } 2708 }
@@ -2600,20 +2725,20 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2600 edge_port->validDataMask = mask; 2725 edge_port->validDataMask = mask;
2601 2726
2602 /* Send the updated LCR value to the EdgePort */ 2727 /* Send the updated LCR value to the EdgePort */
2603 status = send_cmd_write_uart_register(edge_port, LCR, edge_port->shadowLCR); 2728 status = send_cmd_write_uart_register(edge_port, LCR,
2604 if (status != 0) { 2729 edge_port->shadowLCR);
2730 if (status != 0)
2605 return; 2731 return;
2606 }
2607 2732
2608 /* set up the MCR register and send it to the EdgePort */ 2733 /* set up the MCR register and send it to the EdgePort */
2609 edge_port->shadowMCR = MCR_MASTER_IE; 2734 edge_port->shadowMCR = MCR_MASTER_IE;
2610 if (cflag & CBAUD) { 2735 if (cflag & CBAUD)
2611 edge_port->shadowMCR |= (MCR_DTR | MCR_RTS); 2736 edge_port->shadowMCR |= (MCR_DTR | MCR_RTS);
2612 } 2737
2613 status = send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR); 2738 status = send_cmd_write_uart_register(edge_port, MCR,
2614 if (status != 0) { 2739 edge_port->shadowMCR);
2740 if (status != 0)
2615 return; 2741 return;
2616 }
2617 2742
2618 /* Determine divisor based on baud rate */ 2743 /* Determine divisor based on baud rate */
2619 baud = tty_get_baud_rate(tty); 2744 baud = tty_get_baud_rate(tty);
@@ -2623,7 +2748,7 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2623 } 2748 }
2624 2749
2625 dbg("%s - baud rate = %d", __func__, baud); 2750 dbg("%s - baud rate = %d", __func__, baud);
2626 status = send_cmd_write_baud_rate (edge_port, baud); 2751 status = send_cmd_write_baud_rate(edge_port, baud);
2627 if (status == -1) { 2752 if (status == -1) {
2628 /* Speed change was not possible - put back the old speed */ 2753 /* Speed change was not possible - put back the old speed */
2629 baud = tty_termios_baud_rate(old_termios); 2754 baud = tty_termios_baud_rate(old_termios);
@@ -2640,7 +2765,8 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2640 * ASCII range, but it's only for debugging... 2765 * ASCII range, but it's only for debugging...
2641 * NOTE: expects the unicode in LE format 2766 * NOTE: expects the unicode in LE format
2642 ****************************************************************************/ 2767 ****************************************************************************/
2643static void unicode_to_ascii(char *string, int buflen, __le16 *unicode, int unicode_size) 2768static void unicode_to_ascii(char *string, int buflen,
2769 __le16 *unicode, int unicode_size)
2644{ 2770{
2645 int i; 2771 int i;
2646 2772
@@ -2659,75 +2785,99 @@ static void unicode_to_ascii(char *string, int buflen, __le16 *unicode, int unic
2659 2785
2660/**************************************************************************** 2786/****************************************************************************
2661 * get_manufacturing_desc 2787 * get_manufacturing_desc
2662 * reads in the manufacturing descriptor and stores it into the serial 2788 * reads in the manufacturing descriptor and stores it into the serial
2663 * structure. 2789 * structure.
2664 ****************************************************************************/ 2790 ****************************************************************************/
2665static void get_manufacturing_desc (struct edgeport_serial *edge_serial) 2791static void get_manufacturing_desc(struct edgeport_serial *edge_serial)
2666{ 2792{
2667 int response; 2793 int response;
2668 2794
2669 dbg("getting manufacturer descriptor"); 2795 dbg("getting manufacturer descriptor");
2670 2796
2671 response = rom_read (edge_serial->serial, (EDGE_MANUF_DESC_ADDR & 0xffff0000) >> 16, 2797 response = rom_read(edge_serial->serial,
2672 (__u16)(EDGE_MANUF_DESC_ADDR & 0x0000ffff), EDGE_MANUF_DESC_LEN, 2798 (EDGE_MANUF_DESC_ADDR & 0xffff0000) >> 16,
2673 (__u8 *)(&edge_serial->manuf_descriptor)); 2799 (__u16)(EDGE_MANUF_DESC_ADDR & 0x0000ffff),
2800 EDGE_MANUF_DESC_LEN,
2801 (__u8 *)(&edge_serial->manuf_descriptor));
2674 2802
2675 if (response < 1) { 2803 if (response < 1)
2676 dev_err(&edge_serial->serial->dev->dev, "error in getting manufacturer descriptor\n"); 2804 dev_err(&edge_serial->serial->dev->dev,
2677 } else { 2805 "error in getting manufacturer descriptor\n");
2806 else {
2678 char string[30]; 2807 char string[30];
2679 dbg("**Manufacturer Descriptor"); 2808 dbg("**Manufacturer Descriptor");
2680 dbg(" RomSize: %dK", edge_serial->manuf_descriptor.RomSize); 2809 dbg(" RomSize: %dK",
2681 dbg(" RamSize: %dK", edge_serial->manuf_descriptor.RamSize); 2810 edge_serial->manuf_descriptor.RomSize);
2682 dbg(" CpuRev: %d", edge_serial->manuf_descriptor.CpuRev); 2811 dbg(" RamSize: %dK",
2683 dbg(" BoardRev: %d", edge_serial->manuf_descriptor.BoardRev); 2812 edge_serial->manuf_descriptor.RamSize);
2684 dbg(" NumPorts: %d", edge_serial->manuf_descriptor.NumPorts); 2813 dbg(" CpuRev: %d",
2685 dbg(" DescDate: %d/%d/%d", edge_serial->manuf_descriptor.DescDate[0], edge_serial->manuf_descriptor.DescDate[1], edge_serial->manuf_descriptor.DescDate[2]+1900); 2814 edge_serial->manuf_descriptor.CpuRev);
2815 dbg(" BoardRev: %d",
2816 edge_serial->manuf_descriptor.BoardRev);
2817 dbg(" NumPorts: %d",
2818 edge_serial->manuf_descriptor.NumPorts);
2819 dbg(" DescDate: %d/%d/%d",
2820 edge_serial->manuf_descriptor.DescDate[0],
2821 edge_serial->manuf_descriptor.DescDate[1],
2822 edge_serial->manuf_descriptor.DescDate[2]+1900);
2686 unicode_to_ascii(string, sizeof(string), 2823 unicode_to_ascii(string, sizeof(string),
2687 edge_serial->manuf_descriptor.SerialNumber, 2824 edge_serial->manuf_descriptor.SerialNumber,
2688 edge_serial->manuf_descriptor.SerNumLength/2); 2825 edge_serial->manuf_descriptor.SerNumLength/2);
2689 dbg(" SerialNumber: %s", string); 2826 dbg(" SerialNumber: %s", string);
2690 unicode_to_ascii(string, sizeof(string), 2827 unicode_to_ascii(string, sizeof(string),
2691 edge_serial->manuf_descriptor.AssemblyNumber, 2828 edge_serial->manuf_descriptor.AssemblyNumber,
2692 edge_serial->manuf_descriptor.AssemblyNumLength/2); 2829 edge_serial->manuf_descriptor.AssemblyNumLength/2);
2693 dbg(" AssemblyNumber: %s", string); 2830 dbg(" AssemblyNumber: %s", string);
2694 unicode_to_ascii(string, sizeof(string), 2831 unicode_to_ascii(string, sizeof(string),
2695 edge_serial->manuf_descriptor.OemAssyNumber, 2832 edge_serial->manuf_descriptor.OemAssyNumber,
2696 edge_serial->manuf_descriptor.OemAssyNumLength/2); 2833 edge_serial->manuf_descriptor.OemAssyNumLength/2);
2697 dbg(" OemAssyNumber: %s", string); 2834 dbg(" OemAssyNumber: %s", string);
2698 dbg(" UartType: %d", edge_serial->manuf_descriptor.UartType); 2835 dbg(" UartType: %d",
2699 dbg(" IonPid: %d", edge_serial->manuf_descriptor.IonPid); 2836 edge_serial->manuf_descriptor.UartType);
2700 dbg(" IonConfig: %d", edge_serial->manuf_descriptor.IonConfig); 2837 dbg(" IonPid: %d",
2838 edge_serial->manuf_descriptor.IonPid);
2839 dbg(" IonConfig: %d",
2840 edge_serial->manuf_descriptor.IonConfig);
2701 } 2841 }
2702} 2842}
2703 2843
2704 2844
2705/**************************************************************************** 2845/****************************************************************************
2706 * get_boot_desc 2846 * get_boot_desc
2707 * reads in the bootloader descriptor and stores it into the serial 2847 * reads in the bootloader descriptor and stores it into the serial
2708 * structure. 2848 * structure.
2709 ****************************************************************************/ 2849 ****************************************************************************/
2710static void get_boot_desc (struct edgeport_serial *edge_serial) 2850static void get_boot_desc(struct edgeport_serial *edge_serial)
2711{ 2851{
2712 int response; 2852 int response;
2713 2853
2714 dbg("getting boot descriptor"); 2854 dbg("getting boot descriptor");
2715 2855
2716 response = rom_read (edge_serial->serial, (EDGE_BOOT_DESC_ADDR & 0xffff0000) >> 16, 2856 response = rom_read(edge_serial->serial,
2717 (__u16)(EDGE_BOOT_DESC_ADDR & 0x0000ffff), EDGE_BOOT_DESC_LEN, 2857 (EDGE_BOOT_DESC_ADDR & 0xffff0000) >> 16,
2718 (__u8 *)(&edge_serial->boot_descriptor)); 2858 (__u16)(EDGE_BOOT_DESC_ADDR & 0x0000ffff),
2859 EDGE_BOOT_DESC_LEN,
2860 (__u8 *)(&edge_serial->boot_descriptor));
2719 2861
2720 if (response < 1) { 2862 if (response < 1)
2721 dev_err(&edge_serial->serial->dev->dev, "error in getting boot descriptor\n"); 2863 dev_err(&edge_serial->serial->dev->dev,
2722 } else { 2864 "error in getting boot descriptor\n");
2865 else {
2723 dbg("**Boot Descriptor:"); 2866 dbg("**Boot Descriptor:");
2724 dbg(" BootCodeLength: %d", le16_to_cpu(edge_serial->boot_descriptor.BootCodeLength)); 2867 dbg(" BootCodeLength: %d",
2725 dbg(" MajorVersion: %d", edge_serial->boot_descriptor.MajorVersion); 2868 le16_to_cpu(edge_serial->boot_descriptor.BootCodeLength));
2726 dbg(" MinorVersion: %d", edge_serial->boot_descriptor.MinorVersion); 2869 dbg(" MajorVersion: %d",
2727 dbg(" BuildNumber: %d", le16_to_cpu(edge_serial->boot_descriptor.BuildNumber)); 2870 edge_serial->boot_descriptor.MajorVersion);
2728 dbg(" Capabilities: 0x%x", le16_to_cpu(edge_serial->boot_descriptor.Capabilities)); 2871 dbg(" MinorVersion: %d",
2729 dbg(" UConfig0: %d", edge_serial->boot_descriptor.UConfig0); 2872 edge_serial->boot_descriptor.MinorVersion);
2730 dbg(" UConfig1: %d", edge_serial->boot_descriptor.UConfig1); 2873 dbg(" BuildNumber: %d",
2874 le16_to_cpu(edge_serial->boot_descriptor.BuildNumber));
2875 dbg(" Capabilities: 0x%x",
2876 le16_to_cpu(edge_serial->boot_descriptor.Capabilities));
2877 dbg(" UConfig0: %d",
2878 edge_serial->boot_descriptor.UConfig0);
2879 dbg(" UConfig1: %d",
2880 edge_serial->boot_descriptor.UConfig1);
2731 } 2881 }
2732} 2882}
2733 2883
@@ -2736,7 +2886,7 @@ static void get_boot_desc (struct edgeport_serial *edge_serial)
2736 * load_application_firmware 2886 * load_application_firmware
2737 * This is called to load the application firmware to the device 2887 * This is called to load the application firmware to the device
2738 ****************************************************************************/ 2888 ****************************************************************************/
2739static void load_application_firmware (struct edgeport_serial *edge_serial) 2889static void load_application_firmware(struct edgeport_serial *edge_serial)
2740{ 2890{
2741 const struct ihex_binrec *rec; 2891 const struct ihex_binrec *rec;
2742 const struct firmware *fw; 2892 const struct firmware *fw;
@@ -2813,7 +2963,7 @@ static void load_application_firmware (struct edgeport_serial *edge_serial)
2813/**************************************************************************** 2963/****************************************************************************
2814 * edge_startup 2964 * edge_startup
2815 ****************************************************************************/ 2965 ****************************************************************************/
2816static int edge_startup (struct usb_serial *serial) 2966static int edge_startup(struct usb_serial *serial)
2817{ 2967{
2818 struct edgeport_serial *edge_serial; 2968 struct edgeport_serial *edge_serial;
2819 struct edgeport_port *edge_port; 2969 struct edgeport_port *edge_port;
@@ -2855,10 +3005,10 @@ static int edge_startup (struct usb_serial *serial)
2855 sizeof(struct edge_compatibility_bits)); 3005 sizeof(struct edge_compatibility_bits));
2856 3006
2857 /* get the manufacturing descriptor for this device */ 3007 /* get the manufacturing descriptor for this device */
2858 get_manufacturing_desc (edge_serial); 3008 get_manufacturing_desc(edge_serial);
2859 3009
2860 /* get the boot descriptor */ 3010 /* get the boot descriptor */
2861 get_boot_desc (edge_serial); 3011 get_boot_desc(edge_serial);
2862 3012
2863 get_product_info(edge_serial); 3013 get_product_info(edge_serial);
2864 } 3014 }
@@ -2879,41 +3029,43 @@ static int edge_startup (struct usb_serial *serial)
2879 /* If not an EPiC device */ 3029 /* If not an EPiC device */
2880 if (!edge_serial->is_epic) { 3030 if (!edge_serial->is_epic) {
2881 /* now load the application firmware into this device */ 3031 /* now load the application firmware into this device */
2882 load_application_firmware (edge_serial); 3032 load_application_firmware(edge_serial);
2883 3033
2884 dbg("%s - time 2 %ld", __func__, jiffies); 3034 dbg("%s - time 2 %ld", __func__, jiffies);
2885 3035
2886 /* Check current Edgeport EEPROM and update if necessary */ 3036 /* Check current Edgeport EEPROM and update if necessary */
2887 update_edgeport_E2PROM (edge_serial); 3037 update_edgeport_E2PROM(edge_serial);
2888 3038
2889 dbg("%s - time 3 %ld", __func__, jiffies); 3039 dbg("%s - time 3 %ld", __func__, jiffies);
2890 3040
2891 /* set the configuration to use #1 */ 3041 /* set the configuration to use #1 */
2892// dbg("set_configuration 1"); 3042/* dbg("set_configuration 1"); */
2893// usb_set_configuration (dev, 1); 3043/* usb_set_configuration (dev, 1); */
2894 } 3044 }
2895 dbg(" FirmwareMajorVersion %d.%d.%d", 3045 dbg(" FirmwareMajorVersion %d.%d.%d",
2896 edge_serial->product_info.FirmwareMajorVersion, 3046 edge_serial->product_info.FirmwareMajorVersion,
2897 edge_serial->product_info.FirmwareMinorVersion, 3047 edge_serial->product_info.FirmwareMinorVersion,
2898 le16_to_cpu(edge_serial->product_info.FirmwareBuildNumber)); 3048 le16_to_cpu(edge_serial->product_info.FirmwareBuildNumber));
2899 3049
2900 /* we set up the pointers to the endpoints in the edge_open function, 3050 /* we set up the pointers to the endpoints in the edge_open function,
2901 * as the structures aren't created yet. */ 3051 * as the structures aren't created yet. */
2902 3052
2903 /* set up our port private structures */ 3053 /* set up our port private structures */
2904 for (i = 0; i < serial->num_ports; ++i) { 3054 for (i = 0; i < serial->num_ports; ++i) {
2905 edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL); 3055 edge_port = kmalloc(sizeof(struct edgeport_port), GFP_KERNEL);
2906 if (edge_port == NULL) { 3056 if (edge_port == NULL) {
2907 dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); 3057 dev_err(&serial->dev->dev, "%s - Out of memory\n",
3058 __func__);
2908 for (j = 0; j < i; ++j) { 3059 for (j = 0; j < i; ++j) {
2909 kfree (usb_get_serial_port_data(serial->port[j])); 3060 kfree(usb_get_serial_port_data(serial->port[j]));
2910 usb_set_serial_port_data(serial->port[j], NULL); 3061 usb_set_serial_port_data(serial->port[j],
3062 NULL);
2911 } 3063 }
2912 usb_set_serial_data(serial, NULL); 3064 usb_set_serial_data(serial, NULL);
2913 kfree(edge_serial); 3065 kfree(edge_serial);
2914 return -ENOMEM; 3066 return -ENOMEM;
2915 } 3067 }
2916 memset (edge_port, 0, sizeof(struct edgeport_port)); 3068 memset(edge_port, 0, sizeof(struct edgeport_port));
2917 spin_lock_init(&edge_port->ep_lock); 3069 spin_lock_init(&edge_port->ep_lock);
2918 edge_port->port = serial->port[i]; 3070 edge_port->port = serial->port[i];
2919 usb_set_serial_port_data(serial->port[i], edge_port); 3071 usb_set_serial_port_data(serial->port[i], edge_port);
@@ -2922,14 +3074,16 @@ static int edge_startup (struct usb_serial *serial)
2922 response = 0; 3074 response = 0;
2923 3075
2924 if (edge_serial->is_epic) { 3076 if (edge_serial->is_epic) {
2925 /* EPIC thing, set up our interrupt polling now and our read urb, so 3077 /* EPIC thing, set up our interrupt polling now and our read
2926 * that the device knows it really is connected. */ 3078 * urb, so that the device knows it really is connected. */
2927 interrupt_in_found = bulk_in_found = bulk_out_found = false; 3079 interrupt_in_found = bulk_in_found = bulk_out_found = false;
2928 for (i = 0; i < serial->interface->altsetting[0].desc.bNumEndpoints; ++i) { 3080 for (i = 0; i < serial->interface->altsetting[0]
3081 .desc.bNumEndpoints; ++i) {
2929 struct usb_endpoint_descriptor *endpoint; 3082 struct usb_endpoint_descriptor *endpoint;
2930 int buffer_size; 3083 int buffer_size;
2931 3084
2932 endpoint = &serial->interface->altsetting[0].endpoint[i].desc; 3085 endpoint = &serial->interface->altsetting[0].
3086 endpoint[i].desc;
2933 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); 3087 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
2934 if (!interrupt_in_found && 3088 if (!interrupt_in_found &&
2935 (usb_endpoint_is_int_in(endpoint))) { 3089 (usb_endpoint_is_int_in(endpoint))) {
@@ -2937,58 +3091,67 @@ static int edge_startup (struct usb_serial *serial)
2937 dbg("found interrupt in"); 3091 dbg("found interrupt in");
2938 3092
2939 /* not set up yet, so do it now */ 3093 /* not set up yet, so do it now */
2940 edge_serial->interrupt_read_urb = usb_alloc_urb(0, GFP_KERNEL); 3094 edge_serial->interrupt_read_urb =
3095 usb_alloc_urb(0, GFP_KERNEL);
2941 if (!edge_serial->interrupt_read_urb) { 3096 if (!edge_serial->interrupt_read_urb) {
2942 err("out of memory"); 3097 err("out of memory");
2943 return -ENOMEM; 3098 return -ENOMEM;
2944 } 3099 }
2945 edge_serial->interrupt_in_buffer = kmalloc(buffer_size, GFP_KERNEL); 3100 edge_serial->interrupt_in_buffer =
3101 kmalloc(buffer_size, GFP_KERNEL);
2946 if (!edge_serial->interrupt_in_buffer) { 3102 if (!edge_serial->interrupt_in_buffer) {
2947 err("out of memory"); 3103 err("out of memory");
2948 usb_free_urb(edge_serial->interrupt_read_urb); 3104 usb_free_urb(edge_serial->interrupt_read_urb);
2949 return -ENOMEM; 3105 return -ENOMEM;
2950 } 3106 }
2951 edge_serial->interrupt_in_endpoint = endpoint->bEndpointAddress; 3107 edge_serial->interrupt_in_endpoint =
3108 endpoint->bEndpointAddress;
2952 3109
2953 /* set up our interrupt urb */ 3110 /* set up our interrupt urb */
2954 usb_fill_int_urb(edge_serial->interrupt_read_urb, 3111 usb_fill_int_urb(
2955 dev, 3112 edge_serial->interrupt_read_urb,
2956 usb_rcvintpipe(dev, endpoint->bEndpointAddress), 3113 dev,
2957 edge_serial->interrupt_in_buffer, 3114 usb_rcvintpipe(dev,
2958 buffer_size, 3115 endpoint->bEndpointAddress),
2959 edge_interrupt_callback, 3116 edge_serial->interrupt_in_buffer,
2960 edge_serial, 3117 buffer_size,
2961 endpoint->bInterval); 3118 edge_interrupt_callback,
3119 edge_serial,
3120 endpoint->bInterval);
2962 3121
2963 interrupt_in_found = true; 3122 interrupt_in_found = true;
2964 } 3123 }
2965 3124
2966 if (!bulk_in_found && 3125 if (!bulk_in_found &&
2967 (usb_endpoint_is_bulk_in(endpoint))) { 3126 (usb_endpoint_is_bulk_in(endpoint))) {
2968 /* we found a bulk in endpoint */ 3127 /* we found a bulk in endpoint */
2969 dbg("found bulk in"); 3128 dbg("found bulk in");
2970 3129
2971 /* not set up yet, so do it now */ 3130 /* not set up yet, so do it now */
2972 edge_serial->read_urb = usb_alloc_urb(0, GFP_KERNEL); 3131 edge_serial->read_urb =
3132 usb_alloc_urb(0, GFP_KERNEL);
2973 if (!edge_serial->read_urb) { 3133 if (!edge_serial->read_urb) {
2974 err("out of memory"); 3134 err("out of memory");
2975 return -ENOMEM; 3135 return -ENOMEM;
2976 } 3136 }
2977 edge_serial->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL); 3137 edge_serial->bulk_in_buffer =
3138 kmalloc(buffer_size, GFP_KERNEL);
2978 if (!edge_serial->bulk_in_buffer) { 3139 if (!edge_serial->bulk_in_buffer) {
2979 err ("out of memory"); 3140 err("out of memory");
2980 usb_free_urb(edge_serial->read_urb); 3141 usb_free_urb(edge_serial->read_urb);
2981 return -ENOMEM; 3142 return -ENOMEM;
2982 } 3143 }
2983 edge_serial->bulk_in_endpoint = endpoint->bEndpointAddress; 3144 edge_serial->bulk_in_endpoint =
3145 endpoint->bEndpointAddress;
2984 3146
2985 /* set up our bulk in urb */ 3147 /* set up our bulk in urb */
2986 usb_fill_bulk_urb(edge_serial->read_urb, dev, 3148 usb_fill_bulk_urb(edge_serial->read_urb, dev,
2987 usb_rcvbulkpipe(dev, endpoint->bEndpointAddress), 3149 usb_rcvbulkpipe(dev,
2988 edge_serial->bulk_in_buffer, 3150 endpoint->bEndpointAddress),
2989 le16_to_cpu(endpoint->wMaxPacketSize), 3151 edge_serial->bulk_in_buffer,
2990 edge_bulk_in_callback, 3152 le16_to_cpu(endpoint->wMaxPacketSize),
2991 edge_serial); 3153 edge_bulk_in_callback,
3154 edge_serial);
2992 bulk_in_found = true; 3155 bulk_in_found = true;
2993 } 3156 }
2994 3157
@@ -2996,21 +3159,24 @@ static int edge_startup (struct usb_serial *serial)
2996 (usb_endpoint_is_bulk_out(endpoint))) { 3159 (usb_endpoint_is_bulk_out(endpoint))) {
2997 /* we found a bulk out endpoint */ 3160 /* we found a bulk out endpoint */
2998 dbg("found bulk out"); 3161 dbg("found bulk out");
2999 edge_serial->bulk_out_endpoint = endpoint->bEndpointAddress; 3162 edge_serial->bulk_out_endpoint =
3163 endpoint->bEndpointAddress;
3000 bulk_out_found = true; 3164 bulk_out_found = true;
3001 } 3165 }
3002 } 3166 }
3003 3167
3004 if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) { 3168 if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) {
3005 err ("Error - the proper endpoints were not found!"); 3169 err("Error - the proper endpoints were not found!");
3006 return -ENODEV; 3170 return -ENODEV;
3007 } 3171 }
3008 3172
3009 /* start interrupt read for this edgeport this interrupt will 3173 /* start interrupt read for this edgeport this interrupt will
3010 * continue as long as the edgeport is connected */ 3174 * continue as long as the edgeport is connected */
3011 response = usb_submit_urb(edge_serial->interrupt_read_urb, GFP_KERNEL); 3175 response = usb_submit_urb(edge_serial->interrupt_read_urb,
3176 GFP_KERNEL);
3012 if (response) 3177 if (response)
3013 err("%s - Error %d submitting control urb", __func__, response); 3178 err("%s - Error %d submitting control urb",
3179 __func__, response);
3014 } 3180 }
3015 return response; 3181 return response;
3016} 3182}
@@ -3020,7 +3186,7 @@ static int edge_startup (struct usb_serial *serial)
3020 * edge_shutdown 3186 * edge_shutdown
3021 * This function is called whenever the device is removed from the usb bus. 3187 * This function is called whenever the device is removed from the usb bus.
3022 ****************************************************************************/ 3188 ****************************************************************************/
3023static void edge_shutdown (struct usb_serial *serial) 3189static void edge_shutdown(struct usb_serial *serial)
3024{ 3190{
3025 struct edgeport_serial *edge_serial = usb_get_serial_data(serial); 3191 struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
3026 int i; 3192 int i;
@@ -3028,8 +3194,8 @@ static void edge_shutdown (struct usb_serial *serial)
3028 dbg("%s", __func__); 3194 dbg("%s", __func__);
3029 3195
3030 /* stop reads and writes on all ports */ 3196 /* stop reads and writes on all ports */
3031 for (i=0; i < serial->num_ports; ++i) { 3197 for (i = 0; i < serial->num_ports; ++i) {
3032 kfree (usb_get_serial_port_data(serial->port[i])); 3198 kfree(usb_get_serial_port_data(serial->port[i]));
3033 usb_set_serial_port_data(serial->port[i], NULL); 3199 usb_set_serial_port_data(serial->port[i], NULL);
3034 } 3200 }
3035 /* free up our endpoint stuff */ 3201 /* free up our endpoint stuff */
@@ -3069,7 +3235,7 @@ static int __init edgeport_init(void)
3069 if (retval) 3235 if (retval)
3070 goto failed_epic_device_register; 3236 goto failed_epic_device_register;
3071 retval = usb_register(&io_driver); 3237 retval = usb_register(&io_driver);
3072 if (retval) 3238 if (retval)
3073 goto failed_usb_register; 3239 goto failed_usb_register;
3074 atomic_set(&CmdUrbs, 0); 3240 atomic_set(&CmdUrbs, 0);
3075 info(DRIVER_DESC " " DRIVER_VERSION); 3241 info(DRIVER_DESC " " DRIVER_VERSION);
@@ -3094,19 +3260,19 @@ failed_2port_device_register:
3094 ****************************************************************************/ 3260 ****************************************************************************/
3095static void __exit edgeport_exit (void) 3261static void __exit edgeport_exit (void)
3096{ 3262{
3097 usb_deregister (&io_driver); 3263 usb_deregister(&io_driver);
3098 usb_serial_deregister (&edgeport_2port_device); 3264 usb_serial_deregister(&edgeport_2port_device);
3099 usb_serial_deregister (&edgeport_4port_device); 3265 usb_serial_deregister(&edgeport_4port_device);
3100 usb_serial_deregister (&edgeport_8port_device); 3266 usb_serial_deregister(&edgeport_8port_device);
3101 usb_serial_deregister (&epic_device); 3267 usb_serial_deregister(&epic_device);
3102} 3268}
3103 3269
3104module_init(edgeport_init); 3270module_init(edgeport_init);
3105module_exit(edgeport_exit); 3271module_exit(edgeport_exit);
3106 3272
3107/* Module information */ 3273/* Module information */
3108MODULE_AUTHOR( DRIVER_AUTHOR ); 3274MODULE_AUTHOR(DRIVER_AUTHOR);
3109MODULE_DESCRIPTION( DRIVER_DESC ); 3275MODULE_DESCRIPTION(DRIVER_DESC);
3110MODULE_LICENSE("GPL"); 3276MODULE_LICENSE("GPL");
3111MODULE_FIRMWARE("edgeport/boot.fw"); 3277MODULE_FIRMWARE("edgeport/boot.fw");
3112MODULE_FIRMWARE("edgeport/boot2.fw"); 3278MODULE_FIRMWARE("edgeport/boot2.fw");
diff --git a/drivers/usb/serial/io_tables.h b/drivers/usb/serial/io_tables.h
index 2ec85893f27a..7eb9d67b81b6 100644
--- a/drivers/usb/serial/io_tables.h
+++ b/drivers/usb/serial/io_tables.h
@@ -8,7 +8,7 @@
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or 9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version. 10 * (at your option) any later version.
11 * 11 *
12 */ 12 */
13 13
14#ifndef IO_TABLES_H 14#ifndef IO_TABLES_H
@@ -90,10 +90,10 @@ static struct usb_device_id id_table_combined [] = {
90 { USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A758) }, 90 { USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A758) },
91 { USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A794) }, 91 { USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A794) },
92 { USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A225) }, 92 { USB_DEVICE(USB_VENDOR_ID_AXIOHM, AXIOHM_DEVICE_ID_EPIC_A225) },
93 { } /* Terminating entry */ 93 { } /* Terminating entry */
94}; 94};
95 95
96MODULE_DEVICE_TABLE (usb, id_table_combined); 96MODULE_DEVICE_TABLE(usb, id_table_combined);
97 97
98static struct usb_driver io_driver = { 98static struct usb_driver io_driver = {
99 .name = "io_edgeport", 99 .name = "io_edgeport",
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
index 61daea3f7b2d..cb4c54316cf5 100644
--- a/drivers/usb/serial/io_ti.c
+++ b/drivers/usb/serial/io_ti.c
@@ -18,8 +18,8 @@
18 * 18 *
19 * Version history: 19 * Version history:
20 * 20 *
21 * July 11, 2002 Removed 4 port device structure since all TI UMP 21 * July 11, 2002 Removed 4 port device structure since all TI UMP
22 * chips have only 2 ports 22 * chips have only 2 ports
23 * David Iacovelli (davidi@ionetworks.com) 23 * David Iacovelli (davidi@ionetworks.com)
24 * 24 *
25 */ 25 */
@@ -38,7 +38,7 @@
38#include <linux/serial.h> 38#include <linux/serial.h>
39#include <linux/ioctl.h> 39#include <linux/ioctl.h>
40#include <linux/firmware.h> 40#include <linux/firmware.h>
41#include <asm/uaccess.h> 41#include <linux/uaccess.h>
42#include <linux/usb.h> 42#include <linux/usb.h>
43#include <linux/usb/serial.h> 43#include <linux/usb/serial.h>
44 44
@@ -57,18 +57,19 @@
57 57
58 58
59struct edgeport_uart_buf_desc { 59struct edgeport_uart_buf_desc {
60 __u32 count; // Number of bytes currently in buffer 60 __u32 count; /* Number of bytes currently in buffer */
61}; 61};
62 62
63/* different hardware types */ 63/* different hardware types */
64#define HARDWARE_TYPE_930 0 64#define HARDWARE_TYPE_930 0
65#define HARDWARE_TYPE_TIUMP 1 65#define HARDWARE_TYPE_TIUMP 1
66 66
67// IOCTL_PRIVATE_TI_GET_MODE Definitions 67/* IOCTL_PRIVATE_TI_GET_MODE Definitions */
68#define TI_MODE_CONFIGURING 0 // Device has not entered start device 68#define TI_MODE_CONFIGURING 0 /* Device has not entered start device */
69#define TI_MODE_BOOT 1 // Staying in boot mode 69#define TI_MODE_BOOT 1 /* Staying in boot mode */
70#define TI_MODE_DOWNLOAD 2 // Made it to download mode 70#define TI_MODE_DOWNLOAD 2 /* Made it to download mode */
71#define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode 71#define TI_MODE_TRANSITIONING 3 /* Currently in boot mode but
72 transitioning to download mode */
72 73
73/* read urb state */ 74/* read urb state */
74#define EDGE_READ_URB_RUNNING 0 75#define EDGE_READ_URB_RUNNING 0
@@ -82,10 +83,9 @@ struct edgeport_uart_buf_desc {
82 83
83 84
84/* Product information read from the Edgeport */ 85/* Product information read from the Edgeport */
85struct product_info 86struct product_info {
86{ 87 int TiMode; /* Current TI Mode */
87 int TiMode; // Current TI Mode 88 __u8 hardware_type; /* Type of hardware */
88 __u8 hardware_type; // Type of hardware
89} __attribute__((packed)); 89} __attribute__((packed));
90 90
91/* circular buffer */ 91/* circular buffer */
@@ -116,7 +116,7 @@ struct edgeport_port {
116 happen */ 116 happen */
117 struct edgeport_serial *edge_serial; 117 struct edgeport_serial *edge_serial;
118 struct usb_serial_port *port; 118 struct usb_serial_port *port;
119 __u8 bUartMode; /* Port type, 0: RS232, etc. */ 119 __u8 bUartMode; /* Port type, 0: RS232, etc. */
120 spinlock_t ep_lock; 120 spinlock_t ep_lock;
121 int ep_read_urb_state; 121 int ep_read_urb_state;
122 int ep_write_urb_in_use; 122 int ep_write_urb_in_use;
@@ -125,8 +125,9 @@ struct edgeport_port {
125 125
126struct edgeport_serial { 126struct edgeport_serial {
127 struct product_info product_info; 127 struct product_info product_info;
128 u8 TI_I2C_Type; // Type of I2C in UMP 128 u8 TI_I2C_Type; /* Type of I2C in UMP */
129 u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode 129 u8 TiReadI2C; /* Set to TRUE if we have read the
130 I2c in Boot Mode */
130 struct mutex es_lock; 131 struct mutex es_lock;
131 int num_ports_open; 132 int num_ports_open;
132 struct usb_serial *serial; 133 struct usb_serial *serial;
@@ -214,7 +215,7 @@ static struct usb_device_id id_table_combined [] = {
214 { } 215 { }
215}; 216};
216 217
217MODULE_DEVICE_TABLE (usb, id_table_combined); 218MODULE_DEVICE_TABLE(usb, id_table_combined);
218 219
219static struct usb_driver io_driver = { 220static struct usb_driver io_driver = {
220 .name = "io_ti", 221 .name = "io_ti",
@@ -231,20 +232,20 @@ static unsigned short OperationalBuildNumber;
231 232
232static int debug; 233static int debug;
233 234
234static int TIStayInBootMode = 0;
235static int low_latency = EDGE_LOW_LATENCY; 235static int low_latency = EDGE_LOW_LATENCY;
236static int closing_wait = EDGE_CLOSING_WAIT; 236static int closing_wait = EDGE_CLOSING_WAIT;
237static int ignore_cpu_rev = 0; 237static int ignore_cpu_rev;
238static int default_uart_mode = 0; /* RS232 */ 238static int default_uart_mode; /* RS232 */
239
240 239
241static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length); 240static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
241 unsigned char *data, int length);
242 242
243static void stop_read(struct edgeport_port *edge_port); 243static void stop_read(struct edgeport_port *edge_port);
244static int restart_read(struct edgeport_port *edge_port); 244static int restart_read(struct edgeport_port *edge_port);
245 245
246static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); 246static void edge_set_termios(struct tty_struct *tty,
247static void edge_send(struct usb_serial_port *port); 247 struct usb_serial_port *port, struct ktermios *old_termios);
248static void edge_send(struct tty_struct *tty);
248 249
249/* sysfs attributes */ 250/* sysfs attributes */
250static int edge_create_sysfs_attrs(struct usb_serial_port *port); 251static int edge_create_sysfs_attrs(struct usb_serial_port *port);
@@ -262,87 +263,57 @@ static unsigned int edge_buf_get(struct edge_buf *eb, char *buf,
262 unsigned int count); 263 unsigned int count);
263 264
264 265
265static int TIReadVendorRequestSync (struct usb_device *dev, 266static int ti_vread_sync(struct usb_device *dev, __u8 request,
266 __u8 request, 267 __u16 value, __u16 index, u8 *data, int size)
267 __u16 value,
268 __u16 index,
269 u8 *data,
270 int size)
271{ 268{
272 int status; 269 int status;
273 270
274 status = usb_control_msg (dev, 271 status = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
275 usb_rcvctrlpipe(dev, 0), 272 (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN),
276 request, 273 value, index, data, size, 1000);
277 (USB_TYPE_VENDOR |
278 USB_RECIP_DEVICE |
279 USB_DIR_IN),
280 value,
281 index,
282 data,
283 size,
284 1000);
285 if (status < 0) 274 if (status < 0)
286 return status; 275 return status;
287 if (status != size) { 276 if (status != size) {
288 dbg ("%s - wanted to write %d, but only wrote %d", 277 dbg("%s - wanted to write %d, but only wrote %d",
289 __func__, size, status); 278 __func__, size, status);
290 return -ECOMM; 279 return -ECOMM;
291 } 280 }
292 return 0; 281 return 0;
293} 282}
294 283
295static int TISendVendorRequestSync (struct usb_device *dev, 284static int ti_vsend_sync(struct usb_device *dev, __u8 request,
296 __u8 request, 285 __u16 value, __u16 index, u8 *data, int size)
297 __u16 value,
298 __u16 index,
299 u8 *data,
300 int size)
301{ 286{
302 int status; 287 int status;
303 288
304 status = usb_control_msg (dev, 289 status = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
305 usb_sndctrlpipe(dev, 0), 290 (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT),
306 request, 291 value, index, data, size, 1000);
307 (USB_TYPE_VENDOR |
308 USB_RECIP_DEVICE |
309 USB_DIR_OUT),
310 value,
311 index,
312 data,
313 size,
314 1000);
315 if (status < 0) 292 if (status < 0)
316 return status; 293 return status;
317 if (status != size) { 294 if (status != size) {
318 dbg ("%s - wanted to write %d, but only wrote %d", 295 dbg("%s - wanted to write %d, but only wrote %d",
319 __func__, size, status); 296 __func__, size, status);
320 return -ECOMM; 297 return -ECOMM;
321 } 298 }
322 return 0; 299 return 0;
323} 300}
324 301
325static int TIWriteCommandSync (struct usb_device *dev, __u8 command, 302static int send_cmd(struct usb_device *dev, __u8 command,
326 __u8 moduleid, __u16 value, u8 *data, 303 __u8 moduleid, __u16 value, u8 *data,
327 int size) 304 int size)
328{ 305{
329 return TISendVendorRequestSync (dev, 306 return ti_vsend_sync(dev, command, value, moduleid, data, size);
330 command, // Request
331 value, // wValue
332 moduleid, // wIndex
333 data, // TransferBuffer
334 size); // TransferBufferLength
335
336} 307}
337 308
338/* clear tx/rx buffers and fifo in TI UMP */ 309/* clear tx/rx buffers and fifo in TI UMP */
339static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask) 310static int purge_port(struct usb_serial_port *port, __u16 mask)
340{ 311{
341 int port_number = port->number - port->serial->minor; 312 int port_number = port->number - port->serial->minor;
342 313
343 dbg ("%s - port %d, mask %x", __func__, port_number, mask); 314 dbg("%s - port %d, mask %x", __func__, port_number, mask);
344 315
345 return TIWriteCommandSync (port->serial->dev, 316 return send_cmd(port->serial->dev,
346 UMPC_PURGE_PORT, 317 UMPC_PURGE_PORT,
347 (__u8)(UMPM_UART1_PORT + port_number), 318 (__u8)(UMPM_UART1_PORT + port_number),
348 mask, 319 mask,
@@ -351,92 +322,87 @@ static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask)
351} 322}
352 323
353/** 324/**
354 * TIReadDownloadMemory - Read edgeport memory from TI chip 325 * read_download_mem - Read edgeport memory from TI chip
355 * @dev: usb device pointer 326 * @dev: usb device pointer
356 * @start_address: Device CPU address at which to read 327 * @start_address: Device CPU address at which to read
357 * @length: Length of above data 328 * @length: Length of above data
358 * @address_type: Can read both XDATA and I2C 329 * @address_type: Can read both XDATA and I2C
359 * @buffer: pointer to input data buffer 330 * @buffer: pointer to input data buffer
360 */ 331 */
361static int TIReadDownloadMemory(struct usb_device *dev, int start_address, 332static int read_download_mem(struct usb_device *dev, int start_address,
362 int length, __u8 address_type, __u8 *buffer) 333 int length, __u8 address_type, __u8 *buffer)
363{ 334{
364 int status = 0; 335 int status = 0;
365 __u8 read_length; 336 __u8 read_length;
366 __be16 be_start_address; 337 __be16 be_start_address;
367 338
368 dbg ("%s - @ %x for %d", __func__, start_address, length); 339 dbg("%s - @ %x for %d", __func__, start_address, length);
369 340
370 /* Read in blocks of 64 bytes 341 /* Read in blocks of 64 bytes
371 * (TI firmware can't handle more than 64 byte reads) 342 * (TI firmware can't handle more than 64 byte reads)
372 */ 343 */
373 while (length) { 344 while (length) {
374 if (length > 64) 345 if (length > 64)
375 read_length= 64; 346 read_length = 64;
376 else 347 else
377 read_length = (__u8)length; 348 read_length = (__u8)length;
378 349
379 if (read_length > 1) { 350 if (read_length > 1) {
380 dbg ("%s - @ %x for %d", __func__, 351 dbg("%s - @ %x for %d", __func__,
381 start_address, read_length); 352 start_address, read_length);
382 } 353 }
383 be_start_address = cpu_to_be16 (start_address); 354 be_start_address = cpu_to_be16(start_address);
384 status = TIReadVendorRequestSync (dev, 355 status = ti_vread_sync(dev, UMPC_MEMORY_READ,
385 UMPC_MEMORY_READ, // Request 356 (__u16)address_type,
386 (__u16)address_type, // wValue (Address type) 357 (__force __u16)be_start_address,
387 (__force __u16)be_start_address, // wIndex (Address to read) 358 buffer, read_length);
388 buffer, // TransferBuffer
389 read_length); // TransferBufferLength
390 359
391 if (status) { 360 if (status) {
392 dbg ("%s - ERROR %x", __func__, status); 361 dbg("%s - ERROR %x", __func__, status);
393 return status; 362 return status;
394 } 363 }
395 364
396 if (read_length > 1) { 365 if (read_length > 1)
397 usb_serial_debug_data(debug, &dev->dev, __func__, 366 usb_serial_debug_data(debug, &dev->dev, __func__,
398 read_length, buffer); 367 read_length, buffer);
399 }
400 368
401 /* Update pointers/length */ 369 /* Update pointers/length */
402 start_address += read_length; 370 start_address += read_length;
403 buffer += read_length; 371 buffer += read_length;
404 length -= read_length; 372 length -= read_length;
405 } 373 }
406 374
407 return status; 375 return status;
408} 376}
409 377
410static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer) 378static int read_ram(struct usb_device *dev, int start_address,
379 int length, __u8 *buffer)
411{ 380{
412 return TIReadDownloadMemory (dev, 381 return read_download_mem(dev, start_address, length,
413 start_address, 382 DTK_ADDR_SPACE_XDATA, buffer);
414 length,
415 DTK_ADDR_SPACE_XDATA,
416 buffer);
417} 383}
418 384
419/* Read edgeport memory to a given block */ 385/* Read edgeport memory to a given block */
420static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer) 386static int read_boot_mem(struct edgeport_serial *serial,
387 int start_address, int length, __u8 *buffer)
421{ 388{
422 int status = 0; 389 int status = 0;
423 int i; 390 int i;
424 391
425 for (i=0; i< length; i++) { 392 for (i = 0; i < length; i++) {
426 status = TIReadVendorRequestSync (serial->serial->dev, 393 status = ti_vread_sync(serial->serial->dev,
427 UMPC_MEMORY_READ, // Request 394 UMPC_MEMORY_READ, serial->TI_I2C_Type,
428 serial->TI_I2C_Type, // wValue (Address type) 395 (__u16)(start_address+i), &buffer[i], 0x01);
429 (__u16)(start_address+i), // wIndex
430 &buffer[i], // TransferBuffer
431 0x01); // TransferBufferLength
432 if (status) { 396 if (status) {
433 dbg ("%s - ERROR %x", __func__, status); 397 dbg("%s - ERROR %x", __func__, status);
434 return status; 398 return status;
435 } 399 }
436 } 400 }
437 401
438 dbg ("%s - start_address = %x, length = %d", __func__, start_address, length); 402 dbg("%s - start_address = %x, length = %d",
439 usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, length, buffer); 403 __func__, start_address, length);
404 usb_serial_debug_data(debug, &serial->serial->dev->dev,
405 __func__, length, buffer);
440 406
441 serial->TiReadI2C = 1; 407 serial->TiReadI2C = 1;
442 408
@@ -444,7 +410,8 @@ static int TIReadBootMemory (struct edgeport_serial *serial, int start_address,
444} 410}
445 411
446/* Write given block to TI EPROM memory */ 412/* Write given block to TI EPROM memory */
447static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) 413static int write_boot_mem(struct edgeport_serial *serial,
414 int start_address, int length, __u8 *buffer)
448{ 415{
449 int status = 0; 416 int status = 0;
450 int i; 417 int i;
@@ -452,57 +419,58 @@ static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address,
452 419
453 /* Must do a read before write */ 420 /* Must do a read before write */
454 if (!serial->TiReadI2C) { 421 if (!serial->TiReadI2C) {
455 status = TIReadBootMemory(serial, 0, 1, &temp); 422 status = read_boot_mem(serial, 0, 1, &temp);
456 if (status) 423 if (status)
457 return status; 424 return status;
458 } 425 }
459 426
460 for (i=0; i < length; ++i) { 427 for (i = 0; i < length; ++i) {
461 status = TISendVendorRequestSync (serial->serial->dev, 428 status = ti_vsend_sync(serial->serial->dev,
462 UMPC_MEMORY_WRITE, // Request 429 UMPC_MEMORY_WRITE, buffer[i],
463 buffer[i], // wValue 430 (__u16)(i + start_address), NULL, 0);
464 (__u16)(i+start_address), // wIndex
465 NULL, // TransferBuffer
466 0); // TransferBufferLength
467 if (status) 431 if (status)
468 return status; 432 return status;
469 } 433 }
470 434
471 dbg ("%s - start_sddr = %x, length = %d", __func__, start_address, length); 435 dbg("%s - start_sddr = %x, length = %d",
472 usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, length, buffer); 436 __func__, start_address, length);
437 usb_serial_debug_data(debug, &serial->serial->dev->dev,
438 __func__, length, buffer);
473 439
474 return status; 440 return status;
475} 441}
476 442
477 443
478/* Write edgeport I2C memory to TI chip */ 444/* Write edgeport I2C memory to TI chip */
479static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer) 445static int write_i2c_mem(struct edgeport_serial *serial,
446 int start_address, int length, __u8 address_type, __u8 *buffer)
480{ 447{
481 int status = 0; 448 int status = 0;
482 int write_length; 449 int write_length;
483 __be16 be_start_address; 450 __be16 be_start_address;
484 451
485 /* We can only send a maximum of 1 aligned byte page at a time */ 452 /* We can only send a maximum of 1 aligned byte page at a time */
486 453
487 /* calulate the number of bytes left in the first page */ 454 /* calulate the number of bytes left in the first page */
488 write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1)); 455 write_length = EPROM_PAGE_SIZE -
456 (start_address & (EPROM_PAGE_SIZE - 1));
489 457
490 if (write_length > length) 458 if (write_length > length)
491 write_length = length; 459 write_length = length;
492 460
493 dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __func__, start_address, write_length); 461 dbg("%s - BytesInFirstPage Addr = %x, length = %d",
494 usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, write_length, buffer); 462 __func__, start_address, write_length);
463 usb_serial_debug_data(debug, &serial->serial->dev->dev,
464 __func__, write_length, buffer);
495 465
496 /* Write first page */ 466 /* Write first page */
497 be_start_address = cpu_to_be16 (start_address); 467 be_start_address = cpu_to_be16(start_address);
498 status = TISendVendorRequestSync (serial->serial->dev, 468 status = ti_vsend_sync(serial->serial->dev,
499 UMPC_MEMORY_WRITE, // Request 469 UMPC_MEMORY_WRITE, (__u16)address_type,
500 (__u16)address_type, // wValue 470 (__force __u16)be_start_address,
501 (__force __u16)be_start_address, // wIndex 471 buffer, write_length);
502 buffer, // TransferBuffer
503 write_length);
504 if (status) { 472 if (status) {
505 dbg ("%s - ERROR %d", __func__, status); 473 dbg("%s - ERROR %d", __func__, status);
506 return status; 474 return status;
507 } 475 }
508 476
@@ -510,29 +478,31 @@ static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address
510 start_address += write_length; 478 start_address += write_length;
511 buffer += write_length; 479 buffer += write_length;
512 480
513 /* We should be aligned now -- can write max page size bytes at a time */ 481 /* We should be aligned now -- can write
482 max page size bytes at a time */
514 while (length) { 483 while (length) {
515 if (length > EPROM_PAGE_SIZE) 484 if (length > EPROM_PAGE_SIZE)
516 write_length = EPROM_PAGE_SIZE; 485 write_length = EPROM_PAGE_SIZE;
517 else 486 else
518 write_length = length; 487 write_length = length;
519 488
520 dbg ("%s - Page Write Addr = %x, length = %d", __func__, start_address, write_length); 489 dbg("%s - Page Write Addr = %x, length = %d",
521 usb_serial_debug_data(debug, &serial->serial->dev->dev, __func__, write_length, buffer); 490 __func__, start_address, write_length);
491 usb_serial_debug_data(debug, &serial->serial->dev->dev,
492 __func__, write_length, buffer);
522 493
523 /* Write next page */ 494 /* Write next page */
524 be_start_address = cpu_to_be16 (start_address); 495 be_start_address = cpu_to_be16(start_address);
525 status = TISendVendorRequestSync (serial->serial->dev, 496 status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE,
526 UMPC_MEMORY_WRITE, // Request 497 (__u16)address_type,
527 (__u16)address_type, // wValue 498 (__force __u16)be_start_address,
528 (__force __u16)be_start_address, // wIndex 499 buffer, write_length);
529 buffer, // TransferBuffer
530 write_length); // TransferBufferLength
531 if (status) { 500 if (status) {
532 dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __func__, status); 501 dev_err(&serial->serial->dev->dev, "%s - ERROR %d\n",
502 __func__, status);
533 return status; 503 return status;
534 } 504 }
535 505
536 length -= write_length; 506 length -= write_length;
537 start_address += write_length; 507 start_address += write_length;
538 buffer += write_length; 508 buffer += write_length;
@@ -541,25 +511,25 @@ static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address
541} 511}
542 512
543/* Examine the UMP DMA registers and LSR 513/* Examine the UMP DMA registers and LSR
544 * 514 *
545 * Check the MSBit of the X and Y DMA byte count registers. 515 * Check the MSBit of the X and Y DMA byte count registers.
546 * A zero in this bit indicates that the TX DMA buffers are empty 516 * A zero in this bit indicates that the TX DMA buffers are empty
547 * then check the TX Empty bit in the UART. 517 * then check the TX Empty bit in the UART.
548 */ 518 */
549static int TIIsTxActive (struct edgeport_port *port) 519static int tx_active(struct edgeport_port *port)
550{ 520{
551 int status; 521 int status;
552 struct out_endpoint_desc_block *oedb; 522 struct out_endpoint_desc_block *oedb;
553 __u8 *lsr; 523 __u8 *lsr;
554 int bytes_left = 0; 524 int bytes_left = 0;
555 525
556 oedb = kmalloc (sizeof (* oedb), GFP_KERNEL); 526 oedb = kmalloc(sizeof(*oedb), GFP_KERNEL);
557 if (!oedb) { 527 if (!oedb) {
558 dev_err (&port->port->dev, "%s - out of memory\n", __func__); 528 dev_err(&port->port->dev, "%s - out of memory\n", __func__);
559 return -ENOMEM; 529 return -ENOMEM;
560 } 530 }
561 531
562 lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte, 532 lsr = kmalloc(1, GFP_KERNEL); /* Sigh, that's right, just one byte,
563 as not all platforms can do DMA 533 as not all platforms can do DMA
564 from stack */ 534 from stack */
565 if (!lsr) { 535 if (!lsr) {
@@ -567,51 +537,47 @@ static int TIIsTxActive (struct edgeport_port *port)
567 return -ENOMEM; 537 return -ENOMEM;
568 } 538 }
569 /* Read the DMA Count Registers */ 539 /* Read the DMA Count Registers */
570 status = TIReadRam (port->port->serial->dev, 540 status = read_ram(port->port->serial->dev, port->dma_address,
571 port->dma_address, 541 sizeof(*oedb), (void *)oedb);
572 sizeof( *oedb),
573 (void *)oedb);
574
575 if (status) 542 if (status)
576 goto exit_is_tx_active; 543 goto exit_is_tx_active;
577 544
578 dbg ("%s - XByteCount 0x%X", __func__, oedb->XByteCount); 545 dbg("%s - XByteCount 0x%X", __func__, oedb->XByteCount);
579 546
580 /* and the LSR */ 547 /* and the LSR */
581 status = TIReadRam (port->port->serial->dev, 548 status = read_ram(port->port->serial->dev,
582 port->uart_base + UMPMEM_OFFS_UART_LSR, 549 port->uart_base + UMPMEM_OFFS_UART_LSR, 1, lsr);
583 1,
584 lsr);
585 550
586 if (status) 551 if (status)
587 goto exit_is_tx_active; 552 goto exit_is_tx_active;
588 dbg ("%s - LSR = 0x%X", __func__, *lsr); 553 dbg("%s - LSR = 0x%X", __func__, *lsr);
589 554
590 /* If either buffer has data or we are transmitting then return TRUE */ 555 /* If either buffer has data or we are transmitting then return TRUE */
591 if ((oedb->XByteCount & 0x80 ) != 0 ) 556 if ((oedb->XByteCount & 0x80) != 0)
592 bytes_left += 64; 557 bytes_left += 64;
593 558
594 if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 ) 559 if ((*lsr & UMP_UART_LSR_TX_MASK) == 0)
595 bytes_left += 1; 560 bytes_left += 1;
596 561
597 /* We return Not Active if we get any kind of error */ 562 /* We return Not Active if we get any kind of error */
598exit_is_tx_active: 563exit_is_tx_active:
599 dbg ("%s - return %d", __func__, bytes_left ); 564 dbg("%s - return %d", __func__, bytes_left);
600 565
601 kfree(lsr); 566 kfree(lsr);
602 kfree(oedb); 567 kfree(oedb);
603 return bytes_left; 568 return bytes_left;
604} 569}
605 570
606static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush) 571static void chase_port(struct edgeport_port *port, unsigned long timeout,
572 int flush)
607{ 573{
608 int baud_rate; 574 int baud_rate;
609 struct tty_struct *tty = port->port->tty; 575 struct tty_struct *tty = port->port->port.tty;
610 wait_queue_t wait; 576 wait_queue_t wait;
611 unsigned long flags; 577 unsigned long flags;
612 578
613 if (!timeout) 579 if (!timeout)
614 timeout = (HZ*EDGE_CLOSING_WAIT)/100; 580 timeout = (HZ * EDGE_CLOSING_WAIT)/100;
615 581
616 /* wait for data to drain from the buffer */ 582 /* wait for data to drain from the buffer */
617 spin_lock_irqsave(&port->ep_lock, flags); 583 spin_lock_irqsave(&port->ep_lock, flags);
@@ -621,7 +587,8 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f
621 set_current_state(TASK_INTERRUPTIBLE); 587 set_current_state(TASK_INTERRUPTIBLE);
622 if (edge_buf_data_avail(port->ep_out_buf) == 0 588 if (edge_buf_data_avail(port->ep_out_buf) == 0
623 || timeout == 0 || signal_pending(current) 589 || timeout == 0 || signal_pending(current)
624 || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */ 590 || !usb_get_intfdata(port->port->serial->interface))
591 /* disconnect */
625 break; 592 break;
626 spin_unlock_irqrestore(&port->ep_lock, flags); 593 spin_unlock_irqrestore(&port->ep_lock, flags);
627 timeout = schedule_timeout(timeout); 594 timeout = schedule_timeout(timeout);
@@ -636,8 +603,9 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f
636 /* wait for data to drain from the device */ 603 /* wait for data to drain from the device */
637 timeout += jiffies; 604 timeout += jiffies;
638 while ((long)(jiffies - timeout) < 0 && !signal_pending(current) 605 while ((long)(jiffies - timeout) < 0 && !signal_pending(current)
639 && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */ 606 && usb_get_intfdata(port->port->serial->interface)) {
640 if (!TIIsTxActive(port)) 607 /* not disconnected */
608 if (!tx_active(port))
641 break; 609 break;
642 msleep(10); 610 msleep(10);
643 } 611 }
@@ -647,72 +615,72 @@ static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int f
647 return; 615 return;
648 616
649 /* wait one more character time, based on baud rate */ 617 /* wait one more character time, based on baud rate */
650 /* (TIIsTxActive doesn't seem to wait for the last byte) */ 618 /* (tx_active doesn't seem to wait for the last byte) */
651 if ((baud_rate=port->baud_rate) == 0) 619 baud_rate = port->baud_rate;
620 if (baud_rate == 0)
652 baud_rate = 50; 621 baud_rate = 50;
653 msleep(max(1, DIV_ROUND_UP(10000, baud_rate))); 622 msleep(max(1, DIV_ROUND_UP(10000, baud_rate)));
654} 623}
655 624
656static int TIChooseConfiguration (struct usb_device *dev) 625static int choose_config(struct usb_device *dev)
657{ 626{
658 // There may be multiple configurations on this device, in which case 627 /*
659 // we would need to read and parse all of them to find out which one 628 * There may be multiple configurations on this device, in which case
660 // we want. However, we just support one config at this point, 629 * we would need to read and parse all of them to find out which one
661 // configuration # 1, which is Config Descriptor 0. 630 * we want. However, we just support one config at this point,
631 * configuration # 1, which is Config Descriptor 0.
632 */
662 633
663 dbg ("%s - Number of Interfaces = %d", __func__, dev->config->desc.bNumInterfaces); 634 dbg("%s - Number of Interfaces = %d",
664 dbg ("%s - MAX Power = %d", __func__, dev->config->desc.bMaxPower*2); 635 __func__, dev->config->desc.bNumInterfaces);
636 dbg("%s - MAX Power = %d",
637 __func__, dev->config->desc.bMaxPower * 2);
665 638
666 if (dev->config->desc.bNumInterfaces != 1) { 639 if (dev->config->desc.bNumInterfaces != 1) {
667 dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __func__); 640 dev_err(&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n",
641 __func__);
668 return -ENODEV; 642 return -ENODEV;
669 } 643 }
670 644
671 return 0; 645 return 0;
672} 646}
673 647
674static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) 648static int read_rom(struct edgeport_serial *serial,
649 int start_address, int length, __u8 *buffer)
675{ 650{
676 int status; 651 int status;
677 652
678 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { 653 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
679 status = TIReadDownloadMemory (serial->serial->dev, 654 status = read_download_mem(serial->serial->dev,
680 start_address, 655 start_address,
681 length, 656 length,
682 serial->TI_I2C_Type, 657 serial->TI_I2C_Type,
683 buffer); 658 buffer);
684 } else { 659 } else {
685 status = TIReadBootMemory (serial, 660 status = read_boot_mem(serial, start_address, length,
686 start_address, 661 buffer);
687 length,
688 buffer);
689 } 662 }
690
691 return status; 663 return status;
692} 664}
693 665
694static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) 666static int write_rom(struct edgeport_serial *serial, int start_address,
667 int length, __u8 *buffer)
695{ 668{
696 if (serial->product_info.TiMode == TI_MODE_BOOT) 669 if (serial->product_info.TiMode == TI_MODE_BOOT)
697 return TIWriteBootMemory (serial, 670 return write_boot_mem(serial, start_address, length,
698 start_address, 671 buffer);
699 length,
700 buffer);
701 672
702 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) 673 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD)
703 return TIWriteDownloadI2C (serial, 674 return write_i2c_mem(serial, start_address, length,
704 start_address, 675 serial->TI_I2C_Type, buffer);
705 length,
706 serial->TI_I2C_Type,
707 buffer);
708
709 return -EINVAL; 676 return -EINVAL;
710} 677}
711 678
712 679
713 680
714/* Read a descriptor header from I2C based on type */ 681/* Read a descriptor header from I2C based on type */
715static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc) 682static int get_descriptor_addr(struct edgeport_serial *serial,
683 int desc_type, struct ti_i2c_desc *rom_desc)
716{ 684{
717 int start_address; 685 int start_address;
718 int status; 686 int status;
@@ -720,41 +688,42 @@ static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type
720 /* Search for requested descriptor in I2C */ 688 /* Search for requested descriptor in I2C */
721 start_address = 2; 689 start_address = 2;
722 do { 690 do {
723 status = TIReadRom (serial, 691 status = read_rom(serial,
724 start_address, 692 start_address,
725 sizeof(struct ti_i2c_desc), 693 sizeof(struct ti_i2c_desc),
726 (__u8 *)rom_desc ); 694 (__u8 *)rom_desc);
727 if (status) 695 if (status)
728 return 0; 696 return 0;
729 697
730 if (rom_desc->Type == desc_type) 698 if (rom_desc->Type == desc_type)
731 return start_address; 699 return start_address;
732 700
733 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; 701 start_address = start_address + sizeof(struct ti_i2c_desc)
702 + rom_desc->Size;
734 703
735 } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); 704 } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type);
736 705
737 return 0; 706 return 0;
738} 707}
739 708
740/* Validate descriptor checksum */ 709/* Validate descriptor checksum */
741static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer) 710static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer)
742{ 711{
743 __u16 i; 712 __u16 i;
744 __u8 cs = 0; 713 __u8 cs = 0;
745 714
746 for (i=0; i < rom_desc->Size; i++) { 715 for (i = 0; i < rom_desc->Size; i++)
747 cs = (__u8)(cs + buffer[i]); 716 cs = (__u8)(cs + buffer[i]);
748 } 717
749 if (cs != rom_desc->CheckSum) { 718 if (cs != rom_desc->CheckSum) {
750 dbg ("%s - Mismatch %x - %x", __func__, rom_desc->CheckSum, cs); 719 dbg("%s - Mismatch %x - %x", __func__, rom_desc->CheckSum, cs);
751 return -EINVAL; 720 return -EINVAL;
752 } 721 }
753 return 0; 722 return 0;
754} 723}
755 724
756/* Make sure that the I2C image is good */ 725/* Make sure that the I2C image is good */
757static int TiValidateI2cImage (struct edgeport_serial *serial) 726static int check_i2c_image(struct edgeport_serial *serial)
758{ 727{
759 struct device *dev = &serial->serial->dev->dev; 728 struct device *dev = &serial->serial->dev->dev;
760 int status = 0; 729 int status = 0;
@@ -763,120 +732,124 @@ static int TiValidateI2cImage (struct edgeport_serial *serial)
763 __u8 *buffer; 732 __u8 *buffer;
764 __u16 ttype; 733 __u16 ttype;
765 734
766 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); 735 rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
767 if (!rom_desc) { 736 if (!rom_desc) {
768 dev_err (dev, "%s - out of memory\n", __func__); 737 dev_err(dev, "%s - out of memory\n", __func__);
769 return -ENOMEM; 738 return -ENOMEM;
770 } 739 }
771 buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL); 740 buffer = kmalloc(TI_MAX_I2C_SIZE, GFP_KERNEL);
772 if (!buffer) { 741 if (!buffer) {
773 dev_err (dev, "%s - out of memory when allocating buffer\n", __func__); 742 dev_err(dev, "%s - out of memory when allocating buffer\n",
774 kfree (rom_desc); 743 __func__);
744 kfree(rom_desc);
775 return -ENOMEM; 745 return -ENOMEM;
776 } 746 }
777 747
778 // Read the first byte (Signature0) must be 0x52 or 0x10 748 /* Read the first byte (Signature0) must be 0x52 or 0x10 */
779 status = TIReadRom (serial, 0, 1, buffer); 749 status = read_rom(serial, 0, 1, buffer);
780 if (status) 750 if (status)
781 goto ExitTiValidateI2cImage; 751 goto out;
782 752
783 if (*buffer != UMP5152 && *buffer != UMP3410) { 753 if (*buffer != UMP5152 && *buffer != UMP3410) {
784 dev_err (dev, "%s - invalid buffer signature\n", __func__); 754 dev_err(dev, "%s - invalid buffer signature\n", __func__);
785 status = -ENODEV; 755 status = -ENODEV;
786 goto ExitTiValidateI2cImage; 756 goto out;
787 } 757 }
788 758
789 do { 759 do {
790 // Validate the I2C 760 /* Validate the I2C */
791 status = TIReadRom (serial, 761 status = read_rom(serial,
792 start_address, 762 start_address,
793 sizeof(struct ti_i2c_desc), 763 sizeof(struct ti_i2c_desc),
794 (__u8 *)rom_desc); 764 (__u8 *)rom_desc);
795 if (status) 765 if (status)
796 break; 766 break;
797 767
798 if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) { 768 if ((start_address + sizeof(struct ti_i2c_desc) +
769 rom_desc->Size) > TI_MAX_I2C_SIZE) {
799 status = -ENODEV; 770 status = -ENODEV;
800 dbg ("%s - structure too big, erroring out.", __func__); 771 dbg("%s - structure too big, erroring out.", __func__);
801 break; 772 break;
802 } 773 }
803 774
804 dbg ("%s Type = 0x%x", __func__, rom_desc->Type); 775 dbg("%s Type = 0x%x", __func__, rom_desc->Type);
805 776
806 // Skip type 2 record 777 /* Skip type 2 record */
807 ttype = rom_desc->Type & 0x0f; 778 ttype = rom_desc->Type & 0x0f;
808 if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC 779 if (ttype != I2C_DESC_TYPE_FIRMWARE_BASIC
809 && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) { 780 && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO) {
810 // Read the descriptor data 781 /* Read the descriptor data */
811 status = TIReadRom(serial, 782 status = read_rom(serial, start_address +
812 start_address+sizeof(struct ti_i2c_desc), 783 sizeof(struct ti_i2c_desc),
813 rom_desc->Size, 784 rom_desc->Size, buffer);
814 buffer);
815 if (status) 785 if (status)
816 break; 786 break;
817 787
818 status = ValidChecksum(rom_desc, buffer); 788 status = valid_csum(rom_desc, buffer);
819 if (status) 789 if (status)
820 break; 790 break;
821 } 791 }
822 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; 792 start_address = start_address + sizeof(struct ti_i2c_desc) +
793 rom_desc->Size;
823 794
824 } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE)); 795 } while ((rom_desc->Type != I2C_DESC_TYPE_ION) &&
796 (start_address < TI_MAX_I2C_SIZE));
825 797
826 if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE)) 798 if ((rom_desc->Type != I2C_DESC_TYPE_ION) ||
799 (start_address > TI_MAX_I2C_SIZE))
827 status = -ENODEV; 800 status = -ENODEV;
828 801
829ExitTiValidateI2cImage: 802out:
830 kfree (buffer); 803 kfree(buffer);
831 kfree (rom_desc); 804 kfree(rom_desc);
832 return status; 805 return status;
833} 806}
834 807
835static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer) 808static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer)
836{ 809{
837 int status; 810 int status;
838 int start_address; 811 int start_address;
839 struct ti_i2c_desc *rom_desc; 812 struct ti_i2c_desc *rom_desc;
840 struct edge_ti_manuf_descriptor *desc; 813 struct edge_ti_manuf_descriptor *desc;
841 814
842 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); 815 rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
843 if (!rom_desc) { 816 if (!rom_desc) {
844 dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __func__); 817 dev_err(&serial->serial->dev->dev, "%s - out of memory\n",
818 __func__);
845 return -ENOMEM; 819 return -ENOMEM;
846 } 820 }
847 start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc); 821 start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_ION,
822 rom_desc);
848 823
849 if (!start_address) { 824 if (!start_address) {
850 dbg ("%s - Edge Descriptor not found in I2C", __func__); 825 dbg("%s - Edge Descriptor not found in I2C", __func__);
851 status = -ENODEV; 826 status = -ENODEV;
852 goto exit; 827 goto exit;
853 } 828 }
854 829
855 // Read the descriptor data 830 /* Read the descriptor data */
856 status = TIReadRom (serial, 831 status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc),
857 start_address+sizeof(struct ti_i2c_desc), 832 rom_desc->Size, buffer);
858 rom_desc->Size,
859 buffer);
860 if (status) 833 if (status)
861 goto exit; 834 goto exit;
862 835
863 status = ValidChecksum(rom_desc, buffer); 836 status = valid_csum(rom_desc, buffer);
864 837
865 desc = (struct edge_ti_manuf_descriptor *)buffer; 838 desc = (struct edge_ti_manuf_descriptor *)buffer;
866 dbg ( "%s - IonConfig 0x%x", __func__, desc->IonConfig ); 839 dbg("%s - IonConfig 0x%x", __func__, desc->IonConfig);
867 dbg ( "%s - Version %d", __func__, desc->Version ); 840 dbg("%s - Version %d", __func__, desc->Version);
868 dbg ( "%s - Cpu/Board 0x%x", __func__, desc->CpuRev_BoardRev ); 841 dbg("%s - Cpu/Board 0x%x", __func__, desc->CpuRev_BoardRev);
869 dbg ( "%s - NumPorts %d", __func__, desc->NumPorts ); 842 dbg("%s - NumPorts %d", __func__, desc->NumPorts);
870 dbg ( "%s - NumVirtualPorts %d", __func__, desc->NumVirtualPorts ); 843 dbg("%s - NumVirtualPorts %d", __func__, desc->NumVirtualPorts);
871 dbg ( "%s - TotalPorts %d", __func__, desc->TotalPorts ); 844 dbg("%s - TotalPorts %d", __func__, desc->TotalPorts);
872 845
873exit: 846exit:
874 kfree (rom_desc); 847 kfree(rom_desc);
875 return status; 848 return status;
876} 849}
877 850
878/* Build firmware header used for firmware update */ 851/* Build firmware header used for firmware update */
879static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) 852static int build_i2c_fw_hdr(__u8 *header, struct device *dev)
880{ 853{
881 __u8 *buffer; 854 __u8 *buffer;
882 int buffer_size; 855 int buffer_size;
@@ -889,24 +862,28 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev)
889 const struct firmware *fw; 862 const struct firmware *fw;
890 const char *fw_name = "edgeport/down3.bin"; 863 const char *fw_name = "edgeport/down3.bin";
891 864
892 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 865 /* In order to update the I2C firmware we must change the type 2 record
893 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 866 * to type 0xF2. This will force the UMP to come up in Boot Mode.
894 // will download the latest firmware (padded to 15.5k) into the UMP ram. 867 * Then while in boot mode, the driver will download the latest
895 // And finally when the device comes back up in download mode the driver will cause 868 * firmware (padded to 15.5k) into the UMP ram. And finally when the
896 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 869 * device comes back up in download mode the driver will cause the new
897 // the record type from 0xf2 to 0x02. 870 * firmware to be copied from the UMP Ram to I2C and the firmware will
898 871 * update the record type from 0xf2 to 0x02.
899 // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record) 872 */
900 buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec)); 873
901 874 /* Allocate a 15.5k buffer + 2 bytes for version number
902 buffer = kmalloc (buffer_size, GFP_KERNEL); 875 * (Firmware Record) */
876 buffer_size = (((1024 * 16) - 512 ) +
877 sizeof(struct ti_i2c_firmware_rec));
878
879 buffer = kmalloc(buffer_size, GFP_KERNEL);
903 if (!buffer) { 880 if (!buffer) {
904 dev_err (dev, "%s - out of memory\n", __func__); 881 dev_err(dev, "%s - out of memory\n", __func__);
905 return -ENOMEM; 882 return -ENOMEM;
906 } 883 }
907 884
908 // Set entire image of 0xffs 885 // Set entire image of 0xffs
909 memset (buffer, 0xff, buffer_size); 886 memset(buffer, 0xff, buffer_size);
910 887
911 err = request_firmware(&fw, fw_name, dev); 888 err = request_firmware(&fw, fw_name, dev);
912 if (err) { 889 if (err) {
@@ -921,16 +898,16 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev)
921 OperationalMinorVersion = fw->data[1]; 898 OperationalMinorVersion = fw->data[1];
922 OperationalBuildNumber = fw->data[2] | (fw->data[3] << 8); 899 OperationalBuildNumber = fw->data[2] | (fw->data[3] << 8);
923 900
924 // Copy version number into firmware record 901 /* Copy version number into firmware record */
925 firmware_rec = (struct ti_i2c_firmware_rec *)buffer; 902 firmware_rec = (struct ti_i2c_firmware_rec *)buffer;
926 903
927 firmware_rec->Ver_Major = OperationalMajorVersion; 904 firmware_rec->Ver_Major = OperationalMajorVersion;
928 firmware_rec->Ver_Minor = OperationalMinorVersion; 905 firmware_rec->Ver_Minor = OperationalMinorVersion;
929 906
930 // Pointer to fw_down memory image 907 /* Pointer to fw_down memory image */
931 img_header = (struct ti_i2c_image_header *)&fw->data[4]; 908 img_header = (struct ti_i2c_image_header *)&fw->data[4];
932 909
933 memcpy (buffer + sizeof(struct ti_i2c_firmware_rec), 910 memcpy(buffer + sizeof(struct ti_i2c_firmware_rec),
934 &fw->data[4 + sizeof(struct ti_i2c_image_header)], 911 &fw->data[4 + sizeof(struct ti_i2c_image_header)],
935 le16_to_cpu(img_header->Length)); 912 le16_to_cpu(img_header->Length));
936 913
@@ -940,12 +917,12 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev)
940 cs = (__u8)(cs + buffer[i]); 917 cs = (__u8)(cs + buffer[i]);
941 } 918 }
942 919
943 kfree (buffer); 920 kfree(buffer);
944 921
945 // Build new header 922 /* Build new header */
946 i2c_header = (struct ti_i2c_desc *)header; 923 i2c_header = (struct ti_i2c_desc *)header;
947 firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data; 924 firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data;
948 925
949 i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK; 926 i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK;
950 i2c_header->Size = (__u16)buffer_size; 927 i2c_header->Size = (__u16)buffer_size;
951 i2c_header->CheckSum = cs; 928 i2c_header->CheckSum = cs;
@@ -956,103 +933,100 @@ static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev)
956} 933}
957 934
958/* Try to figure out what type of I2c we have */ 935/* Try to figure out what type of I2c we have */
959static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial) 936static int i2c_type_bootmode(struct edgeport_serial *serial)
960{ 937{
961 int status; 938 int status;
962 __u8 data; 939 __u8 data;
963 940
964 // Try to read type 2 941 /* Try to read type 2 */
965 status = TIReadVendorRequestSync (serial->serial->dev, 942 status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ,
966 UMPC_MEMORY_READ, // Request 943 DTK_ADDR_SPACE_I2C_TYPE_II, 0, &data, 0x01);
967 DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type)
968 0, // wIndex
969 &data, // TransferBuffer
970 0x01); // TransferBufferLength
971 if (status) 944 if (status)
972 dbg ("%s - read 2 status error = %d", __func__, status); 945 dbg("%s - read 2 status error = %d", __func__, status);
973 else 946 else
974 dbg ("%s - read 2 data = 0x%x", __func__, data); 947 dbg("%s - read 2 data = 0x%x", __func__, data);
975 if ((!status) && (data == UMP5152 || data == UMP3410)) { 948 if ((!status) && (data == UMP5152 || data == UMP3410)) {
976 dbg ("%s - ROM_TYPE_II", __func__); 949 dbg("%s - ROM_TYPE_II", __func__);
977 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 950 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
978 return 0; 951 return 0;
979 } 952 }
980 953
981 // Try to read type 3 954 /* Try to read type 3 */
982 status = TIReadVendorRequestSync (serial->serial->dev, 955 status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ,
983 UMPC_MEMORY_READ, // Request 956 DTK_ADDR_SPACE_I2C_TYPE_III, 0, &data, 0x01);
984 DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type)
985 0, // wIndex
986 &data, // TransferBuffer
987 0x01); // TransferBufferLength
988 if (status) 957 if (status)
989 dbg ("%s - read 3 status error = %d", __func__, status); 958 dbg("%s - read 3 status error = %d", __func__, status);
990 else 959 else
991 dbg ("%s - read 2 data = 0x%x", __func__, data); 960 dbg("%s - read 2 data = 0x%x", __func__, data);
992 if ((!status) && (data == UMP5152 || data == UMP3410)) { 961 if ((!status) && (data == UMP5152 || data == UMP3410)) {
993 dbg ("%s - ROM_TYPE_III", __func__); 962 dbg("%s - ROM_TYPE_III", __func__);
994 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III; 963 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III;
995 return 0; 964 return 0;
996 } 965 }
997 966
998 dbg ("%s - Unknown", __func__); 967 dbg("%s - Unknown", __func__);
999 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 968 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1000 return -ENODEV; 969 return -ENODEV;
1001} 970}
1002 971
1003static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent) 972static int bulk_xfer(struct usb_serial *serial, void *buffer,
973 int length, int *num_sent)
1004{ 974{
1005 int status; 975 int status;
1006 976
1007 status = usb_bulk_msg (serial->dev, 977 status = usb_bulk_msg(serial->dev,
1008 usb_sndbulkpipe(serial->dev, 978 usb_sndbulkpipe(serial->dev,
1009 serial->port[0]->bulk_out_endpointAddress), 979 serial->port[0]->bulk_out_endpointAddress),
1010 buffer, 980 buffer, length, num_sent, 1000);
1011 length,
1012 num_sent,
1013 1000);
1014 return status; 981 return status;
1015} 982}
1016 983
1017/* Download given firmware image to the device (IN BOOT MODE) */ 984/* Download given firmware image to the device (IN BOOT MODE) */
1018static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length) 985static int download_code(struct edgeport_serial *serial, __u8 *image,
986 int image_length)
1019{ 987{
1020 int status = 0; 988 int status = 0;
1021 int pos; 989 int pos;
1022 int transfer; 990 int transfer;
1023 int done; 991 int done;
1024 992
1025 // Transfer firmware image 993 /* Transfer firmware image */
1026 for (pos = 0; pos < image_length; ) { 994 for (pos = 0; pos < image_length; ) {
1027 // Read the next buffer from file 995 /* Read the next buffer from file */
1028 transfer = image_length - pos; 996 transfer = image_length - pos;
1029 if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE) 997 if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE)
1030 transfer = EDGE_FW_BULK_MAX_PACKET_SIZE; 998 transfer = EDGE_FW_BULK_MAX_PACKET_SIZE;
1031 999
1032 // Transfer data 1000 /* Transfer data */
1033 status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done); 1001 status = bulk_xfer(serial->serial, &image[pos],
1002 transfer, &done);
1034 if (status) 1003 if (status)
1035 break; 1004 break;
1036 // Advance buffer pointer 1005 /* Advance buffer pointer */
1037 pos += done; 1006 pos += done;
1038 } 1007 }
1039 1008
1040 return status; 1009 return status;
1041} 1010}
1042 1011
1043// FIXME!!! 1012/* FIXME!!! */
1044static int TIConfigureBootDevice (struct usb_device *dev) 1013static int config_boot_dev(struct usb_device *dev)
1045{ 1014{
1046 return 0; 1015 return 0;
1047} 1016}
1048 1017
1018static int ti_cpu_rev(struct edge_ti_manuf_descriptor *desc)
1019{
1020 return TI_GET_CPU_REVISION(desc->CpuRev_BoardRev);
1021}
1022
1049/** 1023/**
1050 * DownloadTIFirmware - Download run-time operating firmware to the TI5052 1024 * DownloadTIFirmware - Download run-time operating firmware to the TI5052
1051 * 1025 *
1052 * This routine downloads the main operating code into the TI5052, using the 1026 * This routine downloads the main operating code into the TI5052, using the
1053 * boot code already burned into E2PROM or ROM. 1027 * boot code already burned into E2PROM or ROM.
1054 */ 1028 */
1055static int TIDownloadFirmware (struct edgeport_serial *serial) 1029static int download_fw(struct edgeport_serial *serial)
1056{ 1030{
1057 struct device *dev = &serial->serial->dev->dev; 1031 struct device *dev = &serial->serial->dev->dev;
1058 int status = 0; 1032 int status = 0;
@@ -1071,22 +1045,25 @@ static int TIDownloadFirmware (struct edgeport_serial *serial)
1071 /* Default to type 2 i2c */ 1045 /* Default to type 2 i2c */
1072 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 1046 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1073 1047
1074 status = TIChooseConfiguration (serial->serial->dev); 1048 status = choose_config(serial->serial->dev);
1075 if (status) 1049 if (status)
1076 return status; 1050 return status;
1077 1051
1078 interface = &serial->serial->interface->cur_altsetting->desc; 1052 interface = &serial->serial->interface->cur_altsetting->desc;
1079 if (!interface) { 1053 if (!interface) {
1080 dev_err (dev, "%s - no interface set, error!\n", __func__); 1054 dev_err(dev, "%s - no interface set, error!\n", __func__);
1081 return -ENODEV; 1055 return -ENODEV;
1082 } 1056 }
1083 1057
1084 // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING 1058 /*
1085 // if we have more than one endpoint we are definitely in download mode 1059 * Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING
1060 * if we have more than one endpoint we are definitely in download
1061 * mode
1062 */
1086 if (interface->bNumEndpoints > 1) 1063 if (interface->bNumEndpoints > 1)
1087 serial->product_info.TiMode = TI_MODE_DOWNLOAD; 1064 serial->product_info.TiMode = TI_MODE_DOWNLOAD;
1088 else 1065 else
1089 // Otherwise we will remain in configuring mode 1066 /* Otherwise we will remain in configuring mode */
1090 serial->product_info.TiMode = TI_MODE_CONFIGURING; 1067 serial->product_info.TiMode = TI_MODE_CONFIGURING;
1091 1068
1092 /********************************************************************/ 1069 /********************************************************************/
@@ -1097,256 +1074,273 @@ static int TIDownloadFirmware (struct edgeport_serial *serial)
1097 1074
1098 dbg("%s - RUNNING IN DOWNLOAD MODE", __func__); 1075 dbg("%s - RUNNING IN DOWNLOAD MODE", __func__);
1099 1076
1100 status = TiValidateI2cImage (serial); 1077 status = check_i2c_image(serial);
1101 if (status) { 1078 if (status) {
1102 dbg("%s - DOWNLOAD MODE -- BAD I2C", __func__); 1079 dbg("%s - DOWNLOAD MODE -- BAD I2C", __func__);
1103 return status; 1080 return status;
1104 } 1081 }
1105 1082
1106 /* Validate Hardware version number 1083 /* Validate Hardware version number
1107 * Read Manufacturing Descriptor from TI Based Edgeport 1084 * Read Manufacturing Descriptor from TI Based Edgeport
1108 */ 1085 */
1109 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); 1086 ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL);
1110 if (!ti_manuf_desc) { 1087 if (!ti_manuf_desc) {
1111 dev_err (dev, "%s - out of memory.\n", __func__); 1088 dev_err(dev, "%s - out of memory.\n", __func__);
1112 return -ENOMEM; 1089 return -ENOMEM;
1113 } 1090 }
1114 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); 1091 status = get_manuf_info(serial, (__u8 *)ti_manuf_desc);
1115 if (status) { 1092 if (status) {
1116 kfree (ti_manuf_desc); 1093 kfree(ti_manuf_desc);
1117 return status; 1094 return status;
1118 } 1095 }
1119 1096
1120 // Check version number of ION descriptor 1097 /* Check version number of ION descriptor */
1121 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { 1098 if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
1122 dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __func__, 1099 dbg("%s - Wrong CPU Rev %d (Must be 2)",
1123 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); 1100 __func__, ti_cpu_rev(ti_manuf_desc));
1124 kfree (ti_manuf_desc); 1101 kfree(ti_manuf_desc);
1125 return -EINVAL; 1102 return -EINVAL;
1126 } 1103 }
1127 1104
1128 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); 1105 rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
1129 if (!rom_desc) { 1106 if (!rom_desc) {
1130 dev_err (dev, "%s - out of memory.\n", __func__); 1107 dev_err(dev, "%s - out of memory.\n", __func__);
1131 kfree (ti_manuf_desc); 1108 kfree(ti_manuf_desc);
1132 return -ENOMEM; 1109 return -ENOMEM;
1133 } 1110 }
1134 1111
1135 // Search for type 2 record (firmware record) 1112 /* Search for type 2 record (firmware record) */
1136 if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) { 1113 start_address = get_descriptor_addr(serial,
1114 I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc);
1115 if (start_address != 0) {
1137 struct ti_i2c_firmware_rec *firmware_version; 1116 struct ti_i2c_firmware_rec *firmware_version;
1138 __u8 record; 1117 __u8 record;
1139 1118
1140 dbg ("%s - Found Type FIRMWARE (Type 2) record", __func__); 1119 dbg("%s - Found Type FIRMWARE (Type 2) record",
1120 __func__);
1141 1121
1142 firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL); 1122 firmware_version = kmalloc(sizeof(*firmware_version),
1123 GFP_KERNEL);
1143 if (!firmware_version) { 1124 if (!firmware_version) {
1144 dev_err (dev, "%s - out of memory.\n", __func__); 1125 dev_err(dev, "%s - out of memory.\n", __func__);
1145 kfree (rom_desc); 1126 kfree(rom_desc);
1146 kfree (ti_manuf_desc); 1127 kfree(ti_manuf_desc);
1147 return -ENOMEM; 1128 return -ENOMEM;
1148 } 1129 }
1149 1130
1150 // Validate version number 1131 /* Validate version number
1151 // Read the descriptor data 1132 * Read the descriptor data
1152 status = TIReadRom (serial, 1133 */
1153 start_address+sizeof(struct ti_i2c_desc), 1134 status = read_rom(serial, start_address +
1135 sizeof(struct ti_i2c_desc),
1154 sizeof(struct ti_i2c_firmware_rec), 1136 sizeof(struct ti_i2c_firmware_rec),
1155 (__u8 *)firmware_version); 1137 (__u8 *)firmware_version);
1156 if (status) { 1138 if (status) {
1157 kfree (firmware_version); 1139 kfree(firmware_version);
1158 kfree (rom_desc); 1140 kfree(rom_desc);
1159 kfree (ti_manuf_desc); 1141 kfree(ti_manuf_desc);
1160 return status; 1142 return status;
1161 } 1143 }
1162 1144
1163 // Check version number of download with current version in I2c 1145 /* Check version number of download with current
1164 download_cur_ver = (firmware_version->Ver_Major << 8) + 1146 version in I2c */
1147 download_cur_ver = (firmware_version->Ver_Major << 8) +
1165 (firmware_version->Ver_Minor); 1148 (firmware_version->Ver_Minor);
1166 download_new_ver = (OperationalMajorVersion << 8) + 1149 download_new_ver = (OperationalMajorVersion << 8) +
1167 (OperationalMinorVersion); 1150 (OperationalMinorVersion);
1168 1151
1169 dbg ("%s - >>>Firmware Versions Device %d.%d Driver %d.%d", 1152 dbg("%s - >> FW Versions Device %d.%d Driver %d.%d",
1170 __func__, 1153 __func__,
1171 firmware_version->Ver_Major, 1154 firmware_version->Ver_Major,
1172 firmware_version->Ver_Minor, 1155 firmware_version->Ver_Minor,
1173 OperationalMajorVersion, 1156 OperationalMajorVersion,
1174 OperationalMinorVersion); 1157 OperationalMinorVersion);
1175 1158
1176 // Check if we have an old version in the I2C and update if necessary 1159 /* Check if we have an old version in the I2C and
1160 update if necessary */
1177 if (download_cur_ver != download_new_ver) { 1161 if (download_cur_ver != download_new_ver) {
1178 dbg ("%s - Update I2C Download from %d.%d to %d.%d", 1162 dbg("%s - Update I2C dld from %d.%d to %d.%d",
1179 __func__, 1163 __func__,
1180 firmware_version->Ver_Major, 1164 firmware_version->Ver_Major,
1181 firmware_version->Ver_Minor, 1165 firmware_version->Ver_Minor,
1182 OperationalMajorVersion, 1166 OperationalMajorVersion,
1183 OperationalMinorVersion); 1167 OperationalMinorVersion);
1184 1168
1185 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 1169 /* In order to update the I2C firmware we must
1186 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 1170 * change the type 2 record to type 0xF2. This
1187 // will download the latest firmware (padded to 15.5k) into the UMP ram. 1171 * will force the UMP to come up in Boot Mode.
1188 // And finally when the device comes back up in download mode the driver will cause 1172 * Then while in boot mode, the driver will
1189 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 1173 * download the latest firmware (padded to
1190 // the record type from 0xf2 to 0x02. 1174 * 15.5k) into the UMP ram. Finally when the
1191 1175 * device comes back up in download mode the
1176 * driver will cause the new firmware to be
1177 * copied from the UMP Ram to I2C and the
1178 * firmware will update the record type from
1179 * 0xf2 to 0x02.
1180 */
1192 record = I2C_DESC_TYPE_FIRMWARE_BLANK; 1181 record = I2C_DESC_TYPE_FIRMWARE_BLANK;
1193 1182
1194 // Change the I2C Firmware record type to 0xf2 to trigger an update 1183 /* Change the I2C Firmware record type to
1195 status = TIWriteRom (serial, 1184 0xf2 to trigger an update */
1196 start_address, 1185 status = write_rom(serial, start_address,
1197 sizeof(record), 1186 sizeof(record), &record);
1198 &record);
1199 if (status) { 1187 if (status) {
1200 kfree (firmware_version); 1188 kfree(firmware_version);
1201 kfree (rom_desc); 1189 kfree(rom_desc);
1202 kfree (ti_manuf_desc); 1190 kfree(ti_manuf_desc);
1203 return status; 1191 return status;
1204 } 1192 }
1205 1193
1206 // verify the write -- must do this in order for write to 1194 /* verify the write -- must do this in order
1207 // complete before we do the hardware reset 1195 * for write to complete before we do the
1208 status = TIReadRom (serial, 1196 * hardware reset
1197 */
1198 status = read_rom(serial,
1209 start_address, 1199 start_address,
1210 sizeof(record), 1200 sizeof(record),
1211 &record); 1201 &record);
1212
1213 if (status) { 1202 if (status) {
1214 kfree (firmware_version); 1203 kfree(firmware_version);
1215 kfree (rom_desc); 1204 kfree(rom_desc);
1216 kfree (ti_manuf_desc); 1205 kfree(ti_manuf_desc);
1217 return status; 1206 return status;
1218 } 1207 }
1219 1208
1220 if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) { 1209 if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
1221 dev_err (dev, "%s - error resetting device\n", __func__); 1210 dev_err(dev,
1222 kfree (firmware_version); 1211 "%s - error resetting device\n",
1223 kfree (rom_desc); 1212 __func__);
1224 kfree (ti_manuf_desc); 1213 kfree(firmware_version);
1214 kfree(rom_desc);
1215 kfree(ti_manuf_desc);
1225 return -ENODEV; 1216 return -ENODEV;
1226 } 1217 }
1227 1218
1228 dbg ("%s - HARDWARE RESET", __func__); 1219 dbg("%s - HARDWARE RESET", __func__);
1229 1220
1230 // Reset UMP -- Back to BOOT MODE 1221 /* Reset UMP -- Back to BOOT MODE */
1231 status = TISendVendorRequestSync (serial->serial->dev, 1222 status = ti_vsend_sync(serial->serial->dev,
1232 UMPC_HARDWARE_RESET, // Request 1223 UMPC_HARDWARE_RESET,
1233 0, // wValue 1224 0, 0, NULL, 0);
1234 0, // wIndex
1235 NULL, // TransferBuffer
1236 0); // TransferBufferLength
1237 1225
1238 dbg ( "%s - HARDWARE RESET return %d", __func__, status); 1226 dbg("%s - HARDWARE RESET return %d",
1227 __func__, status);
1239 1228
1240 /* return an error on purpose. */ 1229 /* return an error on purpose. */
1241 kfree (firmware_version); 1230 kfree(firmware_version);
1242 kfree (rom_desc); 1231 kfree(rom_desc);
1243 kfree (ti_manuf_desc); 1232 kfree(ti_manuf_desc);
1244 return -ENODEV; 1233 return -ENODEV;
1245 } 1234 }
1246 kfree (firmware_version); 1235 kfree(firmware_version);
1247 } 1236 }
1248 // Search for type 0xF2 record (firmware blank record) 1237 /* Search for type 0xF2 record (firmware blank record) */
1249 else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) { 1238 else if ((start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) {
1250 #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec)) 1239#define HEADER_SIZE (sizeof(struct ti_i2c_desc) + \
1240 sizeof(struct ti_i2c_firmware_rec))
1251 __u8 *header; 1241 __u8 *header;
1252 __u8 *vheader; 1242 __u8 *vheader;
1253 1243
1254 header = kmalloc (HEADER_SIZE, GFP_KERNEL); 1244 header = kmalloc(HEADER_SIZE, GFP_KERNEL);
1255 if (!header) { 1245 if (!header) {
1256 dev_err (dev, "%s - out of memory.\n", __func__); 1246 dev_err(dev, "%s - out of memory.\n", __func__);
1257 kfree (rom_desc); 1247 kfree(rom_desc);
1258 kfree (ti_manuf_desc); 1248 kfree(ti_manuf_desc);
1259 return -ENOMEM; 1249 return -ENOMEM;
1260 } 1250 }
1261 1251
1262 vheader = kmalloc (HEADER_SIZE, GFP_KERNEL); 1252 vheader = kmalloc(HEADER_SIZE, GFP_KERNEL);
1263 if (!vheader) { 1253 if (!vheader) {
1264 dev_err (dev, "%s - out of memory.\n", __func__); 1254 dev_err(dev, "%s - out of memory.\n", __func__);
1265 kfree (header); 1255 kfree(header);
1266 kfree (rom_desc); 1256 kfree(rom_desc);
1267 kfree (ti_manuf_desc); 1257 kfree(ti_manuf_desc);
1268 return -ENOMEM; 1258 return -ENOMEM;
1269 } 1259 }
1270 1260
1271 dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __func__); 1261 dbg("%s - Found Type BLANK FIRMWARE (Type F2) record",
1272 1262 __func__);
1273 // In order to update the I2C firmware we must change the type 2 record to type 0xF2. 1263
1274 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver 1264 /*
1275 // will download the latest firmware (padded to 15.5k) into the UMP ram. 1265 * In order to update the I2C firmware we must change
1276 // And finally when the device comes back up in download mode the driver will cause 1266 * the type 2 record to type 0xF2. This will force the
1277 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update 1267 * UMP to come up in Boot Mode. Then while in boot
1278 // the record type from 0xf2 to 0x02. 1268 * mode, the driver will download the latest firmware
1279 status = BuildI2CFirmwareHeader(header, dev); 1269 * (padded to 15.5k) into the UMP ram. Finally when the
1270 * device comes back up in download mode the driver
1271 * will cause the new firmware to be copied from the
1272 * UMP Ram to I2C and the firmware will update the
1273 * record type from 0xf2 to 0x02.
1274 */
1275 status = build_i2c_fw_hdr(header, dev);
1280 if (status) { 1276 if (status) {
1281 kfree (vheader); 1277 kfree(vheader);
1282 kfree (header); 1278 kfree(header);
1283 kfree (rom_desc); 1279 kfree(rom_desc);
1284 kfree (ti_manuf_desc); 1280 kfree(ti_manuf_desc);
1285 return status; 1281 return status;
1286 } 1282 }
1287 1283
1288 // Update I2C with type 0xf2 record with correct size and checksum 1284 /* Update I2C with type 0xf2 record with correct
1289 status = TIWriteRom (serial, 1285 size and checksum */
1286 status = write_rom(serial,
1290 start_address, 1287 start_address,
1291 HEADER_SIZE, 1288 HEADER_SIZE,
1292 header); 1289 header);
1293 if (status) { 1290 if (status) {
1294 kfree (vheader); 1291 kfree(vheader);
1295 kfree (header); 1292 kfree(header);
1296 kfree (rom_desc); 1293 kfree(rom_desc);
1297 kfree (ti_manuf_desc); 1294 kfree(ti_manuf_desc);
1298 return status; 1295 return status;
1299 } 1296 }
1300 1297
1301 // verify the write -- must do this in order for write to 1298 /* verify the write -- must do this in order for
1302 // complete before we do the hardware reset 1299 write to complete before we do the hardware reset */
1303 status = TIReadRom (serial, 1300 status = read_rom(serial, start_address,
1304 start_address, 1301 HEADER_SIZE, vheader);
1305 HEADER_SIZE,
1306 vheader);
1307 1302
1308 if (status) { 1303 if (status) {
1309 dbg ("%s - can't read header back", __func__); 1304 dbg("%s - can't read header back", __func__);
1310 kfree (vheader); 1305 kfree(vheader);
1311 kfree (header); 1306 kfree(header);
1312 kfree (rom_desc); 1307 kfree(rom_desc);
1313 kfree (ti_manuf_desc); 1308 kfree(ti_manuf_desc);
1314 return status; 1309 return status;
1315 } 1310 }
1316 if (memcmp(vheader, header, HEADER_SIZE)) { 1311 if (memcmp(vheader, header, HEADER_SIZE)) {
1317 dbg ("%s - write download record failed", __func__); 1312 dbg("%s - write download record failed",
1318 kfree (vheader); 1313 __func__);
1319 kfree (header); 1314 kfree(vheader);
1320 kfree (rom_desc); 1315 kfree(header);
1321 kfree (ti_manuf_desc); 1316 kfree(rom_desc);
1317 kfree(ti_manuf_desc);
1322 return status; 1318 return status;
1323 } 1319 }
1324 1320
1325 kfree (vheader); 1321 kfree(vheader);
1326 kfree (header); 1322 kfree(header);
1327 1323
1328 dbg ("%s - Start firmware update", __func__); 1324 dbg("%s - Start firmware update", __func__);
1329 1325
1330 // Tell firmware to copy download image into I2C 1326 /* Tell firmware to copy download image into I2C */
1331 status = TISendVendorRequestSync (serial->serial->dev, 1327 status = ti_vsend_sync(serial->serial->dev,
1332 UMPC_COPY_DNLD_TO_I2C, // Request 1328 UMPC_COPY_DNLD_TO_I2C, 0, 0, NULL, 0);
1333 0, // wValue
1334 0, // wIndex
1335 NULL, // TransferBuffer
1336 0); // TransferBufferLength
1337 1329
1338 dbg ("%s - Update complete 0x%x", __func__, status); 1330 dbg("%s - Update complete 0x%x", __func__, status);
1339 if (status) { 1331 if (status) {
1340 dev_err (dev, "%s - UMPC_COPY_DNLD_TO_I2C failed\n", __func__); 1332 dev_err(dev,
1341 kfree (rom_desc); 1333 "%s - UMPC_COPY_DNLD_TO_I2C failed\n",
1342 kfree (ti_manuf_desc); 1334 __func__);
1335 kfree(rom_desc);
1336 kfree(ti_manuf_desc);
1343 return status; 1337 return status;
1344 } 1338 }
1345 } 1339 }
1346 1340
1347 // The device is running the download code 1341 // The device is running the download code
1348 kfree (rom_desc); 1342 kfree(rom_desc);
1349 kfree (ti_manuf_desc); 1343 kfree(ti_manuf_desc);
1350 return 0; 1344 return 0;
1351 } 1345 }
1352 1346
@@ -1355,32 +1349,26 @@ static int TIDownloadFirmware (struct edgeport_serial *serial)
1355 /********************************************************************/ 1349 /********************************************************************/
1356 dbg("%s - RUNNING IN BOOT MODE", __func__); 1350 dbg("%s - RUNNING IN BOOT MODE", __func__);
1357 1351
1358 // Configure the TI device so we can use the BULK pipes for download 1352 /* Configure the TI device so we can use the BULK pipes for download */
1359 status = TIConfigureBootDevice (serial->serial->dev); 1353 status = config_boot_dev(serial->serial->dev);
1360 if (status) 1354 if (status)
1361 return status; 1355 return status;
1362 1356
1363 if (le16_to_cpu(serial->serial->dev->descriptor.idVendor) != USB_VENDOR_ID_ION) { 1357 if (le16_to_cpu(serial->serial->dev->descriptor.idVendor)
1364 dbg ("%s - VID = 0x%x", __func__, 1358 != USB_VENDOR_ID_ION) {
1359 dbg("%s - VID = 0x%x", __func__,
1365 le16_to_cpu(serial->serial->dev->descriptor.idVendor)); 1360 le16_to_cpu(serial->serial->dev->descriptor.idVendor));
1366 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; 1361 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1367 goto StayInBootMode; 1362 goto stayinbootmode;
1368 } 1363 }
1369 1364
1370 // We have an ION device (I2c Must be programmed) 1365 /* We have an ION device (I2c Must be programmed)
1371 // Determine I2C image type 1366 Determine I2C image type */
1372 if (TIGetI2cTypeInBootMode(serial)) { 1367 if (i2c_type_bootmode(serial))
1373 goto StayInBootMode; 1368 goto stayinbootmode;
1374 }
1375 1369
1376 // Registry variable set? 1370 /* Check for ION Vendor ID and that the I2C is valid */
1377 if (TIStayInBootMode) { 1371 if (!check_i2c_image(serial)) {
1378 dbg ("%s - TIStayInBootMode", __func__);
1379 goto StayInBootMode;
1380 }
1381
1382 // Check for ION Vendor ID and that the I2C is valid
1383 if (!TiValidateI2cImage(serial)) {
1384 struct ti_i2c_image_header *header; 1372 struct ti_i2c_image_header *header;
1385 int i; 1373 int i;
1386 __u8 cs = 0; 1374 __u8 cs = 0;
@@ -1393,49 +1381,52 @@ static int TIDownloadFirmware (struct edgeport_serial *serial)
1393 /* Validate Hardware version number 1381 /* Validate Hardware version number
1394 * Read Manufacturing Descriptor from TI Based Edgeport 1382 * Read Manufacturing Descriptor from TI Based Edgeport
1395 */ 1383 */
1396 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); 1384 ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL);
1397 if (!ti_manuf_desc) { 1385 if (!ti_manuf_desc) {
1398 dev_err (dev, "%s - out of memory.\n", __func__); 1386 dev_err(dev, "%s - out of memory.\n", __func__);
1399 return -ENOMEM; 1387 return -ENOMEM;
1400 } 1388 }
1401 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); 1389 status = get_manuf_info(serial, (__u8 *)ti_manuf_desc);
1402 if (status) { 1390 if (status) {
1403 kfree (ti_manuf_desc); 1391 kfree(ti_manuf_desc);
1404 goto StayInBootMode; 1392 goto stayinbootmode;
1405 } 1393 }
1406 1394
1407 // Check for version 2 1395 /* Check for version 2 */
1408 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { 1396 if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
1409 dbg ("%s - Wrong CPU Rev %d (Must be 2)", __func__, 1397 dbg("%s - Wrong CPU Rev %d (Must be 2)",
1410 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); 1398 __func__, ti_cpu_rev(ti_manuf_desc));
1411 kfree (ti_manuf_desc); 1399 kfree(ti_manuf_desc);
1412 goto StayInBootMode; 1400 goto stayinbootmode;
1413 } 1401 }
1414 1402
1415 kfree (ti_manuf_desc); 1403 kfree(ti_manuf_desc);
1416 1404
1417 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1418 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1419 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1420 // And finally when the device comes back up in download mode the driver will cause
1421 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1422 // the record type from 0xf2 to 0x02.
1423
1424 /* 1405 /*
1406 * In order to update the I2C firmware we must change the type
1407 * 2 record to type 0xF2. This will force the UMP to come up
1408 * in Boot Mode. Then while in boot mode, the driver will
1409 * download the latest firmware (padded to 15.5k) into the
1410 * UMP ram. Finally when the device comes back up in download
1411 * mode the driver will cause the new firmware to be copied
1412 * from the UMP Ram to I2C and the firmware will update the
1413 * record type from 0xf2 to 0x02.
1414 *
1425 * Do we really have to copy the whole firmware image, 1415 * Do we really have to copy the whole firmware image,
1426 * or could we do this in place! 1416 * or could we do this in place!
1427 */ 1417 */
1428 1418
1429 // Allocate a 15.5k buffer + 3 byte header 1419 /* Allocate a 15.5k buffer + 3 byte header */
1430 buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header)); 1420 buffer_size = (((1024 * 16) - 512) +
1431 buffer = kmalloc (buffer_size, GFP_KERNEL); 1421 sizeof(struct ti_i2c_image_header));
1422 buffer = kmalloc(buffer_size, GFP_KERNEL);
1432 if (!buffer) { 1423 if (!buffer) {
1433 dev_err (dev, "%s - out of memory\n", __func__); 1424 dev_err(dev, "%s - out of memory\n", __func__);
1434 return -ENOMEM; 1425 return -ENOMEM;
1435 } 1426 }
1436 1427
1437 // Initialize the buffer to 0xff (pad the buffer) 1428 /* Initialize the buffer to 0xff (pad the buffer) */
1438 memset (buffer, 0xff, buffer_size); 1429 memset(buffer, 0xff, buffer_size);
1439 1430
1440 err = request_firmware(&fw, fw_name, dev); 1431 err = request_firmware(&fw, fw_name, dev);
1441 if (err) { 1432 if (err) {
@@ -1447,38 +1438,43 @@ static int TIDownloadFirmware (struct edgeport_serial *serial)
1447 memcpy(buffer, &fw->data[4], fw->size - 4); 1438 memcpy(buffer, &fw->data[4], fw->size - 4);
1448 release_firmware(fw); 1439 release_firmware(fw);
1449 1440
1450 for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) { 1441 for (i = sizeof(struct ti_i2c_image_header);
1442 i < buffer_size; i++) {
1451 cs = (__u8)(cs + buffer[i]); 1443 cs = (__u8)(cs + buffer[i]);
1452 } 1444 }
1453 1445
1454 header = (struct ti_i2c_image_header *)buffer; 1446 header = (struct ti_i2c_image_header *)buffer;
1455 1447
1456 // update length and checksum after padding 1448 /* update length and checksum after padding */
1457 header->Length = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_i2c_image_header))); 1449 header->Length = cpu_to_le16((__u16)(buffer_size -
1450 sizeof(struct ti_i2c_image_header)));
1458 header->CheckSum = cs; 1451 header->CheckSum = cs;
1459 1452
1460 // Download the operational code 1453 /* Download the operational code */
1461 dbg ("%s - Downloading operational code image (TI UMP)", __func__); 1454 dbg("%s - Downloading operational code image (TI UMP)",
1462 status = TIDownloadCodeImage (serial, buffer, buffer_size); 1455 __func__);
1456 status = download_code(serial, buffer, buffer_size);
1463 1457
1464 kfree (buffer); 1458 kfree(buffer);
1465 1459
1466 if (status) { 1460 if (status) {
1467 dbg ("%s - Error downloading operational code image", __func__); 1461 dbg("%s - Error downloading operational code image",
1462 __func__);
1468 return status; 1463 return status;
1469 } 1464 }
1470 1465
1471 // Device will reboot 1466 /* Device will reboot */
1472 serial->product_info.TiMode = TI_MODE_TRANSITIONING; 1467 serial->product_info.TiMode = TI_MODE_TRANSITIONING;
1473 1468
1474 dbg ("%s - Download successful -- Device rebooting...", __func__); 1469 dbg("%s - Download successful -- Device rebooting...",
1470 __func__);
1475 1471
1476 /* return an error on purpose */ 1472 /* return an error on purpose */
1477 return -ENODEV; 1473 return -ENODEV;
1478 } 1474 }
1479 1475
1480StayInBootMode: 1476stayinbootmode:
1481 // Eprom is invalid or blank stay in boot mode 1477 /* Eprom is invalid or blank stay in boot mode */
1482 dbg("%s - STAYING IN BOOT MODE", __func__); 1478 dbg("%s - STAYING IN BOOT MODE", __func__);
1483 serial->product_info.TiMode = TI_MODE_BOOT; 1479 serial->product_info.TiMode = TI_MODE_BOOT;
1484 1480
@@ -1486,156 +1482,33 @@ StayInBootMode:
1486} 1482}
1487 1483
1488 1484
1489static int TISetDtr (struct edgeport_port *port) 1485static int ti_do_config(struct edgeport_port *port, int feature, int on)
1490{
1491 int port_number = port->port->number - port->port->serial->minor;
1492
1493 dbg ("%s", __func__);
1494 port->shadow_mcr |= MCR_DTR;
1495
1496 return TIWriteCommandSync (port->port->serial->dev,
1497 UMPC_SET_CLR_DTR,
1498 (__u8)(UMPM_UART1_PORT + port_number),
1499 1, /* set */
1500 NULL,
1501 0);
1502}
1503
1504static int TIClearDtr (struct edgeport_port *port)
1505{
1506 int port_number = port->port->number - port->port->serial->minor;
1507
1508 dbg ("%s", __func__);
1509 port->shadow_mcr &= ~MCR_DTR;
1510
1511 return TIWriteCommandSync (port->port->serial->dev,
1512 UMPC_SET_CLR_DTR,
1513 (__u8)(UMPM_UART1_PORT + port_number),
1514 0, /* clear */
1515 NULL,
1516 0);
1517}
1518
1519static int TISetRts (struct edgeport_port *port)
1520{
1521 int port_number = port->port->number - port->port->serial->minor;
1522
1523 dbg ("%s", __func__);
1524 port->shadow_mcr |= MCR_RTS;
1525
1526 return TIWriteCommandSync (port->port->serial->dev,
1527 UMPC_SET_CLR_RTS,
1528 (__u8)(UMPM_UART1_PORT + port_number),
1529 1, /* set */
1530 NULL,
1531 0);
1532}
1533
1534static int TIClearRts (struct edgeport_port *port)
1535{
1536 int port_number = port->port->number - port->port->serial->minor;
1537
1538 dbg ("%s", __func__);
1539 port->shadow_mcr &= ~MCR_RTS;
1540
1541 return TIWriteCommandSync (port->port->serial->dev,
1542 UMPC_SET_CLR_RTS,
1543 (__u8)(UMPM_UART1_PORT + port_number),
1544 0, /* clear */
1545 NULL,
1546 0);
1547}
1548
1549static int TISetLoopBack (struct edgeport_port *port)
1550{
1551 int port_number = port->port->number - port->port->serial->minor;
1552
1553 dbg ("%s", __func__);
1554
1555 return TIWriteCommandSync (port->port->serial->dev,
1556 UMPC_SET_CLR_LOOPBACK,
1557 (__u8)(UMPM_UART1_PORT + port_number),
1558 1, /* set */
1559 NULL,
1560 0);
1561}
1562
1563static int TIClearLoopBack (struct edgeport_port *port)
1564{
1565 int port_number = port->port->number - port->port->serial->minor;
1566
1567 dbg ("%s", __func__);
1568
1569 return TIWriteCommandSync (port->port->serial->dev,
1570 UMPC_SET_CLR_LOOPBACK,
1571 (__u8)(UMPM_UART1_PORT + port_number),
1572 0, /* clear */
1573 NULL,
1574 0);
1575}
1576
1577static int TISetBreak (struct edgeport_port *port)
1578{ 1486{
1579 int port_number = port->port->number - port->port->serial->minor; 1487 int port_number = port->port->number - port->port->serial->minor;
1580 1488 on = !!on; /* 1 or 0 not bitmask */
1581 dbg ("%s", __func__); 1489 return send_cmd(port->port->serial->dev,
1582 1490 feature, (__u8)(UMPM_UART1_PORT + port_number),
1583 return TIWriteCommandSync (port->port->serial->dev, 1491 on, NULL, 0);
1584 UMPC_SET_CLR_BREAK,
1585 (__u8)(UMPM_UART1_PORT + port_number),
1586 1, /* set */
1587 NULL,
1588 0);
1589} 1492}
1590 1493
1591static int TIClearBreak (struct edgeport_port *port)
1592{
1593 int port_number = port->port->number - port->port->serial->minor;
1594
1595 dbg ("%s", __func__);
1596 1494
1597 return TIWriteCommandSync (port->port->serial->dev, 1495static int restore_mcr(struct edgeport_port *port, __u8 mcr)
1598 UMPC_SET_CLR_BREAK,
1599 (__u8)(UMPM_UART1_PORT + port_number),
1600 0, /* clear */
1601 NULL,
1602 0);
1603}
1604
1605static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr)
1606{ 1496{
1607 int status = 0; 1497 int status = 0;
1608 1498
1609 dbg ("%s - %x", __func__, mcr); 1499 dbg("%s - %x", __func__, mcr);
1610
1611 if (mcr & MCR_DTR)
1612 status = TISetDtr (port);
1613 else
1614 status = TIClearDtr (port);
1615 1500
1501 status = ti_do_config(port, UMPC_SET_CLR_DTR, mcr & MCR_DTR);
1616 if (status) 1502 if (status)
1617 return status; 1503 return status;
1618 1504 status = ti_do_config(port, UMPC_SET_CLR_RTS, mcr & MCR_RTS);
1619 if (mcr & MCR_RTS)
1620 status = TISetRts (port);
1621 else
1622 status = TIClearRts (port);
1623
1624 if (status) 1505 if (status)
1625 return status; 1506 return status;
1626 1507 return ti_do_config(port, UMPC_SET_CLR_LOOPBACK, mcr & MCR_LOOPBACK);
1627 if (mcr & MCR_LOOPBACK)
1628 status = TISetLoopBack (port);
1629 else
1630 status = TIClearLoopBack (port);
1631
1632 return status;
1633} 1508}
1634 1509
1635
1636
1637/* Convert TI LSR to standard UART flags */ 1510/* Convert TI LSR to standard UART flags */
1638static __u8 MapLineStatus (__u8 ti_lsr) 1511static __u8 map_line_status(__u8 ti_lsr)
1639{ 1512{
1640 __u8 lsr = 0; 1513 __u8 lsr = 0;
1641 1514
@@ -1647,22 +1520,23 @@ static __u8 MapLineStatus (__u8 ti_lsr)
1647 MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */ 1520 MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */
1648 MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */ 1521 MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */
1649 MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */ 1522 MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */
1650 MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */ 1523 MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* rx data available */
1651 MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */ 1524 MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* tx hold reg empty */
1652 1525
1653#undef MAP_FLAG 1526#undef MAP_FLAG
1654 1527
1655 return lsr; 1528 return lsr;
1656} 1529}
1657 1530
1658static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr) 1531static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr)
1659{ 1532{
1660 struct async_icount *icount; 1533 struct async_icount *icount;
1661 struct tty_struct *tty; 1534 struct tty_struct *tty;
1662 1535
1663 dbg ("%s - %02x", __func__, msr); 1536 dbg("%s - %02x", __func__, msr);
1664 1537
1665 if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) { 1538 if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR |
1539 EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
1666 icount = &edge_port->icount; 1540 icount = &edge_port->icount;
1667 1541
1668 /* update input line counters */ 1542 /* update input line counters */
@@ -1674,13 +1548,13 @@ static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr)
1674 icount->dcd++; 1548 icount->dcd++;
1675 if (msr & EDGEPORT_MSR_DELTA_RI) 1549 if (msr & EDGEPORT_MSR_DELTA_RI)
1676 icount->rng++; 1550 icount->rng++;
1677 wake_up_interruptible (&edge_port->delta_msr_wait); 1551 wake_up_interruptible(&edge_port->delta_msr_wait);
1678 } 1552 }
1679 1553
1680 /* Save the new modem status */ 1554 /* Save the new modem status */
1681 edge_port->shadow_msr = msr & 0xf0; 1555 edge_port->shadow_msr = msr & 0xf0;
1682 1556
1683 tty = edge_port->port->tty; 1557 tty = edge_port->port->port.tty;
1684 /* handle CTS flow control */ 1558 /* handle CTS flow control */
1685 if (tty && C_CRTSCTS(tty)) { 1559 if (tty && C_CRTSCTS(tty)) {
1686 if (msr & EDGEPORT_MSR_CTS) { 1560 if (msr & EDGEPORT_MSR_CTS) {
@@ -1694,26 +1568,27 @@ static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr)
1694 return; 1568 return;
1695} 1569}
1696 1570
1697static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data) 1571static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
1572 __u8 lsr, __u8 data)
1698{ 1573{
1699 struct async_icount *icount; 1574 struct async_icount *icount;
1700 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK)); 1575 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR |
1576 LSR_FRM_ERR | LSR_BREAK));
1701 1577
1702 dbg ("%s - %02x", __func__, new_lsr); 1578 dbg("%s - %02x", __func__, new_lsr);
1703 1579
1704 edge_port->shadow_lsr = lsr; 1580 edge_port->shadow_lsr = lsr;
1705 1581
1706 if (new_lsr & LSR_BREAK) { 1582 if (new_lsr & LSR_BREAK)
1707 /* 1583 /*
1708 * Parity and Framing errors only count if they 1584 * Parity and Framing errors only count if they
1709 * occur exclusive of a break being received. 1585 * occur exclusive of a break being received.
1710 */ 1586 */
1711 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); 1587 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
1712 }
1713 1588
1714 /* Place LSR data byte into Rx buffer */ 1589 /* Place LSR data byte into Rx buffer */
1715 if (lsr_data && edge_port->port->tty) 1590 if (lsr_data && edge_port->port->port.tty)
1716 edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1); 1591 edge_tty_recv(&edge_port->port->dev, edge_port->port->port.tty, &data, 1);
1717 1592
1718 /* update input line counters */ 1593 /* update input line counters */
1719 icount = &edge_port->icount; 1594 icount = &edge_port->icount;
@@ -1728,7 +1603,7 @@ static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8
1728} 1603}
1729 1604
1730 1605
1731static void edge_interrupt_callback (struct urb *urb) 1606static void edge_interrupt_callback(struct urb *urb)
1732{ 1607{
1733 struct edgeport_serial *edge_serial = urb->context; 1608 struct edgeport_serial *edge_serial = urb->context;
1734 struct usb_serial_port *port; 1609 struct usb_serial_port *port;
@@ -1762,66 +1637,71 @@ static void edge_interrupt_callback (struct urb *urb)
1762 } 1637 }
1763 1638
1764 if (!length) { 1639 if (!length) {
1765 dbg ("%s - no data in urb", __func__); 1640 dbg("%s - no data in urb", __func__);
1766 goto exit; 1641 goto exit;
1767 } 1642 }
1768 1643
1769 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __func__, length, data); 1644 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev,
1770 1645 __func__, length, data);
1646
1771 if (length != 2) { 1647 if (length != 2) {
1772 dbg ("%s - expecting packet of size 2, got %d", __func__, length); 1648 dbg("%s - expecting packet of size 2, got %d",
1649 __func__, length);
1773 goto exit; 1650 goto exit;
1774 } 1651 }
1775 1652
1776 port_number = TIUMP_GET_PORT_FROM_CODE (data[0]); 1653 port_number = TIUMP_GET_PORT_FROM_CODE(data[0]);
1777 function = TIUMP_GET_FUNC_FROM_CODE (data[0]); 1654 function = TIUMP_GET_FUNC_FROM_CODE(data[0]);
1778 dbg ("%s - port_number %d, function %d, info 0x%x", 1655 dbg("%s - port_number %d, function %d, info 0x%x",
1779 __func__, port_number, function, data[1]); 1656 __func__, port_number, function, data[1]);
1780 port = edge_serial->serial->port[port_number]; 1657 port = edge_serial->serial->port[port_number];
1781 edge_port = usb_get_serial_port_data(port); 1658 edge_port = usb_get_serial_port_data(port);
1782 if (!edge_port) { 1659 if (!edge_port) {
1783 dbg ("%s - edge_port not found", __func__); 1660 dbg("%s - edge_port not found", __func__);
1784 return; 1661 return;
1785 } 1662 }
1786 switch (function) { 1663 switch (function) {
1787 case TIUMP_INTERRUPT_CODE_LSR: 1664 case TIUMP_INTERRUPT_CODE_LSR:
1788 lsr = MapLineStatus(data[1]); 1665 lsr = map_line_status(data[1]);
1789 if (lsr & UMP_UART_LSR_DATA_MASK) { 1666 if (lsr & UMP_UART_LSR_DATA_MASK) {
1790 /* Save the LSR event for bulk read completion routine */ 1667 /* Save the LSR event for bulk read
1791 dbg ("%s - LSR Event Port %u LSR Status = %02x", 1668 completion routine */
1669 dbg("%s - LSR Event Port %u LSR Status = %02x",
1792 __func__, port_number, lsr); 1670 __func__, port_number, lsr);
1793 edge_port->lsr_event = 1; 1671 edge_port->lsr_event = 1;
1794 edge_port->lsr_mask = lsr; 1672 edge_port->lsr_mask = lsr;
1795 } else { 1673 } else {
1796 dbg ("%s - ===== Port %d LSR Status = %02x ======", 1674 dbg("%s - ===== Port %d LSR Status = %02x ======",
1797 __func__, port_number, lsr); 1675 __func__, port_number, lsr);
1798 handle_new_lsr (edge_port, 0, lsr, 0); 1676 handle_new_lsr(edge_port, 0, lsr, 0);
1799 } 1677 }
1800 break; 1678 break;
1801 1679
1802 case TIUMP_INTERRUPT_CODE_MSR: // MSR 1680 case TIUMP_INTERRUPT_CODE_MSR: /* MSR */
1803 /* Copy MSR from UMP */ 1681 /* Copy MSR from UMP */
1804 msr = data[1]; 1682 msr = data[1];
1805 dbg ("%s - ===== Port %u MSR Status = %02x ======\n", 1683 dbg("%s - ===== Port %u MSR Status = %02x ======\n",
1806 __func__, port_number, msr); 1684 __func__, port_number, msr);
1807 handle_new_msr (edge_port, msr); 1685 handle_new_msr(edge_port, msr);
1808 break; 1686 break;
1809 1687
1810 default: 1688 default:
1811 dev_err (&urb->dev->dev, "%s - Unknown Interrupt code from UMP %x\n", 1689 dev_err(&urb->dev->dev,
1812 __func__, data[1]); 1690 "%s - Unknown Interrupt code from UMP %x\n",
1691 __func__, data[1]);
1813 break; 1692 break;
1814 1693
1815 } 1694 }
1816 1695
1817exit: 1696exit:
1818 retval = usb_submit_urb (urb, GFP_ATOMIC); 1697 retval = usb_submit_urb(urb, GFP_ATOMIC);
1819 if (retval) 1698 if (retval)
1820 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", 1699 dev_err(&urb->dev->dev,
1700 "%s - usb_submit_urb failed with result %d\n",
1821 __func__, retval); 1701 __func__, retval);
1822} 1702}
1823 1703
1824static void edge_bulk_in_callback (struct urb *urb) 1704static void edge_bulk_in_callback(struct urb *urb)
1825{ 1705{
1826 struct edgeport_port *edge_port = urb->context; 1706 struct edgeport_port *edge_port = urb->context;
1827 unsigned char *data = urb->transfer_buffer; 1707 unsigned char *data = urb->transfer_buffer;
@@ -1844,15 +1724,16 @@ static void edge_bulk_in_callback (struct urb *urb)
1844 __func__, status); 1724 __func__, status);
1845 return; 1725 return;
1846 default: 1726 default:
1847 dev_err (&urb->dev->dev,"%s - nonzero read bulk status received: %d\n", 1727 dev_err(&urb->dev->dev,
1848 __func__, status); 1728 "%s - nonzero read bulk status received: %d\n",
1729 __func__, status);
1849 } 1730 }
1850 1731
1851 if (status == -EPIPE) 1732 if (status == -EPIPE)
1852 goto exit; 1733 goto exit;
1853 1734
1854 if (status) { 1735 if (status) {
1855 dev_err(&urb->dev->dev,"%s - stopping read!\n", __func__); 1736 dev_err(&urb->dev->dev, "%s - stopping read!\n", __func__);
1856 return; 1737 return;
1857 } 1738 }
1858 1739
@@ -1860,23 +1741,24 @@ static void edge_bulk_in_callback (struct urb *urb)
1860 1741
1861 if (edge_port->lsr_event) { 1742 if (edge_port->lsr_event) {
1862 edge_port->lsr_event = 0; 1743 edge_port->lsr_event = 0;
1863 dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======", 1744 dbg("%s ===== Port %u LSR Status = %02x, Data = %02x ======",
1864 __func__, port_number, edge_port->lsr_mask, *data); 1745 __func__, port_number, edge_port->lsr_mask, *data);
1865 handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data); 1746 handle_new_lsr(edge_port, 1, edge_port->lsr_mask, *data);
1866 /* Adjust buffer length/pointer */ 1747 /* Adjust buffer length/pointer */
1867 --urb->actual_length; 1748 --urb->actual_length;
1868 ++data; 1749 ++data;
1869 } 1750 }
1870 1751
1871 tty = edge_port->port->tty; 1752 tty = edge_port->port->port.tty;
1872 if (tty && urb->actual_length) { 1753 if (tty && urb->actual_length) {
1873 usb_serial_debug_data(debug, &edge_port->port->dev, __func__, urb->actual_length, data); 1754 usb_serial_debug_data(debug, &edge_port->port->dev,
1874 1755 __func__, urb->actual_length, data);
1875 if (edge_port->close_pending) { 1756 if (edge_port->close_pending)
1876 dbg ("%s - close is pending, dropping data on the floor.", __func__); 1757 dbg("%s - close pending, dropping data on the floor",
1877 } else { 1758 __func__);
1878 edge_tty_recv(&edge_port->port->dev, tty, data, urb->actual_length); 1759 else
1879 } 1760 edge_tty_recv(&edge_port->port->dev, tty, data,
1761 urb->actual_length);
1880 edge_port->icount.rx += urb->actual_length; 1762 edge_port->icount.rx += urb->actual_length;
1881 } 1763 }
1882 1764
@@ -1891,37 +1773,31 @@ exit:
1891 } 1773 }
1892 spin_unlock(&edge_port->ep_lock); 1774 spin_unlock(&edge_port->ep_lock);
1893 if (retval) 1775 if (retval)
1894 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", 1776 dev_err(&urb->dev->dev,
1777 "%s - usb_submit_urb failed with result %d\n",
1895 __func__, retval); 1778 __func__, retval);
1896} 1779}
1897 1780
1898static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length) 1781static void edge_tty_recv(struct device *dev, struct tty_struct *tty,
1782 unsigned char *data, int length)
1899{ 1783{
1900 int cnt; 1784 int queued;
1901
1902 do {
1903 cnt = tty_buffer_request_room(tty, length);
1904 if (cnt < length) {
1905 dev_err(dev, "%s - dropping data, %d bytes lost\n",
1906 __func__, length - cnt);
1907 if(cnt == 0)
1908 break;
1909 }
1910 tty_insert_flip_string(tty, data, cnt);
1911 data += cnt;
1912 length -= cnt;
1913 } while (length > 0);
1914 1785
1786 tty_buffer_request_room(tty, length);
1787 queued = tty_insert_flip_string(tty, data, length);
1788 if (queued < length)
1789 dev_err(dev, "%s - dropping data, %d bytes lost\n",
1790 __func__, length - queued);
1915 tty_flip_buffer_push(tty); 1791 tty_flip_buffer_push(tty);
1916} 1792}
1917 1793
1918static void edge_bulk_out_callback (struct urb *urb) 1794static void edge_bulk_out_callback(struct urb *urb)
1919{ 1795{
1920 struct usb_serial_port *port = urb->context; 1796 struct usb_serial_port *port = urb->context;
1921 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1797 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1922 int status = urb->status; 1798 int status = urb->status;
1923 1799
1924 dbg ("%s - port %d", __func__, port->number); 1800 dbg("%s - port %d", __func__, port->number);
1925 1801
1926 edge_port->ep_write_urb_in_use = 0; 1802 edge_port->ep_write_urb_in_use = 0;
1927 1803
@@ -1942,10 +1818,11 @@ static void edge_bulk_out_callback (struct urb *urb)
1942 } 1818 }
1943 1819
1944 /* send any buffered data */ 1820 /* send any buffered data */
1945 edge_send(port); 1821 edge_send(port->port.tty);
1946} 1822}
1947 1823
1948static int edge_open (struct usb_serial_port *port, struct file * filp) 1824static int edge_open(struct tty_struct *tty,
1825 struct usb_serial_port *port, struct file *filp)
1949{ 1826{
1950 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1827 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1951 struct edgeport_serial *edge_serial; 1828 struct edgeport_serial *edge_serial;
@@ -1961,122 +1838,125 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
1961 if (edge_port == NULL) 1838 if (edge_port == NULL)
1962 return -ENODEV; 1839 return -ENODEV;
1963 1840
1964 port->tty->low_latency = low_latency; 1841 if (tty)
1842 tty->low_latency = low_latency;
1965 1843
1966 port_number = port->number - port->serial->minor; 1844 port_number = port->number - port->serial->minor;
1967 switch (port_number) { 1845 switch (port_number) {
1968 case 0: 1846 case 0:
1969 edge_port->uart_base = UMPMEM_BASE_UART1; 1847 edge_port->uart_base = UMPMEM_BASE_UART1;
1970 edge_port->dma_address = UMPD_OEDB1_ADDRESS; 1848 edge_port->dma_address = UMPD_OEDB1_ADDRESS;
1971 break; 1849 break;
1972 case 1: 1850 case 1:
1973 edge_port->uart_base = UMPMEM_BASE_UART2; 1851 edge_port->uart_base = UMPMEM_BASE_UART2;
1974 edge_port->dma_address = UMPD_OEDB2_ADDRESS; 1852 edge_port->dma_address = UMPD_OEDB2_ADDRESS;
1975 break; 1853 break;
1976 default: 1854 default:
1977 dev_err (&port->dev, "Unknown port number!!!\n"); 1855 dev_err(&port->dev, "Unknown port number!!!\n");
1978 return -ENODEV; 1856 return -ENODEV;
1979 } 1857 }
1980 1858
1981 dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x", 1859 dbg("%s - port_number = %d, uart_base = %04x, dma_address = %04x",
1982 __func__, port_number, edge_port->uart_base, edge_port->dma_address); 1860 __func__, port_number, edge_port->uart_base,
1861 edge_port->dma_address);
1983 1862
1984 dev = port->serial->dev; 1863 dev = port->serial->dev;
1985 1864
1986 memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount)); 1865 memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount));
1987 init_waitqueue_head (&edge_port->delta_msr_wait); 1866 init_waitqueue_head(&edge_port->delta_msr_wait);
1988 1867
1989 /* turn off loopback */ 1868 /* turn off loopback */
1990 status = TIClearLoopBack (edge_port); 1869 status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0);
1991 if (status) { 1870 if (status) {
1992 dev_err(&port->dev,"%s - cannot send clear loopback command, %d\n", 1871 dev_err(&port->dev,
1872 "%s - cannot send clear loopback command, %d\n",
1993 __func__, status); 1873 __func__, status);
1994 return status; 1874 return status;
1995 } 1875 }
1996 1876
1997 /* set up the port settings */ 1877 /* set up the port settings */
1998 edge_set_termios (port, port->tty->termios); 1878 if (tty)
1879 edge_set_termios(tty, port, port->port.tty->termios);
1999 1880
2000 /* open up the port */ 1881 /* open up the port */
2001 1882
2002 /* milliseconds to timeout for DMA transfer */ 1883 /* milliseconds to timeout for DMA transfer */
2003 transaction_timeout = 2; 1884 transaction_timeout = 2;
2004 1885
2005 edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) ); 1886 edge_port->ump_read_timeout =
1887 max(20, ((transaction_timeout * 3) / 2));
2006 1888
2007 // milliseconds to timeout for DMA transfer 1889 /* milliseconds to timeout for DMA transfer */
2008 open_settings = (u8)(UMP_DMA_MODE_CONTINOUS | 1890 open_settings = (u8)(UMP_DMA_MODE_CONTINOUS |
2009 UMP_PIPE_TRANS_TIMEOUT_ENA | 1891 UMP_PIPE_TRANS_TIMEOUT_ENA |
2010 (transaction_timeout << 2)); 1892 (transaction_timeout << 2));
2011 1893
2012 dbg ("%s - Sending UMPC_OPEN_PORT", __func__); 1894 dbg("%s - Sending UMPC_OPEN_PORT", __func__);
2013 1895
2014 /* Tell TI to open and start the port */ 1896 /* Tell TI to open and start the port */
2015 status = TIWriteCommandSync (dev, 1897 status = send_cmd(dev, UMPC_OPEN_PORT,
2016 UMPC_OPEN_PORT, 1898 (u8)(UMPM_UART1_PORT + port_number), open_settings, NULL, 0);
2017 (u8)(UMPM_UART1_PORT + port_number),
2018 open_settings,
2019 NULL,
2020 0);
2021 if (status) { 1899 if (status) {
2022 dev_err(&port->dev,"%s - cannot send open command, %d\n", __func__, status); 1900 dev_err(&port->dev, "%s - cannot send open command, %d\n",
1901 __func__, status);
2023 return status; 1902 return status;
2024 } 1903 }
2025 1904
2026 /* Start the DMA? */ 1905 /* Start the DMA? */
2027 status = TIWriteCommandSync (dev, 1906 status = send_cmd(dev, UMPC_START_PORT,
2028 UMPC_START_PORT, 1907 (u8)(UMPM_UART1_PORT + port_number), 0, NULL, 0);
2029 (u8)(UMPM_UART1_PORT + port_number),
2030 0,
2031 NULL,
2032 0);
2033 if (status) { 1908 if (status) {
2034 dev_err(&port->dev,"%s - cannot send start DMA command, %d\n", __func__, status); 1909 dev_err(&port->dev, "%s - cannot send start DMA command, %d\n",
1910 __func__, status);
2035 return status; 1911 return status;
2036 } 1912 }
2037 1913
2038 /* Clear TX and RX buffers in UMP */ 1914 /* Clear TX and RX buffers in UMP */
2039 status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN); 1915 status = purge_port(port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN);
2040 if (status) { 1916 if (status) {
2041 dev_err(&port->dev,"%s - cannot send clear buffers command, %d\n", __func__, status); 1917 dev_err(&port->dev,
1918 "%s - cannot send clear buffers command, %d\n",
1919 __func__, status);
2042 return status; 1920 return status;
2043 } 1921 }
2044 1922
2045 /* Read Initial MSR */ 1923 /* Read Initial MSR */
2046 status = TIReadVendorRequestSync (dev, 1924 status = ti_vread_sync(dev, UMPC_READ_MSR, 0,
2047 UMPC_READ_MSR, // Request 1925 (__u16)(UMPM_UART1_PORT + port_number),
2048 0, // wValue 1926 &edge_port->shadow_msr, 1);
2049 (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address)
2050 &edge_port->shadow_msr, // TransferBuffer
2051 1); // TransferBufferLength
2052 if (status) { 1927 if (status) {
2053 dev_err(&port->dev,"%s - cannot send read MSR command, %d\n", __func__, status); 1928 dev_err(&port->dev, "%s - cannot send read MSR command, %d\n",
1929 __func__, status);
2054 return status; 1930 return status;
2055 } 1931 }
2056 1932
2057 dbg ("ShadowMSR 0x%X", edge_port->shadow_msr); 1933 dbg("ShadowMSR 0x%X", edge_port->shadow_msr);
2058 1934
2059 /* Set Initial MCR */ 1935 /* Set Initial MCR */
2060 edge_port->shadow_mcr = MCR_RTS | MCR_DTR; 1936 edge_port->shadow_mcr = MCR_RTS | MCR_DTR;
2061 dbg ("ShadowMCR 0x%X", edge_port->shadow_mcr); 1937 dbg("ShadowMCR 0x%X", edge_port->shadow_mcr);
2062 1938
2063 edge_serial = edge_port->edge_serial; 1939 edge_serial = edge_port->edge_serial;
2064 if (mutex_lock_interruptible(&edge_serial->es_lock)) 1940 if (mutex_lock_interruptible(&edge_serial->es_lock))
2065 return -ERESTARTSYS; 1941 return -ERESTARTSYS;
2066 if (edge_serial->num_ports_open == 0) { 1942 if (edge_serial->num_ports_open == 0) {
2067 /* we are the first port to be opened, let's post the interrupt urb */ 1943 /* we are the first port to open, post the interrupt urb */
2068 urb = edge_serial->serial->port[0]->interrupt_in_urb; 1944 urb = edge_serial->serial->port[0]->interrupt_in_urb;
2069 if (!urb) { 1945 if (!urb) {
2070 dev_err (&port->dev, "%s - no interrupt urb present, exiting\n", __func__); 1946 dev_err(&port->dev,
1947 "%s - no interrupt urb present, exiting\n",
1948 __func__);
2071 status = -EINVAL; 1949 status = -EINVAL;
2072 goto release_es_lock; 1950 goto release_es_lock;
2073 } 1951 }
2074 urb->complete = edge_interrupt_callback; 1952 urb->complete = edge_interrupt_callback;
2075 urb->context = edge_serial; 1953 urb->context = edge_serial;
2076 urb->dev = dev; 1954 urb->dev = dev;
2077 status = usb_submit_urb (urb, GFP_KERNEL); 1955 status = usb_submit_urb(urb, GFP_KERNEL);
2078 if (status) { 1956 if (status) {
2079 dev_err (&port->dev, "%s - usb_submit_urb failed with value %d\n", __func__, status); 1957 dev_err(&port->dev,
1958 "%s - usb_submit_urb failed with value %d\n",
1959 __func__, status);
2080 goto release_es_lock; 1960 goto release_es_lock;
2081 } 1961 }
2082 } 1962 }
@@ -2085,13 +1965,14 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
2085 * reset the data toggle on the bulk endpoints to work around bug in 1965 * reset the data toggle on the bulk endpoints to work around bug in
2086 * host controllers where things get out of sync some times 1966 * host controllers where things get out of sync some times
2087 */ 1967 */
2088 usb_clear_halt (dev, port->write_urb->pipe); 1968 usb_clear_halt(dev, port->write_urb->pipe);
2089 usb_clear_halt (dev, port->read_urb->pipe); 1969 usb_clear_halt(dev, port->read_urb->pipe);
2090 1970
2091 /* start up our bulk read urb */ 1971 /* start up our bulk read urb */
2092 urb = port->read_urb; 1972 urb = port->read_urb;
2093 if (!urb) { 1973 if (!urb) {
2094 dev_err (&port->dev, "%s - no read urb present, exiting\n", __func__); 1974 dev_err(&port->dev, "%s - no read urb present, exiting\n",
1975 __func__);
2095 status = -EINVAL; 1976 status = -EINVAL;
2096 goto unlink_int_urb; 1977 goto unlink_int_urb;
2097 } 1978 }
@@ -2099,9 +1980,11 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
2099 urb->complete = edge_bulk_in_callback; 1980 urb->complete = edge_bulk_in_callback;
2100 urb->context = edge_port; 1981 urb->context = edge_port;
2101 urb->dev = dev; 1982 urb->dev = dev;
2102 status = usb_submit_urb (urb, GFP_KERNEL); 1983 status = usb_submit_urb(urb, GFP_KERNEL);
2103 if (status) { 1984 if (status) {
2104 dev_err (&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __func__, status); 1985 dev_err(&port->dev,
1986 "%s - read bulk usb_submit_urb failed with value %d\n",
1987 __func__, status);
2105 goto unlink_int_urb; 1988 goto unlink_int_urb;
2106 } 1989 }
2107 1990
@@ -2119,7 +2002,8 @@ release_es_lock:
2119 return status; 2002 return status;
2120} 2003}
2121 2004
2122static void edge_close (struct usb_serial_port *port, struct file *filp) 2005static void edge_close(struct tty_struct *tty,
2006 struct usb_serial_port *port, struct file *filp)
2123{ 2007{
2124 struct edgeport_serial *edge_serial; 2008 struct edgeport_serial *edge_serial;
2125 struct edgeport_port *edge_port; 2009 struct edgeport_port *edge_port;
@@ -2127,18 +2011,18 @@ static void edge_close (struct usb_serial_port *port, struct file *filp)
2127 int status; 2011 int status;
2128 2012
2129 dbg("%s - port %d", __func__, port->number); 2013 dbg("%s - port %d", __func__, port->number);
2130 2014
2131 edge_serial = usb_get_serial_data(port->serial); 2015 edge_serial = usb_get_serial_data(port->serial);
2132 edge_port = usb_get_serial_port_data(port); 2016 edge_port = usb_get_serial_port_data(port);
2133 if ((edge_serial == NULL) || (edge_port == NULL)) 2017 if (edge_serial == NULL || edge_port == NULL)
2134 return; 2018 return;
2135 2019
2136 /* The bulkreadcompletion routine will check 2020 /* The bulkreadcompletion routine will check
2137 * this flag and dump add read data */ 2021 * this flag and dump add read data */
2138 edge_port->close_pending = 1; 2022 edge_port->close_pending = 1;
2139 2023
2140 /* chase the port close and flush */ 2024 /* chase the port close and flush */
2141 TIChasePort (edge_port, (HZ*closing_wait)/100, 1); 2025 chase_port(edge_port, (HZ * closing_wait) / 100, 1);
2142 2026
2143 usb_kill_urb(port->read_urb); 2027 usb_kill_urb(port->read_urb);
2144 usb_kill_urb(port->write_urb); 2028 usb_kill_urb(port->write_urb);
@@ -2148,7 +2032,7 @@ static void edge_close (struct usb_serial_port *port, struct file *filp)
2148 * send a close port command to it */ 2032 * send a close port command to it */
2149 dbg("%s - send umpc_close_port", __func__); 2033 dbg("%s - send umpc_close_port", __func__);
2150 port_number = port->number - port->serial->minor; 2034 port_number = port->number - port->serial->minor;
2151 status = TIWriteCommandSync (port->serial->dev, 2035 status = send_cmd(port->serial->dev,
2152 UMPC_CLOSE_PORT, 2036 UMPC_CLOSE_PORT,
2153 (__u8)(UMPM_UART1_PORT + port_number), 2037 (__u8)(UMPM_UART1_PORT + port_number),
2154 0, 2038 0,
@@ -2167,7 +2051,8 @@ static void edge_close (struct usb_serial_port *port, struct file *filp)
2167 dbg("%s - exited", __func__); 2051 dbg("%s - exited", __func__);
2168} 2052}
2169 2053
2170static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count) 2054static int edge_write(struct tty_struct *tty, struct usb_serial_port *port,
2055 const unsigned char *data, int count)
2171{ 2056{
2172 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2057 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2173 unsigned long flags; 2058 unsigned long flags;
@@ -2188,16 +2073,16 @@ static int edge_write (struct usb_serial_port *port, const unsigned char *data,
2188 count = edge_buf_put(edge_port->ep_out_buf, data, count); 2073 count = edge_buf_put(edge_port->ep_out_buf, data, count);
2189 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2074 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2190 2075
2191 edge_send(port); 2076 edge_send(tty);
2192 2077
2193 return count; 2078 return count;
2194} 2079}
2195 2080
2196static void edge_send(struct usb_serial_port *port) 2081static void edge_send(struct tty_struct *tty)
2197{ 2082{
2083 struct usb_serial_port *port = tty->driver_data;
2198 int count, result; 2084 int count, result;
2199 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2085 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2200 struct tty_struct *tty = port->tty;
2201 unsigned long flags; 2086 unsigned long flags;
2202 2087
2203 2088
@@ -2223,11 +2108,12 @@ static void edge_send(struct usb_serial_port *port)
2223 2108
2224 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2109 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2225 2110
2226 usb_serial_debug_data(debug, &port->dev, __func__, count, port->write_urb->transfer_buffer); 2111 usb_serial_debug_data(debug, &port->dev, __func__, count,
2112 port->write_urb->transfer_buffer);
2227 2113
2228 /* set up our urb */ 2114 /* set up our urb */
2229 usb_fill_bulk_urb (port->write_urb, port->serial->dev, 2115 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
2230 usb_sndbulkpipe (port->serial->dev, 2116 usb_sndbulkpipe(port->serial->dev,
2231 port->bulk_out_endpointAddress), 2117 port->bulk_out_endpointAddress),
2232 port->write_urb->transfer_buffer, count, 2118 port->write_urb->transfer_buffer, count,
2233 edge_bulk_out_callback, 2119 edge_bulk_out_callback,
@@ -2236,23 +2122,23 @@ static void edge_send(struct usb_serial_port *port)
2236 /* send the data out the bulk port */ 2122 /* send the data out the bulk port */
2237 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 2123 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
2238 if (result) { 2124 if (result) {
2239 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result); 2125 dev_err(&port->dev,
2126 "%s - failed submitting write urb, error %d\n",
2127 __func__, result);
2240 edge_port->ep_write_urb_in_use = 0; 2128 edge_port->ep_write_urb_in_use = 0;
2241 // TODO: reschedule edge_send 2129 /* TODO: reschedule edge_send */
2242 } else { 2130 } else
2243 edge_port->icount.tx += count; 2131 edge_port->icount.tx += count;
2244 }
2245 2132
2246 /* wakeup any process waiting for writes to complete */ 2133 /* wakeup any process waiting for writes to complete */
2247 /* there is now more room in the buffer for new writes */ 2134 /* there is now more room in the buffer for new writes */
2248 if (tty) { 2135 if (tty)
2249 /* let the tty driver wakeup if it has a special write_wakeup function */
2250 tty_wakeup(tty); 2136 tty_wakeup(tty);
2251 }
2252} 2137}
2253 2138
2254static int edge_write_room (struct usb_serial_port *port) 2139static int edge_write_room(struct tty_struct *tty)
2255{ 2140{
2141 struct usb_serial_port *port = tty->driver_data;
2256 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2142 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2257 int room = 0; 2143 int room = 0;
2258 unsigned long flags; 2144 unsigned long flags;
@@ -2260,9 +2146,9 @@ static int edge_write_room (struct usb_serial_port *port)
2260 dbg("%s - port %d", __func__, port->number); 2146 dbg("%s - port %d", __func__, port->number);
2261 2147
2262 if (edge_port == NULL) 2148 if (edge_port == NULL)
2263 return -ENODEV; 2149 return 0;
2264 if (edge_port->close_pending == 1) 2150 if (edge_port->close_pending == 1)
2265 return -ENODEV; 2151 return 0;
2266 2152
2267 spin_lock_irqsave(&edge_port->ep_lock, flags); 2153 spin_lock_irqsave(&edge_port->ep_lock, flags);
2268 room = edge_buf_space_avail(edge_port->ep_out_buf); 2154 room = edge_buf_space_avail(edge_port->ep_out_buf);
@@ -2272,8 +2158,9 @@ static int edge_write_room (struct usb_serial_port *port)
2272 return room; 2158 return room;
2273} 2159}
2274 2160
2275static int edge_chars_in_buffer (struct usb_serial_port *port) 2161static int edge_chars_in_buffer(struct tty_struct *tty)
2276{ 2162{
2163 struct usb_serial_port *port = tty->driver_data;
2277 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2164 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2278 int chars = 0; 2165 int chars = 0;
2279 unsigned long flags; 2166 unsigned long flags;
@@ -2281,22 +2168,22 @@ static int edge_chars_in_buffer (struct usb_serial_port *port)
2281 dbg("%s - port %d", __func__, port->number); 2168 dbg("%s - port %d", __func__, port->number);
2282 2169
2283 if (edge_port == NULL) 2170 if (edge_port == NULL)
2284 return -ENODEV; 2171 return 0;
2285 if (edge_port->close_pending == 1) 2172 if (edge_port->close_pending == 1)
2286 return -ENODEV; 2173 return 0;
2287 2174
2288 spin_lock_irqsave(&edge_port->ep_lock, flags); 2175 spin_lock_irqsave(&edge_port->ep_lock, flags);
2289 chars = edge_buf_data_avail(edge_port->ep_out_buf); 2176 chars = edge_buf_data_avail(edge_port->ep_out_buf);
2290 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2177 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2291 2178
2292 dbg ("%s - returns %d", __func__, chars); 2179 dbg("%s - returns %d", __func__, chars);
2293 return chars; 2180 return chars;
2294} 2181}
2295 2182
2296static void edge_throttle (struct usb_serial_port *port) 2183static void edge_throttle(struct tty_struct *tty)
2297{ 2184{
2185 struct usb_serial_port *port = tty->driver_data;
2298 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2186 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2299 struct tty_struct *tty;
2300 int status; 2187 int status;
2301 2188
2302 dbg("%s - port %d", __func__, port->number); 2189 dbg("%s - port %d", __func__, port->number);
@@ -2304,16 +2191,10 @@ static void edge_throttle (struct usb_serial_port *port)
2304 if (edge_port == NULL) 2191 if (edge_port == NULL)
2305 return; 2192 return;
2306 2193
2307 tty = port->tty;
2308 if (!tty) {
2309 dbg ("%s - no tty available", __func__);
2310 return;
2311 }
2312
2313 /* if we are implementing XON/XOFF, send the stop character */ 2194 /* if we are implementing XON/XOFF, send the stop character */
2314 if (I_IXOFF(tty)) { 2195 if (I_IXOFF(tty)) {
2315 unsigned char stop_char = STOP_CHAR(tty); 2196 unsigned char stop_char = STOP_CHAR(tty);
2316 status = edge_write (port, &stop_char, 1); 2197 status = edge_write(tty, port, &stop_char, 1);
2317 if (status <= 0) { 2198 if (status <= 0) {
2318 dev_err(&port->dev, "%s - failed to write stop character, %d\n", __func__, status); 2199 dev_err(&port->dev, "%s - failed to write stop character, %d\n", __func__, status);
2319 } 2200 }
@@ -2326,10 +2207,10 @@ static void edge_throttle (struct usb_serial_port *port)
2326 2207
2327} 2208}
2328 2209
2329static void edge_unthrottle (struct usb_serial_port *port) 2210static void edge_unthrottle(struct tty_struct *tty)
2330{ 2211{
2212 struct usb_serial_port *port = tty->driver_data;
2331 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2213 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2332 struct tty_struct *tty;
2333 int status; 2214 int status;
2334 2215
2335 dbg("%s - port %d", __func__, port->number); 2216 dbg("%s - port %d", __func__, port->number);
@@ -2337,27 +2218,22 @@ static void edge_unthrottle (struct usb_serial_port *port)
2337 if (edge_port == NULL) 2218 if (edge_port == NULL)
2338 return; 2219 return;
2339 2220
2340 tty = port->tty;
2341 if (!tty) {
2342 dbg ("%s - no tty available", __func__);
2343 return;
2344 }
2345
2346 /* if we are implementing XON/XOFF, send the start character */ 2221 /* if we are implementing XON/XOFF, send the start character */
2347 if (I_IXOFF(tty)) { 2222 if (I_IXOFF(tty)) {
2348 unsigned char start_char = START_CHAR(tty); 2223 unsigned char start_char = START_CHAR(tty);
2349 status = edge_write (port, &start_char, 1); 2224 status = edge_write(tty, port, &start_char, 1);
2350 if (status <= 0) { 2225 if (status <= 0) {
2351 dev_err(&port->dev, "%s - failed to write start character, %d\n", __func__, status); 2226 dev_err(&port->dev, "%s - failed to write start character, %d\n", __func__, status);
2352 } 2227 }
2353 } 2228 }
2354
2355 /* if we are implementing RTS/CTS, restart reads */ 2229 /* if we are implementing RTS/CTS, restart reads */
2356 /* are the Edgeport will assert the RTS line */ 2230 /* are the Edgeport will assert the RTS line */
2357 if (C_CRTSCTS(tty)) { 2231 if (C_CRTSCTS(tty)) {
2358 status = restart_read(edge_port); 2232 status = restart_read(edge_port);
2359 if (status) 2233 if (status)
2360 dev_err(&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __func__, status); 2234 dev_err(&port->dev,
2235 "%s - read bulk usb_submit_urb failed: %d\n",
2236 __func__, status);
2361 } 2237 }
2362 2238
2363} 2239}
@@ -2398,22 +2274,23 @@ static int restart_read(struct edgeport_port *edge_port)
2398 return status; 2274 return status;
2399} 2275}
2400 2276
2401static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios) 2277static void change_port_settings(struct tty_struct *tty,
2278 struct edgeport_port *edge_port, struct ktermios *old_termios)
2402{ 2279{
2403 struct ump_uart_config *config; 2280 struct ump_uart_config *config;
2404 struct tty_struct *tty;
2405 int baud; 2281 int baud;
2406 unsigned cflag; 2282 unsigned cflag;
2407 int status; 2283 int status;
2408 int port_number = edge_port->port->number - edge_port->port->serial->minor; 2284 int port_number = edge_port->port->number -
2285 edge_port->port->serial->minor;
2409 2286
2410 dbg("%s - port %d", __func__, edge_port->port->number); 2287 dbg("%s - port %d", __func__, edge_port->port->number);
2411 2288
2412 tty = edge_port->port->tty;
2413
2414 config = kmalloc (sizeof (*config), GFP_KERNEL); 2289 config = kmalloc (sizeof (*config), GFP_KERNEL);
2415 if (!config) { 2290 if (!config) {
2416 dev_err (&edge_port->port->dev, "%s - out of memory\n", __func__); 2291 *tty->termios = *old_termios;
2292 dev_err(&edge_port->port->dev, "%s - out of memory\n",
2293 __func__);
2417 return; 2294 return;
2418 } 2295 }
2419 2296
@@ -2427,22 +2304,22 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2427 config->bUartMode = (__u8)(edge_port->bUartMode); 2304 config->bUartMode = (__u8)(edge_port->bUartMode);
2428 2305
2429 switch (cflag & CSIZE) { 2306 switch (cflag & CSIZE) {
2430 case CS5: 2307 case CS5:
2431 config->bDataBits = UMP_UART_CHAR5BITS; 2308 config->bDataBits = UMP_UART_CHAR5BITS;
2432 dbg ("%s - data bits = 5", __func__); 2309 dbg("%s - data bits = 5", __func__);
2433 break; 2310 break;
2434 case CS6: 2311 case CS6:
2435 config->bDataBits = UMP_UART_CHAR6BITS; 2312 config->bDataBits = UMP_UART_CHAR6BITS;
2436 dbg ("%s - data bits = 6", __func__); 2313 dbg("%s - data bits = 6", __func__);
2437 break; 2314 break;
2438 case CS7: 2315 case CS7:
2439 config->bDataBits = UMP_UART_CHAR7BITS; 2316 config->bDataBits = UMP_UART_CHAR7BITS;
2440 dbg ("%s - data bits = 7", __func__); 2317 dbg("%s - data bits = 7", __func__);
2441 break; 2318 break;
2442 default: 2319 default:
2443 case CS8: 2320 case CS8:
2444 config->bDataBits = UMP_UART_CHAR8BITS; 2321 config->bDataBits = UMP_UART_CHAR8BITS;
2445 dbg ("%s - data bits = 8", __func__); 2322 dbg("%s - data bits = 8", __func__);
2446 break; 2323 break;
2447 } 2324 }
2448 2325
@@ -2457,7 +2334,7 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2457 dbg("%s - parity = even", __func__); 2334 dbg("%s - parity = even", __func__);
2458 } 2335 }
2459 } else { 2336 } else {
2460 config->bParity = UMP_UART_NOPARITY; 2337 config->bParity = UMP_UART_NOPARITY;
2461 dbg("%s - parity = none", __func__); 2338 dbg("%s - parity = none", __func__);
2462 } 2339 }
2463 2340
@@ -2480,29 +2357,26 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2480 restart_read(edge_port); 2357 restart_read(edge_port);
2481 } 2358 }
2482 2359
2483 /* if we are implementing XON/XOFF, set the start and stop character in the device */ 2360 /* if we are implementing XON/XOFF, set the start and stop
2484 if (I_IXOFF(tty) || I_IXON(tty)) { 2361 character in the device */
2485 config->cXon = START_CHAR(tty); 2362 config->cXon = START_CHAR(tty);
2486 config->cXoff = STOP_CHAR(tty); 2363 config->cXoff = STOP_CHAR(tty);
2487 2364
2488 /* if we are implementing INBOUND XON/XOFF */ 2365 /* if we are implementing INBOUND XON/XOFF */
2489 if (I_IXOFF(tty)) { 2366 if (I_IXOFF(tty)) {
2490 config->wFlags |= UMP_MASK_UART_FLAGS_IN_X; 2367 config->wFlags |= UMP_MASK_UART_FLAGS_IN_X;
2491 dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", 2368 dbg("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2492 __func__, config->cXon, config->cXoff); 2369 __func__, config->cXon, config->cXoff);
2493 } else { 2370 } else
2494 dbg ("%s - INBOUND XON/XOFF is disabled", __func__); 2371 dbg("%s - INBOUND XON/XOFF is disabled", __func__);
2495 }
2496 2372
2497 /* if we are implementing OUTBOUND XON/XOFF */ 2373 /* if we are implementing OUTBOUND XON/XOFF */
2498 if (I_IXON(tty)) { 2374 if (I_IXON(tty)) {
2499 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X; 2375 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X;
2500 dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", 2376 dbg("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2501 __func__, config->cXon, config->cXoff); 2377 __func__, config->cXon, config->cXoff);
2502 } else { 2378 } else
2503 dbg ("%s - OUTBOUND XON/XOFF is disabled", __func__); 2379 dbg("%s - OUTBOUND XON/XOFF is disabled", __func__);
2504 }
2505 }
2506 2380
2507 tty->termios->c_cflag &= ~CMSPAR; 2381 tty->termios->c_cflag &= ~CMSPAR;
2508 2382
@@ -2519,41 +2393,36 @@ static void change_port_settings (struct edgeport_port *edge_port, struct ktermi
2519 2393
2520 /* FIXME: Recompute actual baud from divisor here */ 2394 /* FIXME: Recompute actual baud from divisor here */
2521 2395
2522 dbg ("%s - baud rate = %d, wBaudRate = %d", __func__, baud, config->wBaudRate); 2396 dbg("%s - baud rate = %d, wBaudRate = %d", __func__, baud,
2397 config->wBaudRate);
2523 2398
2524 dbg ("wBaudRate: %d", (int)(461550L / config->wBaudRate)); 2399 dbg("wBaudRate: %d", (int)(461550L / config->wBaudRate));
2525 dbg ("wFlags: 0x%x", config->wFlags); 2400 dbg("wFlags: 0x%x", config->wFlags);
2526 dbg ("bDataBits: %d", config->bDataBits); 2401 dbg("bDataBits: %d", config->bDataBits);
2527 dbg ("bParity: %d", config->bParity); 2402 dbg("bParity: %d", config->bParity);
2528 dbg ("bStopBits: %d", config->bStopBits); 2403 dbg("bStopBits: %d", config->bStopBits);
2529 dbg ("cXon: %d", config->cXon); 2404 dbg("cXon: %d", config->cXon);
2530 dbg ("cXoff: %d", config->cXoff); 2405 dbg("cXoff: %d", config->cXoff);
2531 dbg ("bUartMode: %d", config->bUartMode); 2406 dbg("bUartMode: %d", config->bUartMode);
2532 2407
2533 /* move the word values into big endian mode */ 2408 /* move the word values into big endian mode */
2534 cpu_to_be16s (&config->wFlags); 2409 cpu_to_be16s(&config->wFlags);
2535 cpu_to_be16s (&config->wBaudRate); 2410 cpu_to_be16s(&config->wBaudRate);
2536 2411
2537 status = TIWriteCommandSync (edge_port->port->serial->dev, 2412 status = send_cmd(edge_port->port->serial->dev, UMPC_SET_CONFIG,
2538 UMPC_SET_CONFIG,
2539 (__u8)(UMPM_UART1_PORT + port_number), 2413 (__u8)(UMPM_UART1_PORT + port_number),
2540 0, 2414 0, (__u8 *)config, sizeof(*config));
2541 (__u8 *)config, 2415 if (status)
2542 sizeof(*config)); 2416 dbg("%s - error %d when trying to write config to device",
2543 if (status) {
2544 dbg ("%s - error %d when trying to write config to device",
2545 __func__, status); 2417 __func__, status);
2546 } 2418 kfree(config);
2547
2548 kfree (config);
2549
2550 return; 2419 return;
2551} 2420}
2552 2421
2553static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 2422static void edge_set_termios(struct tty_struct *tty,
2423 struct usb_serial_port *port, struct ktermios *old_termios)
2554{ 2424{
2555 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2425 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2556 struct tty_struct *tty = port->tty;
2557 unsigned int cflag; 2426 unsigned int cflag;
2558 2427
2559 cflag = tty->termios->c_cflag; 2428 cflag = tty->termios->c_cflag;
@@ -2562,20 +2431,19 @@ static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old
2562 tty->termios->c_cflag, tty->termios->c_iflag); 2431 tty->termios->c_cflag, tty->termios->c_iflag);
2563 dbg("%s - old clfag %08x old iflag %08x", __func__, 2432 dbg("%s - old clfag %08x old iflag %08x", __func__,
2564 old_termios->c_cflag, old_termios->c_iflag); 2433 old_termios->c_cflag, old_termios->c_iflag);
2565
2566 dbg("%s - port %d", __func__, port->number); 2434 dbg("%s - port %d", __func__, port->number);
2567 2435
2568 if (edge_port == NULL) 2436 if (edge_port == NULL)
2569 return; 2437 return;
2570
2571 /* change the port settings to the new ones specified */ 2438 /* change the port settings to the new ones specified */
2572 change_port_settings (edge_port, old_termios); 2439 change_port_settings(tty, edge_port, old_termios);
2573
2574 return; 2440 return;
2575} 2441}
2576 2442
2577static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear) 2443static int edge_tiocmset(struct tty_struct *tty, struct file *file,
2444 unsigned int set, unsigned int clear)
2578{ 2445{
2446 struct usb_serial_port *port = tty->driver_data;
2579 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2447 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2580 unsigned int mcr; 2448 unsigned int mcr;
2581 unsigned long flags; 2449 unsigned long flags;
@@ -2601,13 +2469,13 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig
2601 edge_port->shadow_mcr = mcr; 2469 edge_port->shadow_mcr = mcr;
2602 spin_unlock_irqrestore(&edge_port->ep_lock, flags); 2470 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2603 2471
2604 TIRestoreMCR (edge_port, mcr); 2472 restore_mcr(edge_port, mcr);
2605
2606 return 0; 2473 return 0;
2607} 2474}
2608 2475
2609static int edge_tiocmget(struct usb_serial_port *port, struct file *file) 2476static int edge_tiocmget(struct tty_struct *tty, struct file *file)
2610{ 2477{
2478 struct usb_serial_port *port = tty->driver_data;
2611 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2479 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2612 unsigned int result = 0; 2480 unsigned int result = 0;
2613 unsigned int msr; 2481 unsigned int msr;
@@ -2634,7 +2502,8 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
2634 return result; 2502 return result;
2635} 2503}
2636 2504
2637static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct __user *retinfo) 2505static int get_serial_info(struct edgeport_port *edge_port,
2506 struct serial_struct __user *retinfo)
2638{ 2507{
2639 struct serial_struct tmp; 2508 struct serial_struct tmp;
2640 2509
@@ -2652,18 +2521,16 @@ static int get_serial_info (struct edgeport_port *edge_port, struct serial_struc
2652 tmp.baud_base = 9600; 2521 tmp.baud_base = 9600;
2653 tmp.close_delay = 5*HZ; 2522 tmp.close_delay = 5*HZ;
2654 tmp.closing_wait = closing_wait; 2523 tmp.closing_wait = closing_wait;
2655// tmp.custom_divisor = state->custom_divisor;
2656// tmp.hub6 = state->hub6;
2657// tmp.io_type = state->io_type;
2658
2659 2524
2660 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 2525 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
2661 return -EFAULT; 2526 return -EFAULT;
2662 return 0; 2527 return 0;
2663} 2528}
2664 2529
2665static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg) 2530static int edge_ioctl(struct tty_struct *tty, struct file *file,
2531 unsigned int cmd, unsigned long arg)
2666{ 2532{
2533 struct usb_serial_port *port = tty->driver_data;
2667 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2534 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2668 struct async_icount cnow; 2535 struct async_icount cnow;
2669 struct async_icount cprev; 2536 struct async_icount cprev;
@@ -2671,81 +2538,64 @@ static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned
2671 dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd); 2538 dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd);
2672 2539
2673 switch (cmd) { 2540 switch (cmd) {
2674 case TIOCINQ: 2541 case TIOCGSERIAL:
2675 dbg("%s - (%d) TIOCINQ", __func__, port->number); 2542 dbg("%s - (%d) TIOCGSERIAL", __func__, port->number);
2676// return get_number_bytes_avail(edge_port, (unsigned int *) arg); 2543 return get_serial_info(edge_port,
2677 break; 2544 (struct serial_struct __user *) arg);
2678 2545 case TIOCMIWAIT:
2679 case TIOCSERGETLSR: 2546 dbg("%s - (%d) TIOCMIWAIT", __func__, port->number);
2680 dbg("%s - (%d) TIOCSERGETLSR", __func__, port->number); 2547 cprev = edge_port->icount;
2681// return get_lsr_info(edge_port, (unsigned int *) arg); 2548 while (1) {
2682 break; 2549 interruptible_sleep_on(&edge_port->delta_msr_wait);
2683 2550 /* see if a signal did it */
2684 case TIOCGSERIAL: 2551 if (signal_pending(current))
2685 dbg("%s - (%d) TIOCGSERIAL", __func__, port->number); 2552 return -ERESTARTSYS;
2686 return get_serial_info(edge_port, (struct serial_struct __user *) arg); 2553 cnow = edge_port->icount;
2687 break; 2554 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2688 2555 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
2689 case TIOCSSERIAL: 2556 return -EIO; /* no change => error */
2690 dbg("%s - (%d) TIOCSSERIAL", __func__, port->number); 2557 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2691 break; 2558 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2692 2559 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2693 case TIOCMIWAIT: 2560 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
2694 dbg("%s - (%d) TIOCMIWAIT", __func__, port->number); 2561 return 0;
2695 cprev = edge_port->icount;
2696 while (1) {
2697 interruptible_sleep_on(&edge_port->delta_msr_wait);
2698 /* see if a signal did it */
2699 if (signal_pending(current))
2700 return -ERESTARTSYS;
2701 cnow = edge_port->icount;
2702 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2703 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
2704 return -EIO; /* no change => error */
2705 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2706 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2707 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2708 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
2709 return 0;
2710 }
2711 cprev = cnow;
2712 } 2562 }
2713 /* not reached */ 2563 cprev = cnow;
2714 break; 2564 }
2715 2565 /* not reached */
2716 case TIOCGICOUNT: 2566 break;
2717 dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __func__, 2567 case TIOCGICOUNT:
2718 port->number, edge_port->icount.rx, edge_port->icount.tx); 2568 dbg("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __func__,
2719 if (copy_to_user((void __user *)arg, &edge_port->icount, sizeof(edge_port->icount))) 2569 port->number, edge_port->icount.rx, edge_port->icount.tx);
2720 return -EFAULT; 2570 if (copy_to_user((void __user *)arg, &edge_port->icount,
2721 return 0; 2571 sizeof(edge_port->icount)))
2572 return -EFAULT;
2573 return 0;
2722 } 2574 }
2723
2724 return -ENOIOCTLCMD; 2575 return -ENOIOCTLCMD;
2725} 2576}
2726 2577
2727static void edge_break (struct usb_serial_port *port, int break_state) 2578static void edge_break(struct tty_struct *tty, int break_state)
2728{ 2579{
2580 struct usb_serial_port *port = tty->driver_data;
2729 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2581 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2730 int status; 2582 int status;
2583 int bv = 0; /* Off */
2731 2584
2732 dbg ("%s - state = %d", __func__, break_state); 2585 dbg("%s - state = %d", __func__, break_state);
2733 2586
2734 /* chase the port close */ 2587 /* chase the port close */
2735 TIChasePort (edge_port, 0, 0); 2588 chase_port(edge_port, 0, 0);
2736 2589
2737 if (break_state == -1) { 2590 if (break_state == -1)
2738 status = TISetBreak (edge_port); 2591 bv = 1; /* On */
2739 } else { 2592 status = ti_do_config(edge_port, UMPC_SET_CLR_BREAK, bv);
2740 status = TIClearBreak (edge_port); 2593 if (status)
2741 } 2594 dbg("%s - error %d sending break set/clear command.",
2742 if (status) {
2743 dbg ("%s - error %d sending break set/clear command.",
2744 __func__, status); 2595 __func__, status);
2745 }
2746} 2596}
2747 2597
2748static int edge_startup (struct usb_serial *serial) 2598static int edge_startup(struct usb_serial *serial)
2749{ 2599{
2750 struct edgeport_serial *edge_serial; 2600 struct edgeport_serial *edge_serial;
2751 struct edgeport_port *edge_port; 2601 struct edgeport_port *edge_port;
@@ -2765,9 +2615,9 @@ static int edge_startup (struct usb_serial *serial)
2765 edge_serial->serial = serial; 2615 edge_serial->serial = serial;
2766 usb_set_serial_data(serial, edge_serial); 2616 usb_set_serial_data(serial, edge_serial);
2767 2617
2768 status = TIDownloadFirmware (edge_serial); 2618 status = download_fw(edge_serial);
2769 if (status) { 2619 if (status) {
2770 kfree (edge_serial); 2620 kfree(edge_serial);
2771 return status; 2621 return status;
2772 } 2622 }
2773 2623
@@ -2775,13 +2625,15 @@ static int edge_startup (struct usb_serial *serial)
2775 for (i = 0; i < serial->num_ports; ++i) { 2625 for (i = 0; i < serial->num_ports; ++i) {
2776 edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); 2626 edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL);
2777 if (edge_port == NULL) { 2627 if (edge_port == NULL) {
2778 dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); 2628 dev_err(&serial->dev->dev, "%s - Out of memory\n",
2629 __func__);
2779 goto cleanup; 2630 goto cleanup;
2780 } 2631 }
2781 spin_lock_init(&edge_port->ep_lock); 2632 spin_lock_init(&edge_port->ep_lock);
2782 edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE); 2633 edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE);
2783 if (edge_port->ep_out_buf == NULL) { 2634 if (edge_port->ep_out_buf == NULL) {
2784 dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); 2635 dev_err(&serial->dev->dev, "%s - Out of memory\n",
2636 __func__);
2785 kfree(edge_port); 2637 kfree(edge_port);
2786 goto cleanup; 2638 goto cleanup;
2787 } 2639 }
@@ -2790,27 +2642,27 @@ static int edge_startup (struct usb_serial *serial)
2790 usb_set_serial_port_data(serial->port[i], edge_port); 2642 usb_set_serial_port_data(serial->port[i], edge_port);
2791 edge_port->bUartMode = default_uart_mode; 2643 edge_port->bUartMode = default_uart_mode;
2792 } 2644 }
2793 2645
2794 return 0; 2646 return 0;
2795 2647
2796cleanup: 2648cleanup:
2797 for (--i; i>=0; --i) { 2649 for (--i; i >= 0; --i) {
2798 edge_port = usb_get_serial_port_data(serial->port[i]); 2650 edge_port = usb_get_serial_port_data(serial->port[i]);
2799 edge_buf_free(edge_port->ep_out_buf); 2651 edge_buf_free(edge_port->ep_out_buf);
2800 kfree(edge_port); 2652 kfree(edge_port);
2801 usb_set_serial_port_data(serial->port[i], NULL); 2653 usb_set_serial_port_data(serial->port[i], NULL);
2802 } 2654 }
2803 kfree (edge_serial); 2655 kfree(edge_serial);
2804 usb_set_serial_data(serial, NULL); 2656 usb_set_serial_data(serial, NULL);
2805 return -ENOMEM; 2657 return -ENOMEM;
2806} 2658}
2807 2659
2808static void edge_shutdown (struct usb_serial *serial) 2660static void edge_shutdown(struct usb_serial *serial)
2809{ 2661{
2810 int i; 2662 int i;
2811 struct edgeport_port *edge_port; 2663 struct edgeport_port *edge_port;
2812 2664
2813 dbg ("%s", __func__); 2665 dbg("%s", __func__);
2814 2666
2815 for (i = 0; i < serial->num_ports; ++i) { 2667 for (i = 0; i < serial->num_ports; ++i) {
2816 edge_port = usb_get_serial_port_data(serial->port[i]); 2668 edge_port = usb_get_serial_port_data(serial->port[i]);
@@ -2852,7 +2704,8 @@ static ssize_t store_uart_mode(struct device *dev,
2852 return count; 2704 return count;
2853} 2705}
2854 2706
2855static DEVICE_ATTR(uart_mode, S_IWUSR | S_IRUGO, show_uart_mode, store_uart_mode); 2707static DEVICE_ATTR(uart_mode, S_IWUSR | S_IRUGO, show_uart_mode,
2708 store_uart_mode);
2856 2709
2857static int edge_create_sysfs_attrs(struct usb_serial_port *port) 2710static int edge_create_sysfs_attrs(struct usb_serial_port *port)
2858{ 2711{
@@ -2922,9 +2775,9 @@ static void edge_buf_free(struct edge_buf *eb)
2922 2775
2923static void edge_buf_clear(struct edge_buf *eb) 2776static void edge_buf_clear(struct edge_buf *eb)
2924{ 2777{
2925 if (eb != NULL) 2778 if (eb != NULL)
2926 eb->buf_get = eb->buf_put; 2779 eb->buf_get = eb->buf_put;
2927 /* equivalent to a get of all data available */ 2780 /* equivalent to a get of all data available */
2928} 2781}
2929 2782
2930 2783
@@ -2937,10 +2790,9 @@ static void edge_buf_clear(struct edge_buf *eb)
2937 2790
2938static unsigned int edge_buf_data_avail(struct edge_buf *eb) 2791static unsigned int edge_buf_data_avail(struct edge_buf *eb)
2939{ 2792{
2940 if (eb != NULL) 2793 if (eb == NULL)
2941 return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size);
2942 else
2943 return 0; 2794 return 0;
2795 return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size);
2944} 2796}
2945 2797
2946 2798
@@ -2953,10 +2805,9 @@ static unsigned int edge_buf_data_avail(struct edge_buf *eb)
2953 2805
2954static unsigned int edge_buf_space_avail(struct edge_buf *eb) 2806static unsigned int edge_buf_space_avail(struct edge_buf *eb)
2955{ 2807{
2956 if (eb != NULL) 2808 if (eb == NULL)
2957 return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size);
2958 else
2959 return 0; 2809 return 0;
2810 return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size);
2960} 2811}
2961 2812
2962 2813
@@ -3113,7 +2964,7 @@ static int __init edgeport_init(void)
3113 if (retval) 2964 if (retval)
3114 goto failed_2port_device_register; 2965 goto failed_2port_device_register;
3115 retval = usb_register(&io_driver); 2966 retval = usb_register(&io_driver);
3116 if (retval) 2967 if (retval)
3117 goto failed_usb_register; 2968 goto failed_usb_register;
3118 info(DRIVER_DESC " " DRIVER_VERSION); 2969 info(DRIVER_DESC " " DRIVER_VERSION);
3119 return 0; 2970 return 0;
@@ -3125,11 +2976,11 @@ failed_1port_device_register:
3125 return retval; 2976 return retval;
3126} 2977}
3127 2978
3128static void __exit edgeport_exit (void) 2979static void __exit edgeport_exit(void)
3129{ 2980{
3130 usb_deregister (&io_driver); 2981 usb_deregister(&io_driver);
3131 usb_serial_deregister (&edgeport_1port_device); 2982 usb_serial_deregister(&edgeport_1port_device);
3132 usb_serial_deregister (&edgeport_2port_device); 2983 usb_serial_deregister(&edgeport_2port_device);
3133} 2984}
3134 2985
3135module_init(edgeport_init); 2986module_init(edgeport_init);
@@ -3151,8 +3002,8 @@ module_param(closing_wait, int, S_IRUGO | S_IWUSR);
3151MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs"); 3002MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs");
3152 3003
3153module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR); 3004module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR);
3154MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device"); 3005MODULE_PARM_DESC(ignore_cpu_rev,
3006 "Ignore the cpu revision when connecting to a device");
3155 3007
3156module_param(default_uart_mode, int, S_IRUGO | S_IWUSR); 3008module_param(default_uart_mode, int, S_IRUGO | S_IWUSR);
3157MODULE_PARM_DESC(default_uart_mode, "Default uart_mode, 0=RS232, ..."); 3009MODULE_PARM_DESC(default_uart_mode, "Default uart_mode, 0=RS232, ...");
3158
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
index d9fb3768a2d7..832a5a4f3cb3 100644
--- a/drivers/usb/serial/ipaq.c
+++ b/drivers/usb/serial/ipaq.c
@@ -53,7 +53,7 @@
53#include <linux/tty_flip.h> 53#include <linux/tty_flip.h>
54#include <linux/module.h> 54#include <linux/module.h>
55#include <linux/spinlock.h> 55#include <linux/spinlock.h>
56#include <asm/uaccess.h> 56#include <linux/uaccess.h>
57#include <linux/usb.h> 57#include <linux/usb.h>
58#include <linux/usb/serial.h> 58#include <linux/usb/serial.h>
59#include "ipaq.h" 59#include "ipaq.h"
@@ -74,19 +74,21 @@ static int connect_retries = KP_RETRIES;
74static int initial_wait; 74static int initial_wait;
75 75
76/* Function prototypes for an ipaq */ 76/* Function prototypes for an ipaq */
77static int ipaq_open (struct usb_serial_port *port, struct file *filp); 77static int ipaq_open(struct tty_struct *tty,
78static void ipaq_close (struct usb_serial_port *port, struct file *filp); 78 struct usb_serial_port *port, struct file *filp);
79static int ipaq_startup (struct usb_serial *serial); 79static void ipaq_close(struct tty_struct *tty,
80static void ipaq_shutdown (struct usb_serial *serial); 80 struct usb_serial_port *port, struct file *filp);
81static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf, 81static int ipaq_startup(struct usb_serial *serial);
82 int count); 82static void ipaq_shutdown(struct usb_serial *serial);
83static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf, 83static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
84 int count); 84 const unsigned char *buf, int count);
85static int ipaq_write_bulk(struct usb_serial_port *port,
86 const unsigned char *buf, int count);
85static void ipaq_write_gather(struct usb_serial_port *port); 87static void ipaq_write_gather(struct usb_serial_port *port);
86static void ipaq_read_bulk_callback (struct urb *urb); 88static void ipaq_read_bulk_callback(struct urb *urb);
87static void ipaq_write_bulk_callback(struct urb *urb); 89static void ipaq_write_bulk_callback(struct urb *urb);
88static int ipaq_write_room(struct usb_serial_port *port); 90static int ipaq_write_room(struct tty_struct *tty);
89static int ipaq_chars_in_buffer(struct usb_serial_port *port); 91static int ipaq_chars_in_buffer(struct tty_struct *tty);
90static void ipaq_destroy_lists(struct usb_serial_port *port); 92static void ipaq_destroy_lists(struct usb_serial_port *port);
91 93
92 94
@@ -550,7 +552,7 @@ static struct usb_device_id ipaq_id_table [] = {
550 { } /* Terminating entry */ 552 { } /* Terminating entry */
551}; 553};
552 554
553MODULE_DEVICE_TABLE (usb, ipaq_id_table); 555MODULE_DEVICE_TABLE(usb, ipaq_id_table);
554 556
555static struct usb_driver ipaq_driver = { 557static struct usb_driver ipaq_driver = {
556 .name = "ipaq", 558 .name = "ipaq",
@@ -591,7 +593,8 @@ static spinlock_t write_list_lock;
591static int bytes_in; 593static int bytes_in;
592static int bytes_out; 594static int bytes_out;
593 595
594static int ipaq_open(struct usb_serial_port *port, struct file *filp) 596static int ipaq_open(struct tty_struct *tty,
597 struct usb_serial_port *port, struct file *filp)
595{ 598{
596 struct usb_serial *serial = port->serial; 599 struct usb_serial *serial = port->serial;
597 struct ipaq_private *priv; 600 struct ipaq_private *priv;
@@ -617,9 +620,9 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
617 620
618 for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) { 621 for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
619 pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL); 622 pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
620 if (pkt == NULL) { 623 if (pkt == NULL)
621 goto enomem; 624 goto enomem;
622 } 625
623 pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL); 626 pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
624 if (pkt->data == NULL) { 627 if (pkt->data == NULL) {
625 kfree(pkt); 628 kfree(pkt);
@@ -637,21 +640,24 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
637 * discipline instead of queueing. 640 * discipline instead of queueing.
638 */ 641 */
639 642
640 port->tty->low_latency = 1; 643 if (tty) {
641 port->tty->raw = 1; 644 tty->low_latency = 1;
642 port->tty->real_raw = 1; 645 /* FIXME: These two are bogus */
643 646 tty->raw = 1;
647 tty->real_raw = 1;
648 }
644 /* 649 /*
645 * Lose the small buffers usbserial provides. Make larger ones. 650 * Lose the small buffers usbserial provides. Make larger ones.
646 */ 651 */
647 652
648 kfree(port->bulk_in_buffer); 653 kfree(port->bulk_in_buffer);
649 kfree(port->bulk_out_buffer);
650 port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL); 654 port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
651 if (port->bulk_in_buffer == NULL) { 655 if (port->bulk_in_buffer == NULL) {
652 port->bulk_out_buffer = NULL; /* prevent double free */ 656 port->bulk_out_buffer = NULL; /* prevent double free */
653 goto enomem; 657 goto enomem;
654 } 658 }
659
660 kfree(port->bulk_out_buffer);
655 port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL); 661 port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
656 if (port->bulk_out_buffer == NULL) { 662 if (port->bulk_out_buffer == NULL) {
657 kfree(port->bulk_in_buffer); 663 kfree(port->bulk_in_buffer);
@@ -661,8 +667,9 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
661 port->read_urb->transfer_buffer = port->bulk_in_buffer; 667 port->read_urb->transfer_buffer = port->bulk_in_buffer;
662 port->write_urb->transfer_buffer = port->bulk_out_buffer; 668 port->write_urb->transfer_buffer = port->bulk_out_buffer;
663 port->read_urb->transfer_buffer_length = URBDATA_SIZE; 669 port->read_urb->transfer_buffer_length = URBDATA_SIZE;
664 port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; 670 port->bulk_out_size = port->write_urb->transfer_buffer_length
665 671 = URBDATA_SIZE;
672
666 msleep(1000*initial_wait); 673 msleep(1000*initial_wait);
667 674
668 /* 675 /*
@@ -691,13 +698,15 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
691 698
692 /* Start reading from the device */ 699 /* Start reading from the device */
693 usb_fill_bulk_urb(port->read_urb, serial->dev, 700 usb_fill_bulk_urb(port->read_urb, serial->dev,
694 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), 701 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
695 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, 702 port->read_urb->transfer_buffer,
696 ipaq_read_bulk_callback, port); 703 port->read_urb->transfer_buffer_length,
704 ipaq_read_bulk_callback, port);
697 705
698 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 706 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
699 if (result) { 707 if (result) {
700 err("%s - failed submitting read urb, error %d", __func__, result); 708 err("%s - failed submitting read urb, error %d",
709 __func__, result);
701 goto error; 710 goto error;
702 } 711 }
703 712
@@ -713,12 +722,13 @@ error:
713} 722}
714 723
715 724
716static void ipaq_close(struct usb_serial_port *port, struct file *filp) 725static void ipaq_close(struct tty_struct *tty,
726 struct usb_serial_port *port, struct file *filp)
717{ 727{
718 struct ipaq_private *priv = usb_get_serial_port_data(port); 728 struct ipaq_private *priv = usb_get_serial_port_data(port);
719 729
720 dbg("%s - port %d", __func__, port->number); 730 dbg("%s - port %d", __func__, port->number);
721 731
722 /* 732 /*
723 * shut down bulk read and write 733 * shut down bulk read and write
724 */ 734 */
@@ -728,7 +738,8 @@ static void ipaq_close(struct usb_serial_port *port, struct file *filp)
728 kfree(priv); 738 kfree(priv);
729 usb_set_serial_port_data(port, NULL); 739 usb_set_serial_port_data(port, NULL);
730 740
731 /* Uncomment the following line if you want to see some statistics in your syslog */ 741 /* Uncomment the following line if you want to see some statistics
742 * in your syslog */
732 /* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */ 743 /* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
733} 744}
734 745
@@ -748,9 +759,10 @@ static void ipaq_read_bulk_callback(struct urb *urb)
748 return; 759 return;
749 } 760 }
750 761
751 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 762 usb_serial_debug_data(debug, &port->dev, __func__,
763 urb->actual_length, data);
752 764
753 tty = port->tty; 765 tty = port->port.tty;
754 if (tty && urb->actual_length) { 766 if (tty && urb->actual_length) {
755 tty_buffer_request_room(tty, urb->actual_length); 767 tty_buffer_request_room(tty, urb->actual_length);
756 tty_insert_flip_string(tty, data, urb->actual_length); 768 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -759,18 +771,20 @@ static void ipaq_read_bulk_callback(struct urb *urb)
759 } 771 }
760 772
761 /* Continue trying to always read */ 773 /* Continue trying to always read */
762 usb_fill_bulk_urb(port->read_urb, port->serial->dev, 774 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
763 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress), 775 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
764 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, 776 port->read_urb->transfer_buffer,
765 ipaq_read_bulk_callback, port); 777 port->read_urb->transfer_buffer_length,
778 ipaq_read_bulk_callback, port);
766 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 779 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
767 if (result) 780 if (result)
768 err("%s - failed resubmitting read urb, error %d", __func__, result); 781 err("%s - failed resubmitting read urb, error %d",
782 __func__, result);
769 return; 783 return;
770} 784}
771 785
772static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf, 786static int ipaq_write(struct tty_struct *tty, struct usb_serial_port *port,
773 int count) 787 const unsigned char *buf, int count)
774{ 788{
775 const unsigned char *current_position = buf; 789 const unsigned char *current_position = buf;
776 int bytes_sent = 0; 790 int bytes_sent = 0;
@@ -780,9 +794,8 @@ static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
780 794
781 while (count > 0) { 795 while (count > 0) {
782 transfer_size = min(count, PACKET_SIZE); 796 transfer_size = min(count, PACKET_SIZE);
783 if (ipaq_write_bulk(port, current_position, transfer_size)) { 797 if (ipaq_write_bulk(port, current_position, transfer_size))
784 break; 798 break;
785 }
786 current_position += transfer_size; 799 current_position += transfer_size;
787 bytes_sent += transfer_size; 800 bytes_sent += transfer_size;
788 count -= transfer_size; 801 count -= transfer_size;
@@ -790,10 +803,10 @@ static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
790 } 803 }
791 804
792 return bytes_sent; 805 return bytes_sent;
793} 806}
794 807
795static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf, 808static int ipaq_write_bulk(struct usb_serial_port *port,
796 int count) 809 const unsigned char *buf, int count)
797{ 810{
798 struct ipaq_private *priv = usb_get_serial_port_data(port); 811 struct ipaq_private *priv = usb_get_serial_port_data(port);
799 struct ipaq_packet *pkt = NULL; 812 struct ipaq_packet *pkt = NULL;
@@ -830,9 +843,9 @@ static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *bu
830 ipaq_write_gather(port); 843 ipaq_write_gather(port);
831 spin_unlock_irqrestore(&write_list_lock, flags); 844 spin_unlock_irqrestore(&write_list_lock, flags);
832 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 845 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
833 if (result) { 846 if (result)
834 err("%s - failed submitting write urb, error %d", __func__, result); 847 err("%s - failed submitting write urb, error %d",
835 } 848 __func__, result);
836 } else { 849 } else {
837 spin_unlock_irqrestore(&write_list_lock, flags); 850 spin_unlock_irqrestore(&write_list_lock, flags);
838 } 851 }
@@ -859,16 +872,15 @@ static void ipaq_write_gather(struct usb_serial_port *port)
859 list_move(&pkt->list, &priv->freelist); 872 list_move(&pkt->list, &priv->freelist);
860 priv->free_len += PACKET_SIZE; 873 priv->free_len += PACKET_SIZE;
861 } 874 }
862 if (room == 0) { 875 if (room == 0)
863 break; 876 break;
864 }
865 } 877 }
866 878
867 count = URBDATA_SIZE - room; 879 count = URBDATA_SIZE - room;
868 usb_fill_bulk_urb(port->write_urb, serial->dev, 880 usb_fill_bulk_urb(port->write_urb, serial->dev,
869 usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), 881 usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
870 port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback, 882 port->write_urb->transfer_buffer, count,
871 port); 883 ipaq_write_bulk_callback, port);
872 return; 884 return;
873} 885}
874 886
@@ -893,9 +905,9 @@ static void ipaq_write_bulk_callback(struct urb *urb)
893 ipaq_write_gather(port); 905 ipaq_write_gather(port);
894 spin_unlock_irqrestore(&write_list_lock, flags); 906 spin_unlock_irqrestore(&write_list_lock, flags);
895 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 907 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
896 if (result) { 908 if (result)
897 err("%s - failed submitting write urb, error %d", __func__, result); 909 err("%s - failed submitting write urb, error %d",
898 } 910 __func__, result);
899 } else { 911 } else {
900 priv->active = 0; 912 priv->active = 0;
901 spin_unlock_irqrestore(&write_list_lock, flags); 913 spin_unlock_irqrestore(&write_list_lock, flags);
@@ -904,16 +916,18 @@ static void ipaq_write_bulk_callback(struct urb *urb)
904 usb_serial_port_softint(port); 916 usb_serial_port_softint(port);
905} 917}
906 918
907static int ipaq_write_room(struct usb_serial_port *port) 919static int ipaq_write_room(struct tty_struct *tty)
908{ 920{
921 struct usb_serial_port *port = tty->driver_data;
909 struct ipaq_private *priv = usb_get_serial_port_data(port); 922 struct ipaq_private *priv = usb_get_serial_port_data(port);
910 923
911 dbg("%s - freelen %d", __func__, priv->free_len); 924 dbg("%s - freelen %d", __func__, priv->free_len);
912 return priv->free_len; 925 return priv->free_len;
913} 926}
914 927
915static int ipaq_chars_in_buffer(struct usb_serial_port *port) 928static int ipaq_chars_in_buffer(struct tty_struct *tty)
916{ 929{
930 struct usb_serial_port *port = tty->driver_data;
917 struct ipaq_private *priv = usb_get_serial_port_data(port); 931 struct ipaq_private *priv = usb_get_serial_port_data(port);
918 932
919 dbg("%s - queuelen %d", __func__, priv->queue_len); 933 dbg("%s - queuelen %d", __func__, priv->queue_len);
@@ -944,7 +958,7 @@ static int ipaq_startup(struct usb_serial *serial)
944 serial->dev->actconfig->desc.bConfigurationValue); 958 serial->dev->actconfig->desc.bConfigurationValue);
945 return -ENODEV; 959 return -ENODEV;
946 } 960 }
947 return usb_reset_configuration (serial->dev); 961 return usb_reset_configuration(serial->dev);
948} 962}
949 963
950static void ipaq_shutdown(struct usb_serial *serial) 964static void ipaq_shutdown(struct usb_serial *serial)
@@ -957,7 +971,7 @@ static int __init ipaq_init(void)
957 int retval; 971 int retval;
958 spin_lock_init(&write_list_lock); 972 spin_lock_init(&write_list_lock);
959 retval = usb_serial_register(&ipaq_device); 973 retval = usb_serial_register(&ipaq_device);
960 if (retval) 974 if (retval)
961 goto failed_usb_serial_register; 975 goto failed_usb_serial_register;
962 info(DRIVER_DESC " " DRIVER_VERSION); 976 info(DRIVER_DESC " " DRIVER_VERSION);
963 if (vendor) { 977 if (vendor) {
@@ -967,7 +981,7 @@ static int __init ipaq_init(void)
967 retval = usb_register(&ipaq_driver); 981 retval = usb_register(&ipaq_driver);
968 if (retval) 982 if (retval)
969 goto failed_usb_register; 983 goto failed_usb_register;
970 984
971 return 0; 985 return 0;
972failed_usb_register: 986failed_usb_register:
973 usb_serial_deregister(&ipaq_device); 987 usb_serial_deregister(&ipaq_device);
@@ -986,8 +1000,8 @@ static void __exit ipaq_exit(void)
986module_init(ipaq_init); 1000module_init(ipaq_init);
987module_exit(ipaq_exit); 1001module_exit(ipaq_exit);
988 1002
989MODULE_AUTHOR( DRIVER_AUTHOR ); 1003MODULE_AUTHOR(DRIVER_AUTHOR);
990MODULE_DESCRIPTION( DRIVER_DESC ); 1004MODULE_DESCRIPTION(DRIVER_DESC);
991MODULE_LICENSE("GPL"); 1005MODULE_LICENSE("GPL");
992 1006
993module_param(debug, bool, S_IRUGO | S_IWUSR); 1007module_param(debug, bool, S_IRUGO | S_IWUSR);
@@ -1000,7 +1014,9 @@ module_param(product, ushort, 0);
1000MODULE_PARM_DESC(product, "User specified USB idProduct"); 1014MODULE_PARM_DESC(product, "User specified USB idProduct");
1001 1015
1002module_param(connect_retries, int, S_IRUGO|S_IWUSR); 1016module_param(connect_retries, int, S_IRUGO|S_IWUSR);
1003MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)"); 1017MODULE_PARM_DESC(connect_retries,
1018 "Maximum number of connect retries (one second each)");
1004 1019
1005module_param(initial_wait, int, S_IRUGO|S_IWUSR); 1020module_param(initial_wait, int, S_IRUGO|S_IWUSR);
1006MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)"); 1021MODULE_PARM_DESC(initial_wait,
1022 "Time to wait before attempting a connection (in seconds)");
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c
index bc85ca5c1c37..a842025b9b57 100644
--- a/drivers/usb/serial/ipw.c
+++ b/drivers/usb/serial/ipw.c
@@ -10,27 +10,27 @@
10 * (at your option) any later version. 10 * (at your option) any later version.
11 * 11 *
12 * All information about the device was acquired using SnoopyPro 12 * All information about the device was acquired using SnoopyPro
13 * on MSFT's O/S, and examing the MSFT drivers' debug output 13 * on MSFT's O/S, and examing the MSFT drivers' debug output
14 * (insanely left _on_ in the enduser version) 14 * (insanely left _on_ in the enduser version)
15 * 15 *
16 * It was written out of frustration with the IPWireless USB modem 16 * It was written out of frustration with the IPWireless USB modem
17 * supplied by Axity3G/Sentech South Africa not supporting 17 * supplied by Axity3G/Sentech South Africa not supporting
18 * Linux whatsoever. 18 * Linux whatsoever.
19 * 19 *
20 * Nobody provided any proprietary information that was not already 20 * Nobody provided any proprietary information that was not already
21 * available for this device. 21 * available for this device.
22 * 22 *
23 * The modem adheres to the "3GPP TS 27.007 AT command set for 3G 23 * The modem adheres to the "3GPP TS 27.007 AT command set for 3G
24 * User Equipment (UE)" standard, available from 24 * User Equipment (UE)" standard, available from
25 * http://www.3gpp.org/ftp/Specs/html-info/27007.htm 25 * http://www.3gpp.org/ftp/Specs/html-info/27007.htm
26 * 26 *
27 * The code was only tested the IPWireless handheld modem distributed 27 * The code was only tested the IPWireless handheld modem distributed
28 * in South Africa by Sentech. 28 * in South Africa by Sentech.
29 * 29 *
30 * It may work for Woosh Inc in .nz too, as it appears they use the 30 * It may work for Woosh Inc in .nz too, as it appears they use the
31 * same kit. 31 * same kit.
32 * 32 *
33 * There is still some work to be done in terms of handling 33 * There is still some work to be done in terms of handling
34 * DCD, DTR, RTS, CTS which are currently faked. 34 * DCD, DTR, RTS, CTS which are currently faked.
35 * It's good enough for PPP at this point. It's based off all kinds of 35 * It's good enough for PPP at this point. It's based off all kinds of
36 * code found in usb/serial and usb/class 36 * code found in usb/serial and usb/class
@@ -47,7 +47,7 @@
47#include <linux/spinlock.h> 47#include <linux/spinlock.h>
48#include <linux/usb.h> 48#include <linux/usb.h>
49#include <linux/usb/serial.h> 49#include <linux/usb/serial.h>
50#include <asm/uaccess.h> 50#include <linux/uaccess.h>
51 51
52/* 52/*
53 * Version Information 53 * Version Information
@@ -64,7 +64,7 @@
64 64
65/* Message sizes */ 65/* Message sizes */
66#define EVENT_BUFFER_SIZE 0xFF 66#define EVENT_BUFFER_SIZE 0xFF
67#define CHAR2INT16(c1,c0) (((u32)((c1) & 0xff) << 8) + (u32)((c0) & 0xff)) 67#define CHAR2INT16(c1, c0) (((u32)((c1) & 0xff) << 8) + (u32)((c0) & 0xff))
68#define NUM_BULK_URBS 24 68#define NUM_BULK_URBS 24
69#define NUM_CONTROL_URBS 16 69#define NUM_CONTROL_URBS 16
70 70
@@ -94,33 +94,34 @@ enum {
94 94
95/* data bits */ 95/* data bits */
96#define ipw_dtb_7 0x700 96#define ipw_dtb_7 0x700
97#define ipw_dtb_8 0x810 // ok so the define is misleading, I know, but forces 8,n,1 97#define ipw_dtb_8 0x810 /* ok so the define is misleading, I know, but forces 8,n,1 */
98 // I mean, is there a point to any other setting these days? :) 98 /* I mean, is there a point to any other setting these days? :) */
99 99
100/* usb control request types : */ 100/* usb control request types : */
101#define IPW_SIO_RXCTL 0x00 // control bulk rx channel transmissions, value=1/0 (on/off) 101#define IPW_SIO_RXCTL 0x00 /* control bulk rx channel transmissions, value=1/0 (on/off) */
102#define IPW_SIO_SET_BAUD 0x01 // set baud, value=requested ipw_sio_bxxxx 102#define IPW_SIO_SET_BAUD 0x01 /* set baud, value=requested ipw_sio_bxxxx */
103#define IPW_SIO_SET_LINE 0x03 // set databits, parity. value=ipw_dtb_x 103#define IPW_SIO_SET_LINE 0x03 /* set databits, parity. value=ipw_dtb_x */
104#define IPW_SIO_SET_PIN 0x03 // set/clear dtr/rts value=ipw_pin_xxx 104#define IPW_SIO_SET_PIN 0x03 /* set/clear dtr/rts value=ipw_pin_xxx */
105#define IPW_SIO_POLL 0x08 // get serial port status byte, call with value=0 105#define IPW_SIO_POLL 0x08 /* get serial port status byte, call with value=0 */
106#define IPW_SIO_INIT 0x11 // initializes ? value=0 (appears as first thing todo on open) 106#define IPW_SIO_INIT 0x11 /* initializes ? value=0 (appears as first thing todo on open) */
107#define IPW_SIO_PURGE 0x12 // purge all transmissions?, call with value=numchar_to_purge 107#define IPW_SIO_PURGE 0x12 /* purge all transmissions?, call with value=numchar_to_purge */
108#define IPW_SIO_HANDFLOW 0x13 // set xon/xoff limits value=0, and a buffer of 0x10 bytes 108#define IPW_SIO_HANDFLOW 0x13 /* set xon/xoff limits value=0, and a buffer of 0x10 bytes */
109#define IPW_SIO_SETCHARS 0x13 // set the flowcontrol special chars, value=0, buf=6 bytes, 109#define IPW_SIO_SETCHARS 0x13 /* set the flowcontrol special chars, value=0, buf=6 bytes, */
110 // last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13 110 /* last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13 */
111 111
112/* values used for request IPW_SIO_SET_PIN */ 112/* values used for request IPW_SIO_SET_PIN */
113#define IPW_PIN_SETDTR 0x101 113#define IPW_PIN_SETDTR 0x101
114#define IPW_PIN_SETRTS 0x202 114#define IPW_PIN_SETRTS 0x202
115#define IPW_PIN_CLRDTR 0x100 115#define IPW_PIN_CLRDTR 0x100
116#define IPW_PIN_CLRRTS 0x200 // unconfirmed 116#define IPW_PIN_CLRRTS 0x200 /* unconfirmed */
117 117
118/* values used for request IPW_SIO_RXCTL */ 118/* values used for request IPW_SIO_RXCTL */
119#define IPW_RXBULK_ON 1 119#define IPW_RXBULK_ON 1
120#define IPW_RXBULK_OFF 0 120#define IPW_RXBULK_OFF 0
121 121
122/* various 16 byte hardcoded transferbuffers used by flow control */ 122/* various 16 byte hardcoded transferbuffers used by flow control */
123#define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 123#define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, \
124 0, 0, 0, 0, 0, 0, 0, 0 }
124 125
125/* Interpretation of modem status lines */ 126/* Interpretation of modem status lines */
126/* These need sorting out by individually connecting pins and checking 127/* These need sorting out by individually connecting pins and checking
@@ -132,17 +133,6 @@ enum {
132#define IPW_CTS ((1<<5) | (1<<4)) 133#define IPW_CTS ((1<<5) | (1<<4))
133 134
134#define IPW_WANTS_TO_SEND 0x30 135#define IPW_WANTS_TO_SEND 0x30
135//#define IPW_DTR /* Data Terminal Ready */
136//#define IPW_CTS /* Clear To Send */
137//#define IPW_CD /* Carrier Detect */
138//#define IPW_DSR /* Data Set Ready */
139//#define IPW_RxD /* Receive pin */
140
141//#define IPW_LE
142//#define IPW_RTS
143//#define IPW_ST
144//#define IPW_SR
145//#define IPW_RI /* Ring Indicator */
146 136
147static struct usb_device_id usb_ipw_ids[] = { 137static struct usb_device_id usb_ipw_ids[] = {
148 { USB_DEVICE(IPW_VID, IPW_PID) }, 138 { USB_DEVICE(IPW_VID, IPW_PID) },
@@ -177,9 +167,10 @@ static void ipw_read_bulk_callback(struct urb *urb)
177 return; 167 return;
178 } 168 }
179 169
180 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 170 usb_serial_debug_data(debug, &port->dev, __func__,
171 urb->actual_length, data);
181 172
182 tty = port->tty; 173 tty = port->port.tty;
183 if (tty && urb->actual_length) { 174 if (tty && urb->actual_length) {
184 tty_buffer_request_room(tty, urb->actual_length); 175 tty_buffer_request_room(tty, urb->actual_length);
185 tty_insert_flip_string(tty, data, urb->actual_length); 176 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -187,19 +178,22 @@ static void ipw_read_bulk_callback(struct urb *urb)
187 } 178 }
188 179
189 /* Continue trying to always read */ 180 /* Continue trying to always read */
190 usb_fill_bulk_urb (port->read_urb, port->serial->dev, 181 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
191 usb_rcvbulkpipe(port->serial->dev, 182 usb_rcvbulkpipe(port->serial->dev,
192 port->bulk_in_endpointAddress), 183 port->bulk_in_endpointAddress),
193 port->read_urb->transfer_buffer, 184 port->read_urb->transfer_buffer,
194 port->read_urb->transfer_buffer_length, 185 port->read_urb->transfer_buffer_length,
195 ipw_read_bulk_callback, port); 186 ipw_read_bulk_callback, port);
196 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 187 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
197 if (result) 188 if (result)
198 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 189 dev_err(&port->dev,
190 "%s - failed resubmitting read urb, error %d\n",
191 __func__, result);
199 return; 192 return;
200} 193}
201 194
202static int ipw_open(struct usb_serial_port *port, struct file *filp) 195static int ipw_open(struct tty_struct *tty,
196 struct usb_serial_port *port, struct file *filp)
203{ 197{
204 struct usb_device *dev = port->serial->dev; 198 struct usb_device *dev = port->serial->dev;
205 u8 buf_flow_static[16] = IPW_BYTES_FLOWINIT; 199 u8 buf_flow_static[16] = IPW_BYTES_FLOWINIT;
@@ -212,29 +206,33 @@ static int ipw_open(struct usb_serial_port *port, struct file *filp)
212 if (!buf_flow_init) 206 if (!buf_flow_init)
213 return -ENOMEM; 207 return -ENOMEM;
214 208
215 if (port->tty) 209 if (tty)
216 port->tty->low_latency = 1; 210 tty->low_latency = 1;
217 211
218 /* --1: Tell the modem to initialize (we think) From sniffs this is always the 212 /* --1: Tell the modem to initialize (we think) From sniffs this is
219 * first thing that gets sent to the modem during opening of the device */ 213 * always the first thing that gets sent to the modem during
220 dbg("%s: Sending SIO_INIT (we guess)",__func__); 214 * opening of the device */
221 result = usb_control_msg(dev, usb_sndctrlpipe(dev,0), 215 dbg("%s: Sending SIO_INIT (we guess)", __func__);
222 IPW_SIO_INIT, 216 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
223 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 217 IPW_SIO_INIT,
224 0, 218 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
225 0, /* index */ 219 0,
226 NULL, 220 0, /* index */
227 0, 221 NULL,
228 100000); 222 0,
223 100000);
229 if (result < 0) 224 if (result < 0)
230 dev_err(&port->dev, "Init of modem failed (error = %d)\n", result); 225 dev_err(&port->dev,
226 "Init of modem failed (error = %d)\n", result);
231 227
232 /* reset the bulk pipes */ 228 /* reset the bulk pipes */
233 usb_clear_halt(dev, usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress)); 229 usb_clear_halt(dev,
234 usb_clear_halt(dev, usb_sndbulkpipe(dev, port->bulk_out_endpointAddress)); 230 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress));
231 usb_clear_halt(dev,
232 usb_sndbulkpipe(dev, port->bulk_out_endpointAddress));
235 233
236 /*--2: Start reading from the device */ 234 /*--2: Start reading from the device */
237 dbg("%s: setting up bulk read callback",__func__); 235 dbg("%s: setting up bulk read callback", __func__);
238 usb_fill_bulk_urb(port->read_urb, dev, 236 usb_fill_bulk_urb(port->read_urb, dev,
239 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress), 237 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
240 port->bulk_in_buffer, 238 port->bulk_in_buffer,
@@ -242,66 +240,72 @@ static int ipw_open(struct usb_serial_port *port, struct file *filp)
242 ipw_read_bulk_callback, port); 240 ipw_read_bulk_callback, port);
243 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 241 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
244 if (result < 0) 242 if (result < 0)
245 dbg("%s - usb_submit_urb(read bulk) failed with status %d", __func__, result); 243 dbg("%s - usb_submit_urb(read bulk) failed with status %d",
244 __func__, result);
246 245
247 /*--3: Tell the modem to open the floodgates on the rx bulk channel */ 246 /*--3: Tell the modem to open the floodgates on the rx bulk channel */
248 dbg("%s:asking modem for RxRead (RXBULK_ON)",__func__); 247 dbg("%s:asking modem for RxRead (RXBULK_ON)", __func__);
249 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 248 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
250 IPW_SIO_RXCTL, 249 IPW_SIO_RXCTL,
251 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 250 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
252 IPW_RXBULK_ON, 251 IPW_RXBULK_ON,
253 0, /* index */ 252 0, /* index */
254 NULL, 253 NULL,
255 0, 254 0,
256 100000); 255 100000);
257 if (result < 0) 256 if (result < 0)
258 dev_err(&port->dev, "Enabling bulk RxRead failed (error = %d)\n", result); 257 dev_err(&port->dev,
258 "Enabling bulk RxRead failed (error = %d)\n", result);
259 259
260 /*--4: setup the initial flowcontrol */ 260 /*--4: setup the initial flowcontrol */
261 dbg("%s:setting init flowcontrol (%s)",__func__,buf_flow_init); 261 dbg("%s:setting init flowcontrol (%s)", __func__, buf_flow_init);
262 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 262 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
263 IPW_SIO_HANDFLOW, 263 IPW_SIO_HANDFLOW,
264 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 264 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
265 0, 265 0,
266 0, 266 0,
267 buf_flow_init, 267 buf_flow_init,
268 0x10, 268 0x10,
269 200000); 269 200000);
270 if (result < 0) 270 if (result < 0)
271 dev_err(&port->dev, "initial flowcontrol failed (error = %d)\n", result); 271 dev_err(&port->dev,
272 "initial flowcontrol failed (error = %d)\n", result);
272 273
273 274
274 /*--5: raise the dtr */ 275 /*--5: raise the dtr */
275 dbg("%s:raising dtr",__func__); 276 dbg("%s:raising dtr", __func__);
276 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 277 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
277 IPW_SIO_SET_PIN, 278 IPW_SIO_SET_PIN,
278 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 279 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
279 IPW_PIN_SETDTR, 280 IPW_PIN_SETDTR,
280 0, 281 0,
281 NULL, 282 NULL,
282 0, 283 0,
283 200000); 284 200000);
284 if (result < 0) 285 if (result < 0)
285 dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); 286 dev_err(&port->dev,
287 "setting dtr failed (error = %d)\n", result);
286 288
287 /*--6: raise the rts */ 289 /*--6: raise the rts */
288 dbg("%s:raising rts",__func__); 290 dbg("%s:raising rts", __func__);
289 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 291 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
290 IPW_SIO_SET_PIN, 292 IPW_SIO_SET_PIN,
291 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 293 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
292 IPW_PIN_SETRTS, 294 IPW_PIN_SETRTS,
293 0, 295 0,
294 NULL, 296 NULL,
295 0, 297 0,
296 200000); 298 200000);
297 if (result < 0) 299 if (result < 0)
298 dev_err(&port->dev, "setting dtr failed (error = %d)\n", result); 300 dev_err(&port->dev,
299 301 "setting dtr failed (error = %d)\n", result);
302
300 kfree(buf_flow_init); 303 kfree(buf_flow_init);
301 return 0; 304 return 0;
302} 305}
303 306
304static void ipw_close(struct usb_serial_port *port, struct file * filp) 307static void ipw_close(struct tty_struct *tty,
308 struct usb_serial_port *port, struct file *filp)
305{ 309{
306 struct usb_device *dev = port->serial->dev; 310 struct usb_device *dev = port->serial->dev;
307 int result; 311 int result;
@@ -312,56 +316,62 @@ static void ipw_close(struct usb_serial_port *port, struct file * filp)
312 } 316 }
313 317
314 /*--1: drop the dtr */ 318 /*--1: drop the dtr */
315 dbg("%s:dropping dtr",__func__); 319 dbg("%s:dropping dtr", __func__);
316 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 320 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
317 IPW_SIO_SET_PIN, 321 IPW_SIO_SET_PIN,
318 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 322 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
319 IPW_PIN_CLRDTR, 323 IPW_PIN_CLRDTR,
320 0, 324 0,
321 NULL, 325 NULL,
322 0, 326 0,
323 200000); 327 200000);
324 if (result < 0) 328 if (result < 0)
325 dev_err(&port->dev, "dropping dtr failed (error = %d)\n", result); 329 dev_err(&port->dev, "dropping dtr failed (error = %d)\n",
330 result);
326 331
327 /*--2: drop the rts */ 332 /*--2: drop the rts */
328 dbg("%s:dropping rts",__func__); 333 dbg("%s:dropping rts", __func__);
329 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 334 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
330 IPW_SIO_SET_PIN, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 335 IPW_SIO_SET_PIN, USB_TYPE_VENDOR |
331 IPW_PIN_CLRRTS, 336 USB_RECIP_INTERFACE | USB_DIR_OUT,
332 0, 337 IPW_PIN_CLRRTS,
333 NULL, 338 0,
334 0, 339 NULL,
335 200000); 340 0,
341 200000);
336 if (result < 0) 342 if (result < 0)
337 dev_err(&port->dev, "dropping rts failed (error = %d)\n", result); 343 dev_err(&port->dev,
344 "dropping rts failed (error = %d)\n", result);
338 345
339 346
340 /*--3: purge */ 347 /*--3: purge */
341 dbg("%s:sending purge",__func__); 348 dbg("%s:sending purge", __func__);
342 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 349 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
343 IPW_SIO_PURGE, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 350 IPW_SIO_PURGE, USB_TYPE_VENDOR |
344 0x03, 351 USB_RECIP_INTERFACE | USB_DIR_OUT,
345 0, 352 0x03,
346 NULL, 353 0,
347 0, 354 NULL,
348 200000); 355 0,
356 200000);
349 if (result < 0) 357 if (result < 0)
350 dev_err(&port->dev, "purge failed (error = %d)\n", result); 358 dev_err(&port->dev, "purge failed (error = %d)\n", result);
351 359
352 360
353 /* send RXBULK_off (tell modem to stop transmitting bulk data on rx chan) */ 361 /* send RXBULK_off (tell modem to stop transmitting bulk data on
362 rx chan) */
354 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 363 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
355 IPW_SIO_RXCTL, 364 IPW_SIO_RXCTL,
356 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 365 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
357 IPW_RXBULK_OFF, 366 IPW_RXBULK_OFF,
358 0, /* index */ 367 0, /* index */
359 NULL, 368 NULL,
360 0, 369 0,
361 100000); 370 100000);
362 371
363 if (result < 0) 372 if (result < 0)
364 dev_err(&port->dev, "Disabling bulk RxRead failed (error = %d)\n", result); 373 dev_err(&port->dev,
374 "Disabling bulk RxRead failed (error = %d)\n", result);
365 375
366 /* shutdown any in-flight urbs that we know about */ 376 /* shutdown any in-flight urbs that we know about */
367 usb_kill_urb(port->read_urb); 377 usb_kill_urb(port->read_urb);
@@ -384,13 +394,14 @@ static void ipw_write_bulk_callback(struct urb *urb)
384 usb_serial_port_softint(port); 394 usb_serial_port_softint(port);
385} 395}
386 396
387static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int count) 397static int ipw_write(struct tty_struct *tty, struct usb_serial_port *port,
398 const unsigned char *buf, int count)
388{ 399{
389 struct usb_device *dev = port->serial->dev; 400 struct usb_device *dev = port->serial->dev;
390 int ret; 401 int ret;
391 402
392 dbg("%s: TOP: count=%d, in_interrupt=%ld", __func__, 403 dbg("%s: TOP: count=%d, in_interrupt=%ld", __func__,
393 count, in_interrupt() ); 404 count, in_interrupt());
394 405
395 if (count == 0) { 406 if (count == 0) {
396 dbg("%s - write request of 0 bytes", __func__); 407 dbg("%s - write request of 0 bytes", __func__);
@@ -421,13 +432,14 @@ static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int
421 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC); 432 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
422 if (ret != 0) { 433 if (ret != 0) {
423 port->write_urb_busy = 0; 434 port->write_urb_busy = 0;
424 dbg("%s - usb_submit_urb(write bulk) failed with error = %d", __func__, ret); 435 dbg("%s - usb_submit_urb(write bulk) failed with error = %d",
436 __func__, ret);
425 return ret; 437 return ret;
426 } 438 }
427 439
428 dbg("%s returning %d", __func__, count); 440 dbg("%s returning %d", __func__, count);
429 return count; 441 return count;
430} 442}
431 443
432static int ipw_probe(struct usb_serial_port *port) 444static int ipw_probe(struct usb_serial_port *port)
433{ 445{
@@ -486,8 +498,8 @@ module_init(usb_ipw_init);
486module_exit(usb_ipw_exit); 498module_exit(usb_ipw_exit);
487 499
488/* Module information */ 500/* Module information */
489MODULE_AUTHOR( DRIVER_AUTHOR ); 501MODULE_AUTHOR(DRIVER_AUTHOR);
490MODULE_DESCRIPTION( DRIVER_DESC ); 502MODULE_DESCRIPTION(DRIVER_DESC);
491MODULE_LICENSE("GPL"); 503MODULE_LICENSE("GPL");
492 504
493module_param(debug, bool, S_IRUGO | S_IWUSR); 505module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
index 004d57385a75..e59155c6607d 100644
--- a/drivers/usb/serial/ir-usb.c
+++ b/drivers/usb/serial/ir-usb.c
@@ -19,7 +19,12 @@
19 * was written by Roman Weissgaerber <weissg@vienna.at>, Dag Brattli 19 * was written by Roman Weissgaerber <weissg@vienna.at>, Dag Brattli
20 * <dag@brattli.net>, and Jean Tourrilhes <jt@hpl.hp.com> 20 * <dag@brattli.net>, and Jean Tourrilhes <jt@hpl.hp.com>
21 * 21 *
22 * See Documentation/usb/usb-serial.txt for more information on using this driver 22 * See Documentation/usb/usb-serial.txt for more information on using this
23 * driver
24 *
25 * 2008_Jun_02 Felipe Balbi <me@felipebalbi.com>
26 * Introduced common header to be used also in USB Gadget Framework.
27 * Still needs some other style fixes.
23 * 28 *
24 * 2007_Jun_21 Alan Cox <alan@redhat.com> 29 * 2007_Jun_21 Alan Cox <alan@redhat.com>
25 * Minimal cleanups for some of the driver problens and tty layer abuse. 30 * Minimal cleanups for some of the driver problens and tty layer abuse.
@@ -59,9 +64,10 @@
59#include <linux/tty_flip.h> 64#include <linux/tty_flip.h>
60#include <linux/module.h> 65#include <linux/module.h>
61#include <linux/spinlock.h> 66#include <linux/spinlock.h>
62#include <asm/uaccess.h> 67#include <linux/uaccess.h>
63#include <linux/usb.h> 68#include <linux/usb.h>
64#include <linux/usb/serial.h> 69#include <linux/usb/serial.h>
70#include <linux/usb/irda.h>
65 71
66/* 72/*
67 * Version Information 73 * Version Information
@@ -70,100 +76,77 @@
70#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>" 76#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
71#define DRIVER_DESC "USB IR Dongle driver" 77#define DRIVER_DESC "USB IR Dongle driver"
72 78
73/* USB IrDA class spec information */
74#define USB_CLASS_IRDA 0x02
75#define USB_DT_IRDA 0x21
76#define IU_REQ_GET_CLASS_DESC 0x06
77#define SPEED_2400 0x01
78#define SPEED_9600 0x02
79#define SPEED_19200 0x03
80#define SPEED_38400 0x04
81#define SPEED_57600 0x05
82#define SPEED_115200 0x06
83#define SPEED_576000 0x07
84#define SPEED_1152000 0x08
85#define SPEED_4000000 0x09
86
87struct irda_class_desc {
88 u8 bLength;
89 u8 bDescriptorType;
90 u16 bcdSpecRevision;
91 u8 bmDataSize;
92 u8 bmWindowSize;
93 u8 bmMinTurnaroundTime;
94 u16 wBaudRate;
95 u8 bmAdditionalBOFs;
96 u8 bIrdaRateSniff;
97 u8 bMaxUnicastList;
98} __attribute__ ((packed));
99
100static int debug; 79static int debug;
101 80
102/* if overridden by the user, then use their value for the size of the read and 81/* if overridden by the user, then use their value for the size of the read and
103 * write urbs */ 82 * write urbs */
104static int buffer_size; 83static int buffer_size;
84
105/* if overridden by the user, then use the specified number of XBOFs */ 85/* if overridden by the user, then use the specified number of XBOFs */
106static int xbof = -1; 86static int xbof = -1;
107 87
108static int ir_startup (struct usb_serial *serial); 88static int ir_startup (struct usb_serial *serial);
109static int ir_open (struct usb_serial_port *port, struct file *filep); 89static int ir_open(struct tty_struct *tty, struct usb_serial_port *port,
110static void ir_close (struct usb_serial_port *port, struct file *filep); 90 struct file *filep);
111static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count); 91static void ir_close(struct tty_struct *tty, struct usb_serial_port *port,
92 struct file *filep);
93static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
94 const unsigned char *buf, int count);
112static void ir_write_bulk_callback (struct urb *urb); 95static void ir_write_bulk_callback (struct urb *urb);
113static void ir_read_bulk_callback (struct urb *urb); 96static void ir_read_bulk_callback (struct urb *urb);
114static void ir_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); 97static void ir_set_termios(struct tty_struct *tty,
98 struct usb_serial_port *port, struct ktermios *old_termios);
115 99
116/* Not that this lot means you can only have one per system */ 100/* Not that this lot means you can only have one per system */
117static u8 ir_baud = 0; 101static u8 ir_baud;
118static u8 ir_xbof = 0; 102static u8 ir_xbof;
119static u8 ir_add_bof = 0; 103static u8 ir_add_bof;
120 104
121static struct usb_device_id id_table [] = { 105static struct usb_device_id ir_id_table[] = {
122 { USB_DEVICE(0x050f, 0x0180) }, /* KC Technology, KC-180 */ 106 { USB_DEVICE(0x050f, 0x0180) }, /* KC Technology, KC-180 */
123 { USB_DEVICE(0x08e9, 0x0100) }, /* XTNDAccess */ 107 { USB_DEVICE(0x08e9, 0x0100) }, /* XTNDAccess */
124 { USB_DEVICE(0x09c4, 0x0011) }, /* ACTiSys ACT-IR2000U */ 108 { USB_DEVICE(0x09c4, 0x0011) }, /* ACTiSys ACT-IR2000U */
125 { USB_INTERFACE_INFO (USB_CLASS_APP_SPEC, USB_CLASS_IRDA, 0) }, 109 { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, USB_SUBCLASS_IRDA, 0) },
126 { } /* Terminating entry */ 110 { } /* Terminating entry */
127}; 111};
128 112
129MODULE_DEVICE_TABLE (usb, id_table); 113MODULE_DEVICE_TABLE(usb, ir_id_table);
130 114
131static struct usb_driver ir_driver = { 115static struct usb_driver ir_driver = {
132 .name = "ir-usb", 116 .name = "ir-usb",
133 .probe = usb_serial_probe, 117 .probe = usb_serial_probe,
134 .disconnect = usb_serial_disconnect, 118 .disconnect = usb_serial_disconnect,
135 .id_table = id_table, 119 .id_table = ir_id_table,
136 .no_dynamic_id = 1, 120 .no_dynamic_id = 1,
137}; 121};
138 122
139
140static struct usb_serial_driver ir_device = { 123static struct usb_serial_driver ir_device = {
141 .driver = { 124 .driver = {
142 .owner = THIS_MODULE, 125 .owner = THIS_MODULE,
143 .name = "ir-usb", 126 .name = "ir-usb",
144 }, 127 },
145 .description = "IR Dongle", 128 .description = "IR Dongle",
146 .usb_driver = &ir_driver, 129 .usb_driver = &ir_driver,
147 .id_table = id_table, 130 .id_table = ir_id_table,
148 .num_ports = 1, 131 .num_ports = 1,
149 .set_termios = ir_set_termios, 132 .set_termios = ir_set_termios,
150 .attach = ir_startup, 133 .attach = ir_startup,
151 .open = ir_open, 134 .open = ir_open,
152 .close = ir_close, 135 .close = ir_close,
153 .write = ir_write, 136 .write = ir_write,
154 .write_bulk_callback = ir_write_bulk_callback, 137 .write_bulk_callback = ir_write_bulk_callback,
155 .read_bulk_callback = ir_read_bulk_callback, 138 .read_bulk_callback = ir_read_bulk_callback,
156}; 139};
157 140
158static inline void irda_usb_dump_class_desc(struct irda_class_desc *desc) 141static inline void irda_usb_dump_class_desc(struct usb_irda_cs_descriptor *desc)
159{ 142{
160 dbg("bLength=%x", desc->bLength); 143 dbg("bLength=%x", desc->bLength);
161 dbg("bDescriptorType=%x", desc->bDescriptorType); 144 dbg("bDescriptorType=%x", desc->bDescriptorType);
162 dbg("bcdSpecRevision=%x", desc->bcdSpecRevision); 145 dbg("bcdSpecRevision=%x", __le16_to_cpu(desc->bcdSpecRevision));
163 dbg("bmDataSize=%x", desc->bmDataSize); 146 dbg("bmDataSize=%x", desc->bmDataSize);
164 dbg("bmWindowSize=%x", desc->bmWindowSize); 147 dbg("bmWindowSize=%x", desc->bmWindowSize);
165 dbg("bmMinTurnaroundTime=%d", desc->bmMinTurnaroundTime); 148 dbg("bmMinTurnaroundTime=%d", desc->bmMinTurnaroundTime);
166 dbg("wBaudRate=%x", desc->wBaudRate); 149 dbg("wBaudRate=%x", __le16_to_cpu(desc->wBaudRate));
167 dbg("bmAdditionalBOFs=%x", desc->bmAdditionalBOFs); 150 dbg("bmAdditionalBOFs=%x", desc->bmAdditionalBOFs);
168 dbg("bIrdaRateSniff=%x", desc->bIrdaRateSniff); 151 dbg("bIrdaRateSniff=%x", desc->bIrdaRateSniff);
169 dbg("bMaxUnicastList=%x", desc->bMaxUnicastList); 152 dbg("bMaxUnicastList=%x", desc->bMaxUnicastList);
@@ -181,35 +164,37 @@ static inline void irda_usb_dump_class_desc(struct irda_class_desc *desc)
181 * 164 *
182 * Based on the same function in drivers/net/irda/irda-usb.c 165 * Based on the same function in drivers/net/irda/irda-usb.c
183 */ 166 */
184static struct irda_class_desc *irda_usb_find_class_desc(struct usb_device *dev, unsigned int ifnum) 167static struct usb_irda_cs_descriptor *
168irda_usb_find_class_desc(struct usb_device *dev, unsigned int ifnum)
185{ 169{
186 struct irda_class_desc *desc; 170 struct usb_irda_cs_descriptor *desc;
187 int ret; 171 int ret;
188 172
189 desc = kzalloc(sizeof (struct irda_class_desc), GFP_KERNEL); 173 desc = kzalloc(sizeof(*desc), GFP_KERNEL);
190 if (desc == NULL) 174 if (!desc)
191 return NULL; 175 return NULL;
192 176
193 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev,0), 177 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
194 IU_REQ_GET_CLASS_DESC, 178 USB_REQ_CS_IRDA_GET_CLASS_DESC,
195 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 179 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
196 0, ifnum, desc, sizeof(*desc), 1000); 180 0, ifnum, desc, sizeof(*desc), 1000);
197 181
198 dbg("%s - ret=%d", __func__, ret); 182 dbg("%s - ret=%d", __func__, ret);
199 if (ret < sizeof(*desc)) { 183 if (ret < sizeof(*desc)) {
200 dbg("%s - class descriptor read %s (%d)", 184 dbg("%s - class descriptor read %s (%d)",
201 __func__, 185 __func__,
202 (ret<0) ? "failed" : "too short", 186 (ret < 0) ? "failed" : "too short",
203 ret); 187 ret);
204 goto error; 188 goto error;
205 } 189 }
206 if (desc->bDescriptorType != USB_DT_IRDA) { 190 if (desc->bDescriptorType != USB_DT_CS_IRDA) {
207 dbg("%s - bad class descriptor type", __func__); 191 dbg("%s - bad class descriptor type", __func__);
208 goto error; 192 goto error;
209 } 193 }
210 194
211 irda_usb_dump_class_desc(desc); 195 irda_usb_dump_class_desc(desc);
212 return desc; 196 return desc;
197
213error: 198error:
214 kfree(desc); 199 kfree(desc);
215 return NULL; 200 return NULL;
@@ -219,64 +204,101 @@ error:
219static u8 ir_xbof_change(u8 xbof) 204static u8 ir_xbof_change(u8 xbof)
220{ 205{
221 u8 result; 206 u8 result;
207
222 /* reference irda-usb.c */ 208 /* reference irda-usb.c */
223 switch(xbof) { 209 switch (xbof) {
224 case 48: result = 0x10; break; 210 case 48:
225 case 28: 211 result = 0x10;
226 case 24: result = 0x20; break; 212 break;
227 default: 213 case 28:
228 case 12: result = 0x30; break; 214 case 24:
229 case 5: 215 result = 0x20;
230 case 6: result = 0x40; break; 216 break;
231 case 3: result = 0x50; break; 217 default:
232 case 2: result = 0x60; break; 218 case 12:
233 case 1: result = 0x70; break; 219 result = 0x30;
234 case 0: result = 0x80; break; 220 break;
221 case 5:
222 case 6:
223 result = 0x40;
224 break;
225 case 3:
226 result = 0x50;
227 break;
228 case 2:
229 result = 0x60;
230 break;
231 case 1:
232 result = 0x70;
233 break;
234 case 0:
235 result = 0x80;
236 break;
235 } 237 }
238
236 return(result); 239 return(result);
237} 240}
238 241
239 242
240static int ir_startup (struct usb_serial *serial) 243static int ir_startup(struct usb_serial *serial)
241{ 244{
242 struct irda_class_desc *irda_desc; 245 struct usb_irda_cs_descriptor *irda_desc;
243 246
244 irda_desc = irda_usb_find_class_desc (serial->dev, 0); 247 irda_desc = irda_usb_find_class_desc(serial->dev, 0);
245 if (irda_desc == NULL) { 248 if (!irda_desc) {
246 dev_err (&serial->dev->dev, "IRDA class descriptor not found, device not bound\n"); 249 dev_err(&serial->dev->dev,
250 "IRDA class descriptor not found, device not bound\n");
247 return -ENODEV; 251 return -ENODEV;
248 } 252 }
249 253
250 dbg ("%s - Baud rates supported:%s%s%s%s%s%s%s%s%s", 254 dbg("%s - Baud rates supported:%s%s%s%s%s%s%s%s%s",
251 __func__, 255 __func__,
252 (irda_desc->wBaudRate & 0x0001) ? " 2400" : "", 256 (irda_desc->wBaudRate & USB_IRDA_BR_2400) ? " 2400" : "",
253 (irda_desc->wBaudRate & 0x0002) ? " 9600" : "", 257 (irda_desc->wBaudRate & USB_IRDA_BR_9600) ? " 9600" : "",
254 (irda_desc->wBaudRate & 0x0004) ? " 19200" : "", 258 (irda_desc->wBaudRate & USB_IRDA_BR_19200) ? " 19200" : "",
255 (irda_desc->wBaudRate & 0x0008) ? " 38400" : "", 259 (irda_desc->wBaudRate & USB_IRDA_BR_38400) ? " 38400" : "",
256 (irda_desc->wBaudRate & 0x0010) ? " 57600" : "", 260 (irda_desc->wBaudRate & USB_IRDA_BR_57600) ? " 57600" : "",
257 (irda_desc->wBaudRate & 0x0020) ? " 115200" : "", 261 (irda_desc->wBaudRate & USB_IRDA_BR_115200) ? " 115200" : "",
258 (irda_desc->wBaudRate & 0x0040) ? " 576000" : "", 262 (irda_desc->wBaudRate & USB_IRDA_BR_576000) ? " 576000" : "",
259 (irda_desc->wBaudRate & 0x0080) ? " 1152000" : "", 263 (irda_desc->wBaudRate & USB_IRDA_BR_1152000) ? " 1152000" : "",
260 (irda_desc->wBaudRate & 0x0100) ? " 4000000" : ""); 264 (irda_desc->wBaudRate & USB_IRDA_BR_4000000) ? " 4000000" : "");
261 265
262 switch( irda_desc->bmAdditionalBOFs ) { 266 switch (irda_desc->bmAdditionalBOFs) {
263 case 0x01: ir_add_bof = 48; break; 267 case USB_IRDA_AB_48:
264 case 0x02: ir_add_bof = 24; break; 268 ir_add_bof = 48;
265 case 0x04: ir_add_bof = 12; break; 269 break;
266 case 0x08: ir_add_bof = 6; break; 270 case USB_IRDA_AB_24:
267 case 0x10: ir_add_bof = 3; break; 271 ir_add_bof = 24;
268 case 0x20: ir_add_bof = 2; break; 272 break;
269 case 0x40: ir_add_bof = 1; break; 273 case USB_IRDA_AB_12:
270 case 0x80: ir_add_bof = 0; break; 274 ir_add_bof = 12;
271 default:; 275 break;
276 case USB_IRDA_AB_6:
277 ir_add_bof = 6;
278 break;
279 case USB_IRDA_AB_3:
280 ir_add_bof = 3;
281 break;
282 case USB_IRDA_AB_2:
283 ir_add_bof = 2;
284 break;
285 case USB_IRDA_AB_1:
286 ir_add_bof = 1;
287 break;
288 case USB_IRDA_AB_0:
289 ir_add_bof = 0;
290 break;
291 default:
292 break;
272 } 293 }
273 294
274 kfree (irda_desc); 295 kfree(irda_desc);
275 296
276 return 0; 297 return 0;
277} 298}
278 299
279static int ir_open (struct usb_serial_port *port, struct file *filp) 300static int ir_open(struct tty_struct *tty,
301 struct usb_serial_port *port, struct file *filp)
280{ 302{
281 char *buffer; 303 char *buffer;
282 int result = 0; 304 int result = 0;
@@ -285,51 +307,56 @@ static int ir_open (struct usb_serial_port *port, struct file *filp)
285 307
286 if (buffer_size) { 308 if (buffer_size) {
287 /* override the default buffer sizes */ 309 /* override the default buffer sizes */
288 buffer = kmalloc (buffer_size, GFP_KERNEL); 310 buffer = kmalloc(buffer_size, GFP_KERNEL);
289 if (!buffer) { 311 if (!buffer) {
290 dev_err (&port->dev, "%s - out of memory.\n", __func__); 312 dev_err(&port->dev, "%s - out of memory.\n", __func__);
291 return -ENOMEM; 313 return -ENOMEM;
292 } 314 }
293 kfree (port->read_urb->transfer_buffer); 315 kfree(port->read_urb->transfer_buffer);
294 port->read_urb->transfer_buffer = buffer; 316 port->read_urb->transfer_buffer = buffer;
295 port->read_urb->transfer_buffer_length = buffer_size; 317 port->read_urb->transfer_buffer_length = buffer_size;
296 318
297 buffer = kmalloc (buffer_size, GFP_KERNEL); 319 buffer = kmalloc(buffer_size, GFP_KERNEL);
298 if (!buffer) { 320 if (!buffer) {
299 dev_err (&port->dev, "%s - out of memory.\n", __func__); 321 dev_err(&port->dev, "%s - out of memory.\n", __func__);
300 return -ENOMEM; 322 return -ENOMEM;
301 } 323 }
302 kfree (port->write_urb->transfer_buffer); 324 kfree(port->write_urb->transfer_buffer);
303 port->write_urb->transfer_buffer = buffer; 325 port->write_urb->transfer_buffer = buffer;
304 port->write_urb->transfer_buffer_length = buffer_size; 326 port->write_urb->transfer_buffer_length = buffer_size;
305 port->bulk_out_size = buffer_size; 327 port->bulk_out_size = buffer_size;
306 } 328 }
307 329
308 /* Start reading from the device */ 330 /* Start reading from the device */
309 usb_fill_bulk_urb ( 331 usb_fill_bulk_urb(
310 port->read_urb, 332 port->read_urb,
311 port->serial->dev, 333 port->serial->dev,
312 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress), 334 usb_rcvbulkpipe(port->serial->dev,
335 port->bulk_in_endpointAddress),
313 port->read_urb->transfer_buffer, 336 port->read_urb->transfer_buffer,
314 port->read_urb->transfer_buffer_length, 337 port->read_urb->transfer_buffer_length,
315 ir_read_bulk_callback, 338 ir_read_bulk_callback,
316 port); 339 port);
317 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 340 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
318 if (result) 341 if (result)
319 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 342 dev_err(&port->dev,
343 "%s - failed submitting read urb, error %d\n",
344 __func__, result);
320 345
321 return result; 346 return result;
322} 347}
323 348
324static void ir_close (struct usb_serial_port *port, struct file * filp) 349static void ir_close(struct tty_struct *tty,
350 struct usb_serial_port *port, struct file * filp)
325{ 351{
326 dbg("%s - port %d", __func__, port->number); 352 dbg("%s - port %d", __func__, port->number);
327 353
328 /* shutdown our bulk read */ 354 /* shutdown our bulk read */
329 usb_kill_urb(port->read_urb); 355 usb_kill_urb(port->read_urb);
330} 356}
331 357
332static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count) 358static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
359 const unsigned char *buf, int count)
333{ 360{
334 unsigned char *transfer_buffer; 361 unsigned char *transfer_buffer;
335 int result; 362 int result;
@@ -337,11 +364,6 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int
337 364
338 dbg("%s - port = %d, count = %d", __func__, port->number, count); 365 dbg("%s - port = %d, count = %d", __func__, port->number, count);
339 366
340 if (!port->tty) {
341 dev_err (&port->dev, "%s - no tty???\n", __func__);
342 return 0;
343 }
344
345 if (count == 0) 367 if (count == 0)
346 return 0; 368 return 0;
347 369
@@ -359,7 +381,7 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int
359 381
360 /* 382 /*
361 * The first byte of the packet we send to the device contains an 383 * The first byte of the packet we send to the device contains an
362 * inband header which indicates an additional number of BOFs and 384 * inbound header which indicates an additional number of BOFs and
363 * a baud rate change. 385 * a baud rate change.
364 * 386 *
365 * See section 5.4.2.2 of the USB IrDA spec. 387 * See section 5.4.2.2 of the USB IrDA spec.
@@ -367,9 +389,9 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int
367 *transfer_buffer = ir_xbof | ir_baud; 389 *transfer_buffer = ir_xbof | ir_baud;
368 ++transfer_buffer; 390 ++transfer_buffer;
369 391
370 memcpy (transfer_buffer, buf, transfer_size); 392 memcpy(transfer_buffer, buf, transfer_size);
371 393
372 usb_fill_bulk_urb ( 394 usb_fill_bulk_urb(
373 port->write_urb, 395 port->write_urb,
374 port->serial->dev, 396 port->serial->dev,
375 usb_sndbulkpipe(port->serial->dev, 397 usb_sndbulkpipe(port->serial->dev,
@@ -381,17 +403,19 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int
381 403
382 port->write_urb->transfer_flags = URB_ZERO_PACKET; 404 port->write_urb->transfer_flags = URB_ZERO_PACKET;
383 405
384 result = usb_submit_urb (port->write_urb, GFP_ATOMIC); 406 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
385 if (result) { 407 if (result) {
386 port->write_urb_busy = 0; 408 port->write_urb_busy = 0;
387 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result); 409 dev_err(&port->dev,
410 "%s - failed submitting write urb, error %d\n",
411 __func__, result);
388 } else 412 } else
389 result = transfer_size; 413 result = transfer_size;
390 414
391 return result; 415 return result;
392} 416}
393 417
394static void ir_write_bulk_callback (struct urb *urb) 418static void ir_write_bulk_callback(struct urb *urb)
395{ 419{
396 struct usb_serial_port *port = urb->context; 420 struct usb_serial_port *port = urb->context;
397 int status = urb->status; 421 int status = urb->status;
@@ -405,7 +429,7 @@ static void ir_write_bulk_callback (struct urb *urb)
405 return; 429 return;
406 } 430 }
407 431
408 usb_serial_debug_data ( 432 usb_serial_debug_data(
409 debug, 433 debug,
410 &port->dev, 434 &port->dev,
411 __func__, 435 __func__,
@@ -415,7 +439,7 @@ static void ir_write_bulk_callback (struct urb *urb)
415 usb_serial_port_softint(port); 439 usb_serial_port_softint(port);
416} 440}
417 441
418static void ir_read_bulk_callback (struct urb *urb) 442static void ir_read_bulk_callback(struct urb *urb)
419{ 443{
420 struct usb_serial_port *port = urb->context; 444 struct usb_serial_port *port = urb->context;
421 struct tty_struct *tty; 445 struct tty_struct *tty;
@@ -425,74 +449,61 @@ static void ir_read_bulk_callback (struct urb *urb)
425 449
426 dbg("%s - port %d", __func__, port->number); 450 dbg("%s - port %d", __func__, port->number);
427 451
428 if (!port->open_count) { 452 if (!port->port.count) {
429 dbg("%s - port closed.", __func__); 453 dbg("%s - port closed.", __func__);
430 return; 454 return;
431 } 455 }
432 456
433 switch (status) { 457 switch (status) {
434 case 0: /* Successful */ 458 case 0: /* Successful */
435 459 /*
436 /* 460 * The first byte of the packet we get from the device
437 * The first byte of the packet we get from the device 461 * contains a busy indicator and baud rate change.
438 * contains a busy indicator and baud rate change. 462 * See section 5.4.1.2 of the USB IrDA spec.
439 * See section 5.4.1.2 of the USB IrDA spec. 463 */
440 */ 464 if ((*data & 0x0f) > 0)
441 if ((*data & 0x0f) > 0) 465 ir_baud = *data & 0x0f;
442 ir_baud = *data & 0x0f; 466 usb_serial_debug_data(debug, &port->dev, __func__,
443 467 urb->actual_length, data);
444 usb_serial_debug_data ( 468 tty = port->port.tty;
445 debug, 469 if (tty_buffer_request_room(tty, urb->actual_length - 1)) {
446 &port->dev, 470 tty_insert_flip_string(tty, data+1, urb->actual_length - 1);
447 __func__, 471 tty_flip_buffer_push(tty);
448 urb->actual_length, 472 }
449 data);
450
451 tty = port->tty;
452
453 if (tty_buffer_request_room(tty, urb->actual_length - 1)) {
454 tty_insert_flip_string(tty, data+1, urb->actual_length - 1);
455 tty_flip_buffer_push(tty);
456 }
457
458 /*
459 * No break here.
460 * We want to resubmit the urb so we can read
461 * again.
462 */
463 473
464 case -EPROTO: /* taking inspiration from pl2303.c */ 474 /*
475 * No break here.
476 * We want to resubmit the urb so we can read
477 * again.
478 */
465 479
480 case -EPROTO: /* taking inspiration from pl2303.c */
466 /* Continue trying to always read */ 481 /* Continue trying to always read */
467 usb_fill_bulk_urb ( 482 usb_fill_bulk_urb(
468 port->read_urb, 483 port->read_urb,
469 port->serial->dev, 484 port->serial->dev,
470 usb_rcvbulkpipe(port->serial->dev, 485 usb_rcvbulkpipe(port->serial->dev,
471 port->bulk_in_endpointAddress), 486 port->bulk_in_endpointAddress),
472 port->read_urb->transfer_buffer, 487 port->read_urb->transfer_buffer,
473 port->read_urb->transfer_buffer_length, 488 port->read_urb->transfer_buffer_length,
474 ir_read_bulk_callback, 489 ir_read_bulk_callback,
475 port); 490 port);
476 491
477 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 492 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
478 if (result) 493 if (result)
479 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", 494 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n",
480 __func__, result); 495 __func__, result);
481
482 break ;
483
484 default:
485 dbg("%s - nonzero read bulk status received: %d",
486 __func__,
487 status);
488 break ; 496 break ;
489 497 default:
498 dbg("%s - nonzero read bulk status received: %d",
499 __func__, status);
500 break ;
490 } 501 }
491
492 return; 502 return;
493} 503}
494 504
495static void ir_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) 505static void ir_set_termios(struct tty_struct *tty,
506 struct usb_serial_port *port, struct ktermios *old_termios)
496{ 507{
497 unsigned char *transfer_buffer; 508 unsigned char *transfer_buffer;
498 int result; 509 int result;
@@ -501,7 +512,7 @@ static void ir_set_termios (struct usb_serial_port *port, struct ktermios *old_t
501 512
502 dbg("%s - port %d", __func__, port->number); 513 dbg("%s - port %d", __func__, port->number);
503 514
504 baud = tty_get_baud_rate(port->tty); 515 baud = tty_get_baud_rate(tty);
505 516
506 /* 517 /*
507 * FIXME, we should compare the baud request against the 518 * FIXME, we should compare the baud request against the
@@ -510,19 +521,36 @@ static void ir_set_termios (struct usb_serial_port *port, struct ktermios *old_t
510 */ 521 */
511 522
512 switch (baud) { 523 switch (baud) {
513 case 2400: ir_baud = SPEED_2400; break; 524 case 2400:
514 case 9600: ir_baud = SPEED_9600; break; 525 ir_baud = USB_IRDA_BR_2400;
515 case 19200: ir_baud = SPEED_19200; break; 526 break;
516 case 38400: ir_baud = SPEED_38400; break; 527 case 9600:
517 case 57600: ir_baud = SPEED_57600; break; 528 ir_baud = USB_IRDA_BR_9600;
518 case 115200: ir_baud = SPEED_115200; break; 529 break;
519 case 576000: ir_baud = SPEED_576000; break; 530 case 19200:
520 case 1152000: ir_baud = SPEED_1152000; break; 531 ir_baud = USB_IRDA_BR_19200;
521 case 4000000: ir_baud = SPEED_4000000; break; 532 break;
522 break; 533 case 38400:
523 default: 534 ir_baud = USB_IRDA_BR_38400;
524 ir_baud = SPEED_9600; 535 break;
525 baud = 9600; 536 case 57600:
537 ir_baud = USB_IRDA_BR_57600;
538 break;
539 case 115200:
540 ir_baud = USB_IRDA_BR_115200;
541 break;
542 case 576000:
543 ir_baud = USB_IRDA_BR_576000;
544 break;
545 case 1152000:
546 ir_baud = USB_IRDA_BR_1152000;
547 break;
548 case 4000000:
549 ir_baud = USB_IRDA_BR_4000000;
550 break;
551 default:
552 ir_baud = USB_IRDA_BR_9600;
553 baud = 9600;
526 } 554 }
527 555
528 if (xbof == -1) 556 if (xbof == -1)
@@ -538,10 +566,11 @@ static void ir_set_termios (struct usb_serial_port *port, struct ktermios *old_t
538 transfer_buffer = port->write_urb->transfer_buffer; 566 transfer_buffer = port->write_urb->transfer_buffer;
539 *transfer_buffer = ir_xbof | ir_baud; 567 *transfer_buffer = ir_xbof | ir_baud;
540 568
541 usb_fill_bulk_urb ( 569 usb_fill_bulk_urb(
542 port->write_urb, 570 port->write_urb,
543 port->serial->dev, 571 port->serial->dev,
544 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress), 572 usb_sndbulkpipe(port->serial->dev,
573 port->bulk_out_endpointAddress),
545 port->write_urb->transfer_buffer, 574 port->write_urb->transfer_buffer,
546 1, 575 1,
547 ir_write_bulk_callback, 576 ir_write_bulk_callback,
@@ -549,38 +578,44 @@ static void ir_set_termios (struct usb_serial_port *port, struct ktermios *old_t
549 578
550 port->write_urb->transfer_flags = URB_ZERO_PACKET; 579 port->write_urb->transfer_flags = URB_ZERO_PACKET;
551 580
552 result = usb_submit_urb (port->write_urb, GFP_KERNEL); 581 result = usb_submit_urb(port->write_urb, GFP_KERNEL);
553 if (result) 582 if (result)
554 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __func__, result); 583 dev_err(&port->dev,
584 "%s - failed submitting write urb, error %d\n",
585 __func__, result);
555 586
556 /* Only speed changes are supported */ 587 /* Only speed changes are supported */
557 tty_termios_copy_hw(port->tty->termios, old_termios); 588 tty_termios_copy_hw(tty->termios, old_termios);
558 tty_encode_baud_rate(port->tty, baud, baud); 589 tty_encode_baud_rate(tty, baud, baud);
559} 590}
560 591
561 592static int __init ir_init(void)
562static int __init ir_init (void)
563{ 593{
564 int retval; 594 int retval;
595
565 retval = usb_serial_register(&ir_device); 596 retval = usb_serial_register(&ir_device);
566 if (retval) 597 if (retval)
567 goto failed_usb_serial_register; 598 goto failed_usb_serial_register;
599
568 retval = usb_register(&ir_driver); 600 retval = usb_register(&ir_driver);
569 if (retval) 601 if (retval)
570 goto failed_usb_register; 602 goto failed_usb_register;
603
571 info(DRIVER_DESC " " DRIVER_VERSION); 604 info(DRIVER_DESC " " DRIVER_VERSION);
605
572 return 0; 606 return 0;
607
573failed_usb_register: 608failed_usb_register:
574 usb_serial_deregister(&ir_device); 609 usb_serial_deregister(&ir_device);
610
575failed_usb_serial_register: 611failed_usb_serial_register:
576 return retval; 612 return retval;
577} 613}
578 614
579 615static void __exit ir_exit(void)
580static void __exit ir_exit (void)
581{ 616{
582 usb_deregister (&ir_driver); 617 usb_deregister(&ir_driver);
583 usb_serial_deregister (&ir_device); 618 usb_serial_deregister(&ir_device);
584} 619}
585 620
586 621
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
index a01e987c7d32..ddff37fa6339 100644
--- a/drivers/usb/serial/iuu_phoenix.c
+++ b/drivers/usb/serial/iuu_phoenix.c
@@ -144,9 +144,10 @@ static void iuu_shutdown(struct usb_serial *serial)
144 } 144 }
145} 145}
146 146
147static int iuu_tiocmset(struct usb_serial_port *port, struct file *file, 147static int iuu_tiocmset(struct tty_struct *tty, struct file *file,
148 unsigned int set, unsigned int clear) 148 unsigned int set, unsigned int clear)
149{ 149{
150 struct usb_serial_port *port = tty->driver_data;
150 struct iuu_private *priv = usb_get_serial_port_data(port); 151 struct iuu_private *priv = usb_get_serial_port_data(port);
151 unsigned long flags; 152 unsigned long flags;
152 153
@@ -171,8 +172,9 @@ static int iuu_tiocmset(struct usb_serial_port *port, struct file *file,
171 * When no card , the reader respond with TIOCM_CD 172 * When no card , the reader respond with TIOCM_CD
172 * This is known as CD autodetect mechanism 173 * This is known as CD autodetect mechanism
173 */ 174 */
174static int iuu_tiocmget(struct usb_serial_port *port, struct file *file) 175static int iuu_tiocmget(struct tty_struct *tty, struct file *file)
175{ 176{
177 struct usb_serial_port *port = tty->driver_data;
176 struct iuu_private *priv = usb_get_serial_port_data(port); 178 struct iuu_private *priv = usb_get_serial_port_data(port);
177 unsigned long flags; 179 unsigned long flags;
178 int rc; 180 int rc;
@@ -316,11 +318,10 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
316 port->bulk_out_endpointAddress), buf, 318 port->bulk_out_endpointAddress), buf,
317 count, &actual, HZ * 1); 319 count, &actual, HZ * 1);
318 320
319 if (status != IUU_OPERATION_OK) { 321 if (status != IUU_OPERATION_OK)
320 dbg("%s - error = %2x", __func__, status); 322 dbg("%s - error = %2x", __func__, status);
321 } else { 323 else
322 dbg("%s - write OK !", __func__); 324 dbg("%s - write OK !", __func__);
323 }
324 return status; 325 return status;
325} 326}
326 327
@@ -340,12 +341,10 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
340 port->bulk_in_endpointAddress), buf, 341 port->bulk_in_endpointAddress), buf,
341 count, &actual, HZ * 1); 342 count, &actual, HZ * 1);
342 343
343 if (status != IUU_OPERATION_OK) { 344 if (status != IUU_OPERATION_OK)
344 dbg("%s - error = %2x", __func__, status); 345 dbg("%s - error = %2x", __func__, status);
345 } else { 346 else
346 dbg("%s - read OK !", __func__); 347 dbg("%s - read OK !", __func__);
347 }
348
349 return status; 348 return status;
350} 349}
351 350
@@ -630,7 +629,7 @@ static void read_buf_callback(struct urb *urb)
630 } 629 }
631 630
632 dbg("%s - %i chars to write", __func__, urb->actual_length); 631 dbg("%s - %i chars to write", __func__, urb->actual_length);
633 tty = port->tty; 632 tty = port->port.tty;
634 if (data == NULL) 633 if (data == NULL)
635 dbg("%s - data is NULL !!!", __func__); 634 dbg("%s - data is NULL !!!", __func__);
636 if (tty && urb->actual_length && data) { 635 if (tty && urb->actual_length && data) {
@@ -752,11 +751,10 @@ static void iuu_uart_read_callback(struct urb *urb)
752 /* if nothing to write call again rxcmd */ 751 /* if nothing to write call again rxcmd */
753 dbg("%s - rxcmd recall", __func__); 752 dbg("%s - rxcmd recall", __func__);
754 iuu_led_activity_off(urb); 753 iuu_led_activity_off(urb);
755 return;
756} 754}
757 755
758static int iuu_uart_write(struct usb_serial_port *port, const u8 *buf, 756static int iuu_uart_write(struct tty_struct *tty, struct usb_serial_port *port,
759 int count) 757 const u8 *buf, int count)
760{ 758{
761 struct iuu_private *priv = usb_get_serial_port_data(port); 759 struct iuu_private *priv = usb_get_serial_port_data(port);
762 unsigned long flags; 760 unsigned long flags;
@@ -769,14 +767,14 @@ static int iuu_uart_write(struct usb_serial_port *port, const u8 *buf,
769 if (priv->writelen > 0) { 767 if (priv->writelen > 0) {
770 /* buffer already filled but not commited */ 768 /* buffer already filled but not commited */
771 spin_unlock_irqrestore(&priv->lock, flags); 769 spin_unlock_irqrestore(&priv->lock, flags);
772 return (0); 770 return 0;
773 } 771 }
774 /* fill the buffer */ 772 /* fill the buffer */
775 memcpy(priv->writebuf, buf, count); 773 memcpy(priv->writebuf, buf, count);
776 priv->writelen = count; 774 priv->writelen = count;
777 spin_unlock_irqrestore(&priv->lock, flags); 775 spin_unlock_irqrestore(&priv->lock, flags);
778 776
779 return (count); 777 return count;
780} 778}
781 779
782static void read_rxcmd_callback(struct urb *urb) 780static void read_rxcmd_callback(struct urb *urb)
@@ -948,7 +946,8 @@ static int set_control_lines(struct usb_device *dev, u8 value)
948 return 0; 946 return 0;
949} 947}
950 948
951static void iuu_close(struct usb_serial_port *port, struct file *filp) 949static void iuu_close(struct tty_struct *tty,
950 struct usb_serial_port *port, struct file *filp)
952{ 951{
953 /* iuu_led (port,255,0,0,0); */ 952 /* iuu_led (port,255,0,0,0); */
954 struct usb_serial *serial; 953 struct usb_serial *serial;
@@ -964,8 +963,8 @@ static void iuu_close(struct usb_serial_port *port, struct file *filp)
964 963
965 iuu_uart_off(port); 964 iuu_uart_off(port);
966 if (serial->dev) { 965 if (serial->dev) {
967 if (port->tty) { 966 if (tty) {
968 c_cflag = port->tty->termios->c_cflag; 967 c_cflag = tty->termios->c_cflag;
969 if (c_cflag & HUPCL) { 968 if (c_cflag & HUPCL) {
970 /* drop DTR and RTS */ 969 /* drop DTR and RTS */
971 priv = usb_get_serial_port_data(port); 970 priv = usb_get_serial_port_data(port);
@@ -989,7 +988,8 @@ static void iuu_close(struct usb_serial_port *port, struct file *filp)
989 } 988 }
990} 989}
991 990
992static int iuu_open(struct usb_serial_port *port, struct file *filp) 991static int iuu_open(struct tty_struct *tty,
992 struct usb_serial_port *port, struct file *filp)
993{ 993{
994 struct usb_serial *serial = port->serial; 994 struct usb_serial *serial = port->serial;
995 u8 *buf; 995 u8 *buf;
@@ -1036,15 +1036,17 @@ static int iuu_open(struct usb_serial_port *port, struct file *filp)
1036 1036
1037 /* set the termios structure */ 1037 /* set the termios structure */
1038 spin_lock_irqsave(&priv->lock, flags); 1038 spin_lock_irqsave(&priv->lock, flags);
1039 if (!priv->termios_initialized) { 1039 if (tty && !priv->termios_initialized) {
1040 *(port->tty->termios) = tty_std_termios; 1040 *(tty->termios) = tty_std_termios;
1041 port->tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 1041 tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600
1042 | TIOCM_CTS | CSTOPB | PARENB; 1042 | TIOCM_CTS | CSTOPB | PARENB;
1043 port->tty->termios->c_lflag = 0; 1043 tty->termios->c_ispeed = 9600;
1044 port->tty->termios->c_oflag = 0; 1044 tty->termios->c_ospeed = 9600;
1045 port->tty->termios->c_iflag = 0; 1045 tty->termios->c_lflag = 0;
1046 tty->termios->c_oflag = 0;
1047 tty->termios->c_iflag = 0;
1046 priv->termios_initialized = 1; 1048 priv->termios_initialized = 1;
1047 port->tty->low_latency = 1; 1049 tty->low_latency = 1;
1048 priv->poll = 0; 1050 priv->poll = 0;
1049 } 1051 }
1050 spin_unlock_irqrestore(&priv->lock, flags); 1052 spin_unlock_irqrestore(&priv->lock, flags);
@@ -1148,7 +1150,7 @@ static int iuu_open(struct usb_serial_port *port, struct file *filp)
1148 if (result) { 1150 if (result) {
1149 dev_err(&port->dev, "%s - failed submitting read urb," 1151 dev_err(&port->dev, "%s - failed submitting read urb,"
1150 " error %d\n", __func__, result); 1152 " error %d\n", __func__, result);
1151 iuu_close(port, NULL); 1153 iuu_close(tty, port, NULL);
1152 return -EPROTO; 1154 return -EPROTO;
1153 } else { 1155 } else {
1154 dbg("%s - rxcmd OK", __func__); 1156 dbg("%s - rxcmd OK", __func__);
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index 11e439b90eac..704716f6f6d3 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -1,29 +1,29 @@
1/* 1/*
2 Keyspan USB to Serial Converter driver 2 Keyspan USB to Serial Converter driver
3 3
4 (C) Copyright (C) 2000-2001 Hugh Blemings <hugh@blemings.org> 4 (C) Copyright (C) 2000-2001 Hugh Blemings <hugh@blemings.org>
5 (C) Copyright (C) 2002 Greg Kroah-Hartman <greg@kroah.com> 5 (C) Copyright (C) 2002 Greg Kroah-Hartman <greg@kroah.com>
6 6
7 This program is free software; you can redistribute it and/or modify 7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 10 (at your option) any later version.
11 11
12 See http://misc.nu/hugh/keyspan.html for more information. 12 See http://misc.nu/hugh/keyspan.html for more information.
13 13
14 Code in this driver inspired by and in a number of places taken 14 Code in this driver inspired by and in a number of places taken
15 from Brian Warner's original Keyspan-PDA driver. 15 from Brian Warner's original Keyspan-PDA driver.
16 16
17 This driver has been put together with the support of Innosys, Inc. 17 This driver has been put together with the support of Innosys, Inc.
18 and Keyspan, Inc the manufacturers of the Keyspan USB-serial products. 18 and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
19 Thanks Guys :) 19 Thanks Guys :)
20 20
21 Thanks to Paulus for miscellaneous tidy ups, some largish chunks 21 Thanks to Paulus for miscellaneous tidy ups, some largish chunks
22 of much nicer and/or completely new code and (perhaps most uniquely) 22 of much nicer and/or completely new code and (perhaps most uniquely)
23 having the patience to sit down and explain why and where he'd changed 23 having the patience to sit down and explain why and where he'd changed
24 stuff. 24 stuff.
25 25
26 Tip 'o the hat to IBM (and previously Linuxcare :) for supporting 26 Tip 'o the hat to IBM (and previously Linuxcare :) for supporting
27 staff in their work on open source projects. 27 staff in their work on open source projects.
28 28
29 Change History 29 Change History
@@ -70,21 +70,21 @@
70 70
71 Thu May 31 11:56:42 PDT 2001 gkh 71 Thu May 31 11:56:42 PDT 2001 gkh
72 switched from using spinlock to a semaphore 72 switched from using spinlock to a semaphore
73 73
74 (04/08/2001) gb 74 (04/08/2001) gb
75 Identify version on module load. 75 Identify version on module load.
76 76
77 (11/01/2000) Adam J. Richter 77 (11/01/2000) Adam J. Richter
78 usb_device_id table support. 78 usb_device_id table support.
79 79
80 Tue Oct 10 23:15:33 EST 2000 Hugh 80 Tue Oct 10 23:15:33 EST 2000 Hugh
81 Merged Paul's changes with my USA-49W mods. Work in progress 81 Merged Paul's changes with my USA-49W mods. Work in progress
82 still... 82 still...
83 83
84 Wed Jul 19 14:00:42 EST 2000 gkh 84 Wed Jul 19 14:00:42 EST 2000 gkh
85 Added module_init and module_exit functions to handle the fact that 85 Added module_init and module_exit functions to handle the fact that
86 this driver is a loadable module now. 86 this driver is a loadable module now.
87 87
88 Tue Jul 18 16:14:52 EST 2000 Hugh 88 Tue Jul 18 16:14:52 EST 2000 Hugh
89 Basic character input/output for USA-19 now mostly works, 89 Basic character input/output for USA-19 now mostly works,
90 fixed at 9600 baud for the moment. 90 fixed at 9600 baud for the moment.
@@ -107,7 +107,7 @@
107#include <linux/spinlock.h> 107#include <linux/spinlock.h>
108#include <linux/firmware.h> 108#include <linux/firmware.h>
109#include <linux/ihex.h> 109#include <linux/ihex.h>
110#include <asm/uaccess.h> 110#include <linux/uaccess.h>
111#include <linux/usb.h> 111#include <linux/usb.h>
112#include <linux/usb/serial.h> 112#include <linux/usb/serial.h>
113#include "keyspan.h" 113#include "keyspan.h"
@@ -132,15 +132,15 @@ struct keyspan_serial_private {
132 struct urb *instat_urb; 132 struct urb *instat_urb;
133 char instat_buf[INSTAT_BUFLEN]; 133 char instat_buf[INSTAT_BUFLEN];
134 134
135 /* added to support 49wg, where data from all 4 ports comes in on 1 EP */ 135 /* added to support 49wg, where data from all 4 ports comes in
136 /* and high-speed supported */ 136 on 1 EP and high-speed supported */
137 struct urb *indat_urb; 137 struct urb *indat_urb;
138 char indat_buf[INDAT49W_BUFLEN]; 138 char indat_buf[INDAT49W_BUFLEN];
139 139
140 /* XXX this one probably will need a lock */ 140 /* XXX this one probably will need a lock */
141 struct urb *glocont_urb; 141 struct urb *glocont_urb;
142 char glocont_buf[GLOCONT_BUFLEN]; 142 char glocont_buf[GLOCONT_BUFLEN];
143 char ctrl_buf[8]; // for EP0 control message 143 char ctrl_buf[8]; /* for EP0 control message */
144}; 144};
145 145
146struct keyspan_port_private { 146struct keyspan_port_private {
@@ -186,19 +186,19 @@ struct keyspan_port_private {
186 int resend_cont; /* need to resend control packet */ 186 int resend_cont; /* need to resend control packet */
187}; 187};
188 188
189
190/* Include Keyspan message headers. All current Keyspan Adapters 189/* Include Keyspan message headers. All current Keyspan Adapters
191 make use of one of five message formats which are referred 190 make use of one of five message formats which are referred
192 to as USA-26, USA-28, USA-49, USA-90, USA-67 by Keyspan and within this driver. */ 191 to as USA-26, USA-28, USA-49, USA-90, USA-67 by Keyspan and
192 within this driver. */
193#include "keyspan_usa26msg.h" 193#include "keyspan_usa26msg.h"
194#include "keyspan_usa28msg.h" 194#include "keyspan_usa28msg.h"
195#include "keyspan_usa49msg.h" 195#include "keyspan_usa49msg.h"
196#include "keyspan_usa90msg.h" 196#include "keyspan_usa90msg.h"
197#include "keyspan_usa67msg.h" 197#include "keyspan_usa67msg.h"
198 198
199 199
200/* Functions used by new usb-serial code. */ 200/* Functions used by new usb-serial code. */
201static int __init keyspan_init (void) 201static int __init keyspan_init(void)
202{ 202{
203 int retval; 203 int retval;
204 retval = usb_serial_register(&keyspan_pre_device); 204 retval = usb_serial_register(&keyspan_pre_device);
@@ -214,7 +214,7 @@ static int __init keyspan_init (void)
214 if (retval) 214 if (retval)
215 goto failed_4port_device_register; 215 goto failed_4port_device_register;
216 retval = usb_register(&keyspan_driver); 216 retval = usb_register(&keyspan_driver);
217 if (retval) 217 if (retval)
218 goto failed_usb_register; 218 goto failed_usb_register;
219 219
220 info(DRIVER_VERSION ":" DRIVER_DESC); 220 info(DRIVER_VERSION ":" DRIVER_DESC);
@@ -232,35 +232,24 @@ failed_pre_device_register:
232 return retval; 232 return retval;
233} 233}
234 234
235static void __exit keyspan_exit (void) 235static void __exit keyspan_exit(void)
236{ 236{
237 usb_deregister (&keyspan_driver); 237 usb_deregister(&keyspan_driver);
238 usb_serial_deregister (&keyspan_pre_device); 238 usb_serial_deregister(&keyspan_pre_device);
239 usb_serial_deregister (&keyspan_1port_device); 239 usb_serial_deregister(&keyspan_1port_device);
240 usb_serial_deregister (&keyspan_2port_device); 240 usb_serial_deregister(&keyspan_2port_device);
241 usb_serial_deregister (&keyspan_4port_device); 241 usb_serial_deregister(&keyspan_4port_device);
242} 242}
243 243
244module_init(keyspan_init); 244module_init(keyspan_init);
245module_exit(keyspan_exit); 245module_exit(keyspan_exit);
246 246
247static void keyspan_rx_throttle (struct usb_serial_port *port) 247static void keyspan_break_ctl(struct tty_struct *tty, int break_state)
248{
249 dbg("%s - port %d", __func__, port->number);
250}
251
252
253static void keyspan_rx_unthrottle (struct usb_serial_port *port)
254{
255 dbg("%s - port %d", __func__, port->number);
256}
257
258
259static void keyspan_break_ctl (struct usb_serial_port *port, int break_state)
260{ 248{
249 struct usb_serial_port *port = tty->driver_data;
261 struct keyspan_port_private *p_priv; 250 struct keyspan_port_private *p_priv;
262 251
263 dbg("%s", __func__); 252 dbg("%s", __func__);
264 253
265 p_priv = usb_get_serial_port_data(port); 254 p_priv = usb_get_serial_port_data(port);
266 255
@@ -273,14 +262,13 @@ static void keyspan_break_ctl (struct usb_serial_port *port, int break_state)
273} 262}
274 263
275 264
276static void keyspan_set_termios (struct usb_serial_port *port, 265static void keyspan_set_termios(struct tty_struct *tty,
277 struct ktermios *old_termios) 266 struct usb_serial_port *port, struct ktermios *old_termios)
278{ 267{
279 int baud_rate, device_port; 268 int baud_rate, device_port;
280 struct keyspan_port_private *p_priv; 269 struct keyspan_port_private *p_priv;
281 const struct keyspan_device_details *d_details; 270 const struct keyspan_device_details *d_details;
282 unsigned int cflag; 271 unsigned int cflag;
283 struct tty_struct *tty = port->tty;
284 272
285 dbg("%s", __func__); 273 dbg("%s", __func__);
286 274
@@ -292,7 +280,7 @@ static void keyspan_set_termios (struct usb_serial_port *port,
292 /* Baud rate calculation takes baud rate as an integer 280 /* Baud rate calculation takes baud rate as an integer
293 so other rates can be generated if desired. */ 281 so other rates can be generated if desired. */
294 baud_rate = tty_get_baud_rate(tty); 282 baud_rate = tty_get_baud_rate(tty);
295 /* If no match or invalid, don't change */ 283 /* If no match or invalid, don't change */
296 if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk, 284 if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
297 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) { 285 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
298 /* FIXME - more to do here to ensure rate changes cleanly */ 286 /* FIXME - more to do here to ensure rate changes cleanly */
@@ -312,35 +300,32 @@ static void keyspan_set_termios (struct usb_serial_port *port,
312 keyspan_send_setup(port, 0); 300 keyspan_send_setup(port, 0);
313} 301}
314 302
315static int keyspan_tiocmget(struct usb_serial_port *port, struct file *file) 303static int keyspan_tiocmget(struct tty_struct *tty, struct file *file)
316{ 304{
305 struct usb_serial_port *port = tty->driver_data;
306 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
317 unsigned int value; 307 unsigned int value;
318 struct keyspan_port_private *p_priv;
319 308
320 p_priv = usb_get_serial_port_data(port);
321
322 value = ((p_priv->rts_state) ? TIOCM_RTS : 0) | 309 value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
323 ((p_priv->dtr_state) ? TIOCM_DTR : 0) | 310 ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
324 ((p_priv->cts_state) ? TIOCM_CTS : 0) | 311 ((p_priv->cts_state) ? TIOCM_CTS : 0) |
325 ((p_priv->dsr_state) ? TIOCM_DSR : 0) | 312 ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
326 ((p_priv->dcd_state) ? TIOCM_CAR : 0) | 313 ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
327 ((p_priv->ri_state) ? TIOCM_RNG : 0); 314 ((p_priv->ri_state) ? TIOCM_RNG : 0);
328 315
329 return value; 316 return value;
330} 317}
331 318
332static int keyspan_tiocmset(struct usb_serial_port *port, struct file *file, 319static int keyspan_tiocmset(struct tty_struct *tty, struct file *file,
333 unsigned int set, unsigned int clear) 320 unsigned int set, unsigned int clear)
334{ 321{
335 struct keyspan_port_private *p_priv; 322 struct usb_serial_port *port = tty->driver_data;
323 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
336 324
337 p_priv = usb_get_serial_port_data(port);
338
339 if (set & TIOCM_RTS) 325 if (set & TIOCM_RTS)
340 p_priv->rts_state = 1; 326 p_priv->rts_state = 1;
341 if (set & TIOCM_DTR) 327 if (set & TIOCM_DTR)
342 p_priv->dtr_state = 1; 328 p_priv->dtr_state = 1;
343
344 if (clear & TIOCM_RTS) 329 if (clear & TIOCM_RTS)
345 p_priv->rts_state = 0; 330 p_priv->rts_state = 0;
346 if (clear & TIOCM_DTR) 331 if (clear & TIOCM_DTR)
@@ -349,35 +334,29 @@ static int keyspan_tiocmset(struct usb_serial_port *port, struct file *file,
349 return 0; 334 return 0;
350} 335}
351 336
352static int keyspan_ioctl(struct usb_serial_port *port, struct file *file, 337/* Write function is similar for the four protocols used
353 unsigned int cmd, unsigned long arg) 338 with only a minor change for usa90 (usa19hs) required */
354{ 339static int keyspan_write(struct tty_struct *tty,
355 return -ENOIOCTLCMD; 340 struct usb_serial_port *port, const unsigned char *buf, int count)
356}
357
358 /* Write function is similar for the four protocols used
359 with only a minor change for usa90 (usa19hs) required */
360static int keyspan_write(struct usb_serial_port *port,
361 const unsigned char *buf, int count)
362{ 341{
363 struct keyspan_port_private *p_priv; 342 struct keyspan_port_private *p_priv;
364 const struct keyspan_device_details *d_details; 343 const struct keyspan_device_details *d_details;
365 int flip; 344 int flip;
366 int left, todo; 345 int left, todo;
367 struct urb *this_urb; 346 struct urb *this_urb;
368 int err, maxDataLen, dataOffset; 347 int err, maxDataLen, dataOffset;
369 348
370 p_priv = usb_get_serial_port_data(port); 349 p_priv = usb_get_serial_port_data(port);
371 d_details = p_priv->device_details; 350 d_details = p_priv->device_details;
372 351
373 if (d_details->msg_format == msg_usa90) { 352 if (d_details->msg_format == msg_usa90) {
374 maxDataLen = 64; 353 maxDataLen = 64;
375 dataOffset = 0; 354 dataOffset = 0;
376 } else { 355 } else {
377 maxDataLen = 63; 356 maxDataLen = 63;
378 dataOffset = 1; 357 dataOffset = 1;
379 } 358 }
380 359
381 dbg("%s - for port %d (%d chars), flip=%d", 360 dbg("%s - for port %d (%d chars), flip=%d",
382 __func__, port->number, count, p_priv->out_flip); 361 __func__, port->number, count, p_priv->out_flip);
383 362
@@ -387,37 +366,40 @@ static int keyspan_write(struct usb_serial_port *port,
387 todo = maxDataLen; 366 todo = maxDataLen;
388 367
389 flip = p_priv->out_flip; 368 flip = p_priv->out_flip;
390 369
391 /* Check we have a valid urb/endpoint before we use it... */ 370 /* Check we have a valid urb/endpoint before we use it... */
392 if ((this_urb = p_priv->out_urbs[flip]) == NULL) { 371 this_urb = p_priv->out_urbs[flip];
372 if (this_urb == NULL) {
393 /* no bulk out, so return 0 bytes written */ 373 /* no bulk out, so return 0 bytes written */
394 dbg("%s - no output urb :(", __func__); 374 dbg("%s - no output urb :(", __func__);
395 return count; 375 return count;
396 } 376 }
397 377
398 dbg("%s - endpoint %d flip %d", __func__, usb_pipeendpoint(this_urb->pipe), flip); 378 dbg("%s - endpoint %d flip %d",
379 __func__, usb_pipeendpoint(this_urb->pipe), flip);
399 380
400 if (this_urb->status == -EINPROGRESS) { 381 if (this_urb->status == -EINPROGRESS) {
401 if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ)) 382 if (time_before(jiffies,
383 p_priv->tx_start_time[flip] + 10 * HZ))
402 break; 384 break;
403 usb_unlink_urb(this_urb); 385 usb_unlink_urb(this_urb);
404 break; 386 break;
405 } 387 }
406 388
407 /* First byte in buffer is "last flag" (except for usa19hx) - unused so 389 /* First byte in buffer is "last flag" (except for usa19hx)
408 for now so set to zero */ 390 - unused so for now so set to zero */
409 ((char *)this_urb->transfer_buffer)[0] = 0; 391 ((char *)this_urb->transfer_buffer)[0] = 0;
410 392
411 memcpy (this_urb->transfer_buffer + dataOffset, buf, todo); 393 memcpy(this_urb->transfer_buffer + dataOffset, buf, todo);
412 buf += todo; 394 buf += todo;
413 395
414 /* send the data out the bulk port */ 396 /* send the data out the bulk port */
415 this_urb->transfer_buffer_length = todo + dataOffset; 397 this_urb->transfer_buffer_length = todo + dataOffset;
416 398
417 this_urb->dev = port->serial->dev; 399 this_urb->dev = port->serial->dev;
418 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { 400 err = usb_submit_urb(this_urb, GFP_ATOMIC);
401 if (err != 0)
419 dbg("usb_submit_urb(write bulk) failed (%d)", err); 402 dbg("usb_submit_urb(write bulk) failed (%d)", err);
420 }
421 p_priv->tx_start_time[flip] = jiffies; 403 p_priv->tx_start_time[flip] = jiffies;
422 404
423 /* Flip for next time if usa26 or usa28 interface 405 /* Flip for next time if usa26 or usa28 interface
@@ -437,7 +419,7 @@ static void usa26_indat_callback(struct urb *urb)
437 unsigned char *data = urb->transfer_buffer; 419 unsigned char *data = urb->transfer_buffer;
438 int status = urb->status; 420 int status = urb->status;
439 421
440 dbg ("%s", __func__); 422 dbg("%s", __func__);
441 423
442 endpoint = usb_pipeendpoint(urb->pipe); 424 endpoint = usb_pipeendpoint(urb->pipe);
443 425
@@ -448,17 +430,18 @@ static void usa26_indat_callback(struct urb *urb)
448 } 430 }
449 431
450 port = urb->context; 432 port = urb->context;
451 tty = port->tty; 433 tty = port->port.tty;
452 if (tty && urb->actual_length) { 434 if (tty && urb->actual_length) {
453 /* 0x80 bit is error flag */ 435 /* 0x80 bit is error flag */
454 if ((data[0] & 0x80) == 0) { 436 if ((data[0] & 0x80) == 0) {
455 /* no errors on individual bytes, only possible overrun err*/ 437 /* no errors on individual bytes, only
438 possible overrun err */
456 if (data[0] & RXERROR_OVERRUN) 439 if (data[0] & RXERROR_OVERRUN)
457 err = TTY_OVERRUN; 440 err = TTY_OVERRUN;
458 else err = 0; 441 else
459 for (i = 1; i < urb->actual_length ; ++i) { 442 err = 0;
443 for (i = 1; i < urb->actual_length ; ++i)
460 tty_insert_flip_char(tty, data[i], err); 444 tty_insert_flip_char(tty, data[i], err);
461 }
462 } else { 445 } else {
463 /* some bytes had errors, every byte has status */ 446 /* some bytes had errors, every byte has status */
464 dbg("%s - RX error!!!!", __func__); 447 dbg("%s - RX error!!!!", __func__);
@@ -476,17 +459,19 @@ static void usa26_indat_callback(struct urb *urb)
476 } 459 }
477 tty_flip_buffer_push(tty); 460 tty_flip_buffer_push(tty);
478 } 461 }
479 462
480 /* Resubmit urb so we continue receiving */ 463 /* Resubmit urb so we continue receiving */
481 urb->dev = port->serial->dev; 464 urb->dev = port->serial->dev;
482 if (port->open_count) 465 if (port->port.count) {
483 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 466 err = usb_submit_urb(urb, GFP_ATOMIC);
484 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 467 if (err != 0)
485 } 468 dbg("%s - resubmit read urb failed. (%d)",
469 __func__, err);
470 }
486 return; 471 return;
487} 472}
488 473
489 /* Outdat handling is common for all devices */ 474/* Outdat handling is common for all devices */
490static void usa2x_outdat_callback(struct urb *urb) 475static void usa2x_outdat_callback(struct urb *urb)
491{ 476{
492 struct usb_serial_port *port; 477 struct usb_serial_port *port;
@@ -494,16 +479,16 @@ static void usa2x_outdat_callback(struct urb *urb)
494 479
495 port = urb->context; 480 port = urb->context;
496 p_priv = usb_get_serial_port_data(port); 481 p_priv = usb_get_serial_port_data(port);
497 dbg ("%s - urb %d", __func__, urb == p_priv->out_urbs[1]); 482 dbg("%s - urb %d", __func__, urb == p_priv->out_urbs[1]);
498 483
499 if (port->open_count) 484 if (port->port.count)
500 usb_serial_port_softint(port); 485 usb_serial_port_softint(port);
501} 486}
502 487
503static void usa26_inack_callback(struct urb *urb) 488static void usa26_inack_callback(struct urb *urb)
504{ 489{
505 dbg ("%s", __func__); 490 dbg("%s", __func__);
506 491
507} 492}
508 493
509static void usa26_outcont_callback(struct urb *urb) 494static void usa26_outcont_callback(struct urb *urb)
@@ -515,8 +500,9 @@ static void usa26_outcont_callback(struct urb *urb)
515 p_priv = usb_get_serial_port_data(port); 500 p_priv = usb_get_serial_port_data(port);
516 501
517 if (p_priv->resend_cont) { 502 if (p_priv->resend_cont) {
518 dbg ("%s - sending setup", __func__); 503 dbg("%s - sending setup", __func__);
519 keyspan_usa26_send_setup(port->serial, port, p_priv->resend_cont - 1); 504 keyspan_usa26_send_setup(port->serial, port,
505 p_priv->resend_cont - 1);
520 } 506 }
521} 507}
522 508
@@ -552,14 +538,14 @@ static void usa26_instat_callback(struct urb *urb)
552 /* Now do something useful with the data */ 538 /* Now do something useful with the data */
553 539
554 540
555 /* Check port number from message and retrieve private data */ 541 /* Check port number from message and retrieve private data */
556 if (msg->port >= serial->num_ports) { 542 if (msg->port >= serial->num_ports) {
557 dbg ("%s - Unexpected port number %d", __func__, msg->port); 543 dbg("%s - Unexpected port number %d", __func__, msg->port);
558 goto exit; 544 goto exit;
559 } 545 }
560 port = serial->port[msg->port]; 546 port = serial->port[msg->port];
561 p_priv = usb_get_serial_port_data(port); 547 p_priv = usb_get_serial_port_data(port);
562 548
563 /* Update handshaking pin state information */ 549 /* Update handshaking pin state information */
564 old_dcd_state = p_priv->dcd_state; 550 old_dcd_state = p_priv->dcd_state;
565 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0); 551 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
@@ -567,39 +553,38 @@ static void usa26_instat_callback(struct urb *urb)
567 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0); 553 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
568 p_priv->ri_state = ((msg->ri) ? 1 : 0); 554 p_priv->ri_state = ((msg->ri) ? 1 : 0);
569 555
570 if (port->tty && !C_CLOCAL(port->tty) 556 if (port->port.tty && !C_CLOCAL(port->port.tty)
571 && old_dcd_state != p_priv->dcd_state) { 557 && old_dcd_state != p_priv->dcd_state) {
572 if (old_dcd_state) 558 if (old_dcd_state)
573 tty_hangup(port->tty); 559 tty_hangup(port->port.tty);
574 /* else */ 560 /* else */
575 /* wake_up_interruptible(&p_priv->open_wait); */ 561 /* wake_up_interruptible(&p_priv->open_wait); */
576 } 562 }
577 563
578 /* Resubmit urb so we continue receiving */ 564 /* Resubmit urb so we continue receiving */
579 urb->dev = serial->dev; 565 urb->dev = serial->dev;
580 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 566 err = usb_submit_urb(urb, GFP_ATOMIC);
567 if (err != 0)
581 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 568 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
582 }
583exit: ; 569exit: ;
584} 570}
585 571
586static void usa26_glocont_callback(struct urb *urb) 572static void usa26_glocont_callback(struct urb *urb)
587{ 573{
588 dbg ("%s", __func__); 574 dbg("%s", __func__);
589
590} 575}
591 576
592 577
593static void usa28_indat_callback(struct urb *urb) 578static void usa28_indat_callback(struct urb *urb)
594{ 579{
595 int i, err; 580 int err;
596 struct usb_serial_port *port; 581 struct usb_serial_port *port;
597 struct tty_struct *tty; 582 struct tty_struct *tty;
598 unsigned char *data; 583 unsigned char *data;
599 struct keyspan_port_private *p_priv; 584 struct keyspan_port_private *p_priv;
600 int status = urb->status; 585 int status = urb->status;
601 586
602 dbg ("%s", __func__); 587 dbg("%s", __func__);
603 588
604 port = urb->context; 589 port = urb->context;
605 p_priv = usb_get_serial_port_data(port); 590 p_priv = usb_get_serial_port_data(port);
@@ -619,20 +604,20 @@ static void usa28_indat_callback(struct urb *urb)
619 p_priv = usb_get_serial_port_data(port); 604 p_priv = usb_get_serial_port_data(port);
620 data = urb->transfer_buffer; 605 data = urb->transfer_buffer;
621 606
622 tty = port->tty; 607 tty = port->port.tty;
623 if (urb->actual_length) { 608 if (urb->actual_length) {
624 for (i = 0; i < urb->actual_length ; ++i) { 609 tty_insert_flip_string(tty, data, urb->actual_length);
625 tty_insert_flip_char(tty, data[i], 0);
626 }
627 tty_flip_buffer_push(tty); 610 tty_flip_buffer_push(tty);
628 } 611 }
629 612
630 /* Resubmit urb so we continue receiving */ 613 /* Resubmit urb so we continue receiving */
631 urb->dev = port->serial->dev; 614 urb->dev = port->serial->dev;
632 if (port->open_count) 615 if (port->port.count) {
633 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 616 err = usb_submit_urb(urb, GFP_ATOMIC);
634 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 617 if (err != 0)
635 } 618 dbg("%s - resubmit read urb failed. (%d)",
619 __func__, err);
620 }
636 p_priv->in_flip ^= 1; 621 p_priv->in_flip ^= 1;
637 622
638 urb = p_priv->in_urbs[p_priv->in_flip]; 623 urb = p_priv->in_urbs[p_priv->in_flip];
@@ -641,7 +626,7 @@ static void usa28_indat_callback(struct urb *urb)
641 626
642static void usa28_inack_callback(struct urb *urb) 627static void usa28_inack_callback(struct urb *urb)
643{ 628{
644 dbg ("%s", __func__); 629 dbg("%s", __func__);
645} 630}
646 631
647static void usa28_outcont_callback(struct urb *urb) 632static void usa28_outcont_callback(struct urb *urb)
@@ -653,8 +638,9 @@ static void usa28_outcont_callback(struct urb *urb)
653 p_priv = usb_get_serial_port_data(port); 638 p_priv = usb_get_serial_port_data(port);
654 639
655 if (p_priv->resend_cont) { 640 if (p_priv->resend_cont) {
656 dbg ("%s - sending setup", __func__); 641 dbg("%s - sending setup", __func__);
657 keyspan_usa28_send_setup(port->serial, port, p_priv->resend_cont - 1); 642 keyspan_usa28_send_setup(port->serial, port,
643 p_priv->resend_cont - 1);
658 } 644 }
659} 645}
660 646
@@ -684,19 +670,18 @@ static void usa28_instat_callback(struct urb *urb)
684 /*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __func__ 670 /*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __func__
685 data[0], data[1], data[2], data[3], data[4], data[5], 671 data[0], data[1], data[2], data[3], data[4], data[5],
686 data[6], data[7], data[8], data[9], data[10], data[11]);*/ 672 data[6], data[7], data[8], data[9], data[10], data[11]);*/
687
688 /* Now do something useful with the data */
689 msg = (struct keyspan_usa28_portStatusMessage *)data;
690 673
674 /* Now do something useful with the data */
675 msg = (struct keyspan_usa28_portStatusMessage *)data;
691 676
692 /* Check port number from message and retrieve private data */ 677 /* Check port number from message and retrieve private data */
693 if (msg->port >= serial->num_ports) { 678 if (msg->port >= serial->num_ports) {
694 dbg ("%s - Unexpected port number %d", __func__, msg->port); 679 dbg("%s - Unexpected port number %d", __func__, msg->port);
695 goto exit; 680 goto exit;
696 } 681 }
697 port = serial->port[msg->port]; 682 port = serial->port[msg->port];
698 p_priv = usb_get_serial_port_data(port); 683 p_priv = usb_get_serial_port_data(port);
699 684
700 /* Update handshaking pin state information */ 685 /* Update handshaking pin state information */
701 old_dcd_state = p_priv->dcd_state; 686 old_dcd_state = p_priv->dcd_state;
702 p_priv->cts_state = ((msg->cts) ? 1 : 0); 687 p_priv->cts_state = ((msg->cts) ? 1 : 0);
@@ -704,25 +689,25 @@ static void usa28_instat_callback(struct urb *urb)
704 p_priv->dcd_state = ((msg->dcd) ? 1 : 0); 689 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
705 p_priv->ri_state = ((msg->ri) ? 1 : 0); 690 p_priv->ri_state = ((msg->ri) ? 1 : 0);
706 691
707 if (port->tty && !C_CLOCAL(port->tty) 692 if (port->port.tty && !C_CLOCAL(port->port.tty)
708 && old_dcd_state != p_priv->dcd_state) { 693 && old_dcd_state != p_priv->dcd_state) {
709 if (old_dcd_state) 694 if (old_dcd_state)
710 tty_hangup(port->tty); 695 tty_hangup(port->port.tty);
711 /* else */ 696 /* else */
712 /* wake_up_interruptible(&p_priv->open_wait); */ 697 /* wake_up_interruptible(&p_priv->open_wait); */
713 } 698 }
714 699
715 /* Resubmit urb so we continue receiving */ 700 /* Resubmit urb so we continue receiving */
716 urb->dev = serial->dev; 701 urb->dev = serial->dev;
717 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 702 err = usb_submit_urb(urb, GFP_ATOMIC);
703 if (err != 0)
718 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 704 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
719 }
720exit: ; 705exit: ;
721} 706}
722 707
723static void usa28_glocont_callback(struct urb *urb) 708static void usa28_glocont_callback(struct urb *urb)
724{ 709{
725 dbg ("%s", __func__); 710 dbg("%s", __func__);
726} 711}
727 712
728 713
@@ -733,7 +718,7 @@ static void usa49_glocont_callback(struct urb *urb)
733 struct keyspan_port_private *p_priv; 718 struct keyspan_port_private *p_priv;
734 int i; 719 int i;
735 720
736 dbg ("%s", __func__); 721 dbg("%s", __func__);
737 722
738 serial = urb->context; 723 serial = urb->context;
739 for (i = 0; i < serial->num_ports; ++i) { 724 for (i = 0; i < serial->num_ports; ++i) {
@@ -741,8 +726,9 @@ static void usa49_glocont_callback(struct urb *urb)
741 p_priv = usb_get_serial_port_data(port); 726 p_priv = usb_get_serial_port_data(port);
742 727
743 if (p_priv->resend_cont) { 728 if (p_priv->resend_cont) {
744 dbg ("%s - sending setup", __func__); 729 dbg("%s - sending setup", __func__);
745 keyspan_usa49_send_setup(serial, port, p_priv->resend_cont - 1); 730 keyspan_usa49_send_setup(serial, port,
731 p_priv->resend_cont - 1);
746 break; 732 break;
747 } 733 }
748 } 734 }
@@ -761,7 +747,7 @@ static void usa49_instat_callback(struct urb *urb)
761 int old_dcd_state; 747 int old_dcd_state;
762 int status = urb->status; 748 int status = urb->status;
763 749
764 dbg ("%s", __func__); 750 dbg("%s", __func__);
765 751
766 serial = urb->context; 752 serial = urb->context;
767 753
@@ -770,7 +756,8 @@ static void usa49_instat_callback(struct urb *urb)
770 return; 756 return;
771 } 757 }
772 758
773 if (urb->actual_length != sizeof(struct keyspan_usa49_portStatusMessage)) { 759 if (urb->actual_length !=
760 sizeof(struct keyspan_usa49_portStatusMessage)) {
774 dbg("%s - bad length %d", __func__, urb->actual_length); 761 dbg("%s - bad length %d", __func__, urb->actual_length);
775 goto exit; 762 goto exit;
776 } 763 }
@@ -778,18 +765,19 @@ static void usa49_instat_callback(struct urb *urb)
778 /*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __func__, 765 /*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __func__,
779 data[0], data[1], data[2], data[3], data[4], data[5], 766 data[0], data[1], data[2], data[3], data[4], data[5],
780 data[6], data[7], data[8], data[9], data[10]);*/ 767 data[6], data[7], data[8], data[9], data[10]);*/
781 768
782 /* Now do something useful with the data */ 769 /* Now do something useful with the data */
783 msg = (struct keyspan_usa49_portStatusMessage *)data; 770 msg = (struct keyspan_usa49_portStatusMessage *)data;
784 771
785 /* Check port number from message and retrieve private data */ 772 /* Check port number from message and retrieve private data */
786 if (msg->portNumber >= serial->num_ports) { 773 if (msg->portNumber >= serial->num_ports) {
787 dbg ("%s - Unexpected port number %d", __func__, msg->portNumber); 774 dbg("%s - Unexpected port number %d",
775 __func__, msg->portNumber);
788 goto exit; 776 goto exit;
789 } 777 }
790 port = serial->port[msg->portNumber]; 778 port = serial->port[msg->portNumber];
791 p_priv = usb_get_serial_port_data(port); 779 p_priv = usb_get_serial_port_data(port);
792 780
793 /* Update handshaking pin state information */ 781 /* Update handshaking pin state information */
794 old_dcd_state = p_priv->dcd_state; 782 old_dcd_state = p_priv->dcd_state;
795 p_priv->cts_state = ((msg->cts) ? 1 : 0); 783 p_priv->cts_state = ((msg->cts) ? 1 : 0);
@@ -797,26 +785,26 @@ static void usa49_instat_callback(struct urb *urb)
797 p_priv->dcd_state = ((msg->dcd) ? 1 : 0); 785 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
798 p_priv->ri_state = ((msg->ri) ? 1 : 0); 786 p_priv->ri_state = ((msg->ri) ? 1 : 0);
799 787
800 if (port->tty && !C_CLOCAL(port->tty) 788 if (port->port.tty && !C_CLOCAL(port->port.tty)
801 && old_dcd_state != p_priv->dcd_state) { 789 && old_dcd_state != p_priv->dcd_state) {
802 if (old_dcd_state) 790 if (old_dcd_state)
803 tty_hangup(port->tty); 791 tty_hangup(port->port.tty);
804 /* else */ 792 /* else */
805 /* wake_up_interruptible(&p_priv->open_wait); */ 793 /* wake_up_interruptible(&p_priv->open_wait); */
806 } 794 }
807 795
808 /* Resubmit urb so we continue receiving */ 796 /* Resubmit urb so we continue receiving */
809 urb->dev = serial->dev; 797 urb->dev = serial->dev;
810 798
811 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 799 err = usb_submit_urb(urb, GFP_ATOMIC);
800 if (err != 0)
812 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 801 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
813 }
814exit: ; 802exit: ;
815} 803}
816 804
817static void usa49_inack_callback(struct urb *urb) 805static void usa49_inack_callback(struct urb *urb)
818{ 806{
819 dbg ("%s", __func__); 807 dbg("%s", __func__);
820} 808}
821 809
822static void usa49_indat_callback(struct urb *urb) 810static void usa49_indat_callback(struct urb *urb)
@@ -828,7 +816,7 @@ static void usa49_indat_callback(struct urb *urb)
828 unsigned char *data = urb->transfer_buffer; 816 unsigned char *data = urb->transfer_buffer;
829 int status = urb->status; 817 int status = urb->status;
830 818
831 dbg ("%s", __func__); 819 dbg("%s", __func__);
832 820
833 endpoint = usb_pipeendpoint(urb->pipe); 821 endpoint = usb_pipeendpoint(urb->pipe);
834 822
@@ -839,14 +827,13 @@ static void usa49_indat_callback(struct urb *urb)
839 } 827 }
840 828
841 port = urb->context; 829 port = urb->context;
842 tty = port->tty; 830 tty = port->port.tty;
843 if (tty && urb->actual_length) { 831 if (tty && urb->actual_length) {
844 /* 0x80 bit is error flag */ 832 /* 0x80 bit is error flag */
845 if ((data[0] & 0x80) == 0) { 833 if ((data[0] & 0x80) == 0) {
846 /* no error on any byte */ 834 /* no error on any byte */
847 for (i = 1; i < urb->actual_length ; ++i) { 835 tty_insert_flip_string(tty, data + 1,
848 tty_insert_flip_char(tty, data[i], 0); 836 urb->actual_length - 1);
849 }
850 } else { 837 } else {
851 /* some bytes had errors, every byte has status */ 838 /* some bytes had errors, every byte has status */
852 for (i = 0; i + 1 < urb->actual_length; i += 2) { 839 for (i = 0; i + 1 < urb->actual_length; i += 2) {
@@ -863,13 +850,15 @@ static void usa49_indat_callback(struct urb *urb)
863 } 850 }
864 tty_flip_buffer_push(tty); 851 tty_flip_buffer_push(tty);
865 } 852 }
866 853
867 /* Resubmit urb so we continue receiving */ 854 /* Resubmit urb so we continue receiving */
868 urb->dev = port->serial->dev; 855 urb->dev = port->serial->dev;
869 if (port->open_count) 856 if (port->port.count) {
870 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 857 err = usb_submit_urb(urb, GFP_ATOMIC);
871 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 858 if (err != 0)
872 } 859 dbg("%s - resubmit read urb failed. (%d)",
860 __func__, err);
861 }
873} 862}
874 863
875static void usa49wg_indat_callback(struct urb *urb) 864static void usa49wg_indat_callback(struct urb *urb)
@@ -881,7 +870,7 @@ static void usa49wg_indat_callback(struct urb *urb)
881 unsigned char *data = urb->transfer_buffer; 870 unsigned char *data = urb->transfer_buffer;
882 int status = urb->status; 871 int status = urb->status;
883 872
884 dbg ("%s", __func__); 873 dbg("%s", __func__);
885 874
886 serial = urb->context; 875 serial = urb->context;
887 876
@@ -899,12 +888,12 @@ static void usa49wg_indat_callback(struct urb *urb)
899 888
900 /* Check port number from message*/ 889 /* Check port number from message*/
901 if (data[i] >= serial->num_ports) { 890 if (data[i] >= serial->num_ports) {
902 dbg ("%s - Unexpected port number %d", 891 dbg("%s - Unexpected port number %d",
903 __func__, data[i]); 892 __func__, data[i]);
904 return; 893 return;
905 } 894 }
906 port = serial->port[data[i++]]; 895 port = serial->port[data[i++]];
907 tty = port->tty; 896 tty = port->port.tty;
908 len = data[i++]; 897 len = data[i++];
909 898
910 /* 0x80 bit is error flag */ 899 /* 0x80 bit is error flag */
@@ -912,7 +901,7 @@ static void usa49wg_indat_callback(struct urb *urb)
912 /* no error on any byte */ 901 /* no error on any byte */
913 i++; 902 i++;
914 for (x = 1; x < len ; ++x) 903 for (x = 1; x < len ; ++x)
915 if (port->open_count) 904 if (port->port.count)
916 tty_insert_flip_char(tty, 905 tty_insert_flip_char(tty,
917 data[i++], 0); 906 data[i++], 0);
918 else 907 else
@@ -930,13 +919,13 @@ static void usa49wg_indat_callback(struct urb *urb)
930 if (stat & RXERROR_PARITY) 919 if (stat & RXERROR_PARITY)
931 flag |= TTY_PARITY; 920 flag |= TTY_PARITY;
932 /* XXX should handle break (0x10) */ 921 /* XXX should handle break (0x10) */
933 if (port->open_count) 922 if (port->port.count)
934 tty_insert_flip_char(tty, 923 tty_insert_flip_char(tty,
935 data[i+1], flag); 924 data[i+1], flag);
936 i += 2; 925 i += 2;
937 } 926 }
938 } 927 }
939 if (port->open_count) 928 if (port->port.count)
940 tty_flip_buffer_push(tty); 929 tty_flip_buffer_push(tty);
941 } 930 }
942 } 931 }
@@ -952,7 +941,7 @@ static void usa49wg_indat_callback(struct urb *urb)
952/* not used, usa-49 doesn't have per-port control endpoints */ 941/* not used, usa-49 doesn't have per-port control endpoints */
953static void usa49_outcont_callback(struct urb *urb) 942static void usa49_outcont_callback(struct urb *urb)
954{ 943{
955 dbg ("%s", __func__); 944 dbg("%s", __func__);
956} 945}
957 946
958static void usa90_indat_callback(struct urb *urb) 947static void usa90_indat_callback(struct urb *urb)
@@ -965,7 +954,7 @@ static void usa90_indat_callback(struct urb *urb)
965 unsigned char *data = urb->transfer_buffer; 954 unsigned char *data = urb->transfer_buffer;
966 int status = urb->status; 955 int status = urb->status;
967 956
968 dbg ("%s", __func__); 957 dbg("%s", __func__);
969 958
970 endpoint = usb_pipeendpoint(urb->pipe); 959 endpoint = usb_pipeendpoint(urb->pipe);
971 960
@@ -978,29 +967,26 @@ static void usa90_indat_callback(struct urb *urb)
978 port = urb->context; 967 port = urb->context;
979 p_priv = usb_get_serial_port_data(port); 968 p_priv = usb_get_serial_port_data(port);
980 969
981 tty = port->tty; 970 tty = port->port.tty;
982 if (urb->actual_length) { 971 if (urb->actual_length) {
983
984 /* if current mode is DMA, looks like usa28 format 972 /* if current mode is DMA, looks like usa28 format
985 otherwise looks like usa26 data format */ 973 otherwise looks like usa26 data format */
986 974
987 if (p_priv->baud > 57600) { 975 if (p_priv->baud > 57600)
988 for (i = 0; i < urb->actual_length ; ++i) 976 tty_insert_flip_string(tty, data, urb->actual_length);
989 tty_insert_flip_char(tty, data[i], 0);
990 }
991 else { 977 else {
992
993 /* 0x80 bit is error flag */ 978 /* 0x80 bit is error flag */
994 if ((data[0] & 0x80) == 0) { 979 if ((data[0] & 0x80) == 0) {
995 /* no errors on individual bytes, only possible overrun err*/ 980 /* no errors on individual bytes, only
981 possible overrun err*/
996 if (data[0] & RXERROR_OVERRUN) 982 if (data[0] & RXERROR_OVERRUN)
997 err = TTY_OVERRUN; 983 err = TTY_OVERRUN;
998 else err = 0; 984 else
999 for (i = 1; i < urb->actual_length ; ++i) 985 err = 0;
1000 tty_insert_flip_char(tty, data[i], err); 986 for (i = 1; i < urb->actual_length ; ++i)
1001 987 tty_insert_flip_char(tty, data[i],
1002 } 988 err);
1003 else { 989 } else {
1004 /* some bytes had errors, every byte has status */ 990 /* some bytes had errors, every byte has status */
1005 dbg("%s - RX error!!!!", __func__); 991 dbg("%s - RX error!!!!", __func__);
1006 for (i = 0; i + 1 < urb->actual_length; i += 2) { 992 for (i = 0; i + 1 < urb->actual_length; i += 2) {
@@ -1012,19 +998,22 @@ static void usa90_indat_callback(struct urb *urb)
1012 if (stat & RXERROR_PARITY) 998 if (stat & RXERROR_PARITY)
1013 flag |= TTY_PARITY; 999 flag |= TTY_PARITY;
1014 /* XXX should handle break (0x10) */ 1000 /* XXX should handle break (0x10) */
1015 tty_insert_flip_char(tty, data[i+1], flag); 1001 tty_insert_flip_char(tty, data[i+1],
1002 flag);
1016 } 1003 }
1017 } 1004 }
1018 } 1005 }
1019 tty_flip_buffer_push(tty); 1006 tty_flip_buffer_push(tty);
1020 } 1007 }
1021 1008
1022 /* Resubmit urb so we continue receiving */ 1009 /* Resubmit urb so we continue receiving */
1023 urb->dev = port->serial->dev; 1010 urb->dev = port->serial->dev;
1024 if (port->open_count) 1011 if (port->port.count) {
1025 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 1012 err = usb_submit_urb(urb, GFP_ATOMIC);
1026 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 1013 if (err != 0)
1027 } 1014 dbg("%s - resubmit read urb failed. (%d)",
1015 __func__, err);
1016 }
1028 return; 1017 return;
1029} 1018}
1030 1019
@@ -1056,7 +1045,7 @@ static void usa90_instat_callback(struct urb *urb)
1056 1045
1057 port = serial->port[0]; 1046 port = serial->port[0];
1058 p_priv = usb_get_serial_port_data(port); 1047 p_priv = usb_get_serial_port_data(port);
1059 1048
1060 /* Update handshaking pin state information */ 1049 /* Update handshaking pin state information */
1061 old_dcd_state = p_priv->dcd_state; 1050 old_dcd_state = p_priv->dcd_state;
1062 p_priv->cts_state = ((msg->cts) ? 1 : 0); 1051 p_priv->cts_state = ((msg->cts) ? 1 : 0);
@@ -1064,19 +1053,19 @@ static void usa90_instat_callback(struct urb *urb)
1064 p_priv->dcd_state = ((msg->dcd) ? 1 : 0); 1053 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1065 p_priv->ri_state = ((msg->ri) ? 1 : 0); 1054 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1066 1055
1067 if (port->tty && !C_CLOCAL(port->tty) 1056 if (port->port.tty && !C_CLOCAL(port->port.tty)
1068 && old_dcd_state != p_priv->dcd_state) { 1057 && old_dcd_state != p_priv->dcd_state) {
1069 if (old_dcd_state) 1058 if (old_dcd_state)
1070 tty_hangup(port->tty); 1059 tty_hangup(port->port.tty);
1071 /* else */ 1060 /* else */
1072 /* wake_up_interruptible(&p_priv->open_wait); */ 1061 /* wake_up_interruptible(&p_priv->open_wait); */
1073 } 1062 }
1074 1063
1075 /* Resubmit urb so we continue receiving */ 1064 /* Resubmit urb so we continue receiving */
1076 urb->dev = serial->dev; 1065 urb->dev = serial->dev;
1077 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { 1066 err = usb_submit_urb(urb, GFP_ATOMIC);
1067 if (err != 0)
1078 dbg("%s - resubmit read urb failed. (%d)", __func__, err); 1068 dbg("%s - resubmit read urb failed. (%d)", __func__, err);
1079 }
1080exit: 1069exit:
1081 ; 1070 ;
1082} 1071}
@@ -1090,8 +1079,9 @@ static void usa90_outcont_callback(struct urb *urb)
1090 p_priv = usb_get_serial_port_data(port); 1079 p_priv = usb_get_serial_port_data(port);
1091 1080
1092 if (p_priv->resend_cont) { 1081 if (p_priv->resend_cont) {
1093 dbg ("%s - sending setup", __func__); 1082 dbg("%s - sending setup", __func__);
1094 keyspan_usa90_send_setup(port->serial, port, p_priv->resend_cont - 1); 1083 keyspan_usa90_send_setup(port->serial, port,
1084 p_priv->resend_cont - 1);
1095 } 1085 }
1096} 1086}
1097 1087
@@ -1107,7 +1097,7 @@ static void usa67_instat_callback(struct urb *urb)
1107 int old_dcd_state; 1097 int old_dcd_state;
1108 int status = urb->status; 1098 int status = urb->status;
1109 1099
1110 dbg ("%s", __func__); 1100 dbg("%s", __func__);
1111 1101
1112 serial = urb->context; 1102 serial = urb->context;
1113 1103
@@ -1116,7 +1106,8 @@ static void usa67_instat_callback(struct urb *urb)
1116 return; 1106 return;
1117 } 1107 }
1118 1108
1119 if (urb->actual_length != sizeof(struct keyspan_usa67_portStatusMessage)) { 1109 if (urb->actual_length !=
1110 sizeof(struct keyspan_usa67_portStatusMessage)) {
1120 dbg("%s - bad length %d", __func__, urb->actual_length); 1111 dbg("%s - bad length %d", __func__, urb->actual_length);
1121 return; 1112 return;
1122 } 1113 }
@@ -1127,7 +1118,7 @@ static void usa67_instat_callback(struct urb *urb)
1127 1118
1128 /* Check port number from message and retrieve private data */ 1119 /* Check port number from message and retrieve private data */
1129 if (msg->port >= serial->num_ports) { 1120 if (msg->port >= serial->num_ports) {
1130 dbg ("%s - Unexpected port number %d", __func__, msg->port); 1121 dbg("%s - Unexpected port number %d", __func__, msg->port);
1131 return; 1122 return;
1132 } 1123 }
1133 1124
@@ -1139,10 +1130,10 @@ static void usa67_instat_callback(struct urb *urb)
1139 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0); 1130 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
1140 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0); 1131 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
1141 1132
1142 if (port->tty && !C_CLOCAL(port->tty) 1133 if (port->port.tty && !C_CLOCAL(port->port.tty)
1143 && old_dcd_state != p_priv->dcd_state) { 1134 && old_dcd_state != p_priv->dcd_state) {
1144 if (old_dcd_state) 1135 if (old_dcd_state)
1145 tty_hangup(port->tty); 1136 tty_hangup(port->port.tty);
1146 /* else */ 1137 /* else */
1147 /* wake_up_interruptible(&p_priv->open_wait); */ 1138 /* wake_up_interruptible(&p_priv->open_wait); */
1148 } 1139 }
@@ -1161,7 +1152,7 @@ static void usa67_glocont_callback(struct urb *urb)
1161 struct keyspan_port_private *p_priv; 1152 struct keyspan_port_private *p_priv;
1162 int i; 1153 int i;
1163 1154
1164 dbg ("%s", __func__); 1155 dbg("%s", __func__);
1165 1156
1166 serial = urb->context; 1157 serial = urb->context;
1167 for (i = 0; i < serial->num_ports; ++i) { 1158 for (i = 0; i < serial->num_ports; ++i) {
@@ -1169,7 +1160,7 @@ static void usa67_glocont_callback(struct urb *urb)
1169 p_priv = usb_get_serial_port_data(port); 1160 p_priv = usb_get_serial_port_data(port);
1170 1161
1171 if (p_priv->resend_cont) { 1162 if (p_priv->resend_cont) {
1172 dbg ("%s - sending setup", __func__); 1163 dbg("%s - sending setup", __func__);
1173 keyspan_usa67_send_setup(serial, port, 1164 keyspan_usa67_send_setup(serial, port,
1174 p_priv->resend_cont - 1); 1165 p_priv->resend_cont - 1);
1175 break; 1166 break;
@@ -1177,8 +1168,9 @@ static void usa67_glocont_callback(struct urb *urb)
1177 } 1168 }
1178} 1169}
1179 1170
1180static int keyspan_write_room (struct usb_serial_port *port) 1171static int keyspan_write_room(struct tty_struct *tty)
1181{ 1172{
1173 struct usb_serial_port *port = tty->driver_data;
1182 struct keyspan_port_private *p_priv; 1174 struct keyspan_port_private *p_priv;
1183 const struct keyspan_device_details *d_details; 1175 const struct keyspan_device_details *d_details;
1184 int flip; 1176 int flip;
@@ -1191,32 +1183,30 @@ static int keyspan_write_room (struct usb_serial_port *port)
1191 1183
1192 /* FIXME: locking */ 1184 /* FIXME: locking */
1193 if (d_details->msg_format == msg_usa90) 1185 if (d_details->msg_format == msg_usa90)
1194 data_len = 64; 1186 data_len = 64;
1195 else 1187 else
1196 data_len = 63; 1188 data_len = 63;
1197 1189
1198 flip = p_priv->out_flip; 1190 flip = p_priv->out_flip;
1199 1191
1200 /* Check both endpoints to see if any are available. */ 1192 /* Check both endpoints to see if any are available. */
1201 if ((this_urb = p_priv->out_urbs[flip]) != NULL) { 1193 this_urb = p_priv->out_urbs[flip];
1194 if (this_urb != NULL) {
1202 if (this_urb->status != -EINPROGRESS) 1195 if (this_urb->status != -EINPROGRESS)
1203 return (data_len); 1196 return data_len;
1204 flip = (flip + 1) & d_details->outdat_endp_flip; 1197 flip = (flip + 1) & d_details->outdat_endp_flip;
1205 if ((this_urb = p_priv->out_urbs[flip]) != NULL) 1198 this_urb = p_priv->out_urbs[flip];
1199 if (this_urb != NULL) {
1206 if (this_urb->status != -EINPROGRESS) 1200 if (this_urb->status != -EINPROGRESS)
1207 return (data_len); 1201 return data_len;
1202 }
1208 } 1203 }
1209 return 0; 1204 return 0;
1210} 1205}
1211 1206
1212 1207
1213static int keyspan_chars_in_buffer (struct usb_serial_port *port) 1208static int keyspan_open(struct tty_struct *tty,
1214{ 1209 struct usb_serial_port *port, struct file *filp)
1215 return 0;
1216}
1217
1218
1219static int keyspan_open (struct usb_serial_port *port, struct file *filp)
1220{ 1210{
1221 struct keyspan_port_private *p_priv; 1211 struct keyspan_port_private *p_priv;
1222 struct keyspan_serial_private *s_priv; 1212 struct keyspan_serial_private *s_priv;
@@ -1225,7 +1215,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
1225 int i, err; 1215 int i, err;
1226 int baud_rate, device_port; 1216 int baud_rate, device_port;
1227 struct urb *urb; 1217 struct urb *urb;
1228 unsigned int cflag; 1218 unsigned int cflag = 0;
1229 1219
1230 s_priv = usb_get_serial_data(serial); 1220 s_priv = usb_get_serial_data(serial);
1231 p_priv = usb_get_serial_port_data(port); 1221 p_priv = usb_get_serial_port_data(port);
@@ -1247,50 +1237,53 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
1247 1237
1248 /* Reset low level data toggle and start reading from endpoints */ 1238 /* Reset low level data toggle and start reading from endpoints */
1249 for (i = 0; i < 2; i++) { 1239 for (i = 0; i < 2; i++) {
1250 if ((urb = p_priv->in_urbs[i]) == NULL) 1240 urb = p_priv->in_urbs[i];
1241 if (urb == NULL)
1251 continue; 1242 continue;
1252 urb->dev = serial->dev; 1243 urb->dev = serial->dev;
1253 1244
1254 /* make sure endpoint data toggle is synchronized with the device */ 1245 /* make sure endpoint data toggle is synchronized
1255 1246 with the device */
1256 usb_clear_halt(urb->dev, urb->pipe); 1247 usb_clear_halt(urb->dev, urb->pipe);
1257 1248 err = usb_submit_urb(urb, GFP_KERNEL);
1258 if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { 1249 if (err != 0)
1259 dbg("%s - submit urb %d failed (%d)", __func__, i, err); 1250 dbg("%s - submit urb %d failed (%d)",
1260 } 1251 __func__, i, err);
1261 } 1252 }
1262 1253
1263 /* Reset low level data toggle on out endpoints */ 1254 /* Reset low level data toggle on out endpoints */
1264 for (i = 0; i < 2; i++) { 1255 for (i = 0; i < 2; i++) {
1265 if ((urb = p_priv->out_urbs[i]) == NULL) 1256 urb = p_priv->out_urbs[i];
1257 if (urb == NULL)
1266 continue; 1258 continue;
1267 urb->dev = serial->dev; 1259 urb->dev = serial->dev;
1268 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ 1260 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
1261 usb_pipeout(urb->pipe), 0); */
1269 } 1262 }
1270 1263
1271 /* get the terminal config for the setup message now so we don't 1264 /* get the terminal config for the setup message now so we don't
1272 * need to send 2 of them */ 1265 * need to send 2 of them */
1273 1266
1274 cflag = port->tty->termios->c_cflag;
1275 device_port = port->number - port->serial->minor; 1267 device_port = port->number - port->serial->minor;
1276 1268 if (tty) {
1277 /* Baud rate calculation takes baud rate as an integer 1269 cflag = tty->termios->c_cflag;
1278 so other rates can be generated if desired. */ 1270 /* Baud rate calculation takes baud rate as an integer
1279 baud_rate = tty_get_baud_rate(port->tty); 1271 so other rates can be generated if desired. */
1280 /* If no match or invalid, leave as default */ 1272 baud_rate = tty_get_baud_rate(tty);
1281 if (baud_rate >= 0 1273 /* If no match or invalid, leave as default */
1282 && d_details->calculate_baud_rate(baud_rate, d_details->baudclk, 1274 if (baud_rate >= 0
1283 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) { 1275 && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
1284 p_priv->baud = baud_rate; 1276 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1277 p_priv->baud = baud_rate;
1278 }
1285 } 1279 }
1286
1287 /* set CTS/RTS handshake etc. */ 1280 /* set CTS/RTS handshake etc. */
1288 p_priv->cflag = cflag; 1281 p_priv->cflag = cflag;
1289 p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none; 1282 p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
1290 1283
1291 keyspan_send_setup(port, 1); 1284 keyspan_send_setup(port, 1);
1292 //mdelay(100); 1285 /* mdelay(100); */
1293 //keyspan_set_termios(port, NULL); 1286 /* keyspan_set_termios(port, NULL); */
1294 1287
1295 return 0; 1288 return 0;
1296} 1289}
@@ -1301,7 +1294,8 @@ static inline void stop_urb(struct urb *urb)
1301 usb_kill_urb(urb); 1294 usb_kill_urb(urb);
1302} 1295}
1303 1296
1304static void keyspan_close(struct usb_serial_port *port, struct file *filp) 1297static void keyspan_close(struct tty_struct *tty,
1298 struct usb_serial_port *port, struct file *filp)
1305{ 1299{
1306 int i; 1300 int i;
1307 struct usb_serial *serial = port->serial; 1301 struct usb_serial *serial = port->serial;
@@ -1311,15 +1305,15 @@ static void keyspan_close(struct usb_serial_port *port, struct file *filp)
1311 dbg("%s", __func__); 1305 dbg("%s", __func__);
1312 s_priv = usb_get_serial_data(serial); 1306 s_priv = usb_get_serial_data(serial);
1313 p_priv = usb_get_serial_port_data(port); 1307 p_priv = usb_get_serial_port_data(port);
1314 1308
1315 p_priv->rts_state = 0; 1309 p_priv->rts_state = 0;
1316 p_priv->dtr_state = 0; 1310 p_priv->dtr_state = 0;
1317 1311
1318 if (serial->dev) { 1312 if (serial->dev) {
1319 keyspan_send_setup(port, 2); 1313 keyspan_send_setup(port, 2);
1320 /* pilot-xfer seems to work best with this delay */ 1314 /* pilot-xfer seems to work best with this delay */
1321 mdelay(100); 1315 mdelay(100);
1322 // keyspan_set_termios(port, NULL); 1316 /* keyspan_set_termios(port, NULL); */
1323 } 1317 }
1324 1318
1325 /*while (p_priv->outcont_urb->status == -EINPROGRESS) { 1319 /*while (p_priv->outcont_urb->status == -EINPROGRESS) {
@@ -1338,11 +1332,11 @@ static void keyspan_close(struct usb_serial_port *port, struct file *filp)
1338 stop_urb(p_priv->out_urbs[i]); 1332 stop_urb(p_priv->out_urbs[i]);
1339 } 1333 }
1340 } 1334 }
1341 port->tty = NULL; 1335 port->port.tty = NULL;
1342} 1336}
1343 1337
1344 /* download the firmware to a pre-renumeration device */ 1338/* download the firmware to a pre-renumeration device */
1345static int keyspan_fake_startup (struct usb_serial *serial) 1339static int keyspan_fake_startup(struct usb_serial *serial)
1346{ 1340{
1347 int response; 1341 int response;
1348 const struct ihex_binrec *record; 1342 const struct ihex_binrec *record;
@@ -1352,10 +1346,11 @@ static int keyspan_fake_startup (struct usb_serial *serial)
1352 dbg("Keyspan startup version %04x product %04x", 1346 dbg("Keyspan startup version %04x product %04x",
1353 le16_to_cpu(serial->dev->descriptor.bcdDevice), 1347 le16_to_cpu(serial->dev->descriptor.bcdDevice),
1354 le16_to_cpu(serial->dev->descriptor.idProduct)); 1348 le16_to_cpu(serial->dev->descriptor.idProduct));
1355 1349
1356 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000) != 0x8000) { 1350 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)
1351 != 0x8000) {
1357 dbg("Firmware already loaded. Quitting."); 1352 dbg("Firmware already loaded. Quitting.");
1358 return(1); 1353 return 1;
1359 } 1354 }
1360 1355
1361 /* Select firmware image on the basis of idProduct */ 1356 /* Select firmware image on the basis of idProduct */
@@ -1379,11 +1374,11 @@ static int keyspan_fake_startup (struct usb_serial *serial)
1379 case keyspan_usa19_pre_product_id: 1374 case keyspan_usa19_pre_product_id:
1380 fw_name = "keyspan/usa19.fw"; 1375 fw_name = "keyspan/usa19.fw";
1381 break; 1376 break;
1382 1377
1383 case keyspan_usa19qi_pre_product_id: 1378 case keyspan_usa19qi_pre_product_id:
1384 fw_name = "keyspan/usa19qi.fw"; 1379 fw_name = "keyspan/usa19qi.fw";
1385 break; 1380 break;
1386 1381
1387 case keyspan_mpr_pre_product_id: 1382 case keyspan_mpr_pre_product_id:
1388 fw_name = "keyspan/mpr.fw"; 1383 fw_name = "keyspan/mpr.fw";
1389 break; 1384 break;
@@ -1391,15 +1386,15 @@ static int keyspan_fake_startup (struct usb_serial *serial)
1391 case keyspan_usa19qw_pre_product_id: 1386 case keyspan_usa19qw_pre_product_id:
1392 fw_name = "keyspan/usa19qw.fw"; 1387 fw_name = "keyspan/usa19qw.fw";
1393 break; 1388 break;
1394 1389
1395 case keyspan_usa18x_pre_product_id: 1390 case keyspan_usa18x_pre_product_id:
1396 fw_name = "keyspan/usa18x.fw"; 1391 fw_name = "keyspan/usa18x.fw";
1397 break; 1392 break;
1398 1393
1399 case keyspan_usa19w_pre_product_id: 1394 case keyspan_usa19w_pre_product_id:
1400 fw_name = "keyspan/usa19w.fw"; 1395 fw_name = "keyspan/usa19w.fw";
1401 break; 1396 break;
1402 1397
1403 case keyspan_usa49w_pre_product_id: 1398 case keyspan_usa49w_pre_product_id:
1404 fw_name = "keyspan/usa49w.fw"; 1399 fw_name = "keyspan/usa49w.fw";
1405 break; 1400 break;
@@ -1431,8 +1426,7 @@ static int keyspan_fake_startup (struct usb_serial *serial)
1431 (unsigned char *)record->data, 1426 (unsigned char *)record->data,
1432 be16_to_cpu(record->len), 0xa0); 1427 be16_to_cpu(record->len), 0xa0);
1433 if (response < 0) { 1428 if (response < 0) {
1434 dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan" 1429 dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan firmware (%d %04X %p %d)\n",
1435 "firmware (%d %04X %p %d)\n",
1436 response, be32_to_cpu(record->addr), 1430 response, be32_to_cpu(record->addr),
1437 record->data, be16_to_cpu(record->len)); 1431 record->data, be16_to_cpu(record->len));
1438 break; 1432 break;
@@ -1445,7 +1439,7 @@ static int keyspan_fake_startup (struct usb_serial *serial)
1445 response = ezusb_set_reset(serial, 0); 1439 response = ezusb_set_reset(serial, 0);
1446 1440
1447 /* we don't want this device to have a driver assigned to it. */ 1441 /* we don't want this device to have a driver assigned to it. */
1448 return (1); 1442 return 1;
1449} 1443}
1450 1444
1451/* Helper functions used by keyspan_setup_urbs */ 1445/* Helper functions used by keyspan_setup_urbs */
@@ -1467,7 +1461,7 @@ static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *se
1467 return NULL; 1461 return NULL;
1468} 1462}
1469 1463
1470static struct urb *keyspan_setup_urb (struct usb_serial *serial, int endpoint, 1464static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
1471 int dir, void *ctx, char *buf, int len, 1465 int dir, void *ctx, char *buf, int len,
1472 void (*callback)(struct urb *)) 1466 void (*callback)(struct urb *))
1473{ 1467{
@@ -1478,10 +1472,10 @@ static struct urb *keyspan_setup_urb (struct usb_serial *serial, int endpoint,
1478 if (endpoint == -1) 1472 if (endpoint == -1)
1479 return NULL; /* endpoint not needed */ 1473 return NULL; /* endpoint not needed */
1480 1474
1481 dbg ("%s - alloc for endpoint %d.", __func__, endpoint); 1475 dbg("%s - alloc for endpoint %d.", __func__, endpoint);
1482 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ 1476 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
1483 if (urb == NULL) { 1477 if (urb == NULL) {
1484 dbg ("%s - alloc for endpoint %d failed.", __func__, endpoint); 1478 dbg("%s - alloc for endpoint %d failed.", __func__, endpoint);
1485 return NULL; 1479 return NULL;
1486 } 1480 }
1487 1481
@@ -1554,7 +1548,7 @@ static struct callbacks {
1554 }, { 1548 }, {
1555 /* msg_usa90 callbacks */ 1549 /* msg_usa90 callbacks */
1556 .instat_callback = usa90_instat_callback, 1550 .instat_callback = usa90_instat_callback,
1557 .glocont_callback = usa28_glocont_callback, 1551 .glocont_callback = usa28_glocont_callback,
1558 .indat_callback = usa90_indat_callback, 1552 .indat_callback = usa90_indat_callback,
1559 .outdat_callback = usa2x_outdat_callback, 1553 .outdat_callback = usa2x_outdat_callback,
1560 .inack_callback = usa28_inack_callback, 1554 .inack_callback = usa28_inack_callback,
@@ -1582,16 +1576,16 @@ static void keyspan_setup_urbs(struct usb_serial *serial)
1582 struct callbacks *cback; 1576 struct callbacks *cback;
1583 int endp; 1577 int endp;
1584 1578
1585 dbg ("%s", __func__); 1579 dbg("%s", __func__);
1586 1580
1587 s_priv = usb_get_serial_data(serial); 1581 s_priv = usb_get_serial_data(serial);
1588 d_details = s_priv->device_details; 1582 d_details = s_priv->device_details;
1589 1583
1590 /* Setup values for the various callback routines */ 1584 /* Setup values for the various callback routines */
1591 cback = &keyspan_callbacks[d_details->msg_format]; 1585 cback = &keyspan_callbacks[d_details->msg_format];
1592 1586
1593 /* Allocate and set up urbs for each one that is in use, 1587 /* Allocate and set up urbs for each one that is in use,
1594 starting with instat endpoints */ 1588 starting with instat endpoints */
1595 s_priv->instat_urb = keyspan_setup_urb 1589 s_priv->instat_urb = keyspan_setup_urb
1596 (serial, d_details->instat_endpoint, USB_DIR_IN, 1590 (serial, d_details->instat_endpoint, USB_DIR_IN,
1597 serial, s_priv->instat_buf, INSTAT_BUFLEN, 1591 serial, s_priv->instat_buf, INSTAT_BUFLEN,
@@ -1607,8 +1601,8 @@ static void keyspan_setup_urbs(struct usb_serial *serial)
1607 serial, s_priv->glocont_buf, GLOCONT_BUFLEN, 1601 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1608 cback->glocont_callback); 1602 cback->glocont_callback);
1609 1603
1610 /* Setup endpoints for each port specific thing */ 1604 /* Setup endpoints for each port specific thing */
1611 for (i = 0; i < d_details->num_ports; i ++) { 1605 for (i = 0; i < d_details->num_ports; i++) {
1612 port = serial->port[i]; 1606 port = serial->port[i];
1613 p_priv = usb_get_serial_port_data(port); 1607 p_priv = usb_get_serial_port_data(port);
1614 1608
@@ -1644,8 +1638,7 @@ static void keyspan_setup_urbs(struct usb_serial *serial)
1644 (serial, d_details->outcont_endpoints[i], USB_DIR_OUT, 1638 (serial, d_details->outcont_endpoints[i], USB_DIR_OUT,
1645 port, p_priv->outcont_buffer, 64, 1639 port, p_priv->outcont_buffer, 64,
1646 cback->outcont_callback); 1640 cback->outcont_callback);
1647 } 1641 }
1648
1649} 1642}
1650 1643
1651/* usa19 function doesn't require prescaler */ 1644/* usa19 function doesn't require prescaler */
@@ -1653,46 +1646,39 @@ static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1653 u8 *rate_low, u8 *prescaler, int portnum) 1646 u8 *rate_low, u8 *prescaler, int portnum)
1654{ 1647{
1655 u32 b16, /* baud rate times 16 (actual rate used internally) */ 1648 u32 b16, /* baud rate times 16 (actual rate used internally) */
1656 div, /* divisor */ 1649 div, /* divisor */
1657 cnt; /* inverse of divisor (programmed into 8051) */ 1650 cnt; /* inverse of divisor (programmed into 8051) */
1658
1659 dbg ("%s - %d.", __func__, baud_rate);
1660
1661 /* prevent divide by zero... */
1662 if( (b16 = (baud_rate * 16L)) == 0) {
1663 return (KEYSPAN_INVALID_BAUD_RATE);
1664 }
1665 1651
1666 /* Any "standard" rate over 57k6 is marginal on the USA-19 1652 dbg("%s - %d.", __func__, baud_rate);
1667 as we run out of divisor resolution. */ 1653
1668 if (baud_rate > 57600) { 1654 /* prevent divide by zero... */
1669 return (KEYSPAN_INVALID_BAUD_RATE); 1655 b16 = baud_rate * 16L;
1670 } 1656 if (b16 == 0)
1671 1657 return KEYSPAN_INVALID_BAUD_RATE;
1672 /* calculate the divisor and the counter (its inverse) */ 1658 /* Any "standard" rate over 57k6 is marginal on the USA-19
1673 if( (div = (baudclk / b16)) == 0) { 1659 as we run out of divisor resolution. */
1674 return (KEYSPAN_INVALID_BAUD_RATE); 1660 if (baud_rate > 57600)
1675 } 1661 return KEYSPAN_INVALID_BAUD_RATE;
1676 else { 1662
1663 /* calculate the divisor and the counter (its inverse) */
1664 div = baudclk / b16;
1665 if (div == 0)
1666 return KEYSPAN_INVALID_BAUD_RATE;
1667 else
1677 cnt = 0 - div; 1668 cnt = 0 - div;
1678 }
1679 1669
1680 if(div > 0xffff) { 1670 if (div > 0xffff)
1681 return (KEYSPAN_INVALID_BAUD_RATE); 1671 return KEYSPAN_INVALID_BAUD_RATE;
1682 }
1683 1672
1684 /* return the counter values if non-null */ 1673 /* return the counter values if non-null */
1685 if (rate_low) { 1674 if (rate_low)
1686 *rate_low = (u8) (cnt & 0xff); 1675 *rate_low = (u8) (cnt & 0xff);
1687 } 1676 if (rate_hi)
1688 if (rate_hi) {
1689 *rate_hi = (u8) ((cnt >> 8) & 0xff); 1677 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1690 } 1678 if (rate_low && rate_hi)
1691 if (rate_low && rate_hi) { 1679 dbg("%s - %d %02x %02x.",
1692 dbg ("%s - %d %02x %02x.", __func__, baud_rate, *rate_hi, *rate_low); 1680 __func__, baud_rate, *rate_hi, *rate_low);
1693 } 1681 return KEYSPAN_BAUD_RATE_OK;
1694
1695 return (KEYSPAN_BAUD_RATE_OK);
1696} 1682}
1697 1683
1698/* usa19hs function doesn't require prescaler */ 1684/* usa19hs function doesn't require prescaler */
@@ -1700,34 +1686,35 @@ static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1700 u8 *rate_low, u8 *prescaler, int portnum) 1686 u8 *rate_low, u8 *prescaler, int portnum)
1701{ 1687{
1702 u32 b16, /* baud rate times 16 (actual rate used internally) */ 1688 u32 b16, /* baud rate times 16 (actual rate used internally) */
1703 div; /* divisor */ 1689 div; /* divisor */
1704
1705 dbg ("%s - %d.", __func__, baud_rate);
1706 1690
1707 /* prevent divide by zero... */ 1691 dbg("%s - %d.", __func__, baud_rate);
1708 if( (b16 = (baud_rate * 16L)) == 0)
1709 return (KEYSPAN_INVALID_BAUD_RATE);
1710
1711 1692
1693 /* prevent divide by zero... */
1694 b16 = baud_rate * 16L;
1695 if (b16 == 0)
1696 return KEYSPAN_INVALID_BAUD_RATE;
1712 1697
1713 /* calculate the divisor */ 1698 /* calculate the divisor */
1714 if( (div = (baudclk / b16)) == 0) 1699 div = baudclk / b16;
1715 return (KEYSPAN_INVALID_BAUD_RATE); 1700 if (div == 0)
1701 return KEYSPAN_INVALID_BAUD_RATE;
1716 1702
1717 if(div > 0xffff) 1703 if (div > 0xffff)
1718 return (KEYSPAN_INVALID_BAUD_RATE); 1704 return KEYSPAN_INVALID_BAUD_RATE;
1719 1705
1720 /* return the counter values if non-null */ 1706 /* return the counter values if non-null */
1721 if (rate_low) 1707 if (rate_low)
1722 *rate_low = (u8) (div & 0xff); 1708 *rate_low = (u8) (div & 0xff);
1723 1709
1724 if (rate_hi) 1710 if (rate_hi)
1725 *rate_hi = (u8) ((div >> 8) & 0xff); 1711 *rate_hi = (u8) ((div >> 8) & 0xff);
1726 1712
1727 if (rate_low && rate_hi) 1713 if (rate_low && rate_hi)
1728 dbg ("%s - %d %02x %02x.", __func__, baud_rate, *rate_hi, *rate_low); 1714 dbg("%s - %d %02x %02x.",
1729 1715 __func__, baud_rate, *rate_hi, *rate_low);
1730 return (KEYSPAN_BAUD_RATE_OK); 1716
1717 return KEYSPAN_BAUD_RATE_OK;
1731} 1718}
1732 1719
1733static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, 1720static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
@@ -1735,64 +1722,61 @@ static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1735{ 1722{
1736 u32 b16, /* baud rate times 16 (actual rate used internally) */ 1723 u32 b16, /* baud rate times 16 (actual rate used internally) */
1737 clk, /* clock with 13/8 prescaler */ 1724 clk, /* clock with 13/8 prescaler */
1738 div, /* divisor using 13/8 prescaler */ 1725 div, /* divisor using 13/8 prescaler */
1739 res, /* resulting baud rate using 13/8 prescaler */ 1726 res, /* resulting baud rate using 13/8 prescaler */
1740 diff, /* error using 13/8 prescaler */ 1727 diff, /* error using 13/8 prescaler */
1741 smallest_diff; 1728 smallest_diff;
1742 u8 best_prescaler; 1729 u8 best_prescaler;
1743 int i; 1730 int i;
1744 1731
1745 dbg ("%s - %d.", __func__, baud_rate); 1732 dbg("%s - %d.", __func__, baud_rate);
1746 1733
1747 /* prevent divide by zero */ 1734 /* prevent divide by zero */
1748 if( (b16 = baud_rate * 16L) == 0) { 1735 b16 = baud_rate * 16L;
1749 return (KEYSPAN_INVALID_BAUD_RATE); 1736 if (b16 == 0)
1750 } 1737 return KEYSPAN_INVALID_BAUD_RATE;
1751 1738
1752 /* Calculate prescaler by trying them all and looking 1739 /* Calculate prescaler by trying them all and looking
1753 for best fit */ 1740 for best fit */
1754 1741
1755 /* start with largest possible difference */ 1742 /* start with largest possible difference */
1756 smallest_diff = 0xffffffff; 1743 smallest_diff = 0xffffffff;
1757 1744
1758 /* 0 is an invalid prescaler, used as a flag */ 1745 /* 0 is an invalid prescaler, used as a flag */
1759 best_prescaler = 0; 1746 best_prescaler = 0;
1760 1747
1761 for(i = 8; i <= 0xff; ++i) { 1748 for (i = 8; i <= 0xff; ++i) {
1762 clk = (baudclk * 8) / (u32) i; 1749 clk = (baudclk * 8) / (u32) i;
1763 1750
1764 if( (div = clk / b16) == 0) { 1751 div = clk / b16;
1752 if (div == 0)
1765 continue; 1753 continue;
1766 }
1767 1754
1768 res = clk / div; 1755 res = clk / div;
1769 diff= (res > b16) ? (res-b16) : (b16-res); 1756 diff = (res > b16) ? (res-b16) : (b16-res);
1770 1757
1771 if(diff < smallest_diff) { 1758 if (diff < smallest_diff) {
1772 best_prescaler = i; 1759 best_prescaler = i;
1773 smallest_diff = diff; 1760 smallest_diff = diff;
1774 } 1761 }
1775 } 1762 }
1776 1763
1777 if(best_prescaler == 0) { 1764 if (best_prescaler == 0)
1778 return (KEYSPAN_INVALID_BAUD_RATE); 1765 return KEYSPAN_INVALID_BAUD_RATE;
1779 }
1780 1766
1781 clk = (baudclk * 8) / (u32) best_prescaler; 1767 clk = (baudclk * 8) / (u32) best_prescaler;
1782 div = clk / b16; 1768 div = clk / b16;
1783 1769
1784 /* return the divisor and prescaler if non-null */ 1770 /* return the divisor and prescaler if non-null */
1785 if (rate_low) { 1771 if (rate_low)
1786 *rate_low = (u8) (div & 0xff); 1772 *rate_low = (u8) (div & 0xff);
1787 } 1773 if (rate_hi)
1788 if (rate_hi) {
1789 *rate_hi = (u8) ((div >> 8) & 0xff); 1774 *rate_hi = (u8) ((div >> 8) & 0xff);
1790 }
1791 if (prescaler) { 1775 if (prescaler) {
1792 *prescaler = best_prescaler; 1776 *prescaler = best_prescaler;
1793 /* dbg("%s - %d %d", __func__, *prescaler, div); */ 1777 /* dbg("%s - %d %d", __func__, *prescaler, div); */
1794 } 1778 }
1795 return (KEYSPAN_BAUD_RATE_OK); 1779 return KEYSPAN_BAUD_RATE_OK;
1796} 1780}
1797 1781
1798 /* USA-28 supports different maximum baud rates on each port */ 1782 /* USA-28 supports different maximum baud rates on each port */
@@ -1800,57 +1784,51 @@ static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1800 u8 *rate_low, u8 *prescaler, int portnum) 1784 u8 *rate_low, u8 *prescaler, int portnum)
1801{ 1785{
1802 u32 b16, /* baud rate times 16 (actual rate used internally) */ 1786 u32 b16, /* baud rate times 16 (actual rate used internally) */
1803 div, /* divisor */ 1787 div, /* divisor */
1804 cnt; /* inverse of divisor (programmed into 8051) */ 1788 cnt; /* inverse of divisor (programmed into 8051) */
1805 1789
1806 dbg ("%s - %d.", __func__, baud_rate); 1790 dbg("%s - %d.", __func__, baud_rate);
1807 1791
1808 /* prevent divide by zero */ 1792 /* prevent divide by zero */
1809 if ((b16 = baud_rate * 16L) == 0) 1793 b16 = baud_rate * 16L;
1810 return (KEYSPAN_INVALID_BAUD_RATE); 1794 if (b16 == 0)
1811 1795 return KEYSPAN_INVALID_BAUD_RATE;
1812 /* calculate the divisor and the counter (its inverse) */ 1796
1813 if ((div = (KEYSPAN_USA28_BAUDCLK / b16)) == 0) { 1797 /* calculate the divisor and the counter (its inverse) */
1814 return (KEYSPAN_INVALID_BAUD_RATE); 1798 div = KEYSPAN_USA28_BAUDCLK / b16;
1815 } 1799 if (div == 0)
1816 else { 1800 return KEYSPAN_INVALID_BAUD_RATE;
1801 else
1817 cnt = 0 - div; 1802 cnt = 0 - div;
1818 }
1819 1803
1820 /* check for out of range, based on portnum, 1804 /* check for out of range, based on portnum,
1821 and return result */ 1805 and return result */
1822 if(portnum == 0) { 1806 if (portnum == 0) {
1823 if(div > 0xffff) 1807 if (div > 0xffff)
1824 return (KEYSPAN_INVALID_BAUD_RATE); 1808 return KEYSPAN_INVALID_BAUD_RATE;
1825 } 1809 } else {
1826 else { 1810 if (portnum == 1) {
1827 if(portnum == 1) { 1811 if (div > 0xff)
1828 if(div > 0xff) { 1812 return KEYSPAN_INVALID_BAUD_RATE;
1829 return (KEYSPAN_INVALID_BAUD_RATE); 1813 } else
1830 } 1814 return KEYSPAN_INVALID_BAUD_RATE;
1831 }
1832 else {
1833 return (KEYSPAN_INVALID_BAUD_RATE);
1834 }
1835 } 1815 }
1836 1816
1837 /* return the counter values if not NULL 1817 /* return the counter values if not NULL
1838 (port 1 will ignore retHi) */ 1818 (port 1 will ignore retHi) */
1839 if (rate_low) { 1819 if (rate_low)
1840 *rate_low = (u8) (cnt & 0xff); 1820 *rate_low = (u8) (cnt & 0xff);
1841 } 1821 if (rate_hi)
1842 if (rate_hi) {
1843 *rate_hi = (u8) ((cnt >> 8) & 0xff); 1822 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1844 } 1823 dbg("%s - %d OK.", __func__, baud_rate);
1845 dbg ("%s - %d OK.", __func__, baud_rate); 1824 return KEYSPAN_BAUD_RATE_OK;
1846 return (KEYSPAN_BAUD_RATE_OK);
1847} 1825}
1848 1826
1849static int keyspan_usa26_send_setup(struct usb_serial *serial, 1827static int keyspan_usa26_send_setup(struct usb_serial *serial,
1850 struct usb_serial_port *port, 1828 struct usb_serial_port *port,
1851 int reset_port) 1829 int reset_port)
1852{ 1830{
1853 struct keyspan_usa26_portControlMessage msg; 1831 struct keyspan_usa26_portControlMessage msg;
1854 struct keyspan_serial_private *s_priv; 1832 struct keyspan_serial_private *s_priv;
1855 struct keyspan_port_private *p_priv; 1833 struct keyspan_port_private *p_priv;
1856 const struct keyspan_device_details *d_details; 1834 const struct keyspan_device_details *d_details;
@@ -1858,7 +1836,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
1858 struct urb *this_urb; 1836 struct urb *this_urb;
1859 int device_port, err; 1837 int device_port, err;
1860 1838
1861 dbg ("%s reset=%d", __func__, reset_port); 1839 dbg("%s reset=%d", __func__, reset_port);
1862 1840
1863 s_priv = usb_get_serial_data(serial); 1841 s_priv = usb_get_serial_data(serial);
1864 p_priv = usb_get_serial_port_data(port); 1842 p_priv = usb_get_serial_port_data(port);
@@ -1881,22 +1859,22 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
1881 if ((reset_port + 1) > p_priv->resend_cont) 1859 if ((reset_port + 1) > p_priv->resend_cont)
1882 p_priv->resend_cont = reset_port + 1; 1860 p_priv->resend_cont = reset_port + 1;
1883 if (this_urb->status == -EINPROGRESS) { 1861 if (this_urb->status == -EINPROGRESS) {
1884 /* dbg ("%s - already writing", __func__); */ 1862 /* dbg("%s - already writing", __func__); */
1885 mdelay(5); 1863 mdelay(5);
1886 return(-1); 1864 return -1;
1887 } 1865 }
1888 1866
1889 memset(&msg, 0, sizeof (struct keyspan_usa26_portControlMessage)); 1867 memset(&msg, 0, sizeof(struct keyspan_usa26_portControlMessage));
1890 1868
1891 /* Only set baud rate if it's changed */ 1869 /* Only set baud rate if it's changed */
1892 if (p_priv->old_baud != p_priv->baud) { 1870 if (p_priv->old_baud != p_priv->baud) {
1893 p_priv->old_baud = p_priv->baud; 1871 p_priv->old_baud = p_priv->baud;
1894 msg.setClocking = 0xff; 1872 msg.setClocking = 0xff;
1895 if (d_details->calculate_baud_rate 1873 if (d_details->calculate_baud_rate
1896 (p_priv->baud, d_details->baudclk, &msg.baudHi, 1874 (p_priv->baud, d_details->baudclk, &msg.baudHi,
1897 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) { 1875 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
1898 dbg("%s - Invalid baud rate %d requested, using 9600.", __func__, 1876 dbg("%s - Invalid baud rate %d requested, using 9600.",
1899 p_priv->baud); 1877 __func__, p_priv->baud);
1900 msg.baudLo = 0; 1878 msg.baudLo = 0;
1901 msg.baudHi = 125; /* Values for 9600 baud */ 1879 msg.baudHi = 125; /* Values for 9600 baud */
1902 msg.prescaler = 10; 1880 msg.prescaler = 10;
@@ -1922,7 +1900,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
1922 if (p_priv->cflag & PARENB) { 1900 if (p_priv->cflag & PARENB) {
1923 /* note USA_PARITY_NONE == 0 */ 1901 /* note USA_PARITY_NONE == 0 */
1924 msg.lcr |= (p_priv->cflag & PARODD)? 1902 msg.lcr |= (p_priv->cflag & PARODD)?
1925 USA_PARITY_ODD: USA_PARITY_EVEN; 1903 USA_PARITY_ODD : USA_PARITY_EVEN;
1926 } 1904 }
1927 msg.setLcr = 0xff; 1905 msg.setLcr = 0xff;
1928 1906
@@ -1963,7 +1941,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
1963 1941
1964 /* Sending intermediate configs */ 1942 /* Sending intermediate configs */
1965 else { 1943 else {
1966 msg._txOn = (! p_priv->break_on); 1944 msg._txOn = (!p_priv->break_on);
1967 msg._txOff = 0; 1945 msg._txOff = 0;
1968 msg.txFlush = 0; 1946 msg.txFlush = 0;
1969 msg.txBreak = (p_priv->break_on); 1947 msg.txBreak = (p_priv->break_on);
@@ -1975,23 +1953,23 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
1975 msg.resetDataToggle = 0x0; 1953 msg.resetDataToggle = 0x0;
1976 } 1954 }
1977 1955
1978 /* Do handshaking outputs */ 1956 /* Do handshaking outputs */
1979 msg.setTxTriState_setRts = 0xff; 1957 msg.setTxTriState_setRts = 0xff;
1980 msg.txTriState_rts = p_priv->rts_state; 1958 msg.txTriState_rts = p_priv->rts_state;
1981 1959
1982 msg.setHskoa_setDtr = 0xff; 1960 msg.setHskoa_setDtr = 0xff;
1983 msg.hskoa_dtr = p_priv->dtr_state; 1961 msg.hskoa_dtr = p_priv->dtr_state;
1984 1962
1985 p_priv->resend_cont = 0; 1963 p_priv->resend_cont = 0;
1986 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg)); 1964 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
1987 1965
1988 /* send the data out the device on control endpoint */ 1966 /* send the data out the device on control endpoint */
1989 this_urb->transfer_buffer_length = sizeof(msg); 1967 this_urb->transfer_buffer_length = sizeof(msg);
1990 1968
1991 this_urb->dev = serial->dev; 1969 this_urb->dev = serial->dev;
1992 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { 1970 err = usb_submit_urb(this_urb, GFP_ATOMIC);
1971 if (err != 0)
1993 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err); 1972 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
1994 }
1995#if 0 1973#if 0
1996 else { 1974 else {
1997 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__ 1975 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__
@@ -2007,14 +1985,14 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
2007 struct usb_serial_port *port, 1985 struct usb_serial_port *port,
2008 int reset_port) 1986 int reset_port)
2009{ 1987{
2010 struct keyspan_usa28_portControlMessage msg; 1988 struct keyspan_usa28_portControlMessage msg;
2011 struct keyspan_serial_private *s_priv; 1989 struct keyspan_serial_private *s_priv;
2012 struct keyspan_port_private *p_priv; 1990 struct keyspan_port_private *p_priv;
2013 const struct keyspan_device_details *d_details; 1991 const struct keyspan_device_details *d_details;
2014 struct urb *this_urb; 1992 struct urb *this_urb;
2015 int device_port, err; 1993 int device_port, err;
2016 1994
2017 dbg ("%s", __func__); 1995 dbg("%s", __func__);
2018 1996
2019 s_priv = usb_get_serial_data(serial); 1997 s_priv = usb_get_serial_data(serial);
2020 p_priv = usb_get_serial_port_data(port); 1998 p_priv = usb_get_serial_port_data(port);
@@ -2022,7 +2000,8 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
2022 device_port = port->number - port->serial->minor; 2000 device_port = port->number - port->serial->minor;
2023 2001
2024 /* only do something if we have a bulk out endpoint */ 2002 /* only do something if we have a bulk out endpoint */
2025 if ((this_urb = p_priv->outcont_urb) == NULL) { 2003 this_urb = p_priv->outcont_urb;
2004 if (this_urb == NULL) {
2026 dbg("%s - oops no urb.", __func__); 2005 dbg("%s - oops no urb.", __func__);
2027 return -1; 2006 return -1;
2028 } 2007 }
@@ -2032,17 +2011,18 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
2032 if ((reset_port + 1) > p_priv->resend_cont) 2011 if ((reset_port + 1) > p_priv->resend_cont)
2033 p_priv->resend_cont = reset_port + 1; 2012 p_priv->resend_cont = reset_port + 1;
2034 if (this_urb->status == -EINPROGRESS) { 2013 if (this_urb->status == -EINPROGRESS) {
2035 dbg ("%s already writing", __func__); 2014 dbg("%s already writing", __func__);
2036 mdelay(5); 2015 mdelay(5);
2037 return(-1); 2016 return -1;
2038 } 2017 }
2039 2018
2040 memset(&msg, 0, sizeof (struct keyspan_usa28_portControlMessage)); 2019 memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));
2041 2020
2042 msg.setBaudRate = 1; 2021 msg.setBaudRate = 1;
2043 if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk, 2022 if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2044 &msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE ) { 2023 &msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2045 dbg("%s - Invalid baud rate requested %d.", __func__, p_priv->baud); 2024 dbg("%s - Invalid baud rate requested %d.",
2025 __func__, p_priv->baud);
2046 msg.baudLo = 0xff; 2026 msg.baudLo = 0xff;
2047 msg.baudHi = 0xb2; /* Values for 9600 baud */ 2027 msg.baudHi = 0xb2; /* Values for 9600 baud */
2048 } 2028 }
@@ -2053,7 +2033,7 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
2053 msg.ctsFlowControl = (p_priv->flow_control == flow_cts); 2033 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2054 msg.xonFlowControl = 0; 2034 msg.xonFlowControl = 0;
2055 2035
2056 /* Do handshaking outputs, DTR is inverted relative to RTS */ 2036 /* Do handshaking outputs, DTR is inverted relative to RTS */
2057 msg.rts = p_priv->rts_state; 2037 msg.rts = p_priv->rts_state;
2058 msg.dtr = p_priv->dtr_state; 2038 msg.dtr = p_priv->dtr_state;
2059 2039
@@ -2095,7 +2075,7 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
2095 } 2075 }
2096 /* Sending intermediate configs */ 2076 /* Sending intermediate configs */
2097 else { 2077 else {
2098 msg._txOn = (! p_priv->break_on); 2078 msg._txOn = (!p_priv->break_on);
2099 msg._txOff = 0; 2079 msg._txOff = 0;
2100 msg.txFlush = 0; 2080 msg.txFlush = 0;
2101 msg.txForceXoff = 0; 2081 msg.txForceXoff = 0;
@@ -2109,15 +2089,15 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,
2109 } 2089 }
2110 2090
2111 p_priv->resend_cont = 0; 2091 p_priv->resend_cont = 0;
2112 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg)); 2092 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2113 2093
2114 /* send the data out the device on control endpoint */ 2094 /* send the data out the device on control endpoint */
2115 this_urb->transfer_buffer_length = sizeof(msg); 2095 this_urb->transfer_buffer_length = sizeof(msg);
2116 2096
2117 this_urb->dev = serial->dev; 2097 this_urb->dev = serial->dev;
2118 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { 2098 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2099 if (err != 0)
2119 dbg("%s - usb_submit_urb(setup) failed", __func__); 2100 dbg("%s - usb_submit_urb(setup) failed", __func__);
2120 }
2121#if 0 2101#if 0
2122 else { 2102 else {
2123 dbg("%s - usb_submit_urb(setup) OK %d bytes", __func__, 2103 dbg("%s - usb_submit_urb(setup) OK %d bytes", __func__,
@@ -2140,7 +2120,7 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2140 struct urb *this_urb; 2120 struct urb *this_urb;
2141 int err, device_port; 2121 int err, device_port;
2142 2122
2143 dbg ("%s", __func__); 2123 dbg("%s", __func__);
2144 2124
2145 s_priv = usb_get_serial_data(serial); 2125 s_priv = usb_get_serial_data(serial);
2146 p_priv = usb_get_serial_port_data(port); 2126 p_priv = usb_get_serial_port_data(port);
@@ -2151,7 +2131,9 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2151 /* Work out which port within the device is being setup */ 2131 /* Work out which port within the device is being setup */
2152 device_port = port->number - port->serial->minor; 2132 device_port = port->number - port->serial->minor;
2153 2133
2154 dbg("%s - endpoint %d port %d (%d)",__func__, usb_pipeendpoint(this_urb->pipe), port->number, device_port); 2134 dbg("%s - endpoint %d port %d (%d)",
2135 __func__, usb_pipeendpoint(this_urb->pipe),
2136 port->number, device_port);
2155 2137
2156 /* Make sure we have an urb then send the message */ 2138 /* Make sure we have an urb then send the message */
2157 if (this_urb == NULL) { 2139 if (this_urb == NULL) {
@@ -2165,30 +2147,30 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2165 p_priv->resend_cont = reset_port + 1; 2147 p_priv->resend_cont = reset_port + 1;
2166 2148
2167 if (this_urb->status == -EINPROGRESS) { 2149 if (this_urb->status == -EINPROGRESS) {
2168 /* dbg ("%s - already writing", __func__); */ 2150 /* dbg("%s - already writing", __func__); */
2169 mdelay(5); 2151 mdelay(5);
2170 return(-1); 2152 return -1;
2171 } 2153 }
2172 2154
2173 memset(&msg, 0, sizeof (struct keyspan_usa49_portControlMessage)); 2155 memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage));
2174 2156
2175 /*msg.portNumber = port->number;*/ 2157 /*msg.portNumber = port->number;*/
2176 msg.portNumber = device_port; 2158 msg.portNumber = device_port;
2177 2159
2178 /* Only set baud rate if it's changed */ 2160 /* Only set baud rate if it's changed */
2179 if (p_priv->old_baud != p_priv->baud) { 2161 if (p_priv->old_baud != p_priv->baud) {
2180 p_priv->old_baud = p_priv->baud; 2162 p_priv->old_baud = p_priv->baud;
2181 msg.setClocking = 0xff; 2163 msg.setClocking = 0xff;
2182 if (d_details->calculate_baud_rate 2164 if (d_details->calculate_baud_rate
2183 (p_priv->baud, d_details->baudclk, &msg.baudHi, 2165 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2184 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) { 2166 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2185 dbg("%s - Invalid baud rate %d requested, using 9600.", __func__, 2167 dbg("%s - Invalid baud rate %d requested, using 9600.",
2186 p_priv->baud); 2168 __func__, p_priv->baud);
2187 msg.baudLo = 0; 2169 msg.baudLo = 0;
2188 msg.baudHi = 125; /* Values for 9600 baud */ 2170 msg.baudHi = 125; /* Values for 9600 baud */
2189 msg.prescaler = 10; 2171 msg.prescaler = 10;
2190 } 2172 }
2191 //msg.setPrescaler = 0xff; 2173 /* msg.setPrescaler = 0xff; */
2192 } 2174 }
2193 2175
2194 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1; 2176 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
@@ -2209,19 +2191,19 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2209 if (p_priv->cflag & PARENB) { 2191 if (p_priv->cflag & PARENB) {
2210 /* note USA_PARITY_NONE == 0 */ 2192 /* note USA_PARITY_NONE == 0 */
2211 msg.lcr |= (p_priv->cflag & PARODD)? 2193 msg.lcr |= (p_priv->cflag & PARODD)?
2212 USA_PARITY_ODD: USA_PARITY_EVEN; 2194 USA_PARITY_ODD : USA_PARITY_EVEN;
2213 } 2195 }
2214 msg.setLcr = 0xff; 2196 msg.setLcr = 0xff;
2215 2197
2216 msg.ctsFlowControl = (p_priv->flow_control == flow_cts); 2198 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2217 msg.xonFlowControl = 0; 2199 msg.xonFlowControl = 0;
2218 msg.setFlowControl = 0xff; 2200 msg.setFlowControl = 0xff;
2219 2201
2220 msg.forwardingLength = 16; 2202 msg.forwardingLength = 16;
2221 msg.xonChar = 17; 2203 msg.xonChar = 17;
2222 msg.xoffChar = 19; 2204 msg.xoffChar = 19;
2223 2205
2224 /* Opening port */ 2206 /* Opening port */
2225 if (reset_port == 1) { 2207 if (reset_port == 1) {
2226 msg._txOn = 1; 2208 msg._txOn = 1;
2227 msg._txOff = 0; 2209 msg._txOff = 0;
@@ -2253,7 +2235,7 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2253 } 2235 }
2254 /* Sending intermediate configs */ 2236 /* Sending intermediate configs */
2255 else { 2237 else {
2256 msg._txOn = (! p_priv->break_on); 2238 msg._txOn = (!p_priv->break_on);
2257 msg._txOff = 0; 2239 msg._txOff = 0;
2258 msg.txFlush = 0; 2240 msg.txFlush = 0;
2259 msg.txBreak = (p_priv->break_on); 2241 msg.txBreak = (p_priv->break_on);
@@ -2267,16 +2249,17 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2267 msg.disablePort = 0; 2249 msg.disablePort = 0;
2268 } 2250 }
2269 2251
2270 /* Do handshaking outputs */ 2252 /* Do handshaking outputs */
2271 msg.setRts = 0xff; 2253 msg.setRts = 0xff;
2272 msg.rts = p_priv->rts_state; 2254 msg.rts = p_priv->rts_state;
2273 2255
2274 msg.setDtr = 0xff; 2256 msg.setDtr = 0xff;
2275 msg.dtr = p_priv->dtr_state; 2257 msg.dtr = p_priv->dtr_state;
2276 2258
2277 p_priv->resend_cont = 0; 2259 p_priv->resend_cont = 0;
2278 2260
2279 /* if the device is a 49wg, we send control message on usb control EP 0 */ 2261 /* if the device is a 49wg, we send control message on usb
2262 control EP 0 */
2280 2263
2281 if (d_details->product_id == keyspan_usa49wg_product_id) { 2264 if (d_details->product_id == keyspan_usa49wg_product_id) {
2282 dr = (void *)(s_priv->ctrl_buf); 2265 dr = (void *)(s_priv->ctrl_buf);
@@ -2286,23 +2269,24 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
2286 dr->wIndex = 0; 2269 dr->wIndex = 0;
2287 dr->wLength = cpu_to_le16(sizeof(msg)); 2270 dr->wLength = cpu_to_le16(sizeof(msg));
2288 2271
2289 memcpy (s_priv->glocont_buf, &msg, sizeof(msg)); 2272 memcpy(s_priv->glocont_buf, &msg, sizeof(msg));
2290 2273
2291 usb_fill_control_urb(this_urb, serial->dev, usb_sndctrlpipe(serial->dev, 0), 2274 usb_fill_control_urb(this_urb, serial->dev,
2292 (unsigned char *)dr, s_priv->glocont_buf, sizeof(msg), 2275 usb_sndctrlpipe(serial->dev, 0),
2293 usa49_glocont_callback, serial); 2276 (unsigned char *)dr, s_priv->glocont_buf,
2277 sizeof(msg), usa49_glocont_callback, serial);
2294 2278
2295 } else { 2279 } else {
2296 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg)); 2280 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2297 2281
2298 /* send the data out the device on control endpoint */ 2282 /* send the data out the device on control endpoint */
2299 this_urb->transfer_buffer_length = sizeof(msg); 2283 this_urb->transfer_buffer_length = sizeof(msg);
2300 2284
2301 this_urb->dev = serial->dev; 2285 this_urb->dev = serial->dev;
2302 } 2286 }
2303 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { 2287 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2288 if (err != 0)
2304 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err); 2289 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
2305 }
2306#if 0 2290#if 0
2307 else { 2291 else {
2308 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__, 2292 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__,
@@ -2318,7 +2302,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
2318 struct usb_serial_port *port, 2302 struct usb_serial_port *port,
2319 int reset_port) 2303 int reset_port)
2320{ 2304{
2321 struct keyspan_usa90_portControlMessage msg; 2305 struct keyspan_usa90_portControlMessage msg;
2322 struct keyspan_serial_private *s_priv; 2306 struct keyspan_serial_private *s_priv;
2323 struct keyspan_port_private *p_priv; 2307 struct keyspan_port_private *p_priv;
2324 const struct keyspan_device_details *d_details; 2308 const struct keyspan_device_details *d_details;
@@ -2326,14 +2310,15 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
2326 int err; 2310 int err;
2327 u8 prescaler; 2311 u8 prescaler;
2328 2312
2329 dbg ("%s", __func__); 2313 dbg("%s", __func__);
2330 2314
2331 s_priv = usb_get_serial_data(serial); 2315 s_priv = usb_get_serial_data(serial);
2332 p_priv = usb_get_serial_port_data(port); 2316 p_priv = usb_get_serial_port_data(port);
2333 d_details = s_priv->device_details; 2317 d_details = s_priv->device_details;
2334 2318
2335 /* only do something if we have a bulk out endpoint */ 2319 /* only do something if we have a bulk out endpoint */
2336 if ((this_urb = p_priv->outcont_urb) == NULL) { 2320 this_urb = p_priv->outcont_urb;
2321 if (this_urb == NULL) {
2337 dbg("%s - oops no urb.", __func__); 2322 dbg("%s - oops no urb.", __func__);
2338 return -1; 2323 return -1;
2339 } 2324 }
@@ -2343,24 +2328,24 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
2343 if ((reset_port + 1) > p_priv->resend_cont) 2328 if ((reset_port + 1) > p_priv->resend_cont)
2344 p_priv->resend_cont = reset_port + 1; 2329 p_priv->resend_cont = reset_port + 1;
2345 if (this_urb->status == -EINPROGRESS) { 2330 if (this_urb->status == -EINPROGRESS) {
2346 dbg ("%s already writing", __func__); 2331 dbg("%s already writing", __func__);
2347 mdelay(5); 2332 mdelay(5);
2348 return(-1); 2333 return -1;
2349 } 2334 }
2350 2335
2351 memset(&msg, 0, sizeof (struct keyspan_usa90_portControlMessage)); 2336 memset(&msg, 0, sizeof(struct keyspan_usa90_portControlMessage));
2352 2337
2353 /* Only set baud rate if it's changed */ 2338 /* Only set baud rate if it's changed */
2354 if (p_priv->old_baud != p_priv->baud) { 2339 if (p_priv->old_baud != p_priv->baud) {
2355 p_priv->old_baud = p_priv->baud; 2340 p_priv->old_baud = p_priv->baud;
2356 msg.setClocking = 0x01; 2341 msg.setClocking = 0x01;
2357 if (d_details->calculate_baud_rate 2342 if (d_details->calculate_baud_rate
2358 (p_priv->baud, d_details->baudclk, &msg.baudHi, 2343 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2359 &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE ) { 2344 &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) {
2360 dbg("%s - Invalid baud rate %d requested, using 9600.", __func__, 2345 dbg("%s - Invalid baud rate %d requested, using 9600.",
2361 p_priv->baud); 2346 __func__, p_priv->baud);
2362 p_priv->baud = 9600; 2347 p_priv->baud = 9600;
2363 d_details->calculate_baud_rate (p_priv->baud, d_details->baudclk, 2348 d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
2364 &msg.baudHi, &msg.baudLo, &prescaler, 0); 2349 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2365 } 2350 }
2366 msg.setRxMode = 1; 2351 msg.setRxMode = 1;
@@ -2368,13 +2353,10 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
2368 } 2353 }
2369 2354
2370 /* modes must always be correctly specified */ 2355 /* modes must always be correctly specified */
2371 if (p_priv->baud > 57600) 2356 if (p_priv->baud > 57600) {
2372 {
2373 msg.rxMode = RXMODE_DMA; 2357 msg.rxMode = RXMODE_DMA;
2374 msg.txMode = TXMODE_DMA; 2358 msg.txMode = TXMODE_DMA;
2375 } 2359 } else {
2376 else
2377 {
2378 msg.rxMode = RXMODE_BYHAND; 2360 msg.rxMode = RXMODE_BYHAND;
2379 msg.txMode = TXMODE_BYHAND; 2361 msg.txMode = TXMODE_BYHAND;
2380 } 2362 }
@@ -2397,7 +2379,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
2397 if (p_priv->cflag & PARENB) { 2379 if (p_priv->cflag & PARENB) {
2398 /* note USA_PARITY_NONE == 0 */ 2380 /* note USA_PARITY_NONE == 0 */
2399 msg.lcr |= (p_priv->cflag & PARODD)? 2381 msg.lcr |= (p_priv->cflag & PARODD)?
2400 USA_PARITY_ODD: USA_PARITY_EVEN; 2382 USA_PARITY_ODD : USA_PARITY_EVEN;
2401 } 2383 }
2402 if (p_priv->old_cflag != p_priv->cflag) { 2384 if (p_priv->old_cflag != p_priv->cflag) {
2403 p_priv->old_cflag = p_priv->cflag; 2385 p_priv->old_cflag = p_priv->cflag;
@@ -2408,47 +2390,46 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
2408 msg.txFlowControl = TXFLOW_CTS; 2390 msg.txFlowControl = TXFLOW_CTS;
2409 msg.setTxFlowControl = 0x01; 2391 msg.setTxFlowControl = 0x01;
2410 msg.setRxFlowControl = 0x01; 2392 msg.setRxFlowControl = 0x01;
2411 2393
2412 msg.rxForwardingLength = 16; 2394 msg.rxForwardingLength = 16;
2413 msg.rxForwardingTimeout = 16; 2395 msg.rxForwardingTimeout = 16;
2414 msg.txAckSetting = 0; 2396 msg.txAckSetting = 0;
2415 msg.xonChar = 17; 2397 msg.xonChar = 17;
2416 msg.xoffChar = 19; 2398 msg.xoffChar = 19;
2417 2399
2418 /* Opening port */ 2400 /* Opening port */
2419 if (reset_port == 1) { 2401 if (reset_port == 1) {
2420 msg.portEnabled = 1; 2402 msg.portEnabled = 1;
2421 msg.rxFlush = 1; 2403 msg.rxFlush = 1;
2422 msg.txBreak = (p_priv->break_on); 2404 msg.txBreak = (p_priv->break_on);
2423 } 2405 }
2424 /* Closing port */ 2406 /* Closing port */
2425 else if (reset_port == 2) { 2407 else if (reset_port == 2)
2426 msg.portEnabled = 0; 2408 msg.portEnabled = 0;
2427 }
2428 /* Sending intermediate configs */ 2409 /* Sending intermediate configs */
2429 else { 2410 else {
2430 if (port->open_count) 2411 if (port->port.count)
2431 msg.portEnabled = 1; 2412 msg.portEnabled = 1;
2432 msg.txBreak = (p_priv->break_on); 2413 msg.txBreak = (p_priv->break_on);
2433 } 2414 }
2434 2415
2435 /* Do handshaking outputs */ 2416 /* Do handshaking outputs */
2436 msg.setRts = 0x01; 2417 msg.setRts = 0x01;
2437 msg.rts = p_priv->rts_state; 2418 msg.rts = p_priv->rts_state;
2438 2419
2439 msg.setDtr = 0x01; 2420 msg.setDtr = 0x01;
2440 msg.dtr = p_priv->dtr_state; 2421 msg.dtr = p_priv->dtr_state;
2441 2422
2442 p_priv->resend_cont = 0; 2423 p_priv->resend_cont = 0;
2443 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg)); 2424 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2444 2425
2445 /* send the data out the device on control endpoint */ 2426 /* send the data out the device on control endpoint */
2446 this_urb->transfer_buffer_length = sizeof(msg); 2427 this_urb->transfer_buffer_length = sizeof(msg);
2447 2428
2448 this_urb->dev = serial->dev; 2429 this_urb->dev = serial->dev;
2449 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { 2430 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2431 if (err != 0)
2450 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err); 2432 dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err);
2451 }
2452 return 0; 2433 return 0;
2453} 2434}
2454 2435
@@ -2463,7 +2444,7 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,
2463 struct urb *this_urb; 2444 struct urb *this_urb;
2464 int err, device_port; 2445 int err, device_port;
2465 2446
2466 dbg ("%s", __func__); 2447 dbg("%s", __func__);
2467 2448
2468 s_priv = usb_get_serial_data(serial); 2449 s_priv = usb_get_serial_data(serial);
2469 p_priv = usb_get_serial_port_data(port); 2450 p_priv = usb_get_serial_port_data(port);
@@ -2486,9 +2467,9 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,
2486 if ((reset_port + 1) > p_priv->resend_cont) 2467 if ((reset_port + 1) > p_priv->resend_cont)
2487 p_priv->resend_cont = reset_port + 1; 2468 p_priv->resend_cont = reset_port + 1;
2488 if (this_urb->status == -EINPROGRESS) { 2469 if (this_urb->status == -EINPROGRESS) {
2489 /* dbg ("%s - already writing", __func__); */ 2470 /* dbg("%s - already writing", __func__); */
2490 mdelay(5); 2471 mdelay(5);
2491 return(-1); 2472 return -1;
2492 } 2473 }
2493 2474
2494 memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage)); 2475 memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
@@ -2501,9 +2482,9 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,
2501 msg.setClocking = 0xff; 2482 msg.setClocking = 0xff;
2502 if (d_details->calculate_baud_rate 2483 if (d_details->calculate_baud_rate
2503 (p_priv->baud, d_details->baudclk, &msg.baudHi, 2484 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2504 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) { 2485 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2505 dbg("%s - Invalid baud rate %d requested, using 9600.", __func__, 2486 dbg("%s - Invalid baud rate %d requested, using 9600.",
2506 p_priv->baud); 2487 __func__, p_priv->baud);
2507 msg.baudLo = 0; 2488 msg.baudLo = 0;
2508 msg.baudHi = 125; /* Values for 9600 baud */ 2489 msg.baudHi = 125; /* Values for 9600 baud */
2509 msg.prescaler = 10; 2490 msg.prescaler = 10;
@@ -2529,7 +2510,7 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,
2529 if (p_priv->cflag & PARENB) { 2510 if (p_priv->cflag & PARENB) {
2530 /* note USA_PARITY_NONE == 0 */ 2511 /* note USA_PARITY_NONE == 0 */
2531 msg.lcr |= (p_priv->cflag & PARODD)? 2512 msg.lcr |= (p_priv->cflag & PARODD)?
2532 USA_PARITY_ODD: USA_PARITY_EVEN; 2513 USA_PARITY_ODD : USA_PARITY_EVEN;
2533 } 2514 }
2534 msg.setLcr = 0xff; 2515 msg.setLcr = 0xff;
2535 2516
@@ -2566,7 +2547,7 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,
2566 msg.resetDataToggle = 0; 2547 msg.resetDataToggle = 0;
2567 } else { 2548 } else {
2568 /* Sending intermediate configs */ 2549 /* Sending intermediate configs */
2569 msg._txOn = (! p_priv->break_on); 2550 msg._txOn = (!p_priv->break_on);
2570 msg._txOff = 0; 2551 msg._txOff = 0;
2571 msg.txFlush = 0; 2552 msg.txFlush = 0;
2572 msg.txBreak = (p_priv->break_on); 2553 msg.txBreak = (p_priv->break_on);
@@ -2606,7 +2587,7 @@ static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2606 struct keyspan_serial_private *s_priv; 2587 struct keyspan_serial_private *s_priv;
2607 const struct keyspan_device_details *d_details; 2588 const struct keyspan_device_details *d_details;
2608 2589
2609 dbg ("%s", __func__); 2590 dbg("%s", __func__);
2610 2591
2611 s_priv = usb_get_serial_data(serial); 2592 s_priv = usb_get_serial_data(serial);
2612 d_details = s_priv->device_details; 2593 d_details = s_priv->device_details;
@@ -2633,7 +2614,7 @@ static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2633 2614
2634/* Gets called by the "real" driver (ie once firmware is loaded 2615/* Gets called by the "real" driver (ie once firmware is loaded
2635 and renumeration has taken place. */ 2616 and renumeration has taken place. */
2636static int keyspan_startup (struct usb_serial *serial) 2617static int keyspan_startup(struct usb_serial *serial)
2637{ 2618{
2638 int i, err; 2619 int i, err;
2639 struct usb_serial_port *port; 2620 struct usb_serial_port *port;
@@ -2644,17 +2625,20 @@ static int keyspan_startup (struct usb_serial *serial)
2644 dbg("%s", __func__); 2625 dbg("%s", __func__);
2645 2626
2646 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i) 2627 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2647 if (d_details->product_id == le16_to_cpu(serial->dev->descriptor.idProduct)) 2628 if (d_details->product_id ==
2629 le16_to_cpu(serial->dev->descriptor.idProduct))
2648 break; 2630 break;
2649 if (d_details == NULL) { 2631 if (d_details == NULL) {
2650 dev_err(&serial->dev->dev, "%s - unknown product id %x\n", __func__, le16_to_cpu(serial->dev->descriptor.idProduct)); 2632 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2633 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2651 return 1; 2634 return 1;
2652 } 2635 }
2653 2636
2654 /* Setup private data for serial driver */ 2637 /* Setup private data for serial driver */
2655 s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL); 2638 s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2656 if (!s_priv) { 2639 if (!s_priv) {
2657 dbg("%s - kmalloc for keyspan_serial_private failed.", __func__); 2640 dbg("%s - kmalloc for keyspan_serial_private failed.",
2641 __func__);
2658 return -ENOMEM; 2642 return -ENOMEM;
2659 } 2643 }
2660 2644
@@ -2664,10 +2648,11 @@ static int keyspan_startup (struct usb_serial *serial)
2664 /* Now setup per port private data */ 2648 /* Now setup per port private data */
2665 for (i = 0; i < serial->num_ports; i++) { 2649 for (i = 0; i < serial->num_ports; i++) {
2666 port = serial->port[i]; 2650 port = serial->port[i];
2667 p_priv = kzalloc(sizeof(struct keyspan_port_private), GFP_KERNEL); 2651 p_priv = kzalloc(sizeof(struct keyspan_port_private),
2652 GFP_KERNEL);
2668 if (!p_priv) { 2653 if (!p_priv) {
2669 dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __func__, i); 2654 dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __func__, i);
2670 return (1); 2655 return 1;
2671 } 2656 }
2672 p_priv->device_details = d_details; 2657 p_priv->device_details = d_details;
2673 usb_set_serial_port_data(port, p_priv); 2658 usb_set_serial_port_data(port, p_priv);
@@ -2689,11 +2674,11 @@ static int keyspan_startup (struct usb_serial *serial)
2689 dbg("%s - submit indat urb failed %d", __func__, 2674 dbg("%s - submit indat urb failed %d", __func__,
2690 err); 2675 err);
2691 } 2676 }
2692 2677
2693 return 0; 2678 return 0;
2694} 2679}
2695 2680
2696static void keyspan_shutdown (struct usb_serial *serial) 2681static void keyspan_shutdown(struct usb_serial *serial)
2697{ 2682{
2698 int i, j; 2683 int i, j;
2699 struct usb_serial_port *port; 2684 struct usb_serial_port *port;
@@ -2745,8 +2730,8 @@ static void keyspan_shutdown (struct usb_serial *serial)
2745 } 2730 }
2746} 2731}
2747 2732
2748MODULE_AUTHOR( DRIVER_AUTHOR ); 2733MODULE_AUTHOR(DRIVER_AUTHOR);
2749MODULE_DESCRIPTION( DRIVER_DESC ); 2734MODULE_DESCRIPTION(DRIVER_DESC);
2750MODULE_LICENSE("GPL"); 2735MODULE_LICENSE("GPL");
2751 2736
2752MODULE_FIRMWARE("keyspan/usa28.fw"); 2737MODULE_FIRMWARE("keyspan/usa28.fw");
diff --git a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h
index b52fb657a244..38b4582e0734 100644
--- a/drivers/usb/serial/keyspan.h
+++ b/drivers/usb/serial/keyspan.h
@@ -35,17 +35,18 @@
35 35
36 36
37/* Function prototypes for Keyspan serial converter */ 37/* Function prototypes for Keyspan serial converter */
38static int keyspan_open (struct usb_serial_port *port, 38static int keyspan_open (struct tty_struct *tty,
39 struct usb_serial_port *port,
39 struct file *filp); 40 struct file *filp);
40static void keyspan_close (struct usb_serial_port *port, 41static void keyspan_close (struct tty_struct *tty,
42 struct usb_serial_port *port,
41 struct file *filp); 43 struct file *filp);
42static int keyspan_startup (struct usb_serial *serial); 44static int keyspan_startup (struct usb_serial *serial);
43static void keyspan_shutdown (struct usb_serial *serial); 45static void keyspan_shutdown (struct usb_serial *serial);
44static void keyspan_rx_throttle (struct usb_serial_port *port); 46static int keyspan_write_room (struct tty_struct *tty);
45static void keyspan_rx_unthrottle (struct usb_serial_port *port);
46static int keyspan_write_room (struct usb_serial_port *port);
47 47
48static int keyspan_write (struct usb_serial_port *port, 48static int keyspan_write (struct tty_struct *tty,
49 struct usb_serial_port *port,
49 const unsigned char *buf, 50 const unsigned char *buf,
50 int count); 51 int count);
51 52
@@ -53,18 +54,14 @@ static void keyspan_send_setup (struct usb_serial_port *port,
53 int reset_port); 54 int reset_port);
54 55
55 56
56static int keyspan_chars_in_buffer (struct usb_serial_port *port); 57static void keyspan_set_termios (struct tty_struct *tty,
57static int keyspan_ioctl (struct usb_serial_port *port, 58 struct usb_serial_port *port,
58 struct file *file,
59 unsigned int cmd,
60 unsigned long arg);
61static void keyspan_set_termios (struct usb_serial_port *port,
62 struct ktermios *old); 59 struct ktermios *old);
63static void keyspan_break_ctl (struct usb_serial_port *port, 60static void keyspan_break_ctl (struct tty_struct *tty,
64 int break_state); 61 int break_state);
65static int keyspan_tiocmget (struct usb_serial_port *port, 62static int keyspan_tiocmget (struct tty_struct *tty,
66 struct file *file); 63 struct file *file);
67static int keyspan_tiocmset (struct usb_serial_port *port, 64static int keyspan_tiocmset (struct tty_struct *tty,
68 struct file *file, unsigned int set, 65 struct file *file, unsigned int set,
69 unsigned int clear); 66 unsigned int clear);
70static int keyspan_fake_startup (struct usb_serial *serial); 67static int keyspan_fake_startup (struct usb_serial *serial);
@@ -138,7 +135,8 @@ static int keyspan_usa67_send_setup (struct usb_serial *serial,
138 135
139/* Product IDs post-renumeration. Note that the 28x and 28xb 136/* Product IDs post-renumeration. Note that the 28x and 28xb
140 have the same id's post-renumeration but behave identically 137 have the same id's post-renumeration but behave identically
141 so it's not an issue. */ 138 so it's not an issue. As such, the 28xb is not listed in any
139 of the device tables. */
142#define keyspan_usa18x_product_id 0x0112 140#define keyspan_usa18x_product_id 0x0112
143#define keyspan_usa19_product_id 0x0107 141#define keyspan_usa19_product_id 0x0107
144#define keyspan_usa19qi_product_id 0x010c 142#define keyspan_usa19qi_product_id 0x010c
@@ -482,7 +480,6 @@ static struct usb_device_id keyspan_ids_combined[] = {
482 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) }, 480 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
483 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) }, 481 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
484 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) }, 482 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
485 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_product_id) },
486 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) }, 483 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
487 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)}, 484 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
488 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)}, 485 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
@@ -532,7 +529,6 @@ static struct usb_device_id keyspan_2port_ids[] = {
532 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) }, 529 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
533 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) }, 530 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
534 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) }, 531 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
535 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_product_id) },
536 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) }, 532 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
537 { } /* Terminating entry */ 533 { } /* Terminating entry */
538}; 534};
@@ -568,10 +564,6 @@ static struct usb_serial_driver keyspan_1port_device = {
568 .close = keyspan_close, 564 .close = keyspan_close,
569 .write = keyspan_write, 565 .write = keyspan_write,
570 .write_room = keyspan_write_room, 566 .write_room = keyspan_write_room,
571 .chars_in_buffer = keyspan_chars_in_buffer,
572 .throttle = keyspan_rx_throttle,
573 .unthrottle = keyspan_rx_unthrottle,
574 .ioctl = keyspan_ioctl,
575 .set_termios = keyspan_set_termios, 567 .set_termios = keyspan_set_termios,
576 .break_ctl = keyspan_break_ctl, 568 .break_ctl = keyspan_break_ctl,
577 .tiocmget = keyspan_tiocmget, 569 .tiocmget = keyspan_tiocmget,
@@ -592,10 +584,6 @@ static struct usb_serial_driver keyspan_2port_device = {
592 .close = keyspan_close, 584 .close = keyspan_close,
593 .write = keyspan_write, 585 .write = keyspan_write,
594 .write_room = keyspan_write_room, 586 .write_room = keyspan_write_room,
595 .chars_in_buffer = keyspan_chars_in_buffer,
596 .throttle = keyspan_rx_throttle,
597 .unthrottle = keyspan_rx_unthrottle,
598 .ioctl = keyspan_ioctl,
599 .set_termios = keyspan_set_termios, 587 .set_termios = keyspan_set_termios,
600 .break_ctl = keyspan_break_ctl, 588 .break_ctl = keyspan_break_ctl,
601 .tiocmget = keyspan_tiocmget, 589 .tiocmget = keyspan_tiocmget,
@@ -616,10 +604,6 @@ static struct usb_serial_driver keyspan_4port_device = {
616 .close = keyspan_close, 604 .close = keyspan_close,
617 .write = keyspan_write, 605 .write = keyspan_write,
618 .write_room = keyspan_write_room, 606 .write_room = keyspan_write_room,
619 .chars_in_buffer = keyspan_chars_in_buffer,
620 .throttle = keyspan_rx_throttle,
621 .unthrottle = keyspan_rx_unthrottle,
622 .ioctl = keyspan_ioctl,
623 .set_termios = keyspan_set_termios, 607 .set_termios = keyspan_set_termios,
624 .break_ctl = keyspan_break_ctl, 608 .break_ctl = keyspan_break_ctl,
625 .tiocmget = keyspan_tiocmget, 609 .tiocmget = keyspan_tiocmget,
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
index 644a1eaaa376..040040a267d9 100644
--- a/drivers/usb/serial/keyspan_pda.c
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -10,8 +10,9 @@
10 * the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver 13 * See Documentation/usb/usb-serial.txt for more information on using this
14 * 14 * driver
15 *
15 * (09/07/2001) gkh 16 * (09/07/2001) gkh
16 * cleaned up the Xircom support. Added ids for Entregra device which is 17 * cleaned up the Xircom support. Added ids for Entregra device which is
17 * the same as the Xircom device. Enabled the code to be compiled for 18 * the same as the Xircom device. Enabled the code to be compiled for
@@ -21,23 +22,24 @@
21 * support for Xircom PGSDB9 22 * support for Xircom PGSDB9
22 * 23 *
23 * (05/31/2001) gkh 24 * (05/31/2001) gkh
24 * switched from using spinlock to a semaphore, which fixes lots of problems. 25 * switched from using spinlock to a semaphore, which fixes lots of
26 * problems.
25 * 27 *
26 * (04/08/2001) gb 28 * (04/08/2001) gb
27 * Identify version on module load. 29 * Identify version on module load.
28 * 30 *
29 * (11/01/2000) Adam J. Richter 31 * (11/01/2000) Adam J. Richter
30 * usb_device_id table support 32 * usb_device_id table support
31 * 33 *
32 * (10/05/2000) gkh 34 * (10/05/2000) gkh
33 * Fixed bug with urb->dev not being set properly, now that the usb 35 * Fixed bug with urb->dev not being set properly, now that the usb
34 * core needs it. 36 * core needs it.
35 * 37 *
36 * (08/28/2000) gkh 38 * (08/28/2000) gkh
37 * Added locks for SMP safeness. 39 * Added locks for SMP safeness.
38 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more 40 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
39 * than once. 41 * than once.
40 * 42 *
41 * (07/20/2000) borchers 43 * (07/20/2000) borchers
42 * - keyspan_pda_write no longer sleeps if it is called on interrupt time; 44 * - keyspan_pda_write no longer sleeps if it is called on interrupt time;
43 * PPP and the line discipline with stty echo on can call write on 45 * PPP and the line discipline with stty echo on can call write on
@@ -55,14 +57,14 @@
55 * than done directly from the callback to avoid the race in write_chan 57 * than done directly from the callback to avoid the race in write_chan
56 * - keyspan_pda_chars_in_buffer also indicates its buffer is full if the 58 * - keyspan_pda_chars_in_buffer also indicates its buffer is full if the
57 * urb status is -EINPROGRESS, meaning it cannot write at the moment 59 * urb status is -EINPROGRESS, meaning it cannot write at the moment
58 * 60 *
59 * (07/19/2000) gkh 61 * (07/19/2000) gkh
60 * Added module_init and module_exit functions to handle the fact that this 62 * Added module_init and module_exit functions to handle the fact that this
61 * driver is a loadable module now. 63 * driver is a loadable module now.
62 * 64 *
63 * (03/26/2000) gkh 65 * (03/26/2000) gkh
64 * Split driver up into device specific pieces. 66 * Split driver up into device specific pieces.
65 * 67 *
66 */ 68 */
67 69
68 70
@@ -78,7 +80,7 @@
78#include <linux/workqueue.h> 80#include <linux/workqueue.h>
79#include <linux/firmware.h> 81#include <linux/firmware.h>
80#include <linux/ihex.h> 82#include <linux/ihex.h>
81#include <asm/uaccess.h> 83#include <linux/uaccess.h>
82#include <linux/usb.h> 84#include <linux/usb.h>
83#include <linux/usb/serial.h> 85#include <linux/usb/serial.h>
84 86
@@ -135,7 +137,7 @@ static struct usb_device_id id_table_combined [] = {
135 { } /* Terminating entry */ 137 { } /* Terminating entry */
136}; 138};
137 139
138MODULE_DEVICE_TABLE (usb, id_table_combined); 140MODULE_DEVICE_TABLE(usb, id_table_combined);
139 141
140static struct usb_driver keyspan_pda_driver = { 142static struct usb_driver keyspan_pda_driver = {
141 .name = "keyspan_pda", 143 .name = "keyspan_pda",
@@ -159,9 +161,9 @@ static struct usb_device_id id_table_fake [] = {
159 161
160#ifdef XIRCOM 162#ifdef XIRCOM
161static struct usb_device_id id_table_fake_xircom [] = { 163static struct usb_device_id id_table_fake_xircom [] = {
162 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) }, 164 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
163 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) }, 165 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
164 { } 166 { }
165}; 167};
166#endif 168#endif
167 169
@@ -171,7 +173,7 @@ static void keyspan_pda_wakeup_write(struct work_struct *work)
171 container_of(work, struct keyspan_pda_private, wakeup_work); 173 container_of(work, struct keyspan_pda_private, wakeup_work);
172 struct usb_serial_port *port = priv->port; 174 struct usb_serial_port *port = priv->port;
173 175
174 tty_wakeup(port->tty); 176 tty_wakeup(port->port.tty);
175} 177}
176 178
177static void keyspan_pda_request_unthrottle(struct work_struct *work) 179static void keyspan_pda_request_unthrottle(struct work_struct *work)
@@ -184,7 +186,7 @@ static void keyspan_pda_request_unthrottle(struct work_struct *work)
184 dbg(" request_unthrottle"); 186 dbg(" request_unthrottle");
185 /* ask the device to tell us when the tx buffer becomes 187 /* ask the device to tell us when the tx buffer becomes
186 sufficiently empty */ 188 sufficiently empty */
187 result = usb_control_msg(serial->dev, 189 result = usb_control_msg(serial->dev,
188 usb_sndctrlpipe(serial->dev, 0), 190 usb_sndctrlpipe(serial->dev, 0),
189 7, /* request_unthrottle */ 191 7, /* request_unthrottle */
190 USB_TYPE_VENDOR | USB_RECIP_INTERFACE 192 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
@@ -195,17 +197,16 @@ static void keyspan_pda_request_unthrottle(struct work_struct *work)
195 0, 197 0,
196 2000); 198 2000);
197 if (result < 0) 199 if (result < 0)
198 dbg("%s - error %d from usb_control_msg", 200 dbg("%s - error %d from usb_control_msg",
199 __func__, result); 201 __func__, result);
200} 202}
201 203
202 204
203static void keyspan_pda_rx_interrupt (struct urb *urb) 205static void keyspan_pda_rx_interrupt(struct urb *urb)
204{ 206{
205 struct usb_serial_port *port = urb->context; 207 struct usb_serial_port *port = urb->context;
206 struct tty_struct *tty = port->tty; 208 struct tty_struct *tty = port->port.tty;
207 unsigned char *data = urb->transfer_buffer; 209 unsigned char *data = urb->transfer_buffer;
208 int i;
209 int retval; 210 int retval;
210 int status = urb->status; 211 int status = urb->status;
211 struct keyspan_pda_private *priv; 212 struct keyspan_pda_private *priv;
@@ -228,14 +229,13 @@ static void keyspan_pda_rx_interrupt (struct urb *urb)
228 goto exit; 229 goto exit;
229 } 230 }
230 231
231 /* see if the message is data or a status interrupt */ 232 /* see if the message is data or a status interrupt */
232 switch (data[0]) { 233 switch (data[0]) {
233 case 0: 234 case 0:
234 /* rest of message is rx data */ 235 /* rest of message is rx data */
235 if (urb->actual_length) { 236 if (urb->actual_length) {
236 for (i = 1; i < urb->actual_length ; ++i) { 237 tty_insert_flip_string(tty, data + 1,
237 tty_insert_flip_char(tty, data[i], 0); 238 urb->actual_length - 1);
238 }
239 tty_flip_buffer_push(tty); 239 tty_flip_buffer_push(tty);
240 } 240 }
241 break; 241 break;
@@ -259,14 +259,14 @@ static void keyspan_pda_rx_interrupt (struct urb *urb)
259 } 259 }
260 260
261exit: 261exit:
262 retval = usb_submit_urb (urb, GFP_ATOMIC); 262 retval = usb_submit_urb(urb, GFP_ATOMIC);
263 if (retval) 263 if (retval)
264 err ("%s - usb_submit_urb failed with result %d", 264 err("%s - usb_submit_urb failed with result %d",
265 __func__, retval); 265 __func__, retval);
266} 266}
267 267
268 268
269static void keyspan_pda_rx_throttle (struct usb_serial_port *port) 269static void keyspan_pda_rx_throttle(struct tty_struct *tty)
270{ 270{
271 /* stop receiving characters. We just turn off the URB request, and 271 /* stop receiving characters. We just turn off the URB request, and
272 let chars pile up in the device. If we're doing hardware 272 let chars pile up in the device. If we're doing hardware
@@ -274,14 +274,15 @@ static void keyspan_pda_rx_throttle (struct usb_serial_port *port)
274 fills up. If we're doing XON/XOFF, this would be a good time to 274 fills up. If we're doing XON/XOFF, this would be a good time to
275 send an XOFF, although it might make sense to foist that off 275 send an XOFF, although it might make sense to foist that off
276 upon the device too. */ 276 upon the device too. */
277 277 struct usb_serial_port *port = tty->driver_data;
278 dbg("keyspan_pda_rx_throttle port %d", port->number); 278 dbg("keyspan_pda_rx_throttle port %d", port->number);
279 usb_kill_urb(port->interrupt_in_urb); 279 usb_kill_urb(port->interrupt_in_urb);
280} 280}
281 281
282 282
283static void keyspan_pda_rx_unthrottle (struct usb_serial_port *port) 283static void keyspan_pda_rx_unthrottle(struct tty_struct *tty)
284{ 284{
285 struct usb_serial_port *port = tty->driver_data;
285 /* just restart the receive interrupt URB */ 286 /* just restart the receive interrupt URB */
286 dbg("keyspan_pda_rx_unthrottle port %d", port->number); 287 dbg("keyspan_pda_rx_unthrottle port %d", port->number);
287 port->interrupt_in_urb->dev = port->serial->dev; 288 port->interrupt_in_urb->dev = port->serial->dev;
@@ -291,32 +292,52 @@ static void keyspan_pda_rx_unthrottle (struct usb_serial_port *port)
291} 292}
292 293
293 294
294static speed_t keyspan_pda_setbaud (struct usb_serial *serial, speed_t baud) 295static speed_t keyspan_pda_setbaud(struct usb_serial *serial, speed_t baud)
295{ 296{
296 int rc; 297 int rc;
297 int bindex; 298 int bindex;
298 299
299 switch(baud) { 300 switch (baud) {
300 case 110: bindex = 0; break; 301 case 110:
301 case 300: bindex = 1; break; 302 bindex = 0;
302 case 1200: bindex = 2; break; 303 break;
303 case 2400: bindex = 3; break; 304 case 300:
304 case 4800: bindex = 4; break; 305 bindex = 1;
305 case 9600: bindex = 5; break; 306 break;
306 case 19200: bindex = 6; break; 307 case 1200:
307 case 38400: bindex = 7; break; 308 bindex = 2;
308 case 57600: bindex = 8; break; 309 break;
309 case 115200: bindex = 9; break; 310 case 2400:
310 default: 311 bindex = 3;
311 bindex = 5; /* Default to 9600 */ 312 break;
312 baud = 9600; 313 case 4800:
314 bindex = 4;
315 break;
316 case 9600:
317 bindex = 5;
318 break;
319 case 19200:
320 bindex = 6;
321 break;
322 case 38400:
323 bindex = 7;
324 break;
325 case 57600:
326 bindex = 8;
327 break;
328 case 115200:
329 bindex = 9;
330 break;
331 default:
332 bindex = 5; /* Default to 9600 */
333 baud = 9600;
313 } 334 }
314 335
315 /* rather than figure out how to sleep while waiting for this 336 /* rather than figure out how to sleep while waiting for this
316 to complete, I just use the "legacy" API. */ 337 to complete, I just use the "legacy" API. */
317 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 338 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
318 0, /* set baud */ 339 0, /* set baud */
319 USB_TYPE_VENDOR 340 USB_TYPE_VENDOR
320 | USB_RECIP_INTERFACE 341 | USB_RECIP_INTERFACE
321 | USB_DIR_OUT, /* type */ 342 | USB_DIR_OUT, /* type */
322 bindex, /* value */ 343 bindex, /* value */
@@ -330,8 +351,9 @@ static speed_t keyspan_pda_setbaud (struct usb_serial *serial, speed_t baud)
330} 351}
331 352
332 353
333static void keyspan_pda_break_ctl (struct usb_serial_port *port, int break_state) 354static void keyspan_pda_break_ctl(struct tty_struct *tty, int break_state)
334{ 355{
356 struct usb_serial_port *port = tty->driver_data;
335 struct usb_serial *serial = port->serial; 357 struct usb_serial *serial = port->serial;
336 int value; 358 int value;
337 int result; 359 int result;
@@ -341,11 +363,11 @@ static void keyspan_pda_break_ctl (struct usb_serial_port *port, int break_state
341 else 363 else
342 value = 0; /* clear break */ 364 value = 0; /* clear break */
343 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 365 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
344 4, /* set break */ 366 4, /* set break */
345 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT, 367 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
346 value, 0, NULL, 0, 2000); 368 value, 0, NULL, 0, 2000);
347 if (result < 0) 369 if (result < 0)
348 dbg("%s - error %d from usb_control_msg", 370 dbg("%s - error %d from usb_control_msg",
349 __func__, result); 371 __func__, result);
350 /* there is something funky about this.. the TCSBRK that 'cu' performs 372 /* there is something funky about this.. the TCSBRK that 'cu' performs
351 ought to translate into a break_ctl(-1),break_ctl(0) pair HZ/4 373 ought to translate into a break_ctl(-1),break_ctl(0) pair HZ/4
@@ -354,8 +376,8 @@ static void keyspan_pda_break_ctl (struct usb_serial_port *port, int break_state
354} 376}
355 377
356 378
357static void keyspan_pda_set_termios (struct usb_serial_port *port, 379static void keyspan_pda_set_termios(struct tty_struct *tty,
358 struct ktermios *old_termios) 380 struct usb_serial_port *port, struct ktermios *old_termios)
359{ 381{
360 struct usb_serial *serial = port->serial; 382 struct usb_serial *serial = port->serial;
361 speed_t speed; 383 speed_t speed;
@@ -380,7 +402,7 @@ static void keyspan_pda_set_termios (struct usb_serial_port *port,
380 402
381 For now, just do baud. */ 403 For now, just do baud. */
382 404
383 speed = tty_get_baud_rate(port->tty); 405 speed = tty_get_baud_rate(tty);
384 speed = keyspan_pda_setbaud(serial, speed); 406 speed = keyspan_pda_setbaud(serial, speed);
385 407
386 if (speed == 0) { 408 if (speed == 0) {
@@ -390,8 +412,8 @@ static void keyspan_pda_set_termios (struct usb_serial_port *port,
390 } 412 }
391 /* Only speed can change so copy the old h/w parameters 413 /* Only speed can change so copy the old h/w parameters
392 then encode the new speed */ 414 then encode the new speed */
393 tty_termios_copy_hw(port->tty->termios, old_termios); 415 tty_termios_copy_hw(tty->termios, old_termios);
394 tty_encode_baud_rate(port->tty, speed, speed); 416 tty_encode_baud_rate(tty, speed, speed);
395} 417}
396 418
397 419
@@ -408,7 +430,7 @@ static int keyspan_pda_get_modem_info(struct usb_serial *serial,
408 3, /* get pins */ 430 3, /* get pins */
409 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN, 431 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
410 0, 0, &data, 1, 2000); 432 0, 0, &data, 1, 2000);
411 if (rc > 0) 433 if (rc >= 0)
412 *value = data; 434 *value = data;
413 return rc; 435 return rc;
414} 436}
@@ -425,8 +447,9 @@ static int keyspan_pda_set_modem_info(struct usb_serial *serial,
425 return rc; 447 return rc;
426} 448}
427 449
428static int keyspan_pda_tiocmget(struct usb_serial_port *port, struct file *file) 450static int keyspan_pda_tiocmget(struct tty_struct *tty, struct file *file)
429{ 451{
452 struct usb_serial_port *port = tty->driver_data;
430 struct usb_serial *serial = port->serial; 453 struct usb_serial *serial = port->serial;
431 int rc; 454 int rc;
432 unsigned char status; 455 unsigned char status;
@@ -445,9 +468,10 @@ static int keyspan_pda_tiocmget(struct usb_serial_port *port, struct file *file)
445 return value; 468 return value;
446} 469}
447 470
448static int keyspan_pda_tiocmset(struct usb_serial_port *port, struct file *file, 471static int keyspan_pda_tiocmset(struct tty_struct *tty, struct file *file,
449 unsigned int set, unsigned int clear) 472 unsigned int set, unsigned int clear)
450{ 473{
474 struct usb_serial_port *port = tty->driver_data;
451 struct usb_serial *serial = port->serial; 475 struct usb_serial *serial = port->serial;
452 int rc; 476 int rc;
453 unsigned char status; 477 unsigned char status;
@@ -469,23 +493,8 @@ static int keyspan_pda_tiocmset(struct usb_serial_port *port, struct file *file,
469 return rc; 493 return rc;
470} 494}
471 495
472static int keyspan_pda_ioctl(struct usb_serial_port *port, struct file *file, 496static int keyspan_pda_write(struct tty_struct *tty,
473 unsigned int cmd, unsigned long arg) 497 struct usb_serial_port *port, const unsigned char *buf, int count)
474{
475 switch (cmd) {
476 case TIOCMIWAIT:
477 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
478 /* TODO */
479 case TIOCGICOUNT:
480 /* return count of modemline transitions */
481 return 0; /* TODO */
482 }
483
484 return -ENOIOCTLCMD;
485}
486
487static int keyspan_pda_write(struct usb_serial_port *port,
488 const unsigned char *buf, int count)
489{ 498{
490 struct usb_serial *serial = port->serial; 499 struct usb_serial *serial = port->serial;
491 int request_unthrottle = 0; 500 int request_unthrottle = 0;
@@ -501,10 +510,10 @@ static int keyspan_pda_write(struct usb_serial_port *port,
501 select() or poll() too) until we receive that unthrottle interrupt. 510 select() or poll() too) until we receive that unthrottle interrupt.
502 Block if we can't write anything at all, otherwise write as much as 511 Block if we can't write anything at all, otherwise write as much as
503 we can. */ 512 we can. */
504 dbg("keyspan_pda_write(%d)",count); 513 dbg("keyspan_pda_write(%d)", count);
505 if (count == 0) { 514 if (count == 0) {
506 dbg(" write request of 0 bytes"); 515 dbg(" write request of 0 bytes");
507 return (0); 516 return 0;
508 } 517 }
509 518
510 /* we might block because of: 519 /* we might block because of:
@@ -531,7 +540,7 @@ static int keyspan_pda_write(struct usb_serial_port *port,
531 scheduler time, since usb_control_msg() sleeps. */ 540 scheduler time, since usb_control_msg() sleeps. */
532 if (count > priv->tx_room && !in_interrupt()) { 541 if (count > priv->tx_room && !in_interrupt()) {
533 unsigned char room; 542 unsigned char room;
534 rc = usb_control_msg(serial->dev, 543 rc = usb_control_msg(serial->dev,
535 usb_rcvctrlpipe(serial->dev, 0), 544 usb_rcvctrlpipe(serial->dev, 0),
536 6, /* write_room */ 545 6, /* write_room */
537 USB_TYPE_VENDOR | USB_RECIP_INTERFACE 546 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
@@ -562,7 +571,7 @@ static int keyspan_pda_write(struct usb_serial_port *port,
562 571
563 if (count) { 572 if (count) {
564 /* now transfer data */ 573 /* now transfer data */
565 memcpy (port->write_urb->transfer_buffer, buf, count); 574 memcpy(port->write_urb->transfer_buffer, buf, count);
566 /* send the data out the bulk port */ 575 /* send the data out the bulk port */
567 port->write_urb->transfer_buffer_length = count; 576 port->write_urb->transfer_buffer_length = count;
568 577
@@ -574,8 +583,7 @@ static int keyspan_pda_write(struct usb_serial_port *port,
574 dbg(" usb_submit_urb(write bulk) failed"); 583 dbg(" usb_submit_urb(write bulk) failed");
575 goto exit; 584 goto exit;
576 } 585 }
577 } 586 } else {
578 else {
579 /* There wasn't any room left, so we are throttled until 587 /* There wasn't any room left, so we are throttled until
580 the buffer empties a bit */ 588 the buffer empties a bit */
581 request_unthrottle = 1; 589 request_unthrottle = 1;
@@ -594,7 +602,7 @@ exit:
594} 602}
595 603
596 604
597static void keyspan_pda_write_bulk_callback (struct urb *urb) 605static void keyspan_pda_write_bulk_callback(struct urb *urb)
598{ 606{
599 struct usb_serial_port *port = urb->context; 607 struct usb_serial_port *port = urb->context;
600 struct keyspan_pda_private *priv; 608 struct keyspan_pda_private *priv;
@@ -607,22 +615,21 @@ static void keyspan_pda_write_bulk_callback (struct urb *urb)
607} 615}
608 616
609 617
610static int keyspan_pda_write_room (struct usb_serial_port *port) 618static int keyspan_pda_write_room(struct tty_struct *tty)
611{ 619{
620 struct usb_serial_port *port = tty->driver_data;
612 struct keyspan_pda_private *priv; 621 struct keyspan_pda_private *priv;
613
614 priv = usb_get_serial_port_data(port); 622 priv = usb_get_serial_port_data(port);
615
616 /* used by n_tty.c for processing of tabs and such. Giving it our 623 /* used by n_tty.c for processing of tabs and such. Giving it our
617 conservative guess is probably good enough, but needs testing by 624 conservative guess is probably good enough, but needs testing by
618 running a console through the device. */ 625 running a console through the device. */
619 626 return priv->tx_room;
620 return (priv->tx_room);
621} 627}
622 628
623 629
624static int keyspan_pda_chars_in_buffer (struct usb_serial_port *port) 630static int keyspan_pda_chars_in_buffer(struct tty_struct *tty)
625{ 631{
632 struct usb_serial_port *port = tty->driver_data;
626 struct keyspan_pda_private *priv; 633 struct keyspan_pda_private *priv;
627 unsigned long flags; 634 unsigned long flags;
628 int ret = 0; 635 int ret = 0;
@@ -640,7 +647,8 @@ static int keyspan_pda_chars_in_buffer (struct usb_serial_port *port)
640} 647}
641 648
642 649
643static int keyspan_pda_open (struct usb_serial_port *port, struct file *filp) 650static int keyspan_pda_open(struct tty_struct *tty,
651 struct usb_serial_port *port, struct file *filp)
644{ 652{
645 struct usb_serial *serial = port->serial; 653 struct usb_serial *serial = port->serial;
646 unsigned char room; 654 unsigned char room;
@@ -672,8 +680,8 @@ static int keyspan_pda_open (struct usb_serial_port *port, struct file *filp)
672 680
673 /* the normal serial device seems to always turn on DTR and RTS here, 681 /* the normal serial device seems to always turn on DTR and RTS here,
674 so do the same */ 682 so do the same */
675 if (port->tty->termios->c_cflag & CBAUD) 683 if (tty && (tty->termios->c_cflag & CBAUD))
676 keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2) ); 684 keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2));
677 else 685 else
678 keyspan_pda_set_modem_info(serial, 0); 686 keyspan_pda_set_modem_info(serial, 0);
679 687
@@ -690,13 +698,15 @@ error:
690} 698}
691 699
692 700
693static void keyspan_pda_close(struct usb_serial_port *port, struct file *filp) 701static void keyspan_pda_close(struct tty_struct *tty,
702 struct usb_serial_port *port, struct file *filp)
694{ 703{
695 struct usb_serial *serial = port->serial; 704 struct usb_serial *serial = port->serial;
696 705
697 if (serial->dev) { 706 if (serial->dev) {
698 /* the normal serial device seems to always shut off DTR and RTS now */ 707 /* the normal serial device seems to always shut
699 if (port->tty->termios->c_cflag & HUPCL) 708 off DTR and RTS now */
709 if (tty->termios->c_cflag & HUPCL)
700 keyspan_pda_set_modem_info(serial, 0); 710 keyspan_pda_set_modem_info(serial, 0);
701 711
702 /* shutdown our bulk reads and writes */ 712 /* shutdown our bulk reads and writes */
@@ -707,7 +717,7 @@ static void keyspan_pda_close(struct usb_serial_port *port, struct file *filp)
707 717
708 718
709/* download the firmware to a "fake" device (pre-renumeration) */ 719/* download the firmware to a "fake" device (pre-renumeration) */
710static int keyspan_pda_fake_startup (struct usb_serial *serial) 720static int keyspan_pda_fake_startup(struct usb_serial *serial)
711{ 721{
712 int response; 722 int response;
713 const char *fw_name; 723 const char *fw_name;
@@ -756,10 +766,10 @@ static int keyspan_pda_fake_startup (struct usb_serial *serial)
756 response = ezusb_set_reset(serial, 0); 766 response = ezusb_set_reset(serial, 0);
757 767
758 /* we want this device to fail to have a driver assigned to it. */ 768 /* we want this device to fail to have a driver assigned to it. */
759 return (1); 769 return 1;
760} 770}
761 771
762static int keyspan_pda_startup (struct usb_serial *serial) 772static int keyspan_pda_startup(struct usb_serial *serial)
763{ 773{
764 774
765 struct keyspan_pda_private *priv; 775 struct keyspan_pda_private *priv;
@@ -769,20 +779,20 @@ static int keyspan_pda_startup (struct usb_serial *serial)
769 779
770 priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL); 780 priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL);
771 if (!priv) 781 if (!priv)
772 return (1); /* error */ 782 return 1; /* error */
773 usb_set_serial_port_data(serial->port[0], priv); 783 usb_set_serial_port_data(serial->port[0], priv);
774 init_waitqueue_head(&serial->port[0]->write_wait); 784 init_waitqueue_head(&serial->port[0]->write_wait);
775 INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write); 785 INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write);
776 INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle); 786 INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle);
777 priv->serial = serial; 787 priv->serial = serial;
778 priv->port = serial->port[0]; 788 priv->port = serial->port[0];
779 return (0); 789 return 0;
780} 790}
781 791
782static void keyspan_pda_shutdown (struct usb_serial *serial) 792static void keyspan_pda_shutdown(struct usb_serial *serial)
783{ 793{
784 dbg("%s", __func__); 794 dbg("%s", __func__);
785 795
786 kfree(usb_get_serial_port_data(serial->port[0])); 796 kfree(usb_get_serial_port_data(serial->port[0]));
787} 797}
788 798
@@ -832,7 +842,6 @@ static struct usb_serial_driver keyspan_pda_device = {
832 .chars_in_buffer = keyspan_pda_chars_in_buffer, 842 .chars_in_buffer = keyspan_pda_chars_in_buffer,
833 .throttle = keyspan_pda_rx_throttle, 843 .throttle = keyspan_pda_rx_throttle,
834 .unthrottle = keyspan_pda_rx_unthrottle, 844 .unthrottle = keyspan_pda_rx_unthrottle,
835 .ioctl = keyspan_pda_ioctl,
836 .set_termios = keyspan_pda_set_termios, 845 .set_termios = keyspan_pda_set_termios,
837 .break_ctl = keyspan_pda_break_ctl, 846 .break_ctl = keyspan_pda_break_ctl,
838 .tiocmget = keyspan_pda_tiocmget, 847 .tiocmget = keyspan_pda_tiocmget,
@@ -842,7 +851,7 @@ static struct usb_serial_driver keyspan_pda_device = {
842}; 851};
843 852
844 853
845static int __init keyspan_pda_init (void) 854static int __init keyspan_pda_init(void)
846{ 855{
847 int retval; 856 int retval;
848 retval = usb_serial_register(&keyspan_pda_device); 857 retval = usb_serial_register(&keyspan_pda_device);
@@ -863,7 +872,7 @@ static int __init keyspan_pda_init (void)
863 goto failed_usb_register; 872 goto failed_usb_register;
864 info(DRIVER_DESC " " DRIVER_VERSION); 873 info(DRIVER_DESC " " DRIVER_VERSION);
865 return 0; 874 return 0;
866failed_usb_register: 875failed_usb_register:
867#ifdef XIRCOM 876#ifdef XIRCOM
868 usb_serial_deregister(&xircom_pgs_fake_device); 877 usb_serial_deregister(&xircom_pgs_fake_device);
869failed_xircom_register: 878failed_xircom_register:
@@ -880,15 +889,15 @@ failed_pda_register:
880} 889}
881 890
882 891
883static void __exit keyspan_pda_exit (void) 892static void __exit keyspan_pda_exit(void)
884{ 893{
885 usb_deregister (&keyspan_pda_driver); 894 usb_deregister(&keyspan_pda_driver);
886 usb_serial_deregister (&keyspan_pda_device); 895 usb_serial_deregister(&keyspan_pda_device);
887#ifdef KEYSPAN 896#ifdef KEYSPAN
888 usb_serial_deregister (&keyspan_pda_fake_device); 897 usb_serial_deregister(&keyspan_pda_fake_device);
889#endif 898#endif
890#ifdef XIRCOM 899#ifdef XIRCOM
891 usb_serial_deregister (&xircom_pgs_fake_device); 900 usb_serial_deregister(&xircom_pgs_fake_device);
892#endif 901#endif
893} 902}
894 903
@@ -896,8 +905,8 @@ static void __exit keyspan_pda_exit (void)
896module_init(keyspan_pda_init); 905module_init(keyspan_pda_init);
897module_exit(keyspan_pda_exit); 906module_exit(keyspan_pda_exit);
898 907
899MODULE_AUTHOR( DRIVER_AUTHOR ); 908MODULE_AUTHOR(DRIVER_AUTHOR);
900MODULE_DESCRIPTION( DRIVER_DESC ); 909MODULE_DESCRIPTION(DRIVER_DESC);
901MODULE_LICENSE("GPL"); 910MODULE_LICENSE("GPL");
902 911
903module_param(debug, bool, S_IRUGO | S_IWUSR); 912module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
index f328948d74e3..b84dddc71124 100644
--- a/drivers/usb/serial/kl5kusb105.c
+++ b/drivers/usb/serial/kl5kusb105.c
@@ -15,12 +15,12 @@
15 * Neither Palm, nor their contractor (MCCI) or their supplier (KLSI) provided 15 * Neither Palm, nor their contractor (MCCI) or their supplier (KLSI) provided
16 * information that was not already available. 16 * information that was not already available.
17 * 17 *
18 * It seems that KLSI bought some silicon-design information from ScanLogic, 18 * It seems that KLSI bought some silicon-design information from ScanLogic,
19 * whose SL11R processor is at the core of the KL5KUSB chipset from KLSI. 19 * whose SL11R processor is at the core of the KL5KUSB chipset from KLSI.
20 * KLSI has firmware available for their devices; it is probable that the 20 * KLSI has firmware available for their devices; it is probable that the
21 * firmware differs from that used by KLSI in their products. If you have an 21 * firmware differs from that used by KLSI in their products. If you have an
22 * original KLSI device and can provide some information on it, I would be 22 * original KLSI device and can provide some information on it, I would be
23 * most interested in adding support for it here. If you have any information 23 * most interested in adding support for it here. If you have any information
24 * on the protocol used (or find errors in my reverse-engineered stuff), please 24 * on the protocol used (or find errors in my reverse-engineered stuff), please
25 * let me know. 25 * let me know.
26 * 26 *
@@ -40,7 +40,7 @@
40 * 0.2 - TIOCMGET works, so autopilot(1) can be used! 40 * 0.2 - TIOCMGET works, so autopilot(1) can be used!
41 * 0.1 - can be used to to pilot-xfer -p /dev/ttyUSB0 -l 41 * 0.1 - can be used to to pilot-xfer -p /dev/ttyUSB0 -l
42 * 42 *
43 * The driver skeleton is mainly based on mct_u232.c and various other 43 * The driver skeleton is mainly based on mct_u232.c and various other
44 * pieces of code shamelessly copied from the drivers/usb/serial/ directory. 44 * pieces of code shamelessly copied from the drivers/usb/serial/ directory.
45 */ 45 */
46 46
@@ -53,7 +53,7 @@
53#include <linux/tty_driver.h> 53#include <linux/tty_driver.h>
54#include <linux/tty_flip.h> 54#include <linux/tty_flip.h>
55#include <linux/module.h> 55#include <linux/module.h>
56#include <asm/uaccess.h> 56#include <linux/uaccess.h>
57#include <asm/unaligned.h> 57#include <asm/unaligned.h>
58#include <linux/usb.h> 58#include <linux/usb.h>
59#include <linux/usb/serial.h> 59#include <linux/usb/serial.h>
@@ -72,33 +72,25 @@ static int debug;
72/* 72/*
73 * Function prototypes 73 * Function prototypes
74 */ 74 */
75static int klsi_105_startup (struct usb_serial *serial); 75static int klsi_105_startup(struct usb_serial *serial);
76static void klsi_105_shutdown (struct usb_serial *serial); 76static void klsi_105_shutdown(struct usb_serial *serial);
77static int klsi_105_open (struct usb_serial_port *port, 77static int klsi_105_open(struct tty_struct *tty,
78 struct file *filp); 78 struct usb_serial_port *port, struct file *filp);
79static void klsi_105_close (struct usb_serial_port *port, 79static void klsi_105_close(struct tty_struct *tty,
80 struct file *filp); 80 struct usb_serial_port *port, struct file *filp);
81static int klsi_105_write (struct usb_serial_port *port, 81static int klsi_105_write(struct tty_struct *tty,
82 const unsigned char *buf, 82 struct usb_serial_port *port, const unsigned char *buf, int count);
83 int count); 83static void klsi_105_write_bulk_callback(struct urb *urb);
84static void klsi_105_write_bulk_callback (struct urb *urb); 84static int klsi_105_chars_in_buffer(struct tty_struct *tty);
85static int klsi_105_chars_in_buffer (struct usb_serial_port *port); 85static int klsi_105_write_room(struct tty_struct *tty);
86static int klsi_105_write_room (struct usb_serial_port *port); 86static void klsi_105_read_bulk_callback(struct urb *urb);
87 87static void klsi_105_set_termios(struct tty_struct *tty,
88static void klsi_105_read_bulk_callback (struct urb *urb); 88 struct usb_serial_port *port, struct ktermios *old);
89static void klsi_105_set_termios (struct usb_serial_port *port, 89static void klsi_105_throttle(struct tty_struct *tty);
90 struct ktermios *old); 90static void klsi_105_unthrottle(struct tty_struct *tty);
91static void klsi_105_throttle (struct usb_serial_port *port); 91static int klsi_105_tiocmget(struct tty_struct *tty, struct file *file);
92static void klsi_105_unthrottle (struct usb_serial_port *port); 92static int klsi_105_tiocmset(struct tty_struct *tty, struct file *file,
93/* 93 unsigned int set, unsigned int clear);
94static void klsi_105_break_ctl (struct usb_serial_port *port,
95 int break_state );
96 */
97static int klsi_105_tiocmget (struct usb_serial_port *port,
98 struct file *file);
99static int klsi_105_tiocmset (struct usb_serial_port *port,
100 struct file *file, unsigned int set,
101 unsigned int clear);
102 94
103/* 95/*
104 * All of the device info needed for the KLSI converters. 96 * All of the device info needed for the KLSI converters.
@@ -109,7 +101,7 @@ static struct usb_device_id id_table [] = {
109 { } /* Terminating entry */ 101 { } /* Terminating entry */
110}; 102};
111 103
112MODULE_DEVICE_TABLE (usb, id_table); 104MODULE_DEVICE_TABLE(usb, id_table);
113 105
114static struct usb_driver kl5kusb105d_driver = { 106static struct usb_driver kl5kusb105d_driver = {
115 .name = "kl5kusb105d", 107 .name = "kl5kusb105d",
@@ -134,7 +126,7 @@ static struct usb_serial_driver kl5kusb105d_device = {
134 .write_bulk_callback = klsi_105_write_bulk_callback, 126 .write_bulk_callback = klsi_105_write_bulk_callback,
135 .chars_in_buffer = klsi_105_chars_in_buffer, 127 .chars_in_buffer = klsi_105_chars_in_buffer,
136 .write_room = klsi_105_write_room, 128 .write_room = klsi_105_write_room,
137 .read_bulk_callback =klsi_105_read_bulk_callback, 129 .read_bulk_callback = klsi_105_read_bulk_callback,
138 .set_termios = klsi_105_set_termios, 130 .set_termios = klsi_105_set_termios,
139 /*.break_ctl = klsi_105_break_ctl,*/ 131 /*.break_ctl = klsi_105_break_ctl,*/
140 .tiocmget = klsi_105_tiocmget, 132 .tiocmget = klsi_105_tiocmget,
@@ -161,7 +153,7 @@ struct klsi_105_private {
161 struct ktermios termios; 153 struct ktermios termios;
162 unsigned long line_state; /* modem line settings */ 154 unsigned long line_state; /* modem line settings */
163 /* write pool */ 155 /* write pool */
164 struct urb * write_urb_pool[NUM_URBS]; 156 struct urb *write_urb_pool[NUM_URBS];
165 spinlock_t lock; 157 spinlock_t lock;
166 unsigned long bytes_in; 158 unsigned long bytes_in;
167 unsigned long bytes_out; 159 unsigned long bytes_out;
@@ -180,15 +172,15 @@ static int klsi_105_chg_port_settings(struct usb_serial_port *port,
180{ 172{
181 int rc; 173 int rc;
182 174
183 rc = usb_control_msg(port->serial->dev, 175 rc = usb_control_msg(port->serial->dev,
184 usb_sndctrlpipe(port->serial->dev, 0), 176 usb_sndctrlpipe(port->serial->dev, 0),
185 KL5KUSB105A_SIO_SET_DATA, 177 KL5KUSB105A_SIO_SET_DATA,
186 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_INTERFACE, 178 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_INTERFACE,
187 0, /* value */ 179 0, /* value */
188 0, /* index */ 180 0, /* index */
189 settings, 181 settings,
190 sizeof(struct klsi_105_port_settings), 182 sizeof(struct klsi_105_port_settings),
191 KLSI_TIMEOUT); 183 KLSI_TIMEOUT);
192 if (rc < 0) 184 if (rc < 0)
193 err("Change port settings failed (error = %d)", rc); 185 err("Change port settings failed (error = %d)", rc);
194 info("%s - %d byte block, baudrate %x, databits %d, u1 %d, u2 %d", 186 info("%s - %d byte block, baudrate %x, databits %d, u1 %d, u2 %d",
@@ -196,7 +188,7 @@ static int klsi_105_chg_port_settings(struct usb_serial_port *port,
196 settings->pktlen, 188 settings->pktlen,
197 settings->baudrate, settings->databits, 189 settings->baudrate, settings->databits,
198 settings->unknown1, settings->unknown2); 190 settings->unknown1, settings->unknown2);
199 return rc; 191 return rc;
200} /* klsi_105_chg_port_settings */ 192} /* klsi_105_chg_port_settings */
201 193
202/* translate a 16-bit status value from the device to linux's TIO bits */ 194/* translate a 16-bit status value from the device to linux's TIO bits */
@@ -210,9 +202,9 @@ static unsigned long klsi_105_status2linestate(const __u16 status)
210 202
211 return res; 203 return res;
212} 204}
213/* 205/*
214 * Read line control via vendor command and return result through 206 * Read line control via vendor command and return result through
215 * *line_state_p 207 * *line_state_p
216 */ 208 */
217/* It seems that the status buffer has always only 2 bytes length */ 209/* It seems that the status buffer has always only 2 bytes length */
218#define KLSI_STATUSBUF_LEN 2 210#define KLSI_STATUSBUF_LEN 2
@@ -220,14 +212,14 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
220 unsigned long *line_state_p) 212 unsigned long *line_state_p)
221{ 213{
222 int rc; 214 int rc;
223 __u8 status_buf[KLSI_STATUSBUF_LEN] = { -1,-1}; 215 __u8 status_buf[KLSI_STATUSBUF_LEN] = { -1, -1};
224 __u16 status; 216 __u16 status;
225 217
226 info("%s - sending SIO Poll request", __func__); 218 info("%s - sending SIO Poll request", __func__);
227 rc = usb_control_msg(port->serial->dev, 219 rc = usb_control_msg(port->serial->dev,
228 usb_rcvctrlpipe(port->serial->dev, 0), 220 usb_rcvctrlpipe(port->serial->dev, 0),
229 KL5KUSB105A_SIO_POLL, 221 KL5KUSB105A_SIO_POLL,
230 USB_TYPE_VENDOR | USB_DIR_IN, 222 USB_TYPE_VENDOR | USB_DIR_IN,
231 0, /* value */ 223 0, /* value */
232 0, /* index */ 224 0, /* index */
233 status_buf, KLSI_STATUSBUF_LEN, 225 status_buf, KLSI_STATUSBUF_LEN,
@@ -236,15 +228,14 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
236 if (rc < 0) 228 if (rc < 0)
237 err("Reading line status failed (error = %d)", rc); 229 err("Reading line status failed (error = %d)", rc);
238 else { 230 else {
239 status = le16_to_cpu(get_unaligned((__le16 *)status_buf)); 231 status = get_unaligned_le16(status_buf);
240 232
241 info("%s - read status %x %x", __func__, 233 info("%s - read status %x %x", __func__,
242 status_buf[0], status_buf[1]); 234 status_buf[0], status_buf[1]);
243 235
244 *line_state_p = klsi_105_status2linestate(status); 236 *line_state_p = klsi_105_status2linestate(status);
245 } 237 }
246 238 return rc;
247 return rc;
248} 239}
249 240
250 241
@@ -252,7 +243,7 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
252 * Driver's tty interface functions 243 * Driver's tty interface functions
253 */ 244 */
254 245
255static int klsi_105_startup (struct usb_serial *serial) 246static int klsi_105_startup(struct usb_serial *serial)
256{ 247{
257 struct klsi_105_private *priv; 248 struct klsi_105_private *priv;
258 int i, j; 249 int i, j;
@@ -262,7 +253,7 @@ static int klsi_105_startup (struct usb_serial *serial)
262 */ 253 */
263 254
264 /* allocate the private data structure */ 255 /* allocate the private data structure */
265 for (i=0; i<serial->num_ports; i++) { 256 for (i = 0; i < serial->num_ports; i++) {
266 priv = kmalloc(sizeof(struct klsi_105_private), 257 priv = kmalloc(sizeof(struct klsi_105_private),
267 GFP_KERNEL); 258 GFP_KERNEL);
268 if (!priv) { 259 if (!priv) {
@@ -283,9 +274,9 @@ static int klsi_105_startup (struct usb_serial *serial)
283 priv->bytes_out = 0; 274 priv->bytes_out = 0;
284 usb_set_serial_port_data(serial->port[i], priv); 275 usb_set_serial_port_data(serial->port[i], priv);
285 276
286 spin_lock_init (&priv->lock); 277 spin_lock_init(&priv->lock);
287 for (j=0; j<NUM_URBS; j++) { 278 for (j = 0; j < NUM_URBS; j++) {
288 struct urb* urb = usb_alloc_urb(0, GFP_KERNEL); 279 struct urb *urb = usb_alloc_urb(0, GFP_KERNEL);
289 280
290 priv->write_urb_pool[j] = urb; 281 priv->write_urb_pool[j] = urb;
291 if (urb == NULL) { 282 if (urb == NULL) {
@@ -293,10 +284,11 @@ static int klsi_105_startup (struct usb_serial *serial)
293 goto err_cleanup; 284 goto err_cleanup;
294 } 285 }
295 286
296 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, 287 urb->transfer_buffer =
297 GFP_KERNEL); 288 kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
298 if (!urb->transfer_buffer) { 289 if (!urb->transfer_buffer) {
299 err("%s - out of memory for urb buffers.", __func__); 290 err("%s - out of memory for urb buffers.",
291 __func__);
300 goto err_cleanup; 292 goto err_cleanup;
301 } 293 }
302 } 294 }
@@ -304,13 +296,13 @@ static int klsi_105_startup (struct usb_serial *serial)
304 /* priv->termios is left uninitalized until port opening */ 296 /* priv->termios is left uninitalized until port opening */
305 init_waitqueue_head(&serial->port[i]->write_wait); 297 init_waitqueue_head(&serial->port[i]->write_wait);
306 } 298 }
307 299
308 return 0; 300 return 0;
309 301
310err_cleanup: 302err_cleanup:
311 for (; i >= 0; i--) { 303 for (; i >= 0; i--) {
312 priv = usb_get_serial_port_data(serial->port[i]); 304 priv = usb_get_serial_port_data(serial->port[i]);
313 for (j=0; j < NUM_URBS; j++) { 305 for (j = 0; j < NUM_URBS; j++) {
314 if (priv->write_urb_pool[j]) { 306 if (priv->write_urb_pool[j]) {
315 kfree(priv->write_urb_pool[j]->transfer_buffer); 307 kfree(priv->write_urb_pool[j]->transfer_buffer);
316 usb_free_urb(priv->write_urb_pool[j]); 308 usb_free_urb(priv->write_urb_pool[j]);
@@ -322,22 +314,23 @@ err_cleanup:
322} /* klsi_105_startup */ 314} /* klsi_105_startup */
323 315
324 316
325static void klsi_105_shutdown (struct usb_serial *serial) 317static void klsi_105_shutdown(struct usb_serial *serial)
326{ 318{
327 int i; 319 int i;
328 320
329 dbg("%s", __func__); 321 dbg("%s", __func__);
330 322
331 /* stop reads and writes on all ports */ 323 /* stop reads and writes on all ports */
332 for (i=0; i < serial->num_ports; ++i) { 324 for (i = 0; i < serial->num_ports; ++i) {
333 struct klsi_105_private *priv = usb_get_serial_port_data(serial->port[i]); 325 struct klsi_105_private *priv =
326 usb_get_serial_port_data(serial->port[i]);
334 unsigned long flags; 327 unsigned long flags;
335 328
336 if (priv) { 329 if (priv) {
337 /* kill our write urb pool */ 330 /* kill our write urb pool */
338 int j; 331 int j;
339 struct urb **write_urbs = priv->write_urb_pool; 332 struct urb **write_urbs = priv->write_urb_pool;
340 spin_lock_irqsave(&priv->lock,flags); 333 spin_lock_irqsave(&priv->lock, flags);
341 334
342 for (j = 0; j < NUM_URBS; j++) { 335 for (j = 0; j < NUM_URBS; j++) {
343 if (write_urbs[j]) { 336 if (write_urbs[j]) {
@@ -349,19 +342,18 @@ static void klsi_105_shutdown (struct usb_serial *serial)
349 * oopses. */ 342 * oopses. */
350 /* usb_kill_urb(write_urbs[j]); */ 343 /* usb_kill_urb(write_urbs[j]); */
351 kfree(write_urbs[j]->transfer_buffer); 344 kfree(write_urbs[j]->transfer_buffer);
352 usb_free_urb (write_urbs[j]); 345 usb_free_urb(write_urbs[j]);
353 } 346 }
354 } 347 }
355 348 spin_unlock_irqrestore(&priv->lock, flags);
356 spin_unlock_irqrestore (&priv->lock, flags);
357
358 kfree(priv); 349 kfree(priv);
359 usb_set_serial_port_data(serial->port[i], NULL); 350 usb_set_serial_port_data(serial->port[i], NULL);
360 } 351 }
361 } 352 }
362} /* klsi_105_shutdown */ 353} /* klsi_105_shutdown */
363 354
364static int klsi_105_open (struct usb_serial_port *port, struct file *filp) 355static int klsi_105_open(struct tty_struct *tty,
356 struct usb_serial_port *port, struct file *filp)
365{ 357{
366 struct klsi_105_private *priv = usb_get_serial_port_data(port); 358 struct klsi_105_private *priv = usb_get_serial_port_data(port);
367 int retval = 0; 359 int retval = 0;
@@ -375,11 +367,11 @@ static int klsi_105_open (struct usb_serial_port *port, struct file *filp)
375 367
376 /* force low_latency on so that our tty_push actually forces 368 /* force low_latency on so that our tty_push actually forces
377 * the data through 369 * the data through
378 * port->tty->low_latency = 1; */ 370 * tty->low_latency = 1; */
379 371
380 /* Do a defined restart: 372 /* Do a defined restart:
381 * Set up sane default baud rate and send the 'READ_ON' 373 * Set up sane default baud rate and send the 'READ_ON'
382 * vendor command. 374 * vendor command.
383 * FIXME: set modem line control (how?) 375 * FIXME: set modem line control (how?)
384 * Then read the modem line control and store values in 376 * Then read the modem line control and store values in
385 * priv->line_state. 377 * priv->line_state.
@@ -390,24 +382,24 @@ static int klsi_105_open (struct usb_serial_port *port, struct file *filp)
390 cfg.unknown1 = 0; 382 cfg.unknown1 = 0;
391 cfg.unknown2 = 1; 383 cfg.unknown2 = 1;
392 klsi_105_chg_port_settings(port, &cfg); 384 klsi_105_chg_port_settings(port, &cfg);
393 385
394 /* set up termios structure */ 386 /* set up termios structure */
395 spin_lock_irqsave (&priv->lock, flags); 387 spin_lock_irqsave(&priv->lock, flags);
396 priv->termios.c_iflag = port->tty->termios->c_iflag; 388 priv->termios.c_iflag = tty->termios->c_iflag;
397 priv->termios.c_oflag = port->tty->termios->c_oflag; 389 priv->termios.c_oflag = tty->termios->c_oflag;
398 priv->termios.c_cflag = port->tty->termios->c_cflag; 390 priv->termios.c_cflag = tty->termios->c_cflag;
399 priv->termios.c_lflag = port->tty->termios->c_lflag; 391 priv->termios.c_lflag = tty->termios->c_lflag;
400 for (i=0; i<NCCS; i++) 392 for (i = 0; i < NCCS; i++)
401 priv->termios.c_cc[i] = port->tty->termios->c_cc[i]; 393 priv->termios.c_cc[i] = tty->termios->c_cc[i];
402 priv->cfg.pktlen = cfg.pktlen; 394 priv->cfg.pktlen = cfg.pktlen;
403 priv->cfg.baudrate = cfg.baudrate; 395 priv->cfg.baudrate = cfg.baudrate;
404 priv->cfg.databits = cfg.databits; 396 priv->cfg.databits = cfg.databits;
405 priv->cfg.unknown1 = cfg.unknown1; 397 priv->cfg.unknown1 = cfg.unknown1;
406 priv->cfg.unknown2 = cfg.unknown2; 398 priv->cfg.unknown2 = cfg.unknown2;
407 spin_unlock_irqrestore (&priv->lock, flags); 399 spin_unlock_irqrestore(&priv->lock, flags);
408 400
409 /* READ_ON and urb submission */ 401 /* READ_ON and urb submission */
410 usb_fill_bulk_urb(port->read_urb, port->serial->dev, 402 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
411 usb_rcvbulkpipe(port->serial->dev, 403 usb_rcvbulkpipe(port->serial->dev,
412 port->bulk_in_endpointAddress), 404 port->bulk_in_endpointAddress),
413 port->read_urb->transfer_buffer, 405 port->read_urb->transfer_buffer,
@@ -423,7 +415,7 @@ static int klsi_105_open (struct usb_serial_port *port, struct file *filp)
423 } 415 }
424 416
425 rc = usb_control_msg(port->serial->dev, 417 rc = usb_control_msg(port->serial->dev,
426 usb_sndctrlpipe(port->serial->dev,0), 418 usb_sndctrlpipe(port->serial->dev, 0),
427 KL5KUSB105A_SIO_CONFIGURE, 419 KL5KUSB105A_SIO_CONFIGURE,
428 USB_TYPE_VENDOR|USB_DIR_OUT|USB_RECIP_INTERFACE, 420 USB_TYPE_VENDOR|USB_DIR_OUT|USB_RECIP_INTERFACE,
429 KL5KUSB105A_SIO_CONFIGURE_READ_ON, 421 KL5KUSB105A_SIO_CONFIGURE_READ_ON,
@@ -434,14 +426,14 @@ static int klsi_105_open (struct usb_serial_port *port, struct file *filp)
434 if (rc < 0) { 426 if (rc < 0) {
435 err("Enabling read failed (error = %d)", rc); 427 err("Enabling read failed (error = %d)", rc);
436 retval = rc; 428 retval = rc;
437 } else 429 } else
438 dbg("%s - enabled reading", __func__); 430 dbg("%s - enabled reading", __func__);
439 431
440 rc = klsi_105_get_line_state(port, &line_state); 432 rc = klsi_105_get_line_state(port, &line_state);
441 if (rc >= 0) { 433 if (rc >= 0) {
442 spin_lock_irqsave (&priv->lock, flags); 434 spin_lock_irqsave(&priv->lock, flags);
443 priv->line_state = line_state; 435 priv->line_state = line_state;
444 spin_unlock_irqrestore (&priv->lock, flags); 436 spin_unlock_irqrestore(&priv->lock, flags);
445 dbg("%s - read line state 0x%lx", __func__, line_state); 437 dbg("%s - read line state 0x%lx", __func__, line_state);
446 retval = 0; 438 retval = 0;
447 } else 439 } else
@@ -452,7 +444,8 @@ exit:
452} /* klsi_105_open */ 444} /* klsi_105_open */
453 445
454 446
455static void klsi_105_close (struct usb_serial_port *port, struct file *filp) 447static void klsi_105_close(struct tty_struct *tty,
448 struct usb_serial_port *port, struct file *filp)
456{ 449{
457 struct klsi_105_private *priv = usb_get_serial_port_data(port); 450 struct klsi_105_private *priv = usb_get_serial_port_data(port);
458 int rc; 451 int rc;
@@ -462,14 +455,14 @@ static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
462 mutex_lock(&port->serial->disc_mutex); 455 mutex_lock(&port->serial->disc_mutex);
463 if (!port->serial->disconnected) { 456 if (!port->serial->disconnected) {
464 /* send READ_OFF */ 457 /* send READ_OFF */
465 rc = usb_control_msg (port->serial->dev, 458 rc = usb_control_msg(port->serial->dev,
466 usb_sndctrlpipe(port->serial->dev, 0), 459 usb_sndctrlpipe(port->serial->dev, 0),
467 KL5KUSB105A_SIO_CONFIGURE, 460 KL5KUSB105A_SIO_CONFIGURE,
468 USB_TYPE_VENDOR | USB_DIR_OUT, 461 USB_TYPE_VENDOR | USB_DIR_OUT,
469 KL5KUSB105A_SIO_CONFIGURE_READ_OFF, 462 KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
470 0, /* index */ 463 0, /* index */
471 NULL, 0, 464 NULL, 0,
472 KLSI_TIMEOUT); 465 KLSI_TIMEOUT);
473 if (rc < 0) 466 if (rc < 0)
474 err("Disabling read failed (error = %d)", rc); 467 err("Disabling read failed (error = %d)", rc);
475 } 468 }
@@ -482,23 +475,24 @@ static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
482 /* FIXME */ 475 /* FIXME */
483 /* wgg - do I need this? I think so. */ 476 /* wgg - do I need this? I think so. */
484 usb_kill_urb(port->interrupt_in_urb); 477 usb_kill_urb(port->interrupt_in_urb);
485 info("kl5kusb105 port stats: %ld bytes in, %ld bytes out", priv->bytes_in, priv->bytes_out); 478 info("kl5kusb105 port stats: %ld bytes in, %ld bytes out",
479 priv->bytes_in, priv->bytes_out);
486} /* klsi_105_close */ 480} /* klsi_105_close */
487 481
488 482
489/* We need to write a complete 64-byte data block and encode the 483/* We need to write a complete 64-byte data block and encode the
490 * number actually sent in the first double-byte, LSB-order. That 484 * number actually sent in the first double-byte, LSB-order. That
491 * leaves at most 62 bytes of payload. 485 * leaves at most 62 bytes of payload.
492 */ 486 */
493#define KLSI_105_DATA_OFFSET 2 /* in the bulk urb data block */ 487#define KLSI_105_DATA_OFFSET 2 /* in the bulk urb data block */
494 488
495 489
496static int klsi_105_write (struct usb_serial_port *port, 490static int klsi_105_write(struct tty_struct *tty,
497 const unsigned char *buf, int count) 491 struct usb_serial_port *port, const unsigned char *buf, int count)
498{ 492{
499 struct klsi_105_private *priv = usb_get_serial_port_data(port); 493 struct klsi_105_private *priv = usb_get_serial_port_data(port);
500 int result, size; 494 int result, size;
501 int bytes_sent=0; 495 int bytes_sent = 0;
502 496
503 dbg("%s - port %d", __func__, port->number); 497 dbg("%s - port %d", __func__, port->number);
504 498
@@ -507,34 +501,37 @@ static int klsi_105_write (struct usb_serial_port *port,
507 struct urb *urb = NULL; 501 struct urb *urb = NULL;
508 unsigned long flags; 502 unsigned long flags;
509 int i; 503 int i;
510 /* since the pool is per-port we might not need the spin lock !? */ 504 /* since the pool is per-port we might not need
511 spin_lock_irqsave (&priv->lock, flags); 505 the spin lock !? */
512 for (i=0; i<NUM_URBS; i++) { 506 spin_lock_irqsave(&priv->lock, flags);
507 for (i = 0; i < NUM_URBS; i++) {
513 if (priv->write_urb_pool[i]->status != -EINPROGRESS) { 508 if (priv->write_urb_pool[i]->status != -EINPROGRESS) {
514 urb = priv->write_urb_pool[i]; 509 urb = priv->write_urb_pool[i];
515 dbg("%s - using pool URB %d", __func__, i); 510 dbg("%s - using pool URB %d", __func__, i);
516 break; 511 break;
517 } 512 }
518 } 513 }
519 spin_unlock_irqrestore (&priv->lock, flags); 514 spin_unlock_irqrestore(&priv->lock, flags);
520 515
521 if (urb==NULL) { 516 if (urb == NULL) {
522 dbg("%s - no more free urbs", __func__); 517 dbg("%s - no more free urbs", __func__);
523 goto exit; 518 goto exit;
524 } 519 }
525 520
526 if (urb->transfer_buffer == NULL) { 521 if (urb->transfer_buffer == NULL) {
527 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC); 522 urb->transfer_buffer =
523 kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
528 if (urb->transfer_buffer == NULL) { 524 if (urb->transfer_buffer == NULL) {
529 err("%s - no more kernel memory...", __func__); 525 err("%s - no more kernel memory...", __func__);
530 goto exit; 526 goto exit;
531 } 527 }
532 } 528 }
533 529
534 size = min (count, port->bulk_out_size - KLSI_105_DATA_OFFSET); 530 size = min(count, port->bulk_out_size - KLSI_105_DATA_OFFSET);
535 size = min (size, URB_TRANSFER_BUFFER_SIZE - KLSI_105_DATA_OFFSET); 531 size = min(size, URB_TRANSFER_BUFFER_SIZE -
532 KLSI_105_DATA_OFFSET);
536 533
537 memcpy (urb->transfer_buffer + KLSI_105_DATA_OFFSET, buf, size); 534 memcpy(urb->transfer_buffer + KLSI_105_DATA_OFFSET, buf, size);
538 535
539 /* write payload size into transfer buffer */ 536 /* write payload size into transfer buffer */
540 ((__u8 *)urb->transfer_buffer)[0] = (__u8) (size & 0xFF); 537 ((__u8 *)urb->transfer_buffer)[0] = (__u8) (size & 0xFF);
@@ -552,7 +549,8 @@ static int klsi_105_write (struct usb_serial_port *port,
552 /* send the data out the bulk port */ 549 /* send the data out the bulk port */
553 result = usb_submit_urb(urb, GFP_ATOMIC); 550 result = usb_submit_urb(urb, GFP_ATOMIC);
554 if (result) { 551 if (result) {
555 err("%s - failed submitting write urb, error %d", __func__, result); 552 err("%s - failed submitting write urb, error %d",
553 __func__, result);
556 goto exit; 554 goto exit;
557 } 555 }
558 buf += size; 556 buf += size;
@@ -561,12 +559,12 @@ static int klsi_105_write (struct usb_serial_port *port,
561 } 559 }
562exit: 560exit:
563 /* lockless, but it's for debug info only... */ 561 /* lockless, but it's for debug info only... */
564 priv->bytes_out+=bytes_sent; 562 priv->bytes_out += bytes_sent;
565 563
566 return bytes_sent; /* that's how much we wrote */ 564 return bytes_sent; /* that's how much we wrote */
567} /* klsi_105_write */ 565} /* klsi_105_write */
568 566
569static void klsi_105_write_bulk_callback ( struct urb *urb) 567static void klsi_105_write_bulk_callback(struct urb *urb)
570{ 568{
571 struct usb_serial_port *port = urb->context; 569 struct usb_serial_port *port = urb->context;
572 int status = urb->status; 570 int status = urb->status;
@@ -584,50 +582,50 @@ static void klsi_105_write_bulk_callback ( struct urb *urb)
584 582
585 583
586/* return number of characters currently in the writing process */ 584/* return number of characters currently in the writing process */
587static int klsi_105_chars_in_buffer (struct usb_serial_port *port) 585static int klsi_105_chars_in_buffer(struct tty_struct *tty)
588{ 586{
587 struct usb_serial_port *port = tty->driver_data;
589 int chars = 0; 588 int chars = 0;
590 int i; 589 int i;
591 unsigned long flags; 590 unsigned long flags;
592 struct klsi_105_private *priv = usb_get_serial_port_data(port); 591 struct klsi_105_private *priv = usb_get_serial_port_data(port);
593 592
594 spin_lock_irqsave (&priv->lock, flags); 593 spin_lock_irqsave(&priv->lock, flags);
595 594
596 for (i = 0; i < NUM_URBS; ++i) { 595 for (i = 0; i < NUM_URBS; ++i) {
597 if (priv->write_urb_pool[i]->status == -EINPROGRESS) { 596 if (priv->write_urb_pool[i]->status == -EINPROGRESS)
598 chars += URB_TRANSFER_BUFFER_SIZE; 597 chars += URB_TRANSFER_BUFFER_SIZE;
599 }
600 } 598 }
601 599
602 spin_unlock_irqrestore (&priv->lock, flags); 600 spin_unlock_irqrestore(&priv->lock, flags);
603 601
604 dbg("%s - returns %d", __func__, chars); 602 dbg("%s - returns %d", __func__, chars);
605 return (chars); 603 return chars;
606} 604}
607 605
608static int klsi_105_write_room (struct usb_serial_port *port) 606static int klsi_105_write_room(struct tty_struct *tty)
609{ 607{
608 struct usb_serial_port *port = tty->driver_data;
610 unsigned long flags; 609 unsigned long flags;
611 int i; 610 int i;
612 int room = 0; 611 int room = 0;
613 struct klsi_105_private *priv = usb_get_serial_port_data(port); 612 struct klsi_105_private *priv = usb_get_serial_port_data(port);
614 613
615 spin_lock_irqsave (&priv->lock, flags); 614 spin_lock_irqsave(&priv->lock, flags);
616 for (i = 0; i < NUM_URBS; ++i) { 615 for (i = 0; i < NUM_URBS; ++i) {
617 if (priv->write_urb_pool[i]->status != -EINPROGRESS) { 616 if (priv->write_urb_pool[i]->status != -EINPROGRESS)
618 room += URB_TRANSFER_BUFFER_SIZE; 617 room += URB_TRANSFER_BUFFER_SIZE;
619 }
620 } 618 }
621 619
622 spin_unlock_irqrestore (&priv->lock, flags); 620 spin_unlock_irqrestore(&priv->lock, flags);
623 621
624 dbg("%s - returns %d", __func__, room); 622 dbg("%s - returns %d", __func__, room);
625 return (room); 623 return room;
626} 624}
627 625
628 626
629 627
630static void klsi_105_read_bulk_callback (struct urb *urb) 628static void klsi_105_read_bulk_callback(struct urb *urb)
631{ 629{
632 struct usb_serial_port *port = urb->context; 630 struct usb_serial_port *port = urb->context;
633 struct klsi_105_private *priv = usb_get_serial_port_data(port); 631 struct klsi_105_private *priv = usb_get_serial_port_data(port);
@@ -660,13 +658,13 @@ static void klsi_105_read_bulk_callback (struct urb *urb)
660 } else { 658 } else {
661 int bytes_sent = ((__u8 *) data)[0] + 659 int bytes_sent = ((__u8 *) data)[0] +
662 ((unsigned int) ((__u8 *) data)[1] << 8); 660 ((unsigned int) ((__u8 *) data)[1] << 8);
663 tty = port->tty; 661 tty = port->port.tty;
664 /* we should immediately resubmit the URB, before attempting 662 /* we should immediately resubmit the URB, before attempting
665 * to pass the data on to the tty layer. But that needs locking 663 * to pass the data on to the tty layer. But that needs locking
666 * against re-entry an then mixed-up data because of 664 * against re-entry an then mixed-up data because of
667 * intermixed tty_flip_buffer_push()s 665 * intermixed tty_flip_buffer_push()s
668 * FIXME 666 * FIXME
669 */ 667 */
670 usb_serial_debug_data(debug, &port->dev, __func__, 668 usb_serial_debug_data(debug, &port->dev, __func__,
671 urb->actual_length, data); 669 urb->actual_length, data);
672 670
@@ -686,7 +684,7 @@ static void klsi_105_read_bulk_callback (struct urb *urb)
686 priv->bytes_in += bytes_sent; 684 priv->bytes_in += bytes_sent;
687 } 685 }
688 /* Continue trying to always read */ 686 /* Continue trying to always read */
689 usb_fill_bulk_urb(port->read_urb, port->serial->dev, 687 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
690 usb_rcvbulkpipe(port->serial->dev, 688 usb_rcvbulkpipe(port->serial->dev,
691 port->bulk_in_endpointAddress), 689 port->bulk_in_endpointAddress),
692 port->read_urb->transfer_buffer, 690 port->read_urb->transfer_buffer,
@@ -695,15 +693,16 @@ static void klsi_105_read_bulk_callback (struct urb *urb)
695 port); 693 port);
696 rc = usb_submit_urb(port->read_urb, GFP_ATOMIC); 694 rc = usb_submit_urb(port->read_urb, GFP_ATOMIC);
697 if (rc) 695 if (rc)
698 err("%s - failed resubmitting read urb, error %d", __func__, rc); 696 err("%s - failed resubmitting read urb, error %d",
697 __func__, rc);
699} /* klsi_105_read_bulk_callback */ 698} /* klsi_105_read_bulk_callback */
700 699
701 700
702static void klsi_105_set_termios (struct usb_serial_port *port, 701static void klsi_105_set_termios(struct tty_struct *tty,
703 struct ktermios *old_termios) 702 struct usb_serial_port *port,
703 struct ktermios *old_termios)
704{ 704{
705 struct klsi_105_private *priv = usb_get_serial_port_data(port); 705 struct klsi_105_private *priv = usb_get_serial_port_data(port);
706 struct tty_struct *tty = port->tty;
707 unsigned int iflag = tty->termios->c_iflag; 706 unsigned int iflag = tty->termios->c_iflag;
708 unsigned int old_iflag = old_termios->c_iflag; 707 unsigned int old_iflag = old_termios->c_iflag;
709 unsigned int cflag = tty->termios->c_cflag; 708 unsigned int cflag = tty->termios->c_cflag;
@@ -711,65 +710,63 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
711 struct klsi_105_port_settings cfg; 710 struct klsi_105_port_settings cfg;
712 unsigned long flags; 711 unsigned long flags;
713 speed_t baud; 712 speed_t baud;
714 713
715 /* lock while we are modifying the settings */ 714 /* lock while we are modifying the settings */
716 spin_lock_irqsave (&priv->lock, flags); 715 spin_lock_irqsave(&priv->lock, flags);
717 716
718 /* 717 /*
719 * Update baud rate 718 * Update baud rate
720 */ 719 */
721 baud = tty_get_baud_rate(tty); 720 baud = tty_get_baud_rate(tty);
722 721
723 if( (cflag & CBAUD) != (old_cflag & CBAUD) ) { 722 if ((cflag & CBAUD) != (old_cflag & CBAUD)) {
724 /* reassert DTR and (maybe) RTS on transition from B0 */ 723 /* reassert DTR and (maybe) RTS on transition from B0 */
725 if( (old_cflag & CBAUD) == B0 ) { 724 if ((old_cflag & CBAUD) == B0) {
726 dbg("%s: baud was B0", __func__); 725 dbg("%s: baud was B0", __func__);
727#if 0 726#if 0
728 priv->control_state |= TIOCM_DTR; 727 priv->control_state |= TIOCM_DTR;
729 /* don't set RTS if using hardware flow control */ 728 /* don't set RTS if using hardware flow control */
730 if (!(old_cflag & CRTSCTS)) { 729 if (!(old_cflag & CRTSCTS))
731 priv->control_state |= TIOCM_RTS; 730 priv->control_state |= TIOCM_RTS;
732 }
733 mct_u232_set_modem_ctrl(serial, priv->control_state); 731 mct_u232_set_modem_ctrl(serial, priv->control_state);
734#endif 732#endif
735 } 733 }
736 } 734 }
737 switch(baud) { 735 switch (baud) {
738 case 0: /* handled below */ 736 case 0: /* handled below */
739 break; 737 break;
740 case 1200: 738 case 1200:
741 priv->cfg.baudrate = kl5kusb105a_sio_b1200; 739 priv->cfg.baudrate = kl5kusb105a_sio_b1200;
742 break; 740 break;
743 case 2400: 741 case 2400:
744 priv->cfg.baudrate = kl5kusb105a_sio_b2400; 742 priv->cfg.baudrate = kl5kusb105a_sio_b2400;
745 break; 743 break;
746 case 4800: 744 case 4800:
747 priv->cfg.baudrate = kl5kusb105a_sio_b4800; 745 priv->cfg.baudrate = kl5kusb105a_sio_b4800;
748 break; 746 break;
749 case 9600: 747 case 9600:
750 priv->cfg.baudrate = kl5kusb105a_sio_b9600; 748 priv->cfg.baudrate = kl5kusb105a_sio_b9600;
751 break; 749 break;
752 case 19200: 750 case 19200:
753 priv->cfg.baudrate = kl5kusb105a_sio_b19200; 751 priv->cfg.baudrate = kl5kusb105a_sio_b19200;
754 break; 752 break;
755 case 38400: 753 case 38400:
756 priv->cfg.baudrate = kl5kusb105a_sio_b38400; 754 priv->cfg.baudrate = kl5kusb105a_sio_b38400;
757 break; 755 break;
758 case 57600: 756 case 57600:
759 priv->cfg.baudrate = kl5kusb105a_sio_b57600; 757 priv->cfg.baudrate = kl5kusb105a_sio_b57600;
760 break; 758 break;
761 case 115200: 759 case 115200:
762 priv->cfg.baudrate = kl5kusb105a_sio_b115200; 760 priv->cfg.baudrate = kl5kusb105a_sio_b115200;
763 break; 761 break;
764 default: 762 default:
765 dbg("KLSI USB->Serial converter:" 763 dbg("KLSI USB->Serial converter:"
766 " unsupported baudrate request, using default" 764 " unsupported baudrate request, using default of 9600");
767 " of 9600");
768 priv->cfg.baudrate = kl5kusb105a_sio_b9600; 765 priv->cfg.baudrate = kl5kusb105a_sio_b9600;
769 baud = 9600; 766 baud = 9600;
770 break; 767 break;
771 } 768 }
772 if ((cflag & CBAUD) == B0 ) { 769 if ((cflag & CBAUD) == B0) {
773 dbg("%s: baud is B0", __func__); 770 dbg("%s: baud is B0", __func__);
774 /* Drop RTS and DTR */ 771 /* Drop RTS and DTR */
775 /* maybe this should be simulated by sending read 772 /* maybe this should be simulated by sending read
@@ -778,7 +775,7 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
778 ; 775 ;
779#if 0 776#if 0
780 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); 777 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
781 mct_u232_set_modem_ctrl(serial, priv->control_state); 778 mct_u232_set_modem_ctrl(serial, priv->control_state);
782#endif 779#endif
783 } 780 }
784 tty_encode_baud_rate(tty, baud, baud); 781 tty_encode_baud_rate(tty, baud, baud);
@@ -788,11 +785,11 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
788 switch (cflag & CSIZE) { 785 switch (cflag & CSIZE) {
789 case CS5: 786 case CS5:
790 dbg("%s - 5 bits/byte not supported", __func__); 787 dbg("%s - 5 bits/byte not supported", __func__);
791 spin_unlock_irqrestore (&priv->lock, flags); 788 spin_unlock_irqrestore(&priv->lock, flags);
792 return ; 789 return ;
793 case CS6: 790 case CS6:
794 dbg("%s - 6 bits/byte not supported", __func__); 791 dbg("%s - 6 bits/byte not supported", __func__);
795 spin_unlock_irqrestore (&priv->lock, flags); 792 spin_unlock_irqrestore(&priv->lock, flags);
796 return ; 793 return ;
797 case CS7: 794 case CS7:
798 priv->cfg.databits = kl5kusb105a_dtb_7; 795 priv->cfg.databits = kl5kusb105a_dtb_7;
@@ -811,8 +808,7 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
811 * Update line control register (LCR) 808 * Update line control register (LCR)
812 */ 809 */
813 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD)) 810 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
814 || (cflag & CSTOPB) != (old_cflag & CSTOPB) ) { 811 || (cflag & CSTOPB) != (old_cflag & CSTOPB)) {
815
816 /* Not currently supported */ 812 /* Not currently supported */
817 tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB); 813 tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB);
818#if 0 814#if 0
@@ -833,20 +829,18 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
833#endif 829#endif
834 ; 830 ;
835 } 831 }
836
837 /* 832 /*
838 * Set flow control: well, I do not really now how to handle DTR/RTS. 833 * Set flow control: well, I do not really now how to handle DTR/RTS.
839 * Just do what we have seen with SniffUSB on Win98. 834 * Just do what we have seen with SniffUSB on Win98.
840 */ 835 */
841 if( (iflag & IXOFF) != (old_iflag & IXOFF) 836 if ((iflag & IXOFF) != (old_iflag & IXOFF)
842 || (iflag & IXON) != (old_iflag & IXON) 837 || (iflag & IXON) != (old_iflag & IXON)
843 || (cflag & CRTSCTS) != (old_cflag & CRTSCTS) ) { 838 || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
844
845 /* Not currently supported */ 839 /* Not currently supported */
846 tty->termios->c_cflag &= ~CRTSCTS; 840 tty->termios->c_cflag &= ~CRTSCTS;
847 /* Drop DTR/RTS if no flow control otherwise assert */ 841 /* Drop DTR/RTS if no flow control otherwise assert */
848#if 0 842#if 0
849 if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS) ) 843 if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS))
850 priv->control_state |= TIOCM_DTR | TIOCM_RTS; 844 priv->control_state |= TIOCM_DTR | TIOCM_RTS;
851 else 845 else
852 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS); 846 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
@@ -854,19 +848,21 @@ static void klsi_105_set_termios (struct usb_serial_port *port,
854#endif 848#endif
855 ; 849 ;
856 } 850 }
857 memcpy (&cfg, &priv->cfg, sizeof(cfg)); 851 memcpy(&cfg, &priv->cfg, sizeof(cfg));
858 spin_unlock_irqrestore (&priv->lock, flags); 852 spin_unlock_irqrestore(&priv->lock, flags);
859 853
860 /* now commit changes to device */ 854 /* now commit changes to device */
861 klsi_105_chg_port_settings(port, &cfg); 855 klsi_105_chg_port_settings(port, &cfg);
862} /* klsi_105_set_termios */ 856} /* klsi_105_set_termios */
863 857
864 858
865#if 0 859#if 0
866static void mct_u232_break_ctl( struct usb_serial_port *port, int break_state ) 860static void mct_u232_break_ctl(struct tty_struct *tty, int break_state)
867{ 861{
862 struct usb_serial_port *port = tty->driver_data;
868 struct usb_serial *serial = port->serial; 863 struct usb_serial *serial = port->serial;
869 struct mct_u232_private *priv = (struct mct_u232_private *)port->private; 864 struct mct_u232_private *priv =
865 (struct mct_u232_private *)port->private;
870 unsigned char lcr = priv->last_lcr; 866 unsigned char lcr = priv->last_lcr;
871 867
872 dbg("%sstate=%d", __func__, break_state); 868 dbg("%sstate=%d", __func__, break_state);
@@ -878,8 +874,9 @@ static void mct_u232_break_ctl( struct usb_serial_port *port, int break_state )
878} /* mct_u232_break_ctl */ 874} /* mct_u232_break_ctl */
879#endif 875#endif
880 876
881static int klsi_105_tiocmget (struct usb_serial_port *port, struct file *file) 877static int klsi_105_tiocmget(struct tty_struct *tty, struct file *file)
882{ 878{
879 struct usb_serial_port *port = tty->driver_data;
883 struct klsi_105_private *priv = usb_get_serial_port_data(port); 880 struct klsi_105_private *priv = usb_get_serial_port_data(port);
884 unsigned long flags; 881 unsigned long flags;
885 int rc; 882 int rc;
@@ -893,18 +890,18 @@ static int klsi_105_tiocmget (struct usb_serial_port *port, struct file *file)
893 return rc; 890 return rc;
894 } 891 }
895 892
896 spin_lock_irqsave (&priv->lock, flags); 893 spin_lock_irqsave(&priv->lock, flags);
897 priv->line_state = line_state; 894 priv->line_state = line_state;
898 spin_unlock_irqrestore (&priv->lock, flags); 895 spin_unlock_irqrestore(&priv->lock, flags);
899 dbg("%s - read line state 0x%lx", __func__, line_state); 896 dbg("%s - read line state 0x%lx", __func__, line_state);
900 return (int)line_state; 897 return (int)line_state;
901} 898}
902 899
903static int klsi_105_tiocmset (struct usb_serial_port *port, struct file *file, 900static int klsi_105_tiocmset(struct tty_struct *tty, struct file *file,
904 unsigned int set, unsigned int clear) 901 unsigned int set, unsigned int clear)
905{ 902{
906 int retval = -EINVAL; 903 int retval = -EINVAL;
907 904
908 dbg("%s", __func__); 905 dbg("%s", __func__);
909 906
910/* if this ever gets implemented, it should be done something like this: 907/* if this ever gets implemented, it should be done something like this:
@@ -929,14 +926,16 @@ static int klsi_105_tiocmset (struct usb_serial_port *port, struct file *file,
929 return retval; 926 return retval;
930} 927}
931 928
932static void klsi_105_throttle (struct usb_serial_port *port) 929static void klsi_105_throttle(struct tty_struct *tty)
933{ 930{
931 struct usb_serial_port *port = tty->driver_data;
934 dbg("%s - port %d", __func__, port->number); 932 dbg("%s - port %d", __func__, port->number);
935 usb_kill_urb(port->read_urb); 933 usb_kill_urb(port->read_urb);
936} 934}
937 935
938static void klsi_105_unthrottle (struct usb_serial_port *port) 936static void klsi_105_unthrottle(struct tty_struct *tty)
939{ 937{
938 struct usb_serial_port *port = tty->driver_data;
940 int result; 939 int result;
941 940
942 dbg("%s - port %d", __func__, port->number); 941 dbg("%s - port %d", __func__, port->number);
@@ -950,7 +949,7 @@ static void klsi_105_unthrottle (struct usb_serial_port *port)
950 949
951 950
952 951
953static int __init klsi_105_init (void) 952static int __init klsi_105_init(void)
954{ 953{
955 int retval; 954 int retval;
956 retval = usb_serial_register(&kl5kusb105d_device); 955 retval = usb_serial_register(&kl5kusb105d_device);
@@ -969,19 +968,19 @@ failed_usb_serial_register:
969} 968}
970 969
971 970
972static void __exit klsi_105_exit (void) 971static void __exit klsi_105_exit(void)
973{ 972{
974 usb_deregister (&kl5kusb105d_driver); 973 usb_deregister(&kl5kusb105d_driver);
975 usb_serial_deregister (&kl5kusb105d_device); 974 usb_serial_deregister(&kl5kusb105d_device);
976} 975}
977 976
978 977
979module_init (klsi_105_init); 978module_init(klsi_105_init);
980module_exit (klsi_105_exit); 979module_exit(klsi_105_exit);
981 980
982MODULE_AUTHOR( DRIVER_AUTHOR ); 981MODULE_AUTHOR(DRIVER_AUTHOR);
983MODULE_DESCRIPTION( DRIVER_DESC ); 982MODULE_DESCRIPTION(DRIVER_DESC);
984MODULE_LICENSE("GPL"); 983MODULE_LICENSE("GPL");
985 984
986 985
987module_param(debug, bool, S_IRUGO | S_IWUSR); 986module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
index 693f00da7c03..deba28ec77e8 100644
--- a/drivers/usb/serial/kobil_sct.c
+++ b/drivers/usb/serial/kobil_sct.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * KOBIL USB Smart Card Terminal Driver 2 * KOBIL USB Smart Card Terminal Driver
3 * 3 *
4 * Copyright (C) 2002 KOBIL Systems GmbH 4 * Copyright (C) 2002 KOBIL Systems GmbH
5 * Author: Thomas Wahrenbruch 5 * Author: Thomas Wahrenbruch
6 * 6 *
7 * Contact: linuxusb@kobil.de 7 * Contact: linuxusb@kobil.de
@@ -20,7 +20,7 @@
20 * 20 *
21 * Supported readers: USB TWIN, KAAN Standard Plus and SecOVID Reader Plus 21 * Supported readers: USB TWIN, KAAN Standard Plus and SecOVID Reader Plus
22 * (Adapter K), B1 Professional and KAAN Professional (Adapter B) 22 * (Adapter K), B1 Professional and KAAN Professional (Adapter B)
23 * 23 *
24 * (21/05/2004) tw 24 * (21/05/2004) tw
25 * Fix bug with P'n'P readers 25 * Fix bug with P'n'P readers
26 * 26 *
@@ -44,7 +44,7 @@
44#include <linux/tty_flip.h> 44#include <linux/tty_flip.h>
45#include <linux/module.h> 45#include <linux/module.h>
46#include <linux/spinlock.h> 46#include <linux/spinlock.h>
47#include <asm/uaccess.h> 47#include <linux/uaccess.h>
48#include <linux/usb.h> 48#include <linux/usb.h>
49#include <linux/usb/serial.h> 49#include <linux/usb/serial.h>
50#include <linux/ioctl.h> 50#include <linux/ioctl.h>
@@ -68,21 +68,24 @@ static int debug;
68 68
69 69
70/* Function prototypes */ 70/* Function prototypes */
71static int kobil_startup (struct usb_serial *serial); 71static int kobil_startup(struct usb_serial *serial);
72static void kobil_shutdown (struct usb_serial *serial); 72static void kobil_shutdown(struct usb_serial *serial);
73static int kobil_open (struct usb_serial_port *port, struct file *filp); 73static int kobil_open(struct tty_struct *tty,
74static void kobil_close (struct usb_serial_port *port, struct file *filp); 74 struct usb_serial_port *port, struct file *filp);
75static int kobil_write (struct usb_serial_port *port, 75static void kobil_close(struct tty_struct *tty, struct usb_serial_port *port,
76 struct file *filp);
77static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port,
76 const unsigned char *buf, int count); 78 const unsigned char *buf, int count);
77static int kobil_write_room(struct usb_serial_port *port); 79static int kobil_write_room(struct tty_struct *tty);
78static int kobil_ioctl(struct usb_serial_port *port, struct file *file, 80static int kobil_ioctl(struct tty_struct *tty, struct file *file,
79 unsigned int cmd, unsigned long arg); 81 unsigned int cmd, unsigned long arg);
80static int kobil_tiocmget(struct usb_serial_port *port, struct file *file); 82static int kobil_tiocmget(struct tty_struct *tty, struct file *file);
81static int kobil_tiocmset(struct usb_serial_port *port, struct file *file, 83static int kobil_tiocmset(struct tty_struct *tty, struct file *file,
82 unsigned int set, unsigned int clear); 84 unsigned int set, unsigned int clear);
83static void kobil_read_int_callback( struct urb *urb ); 85static void kobil_read_int_callback(struct urb *urb);
84static void kobil_write_callback( struct urb *purb ); 86static void kobil_write_callback(struct urb *purb);
85static void kobil_set_termios(struct usb_serial_port *port, struct ktermios *old); 87static void kobil_set_termios(struct tty_struct *tty,
88 struct usb_serial_port *port, struct ktermios *old);
86 89
87 90
88static struct usb_device_id id_table [] = { 91static struct usb_device_id id_table [] = {
@@ -94,7 +97,7 @@ static struct usb_device_id id_table [] = {
94}; 97};
95 98
96 99
97MODULE_DEVICE_TABLE (usb, id_table); 100MODULE_DEVICE_TABLE(usb, id_table);
98 101
99static struct usb_driver kobil_driver = { 102static struct usb_driver kobil_driver = {
100 .name = "kobil", 103 .name = "kobil",
@@ -131,14 +134,14 @@ static struct usb_serial_driver kobil_device = {
131struct kobil_private { 134struct kobil_private {
132 int write_int_endpoint_address; 135 int write_int_endpoint_address;
133 int read_int_endpoint_address; 136 int read_int_endpoint_address;
134 unsigned char buf[KOBIL_BUF_LENGTH]; // buffer for the APDU to send 137 unsigned char buf[KOBIL_BUF_LENGTH]; /* buffer for the APDU to send */
135 int filled; // index of the last char in buf 138 int filled; /* index of the last char in buf */
136 int cur_pos; // index of the next char to send in buf 139 int cur_pos; /* index of the next char to send in buf */
137 __u16 device_type; 140 __u16 device_type;
138}; 141};
139 142
140 143
141static int kobil_startup (struct usb_serial *serial) 144static int kobil_startup(struct usb_serial *serial)
142{ 145{
143 int i; 146 int i;
144 struct kobil_private *priv; 147 struct kobil_private *priv;
@@ -149,20 +152,20 @@ static int kobil_startup (struct usb_serial *serial)
149 struct usb_host_endpoint *endpoint; 152 struct usb_host_endpoint *endpoint;
150 153
151 priv = kmalloc(sizeof(struct kobil_private), GFP_KERNEL); 154 priv = kmalloc(sizeof(struct kobil_private), GFP_KERNEL);
152 if (!priv){ 155 if (!priv)
153 return -ENOMEM; 156 return -ENOMEM;
154 }
155 157
156 priv->filled = 0; 158 priv->filled = 0;
157 priv->cur_pos = 0; 159 priv->cur_pos = 0;
158 priv->device_type = le16_to_cpu(serial->dev->descriptor.idProduct); 160 priv->device_type = le16_to_cpu(serial->dev->descriptor.idProduct);
159 161
160 switch (priv->device_type){ 162 switch (priv->device_type) {
161 case KOBIL_ADAPTER_B_PRODUCT_ID: 163 case KOBIL_ADAPTER_B_PRODUCT_ID:
162 printk(KERN_DEBUG "KOBIL B1 PRO / KAAN PRO detected\n"); 164 printk(KERN_DEBUG "KOBIL B1 PRO / KAAN PRO detected\n");
163 break; 165 break;
164 case KOBIL_ADAPTER_K_PRODUCT_ID: 166 case KOBIL_ADAPTER_K_PRODUCT_ID:
165 printk(KERN_DEBUG "KOBIL KAAN Standard Plus / SecOVID Reader Plus detected\n"); 167 printk(KERN_DEBUG
168 "KOBIL KAAN Standard Plus / SecOVID Reader Plus detected\n");
166 break; 169 break;
167 case KOBIL_USBTWIN_PRODUCT_ID: 170 case KOBIL_USBTWIN_PRODUCT_ID:
168 printk(KERN_DEBUG "KOBIL USBTWIN detected\n"); 171 printk(KERN_DEBUG "KOBIL USBTWIN detected\n");
@@ -173,44 +176,48 @@ static int kobil_startup (struct usb_serial *serial)
173 } 176 }
174 usb_set_serial_port_data(serial->port[0], priv); 177 usb_set_serial_port_data(serial->port[0], priv);
175 178
176 // search for the necessary endpoints 179 /* search for the necessary endpoints */
177 pdev = serial->dev; 180 pdev = serial->dev;
178 actconfig = pdev->actconfig; 181 actconfig = pdev->actconfig;
179 interface = actconfig->interface[0]; 182 interface = actconfig->interface[0];
180 altsetting = interface->cur_altsetting; 183 altsetting = interface->cur_altsetting;
181 endpoint = altsetting->endpoint; 184 endpoint = altsetting->endpoint;
182 185
183 for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { 186 for (i = 0; i < altsetting->desc.bNumEndpoints; i++) {
184 endpoint = &altsetting->endpoint[i]; 187 endpoint = &altsetting->endpoint[i];
185 if (usb_endpoint_is_int_out(&endpoint->desc)) { 188 if (usb_endpoint_is_int_out(&endpoint->desc)) {
186 dbg("%s Found interrupt out endpoint. Address: %d", __func__, endpoint->desc.bEndpointAddress); 189 dbg("%s Found interrupt out endpoint. Address: %d",
187 priv->write_int_endpoint_address = endpoint->desc.bEndpointAddress; 190 __func__, endpoint->desc.bEndpointAddress);
188 } 191 priv->write_int_endpoint_address =
192 endpoint->desc.bEndpointAddress;
193 }
189 if (usb_endpoint_is_int_in(&endpoint->desc)) { 194 if (usb_endpoint_is_int_in(&endpoint->desc)) {
190 dbg("%s Found interrupt in endpoint. Address: %d", __func__, endpoint->desc.bEndpointAddress); 195 dbg("%s Found interrupt in endpoint. Address: %d",
191 priv->read_int_endpoint_address = endpoint->desc.bEndpointAddress; 196 __func__, endpoint->desc.bEndpointAddress);
192 } 197 priv->read_int_endpoint_address =
198 endpoint->desc.bEndpointAddress;
199 }
193 } 200 }
194 return 0; 201 return 0;
195} 202}
196 203
197 204
198static void kobil_shutdown (struct usb_serial *serial) 205static void kobil_shutdown(struct usb_serial *serial)
199{ 206{
200 int i; 207 int i;
201 dbg("%s - port %d", __func__, serial->port[0]->number); 208 dbg("%s - port %d", __func__, serial->port[0]->number);
202 209
203 for (i=0; i < serial->num_ports; ++i) { 210 for (i = 0; i < serial->num_ports; ++i) {
204 while (serial->port[i]->open_count > 0) { 211 while (serial->port[i]->port.count > 0)
205 kobil_close (serial->port[i], NULL); 212 kobil_close(NULL, serial->port[i], NULL);
206 }
207 kfree(usb_get_serial_port_data(serial->port[i])); 213 kfree(usb_get_serial_port_data(serial->port[i]));
208 usb_set_serial_port_data(serial->port[i], NULL); 214 usb_set_serial_port_data(serial->port[i], NULL);
209 } 215 }
210} 216}
211 217
212 218
213static int kobil_open (struct usb_serial_port *port, struct file *filp) 219static int kobil_open(struct tty_struct *tty,
220 struct usb_serial_port *port, struct file *filp)
214{ 221{
215 int result = 0; 222 int result = 0;
216 struct kobil_private *priv; 223 struct kobil_private *priv;
@@ -221,7 +228,7 @@ static int kobil_open (struct usb_serial_port *port, struct file *filp)
221 dbg("%s - port %d", __func__, port->number); 228 dbg("%s - port %d", __func__, port->number);
222 priv = usb_get_serial_port_data(port); 229 priv = usb_get_serial_port_data(port);
223 230
224 // someone sets the dev to 0 if the close method has been called 231 /* someone sets the dev to 0 if the close method has been called */
225 port->interrupt_in_urb->dev = port->serial->dev; 232 port->interrupt_in_urb->dev = port->serial->dev;
226 233
227 234
@@ -229,100 +236,115 @@ static int kobil_open (struct usb_serial_port *port, struct file *filp)
229 * the data through, otherwise it is scheduled, and with high 236 * the data through, otherwise it is scheduled, and with high
230 * data rates (like with OHCI) data can get lost. 237 * data rates (like with OHCI) data can get lost.
231 */ 238 */
232 port->tty->low_latency = 1; 239 if (tty) {
233 240 tty->low_latency = 1;
234 // without this, every push_tty_char is echoed :-( 241
235 port->tty->termios->c_lflag = 0; 242 /* Default to echo off and other sane device settings */
236 port->tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); 243 tty->termios->c_lflag = 0;
237 port->tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; 244 tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN |
238 port->tty->termios->c_oflag &= ~ONLCR; // do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) 245 XCASE);
239 246 tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF;
240 // allocate memory for transfer buffer 247 /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */
248 tty->termios->c_oflag &= ~ONLCR;
249 }
250 /* allocate memory for transfer buffer */
241 transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); 251 transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL);
242 if (! transfer_buffer) { 252 if (!transfer_buffer)
243 return -ENOMEM; 253 return -ENOMEM;
244 } 254
245 255 /* allocate write_urb */
246 // allocate write_urb 256 if (!port->write_urb) {
247 if (!port->write_urb) { 257 dbg("%s - port %d Allocating port->write_urb",
248 dbg("%s - port %d Allocating port->write_urb", __func__, port->number); 258 __func__, port->number);
249 port->write_urb = usb_alloc_urb(0, GFP_KERNEL); 259 port->write_urb = usb_alloc_urb(0, GFP_KERNEL);
250 if (!port->write_urb) { 260 if (!port->write_urb) {
251 dbg("%s - port %d usb_alloc_urb failed", __func__, port->number); 261 dbg("%s - port %d usb_alloc_urb failed",
262 __func__, port->number);
252 kfree(transfer_buffer); 263 kfree(transfer_buffer);
253 return -ENOMEM; 264 return -ENOMEM;
254 } 265 }
255 } 266 }
256 267
257 // allocate memory for write_urb transfer buffer 268 /* allocate memory for write_urb transfer buffer */
258 port->write_urb->transfer_buffer = kmalloc(write_urb_transfer_buffer_length, GFP_KERNEL); 269 port->write_urb->transfer_buffer =
259 if (! port->write_urb->transfer_buffer) { 270 kmalloc(write_urb_transfer_buffer_length, GFP_KERNEL);
271 if (!port->write_urb->transfer_buffer) {
260 kfree(transfer_buffer); 272 kfree(transfer_buffer);
261 usb_free_urb(port->write_urb); 273 usb_free_urb(port->write_urb);
262 port->write_urb = NULL; 274 port->write_urb = NULL;
263 return -ENOMEM; 275 return -ENOMEM;
264 } 276 }
265 277
266 // get hardware version 278 /* get hardware version */
267 result = usb_control_msg( port->serial->dev, 279 result = usb_control_msg(port->serial->dev,
268 usb_rcvctrlpipe(port->serial->dev, 0 ), 280 usb_rcvctrlpipe(port->serial->dev, 0),
269 SUSBCRequest_GetMisc, 281 SUSBCRequest_GetMisc,
270 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN, 282 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
271 SUSBCR_MSC_GetHWVersion, 283 SUSBCR_MSC_GetHWVersion,
272 0, 284 0,
273 transfer_buffer, 285 transfer_buffer,
274 transfer_buffer_length, 286 transfer_buffer_length,
275 KOBIL_TIMEOUT 287 KOBIL_TIMEOUT
288 );
289 dbg("%s - port %d Send get_HW_version URB returns: %i",
290 __func__, port->number, result);
291 dbg("Harware version: %i.%i.%i",
292 transfer_buffer[0], transfer_buffer[1], transfer_buffer[2]);
293
294 /* get firmware version */
295 result = usb_control_msg(port->serial->dev,
296 usb_rcvctrlpipe(port->serial->dev, 0),
297 SUSBCRequest_GetMisc,
298 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
299 SUSBCR_MSC_GetFWVersion,
300 0,
301 transfer_buffer,
302 transfer_buffer_length,
303 KOBIL_TIMEOUT
304 );
305 dbg("%s - port %d Send get_FW_version URB returns: %i",
306 __func__, port->number, result);
307 dbg("Firmware version: %i.%i.%i",
308 transfer_buffer[0], transfer_buffer[1], transfer_buffer[2]);
309
310 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID ||
311 priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) {
312 /* Setting Baudrate, Parity and Stopbits */
313 result = usb_control_msg(port->serial->dev,
314 usb_rcvctrlpipe(port->serial->dev, 0),
315 SUSBCRequest_SetBaudRateParityAndStopBits,
316 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
317 SUSBCR_SBR_9600 | SUSBCR_SPASB_EvenParity |
318 SUSBCR_SPASB_1StopBit,
319 0,
320 transfer_buffer,
321 0,
322 KOBIL_TIMEOUT
276 ); 323 );
277 dbg("%s - port %d Send get_HW_version URB returns: %i", __func__, port->number, result); 324 dbg("%s - port %d Send set_baudrate URB returns: %i",
278 dbg("Harware version: %i.%i.%i", transfer_buffer[0], transfer_buffer[1], transfer_buffer[2] ); 325 __func__, port->number, result);
279 326
280 // get firmware version 327 /* reset all queues */
281 result = usb_control_msg( port->serial->dev, 328 result = usb_control_msg(port->serial->dev,
282 usb_rcvctrlpipe(port->serial->dev, 0 ), 329 usb_rcvctrlpipe(port->serial->dev, 0),
283 SUSBCRequest_GetMisc, 330 SUSBCRequest_Misc,
284 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN, 331 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
285 SUSBCR_MSC_GetFWVersion, 332 SUSBCR_MSC_ResetAllQueues,
286 0, 333 0,
287 transfer_buffer, 334 transfer_buffer,
288 transfer_buffer_length, 335 0,
289 KOBIL_TIMEOUT 336 KOBIL_TIMEOUT
290 ); 337 );
291 dbg("%s - port %d Send get_FW_version URB returns: %i", __func__, port->number, result); 338 dbg("%s - port %d Send reset_all_queues URB returns: %i",
292 dbg("Firmware version: %i.%i.%i", transfer_buffer[0], transfer_buffer[1], transfer_buffer[2] ); 339 __func__, port->number, result);
293
294 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID || priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) {
295 // Setting Baudrate, Parity and Stopbits
296 result = usb_control_msg( port->serial->dev,
297 usb_rcvctrlpipe(port->serial->dev, 0 ),
298 SUSBCRequest_SetBaudRateParityAndStopBits,
299 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
300 SUSBCR_SBR_9600 | SUSBCR_SPASB_EvenParity | SUSBCR_SPASB_1StopBit,
301 0,
302 transfer_buffer,
303 0,
304 KOBIL_TIMEOUT
305 );
306 dbg("%s - port %d Send set_baudrate URB returns: %i", __func__, port->number, result);
307
308 // reset all queues
309 result = usb_control_msg( port->serial->dev,
310 usb_rcvctrlpipe(port->serial->dev, 0 ),
311 SUSBCRequest_Misc,
312 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
313 SUSBCR_MSC_ResetAllQueues,
314 0,
315 transfer_buffer,
316 0,
317 KOBIL_TIMEOUT
318 );
319 dbg("%s - port %d Send reset_all_queues URB returns: %i", __func__, port->number, result);
320 } 340 }
321 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID || 341 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID ||
342 priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID ||
322 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) { 343 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
323 // start reading (Adapter B 'cause PNP string) 344 /* start reading (Adapter B 'cause PNP string) */
324 result = usb_submit_urb( port->interrupt_in_urb, GFP_ATOMIC ); 345 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
325 dbg("%s - port %d Send read URB returns: %i", __func__, port->number, result); 346 dbg("%s - port %d Send read URB returns: %i",
347 __func__, port->number, result);
326 } 348 }
327 349
328 kfree(transfer_buffer); 350 kfree(transfer_buffer);
@@ -330,13 +352,14 @@ static int kobil_open (struct usb_serial_port *port, struct file *filp)
330} 352}
331 353
332 354
333static void kobil_close (struct usb_serial_port *port, struct file *filp) 355static void kobil_close(struct tty_struct *tty,
356 struct usb_serial_port *port, struct file *filp)
334{ 357{
335 dbg("%s - port %d", __func__, port->number); 358 dbg("%s - port %d", __func__, port->number);
336 359
337 if (port->write_urb) { 360 if (port->write_urb) {
338 usb_kill_urb(port->write_urb); 361 usb_kill_urb(port->write_urb);
339 usb_free_urb( port->write_urb ); 362 usb_free_urb(port->write_urb);
340 port->write_urb = NULL; 363 port->write_urb = NULL;
341 } 364 }
342 usb_kill_urb(port->interrupt_in_urb); 365 usb_kill_urb(port->interrupt_in_urb);
@@ -350,7 +373,7 @@ static void kobil_read_int_callback(struct urb *urb)
350 struct tty_struct *tty; 373 struct tty_struct *tty;
351 unsigned char *data = urb->transfer_buffer; 374 unsigned char *data = urb->transfer_buffer;
352 int status = urb->status; 375 int status = urb->status;
353// char *dbg_data; 376/* char *dbg_data; */
354 377
355 dbg("%s - port %d", __func__, port->number); 378 dbg("%s - port %d", __func__, port->number);
356 379
@@ -360,51 +383,53 @@ static void kobil_read_int_callback(struct urb *urb)
360 return; 383 return;
361 } 384 }
362 385
363 tty = port->tty; 386 tty = port->port.tty;
364 if (urb->actual_length) { 387 if (urb->actual_length) {
365 388
366 // BEGIN DEBUG 389 /* BEGIN DEBUG */
367 /* 390 /*
368 dbg_data = kzalloc((3 * purb->actual_length + 10) * sizeof(char), GFP_KERNEL); 391 dbg_data = kzalloc((3 * purb->actual_length + 10)
392 * sizeof(char), GFP_KERNEL);
369 if (! dbg_data) { 393 if (! dbg_data) {
370 return; 394 return;
371 } 395 }
372 for (i = 0; i < purb->actual_length; i++) { 396 for (i = 0; i < purb->actual_length; i++) {
373 sprintf(dbg_data +3*i, "%02X ", data[i]); 397 sprintf(dbg_data +3*i, "%02X ", data[i]);
374 } 398 }
375 dbg(" <-- %s", dbg_data ); 399 dbg(" <-- %s", dbg_data);
376 kfree(dbg_data); 400 kfree(dbg_data);
377 */ 401 */
378 // END DEBUG 402 /* END DEBUG */
379 403
380 tty_buffer_request_room(tty, urb->actual_length); 404 tty_buffer_request_room(tty, urb->actual_length);
381 tty_insert_flip_string(tty, data, urb->actual_length); 405 tty_insert_flip_string(tty, data, urb->actual_length);
382 tty_flip_buffer_push(tty); 406 tty_flip_buffer_push(tty);
383 } 407 }
384 408 /* someone sets the dev to 0 if the close method has been called */
385 // someone sets the dev to 0 if the close method has been called
386 port->interrupt_in_urb->dev = port->serial->dev; 409 port->interrupt_in_urb->dev = port->serial->dev;
387 410
388 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 411 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
389 dbg("%s - port %d Send read URB returns: %i", __func__, port->number, result); 412 dbg("%s - port %d Send read URB returns: %i",
413 __func__, port->number, result);
390} 414}
391 415
392 416
393static void kobil_write_callback( struct urb *purb ) 417static void kobil_write_callback(struct urb *purb)
394{ 418{
395} 419}
396 420
397 421
398static int kobil_write (struct usb_serial_port *port, 422static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port,
399 const unsigned char *buf, int count) 423 const unsigned char *buf, int count)
400{ 424{
401 int length = 0; 425 int length = 0;
402 int result = 0; 426 int result = 0;
403 int todo = 0; 427 int todo = 0;
404 struct kobil_private * priv; 428 struct kobil_private *priv;
405 429
406 if (count == 0) { 430 if (count == 0) {
407 dbg("%s - port %d write request of 0 bytes", __func__, port->number); 431 dbg("%s - port %d write request of 0 bytes",
432 __func__, port->number);
408 return 0; 433 return 0;
409 } 434 }
410 435
@@ -415,106 +440,113 @@ static int kobil_write (struct usb_serial_port *port,
415 return -ENOMEM; 440 return -ENOMEM;
416 } 441 }
417 442
418 // Copy data to buffer 443 /* Copy data to buffer */
419 memcpy (priv->buf + priv->filled, buf, count); 444 memcpy(priv->buf + priv->filled, buf, count);
420 445 usb_serial_debug_data(debug, &port->dev, __func__, count,
421 usb_serial_debug_data(debug, &port->dev, __func__, count, priv->buf + priv->filled); 446 priv->buf + priv->filled);
422
423 priv->filled = priv->filled + count; 447 priv->filled = priv->filled + count;
424 448
425 449 /* only send complete block. TWIN, KAAN SIM and adapter K
426 // only send complete block. TWIN, KAAN SIM and adapter K use the same protocol. 450 use the same protocol. */
427 if ( ((priv->device_type != KOBIL_ADAPTER_B_PRODUCT_ID) && (priv->filled > 2) && (priv->filled >= (priv->buf[1] + 3))) || 451 if (((priv->device_type != KOBIL_ADAPTER_B_PRODUCT_ID) && (priv->filled > 2) && (priv->filled >= (priv->buf[1] + 3))) ||
428 ((priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) && (priv->filled > 3) && (priv->filled >= (priv->buf[2] + 4))) ) { 452 ((priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) && (priv->filled > 3) && (priv->filled >= (priv->buf[2] + 4)))) {
429 453 /* stop reading (except TWIN and KAAN SIM) */
430 // stop reading (except TWIN and KAAN SIM) 454 if ((priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID)
431 if ( (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) || (priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) ) 455 || (priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID))
432 usb_kill_urb(port->interrupt_in_urb); 456 usb_kill_urb(port->interrupt_in_urb);
433 457
434 todo = priv->filled - priv->cur_pos; 458 todo = priv->filled - priv->cur_pos;
435 459
436 while(todo > 0) { 460 while (todo > 0) {
437 // max 8 byte in one urb (endpoint size) 461 /* max 8 byte in one urb (endpoint size) */
438 length = (todo < 8) ? todo : 8; 462 length = (todo < 8) ? todo : 8;
439 // copy data to transfer buffer 463 /* copy data to transfer buffer */
440 memcpy(port->write_urb->transfer_buffer, priv->buf + priv->cur_pos, length ); 464 memcpy(port->write_urb->transfer_buffer,
441 usb_fill_int_urb( port->write_urb, 465 priv->buf + priv->cur_pos, length);
442 port->serial->dev, 466 usb_fill_int_urb(port->write_urb,
443 usb_sndintpipe(port->serial->dev, priv->write_int_endpoint_address), 467 port->serial->dev,
444 port->write_urb->transfer_buffer, 468 usb_sndintpipe(port->serial->dev,
445 length, 469 priv->write_int_endpoint_address),
446 kobil_write_callback, 470 port->write_urb->transfer_buffer,
447 port, 471 length,
448 8 472 kobil_write_callback,
449 ); 473 port,
474 8
475 );
450 476
451 priv->cur_pos = priv->cur_pos + length; 477 priv->cur_pos = priv->cur_pos + length;
452 result = usb_submit_urb( port->write_urb, GFP_NOIO ); 478 result = usb_submit_urb(port->write_urb, GFP_NOIO);
453 dbg("%s - port %d Send write URB returns: %i", __func__, port->number, result); 479 dbg("%s - port %d Send write URB returns: %i",
480 __func__, port->number, result);
454 todo = priv->filled - priv->cur_pos; 481 todo = priv->filled - priv->cur_pos;
455 482
456 if (todo > 0) { 483 if (todo > 0)
457 msleep(24); 484 msleep(24);
458 } 485 }
459 486
460 } // end while
461
462 priv->filled = 0; 487 priv->filled = 0;
463 priv->cur_pos = 0; 488 priv->cur_pos = 0;
464 489
465 // someone sets the dev to 0 if the close method has been called 490 /* someone sets the dev to 0 if the close method
491 has been called */
466 port->interrupt_in_urb->dev = port->serial->dev; 492 port->interrupt_in_urb->dev = port->serial->dev;
467 493
468 // start reading (except TWIN and KAAN SIM) 494 /* start reading (except TWIN and KAAN SIM) */
469 if ( (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) || (priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) ) { 495 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID ||
470 // someone sets the dev to 0 if the close method has been called 496 priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) {
497 /* someone sets the dev to 0 if the close method has
498 been called */
471 port->interrupt_in_urb->dev = port->serial->dev; 499 port->interrupt_in_urb->dev = port->serial->dev;
472 500
473 result = usb_submit_urb( port->interrupt_in_urb, GFP_NOIO ); 501 result = usb_submit_urb(port->interrupt_in_urb,
474 dbg("%s - port %d Send read URB returns: %i", __func__, port->number, result); 502 GFP_NOIO);
503 dbg("%s - port %d Send read URB returns: %i",
504 __func__, port->number, result);
475 } 505 }
476 } 506 }
477 return count; 507 return count;
478} 508}
479 509
480 510
481static int kobil_write_room (struct usb_serial_port *port) 511static int kobil_write_room(struct tty_struct *tty)
482{ 512{
483 //dbg("%s - port %d", __func__, port->number); 513 /* dbg("%s - port %d", __func__, port->number); */
514 /* FIXME */
484 return 8; 515 return 8;
485} 516}
486 517
487 518
488static int kobil_tiocmget(struct usb_serial_port *port, struct file *file) 519static int kobil_tiocmget(struct tty_struct *tty, struct file *file)
489{ 520{
490 struct kobil_private * priv; 521 struct usb_serial_port *port = tty->driver_data;
522 struct kobil_private *priv;
491 int result; 523 int result;
492 unsigned char *transfer_buffer; 524 unsigned char *transfer_buffer;
493 int transfer_buffer_length = 8; 525 int transfer_buffer_length = 8;
494 526
495 priv = usb_get_serial_port_data(port); 527 priv = usb_get_serial_port_data(port);
496 if ((priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) || (priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID)) { 528 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID
497 // This device doesn't support ioctl calls 529 || priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
530 /* This device doesn't support ioctl calls */
498 return -EINVAL; 531 return -EINVAL;
499 } 532 }
500 533
501 // allocate memory for transfer buffer 534 /* allocate memory for transfer buffer */
502 transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); 535 transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL);
503 if (!transfer_buffer) { 536 if (!transfer_buffer)
504 return -ENOMEM; 537 return -ENOMEM;
505 }
506 538
507 result = usb_control_msg( port->serial->dev, 539 result = usb_control_msg(port->serial->dev,
508 usb_rcvctrlpipe(port->serial->dev, 0 ), 540 usb_rcvctrlpipe(port->serial->dev, 0),
509 SUSBCRequest_GetStatusLineState, 541 SUSBCRequest_GetStatusLineState,
510 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN, 542 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
511 0, 543 0,
512 0, 544 0,
513 transfer_buffer, 545 transfer_buffer,
514 transfer_buffer_length, 546 transfer_buffer_length,
515 KOBIL_TIMEOUT); 547 KOBIL_TIMEOUT);
516 548
517 dbg("%s - port %d Send get_status_line_state URB returns: %i. Statusline: %02x", 549 dbg("%s - port %d Send get_status_line_state URB returns: %i. Statusline: %02x",
518 __func__, port->number, result, transfer_buffer[0]); 550 __func__, port->number, result, transfer_buffer[0]);
519 551
520 result = 0; 552 result = 0;
@@ -524,10 +556,11 @@ static int kobil_tiocmget(struct usb_serial_port *port, struct file *file)
524 return result; 556 return result;
525} 557}
526 558
527static int kobil_tiocmset(struct usb_serial_port *port, struct file *file, 559static int kobil_tiocmset(struct tty_struct *tty, struct file *file,
528 unsigned int set, unsigned int clear) 560 unsigned int set, unsigned int clear)
529{ 561{
530 struct kobil_private * priv; 562 struct usb_serial_port *port = tty->driver_data;
563 struct kobil_private *priv;
531 int result; 564 int result;
532 int dtr = 0; 565 int dtr = 0;
533 int rts = 0; 566 int rts = 0;
@@ -536,16 +569,16 @@ static int kobil_tiocmset(struct usb_serial_port *port, struct file *file,
536 569
537 /* FIXME: locking ? */ 570 /* FIXME: locking ? */
538 priv = usb_get_serial_port_data(port); 571 priv = usb_get_serial_port_data(port);
539 if ((priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) || (priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID)) { 572 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID
540 // This device doesn't support ioctl calls 573 || priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
574 /* This device doesn't support ioctl calls */
541 return -EINVAL; 575 return -EINVAL;
542 } 576 }
543 577
544 // allocate memory for transfer buffer 578 /* allocate memory for transfer buffer */
545 transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL); 579 transfer_buffer = kzalloc(transfer_buffer_length, GFP_KERNEL);
546 if (! transfer_buffer) { 580 if (!transfer_buffer)
547 return -ENOMEM; 581 return -ENOMEM;
548 }
549 582
550 if (set & TIOCM_RTS) 583 if (set & TIOCM_RTS)
551 rts = 1; 584 rts = 1;
@@ -558,66 +591,77 @@ static int kobil_tiocmset(struct usb_serial_port *port, struct file *file,
558 591
559 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) { 592 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) {
560 if (dtr != 0) 593 if (dtr != 0)
561 dbg("%s - port %d Setting DTR", __func__, port->number); 594 dbg("%s - port %d Setting DTR",
595 __func__, port->number);
562 else 596 else
563 dbg("%s - port %d Clearing DTR", __func__, port->number); 597 dbg("%s - port %d Clearing DTR",
564 result = usb_control_msg( port->serial->dev, 598 __func__, port->number);
565 usb_rcvctrlpipe(port->serial->dev, 0 ), 599 result = usb_control_msg(port->serial->dev,
566 SUSBCRequest_SetStatusLinesOrQueues, 600 usb_rcvctrlpipe(port->serial->dev, 0),
567 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT, 601 SUSBCRequest_SetStatusLinesOrQueues,
568 ((dtr != 0) ? SUSBCR_SSL_SETDTR : SUSBCR_SSL_CLRDTR), 602 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
569 0, 603 ((dtr != 0) ? SUSBCR_SSL_SETDTR : SUSBCR_SSL_CLRDTR),
570 transfer_buffer, 604 0,
571 0, 605 transfer_buffer,
572 KOBIL_TIMEOUT); 606 0,
607 KOBIL_TIMEOUT);
573 } else { 608 } else {
574 if (rts != 0) 609 if (rts != 0)
575 dbg("%s - port %d Setting RTS", __func__, port->number); 610 dbg("%s - port %d Setting RTS",
611 __func__, port->number);
576 else 612 else
577 dbg("%s - port %d Clearing RTS", __func__, port->number); 613 dbg("%s - port %d Clearing RTS",
578 result = usb_control_msg( port->serial->dev, 614 __func__, port->number);
579 usb_rcvctrlpipe(port->serial->dev, 0 ), 615 result = usb_control_msg(port->serial->dev,
580 SUSBCRequest_SetStatusLinesOrQueues, 616 usb_rcvctrlpipe(port->serial->dev, 0),
581 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT, 617 SUSBCRequest_SetStatusLinesOrQueues,
582 ((rts != 0) ? SUSBCR_SSL_SETRTS : SUSBCR_SSL_CLRRTS), 618 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
583 0, 619 ((rts != 0) ? SUSBCR_SSL_SETRTS : SUSBCR_SSL_CLRRTS),
584 transfer_buffer, 620 0,
585 0, 621 transfer_buffer,
586 KOBIL_TIMEOUT); 622 0,
623 KOBIL_TIMEOUT);
587 } 624 }
588 dbg("%s - port %d Send set_status_line URB returns: %i", __func__, port->number, result); 625 dbg("%s - port %d Send set_status_line URB returns: %i",
626 __func__, port->number, result);
589 kfree(transfer_buffer); 627 kfree(transfer_buffer);
590 return (result < 0) ? result : 0; 628 return (result < 0) ? result : 0;
591} 629}
592 630
593static void kobil_set_termios(struct usb_serial_port *port, struct ktermios *old) 631static void kobil_set_termios(struct tty_struct *tty,
632 struct usb_serial_port *port, struct ktermios *old)
594{ 633{
595 struct kobil_private * priv; 634 struct kobil_private *priv;
596 int result; 635 int result;
597 unsigned short urb_val = 0; 636 unsigned short urb_val = 0;
598 int c_cflag = port->tty->termios->c_cflag; 637 int c_cflag = tty->termios->c_cflag;
599 speed_t speed; 638 speed_t speed;
600 void * settings; 639 void *settings;
601 640
602 priv = usb_get_serial_port_data(port); 641 priv = usb_get_serial_port_data(port);
603 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) 642 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID ||
604 // This device doesn't support ioctl calls 643 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
644 /* This device doesn't support ioctl calls */
645 *tty->termios = *old;
605 return; 646 return;
647 }
606 648
607 switch (speed = tty_get_baud_rate(port->tty)) { 649 speed = tty_get_baud_rate(tty);
608 case 1200: 650 switch (speed) {
609 urb_val = SUSBCR_SBR_1200; 651 case 1200:
610 break; 652 urb_val = SUSBCR_SBR_1200;
611 default: 653 break;
612 speed = 9600; 654 default:
613 case 9600: 655 speed = 9600;
614 urb_val = SUSBCR_SBR_9600; 656 case 9600:
615 break; 657 urb_val = SUSBCR_SBR_9600;
658 break;
616 } 659 }
617 urb_val |= (c_cflag & CSTOPB) ? SUSBCR_SPASB_2StopBits : SUSBCR_SPASB_1StopBit; 660 urb_val |= (c_cflag & CSTOPB) ? SUSBCR_SPASB_2StopBits :
661 SUSBCR_SPASB_1StopBit;
618 662
619 settings = kzalloc(50, GFP_KERNEL); 663 settings = kzalloc(50, GFP_KERNEL);
620 if (! settings) 664 if (!settings)
621 return; 665 return;
622 666
623 sprintf(settings, "%d ", speed); 667 sprintf(settings, "%d ", speed);
@@ -634,66 +678,69 @@ static void kobil_set_termios(struct usb_serial_port *port, struct ktermios *old
634 urb_val |= SUSBCR_SPASB_NoParity; 678 urb_val |= SUSBCR_SPASB_NoParity;
635 strcat(settings, "No Parity"); 679 strcat(settings, "No Parity");
636 } 680 }
637 port->tty->termios->c_cflag &= ~CMSPAR; 681 tty->termios->c_cflag &= ~CMSPAR;
638 tty_encode_baud_rate(port->tty, speed, speed); 682 tty_encode_baud_rate(tty, speed, speed);
639 683
640 result = usb_control_msg( port->serial->dev, 684 result = usb_control_msg(port->serial->dev,
641 usb_rcvctrlpipe(port->serial->dev, 0 ), 685 usb_rcvctrlpipe(port->serial->dev, 0),
642 SUSBCRequest_SetBaudRateParityAndStopBits, 686 SUSBCRequest_SetBaudRateParityAndStopBits,
643 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT, 687 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
644 urb_val, 688 urb_val,
645 0, 689 0,
646 settings, 690 settings,
647 0, 691 0,
648 KOBIL_TIMEOUT 692 KOBIL_TIMEOUT
649 ); 693 );
650 kfree(settings); 694 kfree(settings);
651} 695}
652 696
653static int kobil_ioctl(struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) 697static int kobil_ioctl(struct tty_struct *tty, struct file *file,
698 unsigned int cmd, unsigned long arg)
654{ 699{
655 struct kobil_private * priv = usb_get_serial_port_data(port); 700 struct usb_serial_port *port = tty->driver_data;
701 struct kobil_private *priv = usb_get_serial_port_data(port);
656 unsigned char *transfer_buffer; 702 unsigned char *transfer_buffer;
657 int transfer_buffer_length = 8; 703 int transfer_buffer_length = 8;
658 int result; 704 int result;
659 705
660 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) 706 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID ||
661 // This device doesn't support ioctl calls 707 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID)
662 return 0; 708 /* This device doesn't support ioctl calls */
709 return -ENOIOCTLCMD;
663 710
664 switch (cmd) { 711 switch (cmd) {
665 case TCFLSH: // 0x540B 712 case TCFLSH:
666 transfer_buffer = kmalloc(transfer_buffer_length, GFP_KERNEL); 713 transfer_buffer = kmalloc(transfer_buffer_length, GFP_KERNEL);
667 if (! transfer_buffer) 714 if (!transfer_buffer)
668 return -ENOBUFS; 715 return -ENOBUFS;
669 716
670 result = usb_control_msg( port->serial->dev, 717 result = usb_control_msg(port->serial->dev,
671 usb_rcvctrlpipe(port->serial->dev, 0 ), 718 usb_rcvctrlpipe(port->serial->dev, 0),
672 SUSBCRequest_Misc, 719 SUSBCRequest_Misc,
673 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT, 720 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
674 SUSBCR_MSC_ResetAllQueues, 721 SUSBCR_MSC_ResetAllQueues,
675 0, 722 0,
676 NULL,//transfer_buffer, 723 NULL, /* transfer_buffer, */
677 0, 724 0,
678 KOBIL_TIMEOUT 725 KOBIL_TIMEOUT
679 ); 726 );
680 727
681 dbg("%s - port %d Send reset_all_queues (FLUSH) URB returns: %i", __func__, port->number, result); 728 dbg("%s - port %d Send reset_all_queues (FLUSH) URB returns: %i", __func__, port->number, result);
682 kfree(transfer_buffer); 729 kfree(transfer_buffer);
683 return (result < 0) ? -EFAULT : 0; 730 return (result < 0) ? -EIO: 0;
684 default: 731 default:
685 return -ENOIOCTLCMD; 732 return -ENOIOCTLCMD;
686 } 733 }
687} 734}
688 735
689static int __init kobil_init (void) 736static int __init kobil_init(void)
690{ 737{
691 int retval; 738 int retval;
692 retval = usb_serial_register(&kobil_device); 739 retval = usb_serial_register(&kobil_device);
693 if (retval) 740 if (retval)
694 goto failed_usb_serial_register; 741 goto failed_usb_serial_register;
695 retval = usb_register(&kobil_driver); 742 retval = usb_register(&kobil_driver);
696 if (retval) 743 if (retval)
697 goto failed_usb_register; 744 goto failed_usb_register;
698 745
699 info(DRIVER_VERSION " " DRIVER_AUTHOR); 746 info(DRIVER_VERSION " " DRIVER_AUTHOR);
@@ -707,18 +754,18 @@ failed_usb_serial_register:
707} 754}
708 755
709 756
710static void __exit kobil_exit (void) 757static void __exit kobil_exit(void)
711{ 758{
712 usb_deregister (&kobil_driver); 759 usb_deregister(&kobil_driver);
713 usb_serial_deregister (&kobil_device); 760 usb_serial_deregister(&kobil_device);
714} 761}
715 762
716module_init(kobil_init); 763module_init(kobil_init);
717module_exit(kobil_exit); 764module_exit(kobil_exit);
718 765
719MODULE_AUTHOR( DRIVER_AUTHOR ); 766MODULE_AUTHOR(DRIVER_AUTHOR);
720MODULE_DESCRIPTION( DRIVER_DESC ); 767MODULE_DESCRIPTION(DRIVER_DESC);
721MODULE_LICENSE( "GPL" ); 768MODULE_LICENSE("GPL");
722 769
723module_param(debug, bool, S_IRUGO | S_IWUSR); 770module_param(debug, bool, S_IRUGO | S_IWUSR);
724MODULE_PARM_DESC(debug, "Debug enabled or not"); 771MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
index 5fc2cef30e39..0ded8bd6ec85 100644
--- a/drivers/usb/serial/mct_u232.c
+++ b/drivers/usb/serial/mct_u232.c
@@ -33,10 +33,11 @@
33 * - Fixed an endianess problem with the baudrate selection for PowerPC. 33 * - Fixed an endianess problem with the baudrate selection for PowerPC.
34 * 34 *
35 * 06-Dec-2001 Martin Hamilton <martinh@gnu.org> 35 * 06-Dec-2001 Martin Hamilton <martinh@gnu.org>
36 * Added support for the Belkin F5U109 DB9 adaptor 36 * - Added support for the Belkin F5U109 DB9 adaptor
37 * 37 *
38 * 30-May-2001 Greg Kroah-Hartman 38 * 30-May-2001 Greg Kroah-Hartman
39 * switched from using spinlock to a semaphore, which fixes lots of problems. 39 * - switched from using spinlock to a semaphore, which fixes lots of
40 * problems.
40 * 41 *
41 * 04-May-2001 Stelian Pop 42 * 04-May-2001 Stelian Pop
42 * - Set the maximum bulk output size for Sitecom U232-P25 model to 16 bytes 43 * - Set the maximum bulk output size for Sitecom U232-P25 model to 16 bytes
@@ -49,7 +50,7 @@
49 * 08-Apr-2001 gb 50 * 08-Apr-2001 gb
50 * - Identify version on module load. 51 * - Identify version on module load.
51 * 52 *
52 * 06-Jan-2001 Cornel Ciocirlan 53 * 06-Jan-2001 Cornel Ciocirlan
53 * - Added support for Sitecom U232-P25 model (Product Id 0x0230) 54 * - Added support for Sitecom U232-P25 model (Product Id 0x0230)
54 * - Added support for D-Link DU-H3SP USB BAY (Product Id 0x0200) 55 * - Added support for D-Link DU-H3SP USB BAY (Product Id 0x0200)
55 * 56 *
@@ -59,8 +60,8 @@
59 * (lots of things will change if/when the usb-serial core changes to 60 * (lots of things will change if/when the usb-serial core changes to
60 * handle these issues. 61 * handle these issues.
61 * 62 *
62 * 27-Nov-2000 Wolfgang Grandegger 63 * 27-Nov-2000 Wolfgang Grandegge
63 * A version for kernel 2.4.0-test10 released to the Linux community 64 * A version for kernel 2.4.0-test10 released to the Linux community
64 * (via linux-usb-devel). 65 * (via linux-usb-devel).
65 */ 66 */
66 67
@@ -73,7 +74,7 @@
73#include <linux/tty_flip.h> 74#include <linux/tty_flip.h>
74#include <linux/module.h> 75#include <linux/module.h>
75#include <linux/spinlock.h> 76#include <linux/spinlock.h>
76#include <asm/uaccess.h> 77#include <linux/uaccess.h>
77#include <linux/usb.h> 78#include <linux/usb.h>
78#include <linux/usb/serial.h> 79#include <linux/usb/serial.h>
79#include "mct_u232.h" 80#include "mct_u232.h"
@@ -90,28 +91,21 @@ static int debug;
90/* 91/*
91 * Function prototypes 92 * Function prototypes
92 */ 93 */
93static int mct_u232_startup (struct usb_serial *serial); 94static int mct_u232_startup(struct usb_serial *serial);
94static void mct_u232_shutdown (struct usb_serial *serial); 95static void mct_u232_shutdown(struct usb_serial *serial);
95static int mct_u232_open (struct usb_serial_port *port, 96static int mct_u232_open(struct tty_struct *tty,
96 struct file *filp); 97 struct usb_serial_port *port, struct file *filp);
97static void mct_u232_close (struct usb_serial_port *port, 98static void mct_u232_close(struct tty_struct *tty,
98 struct file *filp); 99 struct usb_serial_port *port, struct file *filp);
99static void mct_u232_read_int_callback (struct urb *urb); 100static void mct_u232_read_int_callback(struct urb *urb);
100static void mct_u232_set_termios (struct usb_serial_port *port, 101static void mct_u232_set_termios(struct tty_struct *tty,
101 struct ktermios * old); 102 struct usb_serial_port *port, struct ktermios *old);
102static int mct_u232_ioctl (struct usb_serial_port *port, 103static void mct_u232_break_ctl(struct tty_struct *tty, int break_state);
103 struct file * file, 104static int mct_u232_tiocmget(struct tty_struct *tty, struct file *file);
104 unsigned int cmd, 105static int mct_u232_tiocmset(struct tty_struct *tty, struct file *file,
105 unsigned long arg); 106 unsigned int set, unsigned int clear);
106static void mct_u232_break_ctl (struct usb_serial_port *port, 107static void mct_u232_throttle(struct tty_struct *tty);
107 int break_state ); 108static void mct_u232_unthrottle(struct tty_struct *tty);
108static int mct_u232_tiocmget (struct usb_serial_port *port,
109 struct file *file);
110static int mct_u232_tiocmset (struct usb_serial_port *port,
111 struct file *file, unsigned int set,
112 unsigned int clear);
113static void mct_u232_throttle (struct usb_serial_port *port);
114static void mct_u232_unthrottle (struct usb_serial_port *port);
115 109
116 110
117/* 111/*
@@ -125,7 +119,7 @@ static struct usb_device_id id_table_combined [] = {
125 { } /* Terminating entry */ 119 { } /* Terminating entry */
126}; 120};
127 121
128MODULE_DEVICE_TABLE (usb, id_table_combined); 122MODULE_DEVICE_TABLE(usb, id_table_combined);
129 123
130static struct usb_driver mct_u232_driver = { 124static struct usb_driver mct_u232_driver = {
131 .name = "mct_u232", 125 .name = "mct_u232",
@@ -149,7 +143,6 @@ static struct usb_serial_driver mct_u232_device = {
149 .throttle = mct_u232_throttle, 143 .throttle = mct_u232_throttle,
150 .unthrottle = mct_u232_unthrottle, 144 .unthrottle = mct_u232_unthrottle,
151 .read_int_callback = mct_u232_read_int_callback, 145 .read_int_callback = mct_u232_read_int_callback,
152 .ioctl = mct_u232_ioctl,
153 .set_termios = mct_u232_set_termios, 146 .set_termios = mct_u232_set_termios,
154 .break_ctl = mct_u232_break_ctl, 147 .break_ctl = mct_u232_break_ctl,
155 .tiocmget = mct_u232_tiocmget, 148 .tiocmget = mct_u232_tiocmget,
@@ -180,23 +173,34 @@ struct mct_u232_private {
180 * Later day 2.6.0-test kernels have new baud rates like B230400 which 173 * Later day 2.6.0-test kernels have new baud rates like B230400 which
181 * we do not know how to support. We ignore them for the moment. 174 * we do not know how to support. We ignore them for the moment.
182 */ 175 */
183static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value, speed_t *result) 176static int mct_u232_calculate_baud_rate(struct usb_serial *serial,
177 speed_t value, speed_t *result)
184{ 178{
185 *result = value; 179 *result = value;
186 180
187 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID 181 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
188 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) { 182 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
189 switch (value) { 183 switch (value) {
190 case 300: return 0x01; 184 case 300:
191 case 600: return 0x02; /* this one not tested */ 185 return 0x01;
192 case 1200: return 0x03; 186 case 600:
193 case 2400: return 0x04; 187 return 0x02; /* this one not tested */
194 case 4800: return 0x06; 188 case 1200:
195 case 9600: return 0x08; 189 return 0x03;
196 case 19200: return 0x09; 190 case 2400:
197 case 38400: return 0x0a; 191 return 0x04;
198 case 57600: return 0x0b; 192 case 4800:
199 case 115200: return 0x0c; 193 return 0x06;
194 case 9600:
195 return 0x08;
196 case 19200:
197 return 0x09;
198 case 38400:
199 return 0x0a;
200 case 57600:
201 return 0x0b;
202 case 115200:
203 return 0x0c;
200 default: 204 default:
201 *result = 9600; 205 *result = 9600;
202 return 0x08; 206 return 0x08;
@@ -224,26 +228,27 @@ static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value
224 } 228 }
225} 229}
226 230
227static int mct_u232_set_baud_rate(struct usb_serial *serial, struct usb_serial_port *port, 231static int mct_u232_set_baud_rate(struct tty_struct *tty,
228 speed_t value) 232 struct usb_serial *serial, struct usb_serial_port *port, speed_t value)
229{ 233{
230 __le32 divisor; 234 __le32 divisor;
231 int rc; 235 int rc;
232 unsigned char zero_byte = 0; 236 unsigned char zero_byte = 0;
233 unsigned char cts_enable_byte = 0; 237 unsigned char cts_enable_byte = 0;
234 speed_t speed; 238 speed_t speed;
235 239
236 divisor = cpu_to_le32(mct_u232_calculate_baud_rate(serial, value, &speed)); 240 divisor = cpu_to_le32(mct_u232_calculate_baud_rate(serial, value,
237 241 &speed));
238 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 242
239 MCT_U232_SET_BAUD_RATE_REQUEST, 243 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
240 MCT_U232_SET_REQUEST_TYPE, 244 MCT_U232_SET_BAUD_RATE_REQUEST,
241 0, 0, &divisor, MCT_U232_SET_BAUD_RATE_SIZE, 245 MCT_U232_SET_REQUEST_TYPE,
242 WDR_TIMEOUT); 246 0, 0, &divisor, MCT_U232_SET_BAUD_RATE_SIZE,
247 WDR_TIMEOUT);
243 if (rc < 0) /*FIXME: What value speed results */ 248 if (rc < 0) /*FIXME: What value speed results */
244 err("Set BAUD RATE %d failed (error = %d)", value, rc); 249 err("Set BAUD RATE %d failed (error = %d)", value, rc);
245 else 250 else
246 tty_encode_baud_rate(port->tty, speed, speed); 251 tty_encode_baud_rate(tty, speed, speed);
247 dbg("set_baud_rate: value: 0x%x, divisor: 0x%x", value, divisor); 252 dbg("set_baud_rate: value: 0x%x, divisor: 0x%x", value, divisor);
248 253
249 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which 254 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
@@ -258,55 +263,55 @@ static int mct_u232_set_baud_rate(struct usb_serial *serial, struct usb_serial_p
258 whether data will be transmitted to a device which is not asserting 263 whether data will be transmitted to a device which is not asserting
259 the 'CTS' signal. If the second message's data byte is zero, data 264 the 'CTS' signal. If the second message's data byte is zero, data
260 will be transmitted even if 'CTS' is not asserted (i.e. no hardware 265 will be transmitted even if 'CTS' is not asserted (i.e. no hardware
261 flow control). if the second message's data byte is nonzero (a value 266 flow control). if the second message's data byte is nonzero (a
262 of 1 is used by this driver), data will not be transmitted to a device 267 value of 1 is used by this driver), data will not be transmitted to
263 which is not asserting 'CTS'. 268 a device which is not asserting 'CTS'.
264 */ 269 */
265 270
266 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 271 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
267 MCT_U232_SET_UNKNOWN1_REQUEST, 272 MCT_U232_SET_UNKNOWN1_REQUEST,
268 MCT_U232_SET_REQUEST_TYPE, 273 MCT_U232_SET_REQUEST_TYPE,
269 0, 0, &zero_byte, MCT_U232_SET_UNKNOWN1_SIZE, 274 0, 0, &zero_byte, MCT_U232_SET_UNKNOWN1_SIZE,
270 WDR_TIMEOUT); 275 WDR_TIMEOUT);
271 if (rc < 0) 276 if (rc < 0)
272 err("Sending USB device request code %d failed (error = %d)", 277 err("Sending USB device request code %d failed (error = %d)",
273 MCT_U232_SET_UNKNOWN1_REQUEST, rc); 278 MCT_U232_SET_UNKNOWN1_REQUEST, rc);
274 279
275 if (port && C_CRTSCTS(port->tty)) { 280 if (port && C_CRTSCTS(tty))
276 cts_enable_byte = 1; 281 cts_enable_byte = 1;
277 }
278 282
279 dbg("set_baud_rate: send second control message, data = %02X", cts_enable_byte); 283 dbg("set_baud_rate: send second control message, data = %02X",
284 cts_enable_byte);
280 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 285 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
281 MCT_U232_SET_CTS_REQUEST, 286 MCT_U232_SET_CTS_REQUEST,
282 MCT_U232_SET_REQUEST_TYPE, 287 MCT_U232_SET_REQUEST_TYPE,
283 0, 0, &cts_enable_byte, MCT_U232_SET_CTS_SIZE, 288 0, 0, &cts_enable_byte, MCT_U232_SET_CTS_SIZE,
284 WDR_TIMEOUT); 289 WDR_TIMEOUT);
285 if (rc < 0) 290 if (rc < 0)
286 err("Sending USB device request code %d failed (error = %d)", 291 err("Sending USB device request code %d failed (error = %d)",
287 MCT_U232_SET_CTS_REQUEST, rc); 292 MCT_U232_SET_CTS_REQUEST, rc);
288 293
289 return rc; 294 return rc;
290} /* mct_u232_set_baud_rate */ 295} /* mct_u232_set_baud_rate */
291 296
292static int mct_u232_set_line_ctrl(struct usb_serial *serial, unsigned char lcr) 297static int mct_u232_set_line_ctrl(struct usb_serial *serial, unsigned char lcr)
293{ 298{
294 int rc; 299 int rc;
295 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 300 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
296 MCT_U232_SET_LINE_CTRL_REQUEST, 301 MCT_U232_SET_LINE_CTRL_REQUEST,
297 MCT_U232_SET_REQUEST_TYPE, 302 MCT_U232_SET_REQUEST_TYPE,
298 0, 0, &lcr, MCT_U232_SET_LINE_CTRL_SIZE, 303 0, 0, &lcr, MCT_U232_SET_LINE_CTRL_SIZE,
299 WDR_TIMEOUT); 304 WDR_TIMEOUT);
300 if (rc < 0) 305 if (rc < 0)
301 err("Set LINE CTRL 0x%x failed (error = %d)", lcr, rc); 306 err("Set LINE CTRL 0x%x failed (error = %d)", lcr, rc);
302 dbg("set_line_ctrl: 0x%x", lcr); 307 dbg("set_line_ctrl: 0x%x", lcr);
303 return rc; 308 return rc;
304} /* mct_u232_set_line_ctrl */ 309} /* mct_u232_set_line_ctrl */
305 310
306static int mct_u232_set_modem_ctrl(struct usb_serial *serial, 311static int mct_u232_set_modem_ctrl(struct usb_serial *serial,
307 unsigned int control_state) 312 unsigned int control_state)
308{ 313{
309 int rc; 314 int rc;
310 unsigned char mcr = MCT_U232_MCR_NONE; 315 unsigned char mcr = MCT_U232_MCR_NONE;
311 316
312 if (control_state & TIOCM_DTR) 317 if (control_state & TIOCM_DTR)
@@ -314,37 +319,39 @@ static int mct_u232_set_modem_ctrl(struct usb_serial *serial,
314 if (control_state & TIOCM_RTS) 319 if (control_state & TIOCM_RTS)
315 mcr |= MCT_U232_MCR_RTS; 320 mcr |= MCT_U232_MCR_RTS;
316 321
317 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 322 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
318 MCT_U232_SET_MODEM_CTRL_REQUEST, 323 MCT_U232_SET_MODEM_CTRL_REQUEST,
319 MCT_U232_SET_REQUEST_TYPE, 324 MCT_U232_SET_REQUEST_TYPE,
320 0, 0, &mcr, MCT_U232_SET_MODEM_CTRL_SIZE, 325 0, 0, &mcr, MCT_U232_SET_MODEM_CTRL_SIZE,
321 WDR_TIMEOUT); 326 WDR_TIMEOUT);
322 if (rc < 0) 327 if (rc < 0)
323 err("Set MODEM CTRL 0x%x failed (error = %d)", mcr, rc); 328 err("Set MODEM CTRL 0x%x failed (error = %d)", mcr, rc);
324 dbg("set_modem_ctrl: state=0x%x ==> mcr=0x%x", control_state, mcr); 329 dbg("set_modem_ctrl: state=0x%x ==> mcr=0x%x", control_state, mcr);
325 330
326 return rc; 331 return rc;
327} /* mct_u232_set_modem_ctrl */ 332} /* mct_u232_set_modem_ctrl */
328 333
329static int mct_u232_get_modem_stat(struct usb_serial *serial, unsigned char *msr) 334static int mct_u232_get_modem_stat(struct usb_serial *serial,
335 unsigned char *msr)
330{ 336{
331 int rc; 337 int rc;
332 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 338 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
333 MCT_U232_GET_MODEM_STAT_REQUEST, 339 MCT_U232_GET_MODEM_STAT_REQUEST,
334 MCT_U232_GET_REQUEST_TYPE, 340 MCT_U232_GET_REQUEST_TYPE,
335 0, 0, msr, MCT_U232_GET_MODEM_STAT_SIZE, 341 0, 0, msr, MCT_U232_GET_MODEM_STAT_SIZE,
336 WDR_TIMEOUT); 342 WDR_TIMEOUT);
337 if (rc < 0) { 343 if (rc < 0) {
338 err("Get MODEM STATus failed (error = %d)", rc); 344 err("Get MODEM STATus failed (error = %d)", rc);
339 *msr = 0; 345 *msr = 0;
340 } 346 }
341 dbg("get_modem_stat: 0x%x", *msr); 347 dbg("get_modem_stat: 0x%x", *msr);
342 return rc; 348 return rc;
343} /* mct_u232_get_modem_stat */ 349} /* mct_u232_get_modem_stat */
344 350
345static void mct_u232_msr_to_state(unsigned int *control_state, unsigned char msr) 351static void mct_u232_msr_to_state(unsigned int *control_state,
352 unsigned char msr)
346{ 353{
347 /* Translate Control Line states */ 354 /* Translate Control Line states */
348 if (msr & MCT_U232_MSR_DSR) 355 if (msr & MCT_U232_MSR_DSR)
349 *control_state |= TIOCM_DSR; 356 *control_state |= TIOCM_DSR;
350 else 357 else
@@ -361,14 +368,14 @@ static void mct_u232_msr_to_state(unsigned int *control_state, unsigned char msr
361 *control_state |= TIOCM_CD; 368 *control_state |= TIOCM_CD;
362 else 369 else
363 *control_state &= ~TIOCM_CD; 370 *control_state &= ~TIOCM_CD;
364 dbg("msr_to_state: msr=0x%x ==> state=0x%x", msr, *control_state); 371 dbg("msr_to_state: msr=0x%x ==> state=0x%x", msr, *control_state);
365} /* mct_u232_msr_to_state */ 372} /* mct_u232_msr_to_state */
366 373
367/* 374/*
368 * Driver's tty interface functions 375 * Driver's tty interface functions
369 */ 376 */
370 377
371static int mct_u232_startup (struct usb_serial *serial) 378static int mct_u232_startup(struct usb_serial *serial)
372{ 379{
373 struct mct_u232_private *priv; 380 struct mct_u232_private *priv;
374 struct usb_serial_port *port, *rport; 381 struct usb_serial_port *port, *rport;
@@ -390,18 +397,18 @@ static int mct_u232_startup (struct usb_serial *serial)
390 rport->interrupt_in_urb = NULL; 397 rport->interrupt_in_urb = NULL;
391 port->read_urb->context = port; 398 port->read_urb->context = port;
392 399
393 return (0); 400 return 0;
394} /* mct_u232_startup */ 401} /* mct_u232_startup */
395 402
396 403
397static void mct_u232_shutdown (struct usb_serial *serial) 404static void mct_u232_shutdown(struct usb_serial *serial)
398{ 405{
399 struct mct_u232_private *priv; 406 struct mct_u232_private *priv;
400 int i; 407 int i;
401 408
402 dbg("%s", __func__); 409 dbg("%s", __func__);
403 410
404 for (i=0; i < serial->num_ports; ++i) { 411 for (i = 0; i < serial->num_ports; ++i) {
405 /* My special items, the standard routines free my urbs */ 412 /* My special items, the standard routines free my urbs */
406 priv = usb_get_serial_port_data(serial->port[i]); 413 priv = usb_get_serial_port_data(serial->port[i]);
407 if (priv) { 414 if (priv) {
@@ -411,7 +418,8 @@ static void mct_u232_shutdown (struct usb_serial *serial)
411 } 418 }
412} /* mct_u232_shutdown */ 419} /* mct_u232_shutdown */
413 420
414static int mct_u232_open (struct usb_serial_port *port, struct file *filp) 421static int mct_u232_open(struct tty_struct *tty,
422 struct usb_serial_port *port, struct file *filp)
415{ 423{
416 struct usb_serial *serial = port->serial; 424 struct usb_serial *serial = port->serial;
417 struct mct_u232_private *priv = usb_get_serial_port_data(port); 425 struct mct_u232_private *priv = usb_get_serial_port_data(port);
@@ -428,21 +436,22 @@ static int mct_u232_open (struct usb_serial_port *port, struct file *filp)
428 * it seems to be able to accept only 16 bytes (and that's what 436 * it seems to be able to accept only 16 bytes (and that's what
429 * SniffUSB says too...) 437 * SniffUSB says too...)
430 */ 438 */
431 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID) 439 if (le16_to_cpu(serial->dev->descriptor.idProduct)
440 == MCT_U232_SITECOM_PID)
432 port->bulk_out_size = 16; 441 port->bulk_out_size = 16;
433 442
434 /* Do a defined restart: the normal serial device seems to 443 /* Do a defined restart: the normal serial device seems to
435 * always turn on DTR and RTS here, so do the same. I'm not 444 * always turn on DTR and RTS here, so do the same. I'm not
436 * sure if this is really necessary. But it should not harm 445 * sure if this is really necessary. But it should not harm
437 * either. 446 * either.
438 */ 447 */
439 spin_lock_irqsave(&priv->lock, flags); 448 spin_lock_irqsave(&priv->lock, flags);
440 if (port->tty->termios->c_cflag & CBAUD) 449 if (tty && (tty->termios->c_cflag & CBAUD))
441 priv->control_state = TIOCM_DTR | TIOCM_RTS; 450 priv->control_state = TIOCM_DTR | TIOCM_RTS;
442 else 451 else
443 priv->control_state = 0; 452 priv->control_state = 0;
444 453
445 priv->last_lcr = (MCT_U232_DATA_BITS_8 | 454 priv->last_lcr = (MCT_U232_DATA_BITS_8 |
446 MCT_U232_PARITY_NONE | 455 MCT_U232_PARITY_NONE |
447 MCT_U232_STOP_BITS_1); 456 MCT_U232_STOP_BITS_1);
448 control_state = priv->control_state; 457 control_state = priv->control_state;
@@ -481,15 +490,16 @@ error:
481} /* mct_u232_open */ 490} /* mct_u232_open */
482 491
483 492
484static void mct_u232_close (struct usb_serial_port *port, struct file *filp) 493static void mct_u232_close(struct tty_struct *tty,
494 struct usb_serial_port *port, struct file *filp)
485{ 495{
486 unsigned int c_cflag; 496 unsigned int c_cflag;
487 unsigned int control_state; 497 unsigned int control_state;
488 struct mct_u232_private *priv = usb_get_serial_port_data(port); 498 struct mct_u232_private *priv = usb_get_serial_port_data(port);
489 dbg("%s port %d", __func__, port->number); 499 dbg("%s port %d", __func__, port->number);
490 500
491 if (port->tty) { 501 if (tty) {
492 c_cflag = port->tty->termios->c_cflag; 502 c_cflag = tty->termios->c_cflag;
493 mutex_lock(&port->serial->disc_mutex); 503 mutex_lock(&port->serial->disc_mutex);
494 if (c_cflag & HUPCL && !port->serial->disconnected) { 504 if (c_cflag & HUPCL && !port->serial->disconnected) {
495 /* drop DTR and RTS */ 505 /* drop DTR and RTS */
@@ -512,7 +522,7 @@ static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
512} /* mct_u232_close */ 522} /* mct_u232_close */
513 523
514 524
515static void mct_u232_read_int_callback (struct urb *urb) 525static void mct_u232_read_int_callback(struct urb *urb)
516{ 526{
517 struct usb_serial_port *port = urb->context; 527 struct usb_serial_port *port = urb->context;
518 struct mct_u232_private *priv = usb_get_serial_port_data(port); 528 struct mct_u232_private *priv = usb_get_serial_port_data(port);
@@ -545,36 +555,34 @@ static void mct_u232_read_int_callback (struct urb *urb)
545 return; 555 return;
546 } 556 }
547 557
548 dbg("%s - port %d", __func__, port->number); 558 dbg("%s - port %d", __func__, port->number);
549 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 559 usb_serial_debug_data(debug, &port->dev, __func__,
560 urb->actual_length, data);
550 561
551 /* 562 /*
552 * Work-a-round: handle the 'usual' bulk-in pipe here 563 * Work-a-round: handle the 'usual' bulk-in pipe here
553 */ 564 */
554 if (urb->transfer_buffer_length > 2) { 565 if (urb->transfer_buffer_length > 2) {
555 int i; 566 tty = port->port.tty;
556 tty = port->tty;
557 if (urb->actual_length) { 567 if (urb->actual_length) {
558 for (i = 0; i < urb->actual_length ; ++i) { 568 tty_insert_flip_string(tty, data, urb->actual_length);
559 tty_insert_flip_char(tty, data[i], 0);
560 }
561 tty_flip_buffer_push(tty); 569 tty_flip_buffer_push(tty);
562 } 570 }
563 goto exit; 571 goto exit;
564 } 572 }
565 573
566 /* 574 /*
567 * The interrupt-in pipe signals exceptional conditions (modem line 575 * The interrupt-in pipe signals exceptional conditions (modem line
568 * signal changes and errors). data[0] holds MSR, data[1] holds LSR. 576 * signal changes and errors). data[0] holds MSR, data[1] holds LSR.
569 */ 577 */
570 spin_lock_irqsave(&priv->lock, flags); 578 spin_lock_irqsave(&priv->lock, flags);
571 priv->last_msr = data[MCT_U232_MSR_INDEX]; 579 priv->last_msr = data[MCT_U232_MSR_INDEX];
572 580
573 /* Record Control Line states */ 581 /* Record Control Line states */
574 mct_u232_msr_to_state(&priv->control_state, priv->last_msr); 582 mct_u232_msr_to_state(&priv->control_state, priv->last_msr);
575 583
576#if 0 584#if 0
577 /* Not yet handled. See belin_sa.c for further information */ 585 /* Not yet handled. See belkin_sa.c for further information */
578 /* Now to report any errors */ 586 /* Now to report any errors */
579 priv->last_lsr = data[MCT_U232_LSR_INDEX]; 587 priv->last_lsr = data[MCT_U232_LSR_INDEX];
580 /* 588 /*
@@ -583,7 +591,7 @@ static void mct_u232_read_int_callback (struct urb *urb)
583 * to look in to this before committing any code. 591 * to look in to this before committing any code.
584 */ 592 */
585 if (priv->last_lsr & MCT_U232_LSR_ERR) { 593 if (priv->last_lsr & MCT_U232_LSR_ERR) {
586 tty = port->tty; 594 tty = port->port.tty;
587 /* Overrun Error */ 595 /* Overrun Error */
588 if (priv->last_lsr & MCT_U232_LSR_OE) { 596 if (priv->last_lsr & MCT_U232_LSR_OE) {
589 } 597 }
@@ -600,18 +608,19 @@ static void mct_u232_read_int_callback (struct urb *urb)
600#endif 608#endif
601 spin_unlock_irqrestore(&priv->lock, flags); 609 spin_unlock_irqrestore(&priv->lock, flags);
602exit: 610exit:
603 retval = usb_submit_urb (urb, GFP_ATOMIC); 611 retval = usb_submit_urb(urb, GFP_ATOMIC);
604 if (retval) 612 if (retval)
605 err ("%s - usb_submit_urb failed with result %d", 613 err("%s - usb_submit_urb failed with result %d",
606 __func__, retval); 614 __func__, retval);
607} /* mct_u232_read_int_callback */ 615} /* mct_u232_read_int_callback */
608 616
609static void mct_u232_set_termios (struct usb_serial_port *port, 617static void mct_u232_set_termios(struct tty_struct *tty,
610 struct ktermios *old_termios) 618 struct usb_serial_port *port,
619 struct ktermios *old_termios)
611{ 620{
612 struct usb_serial *serial = port->serial; 621 struct usb_serial *serial = port->serial;
613 struct mct_u232_private *priv = usb_get_serial_port_data(port); 622 struct mct_u232_private *priv = usb_get_serial_port_data(port);
614 struct ktermios *termios = port->tty->termios; 623 struct ktermios *termios = tty->termios;
615 unsigned int cflag = termios->c_cflag; 624 unsigned int cflag = termios->c_cflag;
616 unsigned int old_cflag = old_termios->c_cflag; 625 unsigned int old_cflag = old_termios->c_cflag;
617 unsigned long flags; 626 unsigned long flags;
@@ -631,20 +640,20 @@ static void mct_u232_set_termios (struct usb_serial_port *port,
631 * Premature optimization is the root of all evil. 640 * Premature optimization is the root of all evil.
632 */ 641 */
633 642
634 /* reassert DTR and RTS on transition from B0 */ 643 /* reassert DTR and RTS on transition from B0 */
635 if ((old_cflag & CBAUD) == B0) { 644 if ((old_cflag & CBAUD) == B0) {
636 dbg("%s: baud was B0", __func__); 645 dbg("%s: baud was B0", __func__);
637 control_state |= TIOCM_DTR | TIOCM_RTS; 646 control_state |= TIOCM_DTR | TIOCM_RTS;
638 mct_u232_set_modem_ctrl(serial, control_state); 647 mct_u232_set_modem_ctrl(serial, control_state);
639 } 648 }
640 649
641 mct_u232_set_baud_rate(serial, port, tty_get_baud_rate(port->tty)); 650 mct_u232_set_baud_rate(tty, serial, port, tty_get_baud_rate(tty));
642 651
643 if ((cflag & CBAUD) == B0 ) { 652 if ((cflag & CBAUD) == B0) {
644 dbg("%s: baud is B0", __func__); 653 dbg("%s: baud is B0", __func__);
645 /* Drop RTS and DTR */ 654 /* Drop RTS and DTR */
646 control_state &= ~(TIOCM_DTR | TIOCM_RTS); 655 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
647 mct_u232_set_modem_ctrl(serial, control_state); 656 mct_u232_set_modem_ctrl(serial, control_state);
648 } 657 }
649 658
650 /* 659 /*
@@ -689,8 +698,9 @@ static void mct_u232_set_termios (struct usb_serial_port *port,
689 spin_unlock_irqrestore(&priv->lock, flags); 698 spin_unlock_irqrestore(&priv->lock, flags);
690} /* mct_u232_set_termios */ 699} /* mct_u232_set_termios */
691 700
692static void mct_u232_break_ctl( struct usb_serial_port *port, int break_state ) 701static void mct_u232_break_ctl(struct tty_struct *tty, int break_state)
693{ 702{
703 struct usb_serial_port *port = tty->driver_data;
694 struct usb_serial *serial = port->serial; 704 struct usb_serial *serial = port->serial;
695 struct mct_u232_private *priv = usb_get_serial_port_data(port); 705 struct mct_u232_private *priv = usb_get_serial_port_data(port);
696 unsigned char lcr; 706 unsigned char lcr;
@@ -709,12 +719,13 @@ static void mct_u232_break_ctl( struct usb_serial_port *port, int break_state )
709} /* mct_u232_break_ctl */ 719} /* mct_u232_break_ctl */
710 720
711 721
712static int mct_u232_tiocmget (struct usb_serial_port *port, struct file *file) 722static int mct_u232_tiocmget(struct tty_struct *tty, struct file *file)
713{ 723{
724 struct usb_serial_port *port = tty->driver_data;
714 struct mct_u232_private *priv = usb_get_serial_port_data(port); 725 struct mct_u232_private *priv = usb_get_serial_port_data(port);
715 unsigned int control_state; 726 unsigned int control_state;
716 unsigned long flags; 727 unsigned long flags;
717 728
718 dbg("%s", __func__); 729 dbg("%s", __func__);
719 730
720 spin_lock_irqsave(&priv->lock, flags); 731 spin_lock_irqsave(&priv->lock, flags);
@@ -724,14 +735,15 @@ static int mct_u232_tiocmget (struct usb_serial_port *port, struct file *file)
724 return control_state; 735 return control_state;
725} 736}
726 737
727static int mct_u232_tiocmset (struct usb_serial_port *port, struct file *file, 738static int mct_u232_tiocmset(struct tty_struct *tty, struct file *file,
728 unsigned int set, unsigned int clear) 739 unsigned int set, unsigned int clear)
729{ 740{
741 struct usb_serial_port *port = tty->driver_data;
730 struct usb_serial *serial = port->serial; 742 struct usb_serial *serial = port->serial;
731 struct mct_u232_private *priv = usb_get_serial_port_data(port); 743 struct mct_u232_private *priv = usb_get_serial_port_data(port);
732 unsigned int control_state; 744 unsigned int control_state;
733 unsigned long flags; 745 unsigned long flags;
734 746
735 dbg("%s", __func__); 747 dbg("%s", __func__);
736 748
737 spin_lock_irqsave(&priv->lock, flags); 749 spin_lock_irqsave(&priv->lock, flags);
@@ -751,77 +763,50 @@ static int mct_u232_tiocmset (struct usb_serial_port *port, struct file *file,
751 return mct_u232_set_modem_ctrl(serial, control_state); 763 return mct_u232_set_modem_ctrl(serial, control_state);
752} 764}
753 765
754static int mct_u232_ioctl (struct usb_serial_port *port, struct file * file, 766static void mct_u232_throttle(struct tty_struct *tty)
755 unsigned int cmd, unsigned long arg)
756{
757 dbg("%scmd=0x%x", __func__, cmd);
758
759 /* Based on code from acm.c and others */
760 switch (cmd) {
761 case TIOCMIWAIT:
762 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
763 /* TODO */
764 return( 0 );
765
766 case TIOCGICOUNT:
767 /* return count of modemline transitions */
768 /* TODO */
769 return 0;
770
771 default:
772 dbg("%s: arg not supported - 0x%04x", __func__,cmd);
773 return(-ENOIOCTLCMD);
774 break;
775 }
776 return 0;
777} /* mct_u232_ioctl */
778
779static void mct_u232_throttle (struct usb_serial_port *port)
780{ 767{
768 struct usb_serial_port *port = tty->driver_data;
781 struct mct_u232_private *priv = usb_get_serial_port_data(port); 769 struct mct_u232_private *priv = usb_get_serial_port_data(port);
782 unsigned long flags; 770 unsigned long flags;
783 unsigned int control_state; 771 unsigned int control_state;
784 struct tty_struct *tty;
785 772
786 tty = port->tty;
787 dbg("%s - port %d", __func__, port->number); 773 dbg("%s - port %d", __func__, port->number);
788 774
789 spin_lock_irqsave(&priv->lock, flags); 775 spin_lock_irqsave(&priv->lock, flags);
790 priv->rx_flags |= THROTTLED; 776 priv->rx_flags |= THROTTLED;
791 if (C_CRTSCTS(tty)) { 777 if (C_CRTSCTS(tty)) {
792 priv->control_state &= ~TIOCM_RTS; 778 priv->control_state &= ~TIOCM_RTS;
793 control_state = priv->control_state; 779 control_state = priv->control_state;
794 spin_unlock_irqrestore(&priv->lock, flags); 780 spin_unlock_irqrestore(&priv->lock, flags);
795 (void) mct_u232_set_modem_ctrl(port->serial, control_state); 781 (void) mct_u232_set_modem_ctrl(port->serial, control_state);
796 } else { 782 } else {
797 spin_unlock_irqrestore(&priv->lock, flags); 783 spin_unlock_irqrestore(&priv->lock, flags);
798 } 784 }
799} 785}
800 786
801 787
802static void mct_u232_unthrottle (struct usb_serial_port *port) 788static void mct_u232_unthrottle(struct tty_struct *tty)
803{ 789{
790 struct usb_serial_port *port = tty->driver_data;
804 struct mct_u232_private *priv = usb_get_serial_port_data(port); 791 struct mct_u232_private *priv = usb_get_serial_port_data(port);
805 unsigned long flags; 792 unsigned long flags;
806 unsigned int control_state; 793 unsigned int control_state;
807 struct tty_struct *tty;
808 794
809 dbg("%s - port %d", __func__, port->number); 795 dbg("%s - port %d", __func__, port->number);
810 796
811 tty = port->tty;
812 spin_lock_irqsave(&priv->lock, flags); 797 spin_lock_irqsave(&priv->lock, flags);
813 if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) { 798 if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) {
814 priv->rx_flags &= ~THROTTLED; 799 priv->rx_flags &= ~THROTTLED;
815 priv->control_state |= TIOCM_RTS; 800 priv->control_state |= TIOCM_RTS;
816 control_state = priv->control_state; 801 control_state = priv->control_state;
817 spin_unlock_irqrestore(&priv->lock, flags); 802 spin_unlock_irqrestore(&priv->lock, flags);
818 (void) mct_u232_set_modem_ctrl(port->serial, control_state); 803 (void) mct_u232_set_modem_ctrl(port->serial, control_state);
819 } else { 804 } else {
820 spin_unlock_irqrestore(&priv->lock, flags); 805 spin_unlock_irqrestore(&priv->lock, flags);
821 } 806 }
822} 807}
823 808
824static int __init mct_u232_init (void) 809static int __init mct_u232_init(void)
825{ 810{
826 int retval; 811 int retval;
827 retval = usb_serial_register(&mct_u232_device); 812 retval = usb_serial_register(&mct_u232_device);
@@ -839,18 +824,17 @@ failed_usb_serial_register:
839} 824}
840 825
841 826
842static void __exit mct_u232_exit (void) 827static void __exit mct_u232_exit(void)
843{ 828{
844 usb_deregister (&mct_u232_driver); 829 usb_deregister(&mct_u232_driver);
845 usb_serial_deregister (&mct_u232_device); 830 usb_serial_deregister(&mct_u232_device);
846} 831}
847 832
848 833module_init(mct_u232_init);
849module_init (mct_u232_init);
850module_exit(mct_u232_exit); 834module_exit(mct_u232_exit);
851 835
852MODULE_AUTHOR( DRIVER_AUTHOR ); 836MODULE_AUTHOR(DRIVER_AUTHOR);
853MODULE_DESCRIPTION( DRIVER_DESC ); 837MODULE_DESCRIPTION(DRIVER_DESC);
854MODULE_LICENSE("GPL"); 838MODULE_LICENSE("GPL");
855 839
856module_param(debug, bool, S_IRUGO | S_IWUSR); 840module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index 50f1fe263338..7c4917d77c0a 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -33,7 +33,7 @@
33#include <linux/serial_reg.h> 33#include <linux/serial_reg.h>
34#include <linux/usb.h> 34#include <linux/usb.h>
35#include <linux/usb/serial.h> 35#include <linux/usb/serial.h>
36#include <asm/uaccess.h> 36#include <linux/uaccess.h>
37 37
38 38
39/* 39/*
@@ -64,8 +64,7 @@
64#define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */ 64#define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */
65 65
66/* This structure holds all of the local port information */ 66/* This structure holds all of the local port information */
67struct moschip_port 67struct moschip_port {
68{
69 __u8 shadowLCR; /* last LCR value received */ 68 __u8 shadowLCR; /* last LCR value received */
70 __u8 shadowMCR; /* last MCR value received */ 69 __u8 shadowMCR; /* last MCR value received */
71 __u8 shadowMSR; /* last MSR value received */ 70 __u8 shadowMSR; /* last MSR value received */
@@ -76,8 +75,7 @@ struct moschip_port
76}; 75};
77 76
78/* This structure holds all of the individual serial device information */ 77/* This structure holds all of the individual serial device information */
79struct moschip_serial 78struct moschip_serial {
80{
81 int interrupt_started; 79 int interrupt_started;
82}; 80};
83 81
@@ -88,7 +86,7 @@ static int debug;
88#define MOSCHIP_DEVICE_ID_7715 0x7715 86#define MOSCHIP_DEVICE_ID_7715 0x7715
89 87
90static struct usb_device_id moschip_port_id_table [] = { 88static struct usb_device_id moschip_port_id_table [] = {
91 { USB_DEVICE(USB_VENDOR_ID_MOSCHIP,MOSCHIP_DEVICE_ID_7720) }, 89 { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7720) },
92 { } /* terminating entry */ 90 { } /* terminating entry */
93}; 91};
94MODULE_DEVICE_TABLE(usb, moschip_port_id_table); 92MODULE_DEVICE_TABLE(usb, moschip_port_id_table);
@@ -108,7 +106,7 @@ static void mos7720_interrupt_callback(struct urb *urb)
108 __u8 sp1; 106 __u8 sp1;
109 __u8 sp2; 107 __u8 sp2;
110 108
111 dbg("%s"," : Entering\n"); 109 dbg("%s", " : Entering\n");
112 110
113 switch (status) { 111 switch (status) {
114 case 0: 112 case 0:
@@ -208,7 +206,7 @@ static void mos7720_bulk_in_callback(struct urb *urb)
208 206
209 mos7720_port = urb->context; 207 mos7720_port = urb->context;
210 if (!mos7720_port) { 208 if (!mos7720_port) {
211 dbg("%s","NULL mos7720_port pointer \n"); 209 dbg("%s", "NULL mos7720_port pointer \n");
212 return ; 210 return ;
213 } 211 }
214 212
@@ -218,7 +216,7 @@ static void mos7720_bulk_in_callback(struct urb *urb)
218 216
219 data = urb->transfer_buffer; 217 data = urb->transfer_buffer;
220 218
221 tty = port->tty; 219 tty = port->port.tty;
222 if (tty && urb->actual_length) { 220 if (tty && urb->actual_length) {
223 tty_buffer_request_room(tty, urb->actual_length); 221 tty_buffer_request_room(tty, urb->actual_length);
224 tty_insert_flip_string(tty, data, urb->actual_length); 222 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -264,7 +262,7 @@ static void mos7720_bulk_out_data_callback(struct urb *urb)
264 262
265 dbg("Entering ........."); 263 dbg("Entering .........");
266 264
267 tty = mos7720_port->port->tty; 265 tty = mos7720_port->port->port.tty;
268 266
269 if (tty && mos7720_port->open) 267 if (tty && mos7720_port->open)
270 tty_wakeup(tty); 268 tty_wakeup(tty);
@@ -284,17 +282,16 @@ static int send_mos_cmd(struct usb_serial *serial, __u8 request, __u16 value,
284 __u16 size = 0x0000; 282 __u16 size = 0x0000;
285 283
286 if (value < MOS_MAX_PORT) { 284 if (value < MOS_MAX_PORT) {
287 if (product == MOSCHIP_DEVICE_ID_7715) { 285 if (product == MOSCHIP_DEVICE_ID_7715)
288 value = value*0x100+0x100; 286 value = value*0x100+0x100;
289 } else { 287 else
290 value = value*0x100+0x200; 288 value = value*0x100+0x200;
291 }
292 } else { 289 } else {
293 value = 0x0000; 290 value = 0x0000;
294 if ((product == MOSCHIP_DEVICE_ID_7715) && 291 if ((product == MOSCHIP_DEVICE_ID_7715) &&
295 (index != 0x08)) { 292 (index != 0x08)) {
296 dbg("serial->product== MOSCHIP_DEVICE_ID_7715"); 293 dbg("serial->product== MOSCHIP_DEVICE_ID_7715");
297 //index = 0x01 ; 294 /* index = 0x01 ; */
298 } 295 }
299 } 296 }
300 297
@@ -308,19 +305,20 @@ static int send_mos_cmd(struct usb_serial *serial, __u8 request, __u16 value,
308 request = (__u8)MOS_READ; 305 request = (__u8)MOS_READ;
309 requesttype = (__u8)0xC0; 306 requesttype = (__u8)0xC0;
310 size = 0x01; 307 size = 0x01;
311 pipe = usb_rcvctrlpipe(serial->dev,0); 308 pipe = usb_rcvctrlpipe(serial->dev, 0);
312 } 309 }
313 310
314 status = usb_control_msg(serial->dev, pipe, request, requesttype, 311 status = usb_control_msg(serial->dev, pipe, request, requesttype,
315 value, index, data, size, MOS_WDR_TIMEOUT); 312 value, index, data, size, MOS_WDR_TIMEOUT);
316 313
317 if (status < 0) 314 if (status < 0)
318 dbg("Command Write failed Value %x index %x\n",value,index); 315 dbg("Command Write failed Value %x index %x\n", value, index);
319 316
320 return status; 317 return status;
321} 318}
322 319
323static int mos7720_open(struct usb_serial_port *port, struct file * filp) 320static int mos7720_open(struct tty_struct *tty,
321 struct usb_serial_port *port, struct file *filp)
324{ 322{
325 struct usb_serial *serial; 323 struct usb_serial *serial;
326 struct usb_serial_port *port0; 324 struct usb_serial_port *port0;
@@ -351,7 +349,7 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
351 349
352 /* Initialising the write urb pool */ 350 /* Initialising the write urb pool */
353 for (j = 0; j < NUM_URBS; ++j) { 351 for (j = 0; j < NUM_URBS; ++j) {
354 urb = usb_alloc_urb(0,GFP_KERNEL); 352 urb = usb_alloc_urb(0, GFP_KERNEL);
355 mos7720_port->write_urb_pool[j] = urb; 353 mos7720_port->write_urb_pool[j] = urb;
356 354
357 if (urb == NULL) { 355 if (urb == NULL) {
@@ -385,7 +383,7 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
385 */ 383 */
386 port_number = port->number - port->serial->minor; 384 port_number = port->number - port->serial->minor;
387 send_mos_cmd(port->serial, MOS_READ, port_number, UART_LSR, &data); 385 send_mos_cmd(port->serial, MOS_READ, port_number, UART_LSR, &data);
388 dbg("SS::%p LSR:%x\n",mos7720_port, data); 386 dbg("SS::%p LSR:%x\n", mos7720_port, data);
389 387
390 dbg("Check:Sending Command .........."); 388 dbg("Check:Sending Command ..........");
391 389
@@ -402,10 +400,10 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
402 data = 0xCF; 400 data = 0xCF;
403 send_mos_cmd(serial, MOS_WRITE, port_number, 0x02, &data); 401 send_mos_cmd(serial, MOS_WRITE, port_number, 0x02, &data);
404 data = 0x03; 402 data = 0x03;
405 mos7720_port->shadowLCR = data; 403 mos7720_port->shadowLCR = data;
406 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data); 404 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data);
407 data = 0x0b; 405 data = 0x0b;
408 mos7720_port->shadowMCR = data; 406 mos7720_port->shadowMCR = data;
409 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 407 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
410 data = 0x0b; 408 data = 0x0b;
411 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 409 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
@@ -420,7 +418,8 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
420 data = 0x03; 418 data = 0x03;
421 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, port_number + 1, &data); 419 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, port_number + 1, &data);
422 data = 0x00; 420 data = 0x00;
423 send_mos_cmd(port->serial, MOS_WRITE, MOS_MAX_PORT, port_number + 1, &data); 421 send_mos_cmd(port->serial, MOS_WRITE, MOS_MAX_PORT,
422 port_number + 1, &data);
424*/ 423*/
425 data = 0x00; 424 data = 0x00;
426 send_mos_cmd(serial, MOS_READ, MOS_MAX_PORT, 0x08, &data); 425 send_mos_cmd(serial, MOS_READ, MOS_MAX_PORT, 0x08, &data);
@@ -429,28 +428,26 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
429 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 0x08, &data); 428 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 0x08, &data);
430 429
431 data = 0x83; 430 data = 0x83;
432 mos7720_port->shadowLCR = data; 431 mos7720_port->shadowLCR = data;
433 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data); 432 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data);
434 data = 0x0c; 433 data = 0x0c;
435 send_mos_cmd(serial, MOS_WRITE, port_number, 0x00, &data); 434 send_mos_cmd(serial, MOS_WRITE, port_number, 0x00, &data);
436 data = 0x00; 435 data = 0x00;
437 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); 436 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data);
438 data = 0x03; 437 data = 0x03;
439 mos7720_port->shadowLCR = data; 438 mos7720_port->shadowLCR = data;
440 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data); 439 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data);
441 data = 0x0c; 440 data = 0x0c;
442 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); 441 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data);
443 data = 0x0c; 442 data = 0x0c;
444 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); 443 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data);
445 444
446//Matrix
447
448 /* force low_latency on so that our tty_push actually forces * 445 /* force low_latency on so that our tty_push actually forces *
449 * the data through,otherwise it is scheduled, and with * 446 * the data through,otherwise it is scheduled, and with *
450 * high data rates (like with OHCI) data can get lost. */ 447 * high data rates (like with OHCI) data can get lost. */
451 448
452 if (port->tty) 449 if (tty)
453 port->tty->low_latency = 1; 450 tty->low_latency = 1;
454 451
455 /* see if we've set up our endpoint info yet * 452 /* see if we've set up our endpoint info yet *
456 * (can't set it up in mos7720_startup as the * 453 * (can't set it up in mos7720_startup as the *
@@ -465,15 +462,15 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
465 462
466 /* set up our interrupt urb */ 463 /* set up our interrupt urb */
467 usb_fill_int_urb(port0->interrupt_in_urb, serial->dev, 464 usb_fill_int_urb(port0->interrupt_in_urb, serial->dev,
468 usb_rcvintpipe(serial->dev, 465 usb_rcvintpipe(serial->dev,
469 port->interrupt_in_endpointAddress), 466 port->interrupt_in_endpointAddress),
470 port0->interrupt_in_buffer, 467 port0->interrupt_in_buffer,
471 port0->interrupt_in_urb->transfer_buffer_length, 468 port0->interrupt_in_urb->transfer_buffer_length,
472 mos7720_interrupt_callback, mos7720_port, 469 mos7720_interrupt_callback, mos7720_port,
473 port0->interrupt_in_urb->interval); 470 port0->interrupt_in_urb->interval);
474 471
475 /* start interrupt read for this mos7720 this interrupt * 472 /* start interrupt read for this mos7720 this interrupt *
476 * will continue as long as the mos7720 is connected */ 473 * will continue as long as the mos7720 is connected */
477 dbg("Submit URB over !!!"); 474 dbg("Submit URB over !!!");
478 response = usb_submit_urb(port0->interrupt_in_urb, GFP_KERNEL); 475 response = usb_submit_urb(port0->interrupt_in_urb, GFP_KERNEL);
479 if (response) 476 if (response)
@@ -485,14 +482,14 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
485 /* set up our bulk in urb */ 482 /* set up our bulk in urb */
486 usb_fill_bulk_urb(port->read_urb, serial->dev, 483 usb_fill_bulk_urb(port->read_urb, serial->dev,
487 usb_rcvbulkpipe(serial->dev, 484 usb_rcvbulkpipe(serial->dev,
488 port->bulk_in_endpointAddress), 485 port->bulk_in_endpointAddress),
489 port->bulk_in_buffer, 486 port->bulk_in_buffer,
490 port->read_urb->transfer_buffer_length, 487 port->read_urb->transfer_buffer_length,
491 mos7720_bulk_in_callback, mos7720_port); 488 mos7720_bulk_in_callback, mos7720_port);
492 response = usb_submit_urb(port->read_urb, GFP_KERNEL); 489 response = usb_submit_urb(port->read_urb, GFP_KERNEL);
493 if (response) 490 if (response)
494 dev_err(&port->dev, 491 dev_err(&port->dev, "%s - Error %d submitting read urb\n",
495 "%s - Error %d submitting read urb\n", __func__, response); 492 __func__, response);
496 493
497 /* initialize our icount structure */ 494 /* initialize our icount structure */
498 memset(&(mos7720_port->icount), 0x00, sizeof(mos7720_port->icount)); 495 memset(&(mos7720_port->icount), 0x00, sizeof(mos7720_port->icount));
@@ -515,8 +512,9 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
515 * system, 512 * system,
516 * Otherwise we return a negative error number. 513 * Otherwise we return a negative error number.
517 */ 514 */
518static int mos7720_chars_in_buffer(struct usb_serial_port *port) 515static int mos7720_chars_in_buffer(struct tty_struct *tty)
519{ 516{
517 struct usb_serial_port *port = tty->driver_data;
520 int i; 518 int i;
521 int chars = 0; 519 int chars = 0;
522 struct moschip_port *mos7720_port; 520 struct moschip_port *mos7720_port;
@@ -530,14 +528,16 @@ static int mos7720_chars_in_buffer(struct usb_serial_port *port)
530 } 528 }
531 529
532 for (i = 0; i < NUM_URBS; ++i) { 530 for (i = 0; i < NUM_URBS; ++i) {
533 if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status == -EINPROGRESS) 531 if (mos7720_port->write_urb_pool[i] &&
532 mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
534 chars += URB_TRANSFER_BUFFER_SIZE; 533 chars += URB_TRANSFER_BUFFER_SIZE;
535 } 534 }
536 dbg("%s - returns %d", __func__, chars); 535 dbg("%s - returns %d", __func__, chars);
537 return chars; 536 return chars;
538} 537}
539 538
540static void mos7720_close(struct usb_serial_port *port, struct file *filp) 539static void mos7720_close(struct tty_struct *tty,
540 struct usb_serial_port *port, struct file *filp)
541{ 541{
542 struct usb_serial *serial; 542 struct usb_serial *serial;
543 struct moschip_port *mos7720_port; 543 struct moschip_port *mos7720_port;
@@ -575,12 +575,12 @@ static void mos7720_close(struct usb_serial_port *port, struct file *filp)
575 * been disconnected */ 575 * been disconnected */
576 if (!serial->disconnected) { 576 if (!serial->disconnected) {
577 data = 0x00; 577 data = 0x00;
578 send_mos_cmd(serial, MOS_WRITE, port->number - port->serial->minor, 578 send_mos_cmd(serial, MOS_WRITE,
579 0x04, &data); 579 port->number - port->serial->minor, 0x04, &data);
580 580
581 data = 0x00; 581 data = 0x00;
582 send_mos_cmd(serial, MOS_WRITE, port->number - port->serial->minor, 582 send_mos_cmd(serial, MOS_WRITE,
583 0x01, &data); 583 port->number - port->serial->minor, 0x01, &data);
584 } 584 }
585 mutex_unlock(&serial->disc_mutex); 585 mutex_unlock(&serial->disc_mutex);
586 mos7720_port->open = 0; 586 mos7720_port->open = 0;
@@ -588,9 +588,10 @@ static void mos7720_close(struct usb_serial_port *port, struct file *filp)
588 dbg("Leaving %s", __func__); 588 dbg("Leaving %s", __func__);
589} 589}
590 590
591static void mos7720_break(struct usb_serial_port *port, int break_state) 591static void mos7720_break(struct tty_struct *tty, int break_state)
592{ 592{
593 unsigned char data; 593 struct usb_serial_port *port = tty->driver_data;
594 unsigned char data;
594 struct usb_serial *serial; 595 struct usb_serial *serial;
595 struct moschip_port *mos7720_port; 596 struct moschip_port *mos7720_port;
596 597
@@ -621,8 +622,9 @@ static void mos7720_break(struct usb_serial_port *port, int break_state)
621 * If successful, we return the amount of room that we have for this port 622 * If successful, we return the amount of room that we have for this port
622 * Otherwise we return a negative error number. 623 * Otherwise we return a negative error number.
623 */ 624 */
624static int mos7720_write_room(struct usb_serial_port *port) 625static int mos7720_write_room(struct tty_struct *tty)
625{ 626{
627 struct usb_serial_port *port = tty->driver_data;
626 struct moschip_port *mos7720_port; 628 struct moschip_port *mos7720_port;
627 int room = 0; 629 int room = 0;
628 int i; 630 int i;
@@ -637,7 +639,8 @@ static int mos7720_write_room(struct usb_serial_port *port)
637 639
638 /* FIXME: Locking */ 640 /* FIXME: Locking */
639 for (i = 0; i < NUM_URBS; ++i) { 641 for (i = 0; i < NUM_URBS; ++i) {
640 if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) 642 if (mos7720_port->write_urb_pool[i] &&
643 mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
641 room += URB_TRANSFER_BUFFER_SIZE; 644 room += URB_TRANSFER_BUFFER_SIZE;
642 } 645 }
643 646
@@ -645,8 +648,8 @@ static int mos7720_write_room(struct usb_serial_port *port)
645 return room; 648 return room;
646} 649}
647 650
648static int mos7720_write(struct usb_serial_port *port, 651static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port,
649 const unsigned char *data, int count) 652 const unsigned char *data, int count)
650{ 653{
651 int status; 654 int status;
652 int i; 655 int i;
@@ -672,9 +675,10 @@ static int mos7720_write(struct usb_serial_port *port,
672 urb = NULL; 675 urb = NULL;
673 676
674 for (i = 0; i < NUM_URBS; ++i) { 677 for (i = 0; i < NUM_URBS; ++i) {
675 if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) { 678 if (mos7720_port->write_urb_pool[i] &&
679 mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
676 urb = mos7720_port->write_urb_pool[i]; 680 urb = mos7720_port->write_urb_pool[i];
677 dbg("URB:%d",i); 681 dbg("URB:%d", i);
678 break; 682 break;
679 } 683 }
680 } 684 }
@@ -692,7 +696,7 @@ static int mos7720_write(struct usb_serial_port *port,
692 goto exit; 696 goto exit;
693 } 697 }
694 } 698 }
695 transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE); 699 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
696 700
697 memcpy(urb->transfer_buffer, current_position, transfer_size); 701 memcpy(urb->transfer_buffer, current_position, transfer_size);
698 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size, 702 usb_serial_debug_data(debug, &port->dev, __func__, transfer_size,
@@ -701,12 +705,12 @@ static int mos7720_write(struct usb_serial_port *port,
701 /* fill urb with data and submit */ 705 /* fill urb with data and submit */
702 usb_fill_bulk_urb(urb, serial->dev, 706 usb_fill_bulk_urb(urb, serial->dev,
703 usb_sndbulkpipe(serial->dev, 707 usb_sndbulkpipe(serial->dev,
704 port->bulk_out_endpointAddress), 708 port->bulk_out_endpointAddress),
705 urb->transfer_buffer, transfer_size, 709 urb->transfer_buffer, transfer_size,
706 mos7720_bulk_out_data_callback, mos7720_port); 710 mos7720_bulk_out_data_callback, mos7720_port);
707 711
708 /* send it down the pipe */ 712 /* send it down the pipe */
709 status = usb_submit_urb(urb,GFP_ATOMIC); 713 status = usb_submit_urb(urb, GFP_ATOMIC);
710 if (status) { 714 if (status) {
711 err("%s - usb_submit_urb(write bulk) failed with status = %d", 715 err("%s - usb_submit_urb(write bulk) failed with status = %d",
712 __func__, status); 716 __func__, status);
@@ -719,10 +723,10 @@ exit:
719 return bytes_sent; 723 return bytes_sent;
720} 724}
721 725
722static void mos7720_throttle(struct usb_serial_port *port) 726static void mos7720_throttle(struct tty_struct *tty)
723{ 727{
728 struct usb_serial_port *port = tty->driver_data;
724 struct moschip_port *mos7720_port; 729 struct moschip_port *mos7720_port;
725 struct tty_struct *tty;
726 int status; 730 int status;
727 731
728 dbg("%s- port %d\n", __func__, port->number); 732 dbg("%s- port %d\n", __func__, port->number);
@@ -739,16 +743,10 @@ static void mos7720_throttle(struct usb_serial_port *port)
739 743
740 dbg("%s: Entering ..........", __func__); 744 dbg("%s: Entering ..........", __func__);
741 745
742 tty = port->tty;
743 if (!tty) {
744 dbg("%s - no tty available", __func__);
745 return;
746 }
747
748 /* if we are implementing XON/XOFF, send the stop character */ 746 /* if we are implementing XON/XOFF, send the stop character */
749 if (I_IXOFF(tty)) { 747 if (I_IXOFF(tty)) {
750 unsigned char stop_char = STOP_CHAR(tty); 748 unsigned char stop_char = STOP_CHAR(tty);
751 status = mos7720_write(port, &stop_char, 1); 749 status = mos7720_write(tty, port, &stop_char, 1);
752 if (status <= 0) 750 if (status <= 0)
753 return; 751 return;
754 } 752 }
@@ -764,11 +762,11 @@ static void mos7720_throttle(struct usb_serial_port *port)
764 } 762 }
765} 763}
766 764
767static void mos7720_unthrottle(struct usb_serial_port *port) 765static void mos7720_unthrottle(struct tty_struct *tty)
768{ 766{
769 struct tty_struct *tty; 767 struct usb_serial_port *port = tty->driver_data;
770 int status;
771 struct moschip_port *mos7720_port = usb_get_serial_port_data(port); 768 struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
769 int status;
772 770
773 if (mos7720_port == NULL) 771 if (mos7720_port == NULL)
774 return; 772 return;
@@ -780,16 +778,10 @@ static void mos7720_unthrottle(struct usb_serial_port *port)
780 778
781 dbg("%s: Entering ..........", __func__); 779 dbg("%s: Entering ..........", __func__);
782 780
783 tty = port->tty;
784 if (!tty) {
785 dbg("%s - no tty available", __func__);
786 return;
787 }
788
789 /* if we are implementing XON/XOFF, send the start character */ 781 /* if we are implementing XON/XOFF, send the start character */
790 if (I_IXOFF(tty)) { 782 if (I_IXOFF(tty)) {
791 unsigned char start_char = START_CHAR(tty); 783 unsigned char start_char = START_CHAR(tty);
792 status = mos7720_write(port, &start_char, 1); 784 status = mos7720_write(tty, port, &start_char, 1);
793 if (status <= 0) 785 if (status <= 0)
794 return; 786 return;
795 } 787 }
@@ -819,9 +811,9 @@ static int set_higher_rates(struct moschip_port *mos7720_port,
819 port = mos7720_port->port; 811 port = mos7720_port->port;
820 serial = port->serial; 812 serial = port->serial;
821 813
822 /*********************************************** 814 /***********************************************
823 * Init Sequence for higher rates 815 * Init Sequence for higher rates
824 ***********************************************/ 816 ***********************************************/
825 dbg("Sending Setting Commands .........."); 817 dbg("Sending Setting Commands ..........");
826 port_number = port->number - port->serial->minor; 818 port_number = port->number - port->serial->minor;
827 819
@@ -832,7 +824,7 @@ static int set_higher_rates(struct moschip_port *mos7720_port,
832 data = 0x0CF; 824 data = 0x0CF;
833 send_mos_cmd(serial, MOS_WRITE, port->number, 0x02, &data); 825 send_mos_cmd(serial, MOS_WRITE, port->number, 0x02, &data);
834 data = 0x00b; 826 data = 0x00b;
835 mos7720_port->shadowMCR = data; 827 mos7720_port->shadowMCR = data;
836 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 828 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
837 data = 0x00b; 829 data = 0x00b;
838 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 830 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
@@ -843,12 +835,12 @@ static int set_higher_rates(struct moschip_port *mos7720_port,
843 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 0x08, &data); 835 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 0x08, &data);
844 836
845 837
846 /*********************************************** 838 /***********************************************
847 * Set for higher rates * 839 * Set for higher rates *
848 ***********************************************/ 840 ***********************************************/
849 841
850 data = baud * 0x10; 842 data = baud * 0x10;
851 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, port_number + 1,&data); 843 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, port_number + 1, &data);
852 844
853 data = 0x003; 845 data = 0x003;
854 send_mos_cmd(serial, MOS_READ, MOS_MAX_PORT, 0x08, &data); 846 send_mos_cmd(serial, MOS_READ, MOS_MAX_PORT, 0x08, &data);
@@ -856,34 +848,33 @@ static int set_higher_rates(struct moschip_port *mos7720_port,
856 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 0x08, &data); 848 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 0x08, &data);
857 849
858 data = 0x02b; 850 data = 0x02b;
859 mos7720_port->shadowMCR = data; 851 mos7720_port->shadowMCR = data;
860 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 852 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
861 data = 0x02b; 853 data = 0x02b;
862 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 854 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
863 855
864 /*********************************************** 856 /***********************************************
865 * Set DLL/DLM 857 * Set DLL/DLM
866 ***********************************************/ 858 ***********************************************/
867 859
868 data = mos7720_port->shadowLCR | UART_LCR_DLAB; 860 data = mos7720_port->shadowLCR | UART_LCR_DLAB;
869 mos7720_port->shadowLCR = data; 861 mos7720_port->shadowLCR = data;
870 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data); 862 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data);
871 863
872 data = 0x001; /* DLL */ 864 data = 0x001; /* DLL */
873 send_mos_cmd(serial, MOS_WRITE, port_number, 0x00, &data); 865 send_mos_cmd(serial, MOS_WRITE, port_number, 0x00, &data);
874 data = 0x000; /* DLM */ 866 data = 0x000; /* DLM */
875 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); 867 send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data);
876 868
877 data = mos7720_port->shadowLCR & ~UART_LCR_DLAB; 869 data = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
878 mos7720_port->shadowLCR = data; 870 mos7720_port->shadowLCR = data;
879 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data); 871 send_mos_cmd(serial, MOS_WRITE, port_number, 0x03, &data);
880 872
881 return 0; 873 return 0;
882} 874}
883 875
884/* baud rate information */ 876/* baud rate information */
885struct divisor_table_entry 877struct divisor_table_entry {
886{
887 __u32 baudrate; 878 __u32 baudrate;
888 __u16 divisor; 879 __u16 divisor;
889}; 880};
@@ -932,8 +923,8 @@ static int calc_baud_rate_divisor(int baudrate, int *divisor)
932 } 923 }
933 } 924 }
934 925
935 /* After trying for all the standard baud rates * 926 /* After trying for all the standard baud rates *
936 * Try calculating the divisor for this baud rate */ 927 * Try calculating the divisor for this baud rate */
937 if (baudrate > 75 && baudrate < 230400) { 928 if (baudrate > 75 && baudrate < 230400) {
938 /* get the divisor */ 929 /* get the divisor */
939 custom = (__u16)(230400L / baudrate); 930 custom = (__u16)(230400L / baudrate);
@@ -945,7 +936,7 @@ static int calc_baud_rate_divisor(int baudrate, int *divisor)
945 custom++; 936 custom++;
946 *divisor = custom; 937 *divisor = custom;
947 938
948 dbg("Baud %d = %d",baudrate, custom); 939 dbg("Baud %d = %d", baudrate, custom);
949 return 0; 940 return 0;
950 } 941 }
951 942
@@ -979,29 +970,29 @@ static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port,
979 number = port->number - port->serial->minor; 970 number = port->number - port->serial->minor;
980 dbg("%s - port = %d, baud = %d", __func__, port->number, baudrate); 971 dbg("%s - port = %d, baud = %d", __func__, port->number, baudrate);
981 972
982 /* Calculate the Divisor */ 973 /* Calculate the Divisor */
983 status = calc_baud_rate_divisor(baudrate, &divisor); 974 status = calc_baud_rate_divisor(baudrate, &divisor);
984 if (status) { 975 if (status) {
985 err("%s - bad baud rate", __func__); 976 err("%s - bad baud rate", __func__);
986 return status; 977 return status;
987 } 978 }
988 979
989 /* Enable access to divisor latch */ 980 /* Enable access to divisor latch */
990 data = mos7720_port->shadowLCR | UART_LCR_DLAB; 981 data = mos7720_port->shadowLCR | UART_LCR_DLAB;
991 mos7720_port->shadowLCR = data; 982 mos7720_port->shadowLCR = data;
992 send_mos_cmd(serial, MOS_WRITE, number, UART_LCR, &data); 983 send_mos_cmd(serial, MOS_WRITE, number, UART_LCR, &data);
993 984
994 /* Write the divisor */ 985 /* Write the divisor */
995 data = ((unsigned char)(divisor & 0xff)); 986 data = ((unsigned char)(divisor & 0xff));
996 send_mos_cmd(serial, MOS_WRITE, number, 0x00, &data); 987 send_mos_cmd(serial, MOS_WRITE, number, 0x00, &data);
997 988
998 data = ((unsigned char)((divisor & 0xff00) >> 8)); 989 data = ((unsigned char)((divisor & 0xff00) >> 8));
999 send_mos_cmd(serial, MOS_WRITE, number, 0x01, &data); 990 send_mos_cmd(serial, MOS_WRITE, number, 0x01, &data);
1000 991
1001 /* Disable access to divisor latch */ 992 /* Disable access to divisor latch */
1002 data = mos7720_port->shadowLCR & ~UART_LCR_DLAB; 993 data = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1003 mos7720_port->shadowLCR = data; 994 mos7720_port->shadowLCR = data;
1004 send_mos_cmd(serial, MOS_WRITE, number, 0x03, &data); 995 send_mos_cmd(serial, MOS_WRITE, number, 0x03, &data);
1005 996
1006 return status; 997 return status;
1007} 998}
@@ -1011,12 +1002,12 @@ static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port,
1011 * This routine is called to set the UART on the device to match 1002 * This routine is called to set the UART on the device to match
1012 * the specified new settings. 1003 * the specified new settings.
1013 */ 1004 */
1014static void change_port_settings(struct moschip_port *mos7720_port, 1005static void change_port_settings(struct tty_struct *tty,
1006 struct moschip_port *mos7720_port,
1015 struct ktermios *old_termios) 1007 struct ktermios *old_termios)
1016{ 1008{
1017 struct usb_serial_port *port; 1009 struct usb_serial_port *port;
1018 struct usb_serial *serial; 1010 struct usb_serial *serial;
1019 struct tty_struct *tty;
1020 int baud; 1011 int baud;
1021 unsigned cflag; 1012 unsigned cflag;
1022 unsigned iflag; 1013 unsigned iflag;
@@ -1042,8 +1033,6 @@ static void change_port_settings(struct moschip_port *mos7720_port,
1042 return; 1033 return;
1043 } 1034 }
1044 1035
1045 tty = mos7720_port->port->tty;
1046
1047 dbg("%s: Entering ..........", __func__); 1036 dbg("%s: Entering ..........", __func__);
1048 1037
1049 lData = UART_LCR_WLEN8; 1038 lData = UART_LCR_WLEN8;
@@ -1106,29 +1095,31 @@ static void change_port_settings(struct moschip_port *mos7720_port,
1106#define LCR_PAR_MASK 0x38 /* Mask for parity field */ 1095#define LCR_PAR_MASK 0x38 /* Mask for parity field */
1107 1096
1108 /* Update the LCR with the correct value */ 1097 /* Update the LCR with the correct value */
1109 mos7720_port->shadowLCR &= ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK); 1098 mos7720_port->shadowLCR &=
1099 ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
1110 mos7720_port->shadowLCR |= (lData | lParity | lStop); 1100 mos7720_port->shadowLCR |= (lData | lParity | lStop);
1111 1101
1112 1102
1113 /* Disable Interrupts */ 1103 /* Disable Interrupts */
1114 data = 0x00; 1104 data = 0x00;
1115 send_mos_cmd(serial,MOS_WRITE,port->number - port->serial->minor, UART_IER, &data); 1105 send_mos_cmd(serial, MOS_WRITE, port->number - port->serial->minor,
1106 UART_IER, &data);
1116 1107
1117 data = 0x00; 1108 data = 0x00;
1118 send_mos_cmd(serial, MOS_WRITE, port_number, UART_FCR, &data); 1109 send_mos_cmd(serial, MOS_WRITE, port_number, UART_FCR, &data);
1119 1110
1120 data = 0xcf; 1111 data = 0xcf;
1121 send_mos_cmd(serial, MOS_WRITE, port_number, UART_FCR, &data); 1112 send_mos_cmd(serial, MOS_WRITE, port_number, UART_FCR, &data);
1122 1113
1123 /* Send the updated LCR value to the mos7720 */ 1114 /* Send the updated LCR value to the mos7720 */
1124 data = mos7720_port->shadowLCR; 1115 data = mos7720_port->shadowLCR;
1125 send_mos_cmd(serial, MOS_WRITE, port_number, UART_LCR, &data); 1116 send_mos_cmd(serial, MOS_WRITE, port_number, UART_LCR, &data);
1126 1117
1127 data = 0x00b; 1118 data = 0x00b;
1128 mos7720_port->shadowMCR = data; 1119 mos7720_port->shadowMCR = data;
1129 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 1120 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
1130 data = 0x00b; 1121 data = 0x00b;
1131 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data); 1122 send_mos_cmd(serial, MOS_WRITE, port_number, 0x04, &data);
1132 1123
1133 /* set up the MCR register and send it to the mos7720 */ 1124 /* set up the MCR register and send it to the mos7720 */
1134 mos7720_port->shadowMCR = UART_MCR_OUT2; 1125 mos7720_port->shadowMCR = UART_MCR_OUT2;
@@ -1137,9 +1128,8 @@ static void change_port_settings(struct moschip_port *mos7720_port,
1137 1128
1138 if (cflag & CRTSCTS) { 1129 if (cflag & CRTSCTS) {
1139 mos7720_port->shadowMCR |= (UART_MCR_XONANY); 1130 mos7720_port->shadowMCR |= (UART_MCR_XONANY);
1140 1131 /* To set hardware flow control to the specified *
1141 /* To set hardware flow control to the specified * 1132 * serial port, in SP1/2_CONTROL_REG */
1142 * serial port, in SP1/2_CONTROL_REG */
1143 if (port->number) { 1133 if (port->number) {
1144 data = 0x001; 1134 data = 0x001;
1145 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT, 1135 send_mos_cmd(serial, MOS_WRITE, MOS_MAX_PORT,
@@ -1198,14 +1188,13 @@ static void change_port_settings(struct moschip_port *mos7720_port,
1198 * this function is called by the tty driver when it wants to change the 1188 * this function is called by the tty driver when it wants to change the
1199 * termios structure. 1189 * termios structure.
1200 */ 1190 */
1201static void mos7720_set_termios(struct usb_serial_port *port, 1191static void mos7720_set_termios(struct tty_struct *tty,
1202 struct ktermios *old_termios) 1192 struct usb_serial_port *port, struct ktermios *old_termios)
1203{ 1193{
1204 int status; 1194 int status;
1205 unsigned int cflag; 1195 unsigned int cflag;
1206 struct usb_serial *serial; 1196 struct usb_serial *serial;
1207 struct moschip_port *mos7720_port; 1197 struct moschip_port *mos7720_port;
1208 struct tty_struct *tty;
1209 1198
1210 serial = port->serial; 1199 serial = port->serial;
1211 1200
@@ -1214,15 +1203,12 @@ static void mos7720_set_termios(struct usb_serial_port *port,
1214 if (mos7720_port == NULL) 1203 if (mos7720_port == NULL)
1215 return; 1204 return;
1216 1205
1217 tty = port->tty;
1218
1219
1220 if (!mos7720_port->open) { 1206 if (!mos7720_port->open) {
1221 dbg("%s - port not opened", __func__); 1207 dbg("%s - port not opened", __func__);
1222 return; 1208 return;
1223 } 1209 }
1224 1210
1225 dbg("%s\n","setting termios - ASPIRE"); 1211 dbg("%s\n", "setting termios - ASPIRE");
1226 1212
1227 cflag = tty->termios->c_cflag; 1213 cflag = tty->termios->c_cflag;
1228 1214
@@ -1237,14 +1223,14 @@ static void mos7720_set_termios(struct usb_serial_port *port,
1237 dbg("%s - port %d", __func__, port->number); 1223 dbg("%s - port %d", __func__, port->number);
1238 1224
1239 /* change the port settings to the new ones specified */ 1225 /* change the port settings to the new ones specified */
1240 change_port_settings(mos7720_port, old_termios); 1226 change_port_settings(tty, mos7720_port, old_termios);
1241 1227
1242 if(!port->read_urb) { 1228 if (!port->read_urb) {
1243 dbg("%s","URB KILLED !!!!!\n"); 1229 dbg("%s", "URB KILLED !!!!!\n");
1244 return; 1230 return;
1245 } 1231 }
1246 1232
1247 if(port->read_urb->status != -EINPROGRESS) { 1233 if (port->read_urb->status != -EINPROGRESS) {
1248 port->read_urb->dev = serial->dev; 1234 port->read_urb->dev = serial->dev;
1249 status = usb_submit_urb(port->read_urb, GFP_ATOMIC); 1235 status = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1250 if (status) 1236 if (status)
@@ -1264,13 +1250,13 @@ static void mos7720_set_termios(struct usb_serial_port *port,
1264 * transmit holding register is empty. This functionality 1250 * transmit holding register is empty. This functionality
1265 * allows an RS485 driver to be written in user space. 1251 * allows an RS485 driver to be written in user space.
1266 */ 1252 */
1267static int get_lsr_info(struct moschip_port *mos7720_port, 1253static int get_lsr_info(struct tty_struct *tty,
1268 unsigned int __user *value) 1254 struct moschip_port *mos7720_port, unsigned int __user *value)
1269{ 1255{
1270 int count; 1256 int count;
1271 unsigned int result = 0; 1257 unsigned int result = 0;
1272 1258
1273 count = mos7720_chars_in_buffer(mos7720_port->port); 1259 count = mos7720_chars_in_buffer(tty);
1274 if (count == 0) { 1260 if (count == 0) {
1275 dbg("%s -- Empty", __func__); 1261 dbg("%s -- Empty", __func__);
1276 result = TIOCSER_TEMT; 1262 result = TIOCSER_TEMT;
@@ -1290,7 +1276,7 @@ static int get_number_bytes_avail(struct moschip_port *mos7720_port,
1290 unsigned int __user *value) 1276 unsigned int __user *value)
1291{ 1277{
1292 unsigned int result = 0; 1278 unsigned int result = 0;
1293 struct tty_struct *tty = mos7720_port->port->tty; 1279 struct tty_struct *tty = mos7720_port->port->port.tty;
1294 1280
1295 if (!tty) 1281 if (!tty)
1296 return -ENOIOCTLCMD; 1282 return -ENOIOCTLCMD;
@@ -1316,7 +1302,7 @@ static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd,
1316 if (mos7720_port == NULL) 1302 if (mos7720_port == NULL)
1317 return -1; 1303 return -1;
1318 1304
1319 port = (struct usb_serial_port*)mos7720_port->port; 1305 port = (struct usb_serial_port *)mos7720_port->port;
1320 mcr = mos7720_port->shadowMCR; 1306 mcr = mos7720_port->shadowMCR;
1321 1307
1322 if (copy_from_user(&arg, value, sizeof(int))) 1308 if (copy_from_user(&arg, value, sizeof(int)))
@@ -1397,7 +1383,7 @@ static int get_serial_info(struct moschip_port *mos7720_port,
1397 tmp.port = mos7720_port->port->number; 1383 tmp.port = mos7720_port->port->number;
1398 tmp.irq = 0; 1384 tmp.irq = 0;
1399 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; 1385 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
1400 tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE; 1386 tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
1401 tmp.baud_base = 9600; 1387 tmp.baud_base = 9600;
1402 tmp.close_delay = 5*HZ; 1388 tmp.close_delay = 5*HZ;
1403 tmp.closing_wait = 30*HZ; 1389 tmp.closing_wait = 30*HZ;
@@ -1407,9 +1393,10 @@ static int get_serial_info(struct moschip_port *mos7720_port,
1407 return 0; 1393 return 0;
1408} 1394}
1409 1395
1410static int mos7720_ioctl(struct usb_serial_port *port, struct file *file, 1396static int mos7720_ioctl(struct tty_struct *tty, struct file *file,
1411 unsigned int cmd, unsigned long arg) 1397 unsigned int cmd, unsigned long arg)
1412{ 1398{
1399 struct usb_serial_port *port = tty->driver_data;
1413 struct moschip_port *mos7720_port; 1400 struct moschip_port *mos7720_port;
1414 struct async_icount cnow; 1401 struct async_icount cnow;
1415 struct async_icount cprev; 1402 struct async_icount cprev;
@@ -1431,14 +1418,16 @@ static int mos7720_ioctl(struct usb_serial_port *port, struct file *file,
1431 1418
1432 case TIOCSERGETLSR: 1419 case TIOCSERGETLSR:
1433 dbg("%s (%d) TIOCSERGETLSR", __func__, port->number); 1420 dbg("%s (%d) TIOCSERGETLSR", __func__, port->number);
1434 return get_lsr_info(mos7720_port, (unsigned int __user *)arg); 1421 return get_lsr_info(tty, mos7720_port,
1422 (unsigned int __user *)arg);
1435 return 0; 1423 return 0;
1436 1424
1425 /* FIXME: These should be using the mode methods */
1437 case TIOCMBIS: 1426 case TIOCMBIS:
1438 case TIOCMBIC: 1427 case TIOCMBIC:
1439 case TIOCMSET: 1428 case TIOCMSET:
1440 dbg("%s (%d) TIOCMSET/TIOCMBIC/TIOCMSET", __func__, 1429 dbg("%s (%d) TIOCMSET/TIOCMBIC/TIOCMSET",
1441 port->number); 1430 __func__, port->number);
1442 return set_modem_info(mos7720_port, cmd, 1431 return set_modem_info(mos7720_port, cmd,
1443 (unsigned int __user *)arg); 1432 (unsigned int __user *)arg);
1444 1433
@@ -1452,10 +1441,6 @@ static int mos7720_ioctl(struct usb_serial_port *port, struct file *file,
1452 return get_serial_info(mos7720_port, 1441 return get_serial_info(mos7720_port,
1453 (struct serial_struct __user *)arg); 1442 (struct serial_struct __user *)arg);
1454 1443
1455 case TIOCSSERIAL:
1456 dbg("%s (%d) TIOCSSERIAL", __func__, port->number);
1457 break;
1458
1459 case TIOCMIWAIT: 1444 case TIOCMIWAIT:
1460 dbg("%s (%d) TIOCMIWAIT", __func__, port->number); 1445 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
1461 cprev = mos7720_port->icount; 1446 cprev = mos7720_port->icount;
@@ -1469,7 +1454,7 @@ static int mos7720_ioctl(struct usb_serial_port *port, struct file *file,
1469 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 1454 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1470 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 1455 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1471 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || 1456 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1472 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { 1457 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
1473 return 0; 1458 return 0;
1474 } 1459 }
1475 cprev = cnow; 1460 cprev = cnow;
@@ -1492,7 +1477,7 @@ static int mos7720_ioctl(struct usb_serial_port *port, struct file *file,
1492 icount.buf_overrun = cnow.buf_overrun; 1477 icount.buf_overrun = cnow.buf_overrun;
1493 1478
1494 dbg("%s (%d) TIOCGICOUNT RX=%d, TX=%d", __func__, 1479 dbg("%s (%d) TIOCGICOUNT RX=%d, TX=%d", __func__,
1495 port->number, icount.rx, icount.tx ); 1480 port->number, icount.rx, icount.tx);
1496 if (copy_to_user((void __user *)arg, &icount, sizeof(icount))) 1481 if (copy_to_user((void __user *)arg, &icount, sizeof(icount)))
1497 return -EFAULT; 1482 return -EFAULT;
1498 return 0; 1483 return 0;
@@ -1543,7 +1528,8 @@ static int mos7720_startup(struct usb_serial *serial)
1543 /* Initialize all port interrupt end point to port 0 int 1528 /* Initialize all port interrupt end point to port 0 int
1544 * endpoint. Our device has only one interrupt endpoint 1529 * endpoint. Our device has only one interrupt endpoint
1545 * comman to all ports */ 1530 * comman to all ports */
1546 serial->port[i]->interrupt_in_endpointAddress = serial->port[0]->interrupt_in_endpointAddress; 1531 serial->port[i]->interrupt_in_endpointAddress =
1532 serial->port[0]->interrupt_in_endpointAddress;
1547 1533
1548 mos7720_port->port = serial->port[i]; 1534 mos7720_port->port = serial->port[i];
1549 usb_set_serial_port_data(serial->port[i], mos7720_port); 1535 usb_set_serial_port_data(serial->port[i], mos7720_port);
@@ -1555,13 +1541,15 @@ static int mos7720_startup(struct usb_serial *serial)
1555 1541
1556 /* setting configuration feature to one */ 1542 /* setting configuration feature to one */
1557 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 1543 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
1558 (__u8)0x03, 0x00,0x01,0x00, NULL, 0x00, 5*HZ); 1544 (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ);
1559 1545
1560 send_mos_cmd(serial,MOS_READ,0x00, UART_LSR, &data); // LSR For Port 1 1546 /* LSR For Port 1 */
1561 dbg("LSR:%x",data); 1547 send_mos_cmd(serial, MOS_READ, 0x00, UART_LSR, &data);
1548 dbg("LSR:%x", data);
1562 1549
1563 send_mos_cmd(serial,MOS_READ,0x01, UART_LSR, &data); // LSR For Port 2 1550 /* LSR For Port 2 */
1564 dbg("LSR:%x",data); 1551 send_mos_cmd(serial, MOS_READ, 0x01, UART_LSR, &data);
1552 dbg("LSR:%x", data);
1565 1553
1566 return 0; 1554 return 0;
1567} 1555}
@@ -1571,7 +1559,7 @@ static void mos7720_shutdown(struct usb_serial *serial)
1571 int i; 1559 int i;
1572 1560
1573 /* free private structure allocated for serial port */ 1561 /* free private structure allocated for serial port */
1574 for (i=0; i < serial->num_ports; ++i) { 1562 for (i = 0; i < serial->num_ports; ++i) {
1575 kfree(usb_get_serial_port_data(serial->port[i])); 1563 kfree(usb_get_serial_port_data(serial->port[i]));
1576 usb_set_serial_port_data(serial->port[i], NULL); 1564 usb_set_serial_port_data(serial->port[i], NULL);
1577 } 1565 }
@@ -1651,8 +1639,8 @@ module_init(moschip7720_init);
1651module_exit(moschip7720_exit); 1639module_exit(moschip7720_exit);
1652 1640
1653/* Module information */ 1641/* Module information */
1654MODULE_AUTHOR( DRIVER_AUTHOR ); 1642MODULE_AUTHOR(DRIVER_AUTHOR);
1655MODULE_DESCRIPTION( DRIVER_DESC ); 1643MODULE_DESCRIPTION(DRIVER_DESC);
1656MODULE_LICENSE("GPL"); 1644MODULE_LICENSE("GPL");
1657 1645
1658module_param(debug, bool, S_IRUGO | S_IWUSR); 1646module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 78f2f6db494d..09d82062b973 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -33,7 +33,7 @@
33#include <linux/serial.h> 33#include <linux/serial.h>
34#include <linux/usb.h> 34#include <linux/usb.h>
35#include <linux/usb/serial.h> 35#include <linux/usb/serial.h>
36#include <asm/uaccess.h> 36#include <linux/uaccess.h>
37 37
38/* 38/*
39 * Version Information 39 * Version Information
@@ -82,8 +82,8 @@
82 * Defines used for sending commands to port 82 * Defines used for sending commands to port
83 */ 83 */
84 84
85#define WAIT_FOR_EVER (HZ * 0 ) /* timeout urb is wait for ever */ 85#define WAIT_FOR_EVER (HZ * 0) /* timeout urb is wait for ever */
86#define MOS_WDR_TIMEOUT (HZ * 5 ) /* default urb timeout */ 86#define MOS_WDR_TIMEOUT (HZ * 5) /* default urb timeout */
87 87
88#define MOS_PORT1 0x0200 88#define MOS_PORT1 0x0200
89#define MOS_PORT2 0x0300 89#define MOS_PORT2 0x0300
@@ -102,8 +102,8 @@
102 102
103#define MAX_NAME_LEN 64 103#define MAX_NAME_LEN 64
104 104
105#define ZLP_REG1 0x3A //Zero_Flag_Reg1 58 105#define ZLP_REG1 0x3A /* Zero_Flag_Reg1 58 */
106#define ZLP_REG5 0x3E //Zero_Flag_Reg5 62 106#define ZLP_REG5 0x3E /* Zero_Flag_Reg5 62 */
107 107
108/* For higher baud Rates use TIOCEXBAUD */ 108/* For higher baud Rates use TIOCEXBAUD */
109#define TIOCEXBAUD 0x5462 109#define TIOCEXBAUD 0x5462
@@ -142,7 +142,7 @@
142#define MOS_MSR_DELTA_RI 0x40 142#define MOS_MSR_DELTA_RI 0x40
143#define MOS_MSR_DELTA_CD 0x80 143#define MOS_MSR_DELTA_CD 0x80
144 144
145// Serial Port register Address 145/* Serial Port register Address */
146#define INTERRUPT_ENABLE_REGISTER ((__u16)(0x01)) 146#define INTERRUPT_ENABLE_REGISTER ((__u16)(0x01))
147#define FIFO_CONTROL_REGISTER ((__u16)(0x02)) 147#define FIFO_CONTROL_REGISTER ((__u16)(0x02))
148#define LINE_CONTROL_REGISTER ((__u16)(0x03)) 148#define LINE_CONTROL_REGISTER ((__u16)(0x03))
@@ -201,11 +201,11 @@ struct moschip_port {
201 struct async_icount icount; 201 struct async_icount icount;
202 struct usb_serial_port *port; /* loop back to the owner of this object */ 202 struct usb_serial_port *port; /* loop back to the owner of this object */
203 203
204 /*Offsets */ 204 /* Offsets */
205 __u8 SpRegOffset; 205 __u8 SpRegOffset;
206 __u8 ControlRegOffset; 206 __u8 ControlRegOffset;
207 __u8 DcrRegOffset; 207 __u8 DcrRegOffset;
208 //for processing control URBS in interrupt context 208 /* for processing control URBS in interrupt context */
209 struct urb *control_urb; 209 struct urb *control_urb;
210 struct usb_ctrlrequest *dr; 210 struct usb_ctrlrequest *dr;
211 char *ctrl_buf; 211 char *ctrl_buf;
@@ -244,7 +244,7 @@ static int mos7840_set_reg_sync(struct usb_serial_port *port, __u16 reg,
244 */ 244 */
245 245
246static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg, 246static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
247 __u16 * val) 247 __u16 *val)
248{ 248{
249 struct usb_device *dev = port->serial->dev; 249 struct usb_device *dev = port->serial->dev;
250 int ret = 0; 250 int ret = 0;
@@ -269,16 +269,15 @@ static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg,
269 269
270 struct usb_device *dev = port->serial->dev; 270 struct usb_device *dev = port->serial->dev;
271 val = val & 0x00ff; 271 val = val & 0x00ff;
272 // For the UART control registers, the application number need to be Or'ed 272 /* For the UART control registers, the application number need
273 to be Or'ed */
273 if (port->serial->num_ports == 4) { 274 if (port->serial->num_ports == 4) {
274 val |= 275 val |= (((__u16) port->number -
275 (((__u16) port->number - (__u16) (port->serial->minor)) + 276 (__u16) (port->serial->minor)) + 1) << 8;
276 1) << 8;
277 dbg("mos7840_set_uart_reg application number is %x\n", val); 277 dbg("mos7840_set_uart_reg application number is %x\n", val);
278 } else { 278 } else {
279 if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) { 279 if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) {
280 val |= 280 val |= (((__u16) port->number -
281 (((__u16) port->number -
282 (__u16) (port->serial->minor)) + 1) << 8; 281 (__u16) (port->serial->minor)) + 1) << 8;
283 dbg("mos7840_set_uart_reg application number is %x\n", 282 dbg("mos7840_set_uart_reg application number is %x\n",
284 val); 283 val);
@@ -302,14 +301,15 @@ static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg,
302 * by passing usb_rcvctrlpipe function as parameter. 301 * by passing usb_rcvctrlpipe function as parameter.
303 */ 302 */
304static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg, 303static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
305 __u16 * val) 304 __u16 *val)
306{ 305{
307 struct usb_device *dev = port->serial->dev; 306 struct usb_device *dev = port->serial->dev;
308 int ret = 0; 307 int ret = 0;
309 __u16 Wval; 308 __u16 Wval;
310 309
311 //dbg("application number is %4x \n",(((__u16)port->number - (__u16)(port->serial->minor))+1)<<8); 310 /* dbg("application number is %4x \n",
312 /*Wval is same as application number */ 311 (((__u16)port->number - (__u16)(port->serial->minor))+1)<<8); */
312 /* Wval is same as application number */
313 if (port->serial->num_ports == 4) { 313 if (port->serial->num_ports == 4) {
314 Wval = 314 Wval =
315 (((__u16) port->number - (__u16) (port->serial->minor)) + 315 (((__u16) port->number - (__u16) (port->serial->minor)) +
@@ -317,14 +317,12 @@ static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
317 dbg("mos7840_get_uart_reg application number is %x\n", Wval); 317 dbg("mos7840_get_uart_reg application number is %x\n", Wval);
318 } else { 318 } else {
319 if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) { 319 if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) {
320 Wval = 320 Wval = (((__u16) port->number -
321 (((__u16) port->number -
322 (__u16) (port->serial->minor)) + 1) << 8; 321 (__u16) (port->serial->minor)) + 1) << 8;
323 dbg("mos7840_get_uart_reg application number is %x\n", 322 dbg("mos7840_get_uart_reg application number is %x\n",
324 Wval); 323 Wval);
325 } else { 324 } else {
326 Wval = 325 Wval = (((__u16) port->number -
327 (((__u16) port->number -
328 (__u16) (port->serial->minor)) + 2) << 8; 326 (__u16) (port->serial->minor)) + 2) << 8;
329 dbg("mos7840_get_uart_reg application number is %x\n", 327 dbg("mos7840_get_uart_reg application number is %x\n",
330 Wval); 328 Wval);
@@ -406,11 +404,11 @@ static void mos7840_handle_new_lsr(struct moschip_port *port, __u8 new_lsr)
406 dbg("%s - %02x", __func__, new_lsr); 404 dbg("%s - %02x", __func__, new_lsr);
407 405
408 if (new_lsr & SERIAL_LSR_BI) { 406 if (new_lsr & SERIAL_LSR_BI) {
409 // 407 /*
410 // Parity and Framing errors only count if they 408 * Parity and Framing errors only count if they
411 // occur exclusive of a break being 409 * occur exclusive of a break being
412 // received. 410 * received.
413 // 411 */
414 new_lsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI); 412 new_lsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI);
415 } 413 }
416 414
@@ -492,7 +490,7 @@ exit:
492} 490}
493 491
494static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg, 492static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
495 __u16 * val) 493 __u16 *val)
496{ 494{
497 struct usb_device *dev = mcs->port->serial->dev; 495 struct usb_device *dev = mcs->port->serial->dev;
498 struct usb_ctrlrequest *dr = mcs->dr; 496 struct usb_ctrlrequest *dr = mcs->dr;
@@ -501,7 +499,7 @@ static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
501 499
502 dr->bRequestType = MCS_RD_RTYPE; 500 dr->bRequestType = MCS_RD_RTYPE;
503 dr->bRequest = MCS_RDREQ; 501 dr->bRequest = MCS_RDREQ;
504 dr->wValue = cpu_to_le16(Wval); //0; 502 dr->wValue = cpu_to_le16(Wval); /* 0 */
505 dr->wIndex = cpu_to_le16(reg); 503 dr->wIndex = cpu_to_le16(reg);
506 dr->wLength = cpu_to_le16(2); 504 dr->wLength = cpu_to_le16(2);
507 505
@@ -607,7 +605,8 @@ static void mos7840_interrupt_callback(struct urb *urb)
607 } 605 }
608 } 606 }
609 } 607 }
610 if (!(rv < 0)) /* the completion handler for the control urb will resubmit */ 608 if (!(rv < 0))
609 /* the completion handler for the control urb will resubmit */
611 return; 610 return;
612exit: 611exit:
613 result = usb_submit_urb(urb, GFP_ATOMIC); 612 result = usb_submit_urb(urb, GFP_ATOMIC);
@@ -656,8 +655,8 @@ static struct usb_serial *mos7840_get_usb_serial(struct usb_serial_port *port,
656 if (!port || 655 if (!port ||
657 mos7840_port_paranoia_check(port, function) || 656 mos7840_port_paranoia_check(port, function) ||
658 mos7840_serial_paranoia_check(port->serial, function)) { 657 mos7840_serial_paranoia_check(port->serial, function)) {
659 /* then say that we don't have a valid usb_serial thing, which will 658 /* then say that we don't have a valid usb_serial thing,
660 * end up genrating -ENODEV return values */ 659 * which will end up genrating -ENODEV return values */
661 return NULL; 660 return NULL;
662 } 661 }
663 662
@@ -710,7 +709,7 @@ static void mos7840_bulk_in_callback(struct urb *urb)
710 dbg("%s", "Entering ........... \n"); 709 dbg("%s", "Entering ........... \n");
711 710
712 if (urb->actual_length) { 711 if (urb->actual_length) {
713 tty = mos7840_port->port->tty; 712 tty = mos7840_port->port->port.tty;
714 if (tty) { 713 if (tty) {
715 tty_buffer_request_room(tty, urb->actual_length); 714 tty_buffer_request_room(tty, urb->actual_length);
716 tty_insert_flip_string(tty, data, urb->actual_length); 715 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -741,8 +740,8 @@ static void mos7840_bulk_in_callback(struct urb *urb)
741 740
742/***************************************************************************** 741/*****************************************************************************
743 * mos7840_bulk_out_data_callback 742 * mos7840_bulk_out_data_callback
744 * this is the callback function for when we have finished sending serial data 743 * this is the callback function for when we have finished sending
745 * on the bulk out endpoint. 744 * serial data on the bulk out endpoint.
746 *****************************************************************************/ 745 *****************************************************************************/
747 746
748static void mos7840_bulk_out_data_callback(struct urb *urb) 747static void mos7840_bulk_out_data_callback(struct urb *urb)
@@ -774,7 +773,7 @@ static void mos7840_bulk_out_data_callback(struct urb *urb)
774 773
775 dbg("%s \n", "Entering ........."); 774 dbg("%s \n", "Entering .........");
776 775
777 tty = mos7840_port->port->tty; 776 tty = mos7840_port->port->port.tty;
778 777
779 if (tty && mos7840_port->open) 778 if (tty && mos7840_port->open)
780 tty_wakeup(tty); 779 tty_wakeup(tty);
@@ -804,7 +803,8 @@ static int mos7840_serial_probe(struct usb_serial *serial,
804 * Otherwise we return a negative error number. 803 * Otherwise we return a negative error number.
805 *****************************************************************************/ 804 *****************************************************************************/
806 805
807static int mos7840_open(struct usb_serial_port *port, struct file *filp) 806static int mos7840_open(struct tty_struct *tty,
807 struct usb_serial_port *port, struct file *filp)
808{ 808{
809 int response; 809 int response;
810 int j; 810 int j;
@@ -847,7 +847,8 @@ static int mos7840_open(struct usb_serial_port *port, struct file *filp)
847 continue; 847 continue;
848 } 848 }
849 849
850 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); 850 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
851 GFP_KERNEL);
851 if (!urb->transfer_buffer) { 852 if (!urb->transfer_buffer) {
852 usb_free_urb(urb); 853 usb_free_urb(urb);
853 mos7840_port->write_urb_pool[j] = NULL; 854 mos7840_port->write_urb_pool[j] = NULL;
@@ -868,9 +869,8 @@ static int mos7840_open(struct usb_serial_port *port, struct file *filp)
868 * 0x08 : SP1/2 Control Reg 869 * 0x08 : SP1/2 Control Reg
869 *****************************************************************************/ 870 *****************************************************************************/
870 871
871//NEED to check the following Block 872 /* NEED to check the following Block */
872 873
873 status = 0;
874 Data = 0x0; 874 Data = 0x0;
875 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); 875 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
876 if (status < 0) { 876 if (status < 0) {
@@ -890,36 +890,35 @@ static int mos7840_open(struct usb_serial_port *port, struct file *filp)
890 dbg("writing Spreg failed\n"); 890 dbg("writing Spreg failed\n");
891 return -1; 891 return -1;
892 } 892 }
893//End of block to be checked 893 /* End of block to be checked */
894 894
895 status = 0;
896 Data = 0x0; 895 Data = 0x0;
897 status = 896 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
898 mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, &Data); 897 &Data);
899 if (status < 0) { 898 if (status < 0) {
900 dbg("Reading Controlreg failed\n"); 899 dbg("Reading Controlreg failed\n");
901 return -1; 900 return -1;
902 } 901 }
903 Data |= 0x08; //Driver done bit 902 Data |= 0x08; /* Driver done bit */
904 Data |= 0x20; //rx_disable 903 Data |= 0x20; /* rx_disable */
905 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, Data); 904 status = mos7840_set_reg_sync(port,
905 mos7840_port->ControlRegOffset, Data);
906 if (status < 0) { 906 if (status < 0) {
907 dbg("writing Controlreg failed\n"); 907 dbg("writing Controlreg failed\n");
908 return -1; 908 return -1;
909 } 909 }
910 //do register settings here 910 /* do register settings here */
911 // Set all regs to the device default values. 911 /* Set all regs to the device default values. */
912 //////////////////////////////////// 912 /***********************************
913 // First Disable all interrupts. 913 * First Disable all interrupts.
914 //////////////////////////////////// 914 ***********************************/
915
916 Data = 0x00; 915 Data = 0x00;
917 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 916 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
918 if (status < 0) { 917 if (status < 0) {
919 dbg("disableing interrupts failed\n"); 918 dbg("disableing interrupts failed\n");
920 return -1; 919 return -1;
921 } 920 }
922 // Set FIFO_CONTROL_REGISTER to the default value 921 /* Set FIFO_CONTROL_REGISTER to the default value */
923 Data = 0x00; 922 Data = 0x00;
924 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 923 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
925 if (status < 0) { 924 if (status < 0) {
@@ -946,90 +945,73 @@ static int mos7840_open(struct usb_serial_port *port, struct file *filp)
946 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 945 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
947 mos7840_port->shadowLCR = Data; 946 mos7840_port->shadowLCR = Data;
948 947
949 Data |= SERIAL_LCR_DLAB; //data latch enable in LCR 0x80 948 Data |= SERIAL_LCR_DLAB; /* data latch enable in LCR 0x80 */
950 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 949 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
951 950
952 Data = 0x0c; 951 Data = 0x0c;
953 status = 0;
954 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data); 952 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
955 953
956 Data = 0x0; 954 Data = 0x0;
957 status = 0;
958 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data); 955 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
959 956
960 Data = 0x00; 957 Data = 0x00;
961 status = 0;
962 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 958 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
963 959
964 Data = Data & ~SERIAL_LCR_DLAB; 960 Data = Data & ~SERIAL_LCR_DLAB;
965 status = 0;
966 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 961 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
967 mos7840_port->shadowLCR = Data; 962 mos7840_port->shadowLCR = Data;
968 963
969 //clearing Bulkin and Bulkout Fifo 964 /* clearing Bulkin and Bulkout Fifo */
970 Data = 0x0; 965 Data = 0x0;
971 status = 0;
972 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); 966 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
973 967
974 Data = Data | 0x0c; 968 Data = Data | 0x0c;
975 status = 0;
976 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 969 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
977 970
978 Data = Data & ~0x0c; 971 Data = Data & ~0x0c;
979 status = 0;
980 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 972 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
981 //Finally enable all interrupts 973 /* Finally enable all interrupts */
982 Data = 0x0;
983 Data = 0x0c; 974 Data = 0x0c;
984 status = 0;
985 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 975 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
986 976
987 //clearing rx_disable 977 /* clearing rx_disable */
988 Data = 0x0; 978 Data = 0x0;
989 status = 0; 979 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
990 status = 980 &Data);
991 mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, &Data);
992 Data = Data & ~0x20; 981 Data = Data & ~0x20;
993 status = 0; 982 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
994 status = 983 Data);
995 mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, Data);
996 984
997 // rx_negate 985 /* rx_negate */
998 Data = 0x0; 986 Data = 0x0;
999 status = 0; 987 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
1000 status = 988 &Data);
1001 mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, &Data);
1002 Data = Data | 0x10; 989 Data = Data | 0x10;
1003 status = 0; 990 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
1004 status = 991 Data);
1005 mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, Data);
1006 992
1007 /* force low_latency on so that our tty_push actually forces * 993 /* force low_latency on so that our tty_push actually forces *
1008 * the data through,otherwise it is scheduled, and with * 994 * the data through,otherwise it is scheduled, and with *
1009 * high data rates (like with OHCI) data can get lost. */ 995 * high data rates (like with OHCI) data can get lost. */
996 if (tty)
997 tty->low_latency = 1;
1010 998
1011 if (port->tty) 999 /* Check to see if we've set up our endpoint info yet *
1012 port->tty->low_latency = 1; 1000 * (can't set it up in mos7840_startup as the structures *
1013/* Check to see if we've set up our endpoint info yet * 1001 * were not set up at that time.) */
1014 * (can't set it up in mos7840_startup as the structures *
1015 * were not set up at that time.) */
1016 if (port0->open_ports == 1) { 1002 if (port0->open_ports == 1) {
1017 if (serial->port[0]->interrupt_in_buffer == NULL) { 1003 if (serial->port[0]->interrupt_in_buffer == NULL) {
1018
1019 /* set up interrupt urb */ 1004 /* set up interrupt urb */
1020
1021 usb_fill_int_urb(serial->port[0]->interrupt_in_urb, 1005 usb_fill_int_urb(serial->port[0]->interrupt_in_urb,
1022 serial->dev, 1006 serial->dev,
1023 usb_rcvintpipe(serial->dev, 1007 usb_rcvintpipe(serial->dev,
1024 serial->port[0]-> 1008 serial->port[0]->interrupt_in_endpointAddress),
1025 interrupt_in_endpointAddress), 1009 serial->port[0]->interrupt_in_buffer,
1026 serial->port[0]->interrupt_in_buffer, 1010 serial->port[0]->interrupt_in_urb->
1027 serial->port[0]->interrupt_in_urb-> 1011 transfer_buffer_length,
1028 transfer_buffer_length, 1012 mos7840_interrupt_callback,
1029 mos7840_interrupt_callback, 1013 serial,
1030 serial, 1014 serial->port[0]->interrupt_in_urb->interval);
1031 serial->port[0]->interrupt_in_urb->
1032 interval);
1033 1015
1034 /* start interrupt read for mos7840 * 1016 /* start interrupt read for mos7840 *
1035 * will continue as long as mos7840 is connected */ 1017 * will continue as long as mos7840 is connected */
@@ -1084,14 +1066,16 @@ static int mos7840_open(struct usb_serial_port *port, struct file *filp)
1084 memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount)); 1066 memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount));
1085 1067
1086 /* initialize our port settings */ 1068 /* initialize our port settings */
1087 mos7840_port->shadowMCR = MCR_MASTER_IE; /* Must set to enable ints! */ 1069 /* Must set to enable ints! */
1070 mos7840_port->shadowMCR = MCR_MASTER_IE;
1088 /* send a open port command */ 1071 /* send a open port command */
1089 mos7840_port->open = 1; 1072 mos7840_port->open = 1;
1090 //mos7840_change_port_settings(mos7840_port,old_termios); 1073 /* mos7840_change_port_settings(mos7840_port,old_termios); */
1091 mos7840_port->icount.tx = 0; 1074 mos7840_port->icount.tx = 0;
1092 mos7840_port->icount.rx = 0; 1075 mos7840_port->icount.rx = 0;
1093 1076
1094 dbg("\n\nusb_serial serial:%p mos7840_port:%p\n usb_serial_port port:%p\n\n", serial, mos7840_port, port); 1077 dbg("\n\nusb_serial serial:%p mos7840_port:%p\n usb_serial_port port:%p\n\n",
1078 serial, mos7840_port, port);
1095 1079
1096 return 0; 1080 return 0;
1097 1081
@@ -1104,11 +1088,12 @@ static int mos7840_open(struct usb_serial_port *port, struct file *filp)
1104 * been written, but hasn't made it out the port yet) 1088 * been written, but hasn't made it out the port yet)
1105 * If successful, we return the number of bytes left to be written in the 1089 * If successful, we return the number of bytes left to be written in the
1106 * system, 1090 * system,
1107 * Otherwise we return a negative error number. 1091 * Otherwise we return zero.
1108 *****************************************************************************/ 1092 *****************************************************************************/
1109 1093
1110static int mos7840_chars_in_buffer(struct usb_serial_port *port) 1094static int mos7840_chars_in_buffer(struct tty_struct *tty)
1111{ 1095{
1096 struct usb_serial_port *port = tty->driver_data;
1112 int i; 1097 int i;
1113 int chars = 0; 1098 int chars = 0;
1114 unsigned long flags; 1099 unsigned long flags;
@@ -1118,22 +1103,20 @@ static int mos7840_chars_in_buffer(struct usb_serial_port *port)
1118 1103
1119 if (mos7840_port_paranoia_check(port, __func__)) { 1104 if (mos7840_port_paranoia_check(port, __func__)) {
1120 dbg("%s", "Invalid port \n"); 1105 dbg("%s", "Invalid port \n");
1121 return -1; 1106 return 0;
1122 } 1107 }
1123 1108
1124 mos7840_port = mos7840_get_port_private(port); 1109 mos7840_port = mos7840_get_port_private(port);
1125 if (mos7840_port == NULL) { 1110 if (mos7840_port == NULL) {
1126 dbg("%s \n", "mos7840_break:leaving ..........."); 1111 dbg("%s \n", "mos7840_break:leaving ...........");
1127 return -1; 1112 return 0;
1128 } 1113 }
1129 1114
1130 spin_lock_irqsave(&mos7840_port->pool_lock,flags); 1115 spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1131 for (i = 0; i < NUM_URBS; ++i) { 1116 for (i = 0; i < NUM_URBS; ++i)
1132 if (mos7840_port->busy[i]) { 1117 if (mos7840_port->busy[i])
1133 chars += URB_TRANSFER_BUFFER_SIZE; 1118 chars += URB_TRANSFER_BUFFER_SIZE;
1134 } 1119 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1135 }
1136 spin_unlock_irqrestore(&mos7840_port->pool_lock,flags);
1137 dbg("%s - returns %d", __func__, chars); 1120 dbg("%s - returns %d", __func__, chars);
1138 return chars; 1121 return chars;
1139 1122
@@ -1149,7 +1132,8 @@ static int mos7840_chars_in_buffer(struct usb_serial_port *port)
1149 * 3. A timeout of 3 seconds without activity has expired 1132 * 3. A timeout of 3 seconds without activity has expired
1150 * 1133 *
1151 ************************************************************************/ 1134 ************************************************************************/
1152static void mos7840_block_until_tx_empty(struct moschip_port *mos7840_port) 1135static void mos7840_block_until_tx_empty(struct tty_struct *tty,
1136 struct moschip_port *mos7840_port)
1153{ 1137{
1154 int timeout = HZ / 10; 1138 int timeout = HZ / 10;
1155 int wait = 30; 1139 int wait = 30;
@@ -1157,12 +1141,11 @@ static void mos7840_block_until_tx_empty(struct moschip_port *mos7840_port)
1157 1141
1158 while (1) { 1142 while (1) {
1159 1143
1160 count = mos7840_chars_in_buffer(mos7840_port->port); 1144 count = mos7840_chars_in_buffer(tty);
1161 1145
1162 /* Check for Buffer status */ 1146 /* Check for Buffer status */
1163 if (count <= 0) { 1147 if (count <= 0)
1164 return; 1148 return;
1165 }
1166 1149
1167 /* Block the thread for a while */ 1150 /* Block the thread for a while */
1168 interruptible_sleep_on_timeout(&mos7840_port->wait_chase, 1151 interruptible_sleep_on_timeout(&mos7840_port->wait_chase,
@@ -1185,7 +1168,8 @@ static void mos7840_block_until_tx_empty(struct moschip_port *mos7840_port)
1185 * this function is called by the tty driver when a port is closed 1168 * this function is called by the tty driver when a port is closed
1186 *****************************************************************************/ 1169 *****************************************************************************/
1187 1170
1188static void mos7840_close(struct usb_serial_port *port, struct file *filp) 1171static void mos7840_close(struct tty_struct *tty,
1172 struct usb_serial_port *port, struct file *filp)
1189{ 1173{
1190 struct usb_serial *serial; 1174 struct usb_serial *serial;
1191 struct moschip_port *mos7840_port; 1175 struct moschip_port *mos7840_port;
@@ -1226,32 +1210,28 @@ static void mos7840_close(struct usb_serial_port *port, struct file *filp)
1226 } 1210 }
1227 } 1211 }
1228 1212
1229 if (serial->dev) { 1213 if (serial->dev)
1230 /* flush and block until tx is empty */ 1214 /* flush and block until tx is empty */
1231 mos7840_block_until_tx_empty(mos7840_port); 1215 mos7840_block_until_tx_empty(tty, mos7840_port);
1232 }
1233 1216
1234 /* While closing port, shutdown all bulk read, write * 1217 /* While closing port, shutdown all bulk read, write *
1235 * and interrupt read if they exists */ 1218 * and interrupt read if they exists */
1236 if (serial->dev) { 1219 if (serial->dev) {
1237
1238 if (mos7840_port->write_urb) { 1220 if (mos7840_port->write_urb) {
1239 dbg("%s", "Shutdown bulk write\n"); 1221 dbg("%s", "Shutdown bulk write\n");
1240 usb_kill_urb(mos7840_port->write_urb); 1222 usb_kill_urb(mos7840_port->write_urb);
1241 } 1223 }
1242
1243 if (mos7840_port->read_urb) { 1224 if (mos7840_port->read_urb) {
1244 dbg("%s", "Shutdown bulk read\n"); 1225 dbg("%s", "Shutdown bulk read\n");
1245 usb_kill_urb(mos7840_port->read_urb); 1226 usb_kill_urb(mos7840_port->read_urb);
1246 } 1227 }
1247 if ((&mos7840_port->control_urb)) { 1228 if ((&mos7840_port->control_urb)) {
1248 dbg("%s", "Shutdown control read\n"); 1229 dbg("%s", "Shutdown control read\n");
1249 // usb_kill_urb (mos7840_port->control_urb); 1230 /*/ usb_kill_urb (mos7840_port->control_urb); */
1250
1251 } 1231 }
1252 } 1232 }
1253// if(mos7840_port->ctrl_buf != NULL) 1233/* if(mos7840_port->ctrl_buf != NULL) */
1254// kfree(mos7840_port->ctrl_buf); 1234/* kfree(mos7840_port->ctrl_buf); */
1255 port0->open_ports--; 1235 port0->open_ports--;
1256 dbg("mos7840_num_open_ports in close%d:in port%d\n", 1236 dbg("mos7840_num_open_ports in close%d:in port%d\n",
1257 port0->open_ports, port->number); 1237 port0->open_ports, port->number);
@@ -1264,10 +1244,8 @@ static void mos7840_close(struct usb_serial_port *port, struct file *filp)
1264 1244
1265 if (mos7840_port->write_urb) { 1245 if (mos7840_port->write_urb) {
1266 /* if this urb had a transfer buffer already (old tx) free it */ 1246 /* if this urb had a transfer buffer already (old tx) free it */
1267 1247 if (mos7840_port->write_urb->transfer_buffer != NULL)
1268 if (mos7840_port->write_urb->transfer_buffer != NULL) {
1269 kfree(mos7840_port->write_urb->transfer_buffer); 1248 kfree(mos7840_port->write_urb->transfer_buffer);
1270 }
1271 usb_free_urb(mos7840_port->write_urb); 1249 usb_free_urb(mos7840_port->write_urb);
1272 } 1250 }
1273 1251
@@ -1293,20 +1271,19 @@ static void mos7840_close(struct usb_serial_port *port, struct file *filp)
1293 * 1271 *
1294 ************************************************************************/ 1272 ************************************************************************/
1295 1273
1296static void mos7840_block_until_chase_response(struct moschip_port 1274static void mos7840_block_until_chase_response(struct tty_struct *tty,
1297 *mos7840_port) 1275 struct moschip_port *mos7840_port)
1298{ 1276{
1299 int timeout = 1 * HZ; 1277 int timeout = 1 * HZ;
1300 int wait = 10; 1278 int wait = 10;
1301 int count; 1279 int count;
1302 1280
1303 while (1) { 1281 while (1) {
1304 count = mos7840_chars_in_buffer(mos7840_port->port); 1282 count = mos7840_chars_in_buffer(tty);
1305 1283
1306 /* Check for Buffer status */ 1284 /* Check for Buffer status */
1307 if (count <= 0) { 1285 if (count <= 0)
1308 return; 1286 return;
1309 }
1310 1287
1311 /* Block the thread for a while */ 1288 /* Block the thread for a while */
1312 interruptible_sleep_on_timeout(&mos7840_port->wait_chase, 1289 interruptible_sleep_on_timeout(&mos7840_port->wait_chase,
@@ -1328,8 +1305,9 @@ static void mos7840_block_until_chase_response(struct moschip_port
1328 * mos7840_break 1305 * mos7840_break
1329 * this function sends a break to the port 1306 * this function sends a break to the port
1330 *****************************************************************************/ 1307 *****************************************************************************/
1331static void mos7840_break(struct usb_serial_port *port, int break_state) 1308static void mos7840_break(struct tty_struct *tty, int break_state)
1332{ 1309{
1310 struct usb_serial_port *port = tty->driver_data;
1333 unsigned char data; 1311 unsigned char data;
1334 struct usb_serial *serial; 1312 struct usb_serial *serial;
1335 struct moschip_port *mos7840_port; 1313 struct moschip_port *mos7840_port;
@@ -1350,21 +1328,17 @@ static void mos7840_break(struct usb_serial_port *port, int break_state)
1350 1328
1351 mos7840_port = mos7840_get_port_private(port); 1329 mos7840_port = mos7840_get_port_private(port);
1352 1330
1353 if (mos7840_port == NULL) { 1331 if (mos7840_port == NULL)
1354 return; 1332 return;
1355 }
1356
1357 if (serial->dev) {
1358 1333
1334 if (serial->dev)
1359 /* flush and block until tx is empty */ 1335 /* flush and block until tx is empty */
1360 mos7840_block_until_chase_response(mos7840_port); 1336 mos7840_block_until_chase_response(tty, mos7840_port);
1361 }
1362 1337
1363 if (break_state == -1) { 1338 if (break_state == -1)
1364 data = mos7840_port->shadowLCR | LCR_SET_BREAK; 1339 data = mos7840_port->shadowLCR | LCR_SET_BREAK;
1365 } else { 1340 else
1366 data = mos7840_port->shadowLCR & ~LCR_SET_BREAK; 1341 data = mos7840_port->shadowLCR & ~LCR_SET_BREAK;
1367 }
1368 1342
1369 mos7840_port->shadowLCR = data; 1343 mos7840_port->shadowLCR = data;
1370 dbg("mcs7840_break mos7840_port->shadowLCR is %x\n", 1344 dbg("mcs7840_break mos7840_port->shadowLCR is %x\n",
@@ -1383,8 +1357,9 @@ static void mos7840_break(struct usb_serial_port *port, int break_state)
1383 * Otherwise we return a negative error number. 1357 * Otherwise we return a negative error number.
1384 *****************************************************************************/ 1358 *****************************************************************************/
1385 1359
1386static int mos7840_write_room(struct usb_serial_port *port) 1360static int mos7840_write_room(struct tty_struct *tty)
1387{ 1361{
1362 struct usb_serial_port *port = tty->driver_data;
1388 int i; 1363 int i;
1389 int room = 0; 1364 int room = 0;
1390 unsigned long flags; 1365 unsigned long flags;
@@ -1406,9 +1381,8 @@ static int mos7840_write_room(struct usb_serial_port *port)
1406 1381
1407 spin_lock_irqsave(&mos7840_port->pool_lock, flags); 1382 spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1408 for (i = 0; i < NUM_URBS; ++i) { 1383 for (i = 0; i < NUM_URBS; ++i) {
1409 if (!mos7840_port->busy[i]) { 1384 if (!mos7840_port->busy[i])
1410 room += URB_TRANSFER_BUFFER_SIZE; 1385 room += URB_TRANSFER_BUFFER_SIZE;
1411 }
1412 } 1386 }
1413 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); 1387 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1414 1388
@@ -1426,7 +1400,7 @@ static int mos7840_write_room(struct usb_serial_port *port)
1426 * return a negative error number. 1400 * return a negative error number.
1427 *****************************************************************************/ 1401 *****************************************************************************/
1428 1402
1429static int mos7840_write(struct usb_serial_port *port, 1403static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
1430 const unsigned char *data, int count) 1404 const unsigned char *data, int count)
1431{ 1405{
1432 int status; 1406 int status;
@@ -1438,45 +1412,41 @@ static int mos7840_write(struct usb_serial_port *port,
1438 struct moschip_port *mos7840_port; 1412 struct moschip_port *mos7840_port;
1439 struct usb_serial *serial; 1413 struct usb_serial *serial;
1440 struct urb *urb; 1414 struct urb *urb;
1441 //__u16 Data; 1415 /* __u16 Data; */
1442 const unsigned char *current_position = data; 1416 const unsigned char *current_position = data;
1443 unsigned char *data1; 1417 unsigned char *data1;
1444 dbg("%s \n", "entering ..........."); 1418 dbg("%s \n", "entering ...........");
1445 //dbg("mos7840_write: mos7840_port->shadowLCR is %x\n",mos7840_port->shadowLCR); 1419 /* dbg("mos7840_write: mos7840_port->shadowLCR is %x\n",
1420 mos7840_port->shadowLCR); */
1446 1421
1447#ifdef NOTMOS7840 1422#ifdef NOTMOS7840
1448 Data = 0x00; 1423 Data = 0x00;
1449 status = 0;
1450 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 1424 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
1451 mos7840_port->shadowLCR = Data; 1425 mos7840_port->shadowLCR = Data;
1452 dbg("mos7840_write: LINE_CONTROL_REGISTER is %x\n", Data); 1426 dbg("mos7840_write: LINE_CONTROL_REGISTER is %x\n", Data);
1453 dbg("mos7840_write: mos7840_port->shadowLCR is %x\n", 1427 dbg("mos7840_write: mos7840_port->shadowLCR is %x\n",
1454 mos7840_port->shadowLCR); 1428 mos7840_port->shadowLCR);
1455 1429
1456 //Data = 0x03; 1430 /* Data = 0x03; */
1457 //status = mos7840_set_uart_reg(port,LINE_CONTROL_REGISTER,Data); 1431 /* status = mos7840_set_uart_reg(port,LINE_CONTROL_REGISTER,Data); */
1458 //mos7840_port->shadowLCR=Data;//Need to add later 1432 /* mos7840_port->shadowLCR=Data;//Need to add later */
1459 1433
1460 Data |= SERIAL_LCR_DLAB; //data latch enable in LCR 0x80 1434 Data |= SERIAL_LCR_DLAB; /* data latch enable in LCR 0x80 */
1461 status = 0;
1462 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1435 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1463 1436
1464 //Data = 0x0c; 1437 /* Data = 0x0c; */
1465 //status = mos7840_set_uart_reg(port,DIVISOR_LATCH_LSB,Data); 1438 /* status = mos7840_set_uart_reg(port,DIVISOR_LATCH_LSB,Data); */
1466 Data = 0x00; 1439 Data = 0x00;
1467 status = 0;
1468 status = mos7840_get_uart_reg(port, DIVISOR_LATCH_LSB, &Data); 1440 status = mos7840_get_uart_reg(port, DIVISOR_LATCH_LSB, &Data);
1469 dbg("mos7840_write:DLL value is %x\n", Data); 1441 dbg("mos7840_write:DLL value is %x\n", Data);
1470 1442
1471 Data = 0x0; 1443 Data = 0x0;
1472 status = 0;
1473 status = mos7840_get_uart_reg(port, DIVISOR_LATCH_MSB, &Data); 1444 status = mos7840_get_uart_reg(port, DIVISOR_LATCH_MSB, &Data);
1474 dbg("mos7840_write:DLM value is %x\n", Data); 1445 dbg("mos7840_write:DLM value is %x\n", Data);
1475 1446
1476 Data = Data & ~SERIAL_LCR_DLAB; 1447 Data = Data & ~SERIAL_LCR_DLAB;
1477 dbg("mos7840_write: mos7840_port->shadowLCR is %x\n", 1448 dbg("mos7840_write: mos7840_port->shadowLCR is %x\n",
1478 mos7840_port->shadowLCR); 1449 mos7840_port->shadowLCR);
1479 status = 0;
1480 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1450 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1481#endif 1451#endif
1482 1452
@@ -1555,8 +1525,7 @@ static int mos7840_write(struct usb_serial_port *port,
1555 mos7840_port->icount.tx += transfer_size; 1525 mos7840_port->icount.tx += transfer_size;
1556 smp_wmb(); 1526 smp_wmb();
1557 dbg("mos7840_port->icount.tx is %d:\n", mos7840_port->icount.tx); 1527 dbg("mos7840_port->icount.tx is %d:\n", mos7840_port->icount.tx);
1558 exit: 1528exit:
1559
1560 return bytes_sent; 1529 return bytes_sent;
1561 1530
1562} 1531}
@@ -1567,10 +1536,10 @@ static int mos7840_write(struct usb_serial_port *port,
1567 * being read from the port. 1536 * being read from the port.
1568 *****************************************************************************/ 1537 *****************************************************************************/
1569 1538
1570static void mos7840_throttle(struct usb_serial_port *port) 1539static void mos7840_throttle(struct tty_struct *tty)
1571{ 1540{
1541 struct usb_serial_port *port = tty->driver_data;
1572 struct moschip_port *mos7840_port; 1542 struct moschip_port *mos7840_port;
1573 struct tty_struct *tty;
1574 int status; 1543 int status;
1575 1544
1576 if (mos7840_port_paranoia_check(port, __func__)) { 1545 if (mos7840_port_paranoia_check(port, __func__)) {
@@ -1592,32 +1561,20 @@ static void mos7840_throttle(struct usb_serial_port *port)
1592 1561
1593 dbg("%s", "Entering .......... \n"); 1562 dbg("%s", "Entering .......... \n");
1594 1563
1595 tty = port->tty;
1596 if (!tty) {
1597 dbg("%s - no tty available", __func__);
1598 return;
1599 }
1600
1601 /* if we are implementing XON/XOFF, send the stop character */ 1564 /* if we are implementing XON/XOFF, send the stop character */
1602 if (I_IXOFF(tty)) { 1565 if (I_IXOFF(tty)) {
1603 unsigned char stop_char = STOP_CHAR(tty); 1566 unsigned char stop_char = STOP_CHAR(tty);
1604 status = mos7840_write(port, &stop_char, 1); 1567 status = mos7840_write(tty, port, &stop_char, 1);
1605 if (status <= 0) { 1568 if (status <= 0)
1606 return; 1569 return;
1607 }
1608 } 1570 }
1609
1610 /* if we are implementing RTS/CTS, toggle that line */ 1571 /* if we are implementing RTS/CTS, toggle that line */
1611 if (tty->termios->c_cflag & CRTSCTS) { 1572 if (tty->termios->c_cflag & CRTSCTS) {
1612 mos7840_port->shadowMCR &= ~MCR_RTS; 1573 mos7840_port->shadowMCR &= ~MCR_RTS;
1613 status = 0; 1574 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1614 status =
1615 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1616 mos7840_port->shadowMCR); 1575 mos7840_port->shadowMCR);
1617 1576 if (status < 0)
1618 if (status < 0) {
1619 return; 1577 return;
1620 }
1621 } 1578 }
1622 1579
1623 return; 1580 return;
@@ -1625,12 +1582,13 @@ static void mos7840_throttle(struct usb_serial_port *port)
1625 1582
1626/***************************************************************************** 1583/*****************************************************************************
1627 * mos7840_unthrottle 1584 * mos7840_unthrottle
1628 * this function is called by the tty driver when it wants to resume the data 1585 * this function is called by the tty driver when it wants to resume
1629 * being read from the port (called after SerialThrottle is called) 1586 * the data being read from the port (called after mos7840_throttle is
1587 * called)
1630 *****************************************************************************/ 1588 *****************************************************************************/
1631static void mos7840_unthrottle(struct usb_serial_port *port) 1589static void mos7840_unthrottle(struct tty_struct *tty)
1632{ 1590{
1633 struct tty_struct *tty; 1591 struct usb_serial_port *port = tty->driver_data;
1634 int status; 1592 int status;
1635 struct moschip_port *mos7840_port = mos7840_get_port_private(port); 1593 struct moschip_port *mos7840_port = mos7840_get_port_private(port);
1636 1594
@@ -1649,43 +1607,32 @@ static void mos7840_unthrottle(struct usb_serial_port *port)
1649 1607
1650 dbg("%s", "Entering .......... \n"); 1608 dbg("%s", "Entering .......... \n");
1651 1609
1652 tty = port->tty;
1653 if (!tty) {
1654 dbg("%s - no tty available", __func__);
1655 return;
1656 }
1657
1658 /* if we are implementing XON/XOFF, send the start character */ 1610 /* if we are implementing XON/XOFF, send the start character */
1659 if (I_IXOFF(tty)) { 1611 if (I_IXOFF(tty)) {
1660 unsigned char start_char = START_CHAR(tty); 1612 unsigned char start_char = START_CHAR(tty);
1661 status = mos7840_write(port, &start_char, 1); 1613 status = mos7840_write(tty, port, &start_char, 1);
1662 if (status <= 0) { 1614 if (status <= 0)
1663 return; 1615 return;
1664 }
1665 } 1616 }
1666 1617
1667 /* if we are implementing RTS/CTS, toggle that line */ 1618 /* if we are implementing RTS/CTS, toggle that line */
1668 if (tty->termios->c_cflag & CRTSCTS) { 1619 if (tty->termios->c_cflag & CRTSCTS) {
1669 mos7840_port->shadowMCR |= MCR_RTS; 1620 mos7840_port->shadowMCR |= MCR_RTS;
1670 status = 0; 1621 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1671 status =
1672 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1673 mos7840_port->shadowMCR); 1622 mos7840_port->shadowMCR);
1674 if (status < 0) { 1623 if (status < 0)
1675 return; 1624 return;
1676 }
1677 } 1625 }
1678
1679 return;
1680} 1626}
1681 1627
1682static int mos7840_tiocmget(struct usb_serial_port *port, struct file *file) 1628static int mos7840_tiocmget(struct tty_struct *tty, struct file *file)
1683{ 1629{
1630 struct usb_serial_port *port = tty->driver_data;
1684 struct moschip_port *mos7840_port; 1631 struct moschip_port *mos7840_port;
1685 unsigned int result; 1632 unsigned int result;
1686 __u16 msr; 1633 __u16 msr;
1687 __u16 mcr; 1634 __u16 mcr;
1688 int status = 0; 1635 int status;
1689 mos7840_port = mos7840_get_port_private(port); 1636 mos7840_port = mos7840_get_port_private(port);
1690 1637
1691 dbg("%s - port %d", __func__, port->number); 1638 dbg("%s - port %d", __func__, port->number);
@@ -1708,9 +1655,10 @@ static int mos7840_tiocmget(struct usb_serial_port *port, struct file *file)
1708 return result; 1655 return result;
1709} 1656}
1710 1657
1711static int mos7840_tiocmset(struct usb_serial_port *port, struct file *file, 1658static int mos7840_tiocmset(struct tty_struct *tty, struct file *file,
1712 unsigned int set, unsigned int clear) 1659 unsigned int set, unsigned int clear)
1713{ 1660{
1661 struct usb_serial_port *port = tty->driver_data;
1714 struct moschip_port *mos7840_port; 1662 struct moschip_port *mos7840_port;
1715 unsigned int mcr; 1663 unsigned int mcr;
1716 int status; 1664 int status;
@@ -1755,7 +1703,7 @@ static int mos7840_tiocmset(struct usb_serial_port *port, struct file *file,
1755 * baud rate. 1703 * baud rate.
1756 *****************************************************************************/ 1704 *****************************************************************************/
1757static int mos7840_calc_baud_rate_divisor(int baudRate, int *divisor, 1705static int mos7840_calc_baud_rate_divisor(int baudRate, int *divisor,
1758 __u16 * clk_sel_val) 1706 __u16 *clk_sel_val)
1759{ 1707{
1760 1708
1761 dbg("%s - %d", __func__, baudRate); 1709 dbg("%s - %d", __func__, baudRate);
@@ -1807,9 +1755,8 @@ static int mos7840_calc_baud_rate_divisor(int baudRate, int *divisor,
1807 /* Check for round off */ 1755 /* Check for round off */
1808 round1 = (__u16) (2304000L / baudrate); 1756 round1 = (__u16) (2304000L / baudrate);
1809 round = (__u16) (round1 - (custom * 10)); 1757 round = (__u16) (round1 - (custom * 10));
1810 if (round > 4) { 1758 if (round > 4)
1811 custom++; 1759 custom++;
1812 }
1813 *divisor = custom; 1760 *divisor = custom;
1814 1761
1815 dbg(" Baud %d = %d\n", baudrate, custom); 1762 dbg(" Baud %d = %d\n", baudrate, custom);
@@ -1857,16 +1804,15 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1857 1804
1858 dbg("%s - port = %d, baud = %d", __func__, 1805 dbg("%s - port = %d, baud = %d", __func__,
1859 mos7840_port->port->number, baudRate); 1806 mos7840_port->port->number, baudRate);
1860 //reset clk_uart_sel in spregOffset 1807 /* reset clk_uart_sel in spregOffset */
1861 if (baudRate > 115200) { 1808 if (baudRate > 115200) {
1862#ifdef HW_flow_control 1809#ifdef HW_flow_control
1863 //NOTE: need to see the pther register to modify 1810 /* NOTE: need to see the pther register to modify */
1864 //setting h/w flow control bit to 1; 1811 /* setting h/w flow control bit to 1 */
1865 status = 0;
1866 Data = 0x2b; 1812 Data = 0x2b;
1867 mos7840_port->shadowMCR = Data; 1813 mos7840_port->shadowMCR = Data;
1868 status = 1814 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1869 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1815 Data);
1870 if (status < 0) { 1816 if (status < 0) {
1871 dbg("Writing spreg failed in set_serial_baud\n"); 1817 dbg("Writing spreg failed in set_serial_baud\n");
1872 return -1; 1818 return -1;
@@ -1875,12 +1821,11 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1875 1821
1876 } else { 1822 } else {
1877#ifdef HW_flow_control 1823#ifdef HW_flow_control
1878 //setting h/w flow control bit to 0; 1824 / *setting h/w flow control bit to 0 */
1879 status = 0;
1880 Data = 0xb; 1825 Data = 0xb;
1881 mos7840_port->shadowMCR = Data; 1826 mos7840_port->shadowMCR = Data;
1882 status = 1827 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1883 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1828 Data);
1884 if (status < 0) { 1829 if (status < 0) {
1885 dbg("Writing spreg failed in set_serial_baud\n"); 1830 dbg("Writing spreg failed in set_serial_baud\n");
1886 return -1; 1831 return -1;
@@ -1889,25 +1834,20 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1889 1834
1890 } 1835 }
1891 1836
1892 if (1) //baudRate <= 115200) 1837 if (1) { /* baudRate <= 115200) */
1893 {
1894 clk_sel_val = 0x0; 1838 clk_sel_val = 0x0;
1895 Data = 0x0; 1839 Data = 0x0;
1896 status = 0; 1840 status = mos7840_calc_baud_rate_divisor(baudRate, &divisor,
1897 status =
1898 mos7840_calc_baud_rate_divisor(baudRate, &divisor,
1899 &clk_sel_val); 1841 &clk_sel_val);
1900 status = 1842 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset,
1901 mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, 1843 &Data);
1902 &Data);
1903 if (status < 0) { 1844 if (status < 0) {
1904 dbg("reading spreg failed in set_serial_baud\n"); 1845 dbg("reading spreg failed in set_serial_baud\n");
1905 return -1; 1846 return -1;
1906 } 1847 }
1907 Data = (Data & 0x8f) | clk_sel_val; 1848 Data = (Data & 0x8f) | clk_sel_val;
1908 status = 0; 1849 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset,
1909 status = 1850 Data);
1910 mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
1911 if (status < 0) { 1851 if (status < 0) {
1912 dbg("Writing spreg failed in set_serial_baud\n"); 1852 dbg("Writing spreg failed in set_serial_baud\n");
1913 return -1; 1853 return -1;
@@ -1939,7 +1879,6 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1939 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1879 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1940 1880
1941 } 1881 }
1942
1943 return status; 1882 return status;
1944} 1883}
1945 1884
@@ -1949,10 +1888,9 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1949 * the specified new settings. 1888 * the specified new settings.
1950 *****************************************************************************/ 1889 *****************************************************************************/
1951 1890
1952static void mos7840_change_port_settings(struct moschip_port *mos7840_port, 1891static void mos7840_change_port_settings(struct tty_struct *tty,
1953 struct ktermios *old_termios) 1892 struct moschip_port *mos7840_port, struct ktermios *old_termios)
1954{ 1893{
1955 struct tty_struct *tty;
1956 int baud; 1894 int baud;
1957 unsigned cflag; 1895 unsigned cflag;
1958 unsigned iflag; 1896 unsigned iflag;
@@ -1988,8 +1926,6 @@ static void mos7840_change_port_settings(struct moschip_port *mos7840_port,
1988 return; 1926 return;
1989 } 1927 }
1990 1928
1991 tty = mos7840_port->port->tty;
1992
1993 dbg("%s", "Entering .......... \n"); 1929 dbg("%s", "Entering .......... \n");
1994 1930
1995 lData = LCR_BITS_8; 1931 lData = LCR_BITS_8;
@@ -2033,9 +1969,8 @@ static void mos7840_change_port_settings(struct moschip_port *mos7840_port,
2033 dbg("%s - parity = none", __func__); 1969 dbg("%s - parity = none", __func__);
2034 } 1970 }
2035 1971
2036 if (cflag & CMSPAR) { 1972 if (cflag & CMSPAR)
2037 lParity = lParity | 0x20; 1973 lParity = lParity | 0x20;
2038 }
2039 1974
2040 /* Change the Stop bit */ 1975 /* Change the Stop bit */
2041 if (cflag & CSTOPB) { 1976 if (cflag & CSTOPB) {
@@ -2077,16 +2012,13 @@ static void mos7840_change_port_settings(struct moschip_port *mos7840_port,
2077 /* set up the MCR register and send it to the mos7840 */ 2012 /* set up the MCR register and send it to the mos7840 */
2078 2013
2079 mos7840_port->shadowMCR = MCR_MASTER_IE; 2014 mos7840_port->shadowMCR = MCR_MASTER_IE;
2080 if (cflag & CBAUD) { 2015 if (cflag & CBAUD)
2081 mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS); 2016 mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS);
2082 }
2083 2017
2084 if (cflag & CRTSCTS) { 2018 if (cflag & CRTSCTS)
2085 mos7840_port->shadowMCR |= (MCR_XON_ANY); 2019 mos7840_port->shadowMCR |= (MCR_XON_ANY);
2086 2020 else
2087 } else {
2088 mos7840_port->shadowMCR &= ~(MCR_XON_ANY); 2021 mos7840_port->shadowMCR &= ~(MCR_XON_ANY);
2089 }
2090 2022
2091 Data = mos7840_port->shadowMCR; 2023 Data = mos7840_port->shadowMCR;
2092 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 2024 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
@@ -2131,14 +2063,14 @@ static void mos7840_change_port_settings(struct moschip_port *mos7840_port,
2131 * the termios structure 2063 * the termios structure
2132 *****************************************************************************/ 2064 *****************************************************************************/
2133 2065
2134static void mos7840_set_termios(struct usb_serial_port *port, 2066static void mos7840_set_termios(struct tty_struct *tty,
2067 struct usb_serial_port *port,
2135 struct ktermios *old_termios) 2068 struct ktermios *old_termios)
2136{ 2069{
2137 int status; 2070 int status;
2138 unsigned int cflag; 2071 unsigned int cflag;
2139 struct usb_serial *serial; 2072 struct usb_serial *serial;
2140 struct moschip_port *mos7840_port; 2073 struct moschip_port *mos7840_port;
2141 struct tty_struct *tty;
2142 dbg("mos7840_set_termios: START\n"); 2074 dbg("mos7840_set_termios: START\n");
2143 if (mos7840_port_paranoia_check(port, __func__)) { 2075 if (mos7840_port_paranoia_check(port, __func__)) {
2144 dbg("%s", "Invalid port \n"); 2076 dbg("%s", "Invalid port \n");
@@ -2157,8 +2089,6 @@ static void mos7840_set_termios(struct usb_serial_port *port,
2157 if (mos7840_port == NULL) 2089 if (mos7840_port == NULL)
2158 return; 2090 return;
2159 2091
2160 tty = port->tty;
2161
2162 if (!mos7840_port->open) { 2092 if (!mos7840_port->open) {
2163 dbg("%s - port not opened", __func__); 2093 dbg("%s - port not opened", __func__);
2164 return; 2094 return;
@@ -2176,7 +2106,7 @@ static void mos7840_set_termios(struct usb_serial_port *port,
2176 2106
2177 /* change the port settings to the new ones specified */ 2107 /* change the port settings to the new ones specified */
2178 2108
2179 mos7840_change_port_settings(mos7840_port, old_termios); 2109 mos7840_change_port_settings(tty, mos7840_port, old_termios);
2180 2110
2181 if (!mos7840_port->read_urb) { 2111 if (!mos7840_port->read_urb) {
2182 dbg("%s", "URB KILLED !!!!!\n"); 2112 dbg("%s", "URB KILLED !!!!!\n");
@@ -2205,13 +2135,13 @@ static void mos7840_set_termios(struct usb_serial_port *port,
2205 * allows an RS485 driver to be written in user space. 2135 * allows an RS485 driver to be written in user space.
2206 *****************************************************************************/ 2136 *****************************************************************************/
2207 2137
2208static int mos7840_get_lsr_info(struct moschip_port *mos7840_port, 2138static int mos7840_get_lsr_info(struct tty_struct *tty,
2209 unsigned int __user *value) 2139 unsigned int __user *value)
2210{ 2140{
2211 int count; 2141 int count;
2212 unsigned int result = 0; 2142 unsigned int result = 0;
2213 2143
2214 count = mos7840_chars_in_buffer(mos7840_port->port); 2144 count = mos7840_chars_in_buffer(tty);
2215 if (count == 0) { 2145 if (count == 0) {
2216 dbg("%s -- Empty", __func__); 2146 dbg("%s -- Empty", __func__);
2217 result = TIOCSER_TEMT; 2147 result = TIOCSER_TEMT;
@@ -2227,6 +2157,8 @@ static int mos7840_get_lsr_info(struct moschip_port *mos7840_port,
2227 * function to set modem info 2157 * function to set modem info
2228 *****************************************************************************/ 2158 *****************************************************************************/
2229 2159
2160/* FIXME: Should be using the model control hooks */
2161
2230static int mos7840_set_modem_info(struct moschip_port *mos7840_port, 2162static int mos7840_set_modem_info(struct moschip_port *mos7840_port,
2231 unsigned int cmd, unsigned int __user *value) 2163 unsigned int cmd, unsigned int __user *value)
2232{ 2164{
@@ -2282,7 +2214,6 @@ static int mos7840_set_modem_info(struct moschip_port *mos7840_port,
2282 mos7840_port->shadowMCR = mcr; 2214 mos7840_port->shadowMCR = mcr;
2283 2215
2284 Data = mos7840_port->shadowMCR; 2216 Data = mos7840_port->shadowMCR;
2285 status = 0;
2286 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 2217 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
2287 if (status < 0) { 2218 if (status < 0) {
2288 dbg("setting MODEM_CONTROL_REGISTER Failed\n"); 2219 dbg("setting MODEM_CONTROL_REGISTER Failed\n");
@@ -2303,10 +2234,8 @@ static int mos7840_get_modem_info(struct moschip_port *mos7840_port,
2303 unsigned int result = 0; 2234 unsigned int result = 0;
2304 __u16 msr; 2235 __u16 msr;
2305 unsigned int mcr = mos7840_port->shadowMCR; 2236 unsigned int mcr = mos7840_port->shadowMCR;
2306 int status = 0; 2237 mos7840_get_uart_reg(mos7840_port->port,
2307 status = 2238 MODEM_STATUS_REGISTER, &msr);
2308 mos7840_get_uart_reg(mos7840_port->port, MODEM_STATUS_REGISTER,
2309 &msr);
2310 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) /* 0x002 */ 2239 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) /* 0x002 */
2311 |((mcr & MCR_RTS) ? TIOCM_RTS : 0) /* 0x004 */ 2240 |((mcr & MCR_RTS) ? TIOCM_RTS : 0) /* 0x004 */
2312 |((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0) /* 0x020 */ 2241 |((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0) /* 0x020 */
@@ -2359,12 +2288,12 @@ static int mos7840_get_serial_info(struct moschip_port *mos7840_port,
2359 * this function handles any ioctl calls to the driver 2288 * this function handles any ioctl calls to the driver
2360 *****************************************************************************/ 2289 *****************************************************************************/
2361 2290
2362static int mos7840_ioctl(struct usb_serial_port *port, struct file *file, 2291static int mos7840_ioctl(struct tty_struct *tty, struct file *file,
2363 unsigned int cmd, unsigned long arg) 2292 unsigned int cmd, unsigned long arg)
2364{ 2293{
2294 struct usb_serial_port *port = tty->driver_data;
2365 void __user *argp = (void __user *)arg; 2295 void __user *argp = (void __user *)arg;
2366 struct moschip_port *mos7840_port; 2296 struct moschip_port *mos7840_port;
2367 struct tty_struct *tty;
2368 2297
2369 struct async_icount cnow; 2298 struct async_icount cnow;
2370 struct async_icount cprev; 2299 struct async_icount cprev;
@@ -2381,8 +2310,6 @@ static int mos7840_ioctl(struct usb_serial_port *port, struct file *file,
2381 if (mos7840_port == NULL) 2310 if (mos7840_port == NULL)
2382 return -1; 2311 return -1;
2383 2312
2384 tty = mos7840_port->port->tty;
2385
2386 dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd); 2313 dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd);
2387 2314
2388 switch (cmd) { 2315 switch (cmd) {
@@ -2390,9 +2317,10 @@ static int mos7840_ioctl(struct usb_serial_port *port, struct file *file,
2390 2317
2391 case TIOCSERGETLSR: 2318 case TIOCSERGETLSR:
2392 dbg("%s (%d) TIOCSERGETLSR", __func__, port->number); 2319 dbg("%s (%d) TIOCSERGETLSR", __func__, port->number);
2393 return mos7840_get_lsr_info(mos7840_port, argp); 2320 return mos7840_get_lsr_info(tty, argp);
2394 return 0; 2321 return 0;
2395 2322
2323 /* FIXME: use the modem hooks and remove this */
2396 case TIOCMBIS: 2324 case TIOCMBIS:
2397 case TIOCMBIC: 2325 case TIOCMBIC:
2398 case TIOCMSET: 2326 case TIOCMSET:
@@ -2418,7 +2346,7 @@ static int mos7840_ioctl(struct usb_serial_port *port, struct file *file,
2418 dbg("%s (%d) TIOCMIWAIT", __func__, port->number); 2346 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
2419 cprev = mos7840_port->icount; 2347 cprev = mos7840_port->icount;
2420 while (1) { 2348 while (1) {
2421 //interruptible_sleep_on(&mos7840_port->delta_msr_wait); 2349 /* interruptible_sleep_on(&mos7840_port->delta_msr_wait); */
2422 mos7840_port->delta_msr_cond = 0; 2350 mos7840_port->delta_msr_cond = 0;
2423 wait_event_interruptible(mos7840_port->delta_msr_wait, 2351 wait_event_interruptible(mos7840_port->delta_msr_wait,
2424 (mos7840_port-> 2352 (mos7840_port->
@@ -2463,13 +2391,9 @@ static int mos7840_ioctl(struct usb_serial_port *port, struct file *file,
2463 if (copy_to_user(argp, &icount, sizeof(icount))) 2391 if (copy_to_user(argp, &icount, sizeof(icount)))
2464 return -EFAULT; 2392 return -EFAULT;
2465 return 0; 2393 return 0;
2466
2467 case TIOCEXBAUD:
2468 return 0;
2469 default: 2394 default:
2470 break; 2395 break;
2471 } 2396 }
2472
2473 return -ENOIOCTLCMD; 2397 return -ENOIOCTLCMD;
2474} 2398}
2475 2399
@@ -2527,8 +2451,9 @@ static int mos7840_startup(struct usb_serial *serial)
2527 goto error; 2451 goto error;
2528 } 2452 }
2529 2453
2530 /* Initialize all port interrupt end point to port 0 int endpoint * 2454 /* Initialize all port interrupt end point to port 0 int
2531 * Our device has only one interrupt end point comman to all port */ 2455 * endpoint. Our device has only one interrupt end point
2456 * common to all port */
2532 2457
2533 mos7840_port->port = serial->port[i]; 2458 mos7840_port->port = serial->port[i];
2534 mos7840_set_port_private(serial->port[i], mos7840_port); 2459 mos7840_set_port_private(serial->port[i], mos7840_port);
@@ -2564,27 +2489,23 @@ static int mos7840_startup(struct usb_serial *serial)
2564 mos7840_port->DcrRegOffset = 0x1c; 2489 mos7840_port->DcrRegOffset = 0x1c;
2565 } 2490 }
2566 mos7840_dump_serial_port(mos7840_port); 2491 mos7840_dump_serial_port(mos7840_port);
2567
2568 mos7840_set_port_private(serial->port[i], mos7840_port); 2492 mos7840_set_port_private(serial->port[i], mos7840_port);
2569 2493
2570 //enable rx_disable bit in control register 2494 /* enable rx_disable bit in control register */
2571 2495 status = mos7840_get_reg_sync(serial->port[i],
2572 status = 2496 mos7840_port->ControlRegOffset, &Data);
2573 mos7840_get_reg_sync(serial->port[i],
2574 mos7840_port->ControlRegOffset, &Data);
2575 if (status < 0) { 2497 if (status < 0) {
2576 dbg("Reading ControlReg failed status-0x%x\n", status); 2498 dbg("Reading ControlReg failed status-0x%x\n", status);
2577 break; 2499 break;
2578 } else 2500 } else
2579 dbg("ControlReg Reading success val is %x, status%d\n", 2501 dbg("ControlReg Reading success val is %x, status%d\n",
2580 Data, status); 2502 Data, status);
2581 Data |= 0x08; //setting driver done bit 2503 Data |= 0x08; /* setting driver done bit */
2582 Data |= 0x04; //sp1_bit to have cts change reflect in modem status reg 2504 Data |= 0x04; /* sp1_bit to have cts change reflect in
2505 modem status reg */
2583 2506
2584 //Data |= 0x20; //rx_disable bit 2507 /* Data |= 0x20; //rx_disable bit */
2585 status = 0; 2508 status = mos7840_set_reg_sync(serial->port[i],
2586 status =
2587 mos7840_set_reg_sync(serial->port[i],
2588 mos7840_port->ControlRegOffset, Data); 2509 mos7840_port->ControlRegOffset, Data);
2589 if (status < 0) { 2510 if (status < 0) {
2590 dbg("Writing ControlReg failed(rx_disable) status-0x%x\n", status); 2511 dbg("Writing ControlReg failed(rx_disable) status-0x%x\n", status);
@@ -2593,13 +2514,11 @@ static int mos7840_startup(struct usb_serial *serial)
2593 dbg("ControlReg Writing success(rx_disable) status%d\n", 2514 dbg("ControlReg Writing success(rx_disable) status%d\n",
2594 status); 2515 status);
2595 2516
2596 //Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2 and 0x24 in DCR3 2517 /* Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2
2518 and 0x24 in DCR3 */
2597 Data = 0x01; 2519 Data = 0x01;
2598 status = 0; 2520 status = mos7840_set_reg_sync(serial->port[i],
2599 status = 2521 (__u16) (mos7840_port->DcrRegOffset + 0), Data);
2600 mos7840_set_reg_sync(serial->port[i],
2601 (__u16) (mos7840_port->DcrRegOffset +
2602 0), Data);
2603 if (status < 0) { 2522 if (status < 0) {
2604 dbg("Writing DCR0 failed status-0x%x\n", status); 2523 dbg("Writing DCR0 failed status-0x%x\n", status);
2605 break; 2524 break;
@@ -2607,11 +2526,8 @@ static int mos7840_startup(struct usb_serial *serial)
2607 dbg("DCR0 Writing success status%d\n", status); 2526 dbg("DCR0 Writing success status%d\n", status);
2608 2527
2609 Data = 0x05; 2528 Data = 0x05;
2610 status = 0; 2529 status = mos7840_set_reg_sync(serial->port[i],
2611 status = 2530 (__u16) (mos7840_port->DcrRegOffset + 1), Data);
2612 mos7840_set_reg_sync(serial->port[i],
2613 (__u16) (mos7840_port->DcrRegOffset +
2614 1), Data);
2615 if (status < 0) { 2531 if (status < 0) {
2616 dbg("Writing DCR1 failed status-0x%x\n", status); 2532 dbg("Writing DCR1 failed status-0x%x\n", status);
2617 break; 2533 break;
@@ -2619,22 +2535,17 @@ static int mos7840_startup(struct usb_serial *serial)
2619 dbg("DCR1 Writing success status%d\n", status); 2535 dbg("DCR1 Writing success status%d\n", status);
2620 2536
2621 Data = 0x24; 2537 Data = 0x24;
2622 status = 0; 2538 status = mos7840_set_reg_sync(serial->port[i],
2623 status = 2539 (__u16) (mos7840_port->DcrRegOffset + 2), Data);
2624 mos7840_set_reg_sync(serial->port[i],
2625 (__u16) (mos7840_port->DcrRegOffset +
2626 2), Data);
2627 if (status < 0) { 2540 if (status < 0) {
2628 dbg("Writing DCR2 failed status-0x%x\n", status); 2541 dbg("Writing DCR2 failed status-0x%x\n", status);
2629 break; 2542 break;
2630 } else 2543 } else
2631 dbg("DCR2 Writing success status%d\n", status); 2544 dbg("DCR2 Writing success status%d\n", status);
2632 2545
2633 // write values in clkstart0x0 and clkmulti 0x20 2546 /* write values in clkstart0x0 and clkmulti 0x20 */
2634 Data = 0x0; 2547 Data = 0x0;
2635 status = 0; 2548 status = mos7840_set_reg_sync(serial->port[i],
2636 status =
2637 mos7840_set_reg_sync(serial->port[i],
2638 CLK_START_VALUE_REGISTER, Data); 2549 CLK_START_VALUE_REGISTER, Data);
2639 if (status < 0) { 2550 if (status < 0) {
2640 dbg("Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status); 2551 dbg("Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status);
@@ -2643,9 +2554,8 @@ static int mos7840_startup(struct usb_serial *serial)
2643 dbg("CLK_START_VALUE_REGISTER Writing success status%d\n", status); 2554 dbg("CLK_START_VALUE_REGISTER Writing success status%d\n", status);
2644 2555
2645 Data = 0x20; 2556 Data = 0x20;
2646 status = 2557 status = mos7840_set_reg_sync(serial->port[i],
2647 mos7840_set_reg_sync(serial->port[i], CLK_MULTI_REGISTER, 2558 CLK_MULTI_REGISTER, Data);
2648 Data);
2649 if (status < 0) { 2559 if (status < 0) {
2650 dbg("Writing CLK_MULTI_REGISTER failed status-0x%x\n", 2560 dbg("Writing CLK_MULTI_REGISTER failed status-0x%x\n",
2651 status); 2561 status);
@@ -2654,11 +2564,10 @@ static int mos7840_startup(struct usb_serial *serial)
2654 dbg("CLK_MULTI_REGISTER Writing success status%d\n", 2564 dbg("CLK_MULTI_REGISTER Writing success status%d\n",
2655 status); 2565 status);
2656 2566
2657 //write value 0x0 to scratchpad register 2567 /* write value 0x0 to scratchpad register */
2658 Data = 0x00; 2568 Data = 0x00;
2659 status = 2569 status = mos7840_set_uart_reg(serial->port[i],
2660 mos7840_set_uart_reg(serial->port[i], SCRATCH_PAD_REGISTER, 2570 SCRATCH_PAD_REGISTER, Data);
2661 Data);
2662 if (status < 0) { 2571 if (status < 0) {
2663 dbg("Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", 2572 dbg("Writing SCRATCH_PAD_REGISTER failed status-0x%x\n",
2664 status); 2573 status);
@@ -2667,21 +2576,17 @@ static int mos7840_startup(struct usb_serial *serial)
2667 dbg("SCRATCH_PAD_REGISTER Writing success status%d\n", 2576 dbg("SCRATCH_PAD_REGISTER Writing success status%d\n",
2668 status); 2577 status);
2669 2578
2670 //Zero Length flag register 2579 /* Zero Length flag register */
2671 if ((mos7840_port->port_num != 1) 2580 if ((mos7840_port->port_num != 1)
2672 && (serial->num_ports == 2)) { 2581 && (serial->num_ports == 2)) {
2673 2582
2674 Data = 0xff; 2583 Data = 0xff;
2675 status = 0;
2676 status = mos7840_set_reg_sync(serial->port[i], 2584 status = mos7840_set_reg_sync(serial->port[i],
2677 (__u16) (ZLP_REG1 + 2585 (__u16) (ZLP_REG1 +
2678 ((__u16) 2586 ((__u16)mos7840_port->port_num)), Data);
2679 mos7840_port->
2680 port_num)),
2681 Data);
2682 dbg("ZLIP offset%x\n", 2587 dbg("ZLIP offset%x\n",
2683 (__u16) (ZLP_REG1 + 2588 (__u16) (ZLP_REG1 +
2684 ((__u16) mos7840_port->port_num))); 2589 ((__u16) mos7840_port->port_num)));
2685 if (status < 0) { 2590 if (status < 0) {
2686 dbg("Writing ZLP_REG%d failed status-0x%x\n", 2591 dbg("Writing ZLP_REG%d failed status-0x%x\n",
2687 i + 2, status); 2592 i + 2, status);
@@ -2691,13 +2596,9 @@ static int mos7840_startup(struct usb_serial *serial)
2691 i + 2, status); 2596 i + 2, status);
2692 } else { 2597 } else {
2693 Data = 0xff; 2598 Data = 0xff;
2694 status = 0;
2695 status = mos7840_set_reg_sync(serial->port[i], 2599 status = mos7840_set_reg_sync(serial->port[i],
2696 (__u16) (ZLP_REG1 + 2600 (__u16) (ZLP_REG1 +
2697 ((__u16) 2601 ((__u16)mos7840_port->port_num) - 0x1), Data);
2698 mos7840_port->
2699 port_num) -
2700 0x1), Data);
2701 dbg("ZLIP offset%x\n", 2602 dbg("ZLIP offset%x\n",
2702 (__u16) (ZLP_REG1 + 2603 (__u16) (ZLP_REG1 +
2703 ((__u16) mos7840_port->port_num) - 0x1)); 2604 ((__u16) mos7840_port->port_num) - 0x1));
@@ -2712,14 +2613,16 @@ static int mos7840_startup(struct usb_serial *serial)
2712 } 2613 }
2713 mos7840_port->control_urb = usb_alloc_urb(0, GFP_KERNEL); 2614 mos7840_port->control_urb = usb_alloc_urb(0, GFP_KERNEL);
2714 mos7840_port->ctrl_buf = kmalloc(16, GFP_KERNEL); 2615 mos7840_port->ctrl_buf = kmalloc(16, GFP_KERNEL);
2715 mos7840_port->dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); 2616 mos7840_port->dr = kmalloc(sizeof(struct usb_ctrlrequest),
2716 if (!mos7840_port->control_urb || !mos7840_port->ctrl_buf || !mos7840_port->dr) { 2617 GFP_KERNEL);
2618 if (!mos7840_port->control_urb || !mos7840_port->ctrl_buf ||
2619 !mos7840_port->dr) {
2717 status = -ENOMEM; 2620 status = -ENOMEM;
2718 goto error; 2621 goto error;
2719 } 2622 }
2720 } 2623 }
2721 2624
2722 //Zero Length flag enable 2625 /* Zero Length flag enable */
2723 Data = 0x0f; 2626 Data = 0x0f;
2724 status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, Data); 2627 status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, Data);
2725 if (status < 0) { 2628 if (status < 0) {
@@ -2762,7 +2665,7 @@ static void mos7840_shutdown(struct usb_serial *serial)
2762 return; 2665 return;
2763 } 2666 }
2764 2667
2765 /* check for the ports to be closed,close the ports and disconnect */ 2668 /* check for the ports to be closed,close the ports and disconnect */
2766 2669
2767 /* free private structure allocated for serial port * 2670 /* free private structure allocated for serial port *
2768 * stop reads and writes on all ports */ 2671 * stop reads and writes on all ports */
@@ -2843,20 +2746,12 @@ static int __init moschip7840_init(void)
2843 2746
2844 /* Register with the usb */ 2747 /* Register with the usb */
2845 retval = usb_register(&io_driver); 2748 retval = usb_register(&io_driver);
2846
2847 if (retval)
2848 goto failed_usb_register;
2849
2850 if (retval == 0) { 2749 if (retval == 0) {
2851 dbg("%s\n", "Leaving..."); 2750 dbg("%s\n", "Leaving...");
2852 return 0; 2751 return 0;
2853 } 2752 }
2854
2855 failed_usb_register:
2856 usb_serial_deregister(&moschip7840_4port_device); 2753 usb_serial_deregister(&moschip7840_4port_device);
2857 2754failed_port_device_register:
2858 failed_port_device_register:
2859
2860 return retval; 2755 return retval;
2861} 2756}
2862 2757
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c
index 43c8894353bf..d6736531a0fa 100644
--- a/drivers/usb/serial/navman.c
+++ b/drivers/usb/serial/navman.c
@@ -64,7 +64,7 @@ static void navman_read_int_callback(struct urb *urb)
64 usb_serial_debug_data(debug, &port->dev, __func__, 64 usb_serial_debug_data(debug, &port->dev, __func__,
65 urb->actual_length, data); 65 urb->actual_length, data);
66 66
67 tty = port->tty; 67 tty = port->port.tty;
68 if (tty && urb->actual_length) { 68 if (tty && urb->actual_length) {
69 tty_buffer_request_room(tty, urb->actual_length); 69 tty_buffer_request_room(tty, urb->actual_length);
70 tty_insert_flip_string(tty, data, urb->actual_length); 70 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -79,7 +79,8 @@ exit:
79 __func__, result); 79 __func__, result);
80} 80}
81 81
82static int navman_open(struct usb_serial_port *port, struct file *filp) 82static int navman_open(struct tty_struct *tty,
83 struct usb_serial_port *port, struct file *filp)
83{ 84{
84 int result = 0; 85 int result = 0;
85 86
@@ -96,14 +97,15 @@ static int navman_open(struct usb_serial_port *port, struct file *filp)
96 return result; 97 return result;
97} 98}
98 99
99static void navman_close(struct usb_serial_port *port, struct file *filp) 100static void navman_close(struct tty_struct *tty,
101 struct usb_serial_port *port, struct file *filp)
100{ 102{
101 dbg("%s - port %d", __func__, port->number); 103 dbg("%s - port %d", __func__, port->number);
102 104
103 usb_kill_urb(port->interrupt_in_urb); 105 usb_kill_urb(port->interrupt_in_urb);
104} 106}
105 107
106static int navman_write(struct usb_serial_port *port, 108static int navman_write(struct tty_struct *tty, struct usb_serial_port *port,
107 const unsigned char *buf, int count) 109 const unsigned char *buf, int count)
108{ 110{
109 dbg("%s - port %d", __func__, port->number); 111 dbg("%s - port %d", __func__, port->number);
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
index 7b7422f49478..ae8e227f3db2 100644
--- a/drivers/usb/serial/omninet.c
+++ b/drivers/usb/serial/omninet.c
@@ -5,26 +5,28 @@
5 * modify it under the terms of the GNU General Public License version 5 * modify it under the terms of the GNU General Public License version
6 * 2 as published by the Free Software Foundation. 6 * 2 as published by the Free Software Foundation.
7 * 7 *
8 * See Documentation/usb/usb-serial.txt for more information on using this driver 8 * See Documentation/usb/usb-serial.txt for more information on using this
9 * driver
9 * 10 *
10 * Please report both successes and troubles to the author at omninet@kroah.com 11 * Please report both successes and troubles to the author at omninet@kroah.com
11 * 12 *
12 * (05/30/2001) gkh 13 * (05/30/2001) gkh
13 * switched from using spinlock to a semaphore, which fixes lots of problems. 14 * switched from using spinlock to a semaphore, which fixes lots of
15 * problems.
14 * 16 *
15 * (04/08/2001) gb 17 * (04/08/2001) gb
16 * Identify version on module load. 18 * Identify version on module load.
17 * 19 *
18 * (11/01/2000) Adam J. Richter 20 * (11/01/2000) Adam J. Richter
19 * usb_device_id table support 21 * usb_device_id table support
20 * 22 *
21 * (10/05/2000) gkh 23 * (10/05/2000) gkh
22 * Fixed bug with urb->dev not being set properly, now that the usb 24 * Fixed bug with urb->dev not being set properly, now that the usb
23 * core needs it. 25 * core needs it.
24 * 26 *
25 * (08/28/2000) gkh 27 * (08/28/2000) gkh
26 * Added locks for SMP safeness. 28 * Added locks for SMP safeness.
27 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more 29 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
28 * than once. 30 * than once.
29 * Fixed potential race in omninet_write_bulk_callback 31 * Fixed potential race in omninet_write_bulk_callback
30 * 32 *
@@ -43,7 +45,7 @@
43#include <linux/tty_flip.h> 45#include <linux/tty_flip.h>
44#include <linux/module.h> 46#include <linux/module.h>
45#include <linux/spinlock.h> 47#include <linux/spinlock.h>
46#include <asm/uaccess.h> 48#include <linux/uaccess.h>
47#include <linux/usb.h> 49#include <linux/usb.h>
48#include <linux/usb/serial.h> 50#include <linux/usb/serial.h>
49 51
@@ -58,25 +60,29 @@ static int debug;
58 60
59#define ZYXEL_VENDOR_ID 0x0586 61#define ZYXEL_VENDOR_ID 0x0586
60#define ZYXEL_OMNINET_ID 0x1000 62#define ZYXEL_OMNINET_ID 0x1000
61#define BT_IGNITIONPRO_ID 0x2000 /* This one seems to be a re-branded ZyXEL device */ 63/* This one seems to be a re-branded ZyXEL device */
64#define BT_IGNITIONPRO_ID 0x2000
62 65
63/* function prototypes */ 66/* function prototypes */
64static int omninet_open (struct usb_serial_port *port, struct file *filp); 67static int omninet_open(struct tty_struct *tty, struct usb_serial_port *port,
65static void omninet_close (struct usb_serial_port *port, struct file *filp); 68 struct file *filp);
66static void omninet_read_bulk_callback (struct urb *urb); 69static void omninet_close(struct tty_struct *tty, struct usb_serial_port *port,
67static void omninet_write_bulk_callback (struct urb *urb); 70 struct file *filp);
68static int omninet_write (struct usb_serial_port *port, const unsigned char *buf, int count); 71static void omninet_read_bulk_callback(struct urb *urb);
69static int omninet_write_room (struct usb_serial_port *port); 72static void omninet_write_bulk_callback(struct urb *urb);
70static void omninet_shutdown (struct usb_serial *serial); 73static int omninet_write(struct tty_struct *tty, struct usb_serial_port *port,
71static int omninet_attach (struct usb_serial *serial); 74 const unsigned char *buf, int count);
72 75static int omninet_write_room(struct tty_struct *tty);
73static struct usb_device_id id_table [] = { 76static void omninet_shutdown(struct usb_serial *serial);
77static int omninet_attach(struct usb_serial *serial);
78
79static struct usb_device_id id_table[] = {
74 { USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNINET_ID) }, 80 { USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNINET_ID) },
75 { USB_DEVICE(ZYXEL_VENDOR_ID, BT_IGNITIONPRO_ID) }, 81 { USB_DEVICE(ZYXEL_VENDOR_ID, BT_IGNITIONPRO_ID) },
76 { } /* Terminating entry */ 82 { } /* Terminating entry */
77}; 83};
78 84
79MODULE_DEVICE_TABLE (usb, id_table); 85MODULE_DEVICE_TABLE(usb, id_table);
80 86
81static struct usb_driver omninet_driver = { 87static struct usb_driver omninet_driver = {
82 .name = "omninet", 88 .name = "omninet",
@@ -130,34 +136,34 @@ static struct usb_serial_driver zyxel_omninet_device = {
130 * 136 *
131 */ 137 */
132 138
133struct omninet_header 139struct omninet_header {
134{
135 __u8 oh_seq; 140 __u8 oh_seq;
136 __u8 oh_len; 141 __u8 oh_len;
137 __u8 oh_xxx; 142 __u8 oh_xxx;
138 __u8 oh_pad; 143 __u8 oh_pad;
139}; 144};
140 145
141struct omninet_data 146struct omninet_data {
142{ 147 __u8 od_outseq; /* Sequence number for bulk_out URBs */
143 __u8 od_outseq; // Sequence number for bulk_out URBs
144}; 148};
145 149
146static int omninet_attach (struct usb_serial *serial) 150static int omninet_attach(struct usb_serial *serial)
147{ 151{
148 struct omninet_data *od; 152 struct omninet_data *od;
149 struct usb_serial_port *port = serial->port[0]; 153 struct usb_serial_port *port = serial->port[0];
150 154
151 od = kmalloc( sizeof(struct omninet_data), GFP_KERNEL ); 155 od = kmalloc(sizeof(struct omninet_data), GFP_KERNEL);
152 if( !od ) { 156 if (!od) {
153 err("%s- kmalloc(%Zd) failed.", __func__, sizeof(struct omninet_data)); 157 err("%s- kmalloc(%Zd) failed.",
158 __func__, sizeof(struct omninet_data));
154 return -ENOMEM; 159 return -ENOMEM;
155 } 160 }
156 usb_set_serial_port_data(port, od); 161 usb_set_serial_port_data(port, od);
157 return 0; 162 return 0;
158} 163}
159 164
160static int omninet_open (struct usb_serial_port *port, struct file *filp) 165static int omninet_open(struct tty_struct *tty,
166 struct usb_serial_port *port, struct file *filp)
161{ 167{
162 struct usb_serial *serial = port->serial; 168 struct usb_serial *serial = port->serial;
163 struct usb_serial_port *wport; 169 struct usb_serial_port *wport;
@@ -166,22 +172,24 @@ static int omninet_open (struct usb_serial_port *port, struct file *filp)
166 dbg("%s - port %d", __func__, port->number); 172 dbg("%s - port %d", __func__, port->number);
167 173
168 wport = serial->port[1]; 174 wport = serial->port[1];
169 wport->tty = port->tty; 175 wport->port.tty = tty; /* FIXME */
170 176
171 /* Start reading from the device */ 177 /* Start reading from the device */
172 usb_fill_bulk_urb(port->read_urb, serial->dev, 178 usb_fill_bulk_urb(port->read_urb, serial->dev,
173 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), 179 usb_rcvbulkpipe(serial->dev,
174 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, 180 port->bulk_in_endpointAddress),
175 omninet_read_bulk_callback, port); 181 port->read_urb->transfer_buffer,
182 port->read_urb->transfer_buffer_length,
183 omninet_read_bulk_callback, port);
176 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 184 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
177 if (result) { 185 if (result)
178 err("%s - failed submitting read urb, error %d", __func__, result); 186 err("%s - failed submitting read urb, error %d",
179 } 187 __func__, result);
180
181 return result; 188 return result;
182} 189}
183 190
184static void omninet_close (struct usb_serial_port *port, struct file * filp) 191static void omninet_close(struct tty_struct *tty,
192 struct usb_serial_port *port, struct file *filp)
185{ 193{
186 dbg("%s - port %d", __func__, port->number); 194 dbg("%s - port %d", __func__, port->number);
187 usb_kill_urb(port->read_urb); 195 usb_kill_urb(port->read_urb);
@@ -192,14 +200,14 @@ static void omninet_close (struct usb_serial_port *port, struct file * filp)
192#define OMNINET_HEADERLEN sizeof(struct omninet_header) 200#define OMNINET_HEADERLEN sizeof(struct omninet_header)
193#define OMNINET_BULKOUTSIZE (64 - OMNINET_HEADERLEN) 201#define OMNINET_BULKOUTSIZE (64 - OMNINET_HEADERLEN)
194 202
195static void omninet_read_bulk_callback (struct urb *urb) 203static void omninet_read_bulk_callback(struct urb *urb)
196{ 204{
197 struct usb_serial_port *port = urb->context; 205 struct usb_serial_port *port = urb->context;
198 unsigned char *data = urb->transfer_buffer; 206 unsigned char *data = urb->transfer_buffer;
199 struct omninet_header *header = (struct omninet_header *) &data[0]; 207 struct omninet_header *header = (struct omninet_header *) &data[0];
200 int status = urb->status; 208 int status = urb->status;
201 int i;
202 int result; 209 int result;
210 int i;
203 211
204 dbg("%s - port %d", __func__, port->number); 212 dbg("%s - port %d", __func__, port->number);
205 213
@@ -209,42 +217,46 @@ static void omninet_read_bulk_callback (struct urb *urb)
209 return; 217 return;
210 } 218 }
211 219
212 if ((debug) && (header->oh_xxx != 0x30)) { 220 if (debug && header->oh_xxx != 0x30) {
213 if (urb->actual_length) { 221 if (urb->actual_length) {
214 printk (KERN_DEBUG __FILE__ ": omninet_read %d: ", header->oh_len); 222 printk(KERN_DEBUG __FILE__
215 for (i = 0; i < (header->oh_len + OMNINET_HEADERLEN); i++) { 223 ": omninet_read %d: ", header->oh_len);
216 printk ("%.2x ", data[i]); 224 for (i = 0; i < (header->oh_len +
217 } 225 OMNINET_HEADERLEN); i++)
218 printk ("\n"); 226 printk("%.2x ", data[i]);
227 printk("\n");
219 } 228 }
220 } 229 }
221 230
222 if (urb->actual_length && header->oh_len) { 231 if (urb->actual_length && header->oh_len) {
223 for (i = 0; i < header->oh_len; i++) { 232 tty_insert_flip_string(port->port.tty,
224 tty_insert_flip_char(port->tty, data[OMNINET_DATAOFFSET + i], 0); 233 data + OMNINET_DATAOFFSET, header->oh_len);
225 } 234 tty_flip_buffer_push(port->port.tty);
226 tty_flip_buffer_push(port->tty);
227 } 235 }
228 236
229 /* Continue trying to always read */ 237 /* Continue trying to always read */
230 usb_fill_bulk_urb(urb, port->serial->dev, 238 usb_fill_bulk_urb(urb, port->serial->dev,
231 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress), 239 usb_rcvbulkpipe(port->serial->dev,
232 urb->transfer_buffer, urb->transfer_buffer_length, 240 port->bulk_in_endpointAddress),
233 omninet_read_bulk_callback, port); 241 urb->transfer_buffer, urb->transfer_buffer_length,
242 omninet_read_bulk_callback, port);
234 result = usb_submit_urb(urb, GFP_ATOMIC); 243 result = usb_submit_urb(urb, GFP_ATOMIC);
235 if (result) 244 if (result)
236 err("%s - failed resubmitting read urb, error %d", __func__, result); 245 err("%s - failed resubmitting read urb, error %d",
246 __func__, result);
237 247
238 return; 248 return;
239} 249}
240 250
241static int omninet_write (struct usb_serial_port *port, const unsigned char *buf, int count) 251static int omninet_write(struct tty_struct *tty, struct usb_serial_port *port,
252 const unsigned char *buf, int count)
242{ 253{
243 struct usb_serial *serial = port->serial; 254 struct usb_serial *serial = port->serial;
244 struct usb_serial_port *wport = serial->port[1]; 255 struct usb_serial_port *wport = serial->port[1];
245 256
246 struct omninet_data *od = usb_get_serial_port_data(port); 257 struct omninet_data *od = usb_get_serial_port_data(port);
247 struct omninet_header *header = (struct omninet_header *) wport->write_urb->transfer_buffer; 258 struct omninet_header *header = (struct omninet_header *)
259 wport->write_urb->transfer_buffer;
248 260
249 int result; 261 int result;
250 262
@@ -252,7 +264,7 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf
252 264
253 if (count == 0) { 265 if (count == 0) {
254 dbg("%s - write request of 0 bytes", __func__); 266 dbg("%s - write request of 0 bytes", __func__);
255 return (0); 267 return 0;
256 } 268 }
257 269
258 spin_lock_bh(&wport->lock); 270 spin_lock_bh(&wport->lock);
@@ -266,9 +278,11 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf
266 278
267 count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count; 279 count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count;
268 280
269 memcpy (wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, buf, count); 281 memcpy(wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET,
282 buf, count);
270 283
271 usb_serial_debug_data(debug, &port->dev, __func__, count, wport->write_urb->transfer_buffer); 284 usb_serial_debug_data(debug, &port->dev, __func__, count,
285 wport->write_urb->transfer_buffer);
272 286
273 header->oh_seq = od->od_outseq++; 287 header->oh_seq = od->od_outseq++;
274 header->oh_len = count; 288 header->oh_len = count;
@@ -282,7 +296,8 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf
282 result = usb_submit_urb(wport->write_urb, GFP_ATOMIC); 296 result = usb_submit_urb(wport->write_urb, GFP_ATOMIC);
283 if (result) { 297 if (result) {
284 wport->write_urb_busy = 0; 298 wport->write_urb_busy = 0;
285 err("%s - failed submitting write urb, error %d", __func__, result); 299 err("%s - failed submitting write urb, error %d",
300 __func__, result);
286 } else 301 } else
287 result = count; 302 result = count;
288 303
@@ -290,8 +305,9 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf
290} 305}
291 306
292 307
293static int omninet_write_room (struct usb_serial_port *port) 308static int omninet_write_room(struct tty_struct *tty)
294{ 309{
310 struct usb_serial_port *port = tty->driver_data;
295 struct usb_serial *serial = port->serial; 311 struct usb_serial *serial = port->serial;
296 struct usb_serial_port *wport = serial->port[1]; 312 struct usb_serial_port *wport = serial->port[1];
297 313
@@ -303,12 +319,13 @@ static int omninet_write_room (struct usb_serial_port *port)
303 319
304 dbg("%s - returns %d", __func__, room); 320 dbg("%s - returns %d", __func__, room);
305 321
306 return (room); 322 return room;
307} 323}
308 324
309static void omninet_write_bulk_callback (struct urb *urb) 325static void omninet_write_bulk_callback(struct urb *urb)
310{ 326{
311/* struct omninet_header *header = (struct omninet_header *) urb->transfer_buffer; */ 327/* struct omninet_header *header = (struct omninet_header *)
328 urb->transfer_buffer; */
312 struct usb_serial_port *port = urb->context; 329 struct usb_serial_port *port = urb->context;
313 int status = urb->status; 330 int status = urb->status;
314 331
@@ -325,18 +342,18 @@ static void omninet_write_bulk_callback (struct urb *urb)
325} 342}
326 343
327 344
328static void omninet_shutdown (struct usb_serial *serial) 345static void omninet_shutdown(struct usb_serial *serial)
329{ 346{
330 struct usb_serial_port *wport = serial->port[1]; 347 struct usb_serial_port *wport = serial->port[1];
331 struct usb_serial_port *port = serial->port[0]; 348 struct usb_serial_port *port = serial->port[0];
332 dbg ("%s", __func__); 349 dbg("%s", __func__);
333 350
334 usb_kill_urb(wport->write_urb); 351 usb_kill_urb(wport->write_urb);
335 kfree(usb_get_serial_port_data(port)); 352 kfree(usb_get_serial_port_data(port));
336} 353}
337 354
338 355
339static int __init omninet_init (void) 356static int __init omninet_init(void)
340{ 357{
341 int retval; 358 int retval;
342 retval = usb_serial_register(&zyxel_omninet_device); 359 retval = usb_serial_register(&zyxel_omninet_device);
@@ -354,18 +371,18 @@ failed_usb_serial_register:
354} 371}
355 372
356 373
357static void __exit omninet_exit (void) 374static void __exit omninet_exit(void)
358{ 375{
359 usb_deregister (&omninet_driver); 376 usb_deregister(&omninet_driver);
360 usb_serial_deregister (&zyxel_omninet_device); 377 usb_serial_deregister(&zyxel_omninet_device);
361} 378}
362 379
363 380
364module_init(omninet_init); 381module_init(omninet_init);
365module_exit(omninet_exit); 382module_exit(omninet_exit);
366 383
367MODULE_AUTHOR( DRIVER_AUTHOR ); 384MODULE_AUTHOR(DRIVER_AUTHOR);
368MODULE_DESCRIPTION( DRIVER_DESC ); 385MODULE_DESCRIPTION(DRIVER_DESC);
369MODULE_LICENSE("GPL"); 386MODULE_LICENSE("GPL");
370 387
371module_param(debug, bool, S_IRUGO | S_IWUSR); 388module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index a73420dd052a..e4eca95f2b0f 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -43,29 +43,25 @@
43#include <linux/usb/serial.h> 43#include <linux/usb/serial.h>
44 44
45/* Function prototypes */ 45/* Function prototypes */
46static int option_open(struct usb_serial_port *port, struct file *filp); 46static int option_open(struct tty_struct *tty, struct usb_serial_port *port,
47static void option_close(struct usb_serial_port *port, struct file *filp); 47 struct file *filp);
48static void option_close(struct tty_struct *tty, struct usb_serial_port *port,
49 struct file *filp);
48static int option_startup(struct usb_serial *serial); 50static int option_startup(struct usb_serial *serial);
49static void option_shutdown(struct usb_serial *serial); 51static void option_shutdown(struct usb_serial *serial);
50static void option_rx_throttle(struct usb_serial_port *port); 52static int option_write_room(struct tty_struct *tty);
51static void option_rx_unthrottle(struct usb_serial_port *port);
52static int option_write_room(struct usb_serial_port *port);
53 53
54static void option_instat_callback(struct urb *urb); 54static void option_instat_callback(struct urb *urb);
55 55
56static int option_write(struct usb_serial_port *port, 56static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
57 const unsigned char *buf, int count); 57 const unsigned char *buf, int count);
58 58static int option_chars_in_buffer(struct tty_struct *tty);
59static int option_chars_in_buffer(struct usb_serial_port *port); 59static void option_set_termios(struct tty_struct *tty,
60static int option_ioctl(struct usb_serial_port *port, struct file *file, 60 struct usb_serial_port *port, struct ktermios *old);
61 unsigned int cmd, unsigned long arg); 61static int option_tiocmget(struct tty_struct *tty, struct file *file);
62static void option_set_termios(struct usb_serial_port *port, 62static int option_tiocmset(struct tty_struct *tty, struct file *file,
63 struct ktermios *old);
64static void option_break_ctl(struct usb_serial_port *port, int break_state);
65static int option_tiocmget(struct usb_serial_port *port, struct file *file);
66static int option_tiocmset(struct usb_serial_port *port, struct file *file,
67 unsigned int set, unsigned int clear); 63 unsigned int set, unsigned int clear);
68static int option_send_setup(struct usb_serial_port *port); 64static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *port);
69 65
70/* Vendor and product IDs */ 66/* Vendor and product IDs */
71#define OPTION_VENDOR_ID 0x0AF0 67#define OPTION_VENDOR_ID 0x0AF0
@@ -173,6 +169,7 @@ static int option_send_setup(struct usb_serial_port *port);
173#define DELL_VENDOR_ID 0x413C 169#define DELL_VENDOR_ID 0x413C
174 170
175#define KYOCERA_VENDOR_ID 0x0c88 171#define KYOCERA_VENDOR_ID 0x0c88
172#define KYOCERA_PRODUCT_KPC650 0x17da
176#define KYOCERA_PRODUCT_KPC680 0x180a 173#define KYOCERA_PRODUCT_KPC680 0x180a
177 174
178#define ANYDATA_VENDOR_ID 0x16d5 175#define ANYDATA_VENDOR_ID 0x16d5
@@ -305,6 +302,7 @@ static struct usb_device_id option_ids[] = {
305 { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, 302 { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
306 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, 303 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
307 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, 304 { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
305 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
308 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, 306 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
309 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ 307 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
310 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ 308 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
@@ -340,11 +338,7 @@ static struct usb_serial_driver option_1port_device = {
340 .write = option_write, 338 .write = option_write,
341 .write_room = option_write_room, 339 .write_room = option_write_room,
342 .chars_in_buffer = option_chars_in_buffer, 340 .chars_in_buffer = option_chars_in_buffer,
343 .throttle = option_rx_throttle,
344 .unthrottle = option_rx_unthrottle,
345 .ioctl = option_ioctl,
346 .set_termios = option_set_termios, 341 .set_termios = option_set_termios,
347 .break_ctl = option_break_ctl,
348 .tiocmget = option_tiocmget, 342 .tiocmget = option_tiocmget,
349 .tiocmset = option_tiocmset, 343 .tiocmset = option_tiocmset,
350 .attach = option_startup, 344 .attach = option_startup,
@@ -401,47 +395,32 @@ static int __init option_init(void)
401 return 0; 395 return 0;
402 396
403failed_driver_register: 397failed_driver_register:
404 usb_serial_deregister (&option_1port_device); 398 usb_serial_deregister(&option_1port_device);
405failed_1port_device_register: 399failed_1port_device_register:
406 return retval; 400 return retval;
407} 401}
408 402
409static void __exit option_exit(void) 403static void __exit option_exit(void)
410{ 404{
411 usb_deregister (&option_driver); 405 usb_deregister(&option_driver);
412 usb_serial_deregister (&option_1port_device); 406 usb_serial_deregister(&option_1port_device);
413} 407}
414 408
415module_init(option_init); 409module_init(option_init);
416module_exit(option_exit); 410module_exit(option_exit);
417 411
418static void option_rx_throttle(struct usb_serial_port *port) 412static void option_set_termios(struct tty_struct *tty,
419{ 413 struct usb_serial_port *port, struct ktermios *old_termios)
420 dbg("%s", __func__);
421}
422
423static void option_rx_unthrottle(struct usb_serial_port *port)
424{
425 dbg("%s", __func__);
426}
427
428static void option_break_ctl(struct usb_serial_port *port, int break_state)
429{
430 /* Unfortunately, I don't know how to send a break */
431 dbg("%s", __func__);
432}
433
434static void option_set_termios(struct usb_serial_port *port,
435 struct ktermios *old_termios)
436{ 414{
437 dbg("%s", __func__); 415 dbg("%s", __func__);
438 /* Doesn't support option setting */ 416 /* Doesn't support option setting */
439 tty_termios_copy_hw(port->tty->termios, old_termios); 417 tty_termios_copy_hw(tty->termios, old_termios);
440 option_send_setup(port); 418 option_send_setup(tty, port);
441} 419}
442 420
443static int option_tiocmget(struct usb_serial_port *port, struct file *file) 421static int option_tiocmget(struct tty_struct *tty, struct file *file)
444{ 422{
423 struct usb_serial_port *port = tty->driver_data;
445 unsigned int value; 424 unsigned int value;
446 struct option_port_private *portdata; 425 struct option_port_private *portdata;
447 426
@@ -457,9 +436,10 @@ static int option_tiocmget(struct usb_serial_port *port, struct file *file)
457 return value; 436 return value;
458} 437}
459 438
460static int option_tiocmset(struct usb_serial_port *port, struct file *file, 439static int option_tiocmset(struct tty_struct *tty, struct file *file,
461 unsigned int set, unsigned int clear) 440 unsigned int set, unsigned int clear)
462{ 441{
442 struct usb_serial_port *port = tty->driver_data;
463 struct option_port_private *portdata; 443 struct option_port_private *portdata;
464 444
465 portdata = usb_get_serial_port_data(port); 445 portdata = usb_get_serial_port_data(port);
@@ -474,17 +454,11 @@ static int option_tiocmset(struct usb_serial_port *port, struct file *file,
474 portdata->rts_state = 0; 454 portdata->rts_state = 0;
475 if (clear & TIOCM_DTR) 455 if (clear & TIOCM_DTR)
476 portdata->dtr_state = 0; 456 portdata->dtr_state = 0;
477 return option_send_setup(port); 457 return option_send_setup(tty, port);
478}
479
480static int option_ioctl(struct usb_serial_port *port, struct file *file,
481 unsigned int cmd, unsigned long arg)
482{
483 return -ENOIOCTLCMD;
484} 458}
485 459
486/* Write */ 460/* Write */
487static int option_write(struct usb_serial_port *port, 461static int option_write(struct tty_struct *tty, struct usb_serial_port *port,
488 const unsigned char *buf, int count) 462 const unsigned char *buf, int count)
489{ 463{
490 struct option_port_private *portdata; 464 struct option_port_private *portdata;
@@ -499,7 +473,7 @@ static int option_write(struct usb_serial_port *port,
499 473
500 i = 0; 474 i = 0;
501 left = count; 475 left = count;
502 for (i=0; left > 0 && i < N_OUT_URB; i++) { 476 for (i = 0; left > 0 && i < N_OUT_URB; i++) {
503 todo = left; 477 todo = left;
504 if (todo > OUT_BUFLEN) 478 if (todo > OUT_BUFLEN)
505 todo = OUT_BUFLEN; 479 todo = OUT_BUFLEN;
@@ -520,7 +494,7 @@ static int option_write(struct usb_serial_port *port,
520 usb_pipeendpoint(this_urb->pipe), i); 494 usb_pipeendpoint(this_urb->pipe), i);
521 495
522 /* send the data */ 496 /* send the data */
523 memcpy (this_urb->transfer_buffer, buf, todo); 497 memcpy(this_urb->transfer_buffer, buf, todo);
524 this_urb->transfer_buffer_length = todo; 498 this_urb->transfer_buffer_length = todo;
525 499
526 this_urb->dev = port->serial->dev; 500 this_urb->dev = port->serial->dev;
@@ -560,7 +534,7 @@ static void option_indat_callback(struct urb *urb)
560 dbg("%s: nonzero status: %d on endpoint %02x.", 534 dbg("%s: nonzero status: %d on endpoint %02x.",
561 __func__, status, endpoint); 535 __func__, status, endpoint);
562 } else { 536 } else {
563 tty = port->tty; 537 tty = port->port.tty;
564 if (urb->actual_length) { 538 if (urb->actual_length) {
565 tty_buffer_request_room(tty, urb->actual_length); 539 tty_buffer_request_room(tty, urb->actual_length);
566 tty_insert_flip_string(tty, data, urb->actual_length); 540 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -570,7 +544,7 @@ static void option_indat_callback(struct urb *urb)
570 } 544 }
571 545
572 /* Resubmit urb so we continue receiving */ 546 /* Resubmit urb so we continue receiving */
573 if (port->open_count && status != -ESHUTDOWN) { 547 if (port->port.count && status != -ESHUTDOWN) {
574 err = usb_submit_urb(urb, GFP_ATOMIC); 548 err = usb_submit_urb(urb, GFP_ATOMIC);
575 if (err) 549 if (err)
576 printk(KERN_ERR "%s: resubmit read urb failed. " 550 printk(KERN_ERR "%s: resubmit read urb failed. "
@@ -611,7 +585,7 @@ static void option_instat_callback(struct urb *urb)
611 struct usb_serial *serial = port->serial; 585 struct usb_serial *serial = port->serial;
612 586
613 dbg("%s", __func__); 587 dbg("%s", __func__);
614 dbg("%s: urb %p port %p has data %p", __func__,urb,port,portdata); 588 dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
615 589
616 if (status == 0) { 590 if (status == 0) {
617 struct usb_ctrlrequest *req_pkt = 591 struct usb_ctrlrequest *req_pkt =
@@ -636,12 +610,12 @@ static void option_instat_callback(struct urb *urb)
636 portdata->dsr_state = ((signals & 0x02) ? 1 : 0); 610 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
637 portdata->ri_state = ((signals & 0x08) ? 1 : 0); 611 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
638 612
639 if (port->tty && !C_CLOCAL(port->tty) && 613 if (port->port.tty && !C_CLOCAL(port->port.tty) &&
640 old_dcd_state && !portdata->dcd_state) 614 old_dcd_state && !portdata->dcd_state)
641 tty_hangup(port->tty); 615 tty_hangup(port->port.tty);
642 } else { 616 } else {
643 dbg("%s: type %x req %x", __func__, 617 dbg("%s: type %x req %x", __func__,
644 req_pkt->bRequestType,req_pkt->bRequest); 618 req_pkt->bRequestType, req_pkt->bRequest);
645 } 619 }
646 } else 620 } else
647 dbg("%s: error %d", __func__, status); 621 dbg("%s: error %d", __func__, status);
@@ -656,8 +630,9 @@ static void option_instat_callback(struct urb *urb)
656 } 630 }
657} 631}
658 632
659static int option_write_room(struct usb_serial_port *port) 633static int option_write_room(struct tty_struct *tty)
660{ 634{
635 struct usb_serial_port *port = tty->driver_data;
661 struct option_port_private *portdata; 636 struct option_port_private *portdata;
662 int i; 637 int i;
663 int data_len = 0; 638 int data_len = 0;
@@ -666,7 +641,7 @@ static int option_write_room(struct usb_serial_port *port)
666 portdata = usb_get_serial_port_data(port); 641 portdata = usb_get_serial_port_data(port);
667 642
668 643
669 for (i=0; i < N_OUT_URB; i++) { 644 for (i = 0; i < N_OUT_URB; i++) {
670 this_urb = portdata->out_urbs[i]; 645 this_urb = portdata->out_urbs[i];
671 if (this_urb && !test_bit(i, &portdata->out_busy)) 646 if (this_urb && !test_bit(i, &portdata->out_busy))
672 data_len += OUT_BUFLEN; 647 data_len += OUT_BUFLEN;
@@ -676,8 +651,9 @@ static int option_write_room(struct usb_serial_port *port)
676 return data_len; 651 return data_len;
677} 652}
678 653
679static int option_chars_in_buffer(struct usb_serial_port *port) 654static int option_chars_in_buffer(struct tty_struct *tty)
680{ 655{
656 struct usb_serial_port *port = tty->driver_data;
681 struct option_port_private *portdata; 657 struct option_port_private *portdata;
682 int i; 658 int i;
683 int data_len = 0; 659 int data_len = 0;
@@ -685,7 +661,7 @@ static int option_chars_in_buffer(struct usb_serial_port *port)
685 661
686 portdata = usb_get_serial_port_data(port); 662 portdata = usb_get_serial_port_data(port);
687 663
688 for (i=0; i < N_OUT_URB; i++) { 664 for (i = 0; i < N_OUT_URB; i++) {
689 this_urb = portdata->out_urbs[i]; 665 this_urb = portdata->out_urbs[i];
690 /* FIXME: This locking is insufficient as this_urb may 666 /* FIXME: This locking is insufficient as this_urb may
691 go unused during the test */ 667 go unused during the test */
@@ -696,7 +672,8 @@ static int option_chars_in_buffer(struct usb_serial_port *port)
696 return data_len; 672 return data_len;
697} 673}
698 674
699static int option_open(struct usb_serial_port *port, struct file *filp) 675static int option_open(struct tty_struct *tty,
676 struct usb_serial_port *port, struct file *filp)
700{ 677{
701 struct option_port_private *portdata; 678 struct option_port_private *portdata;
702 struct usb_serial *serial = port->serial; 679 struct usb_serial *serial = port->serial;
@@ -714,7 +691,7 @@ static int option_open(struct usb_serial_port *port, struct file *filp)
714 /* Reset low level data toggle and start reading from endpoints */ 691 /* Reset low level data toggle and start reading from endpoints */
715 for (i = 0; i < N_IN_URB; i++) { 692 for (i = 0; i < N_IN_URB; i++) {
716 urb = portdata->in_urbs[i]; 693 urb = portdata->in_urbs[i];
717 if (! urb) 694 if (!urb)
718 continue; 695 continue;
719 if (urb->dev != serial->dev) { 696 if (urb->dev != serial->dev) {
720 dbg("%s: dev %p != %p", __func__, 697 dbg("%s: dev %p != %p", __func__,
@@ -739,21 +716,23 @@ static int option_open(struct usb_serial_port *port, struct file *filp)
739 /* Reset low level data toggle on out endpoints */ 716 /* Reset low level data toggle on out endpoints */
740 for (i = 0; i < N_OUT_URB; i++) { 717 for (i = 0; i < N_OUT_URB; i++) {
741 urb = portdata->out_urbs[i]; 718 urb = portdata->out_urbs[i];
742 if (! urb) 719 if (!urb)
743 continue; 720 continue;
744 urb->dev = serial->dev; 721 urb->dev = serial->dev;
745 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), 722 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
746 usb_pipeout(urb->pipe), 0); */ 723 usb_pipeout(urb->pipe), 0); */
747 } 724 }
748 725
749 port->tty->low_latency = 1; 726 if (tty)
727 tty->low_latency = 1;
750 728
751 option_send_setup(port); 729 option_send_setup(tty, port);
752 730
753 return (0); 731 return 0;
754} 732}
755 733
756static void option_close(struct usb_serial_port *port, struct file *filp) 734static void option_close(struct tty_struct *tty,
735 struct usb_serial_port *port, struct file *filp)
757{ 736{
758 int i; 737 int i;
759 struct usb_serial *serial = port->serial; 738 struct usb_serial *serial = port->serial;
@@ -768,7 +747,7 @@ static void option_close(struct usb_serial_port *port, struct file *filp)
768 if (serial->dev) { 747 if (serial->dev) {
769 mutex_lock(&serial->disc_mutex); 748 mutex_lock(&serial->disc_mutex);
770 if (!serial->disconnected) 749 if (!serial->disconnected)
771 option_send_setup(port); 750 option_send_setup(tty, port);
772 mutex_unlock(&serial->disc_mutex); 751 mutex_unlock(&serial->disc_mutex);
773 752
774 /* Stop reading/writing urbs */ 753 /* Stop reading/writing urbs */
@@ -777,7 +756,7 @@ static void option_close(struct usb_serial_port *port, struct file *filp)
777 for (i = 0; i < N_OUT_URB; i++) 756 for (i = 0; i < N_OUT_URB; i++)
778 usb_kill_urb(portdata->out_urbs[i]); 757 usb_kill_urb(portdata->out_urbs[i]);
779 } 758 }
780 port->tty = NULL; 759 port->port.tty = NULL; /* FIXME */
781} 760}
782 761
783/* Helper functions used by option_setup_urbs */ 762/* Helper functions used by option_setup_urbs */
@@ -807,7 +786,7 @@ static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
807/* Setup urbs */ 786/* Setup urbs */
808static void option_setup_urbs(struct usb_serial *serial) 787static void option_setup_urbs(struct usb_serial *serial)
809{ 788{
810 int i,j; 789 int i, j;
811 struct usb_serial_port *port; 790 struct usb_serial_port *port;
812 struct option_port_private *portdata; 791 struct option_port_private *portdata;
813 792
@@ -817,18 +796,22 @@ static void option_setup_urbs(struct usb_serial *serial)
817 port = serial->port[i]; 796 port = serial->port[i];
818 portdata = usb_get_serial_port_data(port); 797 portdata = usb_get_serial_port_data(port);
819 798
820 /* Do indat endpoints first */ 799 /* Do indat endpoints first */
821 for (j = 0; j < N_IN_URB; ++j) { 800 for (j = 0; j < N_IN_URB; ++j) {
822 portdata->in_urbs[j] = option_setup_urb (serial, 801 portdata->in_urbs[j] = option_setup_urb(serial,
823 port->bulk_in_endpointAddress, USB_DIR_IN, port, 802 port->bulk_in_endpointAddress,
824 portdata->in_buffer[j], IN_BUFLEN, option_indat_callback); 803 USB_DIR_IN, port,
804 portdata->in_buffer[j],
805 IN_BUFLEN, option_indat_callback);
825 } 806 }
826 807
827 /* outdat endpoints */ 808 /* outdat endpoints */
828 for (j = 0; j < N_OUT_URB; ++j) { 809 for (j = 0; j < N_OUT_URB; ++j) {
829 portdata->out_urbs[j] = option_setup_urb (serial, 810 portdata->out_urbs[j] = option_setup_urb(serial,
830 port->bulk_out_endpointAddress, USB_DIR_OUT, port, 811 port->bulk_out_endpointAddress,
831 portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback); 812 USB_DIR_OUT, port,
813 portdata->out_buffer[j],
814 OUT_BUFLEN, option_outdat_callback);
832 } 815 }
833 } 816 }
834} 817}
@@ -839,7 +822,8 @@ static void option_setup_urbs(struct usb_serial *serial)
839 * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN 822 * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN
840 * CDC. 823 * CDC.
841*/ 824*/
842static int option_send_setup(struct usb_serial_port *port) 825static int option_send_setup(struct tty_struct *tty,
826 struct usb_serial_port *port)
843{ 827{
844 struct usb_serial *serial = port->serial; 828 struct usb_serial *serial = port->serial;
845 struct option_port_private *portdata; 829 struct option_port_private *portdata;
@@ -848,7 +832,7 @@ static int option_send_setup(struct usb_serial_port *port)
848 832
849 portdata = usb_get_serial_port_data(port); 833 portdata = usb_get_serial_port_data(port);
850 834
851 if (port->tty) { 835 if (tty) {
852 int val = 0; 836 int val = 0;
853 if (portdata->dtr_state) 837 if (portdata->dtr_state)
854 val |= 0x01; 838 val |= 0x01;
@@ -856,10 +840,9 @@ static int option_send_setup(struct usb_serial_port *port)
856 val |= 0x02; 840 val |= 0x02;
857 841
858 return usb_control_msg(serial->dev, 842 return usb_control_msg(serial->dev,
859 usb_rcvctrlpipe(serial->dev, 0), 843 usb_rcvctrlpipe(serial->dev, 0),
860 0x22,0x21,val,ifNum,NULL,0,USB_CTRL_SET_TIMEOUT); 844 0x22, 0x21, val, ifNum, NULL, 0, USB_CTRL_SET_TIMEOUT);
861 } 845 }
862
863 return 0; 846 return 0;
864} 847}
865 848
@@ -879,7 +862,7 @@ static int option_startup(struct usb_serial *serial)
879 if (!portdata) { 862 if (!portdata) {
880 dbg("%s: kmalloc for option_port_private (%d) failed!.", 863 dbg("%s: kmalloc for option_port_private (%d) failed!.",
881 __func__, i); 864 __func__, i);
882 return (1); 865 return 1;
883 } 866 }
884 867
885 for (j = 0; j < N_IN_URB; j++) { 868 for (j = 0; j < N_IN_URB; j++) {
@@ -898,17 +881,15 @@ static int option_startup(struct usb_serial *serial)
898 881
899 usb_set_serial_port_data(port, portdata); 882 usb_set_serial_port_data(port, portdata);
900 883
901 if (! port->interrupt_in_urb) 884 if (!port->interrupt_in_urb)
902 continue; 885 continue;
903 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 886 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
904 if (err) 887 if (err)
905 dbg("%s: submit irq_in urb failed %d", 888 dbg("%s: submit irq_in urb failed %d",
906 __func__, err); 889 __func__, err);
907 } 890 }
908
909 option_setup_urbs(serial); 891 option_setup_urbs(serial);
910 892 return 0;
911 return (0);
912 893
913bail_out_error2: 894bail_out_error2:
914 for (j = 0; j < N_OUT_URB; j++) 895 for (j = 0; j < N_OUT_URB; j++)
@@ -947,7 +928,8 @@ static void option_shutdown(struct usb_serial *serial)
947 for (j = 0; j < N_IN_URB; j++) { 928 for (j = 0; j < N_IN_URB; j++) {
948 if (portdata->in_urbs[j]) { 929 if (portdata->in_urbs[j]) {
949 usb_free_urb(portdata->in_urbs[j]); 930 usb_free_urb(portdata->in_urbs[j]);
950 free_page((unsigned long)portdata->in_buffer[j]); 931 free_page((unsigned long)
932 portdata->in_buffer[j]);
951 portdata->in_urbs[j] = NULL; 933 portdata->in_urbs[j] = NULL;
952 } 934 }
953 } 935 }
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c
index a9625c180dc3..81db5715ee25 100644
--- a/drivers/usb/serial/oti6858.c
+++ b/drivers/usb/serial/oti6858.c
@@ -25,7 +25,8 @@
25 * it under the terms of the GNU General Public License as published by 25 * it under the terms of the GNU General Public License as published by
26 * the Free Software Foundation; either version 2 of the License. 26 * the Free Software Foundation; either version 2 of the License.
27 * 27 *
28 * See Documentation/usb/usb-serial.txt for more information on using this driver 28 * See Documentation/usb/usb-serial.txt for more information on using this
29 * driver
29 * 30 *
30 * TODO: 31 * TODO:
31 * - implement correct flushing for ioctls and oti6858_close() 32 * - implement correct flushing for ioctls and oti6858_close()
@@ -49,7 +50,7 @@
49#include <linux/spinlock.h> 50#include <linux/spinlock.h>
50#include <linux/usb.h> 51#include <linux/usb.h>
51#include <linux/usb/serial.h> 52#include <linux/usb/serial.h>
52#include <asm/uaccess.h> 53#include <linux/uaccess.h>
53#include "oti6858.h" 54#include "oti6858.h"
54 55
55#define OTI6858_DESCRIPTION \ 56#define OTI6858_DESCRIPTION \
@@ -135,27 +136,28 @@ struct oti6858_control_pkt {
135 136
136#define OTI6858_CTRL_PKT_SIZE sizeof(struct oti6858_control_pkt) 137#define OTI6858_CTRL_PKT_SIZE sizeof(struct oti6858_control_pkt)
137#define OTI6858_CTRL_EQUALS_PENDING(a, priv) \ 138#define OTI6858_CTRL_EQUALS_PENDING(a, priv) \
138 ( ((a)->divisor == (priv)->pending_setup.divisor) \ 139 (((a)->divisor == (priv)->pending_setup.divisor) \
139 && ((a)->control == (priv)->pending_setup.control) \ 140 && ((a)->control == (priv)->pending_setup.control) \
140 && ((a)->frame_fmt == (priv)->pending_setup.frame_fmt) ) 141 && ((a)->frame_fmt == (priv)->pending_setup.frame_fmt))
141 142
142/* function prototypes */ 143/* function prototypes */
143static int oti6858_open(struct usb_serial_port *port, struct file *filp); 144static int oti6858_open(struct tty_struct *tty,
144static void oti6858_close(struct usb_serial_port *port, struct file *filp); 145 struct usb_serial_port *port, struct file *filp);
145static void oti6858_set_termios(struct usb_serial_port *port, 146static void oti6858_close(struct tty_struct *tty,
146 struct ktermios *old); 147 struct usb_serial_port *port, struct file *filp);
147static int oti6858_ioctl(struct usb_serial_port *port, struct file *file, 148static void oti6858_set_termios(struct tty_struct *tty,
149 struct usb_serial_port *port, struct ktermios *old);
150static int oti6858_ioctl(struct tty_struct *tty, struct file *file,
148 unsigned int cmd, unsigned long arg); 151 unsigned int cmd, unsigned long arg);
149static void oti6858_read_int_callback(struct urb *urb); 152static void oti6858_read_int_callback(struct urb *urb);
150static void oti6858_read_bulk_callback(struct urb *urb); 153static void oti6858_read_bulk_callback(struct urb *urb);
151static void oti6858_write_bulk_callback(struct urb *urb); 154static void oti6858_write_bulk_callback(struct urb *urb);
152static int oti6858_write(struct usb_serial_port *port, 155static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
153 const unsigned char *buf, int count); 156 const unsigned char *buf, int count);
154static int oti6858_write_room(struct usb_serial_port *port); 157static int oti6858_write_room(struct tty_struct *tty);
155static void oti6858_break_ctl(struct usb_serial_port *port, int break_state); 158static int oti6858_chars_in_buffer(struct tty_struct *tty);
156static int oti6858_chars_in_buffer(struct usb_serial_port *port); 159static int oti6858_tiocmget(struct tty_struct *tty, struct file *file);
157static int oti6858_tiocmget(struct usb_serial_port *port, struct file *file); 160static int oti6858_tiocmset(struct tty_struct *tty, struct file *file,
158static int oti6858_tiocmset(struct usb_serial_port *port, struct file *file,
159 unsigned int set, unsigned int clear); 161 unsigned int set, unsigned int clear);
160static int oti6858_startup(struct usb_serial *serial); 162static int oti6858_startup(struct usb_serial *serial);
161static void oti6858_shutdown(struct usb_serial *serial); 163static void oti6858_shutdown(struct usb_serial *serial);
@@ -184,7 +186,6 @@ static struct usb_serial_driver oti6858_device = {
184 .close = oti6858_close, 186 .close = oti6858_close,
185 .write = oti6858_write, 187 .write = oti6858_write,
186 .ioctl = oti6858_ioctl, 188 .ioctl = oti6858_ioctl,
187 .break_ctl = oti6858_break_ctl,
188 .set_termios = oti6858_set_termios, 189 .set_termios = oti6858_set_termios,
189 .tiocmget = oti6858_tiocmget, 190 .tiocmget = oti6858_tiocmget,
190 .tiocmset = oti6858_tiocmset, 191 .tiocmset = oti6858_tiocmset,
@@ -220,7 +221,7 @@ struct oti6858_private {
220 struct delayed_work delayed_setup_work; 221 struct delayed_work delayed_setup_work;
221 222
222 wait_queue_head_t intr_wait; 223 wait_queue_head_t intr_wait;
223 struct usb_serial_port *port; /* USB port with which associated */ 224 struct usb_serial_port *port; /* USB port with which associated */
224}; 225};
225 226
226#undef dbg 227#undef dbg
@@ -229,7 +230,8 @@ struct oti6858_private {
229 230
230static void setup_line(struct work_struct *work) 231static void setup_line(struct work_struct *work)
231{ 232{
232 struct oti6858_private *priv = container_of(work, struct oti6858_private, delayed_setup_work.work); 233 struct oti6858_private *priv = container_of(work,
234 struct oti6858_private, delayed_setup_work.work);
233 struct usb_serial_port *port = priv->port; 235 struct usb_serial_port *port = priv->port;
234 struct oti6858_control_pkt *new_setup; 236 struct oti6858_control_pkt *new_setup;
235 unsigned long flags; 237 unsigned long flags;
@@ -237,10 +239,12 @@ static void setup_line(struct work_struct *work)
237 239
238 dbg("%s(port = %d)", __func__, port->number); 240 dbg("%s(port = %d)", __func__, port->number);
239 241
240 if ((new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL)) == NULL) { 242 new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
243 if (new_setup == NULL) {
241 dev_err(&port->dev, "%s(): out of memory!\n", __func__); 244 dev_err(&port->dev, "%s(): out of memory!\n", __func__);
242 /* we will try again */ 245 /* we will try again */
243 schedule_delayed_work(&priv->delayed_setup_work, msecs_to_jiffies(2)); 246 schedule_delayed_work(&priv->delayed_setup_work,
247 msecs_to_jiffies(2));
244 return; 248 return;
245 } 249 }
246 250
@@ -256,7 +260,8 @@ static void setup_line(struct work_struct *work)
256 dev_err(&port->dev, "%s(): error reading status\n", __func__); 260 dev_err(&port->dev, "%s(): error reading status\n", __func__);
257 kfree(new_setup); 261 kfree(new_setup);
258 /* we will try again */ 262 /* we will try again */
259 schedule_delayed_work(&priv->delayed_setup_work, msecs_to_jiffies(2)); 263 schedule_delayed_work(&priv->delayed_setup_work,
264 msecs_to_jiffies(2));
260 return; 265 return;
261 } 266 }
262 267
@@ -297,7 +302,8 @@ static void setup_line(struct work_struct *work)
297 302
298void send_data(struct work_struct *work) 303void send_data(struct work_struct *work)
299{ 304{
300 struct oti6858_private *priv = container_of(work, struct oti6858_private, delayed_write_work.work); 305 struct oti6858_private *priv = container_of(work,
306 struct oti6858_private, delayed_write_work.work);
301 struct usb_serial_port *port = priv->port; 307 struct usb_serial_port *port = priv->port;
302 int count = 0, result; 308 int count = 0, result;
303 unsigned long flags; 309 unsigned long flags;
@@ -308,7 +314,8 @@ void send_data(struct work_struct *work)
308 spin_lock_irqsave(&priv->lock, flags); 314 spin_lock_irqsave(&priv->lock, flags);
309 if (priv->flags.write_urb_in_use) { 315 if (priv->flags.write_urb_in_use) {
310 spin_unlock_irqrestore(&priv->lock, flags); 316 spin_unlock_irqrestore(&priv->lock, flags);
311 schedule_delayed_work(&priv->delayed_write_work, msecs_to_jiffies(2)); 317 schedule_delayed_work(&priv->delayed_write_work,
318 msecs_to_jiffies(2));
312 return; 319 return;
313 } 320 }
314 priv->flags.write_urb_in_use = 1; 321 priv->flags.write_urb_in_use = 1;
@@ -359,8 +366,8 @@ void send_data(struct work_struct *work)
359 366
360static int oti6858_startup(struct usb_serial *serial) 367static int oti6858_startup(struct usb_serial *serial)
361{ 368{
362 struct usb_serial_port *port = serial->port[0]; 369 struct usb_serial_port *port = serial->port[0];
363 struct oti6858_private *priv; 370 struct oti6858_private *priv;
364 int i; 371 int i;
365 372
366 for (i = 0; i < serial->num_ports; ++i) { 373 for (i = 0; i < serial->num_ports; ++i) {
@@ -375,8 +382,8 @@ static int oti6858_startup(struct usb_serial *serial)
375 382
376 spin_lock_init(&priv->lock); 383 spin_lock_init(&priv->lock);
377 init_waitqueue_head(&priv->intr_wait); 384 init_waitqueue_head(&priv->intr_wait);
378// INIT_WORK(&priv->setup_work, setup_line, serial->port[i]); 385/* INIT_WORK(&priv->setup_work, setup_line, serial->port[i]); */
379// INIT_WORK(&priv->write_work, send_data, serial->port[i]); 386/* INIT_WORK(&priv->write_work, send_data, serial->port[i]); */
380 priv->port = port; 387 priv->port = port;
381 INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line); 388 INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
382 INIT_DELAYED_WORK(&priv->delayed_write_work, send_data); 389 INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
@@ -395,7 +402,7 @@ static int oti6858_startup(struct usb_serial *serial)
395 return -ENOMEM; 402 return -ENOMEM;
396} 403}
397 404
398static int oti6858_write(struct usb_serial_port *port, 405static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
399 const unsigned char *buf, int count) 406 const unsigned char *buf, int count)
400{ 407{
401 struct oti6858_private *priv = usb_get_serial_port_data(port); 408 struct oti6858_private *priv = usb_get_serial_port_data(port);
@@ -413,8 +420,9 @@ static int oti6858_write(struct usb_serial_port *port,
413 return count; 420 return count;
414} 421}
415 422
416static int oti6858_write_room(struct usb_serial_port *port) 423static int oti6858_write_room(struct tty_struct *tty)
417{ 424{
425 struct usb_serial_port *port = tty->driver_data;
418 struct oti6858_private *priv = usb_get_serial_port_data(port); 426 struct oti6858_private *priv = usb_get_serial_port_data(port);
419 int room = 0; 427 int room = 0;
420 unsigned long flags; 428 unsigned long flags;
@@ -428,8 +436,9 @@ static int oti6858_write_room(struct usb_serial_port *port)
428 return room; 436 return room;
429} 437}
430 438
431static int oti6858_chars_in_buffer(struct usb_serial_port *port) 439static int oti6858_chars_in_buffer(struct tty_struct *tty)
432{ 440{
441 struct usb_serial_port *port = tty->driver_data;
433 struct oti6858_private *priv = usb_get_serial_port_data(port); 442 struct oti6858_private *priv = usb_get_serial_port_data(port);
434 int chars = 0; 443 int chars = 0;
435 unsigned long flags; 444 unsigned long flags;
@@ -443,8 +452,8 @@ static int oti6858_chars_in_buffer(struct usb_serial_port *port)
443 return chars; 452 return chars;
444} 453}
445 454
446static void oti6858_set_termios(struct usb_serial_port *port, 455static void oti6858_set_termios(struct tty_struct *tty,
447 struct ktermios *old_termios) 456 struct usb_serial_port *port, struct ktermios *old_termios)
448{ 457{
449 struct oti6858_private *priv = usb_get_serial_port_data(port); 458 struct oti6858_private *priv = usb_get_serial_port_data(port);
450 unsigned long flags; 459 unsigned long flags;
@@ -455,22 +464,22 @@ static void oti6858_set_termios(struct usb_serial_port *port,
455 464
456 dbg("%s(port = %d)", __func__, port->number); 465 dbg("%s(port = %d)", __func__, port->number);
457 466
458 if (!port->tty || !port->tty->termios) { 467 if (!tty) {
459 dbg("%s(): no tty structures", __func__); 468 dbg("%s(): no tty structures", __func__);
460 return; 469 return;
461 } 470 }
462 471
463 spin_lock_irqsave(&priv->lock, flags); 472 spin_lock_irqsave(&priv->lock, flags);
464 if (!priv->flags.termios_initialized) { 473 if (!priv->flags.termios_initialized) {
465 *(port->tty->termios) = tty_std_termios; 474 *(tty->termios) = tty_std_termios;
466 port->tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; 475 tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
476 tty->termios->c_ispeed = 38400;
477 tty->termios->c_ospeed = 38400;
467 priv->flags.termios_initialized = 1; 478 priv->flags.termios_initialized = 1;
468 port->tty->termios->c_ispeed = 38400;
469 port->tty->termios->c_ospeed = 38400;
470 } 479 }
471 spin_unlock_irqrestore(&priv->lock, flags); 480 spin_unlock_irqrestore(&priv->lock, flags);
472 481
473 cflag = port->tty->termios->c_cflag; 482 cflag = tty->termios->c_cflag;
474 483
475 spin_lock_irqsave(&priv->lock, flags); 484 spin_lock_irqsave(&priv->lock, flags);
476 divisor = priv->pending_setup.divisor; 485 divisor = priv->pending_setup.divisor;
@@ -480,19 +489,19 @@ static void oti6858_set_termios(struct usb_serial_port *port,
480 489
481 frame_fmt &= ~FMT_DATA_BITS_MASK; 490 frame_fmt &= ~FMT_DATA_BITS_MASK;
482 switch (cflag & CSIZE) { 491 switch (cflag & CSIZE) {
483 case CS5: 492 case CS5:
484 frame_fmt |= FMT_DATA_BITS_5; 493 frame_fmt |= FMT_DATA_BITS_5;
485 break; 494 break;
486 case CS6: 495 case CS6:
487 frame_fmt |= FMT_DATA_BITS_6; 496 frame_fmt |= FMT_DATA_BITS_6;
488 break; 497 break;
489 case CS7: 498 case CS7:
490 frame_fmt |= FMT_DATA_BITS_7; 499 frame_fmt |= FMT_DATA_BITS_7;
491 break; 500 break;
492 default: 501 default:
493 case CS8: 502 case CS8:
494 frame_fmt |= FMT_DATA_BITS_8; 503 frame_fmt |= FMT_DATA_BITS_8;
495 break; 504 break;
496 } 505 }
497 506
498 /* manufacturer claims that this device can work with baud rates 507 /* manufacturer claims that this device can work with baud rates
@@ -500,7 +509,7 @@ static void oti6858_set_termios(struct usb_serial_port *port,
500 * guarantee that any other baud rate will work (especially 509 * guarantee that any other baud rate will work (especially
501 * the higher ones) 510 * the higher ones)
502 */ 511 */
503 br = tty_get_baud_rate(port->tty); 512 br = tty_get_baud_rate(tty);
504 if (br == 0) { 513 if (br == 0) {
505 divisor = 0; 514 divisor = 0;
506 } else { 515 } else {
@@ -511,23 +520,21 @@ static void oti6858_set_termios(struct usb_serial_port *port,
511 new_divisor = (96000000 + 8 * br) / (16 * br); 520 new_divisor = (96000000 + 8 * br) / (16 * br);
512 real_br = 96000000 / (16 * new_divisor); 521 real_br = 96000000 / (16 * new_divisor);
513 divisor = cpu_to_le16(new_divisor); 522 divisor = cpu_to_le16(new_divisor);
514 tty_encode_baud_rate(port->tty, real_br, real_br); 523 tty_encode_baud_rate(tty, real_br, real_br);
515 } 524 }
516 525
517 frame_fmt &= ~FMT_STOP_BITS_MASK; 526 frame_fmt &= ~FMT_STOP_BITS_MASK;
518 if ((cflag & CSTOPB) != 0) { 527 if ((cflag & CSTOPB) != 0)
519 frame_fmt |= FMT_STOP_BITS_2; 528 frame_fmt |= FMT_STOP_BITS_2;
520 } else { 529 else
521 frame_fmt |= FMT_STOP_BITS_1; 530 frame_fmt |= FMT_STOP_BITS_1;
522 }
523 531
524 frame_fmt &= ~FMT_PARITY_MASK; 532 frame_fmt &= ~FMT_PARITY_MASK;
525 if ((cflag & PARENB) != 0) { 533 if ((cflag & PARENB) != 0) {
526 if ((cflag & PARODD) != 0) { 534 if ((cflag & PARODD) != 0)
527 frame_fmt |= FMT_PARITY_ODD; 535 frame_fmt |= FMT_PARITY_ODD;
528 } else { 536 else
529 frame_fmt |= FMT_PARITY_EVEN; 537 frame_fmt |= FMT_PARITY_EVEN;
530 }
531 } else { 538 } else {
532 frame_fmt |= FMT_PARITY_NONE; 539 frame_fmt |= FMT_PARITY_NONE;
533 } 540 }
@@ -564,7 +571,8 @@ static void oti6858_set_termios(struct usb_serial_port *port,
564 spin_unlock_irqrestore(&priv->lock, flags); 571 spin_unlock_irqrestore(&priv->lock, flags);
565} 572}
566 573
567static int oti6858_open(struct usb_serial_port *port, struct file *filp) 574static int oti6858_open(struct tty_struct *tty,
575 struct usb_serial_port *port, struct file *filp)
568{ 576{
569 struct oti6858_private *priv = usb_get_serial_port_data(port); 577 struct oti6858_private *priv = usb_get_serial_port_data(port);
570 struct ktermios tmp_termios; 578 struct ktermios tmp_termios;
@@ -578,10 +586,11 @@ static int oti6858_open(struct usb_serial_port *port, struct file *filp)
578 usb_clear_halt(serial->dev, port->write_urb->pipe); 586 usb_clear_halt(serial->dev, port->write_urb->pipe);
579 usb_clear_halt(serial->dev, port->read_urb->pipe); 587 usb_clear_halt(serial->dev, port->read_urb->pipe);
580 588
581 if (port->open_count != 1) 589 if (port->port.count != 1)
582 return 0; 590 return 0;
583 591
584 if ((buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL)) == NULL) { 592 buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
593 if (buf == NULL) {
585 dev_err(&port->dev, "%s(): out of memory!\n", __func__); 594 dev_err(&port->dev, "%s(): out of memory!\n", __func__);
586 return -ENOMEM; 595 return -ENOMEM;
587 } 596 }
@@ -617,18 +626,19 @@ static int oti6858_open(struct usb_serial_port *port, struct file *filp)
617 if (result != 0) { 626 if (result != 0) {
618 dev_err(&port->dev, "%s(): usb_submit_urb() failed" 627 dev_err(&port->dev, "%s(): usb_submit_urb() failed"
619 " with error %d\n", __func__, result); 628 " with error %d\n", __func__, result);
620 oti6858_close(port, NULL); 629 oti6858_close(tty, port, NULL);
621 return -EPROTO; 630 return -EPROTO;
622 } 631 }
623 632
624 /* setup termios */ 633 /* setup termios */
625 if (port->tty) 634 if (tty)
626 oti6858_set_termios(port, &tmp_termios); 635 oti6858_set_termios(tty, port, &tmp_termios);
627 636
628 return 0; 637 return 0;
629} 638}
630 639
631static void oti6858_close(struct usb_serial_port *port, struct file *filp) 640static void oti6858_close(struct tty_struct *tty,
641 struct usb_serial_port *port, struct file *filp)
632{ 642{
633 struct oti6858_private *priv = usb_get_serial_port_data(port); 643 struct oti6858_private *priv = usb_get_serial_port_data(port);
634 unsigned long flags; 644 unsigned long flags;
@@ -641,7 +651,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
641 spin_lock_irqsave(&priv->lock, flags); 651 spin_lock_irqsave(&priv->lock, flags);
642 timeout = 30 * HZ; /* PL2303_CLOSING_WAIT */ 652 timeout = 30 * HZ; /* PL2303_CLOSING_WAIT */
643 init_waitqueue_entry(&wait, current); 653 init_waitqueue_entry(&wait, current);
644 add_wait_queue(&port->tty->write_wait, &wait); 654 add_wait_queue(&tty->write_wait, &wait);
645 dbg("%s(): entering wait loop", __func__); 655 dbg("%s(): entering wait loop", __func__);
646 for (;;) { 656 for (;;) {
647 set_current_state(TASK_INTERRUPTIBLE); 657 set_current_state(TASK_INTERRUPTIBLE);
@@ -654,7 +664,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
654 spin_lock_irqsave(&priv->lock, flags); 664 spin_lock_irqsave(&priv->lock, flags);
655 } 665 }
656 set_current_state(TASK_RUNNING); 666 set_current_state(TASK_RUNNING);
657 remove_wait_queue(&port->tty->write_wait, &wait); 667 remove_wait_queue(&tty->write_wait, &wait);
658 dbg("%s(): after wait loop", __func__); 668 dbg("%s(): after wait loop", __func__);
659 669
660 /* clear out any remaining data in the buffer */ 670 /* clear out any remaining data in the buffer */
@@ -669,7 +679,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
669 /* data is in the buffer to compute a delay */ 679 /* data is in the buffer to compute a delay */
670 /* that is not unnecessarily long) */ 680 /* that is not unnecessarily long) */
671 /* FIXME 681 /* FIXME
672 bps = tty_get_baud_rate(port->tty); 682 bps = tty_get_baud_rate(tty);
673 if (bps > 1200) 683 if (bps > 1200)
674 timeout = max((HZ*2560)/bps,HZ/10); 684 timeout = max((HZ*2560)/bps,HZ/10);
675 else 685 else
@@ -690,7 +700,7 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
690 usb_kill_urb(port->interrupt_in_urb); 700 usb_kill_urb(port->interrupt_in_urb);
691 701
692 /* 702 /*
693 if (port->tty && (port->tty->termios->c_cflag) & HUPCL) { 703 if (tty && (tty->termios->c_cflag) & HUPCL) {
694 // drop DTR and RTS 704 // drop DTR and RTS
695 spin_lock_irqsave(&priv->lock, flags); 705 spin_lock_irqsave(&priv->lock, flags);
696 priv->pending_setup.control &= ~CONTROL_MASK; 706 priv->pending_setup.control &= ~CONTROL_MASK;
@@ -699,9 +709,10 @@ static void oti6858_close(struct usb_serial_port *port, struct file *filp)
699 */ 709 */
700} 710}
701 711
702static int oti6858_tiocmset(struct usb_serial_port *port, struct file *file, 712static int oti6858_tiocmset(struct tty_struct *tty, struct file *file,
703 unsigned int set, unsigned int clear) 713 unsigned int set, unsigned int clear)
704{ 714{
715 struct usb_serial_port *port = tty->driver_data;
705 struct oti6858_private *priv = usb_get_serial_port_data(port); 716 struct oti6858_private *priv = usb_get_serial_port_data(port);
706 unsigned long flags; 717 unsigned long flags;
707 u8 control; 718 u8 control;
@@ -724,16 +735,16 @@ static int oti6858_tiocmset(struct usb_serial_port *port, struct file *file,
724 if ((clear & TIOCM_DTR) != 0) 735 if ((clear & TIOCM_DTR) != 0)
725 control &= ~CONTROL_DTR_HIGH; 736 control &= ~CONTROL_DTR_HIGH;
726 737
727 if (control != priv->pending_setup.control) { 738 if (control != priv->pending_setup.control)
728 priv->pending_setup.control = control; 739 priv->pending_setup.control = control;
729 }
730 spin_unlock_irqrestore(&priv->lock, flags);
731 740
741 spin_unlock_irqrestore(&priv->lock, flags);
732 return 0; 742 return 0;
733} 743}
734 744
735static int oti6858_tiocmget(struct usb_serial_port *port, struct file *file) 745static int oti6858_tiocmget(struct tty_struct *tty, struct file *file)
736{ 746{
747 struct usb_serial_port *port = tty->driver_data;
737 struct oti6858_private *priv = usb_get_serial_port_data(port); 748 struct oti6858_private *priv = usb_get_serial_port_data(port);
738 unsigned long flags; 749 unsigned long flags;
739 unsigned pin_state; 750 unsigned pin_state;
@@ -779,7 +790,8 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
779 spin_unlock_irqrestore(&priv->lock, flags); 790 spin_unlock_irqrestore(&priv->lock, flags);
780 791
781 while (1) { 792 while (1) {
782 wait_event_interruptible(priv->intr_wait, priv->status.pin_state != prev); 793 wait_event_interruptible(priv->intr_wait,
794 priv->status.pin_state != prev);
783 if (signal_pending(current)) 795 if (signal_pending(current))
784 return -ERESTARTSYS; 796 return -ERESTARTSYS;
785 797
@@ -789,12 +801,11 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
789 801
790 changed = prev ^ status; 802 changed = prev ^ status;
791 /* FIXME: check if this is correct (active high/low) */ 803 /* FIXME: check if this is correct (active high/low) */
792 if ( ((arg & TIOCM_RNG) && (changed & PIN_RI)) || 804 if (((arg & TIOCM_RNG) && (changed & PIN_RI)) ||
793 ((arg & TIOCM_DSR) && (changed & PIN_DSR)) || 805 ((arg & TIOCM_DSR) && (changed & PIN_DSR)) ||
794 ((arg & TIOCM_CD) && (changed & PIN_DCD)) || 806 ((arg & TIOCM_CD) && (changed & PIN_DCD)) ||
795 ((arg & TIOCM_CTS) && (changed & PIN_CTS))) { 807 ((arg & TIOCM_CTS) && (changed & PIN_CTS)))
796 return 0; 808 return 0;
797 }
798 prev = status; 809 prev = status;
799 } 810 }
800 811
@@ -802,56 +813,25 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
802 return 0; 813 return 0;
803} 814}
804 815
805static int oti6858_ioctl(struct usb_serial_port *port, struct file *file, 816static int oti6858_ioctl(struct tty_struct *tty, struct file *file,
806 unsigned int cmd, unsigned long arg) 817 unsigned int cmd, unsigned long arg)
807{ 818{
808 void __user *user_arg = (void __user *) arg; 819 struct usb_serial_port *port = tty->driver_data;
809 unsigned int x;
810 820
811 dbg("%s(port = %d, cmd = 0x%04x, arg = 0x%08lx)", 821 dbg("%s(port = %d, cmd = 0x%04x, arg = 0x%08lx)",
812 __func__, port->number, cmd, arg); 822 __func__, port->number, cmd, arg);
813 823
814 switch (cmd) { 824 switch (cmd) {
815 case TIOCMBIS: 825 case TIOCMIWAIT:
816 if (copy_from_user(&x, user_arg, sizeof(x))) 826 dbg("%s(): TIOCMIWAIT", __func__);
817 return -EFAULT; 827 return wait_modem_info(port, arg);
818 return oti6858_tiocmset(port, NULL, x, 0); 828 default:
819 829 dbg("%s(): 0x%04x not supported", __func__, cmd);
820 case TIOCMBIC: 830 break;
821 if (copy_from_user(&x, user_arg, sizeof(x)))
822 return -EFAULT;
823 return oti6858_tiocmset(port, NULL, 0, x);
824
825 case TIOCMIWAIT:
826 dbg("%s(): TIOCMIWAIT", __func__);
827 return wait_modem_info(port, arg);
828
829 default:
830 dbg("%s(): 0x%04x not supported", __func__, cmd);
831 break;
832 } 831 }
833
834 return -ENOIOCTLCMD; 832 return -ENOIOCTLCMD;
835} 833}
836 834
837static void oti6858_break_ctl(struct usb_serial_port *port, int break_state)
838{
839 int state;
840
841 dbg("%s(port = %d)", __func__, port->number);
842
843 state = (break_state == 0) ? 0 : 1;
844 dbg("%s(): turning break %s", __func__, state ? "on" : "off");
845
846 /* FIXME */
847/*
848 result = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
849 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
850 0, NULL, 0, 100);
851 if (result != 0)
852 dbg("%s(): error sending break", __func__);
853 */
854}
855 835
856static void oti6858_shutdown(struct usb_serial *serial) 836static void oti6858_shutdown(struct usb_serial *serial)
857{ 837{
@@ -964,7 +944,7 @@ static void oti6858_read_int_callback(struct urb *urb)
964 spin_lock_irqsave(&priv->lock, flags); 944 spin_lock_irqsave(&priv->lock, flags);
965 if (priv->flags.write_urb_in_use == 0 945 if (priv->flags.write_urb_in_use == 0
966 && oti6858_buf_data_avail(priv->buf) != 0) { 946 && oti6858_buf_data_avail(priv->buf) != 0) {
967 schedule_delayed_work(&priv->delayed_write_work,0); 947 schedule_delayed_work(&priv->delayed_write_work, 0);
968 resubmit = 0; 948 resubmit = 0;
969 } 949 }
970 spin_unlock_irqrestore(&priv->lock, flags); 950 spin_unlock_irqrestore(&priv->lock, flags);
@@ -973,7 +953,7 @@ static void oti6858_read_int_callback(struct urb *urb)
973 if (resubmit) { 953 if (resubmit) {
974 int result; 954 int result;
975 955
976// dbg("%s(): submitting interrupt urb", __func__); 956/* dbg("%s(): submitting interrupt urb", __func__); */
977 urb->dev = port->serial->dev; 957 urb->dev = port->serial->dev;
978 result = usb_submit_urb(urb, GFP_ATOMIC); 958 result = usb_submit_urb(urb, GFP_ATOMIC);
979 if (result != 0) { 959 if (result != 0) {
@@ -1002,14 +982,16 @@ static void oti6858_read_bulk_callback(struct urb *urb)
1002 spin_unlock_irqrestore(&priv->lock, flags); 982 spin_unlock_irqrestore(&priv->lock, flags);
1003 983
1004 if (status != 0) { 984 if (status != 0) {
1005 if (!port->open_count) { 985 if (!port->port.count) {
1006 dbg("%s(): port is closed, exiting", __func__); 986 dbg("%s(): port is closed, exiting", __func__);
1007 return; 987 return;
1008 } 988 }
1009 /* 989 /*
1010 if (status == -EPROTO) { 990 if (status == -EPROTO) {
1011 // PL2303 mysteriously fails with -EPROTO reschedule the read 991 * PL2303 mysteriously fails with -EPROTO reschedule
1012 dbg("%s - caught -EPROTO, resubmitting the urb", __func__); 992 the read *
993 dbg("%s - caught -EPROTO, resubmitting the urb",
994 __func__);
1013 result = usb_submit_urb(urb, GFP_ATOMIC); 995 result = usb_submit_urb(urb, GFP_ATOMIC);
1014 if (result) 996 if (result)
1015 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 997 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result);
@@ -1020,14 +1002,14 @@ static void oti6858_read_bulk_callback(struct urb *urb)
1020 return; 1002 return;
1021 } 1003 }
1022 1004
1023 tty = port->tty; 1005 tty = port->port.tty;
1024 if (tty != NULL && urb->actual_length > 0) { 1006 if (tty != NULL && urb->actual_length > 0) {
1025 tty_insert_flip_string(tty, data, urb->actual_length); 1007 tty_insert_flip_string(tty, data, urb->actual_length);
1026 tty_flip_buffer_push(tty); 1008 tty_flip_buffer_push(tty);
1027 } 1009 }
1028 1010
1029 // schedule the interrupt urb if we are still open */ 1011 /* schedule the interrupt urb if we are still open */
1030 if (port->open_count != 0) { 1012 if (port->port.count != 0) {
1031 port->interrupt_in_urb->dev = port->serial->dev; 1013 port->interrupt_in_urb->dev = port->serial->dev;
1032 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1014 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1033 if (result != 0) { 1015 if (result != 0) {
@@ -1078,7 +1060,7 @@ static void oti6858_write_bulk_callback(struct urb *urb)
1078 1060
1079 priv->flags.write_urb_in_use = 0; 1061 priv->flags.write_urb_in_use = 0;
1080 1062
1081 // schedule the interrupt urb if we are still open */ 1063 /* schedule the interrupt urb if we are still open */
1082 port->interrupt_in_urb->dev = port->serial->dev; 1064 port->interrupt_in_urb->dev = port->serial->dev;
1083 dbg("%s(): submitting interrupt urb", __func__); 1065 dbg("%s(): submitting interrupt urb", __func__);
1084 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1066 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
@@ -1153,7 +1135,7 @@ static unsigned int oti6858_buf_data_avail(struct oti6858_buf *pb)
1153{ 1135{
1154 if (pb == NULL) 1136 if (pb == NULL)
1155 return 0; 1137 return 0;
1156 return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size); 1138 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
1157} 1139}
1158 1140
1159/* 1141/*
@@ -1166,7 +1148,7 @@ static unsigned int oti6858_buf_space_avail(struct oti6858_buf *pb)
1166{ 1148{
1167 if (pb == NULL) 1149 if (pb == NULL)
1168 return 0; 1150 return 0;
1169 return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size); 1151 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
1170} 1152}
1171 1153
1172/* 1154/*
@@ -1253,13 +1235,12 @@ static int __init oti6858_init(void)
1253{ 1235{
1254 int retval; 1236 int retval;
1255 1237
1256 if ((retval = usb_serial_register(&oti6858_device)) == 0) { 1238 retval = usb_serial_register(&oti6858_device);
1257 if ((retval = usb_register(&oti6858_driver)) != 0) 1239 if (retval == 0) {
1240 retval = usb_register(&oti6858_driver);
1241 if (retval)
1258 usb_serial_deregister(&oti6858_device); 1242 usb_serial_deregister(&oti6858_device);
1259 else
1260 return 0;
1261 } 1243 }
1262
1263 return retval; 1244 return retval;
1264} 1245}
1265 1246
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 2a0dd1b50dc4..2c9c446ad625 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -10,7 +10,8 @@
10 * modify it under the terms of the GNU General Public License version 10 * modify it under the terms of the GNU General Public License version
11 * 2 as published by the Free Software Foundation. 11 * 2 as published by the Free Software Foundation.
12 * 12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver 13 * See Documentation/usb/usb-serial.txt for more information on using this
14 * driver
14 * 15 *
15 */ 16 */
16 17
@@ -25,7 +26,7 @@
25#include <linux/module.h> 26#include <linux/module.h>
26#include <linux/moduleparam.h> 27#include <linux/moduleparam.h>
27#include <linux/spinlock.h> 28#include <linux/spinlock.h>
28#include <asm/uaccess.h> 29#include <linux/uaccess.h>
29#include <linux/usb.h> 30#include <linux/usb.h>
30#include <linux/usb/serial.h> 31#include <linux/usb/serial.h>
31#include "pl2303.h" 32#include "pl2303.h"
@@ -116,7 +117,7 @@ static struct usb_driver pl2303_driver = {
116#define CONTROL_RTS 0x02 117#define CONTROL_RTS 0x02
117 118
118#define BREAK_REQUEST_TYPE 0x21 119#define BREAK_REQUEST_TYPE 0x21
119#define BREAK_REQUEST 0x23 120#define BREAK_REQUEST 0x23
120#define BREAK_ON 0xffff 121#define BREAK_ON 0xffff
121#define BREAK_OFF 0x0000 122#define BREAK_OFF 0x0000
122 123
@@ -222,7 +223,7 @@ static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
222 if (pb == NULL) 223 if (pb == NULL)
223 return 0; 224 return 0;
224 225
225 return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size); 226 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
226} 227}
227 228
228/* 229/*
@@ -236,7 +237,7 @@ static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
236 if (pb == NULL) 237 if (pb == NULL)
237 return 0; 238 return 0;
238 239
239 return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size); 240 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
240} 241}
241 242
242/* 243/*
@@ -395,7 +396,7 @@ static int pl2303_startup(struct usb_serial *serial)
395 396
396cleanup: 397cleanup:
397 kfree(buf); 398 kfree(buf);
398 for (--i; i>=0; --i) { 399 for (--i; i >= 0; --i) {
399 priv = usb_get_serial_port_data(serial->port[i]); 400 priv = usb_get_serial_port_data(serial->port[i]);
400 pl2303_buf_free(priv->buf); 401 pl2303_buf_free(priv->buf);
401 kfree(priv); 402 kfree(priv);
@@ -407,7 +408,7 @@ cleanup:
407static int set_control_lines(struct usb_device *dev, u8 value) 408static int set_control_lines(struct usb_device *dev, u8 value)
408{ 409{
409 int retval; 410 int retval;
410 411
411 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 412 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
412 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE, 413 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
413 value, 0, NULL, 0, 100); 414 value, 0, NULL, 0, 100);
@@ -452,14 +453,14 @@ static void pl2303_send(struct usb_serial_port *port)
452 dev_err(&port->dev, "%s - failed submitting write urb," 453 dev_err(&port->dev, "%s - failed submitting write urb,"
453 " error %d\n", __func__, result); 454 " error %d\n", __func__, result);
454 priv->write_urb_in_use = 0; 455 priv->write_urb_in_use = 0;
455 // TODO: reschedule pl2303_send 456 /* TODO: reschedule pl2303_send */
456 } 457 }
457 458
458 usb_serial_port_softint(port); 459 usb_serial_port_softint(port);
459} 460}
460 461
461static int pl2303_write(struct usb_serial_port *port, const unsigned char *buf, 462static int pl2303_write(struct tty_struct *tty, struct usb_serial_port *port,
462 int count) 463 const unsigned char *buf, int count)
463{ 464{
464 struct pl2303_private *priv = usb_get_serial_port_data(port); 465 struct pl2303_private *priv = usb_get_serial_port_data(port);
465 unsigned long flags; 466 unsigned long flags;
@@ -478,8 +479,9 @@ static int pl2303_write(struct usb_serial_port *port, const unsigned char *buf,
478 return count; 479 return count;
479} 480}
480 481
481static int pl2303_write_room(struct usb_serial_port *port) 482static int pl2303_write_room(struct tty_struct *tty)
482{ 483{
484 struct usb_serial_port *port = tty->driver_data;
483 struct pl2303_private *priv = usb_get_serial_port_data(port); 485 struct pl2303_private *priv = usb_get_serial_port_data(port);
484 int room = 0; 486 int room = 0;
485 unsigned long flags; 487 unsigned long flags;
@@ -494,8 +496,9 @@ static int pl2303_write_room(struct usb_serial_port *port)
494 return room; 496 return room;
495} 497}
496 498
497static int pl2303_chars_in_buffer(struct usb_serial_port *port) 499static int pl2303_chars_in_buffer(struct tty_struct *tty)
498{ 500{
501 struct usb_serial_port *port = tty->driver_data;
499 struct pl2303_private *priv = usb_get_serial_port_data(port); 502 struct pl2303_private *priv = usb_get_serial_port_data(port);
500 int chars = 0; 503 int chars = 0;
501 unsigned long flags; 504 unsigned long flags;
@@ -510,8 +513,8 @@ static int pl2303_chars_in_buffer(struct usb_serial_port *port)
510 return chars; 513 return chars;
511} 514}
512 515
513static void pl2303_set_termios(struct usb_serial_port *port, 516static void pl2303_set_termios(struct tty_struct *tty,
514 struct ktermios *old_termios) 517 struct usb_serial_port *port, struct ktermios *old_termios)
515{ 518{
516 struct usb_serial *serial = port->serial; 519 struct usb_serial *serial = port->serial;
517 struct pl2303_private *priv = usb_get_serial_port_data(port); 520 struct pl2303_private *priv = usb_get_serial_port_data(port);
@@ -526,11 +529,10 @@ static void pl2303_set_termios(struct usb_serial_port *port,
526 529
527 spin_lock_irqsave(&priv->lock, flags); 530 spin_lock_irqsave(&priv->lock, flags);
528 if (!priv->termios_initialized) { 531 if (!priv->termios_initialized) {
529 *(port->tty->termios) = tty_std_termios; 532 *(tty->termios) = tty_std_termios;
530 port->tty->termios->c_cflag = B9600 | CS8 | CREAD | 533 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
531 HUPCL | CLOCAL; 534 tty->termios->c_ispeed = 9600;
532 port->tty->termios->c_ispeed = 9600; 535 tty->termios->c_ospeed = 9600;
533 port->tty->termios->c_ospeed = 9600;
534 priv->termios_initialized = 1; 536 priv->termios_initialized = 1;
535 } 537 }
536 spin_unlock_irqrestore(&priv->lock, flags); 538 spin_unlock_irqrestore(&priv->lock, flags);
@@ -539,16 +541,16 @@ static void pl2303_set_termios(struct usb_serial_port *port,
539 serial settings even to the same values as before. Thus 541 serial settings even to the same values as before. Thus
540 we actually need to filter in this specific case */ 542 we actually need to filter in this specific case */
541 543
542 if (!tty_termios_hw_change(port->tty->termios, old_termios)) 544 if (!tty_termios_hw_change(tty->termios, old_termios))
543 return; 545 return;
544 546
545 cflag = port->tty->termios->c_cflag; 547 cflag = tty->termios->c_cflag;
546 548
547 buf = kzalloc(7, GFP_KERNEL); 549 buf = kzalloc(7, GFP_KERNEL);
548 if (!buf) { 550 if (!buf) {
549 dev_err(&port->dev, "%s - out of memory.\n", __func__); 551 dev_err(&port->dev, "%s - out of memory.\n", __func__);
550 /* Report back no change occurred */ 552 /* Report back no change occurred */
551 *port->tty->termios = *old_termios; 553 *tty->termios = *old_termios;
552 return; 554 return;
553 } 555 }
554 556
@@ -560,16 +562,24 @@ static void pl2303_set_termios(struct usb_serial_port *port,
560 562
561 if (cflag & CSIZE) { 563 if (cflag & CSIZE) {
562 switch (cflag & CSIZE) { 564 switch (cflag & CSIZE) {
563 case CS5: buf[6] = 5; break; 565 case CS5:
564 case CS6: buf[6] = 6; break; 566 buf[6] = 5;
565 case CS7: buf[6] = 7; break; 567 break;
566 default: 568 case CS6:
567 case CS8: buf[6] = 8; break; 569 buf[6] = 6;
570 break;
571 case CS7:
572 buf[6] = 7;
573 break;
574 default:
575 case CS8:
576 buf[6] = 8;
577 break;
568 } 578 }
569 dbg("%s - data bits = %d", __func__, buf[6]); 579 dbg("%s - data bits = %d", __func__, buf[6]);
570 } 580 }
571 581
572 baud = tty_get_baud_rate(port->tty);; 582 baud = tty_get_baud_rate(tty);
573 dbg("%s - baud = %d", __func__, baud); 583 dbg("%s - baud = %d", __func__, baud);
574 if (baud) { 584 if (baud) {
575 buf[0] = baud & 0xff; 585 buf[0] = baud & 0xff;
@@ -646,12 +656,13 @@ static void pl2303_set_termios(struct usb_serial_port *port,
646 656
647 /* FIXME: Need to read back resulting baud rate */ 657 /* FIXME: Need to read back resulting baud rate */
648 if (baud) 658 if (baud)
649 tty_encode_baud_rate(port->tty, baud, baud); 659 tty_encode_baud_rate(tty, baud, baud);
650 660
651 kfree(buf); 661 kfree(buf);
652} 662}
653 663
654static void pl2303_close(struct usb_serial_port *port, struct file *filp) 664static void pl2303_close(struct tty_struct *tty,
665 struct usb_serial_port *port, struct file *filp)
655{ 666{
656 struct pl2303_private *priv = usb_get_serial_port_data(port); 667 struct pl2303_private *priv = usb_get_serial_port_data(port);
657 unsigned long flags; 668 unsigned long flags;
@@ -666,7 +677,7 @@ static void pl2303_close(struct usb_serial_port *port, struct file *filp)
666 spin_lock_irqsave(&priv->lock, flags); 677 spin_lock_irqsave(&priv->lock, flags);
667 timeout = PL2303_CLOSING_WAIT; 678 timeout = PL2303_CLOSING_WAIT;
668 init_waitqueue_entry(&wait, current); 679 init_waitqueue_entry(&wait, current);
669 add_wait_queue(&port->tty->write_wait, &wait); 680 add_wait_queue(&tty->write_wait, &wait);
670 for (;;) { 681 for (;;) {
671 set_current_state(TASK_INTERRUPTIBLE); 682 set_current_state(TASK_INTERRUPTIBLE);
672 if (pl2303_buf_data_avail(priv->buf) == 0 || 683 if (pl2303_buf_data_avail(priv->buf) == 0 ||
@@ -678,7 +689,7 @@ static void pl2303_close(struct usb_serial_port *port, struct file *filp)
678 spin_lock_irqsave(&priv->lock, flags); 689 spin_lock_irqsave(&priv->lock, flags);
679 } 690 }
680 set_current_state(TASK_RUNNING); 691 set_current_state(TASK_RUNNING);
681 remove_wait_queue(&port->tty->write_wait, &wait); 692 remove_wait_queue(&tty->write_wait, &wait);
682 /* clear out any remaining data in the buffer */ 693 /* clear out any remaining data in the buffer */
683 pl2303_buf_clear(priv->buf); 694 pl2303_buf_clear(priv->buf);
684 spin_unlock_irqrestore(&priv->lock, flags); 695 spin_unlock_irqrestore(&priv->lock, flags);
@@ -690,9 +701,9 @@ static void pl2303_close(struct usb_serial_port *port, struct file *filp)
690 /* for lower rates we should really know how much */ 701 /* for lower rates we should really know how much */
691 /* data is in the buffer to compute a delay */ 702 /* data is in the buffer to compute a delay */
692 /* that is not unnecessarily long) */ 703 /* that is not unnecessarily long) */
693 bps = tty_get_baud_rate(port->tty); 704 bps = tty_get_baud_rate(tty);
694 if (bps > 1200) 705 if (bps > 1200)
695 timeout = max((HZ*2560)/bps,HZ/10); 706 timeout = max((HZ*2560)/bps, HZ/10);
696 else 707 else
697 timeout = 2*HZ; 708 timeout = 2*HZ;
698 schedule_timeout_interruptible(timeout); 709 schedule_timeout_interruptible(timeout);
@@ -703,8 +714,8 @@ static void pl2303_close(struct usb_serial_port *port, struct file *filp)
703 usb_kill_urb(port->read_urb); 714 usb_kill_urb(port->read_urb);
704 usb_kill_urb(port->interrupt_in_urb); 715 usb_kill_urb(port->interrupt_in_urb);
705 716
706 if (port->tty) { 717 if (tty) {
707 c_cflag = port->tty->termios->c_cflag; 718 c_cflag = tty->termios->c_cflag;
708 if (c_cflag & HUPCL) { 719 if (c_cflag & HUPCL) {
709 /* drop DTR and RTS */ 720 /* drop DTR and RTS */
710 spin_lock_irqsave(&priv->lock, flags); 721 spin_lock_irqsave(&priv->lock, flags);
@@ -715,7 +726,8 @@ static void pl2303_close(struct usb_serial_port *port, struct file *filp)
715 } 726 }
716} 727}
717 728
718static int pl2303_open(struct usb_serial_port *port, struct file *filp) 729static int pl2303_open(struct tty_struct *tty,
730 struct usb_serial_port *port, struct file *filp)
719{ 731{
720 struct ktermios tmp_termios; 732 struct ktermios tmp_termios;
721 struct usb_serial *serial = port->serial; 733 struct usb_serial *serial = port->serial;
@@ -734,11 +746,10 @@ static int pl2303_open(struct usb_serial_port *port, struct file *filp)
734 } 746 }
735 747
736 /* Setup termios */ 748 /* Setup termios */
737 if (port->tty) { 749 if (tty)
738 pl2303_set_termios(port, &tmp_termios); 750 pl2303_set_termios(tty, port, &tmp_termios);
739 }
740 751
741 //FIXME: need to assert RTS and DTR if CRTSCTS off 752 /* FIXME: need to assert RTS and DTR if CRTSCTS off */
742 753
743 dbg("%s - submitting read urb", __func__); 754 dbg("%s - submitting read urb", __func__);
744 port->read_urb->dev = serial->dev; 755 port->read_urb->dev = serial->dev;
@@ -746,7 +757,7 @@ static int pl2303_open(struct usb_serial_port *port, struct file *filp)
746 if (result) { 757 if (result) {
747 dev_err(&port->dev, "%s - failed submitting read urb," 758 dev_err(&port->dev, "%s - failed submitting read urb,"
748 " error %d\n", __func__, result); 759 " error %d\n", __func__, result);
749 pl2303_close(port, NULL); 760 pl2303_close(tty, port, NULL);
750 return -EPROTO; 761 return -EPROTO;
751 } 762 }
752 763
@@ -756,15 +767,16 @@ static int pl2303_open(struct usb_serial_port *port, struct file *filp)
756 if (result) { 767 if (result) {
757 dev_err(&port->dev, "%s - failed submitting interrupt urb," 768 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
758 " error %d\n", __func__, result); 769 " error %d\n", __func__, result);
759 pl2303_close(port, NULL); 770 pl2303_close(tty, port, NULL);
760 return -EPROTO; 771 return -EPROTO;
761 } 772 }
762 return 0; 773 return 0;
763} 774}
764 775
765static int pl2303_tiocmset(struct usb_serial_port *port, struct file *file, 776static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
766 unsigned int set, unsigned int clear) 777 unsigned int set, unsigned int clear)
767{ 778{
779 struct usb_serial_port *port = tty->driver_data;
768 struct pl2303_private *priv = usb_get_serial_port_data(port); 780 struct pl2303_private *priv = usb_get_serial_port_data(port);
769 unsigned long flags; 781 unsigned long flags;
770 u8 control; 782 u8 control;
@@ -787,8 +799,9 @@ static int pl2303_tiocmset(struct usb_serial_port *port, struct file *file,
787 return set_control_lines(port->serial->dev, control); 799 return set_control_lines(port->serial->dev, control);
788} 800}
789 801
790static int pl2303_tiocmget(struct usb_serial_port *port, struct file *file) 802static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
791{ 803{
804 struct usb_serial_port *port = tty->driver_data;
792 struct pl2303_private *priv = usb_get_serial_port_data(port); 805 struct pl2303_private *priv = usb_get_serial_port_data(port);
793 unsigned long flags; 806 unsigned long flags;
794 unsigned int mcr; 807 unsigned int mcr;
@@ -839,12 +852,12 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
839 status = priv->line_status; 852 status = priv->line_status;
840 spin_unlock_irqrestore(&priv->lock, flags); 853 spin_unlock_irqrestore(&priv->lock, flags);
841 854
842 changed=prevstatus^status; 855 changed = prevstatus ^ status;
843 856
844 if (((arg & TIOCM_RNG) && (changed & UART_RING)) || 857 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
845 ((arg & TIOCM_DSR) && (changed & UART_DSR)) || 858 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
846 ((arg & TIOCM_CD) && (changed & UART_DCD)) || 859 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
847 ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) { 860 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
848 return 0; 861 return 0;
849 } 862 }
850 prevstatus = status; 863 prevstatus = status;
@@ -853,26 +866,26 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
853 return 0; 866 return 0;
854} 867}
855 868
856static int pl2303_ioctl(struct usb_serial_port *port, struct file *file, 869static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
857 unsigned int cmd, unsigned long arg) 870 unsigned int cmd, unsigned long arg)
858{ 871{
872 struct usb_serial_port *port = tty->driver_data;
859 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd); 873 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
860 874
861 switch (cmd) { 875 switch (cmd) {
862 case TIOCMIWAIT: 876 case TIOCMIWAIT:
863 dbg("%s (%d) TIOCMIWAIT", __func__, port->number); 877 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
864 return wait_modem_info(port, arg); 878 return wait_modem_info(port, arg);
865 879 default:
866 default: 880 dbg("%s not supported = 0x%04x", __func__, cmd);
867 dbg("%s not supported = 0x%04x", __func__, cmd); 881 break;
868 break;
869 } 882 }
870
871 return -ENOIOCTLCMD; 883 return -ENOIOCTLCMD;
872} 884}
873 885
874static void pl2303_break_ctl(struct usb_serial_port *port, int break_state) 886static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
875{ 887{
888 struct usb_serial_port *port = tty->driver_data;
876 struct usb_serial *serial = port->serial; 889 struct usb_serial *serial = port->serial;
877 u16 state; 890 u16 state;
878 int result; 891 int result;
@@ -883,7 +896,8 @@ static void pl2303_break_ctl(struct usb_serial_port *port, int break_state)
883 state = BREAK_OFF; 896 state = BREAK_OFF;
884 else 897 else
885 state = BREAK_ON; 898 state = BREAK_ON;
886 dbg("%s - turning break %s", __func__, state==BREAK_OFF ? "off" : "on"); 899 dbg("%s - turning break %s", __func__,
900 state == BREAK_OFF ? "off" : "on");
887 901
888 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 902 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
889 BREAK_REQUEST, BREAK_REQUEST_TYPE, state, 903 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
@@ -937,7 +951,7 @@ static void pl2303_update_line_status(struct usb_serial_port *port,
937 if (actual_length < length) 951 if (actual_length < length)
938 return; 952 return;
939 953
940 /* Save off the uart status for others to look at */ 954 /* Save off the uart status for others to look at */
941 spin_lock_irqsave(&priv->lock, flags); 955 spin_lock_irqsave(&priv->lock, flags);
942 priv->line_status = data[status_idx]; 956 priv->line_status = data[status_idx];
943 spin_unlock_irqrestore(&priv->lock, flags); 957 spin_unlock_irqrestore(&priv->lock, flags);
@@ -1001,7 +1015,7 @@ static void pl2303_read_bulk_callback(struct urb *urb)
1001 1015
1002 if (status) { 1016 if (status) {
1003 dbg("%s - urb status = %d", __func__, status); 1017 dbg("%s - urb status = %d", __func__, status);
1004 if (!port->open_count) { 1018 if (!port->port.count) {
1005 dbg("%s - port is closed, exiting.", __func__); 1019 dbg("%s - port is closed, exiting.", __func__);
1006 return; 1020 return;
1007 } 1021 }
@@ -1036,7 +1050,7 @@ static void pl2303_read_bulk_callback(struct urb *urb)
1036 1050
1037 /* break takes precedence over parity, */ 1051 /* break takes precedence over parity, */
1038 /* which takes precedence over framing errors */ 1052 /* which takes precedence over framing errors */
1039 if (line_status & UART_BREAK_ERROR ) 1053 if (line_status & UART_BREAK_ERROR)
1040 tty_flag = TTY_BREAK; 1054 tty_flag = TTY_BREAK;
1041 else if (line_status & UART_PARITY_ERROR) 1055 else if (line_status & UART_PARITY_ERROR)
1042 tty_flag = TTY_PARITY; 1056 tty_flag = TTY_PARITY;
@@ -1044,7 +1058,7 @@ static void pl2303_read_bulk_callback(struct urb *urb)
1044 tty_flag = TTY_FRAME; 1058 tty_flag = TTY_FRAME;
1045 dbg("%s - tty_flag = %d", __func__, tty_flag); 1059 dbg("%s - tty_flag = %d", __func__, tty_flag);
1046 1060
1047 tty = port->tty; 1061 tty = port->port.tty;
1048 if (tty && urb->actual_length) { 1062 if (tty && urb->actual_length) {
1049 tty_buffer_request_room(tty, urb->actual_length + 1); 1063 tty_buffer_request_room(tty, urb->actual_length + 1);
1050 /* overrun is special, not associated with a char */ 1064 /* overrun is special, not associated with a char */
@@ -1056,7 +1070,7 @@ static void pl2303_read_bulk_callback(struct urb *urb)
1056 } 1070 }
1057 1071
1058 /* Schedule the next read _if_ we are still open */ 1072 /* Schedule the next read _if_ we are still open */
1059 if (port->open_count) { 1073 if (port->port.count) {
1060 urb->dev = port->serial->dev; 1074 urb->dev = port->serial->dev;
1061 result = usb_submit_urb(urb, GFP_ATOMIC); 1075 result = usb_submit_urb(urb, GFP_ATOMIC);
1062 if (result) 1076 if (result)
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c
index 94bddf06ea4f..def52d07a4ea 100644
--- a/drivers/usb/serial/safe_serial.c
+++ b/drivers/usb/serial/safe_serial.c
@@ -13,24 +13,25 @@
13 * Stuart Lynne <sl@lineo.com>, Tom Rushworth <tbr@lineo.com> 13 * Stuart Lynne <sl@lineo.com>, Tom Rushworth <tbr@lineo.com>
14 */ 14 */
15 15
16/* 16/*
17 * The encapsultaion is designed to overcome difficulties with some USB hardware. 17 * The encapsultaion is designed to overcome difficulties with some USB
18 * hardware.
18 * 19 *
19 * While the USB protocol has a CRC over the data while in transit, i.e. while 20 * While the USB protocol has a CRC over the data while in transit, i.e. while
20 * being carried over the bus, there is no end to end protection. If the hardware 21 * being carried over the bus, there is no end to end protection. If the
21 * has any problems getting the data into or out of the USB transmit and receive 22 * hardware has any problems getting the data into or out of the USB transmit
22 * FIFO's then data can be lost. 23 * and receive FIFO's then data can be lost.
23 * 24 *
24 * This protocol adds a two byte trailer to each USB packet to specify the number 25 * This protocol adds a two byte trailer to each USB packet to specify the
25 * of bytes of valid data and a 10 bit CRC that will allow the receiver to verify 26 * number of bytes of valid data and a 10 bit CRC that will allow the receiver
26 * that the entire USB packet was received without error. 27 * to verify that the entire USB packet was received without error.
27 * 28 *
28 * Because in this case the sender and receiver are the class and function drivers 29 * Because in this case the sender and receiver are the class and function
29 * there is now end to end protection. 30 * drivers there is now end to end protection.
30 * 31 *
31 * There is an additional option that can be used to force all transmitted packets 32 * There is an additional option that can be used to force all transmitted
32 * to be padded to the maximum packet size. This provides a work around for some 33 * packets to be padded to the maximum packet size. This provides a work
33 * devices which have problems with small USB packets. 34 * around for some devices which have problems with small USB packets.
34 * 35 *
35 * Assuming a packetsize of N: 36 * Assuming a packetsize of N:
36 * 37 *
@@ -44,11 +45,12 @@
44 * | Data Length | 10 bit CRC | 45 * | Data Length | 10 bit CRC |
45 * + 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0 | 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0 + 46 * + 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0 | 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0 +
46 * 47 *
47 * The 10 bit CRC is computed across the sent data, followed by the trailer with 48 * The 10 bit CRC is computed across the sent data, followed by the trailer
48 * the length set and the CRC set to zero. The CRC is then OR'd into the trailer. 49 * with the length set and the CRC set to zero. The CRC is then OR'd into
50 * the trailer.
49 * 51 *
50 * When received a 10 bit CRC is computed over the entire frame including the trailer 52 * When received a 10 bit CRC is computed over the entire frame including
51 * and should be equal to zero. 53 * the trailer and should be equal to zero.
52 * 54 *
53 * Two module parameters are used to control the encapsulation, if both are 55 * Two module parameters are used to control the encapsulation, if both are
54 * turned of the module works as a simple serial device with NO 56 * turned of the module works as a simple serial device with NO
@@ -69,7 +71,7 @@
69#include <linux/tty_flip.h> 71#include <linux/tty_flip.h>
70#include <linux/module.h> 72#include <linux/module.h>
71#include <linux/spinlock.h> 73#include <linux/spinlock.h>
72#include <asm/uaccess.h> 74#include <linux/uaccess.h>
73#include <linux/usb.h> 75#include <linux/usb.h>
74#include <linux/usb/serial.h> 76#include <linux/usb/serial.h>
75 77
@@ -86,12 +88,12 @@ static int padded = CONFIG_USB_SERIAL_SAFE_PADDED;
86#define DRIVER_AUTHOR "sl@lineo.com, tbr@lineo.com" 88#define DRIVER_AUTHOR "sl@lineo.com, tbr@lineo.com"
87#define DRIVER_DESC "USB Safe Encapsulated Serial" 89#define DRIVER_DESC "USB Safe Encapsulated Serial"
88 90
89MODULE_AUTHOR (DRIVER_AUTHOR); 91MODULE_AUTHOR(DRIVER_AUTHOR);
90MODULE_DESCRIPTION (DRIVER_DESC); 92MODULE_DESCRIPTION(DRIVER_DESC);
91MODULE_LICENSE("GPL"); 93MODULE_LICENSE("GPL");
92 94
93static __u16 vendor; // no default 95static __u16 vendor; /* no default */
94static __u16 product; // no default 96static __u16 product; /* no default */
95module_param(vendor, ushort, 0); 97module_param(vendor, ushort, 0);
96MODULE_PARM_DESC(vendor, "User specified USB idVendor (required)"); 98MODULE_PARM_DESC(vendor, "User specified USB idVendor (required)");
97module_param(product, ushort, 0); 99module_param(product, ushort, 0);
@@ -122,30 +124,31 @@ MODULE_PARM_DESC(padded, "Pad to full wMaxPacketSize On/Off");
122#define LINEO_SAFESERIAL_CRC_PADDED 0x02 124#define LINEO_SAFESERIAL_CRC_PADDED 0x02
123 125
124 126
125#define MY_USB_DEVICE(vend,prod,dc,ic,isc) \ 127#define MY_USB_DEVICE(vend, prod, dc, ic, isc) \
126 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_CLASS | \ 128 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
127 USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, \ 129 USB_DEVICE_ID_MATCH_DEV_CLASS | \
128 .idVendor = (vend), \ 130 USB_DEVICE_ID_MATCH_INT_CLASS | \
129 .idProduct = (prod),\ 131 USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
130 .bDeviceClass = (dc),\ 132 .idVendor = (vend), \
131 .bInterfaceClass = (ic), \ 133 .idProduct = (prod),\
132 .bInterfaceSubClass = (isc), 134 .bDeviceClass = (dc),\
135 .bInterfaceClass = (ic), \
136 .bInterfaceSubClass = (isc),
133 137
134static struct usb_device_id id_table[] = { 138static struct usb_device_id id_table[] = {
135 {MY_USB_DEVICE (0x49f, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Itsy 139 {MY_USB_DEVICE(0x49f, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Itsy */
136 {MY_USB_DEVICE (0x3f0, 0x2101, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Calypso 140 {MY_USB_DEVICE(0x3f0, 0x2101, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Calypso */
137 {MY_USB_DEVICE (0x4dd, 0x8001, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Iris 141 {MY_USB_DEVICE(0x4dd, 0x8001, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Iris */
138 {MY_USB_DEVICE (0x4dd, 0x8002, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Collie 142 {MY_USB_DEVICE(0x4dd, 0x8002, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Collie */
139 {MY_USB_DEVICE (0x4dd, 0x8003, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Collie 143 {MY_USB_DEVICE(0x4dd, 0x8003, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Collie */
140 {MY_USB_DEVICE (0x4dd, 0x8004, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Collie 144 {MY_USB_DEVICE(0x4dd, 0x8004, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Collie */
141 {MY_USB_DEVICE (0x5f9, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Sharp tmp 145 {MY_USB_DEVICE(0x5f9, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Sharp tmp */
142 // extra null entry for module 146 /* extra null entry for module vendor/produc parameters */
143 // vendor/produc parameters 147 {MY_USB_DEVICE(0, 0, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)},
144 {MY_USB_DEVICE (0, 0, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, 148 {} /* terminating entry */
145 {} // terminating entry
146}; 149};
147 150
148MODULE_DEVICE_TABLE (usb, id_table); 151MODULE_DEVICE_TABLE(usb, id_table);
149 152
150static struct usb_driver safe_driver = { 153static struct usb_driver safe_driver = {
151 .name = "safe_serial", 154 .name = "safe_serial",
@@ -156,29 +159,45 @@ static struct usb_driver safe_driver = {
156}; 159};
157 160
158static const __u16 crc10_table[256] = { 161static const __u16 crc10_table[256] = {
159 0x000, 0x233, 0x255, 0x066, 0x299, 0x0aa, 0x0cc, 0x2ff, 0x301, 0x132, 0x154, 0x367, 0x198, 0x3ab, 0x3cd, 0x1fe, 162 0x000, 0x233, 0x255, 0x066, 0x299, 0x0aa, 0x0cc, 0x2ff,
160 0x031, 0x202, 0x264, 0x057, 0x2a8, 0x09b, 0x0fd, 0x2ce, 0x330, 0x103, 0x165, 0x356, 0x1a9, 0x39a, 0x3fc, 0x1cf, 163 0x301, 0x132, 0x154, 0x367, 0x198, 0x3ab, 0x3cd, 0x1fe,
161 0x062, 0x251, 0x237, 0x004, 0x2fb, 0x0c8, 0x0ae, 0x29d, 0x363, 0x150, 0x136, 0x305, 0x1fa, 0x3c9, 0x3af, 0x19c, 164 0x031, 0x202, 0x264, 0x057, 0x2a8, 0x09b, 0x0fd, 0x2ce,
162 0x053, 0x260, 0x206, 0x035, 0x2ca, 0x0f9, 0x09f, 0x2ac, 0x352, 0x161, 0x107, 0x334, 0x1cb, 0x3f8, 0x39e, 0x1ad, 165 0x330, 0x103, 0x165, 0x356, 0x1a9, 0x39a, 0x3fc, 0x1cf,
163 0x0c4, 0x2f7, 0x291, 0x0a2, 0x25d, 0x06e, 0x008, 0x23b, 0x3c5, 0x1f6, 0x190, 0x3a3, 0x15c, 0x36f, 0x309, 0x13a, 166 0x062, 0x251, 0x237, 0x004, 0x2fb, 0x0c8, 0x0ae, 0x29d,
164 0x0f5, 0x2c6, 0x2a0, 0x093, 0x26c, 0x05f, 0x039, 0x20a, 0x3f4, 0x1c7, 0x1a1, 0x392, 0x16d, 0x35e, 0x338, 0x10b, 167 0x363, 0x150, 0x136, 0x305, 0x1fa, 0x3c9, 0x3af, 0x19c,
165 0x0a6, 0x295, 0x2f3, 0x0c0, 0x23f, 0x00c, 0x06a, 0x259, 0x3a7, 0x194, 0x1f2, 0x3c1, 0x13e, 0x30d, 0x36b, 0x158, 168 0x053, 0x260, 0x206, 0x035, 0x2ca, 0x0f9, 0x09f, 0x2ac,
166 0x097, 0x2a4, 0x2c2, 0x0f1, 0x20e, 0x03d, 0x05b, 0x268, 0x396, 0x1a5, 0x1c3, 0x3f0, 0x10f, 0x33c, 0x35a, 0x169, 169 0x352, 0x161, 0x107, 0x334, 0x1cb, 0x3f8, 0x39e, 0x1ad,
167 0x188, 0x3bb, 0x3dd, 0x1ee, 0x311, 0x122, 0x144, 0x377, 0x289, 0x0ba, 0x0dc, 0x2ef, 0x010, 0x223, 0x245, 0x076, 170 0x0c4, 0x2f7, 0x291, 0x0a2, 0x25d, 0x06e, 0x008, 0x23b,
168 0x1b9, 0x38a, 0x3ec, 0x1df, 0x320, 0x113, 0x175, 0x346, 0x2b8, 0x08b, 0x0ed, 0x2de, 0x021, 0x212, 0x274, 0x047, 171 0x3c5, 0x1f6, 0x190, 0x3a3, 0x15c, 0x36f, 0x309, 0x13a,
169 0x1ea, 0x3d9, 0x3bf, 0x18c, 0x373, 0x140, 0x126, 0x315, 0x2eb, 0x0d8, 0x0be, 0x28d, 0x072, 0x241, 0x227, 0x014, 172 0x0f5, 0x2c6, 0x2a0, 0x093, 0x26c, 0x05f, 0x039, 0x20a,
170 0x1db, 0x3e8, 0x38e, 0x1bd, 0x342, 0x171, 0x117, 0x324, 0x2da, 0x0e9, 0x08f, 0x2bc, 0x043, 0x270, 0x216, 0x025, 173 0x3f4, 0x1c7, 0x1a1, 0x392, 0x16d, 0x35e, 0x338, 0x10b,
171 0x14c, 0x37f, 0x319, 0x12a, 0x3d5, 0x1e6, 0x180, 0x3b3, 0x24d, 0x07e, 0x018, 0x22b, 0x0d4, 0x2e7, 0x281, 0x0b2, 174 0x0a6, 0x295, 0x2f3, 0x0c0, 0x23f, 0x00c, 0x06a, 0x259,
172 0x17d, 0x34e, 0x328, 0x11b, 0x3e4, 0x1d7, 0x1b1, 0x382, 0x27c, 0x04f, 0x029, 0x21a, 0x0e5, 0x2d6, 0x2b0, 0x083, 175 0x3a7, 0x194, 0x1f2, 0x3c1, 0x13e, 0x30d, 0x36b, 0x158,
173 0x12e, 0x31d, 0x37b, 0x148, 0x3b7, 0x184, 0x1e2, 0x3d1, 0x22f, 0x01c, 0x07a, 0x249, 0x0b6, 0x285, 0x2e3, 0x0d0, 176 0x097, 0x2a4, 0x2c2, 0x0f1, 0x20e, 0x03d, 0x05b, 0x268,
174 0x11f, 0x32c, 0x34a, 0x179, 0x386, 0x1b5, 0x1d3, 0x3e0, 0x21e, 0x02d, 0x04b, 0x278, 0x087, 0x2b4, 0x2d2, 0x0e1, 177 0x396, 0x1a5, 0x1c3, 0x3f0, 0x10f, 0x33c, 0x35a, 0x169,
178 0x188, 0x3bb, 0x3dd, 0x1ee, 0x311, 0x122, 0x144, 0x377,
179 0x289, 0x0ba, 0x0dc, 0x2ef, 0x010, 0x223, 0x245, 0x076,
180 0x1b9, 0x38a, 0x3ec, 0x1df, 0x320, 0x113, 0x175, 0x346,
181 0x2b8, 0x08b, 0x0ed, 0x2de, 0x021, 0x212, 0x274, 0x047,
182 0x1ea, 0x3d9, 0x3bf, 0x18c, 0x373, 0x140, 0x126, 0x315,
183 0x2eb, 0x0d8, 0x0be, 0x28d, 0x072, 0x241, 0x227, 0x014,
184 0x1db, 0x3e8, 0x38e, 0x1bd, 0x342, 0x171, 0x117, 0x324,
185 0x2da, 0x0e9, 0x08f, 0x2bc, 0x043, 0x270, 0x216, 0x025,
186 0x14c, 0x37f, 0x319, 0x12a, 0x3d5, 0x1e6, 0x180, 0x3b3,
187 0x24d, 0x07e, 0x018, 0x22b, 0x0d4, 0x2e7, 0x281, 0x0b2,
188 0x17d, 0x34e, 0x328, 0x11b, 0x3e4, 0x1d7, 0x1b1, 0x382,
189 0x27c, 0x04f, 0x029, 0x21a, 0x0e5, 0x2d6, 0x2b0, 0x083,
190 0x12e, 0x31d, 0x37b, 0x148, 0x3b7, 0x184, 0x1e2, 0x3d1,
191 0x22f, 0x01c, 0x07a, 0x249, 0x0b6, 0x285, 0x2e3, 0x0d0,
192 0x11f, 0x32c, 0x34a, 0x179, 0x386, 0x1b5, 0x1d3, 0x3e0,
193 0x21e, 0x02d, 0x04b, 0x278, 0x087, 0x2b4, 0x2d2, 0x0e1,
175}; 194};
176 195
177#define CRC10_INITFCS 0x000 // Initial FCS value 196#define CRC10_INITFCS 0x000 /* Initial FCS value */
178#define CRC10_GOODFCS 0x000 // Good final FCS value 197#define CRC10_GOODFCS 0x000 /* Good final FCS value */
179#define CRC10_FCS(fcs, c) ( (((fcs) << 8) & 0x3ff) ^ crc10_table[((fcs) >> 2) & 0xff] ^ (c)) 198#define CRC10_FCS(fcs, c) ((((fcs) << 8) & 0x3ff) ^ crc10_table[((fcs) >> 2) & 0xff] ^ (c))
180 199
181/** 200/**
182 * fcs_compute10 - memcpy and calculate 10 bit CRC across buffer 201 * fcs_compute10 - memcpy and calculate 10 bit CRC across buffer
183 * @sp: pointer to buffer 202 * @sp: pointer to buffer
184 * @len: number of bytes 203 * @len: number of bytes
@@ -187,13 +206,13 @@ static const __u16 crc10_table[256] = {
187 * Perform a memcpy and calculate fcs using ppp 10bit CRC algorithm. Return 206 * Perform a memcpy and calculate fcs using ppp 10bit CRC algorithm. Return
188 * new 10 bit FCS. 207 * new 10 bit FCS.
189 */ 208 */
190static __u16 __inline__ fcs_compute10 (unsigned char *sp, int len, __u16 fcs) 209static __u16 __inline__ fcs_compute10(unsigned char *sp, int len, __u16 fcs)
191{ 210{
192 for (; len-- > 0; fcs = CRC10_FCS (fcs, *sp++)); 211 for (; len-- > 0; fcs = CRC10_FCS(fcs, *sp++));
193 return fcs; 212 return fcs;
194} 213}
195 214
196static void safe_read_bulk_callback (struct urb *urb) 215static void safe_read_bulk_callback(struct urb *urb)
197{ 216{
198 struct usb_serial_port *port = urb->context; 217 struct usb_serial_port *port = urb->context;
199 unsigned char *data = urb->transfer_buffer; 218 unsigned char *data = urb->transfer_buffer;
@@ -201,7 +220,7 @@ static void safe_read_bulk_callback (struct urb *urb)
201 int result; 220 int result;
202 int status = urb->status; 221 int status = urb->status;
203 222
204 dbg ("%s", __func__); 223 dbg("%s", __func__);
205 224
206 if (status) { 225 if (status) {
207 dbg("%s - nonzero read bulk status received: %d", 226 dbg("%s - nonzero read bulk status received: %d",
@@ -209,76 +228,82 @@ static void safe_read_bulk_callback (struct urb *urb)
209 return; 228 return;
210 } 229 }
211 230
212 dbg ("safe_read_bulk_callback length: %d", port->read_urb->actual_length); 231 dbg("safe_read_bulk_callback length: %d",
232 port->read_urb->actual_length);
213#ifdef ECHO_RCV 233#ifdef ECHO_RCV
214 { 234 {
215 int i; 235 int i;
216 unsigned char *cp = port->read_urb->transfer_buffer; 236 unsigned char *cp = port->read_urb->transfer_buffer;
217 for (i = 0; i < port->read_urb->actual_length; i++) { 237 for (i = 0; i < port->read_urb->actual_length; i++) {
218 if ((i % 32) == 0) { 238 if ((i % 32) == 0)
219 printk ("\nru[%02x] ", i); 239 printk("\nru[%02x] ", i);
220 } 240 printk("%02x ", *cp++);
221 printk ("%02x ", *cp++);
222 } 241 }
223 printk ("\n"); 242 printk("\n");
224 } 243 }
225#endif 244#endif
226 if (safe) { 245 if (safe) {
227 __u16 fcs; 246 __u16 fcs;
228 if (!(fcs = fcs_compute10 (data, length, CRC10_INITFCS))) { 247 fcs = fcs_compute10(data, length, CRC10_INITFCS);
248 if (!fcs) {
229 int actual_length = data[length - 2] >> 2; 249 int actual_length = data[length - 2] >> 2;
230 if (actual_length <= (length - 2)) { 250 if (actual_length <= (length - 2)) {
231 info ("%s - actual: %d", __func__, actual_length); 251 info("%s - actual: %d", __func__,
232 tty_insert_flip_string(port->tty, data, actual_length); 252 actual_length);
233 tty_flip_buffer_push (port->tty); 253 tty_insert_flip_string(port->port.tty,
254 data, actual_length);
255 tty_flip_buffer_push(port->port.tty);
234 } else { 256 } else {
235 err ("%s - inconsistent lengths %d:%d", __func__, 257 err("%s - inconsistent lengths %d:%d",
236 actual_length, length); 258 __func__, actual_length, length);
237 } 259 }
238 } else { 260 } else {
239 err ("%s - bad CRC %x", __func__, fcs); 261 err("%s - bad CRC %x", __func__, fcs);
240 } 262 }
241 } else { 263 } else {
242 tty_insert_flip_string(port->tty, data, length); 264 tty_insert_flip_string(port->port.tty, data, length);
243 tty_flip_buffer_push (port->tty); 265 tty_flip_buffer_push(port->port.tty);
244 } 266 }
245 267
246 /* Continue trying to always read */ 268 /* Continue trying to always read */
247 usb_fill_bulk_urb (urb, port->serial->dev, 269 usb_fill_bulk_urb(urb, port->serial->dev,
248 usb_rcvbulkpipe (port->serial->dev, port->bulk_in_endpointAddress), 270 usb_rcvbulkpipe(port->serial->dev,
249 urb->transfer_buffer, urb->transfer_buffer_length, 271 port->bulk_in_endpointAddress),
250 safe_read_bulk_callback, port); 272 urb->transfer_buffer, urb->transfer_buffer_length,
251 273 safe_read_bulk_callback, port);
252 if ((result = usb_submit_urb (urb, GFP_ATOMIC))) { 274
253 err ("%s - failed resubmitting read urb, error %d", __func__, result); 275 result = usb_submit_urb(urb, GFP_ATOMIC);
276 if (result)
277 err("%s - failed resubmitting read urb, error %d",
278 __func__, result);
254 /* FIXME: Need a mechanism to retry later if this happens */ 279 /* FIXME: Need a mechanism to retry later if this happens */
255 }
256} 280}
257 281
258static int safe_write (struct usb_serial_port *port, const unsigned char *buf, int count) 282static int safe_write(struct tty_struct *tty, struct usb_serial_port *port,
283 const unsigned char *buf, int count)
259{ 284{
260 unsigned char *data; 285 unsigned char *data;
261 int result; 286 int result;
262 int i; 287 int i;
263 int packet_length; 288 int packet_length;
264 289
265 dbg ("safe_write port: %p %d urb: %p count: %d", port, port->number, port->write_urb, 290 dbg("safe_write port: %p %d urb: %p count: %d",
266 count); 291 port, port->number, port->write_urb, count);
267 292
268 if (!port->write_urb) { 293 if (!port->write_urb) {
269 dbg ("%s - write urb NULL", __func__); 294 dbg("%s - write urb NULL", __func__);
270 return 0; 295 return 0;
271 } 296 }
272 297
273 dbg ("safe_write write_urb: %d transfer_buffer_length", 298 dbg("safe_write write_urb: %d transfer_buffer_length",
274 port->write_urb->transfer_buffer_length); 299 port->write_urb->transfer_buffer_length);
275 300
276 if (!port->write_urb->transfer_buffer_length) { 301 if (!port->write_urb->transfer_buffer_length) {
277 dbg ("%s - write urb transfer_buffer_length zero", __func__); 302 dbg("%s - write urb transfer_buffer_length zero", __func__);
278 return 0; 303 return 0;
279 } 304 }
280 if (count == 0) { 305 if (count == 0) {
281 dbg ("%s - write request of 0 bytes", __func__); 306 dbg("%s - write request of 0 bytes", __func__);
282 return 0; 307 return 0;
283 } 308 }
284 spin_lock_bh(&port->lock); 309 spin_lock_bh(&port->lock);
@@ -290,85 +315,85 @@ static int safe_write (struct usb_serial_port *port, const unsigned char *buf, i
290 port->write_urb_busy = 1; 315 port->write_urb_busy = 1;
291 spin_unlock_bh(&port->lock); 316 spin_unlock_bh(&port->lock);
292 317
293 packet_length = port->bulk_out_size; // get max packetsize 318 packet_length = port->bulk_out_size; /* get max packetsize */
294 319
295 i = packet_length - (safe ? 2 : 0); // get bytes to send 320 i = packet_length - (safe ? 2 : 0); /* get bytes to send */
296 count = (count > i) ? i : count; 321 count = (count > i) ? i : count;
297 322
298 323
299 // get the data into the transfer buffer 324 /* get the data into the transfer buffer */
300 data = port->write_urb->transfer_buffer; 325 data = port->write_urb->transfer_buffer;
301 memset (data, '0', packet_length); 326 memset(data, '0', packet_length);
302 327
303 memcpy (data, buf, count); 328 memcpy(data, buf, count);
304 329
305 if (safe) { 330 if (safe) {
306 __u16 fcs; 331 __u16 fcs;
307 332
308 // pad if necessary 333 /* pad if necessary */
309 if (!padded) { 334 if (!padded)
310 packet_length = count + 2; 335 packet_length = count + 2;
311 } 336 /* set count */
312 // set count
313 data[packet_length - 2] = count << 2; 337 data[packet_length - 2] = count << 2;
314 data[packet_length - 1] = 0; 338 data[packet_length - 1] = 0;
315 339
316 // compute fcs and insert into trailer 340 /* compute fcs and insert into trailer */
317 fcs = fcs_compute10 (data, packet_length, CRC10_INITFCS); 341 fcs = fcs_compute10(data, packet_length, CRC10_INITFCS);
318 data[packet_length - 2] |= fcs >> 8; 342 data[packet_length - 2] |= fcs >> 8;
319 data[packet_length - 1] |= fcs & 0xff; 343 data[packet_length - 1] |= fcs & 0xff;
320 344
321 // set length to send 345 /* set length to send */
322 port->write_urb->transfer_buffer_length = packet_length; 346 port->write_urb->transfer_buffer_length = packet_length;
323 } else { 347 } else {
324 port->write_urb->transfer_buffer_length = count; 348 port->write_urb->transfer_buffer_length = count;
325 } 349 }
326 350
327 usb_serial_debug_data(debug, &port->dev, __func__, count, port->write_urb->transfer_buffer); 351 usb_serial_debug_data(debug, &port->dev, __func__, count,
352 port->write_urb->transfer_buffer);
328#ifdef ECHO_TX 353#ifdef ECHO_TX
329 { 354 {
330 int i; 355 int i;
331 unsigned char *cp = port->write_urb->transfer_buffer; 356 unsigned char *cp = port->write_urb->transfer_buffer;
332 for (i = 0; i < port->write_urb->transfer_buffer_length; i++) { 357 for (i = 0; i < port->write_urb->transfer_buffer_length; i++) {
333 if ((i % 32) == 0) { 358 if ((i % 32) == 0)
334 printk ("\nsu[%02x] ", i); 359 printk("\nsu[%02x] ", i);
335 } 360 printk("%02x ", *cp++);
336 printk ("%02x ", *cp++);
337 } 361 }
338 printk ("\n"); 362 printk("\n");
339 } 363 }
340#endif 364#endif
341 port->write_urb->dev = port->serial->dev; 365 port->write_urb->dev = port->serial->dev;
342 if ((result = usb_submit_urb (port->write_urb, GFP_KERNEL))) { 366 result = usb_submit_urb(port->write_urb, GFP_KERNEL);
367 if (result) {
343 port->write_urb_busy = 0; 368 port->write_urb_busy = 0;
344 err ("%s - failed submitting write urb, error %d", __func__, result); 369 err("%s - failed submitting write urb, error %d",
370 __func__, result);
345 return 0; 371 return 0;
346 } 372 }
347 dbg ("%s urb: %p submitted", __func__, port->write_urb); 373 dbg("%s urb: %p submitted", __func__, port->write_urb);
348 374
349 return (count); 375 return count;
350} 376}
351 377
352static int safe_write_room (struct usb_serial_port *port) 378static int safe_write_room(struct tty_struct *tty)
353{ 379{
380 struct usb_serial_port *port = tty->driver_data;
354 int room = 0; /* Default: no room */ 381 int room = 0; /* Default: no room */
355 unsigned long flags; 382 unsigned long flags;
356 383
357 dbg ("%s", __func__); 384 dbg("%s", __func__);
358 385
359 spin_lock_irqsave(&port->lock, flags); 386 spin_lock_irqsave(&port->lock, flags);
360 if (port->write_urb_busy) 387 if (port->write_urb_busy)
361 room = port->bulk_out_size - (safe ? 2 : 0); 388 room = port->bulk_out_size - (safe ? 2 : 0);
362 spin_unlock_irqrestore(&port->lock, flags); 389 spin_unlock_irqrestore(&port->lock, flags);
363 390
364 if (room) { 391 if (room)
365 dbg ("safe_write_room returns %d", room); 392 dbg("safe_write_room returns %d", room);
366 }
367
368 return room; 393 return room;
369} 394}
370 395
371static int safe_startup (struct usb_serial *serial) 396static int safe_startup(struct usb_serial *serial)
372{ 397{
373 switch (serial->interface->cur_altsetting->desc.bInterfaceProtocol) { 398 switch (serial->interface->cur_altsetting->desc.bInterfaceProtocol) {
374 case LINEO_SAFESERIAL_CRC: 399 case LINEO_SAFESERIAL_CRC:
@@ -396,17 +421,18 @@ static struct usb_serial_driver safe_device = {
396 .attach = safe_startup, 421 .attach = safe_startup,
397}; 422};
398 423
399static int __init safe_init (void) 424static int __init safe_init(void)
400{ 425{
401 int i, retval; 426 int i, retval;
402 427
403 info (DRIVER_VERSION " " DRIVER_AUTHOR); 428 info(DRIVER_VERSION " " DRIVER_AUTHOR);
404 info (DRIVER_DESC); 429 info(DRIVER_DESC);
405 info ("vendor: %x product: %x safe: %d padded: %d\n", vendor, product, safe, padded); 430 info("vendor: %x product: %x safe: %d padded: %d\n",
431 vendor, product, safe, padded);
406 432
407 // if we have vendor / product parameters patch them into id list 433 /* if we have vendor / product parameters patch them into id list */
408 if (vendor || product) { 434 if (vendor || product) {
409 info ("vendor: %x product: %x\n", vendor, product); 435 info("vendor: %x product: %x\n", vendor, product);
410 436
411 for (i = 0; i < ARRAY_SIZE(id_table); i++) { 437 for (i = 0; i < ARRAY_SIZE(id_table); i++) {
412 if (!id_table[i].idVendor && !id_table[i].idProduct) { 438 if (!id_table[i].idVendor && !id_table[i].idProduct) {
@@ -431,11 +457,11 @@ failed_usb_serial_register:
431 return retval; 457 return retval;
432} 458}
433 459
434static void __exit safe_exit (void) 460static void __exit safe_exit(void)
435{ 461{
436 usb_deregister (&safe_driver); 462 usb_deregister(&safe_driver);
437 usb_serial_deregister (&safe_device); 463 usb_serial_deregister(&safe_device);
438} 464}
439 465
440module_init (safe_init); 466module_init(safe_init);
441module_exit (safe_exit); 467module_exit(safe_exit);
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index 29074c1ba22b..2f6f1523ec56 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -250,7 +250,8 @@ struct sierra_port_private {
250 int ri_state; 250 int ri_state;
251}; 251};
252 252
253static int sierra_send_setup(struct usb_serial_port *port) 253static int sierra_send_setup(struct tty_struct *tty,
254 struct usb_serial_port *port)
254{ 255{
255 struct usb_serial *serial = port->serial; 256 struct usb_serial *serial = port->serial;
256 struct sierra_port_private *portdata; 257 struct sierra_port_private *portdata;
@@ -260,7 +261,7 @@ static int sierra_send_setup(struct usb_serial_port *port)
260 261
261 portdata = usb_get_serial_port_data(port); 262 portdata = usb_get_serial_port_data(port);
262 263
263 if (port->tty) { 264 if (tty) {
264 int val = 0; 265 int val = 0;
265 if (portdata->dtr_state) 266 if (portdata->dtr_state)
266 val |= 0x01; 267 val |= 0x01;
@@ -284,32 +285,17 @@ static int sierra_send_setup(struct usb_serial_port *port)
284 return 0; 285 return 0;
285} 286}
286 287
287static void sierra_rx_throttle(struct usb_serial_port *port) 288static void sierra_set_termios(struct tty_struct *tty,
289 struct usb_serial_port *port, struct ktermios *old_termios)
288{ 290{
289 dbg("%s", __func__); 291 dbg("%s", __func__);
292 tty_termios_copy_hw(tty->termios, old_termios);
293 sierra_send_setup(tty, port);
290} 294}
291 295
292static void sierra_rx_unthrottle(struct usb_serial_port *port) 296static int sierra_tiocmget(struct tty_struct *tty, struct file *file)
293{
294 dbg("%s", __func__);
295}
296
297static void sierra_break_ctl(struct usb_serial_port *port, int break_state)
298{
299 /* Unfortunately, I don't know how to send a break */
300 dbg("%s", __func__);
301}
302
303static void sierra_set_termios(struct usb_serial_port *port,
304 struct ktermios *old_termios)
305{
306 dbg("%s", __func__);
307 tty_termios_copy_hw(port->tty->termios, old_termios);
308 sierra_send_setup(port);
309}
310
311static int sierra_tiocmget(struct usb_serial_port *port, struct file *file)
312{ 297{
298 struct usb_serial_port *port = tty->driver_data;
313 unsigned int value; 299 unsigned int value;
314 struct sierra_port_private *portdata; 300 struct sierra_port_private *portdata;
315 301
@@ -325,9 +311,10 @@ static int sierra_tiocmget(struct usb_serial_port *port, struct file *file)
325 return value; 311 return value;
326} 312}
327 313
328static int sierra_tiocmset(struct usb_serial_port *port, struct file *file, 314static int sierra_tiocmset(struct tty_struct *tty, struct file *file,
329 unsigned int set, unsigned int clear) 315 unsigned int set, unsigned int clear)
330{ 316{
317 struct usb_serial_port *port = tty->driver_data;
331 struct sierra_port_private *portdata; 318 struct sierra_port_private *portdata;
332 319
333 portdata = usb_get_serial_port_data(port); 320 portdata = usb_get_serial_port_data(port);
@@ -341,13 +328,7 @@ static int sierra_tiocmset(struct usb_serial_port *port, struct file *file,
341 portdata->rts_state = 0; 328 portdata->rts_state = 0;
342 if (clear & TIOCM_DTR) 329 if (clear & TIOCM_DTR)
343 portdata->dtr_state = 0; 330 portdata->dtr_state = 0;
344 return sierra_send_setup(port); 331 return sierra_send_setup(tty, port);
345}
346
347static int sierra_ioctl(struct usb_serial_port *port, struct file *file,
348 unsigned int cmd, unsigned long arg)
349{
350 return -ENOIOCTLCMD;
351} 332}
352 333
353static void sierra_outdat_callback(struct urb *urb) 334static void sierra_outdat_callback(struct urb *urb)
@@ -374,8 +355,8 @@ static void sierra_outdat_callback(struct urb *urb)
374} 355}
375 356
376/* Write */ 357/* Write */
377static int sierra_write(struct usb_serial_port *port, 358static int sierra_write(struct tty_struct *tty, struct usb_serial_port *port,
378 const unsigned char *buf, int count) 359 const unsigned char *buf, int count)
379{ 360{
380 struct sierra_port_private *portdata = usb_get_serial_port_data(port); 361 struct sierra_port_private *portdata = usb_get_serial_port_data(port);
381 struct usb_serial *serial = port->serial; 362 struct usb_serial *serial = port->serial;
@@ -463,7 +444,7 @@ static void sierra_indat_callback(struct urb *urb)
463 dbg("%s: nonzero status: %d on endpoint %02x.", 444 dbg("%s: nonzero status: %d on endpoint %02x.",
464 __func__, status, endpoint); 445 __func__, status, endpoint);
465 } else { 446 } else {
466 tty = port->tty; 447 tty = port->port.tty;
467 if (urb->actual_length) { 448 if (urb->actual_length) {
468 tty_buffer_request_room(tty, urb->actual_length); 449 tty_buffer_request_room(tty, urb->actual_length);
469 tty_insert_flip_string(tty, data, urb->actual_length); 450 tty_insert_flip_string(tty, data, urb->actual_length);
@@ -473,7 +454,7 @@ static void sierra_indat_callback(struct urb *urb)
473 } 454 }
474 455
475 /* Resubmit urb so we continue receiving */ 456 /* Resubmit urb so we continue receiving */
476 if (port->open_count && status != -ESHUTDOWN) { 457 if (port->port.count && status != -ESHUTDOWN) {
477 err = usb_submit_urb(urb, GFP_ATOMIC); 458 err = usb_submit_urb(urb, GFP_ATOMIC);
478 if (err) 459 if (err)
479 dev_err(&port->dev, "resubmit read urb failed." 460 dev_err(&port->dev, "resubmit read urb failed."
@@ -517,9 +498,9 @@ static void sierra_instat_callback(struct urb *urb)
517 portdata->dsr_state = ((signals & 0x02) ? 1 : 0); 498 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
518 portdata->ri_state = ((signals & 0x08) ? 1 : 0); 499 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
519 500
520 if (port->tty && !C_CLOCAL(port->tty) && 501 if (port->port.tty && !C_CLOCAL(port->port.tty) &&
521 old_dcd_state && !portdata->dcd_state) 502 old_dcd_state && !portdata->dcd_state)
522 tty_hangup(port->tty); 503 tty_hangup(port->port.tty);
523 } else { 504 } else {
524 dbg("%s: type %x req %x", __func__, 505 dbg("%s: type %x req %x", __func__,
525 req_pkt->bRequestType, req_pkt->bRequest); 506 req_pkt->bRequestType, req_pkt->bRequest);
@@ -537,8 +518,9 @@ static void sierra_instat_callback(struct urb *urb)
537 } 518 }
538} 519}
539 520
540static int sierra_write_room(struct usb_serial_port *port) 521static int sierra_write_room(struct tty_struct *tty)
541{ 522{
523 struct usb_serial_port *port = tty->driver_data;
542 struct sierra_port_private *portdata = usb_get_serial_port_data(port); 524 struct sierra_port_private *portdata = usb_get_serial_port_data(port);
543 unsigned long flags; 525 unsigned long flags;
544 526
@@ -557,22 +539,8 @@ static int sierra_write_room(struct usb_serial_port *port)
557 return 2048; 539 return 2048;
558} 540}
559 541
560static int sierra_chars_in_buffer(struct usb_serial_port *port) 542static int sierra_open(struct tty_struct *tty,
561{ 543 struct usb_serial_port *port, struct file *filp)
562 dbg("%s - port %d", __func__, port->number);
563
564 /*
565 * We can't really account for how much data we
566 * have sent out, but hasn't made it through to the
567 * device as we can't see the backend here, so just
568 * tell the tty layer that everything is flushed.
569 *
570 * FIXME: should walk the outstanding urbs info
571 */
572 return 0;
573}
574
575static int sierra_open(struct usb_serial_port *port, struct file *filp)
576{ 544{
577 struct sierra_port_private *portdata; 545 struct sierra_port_private *portdata;
578 struct usb_serial *serial = port->serial; 546 struct usb_serial *serial = port->serial;
@@ -612,9 +580,10 @@ static int sierra_open(struct usb_serial_port *port, struct file *filp)
612 } 580 }
613 } 581 }
614 582
615 port->tty->low_latency = 1; 583 if (tty)
584 tty->low_latency = 1;
616 585
617 sierra_send_setup(port); 586 sierra_send_setup(tty, port);
618 587
619 /* start up the interrupt endpoint if we have one */ 588 /* start up the interrupt endpoint if we have one */
620 if (port->interrupt_in_urb) { 589 if (port->interrupt_in_urb) {
@@ -626,7 +595,8 @@ static int sierra_open(struct usb_serial_port *port, struct file *filp)
626 return 0; 595 return 0;
627} 596}
628 597
629static void sierra_close(struct usb_serial_port *port, struct file *filp) 598static void sierra_close(struct tty_struct *tty,
599 struct usb_serial_port *port, struct file *filp)
630{ 600{
631 int i; 601 int i;
632 struct usb_serial *serial = port->serial; 602 struct usb_serial *serial = port->serial;
@@ -641,7 +611,7 @@ static void sierra_close(struct usb_serial_port *port, struct file *filp)
641 if (serial->dev) { 611 if (serial->dev) {
642 mutex_lock(&serial->disc_mutex); 612 mutex_lock(&serial->disc_mutex);
643 if (!serial->disconnected) 613 if (!serial->disconnected)
644 sierra_send_setup(port); 614 sierra_send_setup(tty, port);
645 mutex_unlock(&serial->disc_mutex); 615 mutex_unlock(&serial->disc_mutex);
646 616
647 /* Stop reading/writing urbs */ 617 /* Stop reading/writing urbs */
@@ -651,7 +621,7 @@ static void sierra_close(struct usb_serial_port *port, struct file *filp)
651 621
652 usb_kill_urb(port->interrupt_in_urb); 622 usb_kill_urb(port->interrupt_in_urb);
653 623
654 port->tty = NULL; 624 port->port.tty = NULL; /* FIXME */
655} 625}
656 626
657static int sierra_startup(struct usb_serial *serial) 627static int sierra_startup(struct usb_serial *serial)
@@ -754,12 +724,7 @@ static struct usb_serial_driver sierra_device = {
754 .close = sierra_close, 724 .close = sierra_close,
755 .write = sierra_write, 725 .write = sierra_write,
756 .write_room = sierra_write_room, 726 .write_room = sierra_write_room,
757 .chars_in_buffer = sierra_chars_in_buffer,
758 .throttle = sierra_rx_throttle,
759 .unthrottle = sierra_rx_unthrottle,
760 .ioctl = sierra_ioctl,
761 .set_termios = sierra_set_termios, 727 .set_termios = sierra_set_termios,
762 .break_ctl = sierra_break_ctl,
763 .tiocmget = sierra_tiocmget, 728 .tiocmget = sierra_tiocmget,
764 .tiocmset = sierra_tiocmset, 729 .tiocmset = sierra_tiocmset,
765 .attach = sierra_startup, 730 .attach = sierra_startup,
@@ -792,7 +757,7 @@ failed_device_register:
792 757
793static void __exit sierra_exit(void) 758static void __exit sierra_exit(void)
794{ 759{
795 usb_deregister (&sierra_driver); 760 usb_deregister(&sierra_driver);
796 usb_serial_deregister(&sierra_device); 761 usb_serial_deregister(&sierra_device);
797} 762}
798 763
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
index 55b2570b8b8b..283cf6b36b2c 100644
--- a/drivers/usb/serial/spcp8x5.c
+++ b/drivers/usb/serial/spcp8x5.c
@@ -208,7 +208,7 @@ static inline unsigned int ringbuf_avail_data(struct ringbuf *pb)
208{ 208{
209 if (pb == NULL) 209 if (pb == NULL)
210 return 0; 210 return 0;
211 return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size); 211 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
212} 212}
213 213
214/* get the number of space in the pipo */ 214/* get the number of space in the pipo */
@@ -216,7 +216,7 @@ static inline unsigned int ringbuf_avail_space(struct ringbuf *pb)
216{ 216{
217 if (pb == NULL) 217 if (pb == NULL)
218 return 0; 218 return 0;
219 return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size); 219 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
220} 220}
221 221
222/* put count data into pipo */ 222/* put count data into pipo */
@@ -448,7 +448,8 @@ static void spcp8x5_set_workMode(struct usb_device *dev, u16 value,
448 448
449/* close the serial port. We should wait for data sending to device 1st and 449/* close the serial port. We should wait for data sending to device 1st and
450 * then kill all urb. */ 450 * then kill all urb. */
451static void spcp8x5_close(struct usb_serial_port *port, struct file *filp) 451static void spcp8x5_close(struct tty_struct *tty,
452 struct usb_serial_port *port, struct file *filp)
452{ 453{
453 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 454 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
454 unsigned long flags; 455 unsigned long flags;
@@ -464,7 +465,7 @@ static void spcp8x5_close(struct usb_serial_port *port, struct file *filp)
464 spin_lock_irqsave(&priv->lock, flags); 465 spin_lock_irqsave(&priv->lock, flags);
465 timeout = SPCP8x5_CLOSING_WAIT; 466 timeout = SPCP8x5_CLOSING_WAIT;
466 init_waitqueue_entry(&wait, current); 467 init_waitqueue_entry(&wait, current);
467 add_wait_queue(&port->tty->write_wait, &wait); 468 add_wait_queue(&tty->write_wait, &wait);
468 for (;;) { 469 for (;;) {
469 set_current_state(TASK_INTERRUPTIBLE); 470 set_current_state(TASK_INTERRUPTIBLE);
470 if (ringbuf_avail_data(priv->buf) == 0 || 471 if (ringbuf_avail_data(priv->buf) == 0 ||
@@ -475,7 +476,7 @@ static void spcp8x5_close(struct usb_serial_port *port, struct file *filp)
475 spin_lock_irqsave(&priv->lock, flags); 476 spin_lock_irqsave(&priv->lock, flags);
476 } 477 }
477 set_current_state(TASK_RUNNING); 478 set_current_state(TASK_RUNNING);
478 remove_wait_queue(&port->tty->write_wait, &wait); 479 remove_wait_queue(&tty->write_wait, &wait);
479 480
480 /* clear out any remaining data in the buffer */ 481 /* clear out any remaining data in the buffer */
481 clear_ringbuf(priv->buf); 482 clear_ringbuf(priv->buf);
@@ -486,7 +487,7 @@ static void spcp8x5_close(struct usb_serial_port *port, struct file *filp)
486 * flow control for data rates of 1200 bps or more, for lower rates we 487 * flow control for data rates of 1200 bps or more, for lower rates we
487 * should really know how much data is in the buffer to compute a delay 488 * should really know how much data is in the buffer to compute a delay
488 * that is not unnecessarily long) */ 489 * that is not unnecessarily long) */
489 bps = tty_get_baud_rate(port->tty); 490 bps = tty_get_baud_rate(tty);
490 if (bps > 1200) 491 if (bps > 1200)
491 timeout = max((HZ*2560) / bps, HZ/10); 492 timeout = max((HZ*2560) / bps, HZ/10);
492 else 493 else
@@ -495,8 +496,8 @@ static void spcp8x5_close(struct usb_serial_port *port, struct file *filp)
495 schedule_timeout(timeout); 496 schedule_timeout(timeout);
496 497
497 /* clear control lines */ 498 /* clear control lines */
498 if (port->tty) { 499 if (tty) {
499 c_cflag = port->tty->termios->c_cflag; 500 c_cflag = tty->termios->c_cflag;
500 if (c_cflag & HUPCL) { 501 if (c_cflag & HUPCL) {
501 spin_lock_irqsave(&priv->lock, flags); 502 spin_lock_irqsave(&priv->lock, flags);
502 priv->line_control = 0; 503 priv->line_control = 0;
@@ -518,14 +519,14 @@ static void spcp8x5_close(struct usb_serial_port *port, struct file *filp)
518} 519}
519 520
520/* set the serial param for transfer. we should check if we really need to 521/* set the serial param for transfer. we should check if we really need to
521 * transfer. then if be set flow contorl we should do this too. */ 522 * transfer. if we set flow control we should do this too. */
522static void spcp8x5_set_termios(struct usb_serial_port *port, 523static void spcp8x5_set_termios(struct tty_struct *tty,
523 struct ktermios *old_termios) 524 struct usb_serial_port *port, struct ktermios *old_termios)
524{ 525{
525 struct usb_serial *serial = port->serial; 526 struct usb_serial *serial = port->serial;
526 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 527 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
527 unsigned long flags; 528 unsigned long flags;
528 unsigned int cflag = port->tty->termios->c_cflag; 529 unsigned int cflag = tty->termios->c_cflag;
529 unsigned int old_cflag = old_termios->c_cflag; 530 unsigned int old_cflag = old_termios->c_cflag;
530 unsigned short uartdata; 531 unsigned short uartdata;
531 unsigned char buf[2] = {0, 0}; 532 unsigned char buf[2] = {0, 0};
@@ -533,21 +534,19 @@ static void spcp8x5_set_termios(struct usb_serial_port *port,
533 int i; 534 int i;
534 u8 control; 535 u8 control;
535 536
536 if ((!port->tty) || (!port->tty->termios))
537 return;
538
539 /* for the 1st time call this function */ 537 /* for the 1st time call this function */
540 spin_lock_irqsave(&priv->lock, flags); 538 spin_lock_irqsave(&priv->lock, flags);
541 if (!priv->termios_initialized) { 539 if (!priv->termios_initialized) {
542 *(port->tty->termios) = tty_std_termios; 540 *(tty->termios) = tty_std_termios;
543 port->tty->termios->c_cflag = B115200 | CS8 | CREAD | 541 tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
544 HUPCL | CLOCAL; 542 tty->termios->c_ispeed = 115200;
543 tty->termios->c_ospeed = 115200;
545 priv->termios_initialized = 1; 544 priv->termios_initialized = 1;
546 } 545 }
547 spin_unlock_irqrestore(&priv->lock, flags); 546 spin_unlock_irqrestore(&priv->lock, flags);
548 547
549 /* check that they really want us to change something */ 548 /* check that they really want us to change something */
550 if (!tty_termios_hw_change(port->tty->termios, old_termios)) 549 if (!tty_termios_hw_change(tty->termios, old_termios))
551 return; 550 return;
552 551
553 /* set DTR/RTS active */ 552 /* set DTR/RTS active */
@@ -567,7 +566,7 @@ static void spcp8x5_set_termios(struct usb_serial_port *port,
567 } 566 }
568 567
569 /* Set Baud Rate */ 568 /* Set Baud Rate */
570 baud = tty_get_baud_rate(port->tty);; 569 baud = tty_get_baud_rate(tty);;
571 switch (baud) { 570 switch (baud) {
572 case 300: buf[0] = 0x00; break; 571 case 300: buf[0] = 0x00; break;
573 case 600: buf[0] = 0x01; break; 572 case 600: buf[0] = 0x01; break;
@@ -643,7 +642,8 @@ static void spcp8x5_set_termios(struct usb_serial_port *port,
643 642
644/* open the serial port. do some usb system call. set termios and get the line 643/* open the serial port. do some usb system call. set termios and get the line
645 * status of the device. then submit the read urb */ 644 * status of the device. then submit the read urb */
646static int spcp8x5_open(struct usb_serial_port *port, struct file *filp) 645static int spcp8x5_open(struct tty_struct *tty,
646 struct usb_serial_port *port, struct file *filp)
647{ 647{
648 struct ktermios tmp_termios; 648 struct ktermios tmp_termios;
649 struct usb_serial *serial = port->serial; 649 struct usb_serial *serial = port->serial;
@@ -665,7 +665,7 @@ static int spcp8x5_open(struct usb_serial_port *port, struct file *filp)
665 return ret; 665 return ret;
666 666
667 spin_lock_irqsave(&priv->lock, flags); 667 spin_lock_irqsave(&priv->lock, flags);
668 if (port->tty->termios->c_cflag & CBAUD) 668 if (tty && (tty->termios->c_cflag & CBAUD))
669 priv->line_control = MCR_DTR | MCR_RTS; 669 priv->line_control = MCR_DTR | MCR_RTS;
670 else 670 else
671 priv->line_control = 0; 671 priv->line_control = 0;
@@ -674,8 +674,8 @@ static int spcp8x5_open(struct usb_serial_port *port, struct file *filp)
674 spcp8x5_set_ctrlLine(serial->dev, priv->line_control , priv->type); 674 spcp8x5_set_ctrlLine(serial->dev, priv->line_control , priv->type);
675 675
676 /* Setup termios */ 676 /* Setup termios */
677 if (port->tty) 677 if (tty)
678 spcp8x5_set_termios(port, &tmp_termios); 678 spcp8x5_set_termios(tty, port, &tmp_termios);
679 679
680 spcp8x5_get_msr(serial->dev, &status, priv->type); 680 spcp8x5_get_msr(serial->dev, &status, priv->type);
681 681
@@ -690,7 +690,7 @@ static int spcp8x5_open(struct usb_serial_port *port, struct file *filp)
690 port->read_urb->dev = serial->dev; 690 port->read_urb->dev = serial->dev;
691 ret = usb_submit_urb(port->read_urb, GFP_KERNEL); 691 ret = usb_submit_urb(port->read_urb, GFP_KERNEL);
692 if (ret) { 692 if (ret) {
693 spcp8x5_close(port, NULL); 693 spcp8x5_close(tty, port, NULL);
694 return -EPROTO; 694 return -EPROTO;
695 } 695 }
696 return 0; 696 return 0;
@@ -717,7 +717,7 @@ static void spcp8x5_read_bulk_callback(struct urb *urb)
717 717
718 /* check the urb status */ 718 /* check the urb status */
719 if (urb->status) { 719 if (urb->status) {
720 if (!port->open_count) 720 if (!port->port.count)
721 return; 721 return;
722 if (urb->status == -EPROTO) { 722 if (urb->status == -EPROTO) {
723 /* spcp8x5 mysteriously fails with -EPROTO */ 723 /* spcp8x5 mysteriously fails with -EPROTO */
@@ -755,7 +755,7 @@ static void spcp8x5_read_bulk_callback(struct urb *urb)
755 tty_flag = TTY_FRAME; 755 tty_flag = TTY_FRAME;
756 dev_dbg(&port->dev, "tty_flag = %d\n", tty_flag); 756 dev_dbg(&port->dev, "tty_flag = %d\n", tty_flag);
757 757
758 tty = port->tty; 758 tty = port->port.tty;
759 if (tty && urb->actual_length) { 759 if (tty && urb->actual_length) {
760 tty_buffer_request_room(tty, urb->actual_length + 1); 760 tty_buffer_request_room(tty, urb->actual_length + 1);
761 /* overrun is special, not associated with a char */ 761 /* overrun is special, not associated with a char */
@@ -767,7 +767,7 @@ static void spcp8x5_read_bulk_callback(struct urb *urb)
767 } 767 }
768 768
769 /* Schedule the next read _if_ we are still open */ 769 /* Schedule the next read _if_ we are still open */
770 if (port->open_count) { 770 if (port->port.count) {
771 urb->dev = port->serial->dev; 771 urb->dev = port->serial->dev;
772 result = usb_submit_urb(urb , GFP_ATOMIC); 772 result = usb_submit_urb(urb , GFP_ATOMIC);
773 if (result) 773 if (result)
@@ -866,7 +866,7 @@ static void spcp8x5_write_bulk_callback(struct urb *urb)
866} 866}
867 867
868/* write data to ring buffer. and then start the write transfer */ 868/* write data to ring buffer. and then start the write transfer */
869static int spcp8x5_write(struct usb_serial_port *port, 869static int spcp8x5_write(struct tty_struct *tty, struct usb_serial_port *port,
870 const unsigned char *buf, int count) 870 const unsigned char *buf, int count)
871{ 871{
872 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 872 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
@@ -925,9 +925,10 @@ static int spcp8x5_wait_modem_info(struct usb_serial_port *port,
925 return 0; 925 return 0;
926} 926}
927 927
928static int spcp8x5_ioctl(struct usb_serial_port *port, struct file *file, 928static int spcp8x5_ioctl(struct tty_struct *tty, struct file *file,
929 unsigned int cmd, unsigned long arg) 929 unsigned int cmd, unsigned long arg)
930{ 930{
931 struct usb_serial_port *port = tty->driver_data;
931 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd); 932 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
932 933
933 switch (cmd) { 934 switch (cmd) {
@@ -943,9 +944,10 @@ static int spcp8x5_ioctl(struct usb_serial_port *port, struct file *file,
943 return -ENOIOCTLCMD; 944 return -ENOIOCTLCMD;
944} 945}
945 946
946static int spcp8x5_tiocmset(struct usb_serial_port *port, struct file *file, 947static int spcp8x5_tiocmset(struct tty_struct *tty, struct file *file,
947 unsigned int set, unsigned int clear) 948 unsigned int set, unsigned int clear)
948{ 949{
950 struct usb_serial_port *port = tty->driver_data;
949 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 951 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
950 unsigned long flags; 952 unsigned long flags;
951 u8 control; 953 u8 control;
@@ -965,8 +967,9 @@ static int spcp8x5_tiocmset(struct usb_serial_port *port, struct file *file,
965 return spcp8x5_set_ctrlLine(port->serial->dev, control , priv->type); 967 return spcp8x5_set_ctrlLine(port->serial->dev, control , priv->type);
966} 968}
967 969
968static int spcp8x5_tiocmget(struct usb_serial_port *port, struct file *file) 970static int spcp8x5_tiocmget(struct tty_struct *tty, struct file *file)
969{ 971{
972 struct usb_serial_port *port = tty->driver_data;
970 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 973 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
971 unsigned long flags; 974 unsigned long flags;
972 unsigned int mcr; 975 unsigned int mcr;
@@ -989,8 +992,9 @@ static int spcp8x5_tiocmget(struct usb_serial_port *port, struct file *file)
989} 992}
990 993
991/* get the avail space room in ring buffer */ 994/* get the avail space room in ring buffer */
992static int spcp8x5_write_room(struct usb_serial_port *port) 995static int spcp8x5_write_room(struct tty_struct *tty)
993{ 996{
997 struct usb_serial_port *port = tty->driver_data;
994 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 998 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
995 int room = 0; 999 int room = 0;
996 unsigned long flags; 1000 unsigned long flags;
@@ -1003,8 +1007,9 @@ static int spcp8x5_write_room(struct usb_serial_port *port)
1003} 1007}
1004 1008
1005/* get the number of avail data in write ring buffer */ 1009/* get the number of avail data in write ring buffer */
1006static int spcp8x5_chars_in_buffer(struct usb_serial_port *port) 1010static int spcp8x5_chars_in_buffer(struct tty_struct *tty)
1007{ 1011{
1012 struct usb_serial_port *port = tty->driver_data;
1008 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 1013 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
1009 int chars = 0; 1014 int chars = 0;
1010 unsigned long flags; 1015 unsigned long flags;
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
index a26a629dfc4f..e39c779e4160 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -16,7 +16,7 @@
16 * For questions or problems with this driver, contact Texas Instruments 16 * For questions or problems with this driver, contact Texas Instruments
17 * technical support, or Al Borchers <alborchers@steinerpoint.com>, or 17 * technical support, or Al Borchers <alborchers@steinerpoint.com>, or
18 * Peter Berger <pberger@brimson.com>. 18 * Peter Berger <pberger@brimson.com>.
19 * 19 *
20 * This driver needs this hotplug script in /etc/hotplug/usb/ti_usb_3410_5052 20 * This driver needs this hotplug script in /etc/hotplug/usb/ti_usb_3410_5052
21 * or in /etc/hotplug.d/usb/ti_usb_3410_5052.hotplug to set the device 21 * or in /etc/hotplug.d/usb/ti_usb_3410_5052.hotplug to set the device
22 * configuration. 22 * configuration.
@@ -70,6 +70,7 @@
70 70
71#include <linux/kernel.h> 71#include <linux/kernel.h>
72#include <linux/errno.h> 72#include <linux/errno.h>
73#include <linux/firmware.h>
73#include <linux/init.h> 74#include <linux/init.h>
74#include <linux/slab.h> 75#include <linux/slab.h>
75#include <linux/tty.h> 76#include <linux/tty.h>
@@ -81,7 +82,7 @@
81#include <linux/serial.h> 82#include <linux/serial.h>
82#include <linux/circ_buf.h> 83#include <linux/circ_buf.h>
83#include <linux/mutex.h> 84#include <linux/mutex.h>
84#include <asm/uaccess.h> 85#include <linux/uaccess.h>
85#include <linux/usb.h> 86#include <linux/usb.h>
86#include <linux/usb/serial.h> 87#include <linux/usb/serial.h>
87#include <linux/firmware.h> 88#include <linux/firmware.h>
@@ -149,21 +150,24 @@ struct ti_device {
149 150
150static int ti_startup(struct usb_serial *serial); 151static int ti_startup(struct usb_serial *serial);
151static void ti_shutdown(struct usb_serial *serial); 152static void ti_shutdown(struct usb_serial *serial);
152static int ti_open(struct usb_serial_port *port, struct file *file); 153static int ti_open(struct tty_struct *tty, struct usb_serial_port *port,
153static void ti_close(struct usb_serial_port *port, struct file *file); 154 struct file *file);
154static int ti_write(struct usb_serial_port *port, const unsigned char *data, 155static void ti_close(struct tty_struct *tty, struct usb_serial_port *port,
155 int count); 156 struct file *file);
156static int ti_write_room(struct usb_serial_port *port); 157static int ti_write(struct tty_struct *tty, struct usb_serial_port *port,
157static int ti_chars_in_buffer(struct usb_serial_port *port); 158 const unsigned char *data, int count);
158static void ti_throttle(struct usb_serial_port *port); 159static int ti_write_room(struct tty_struct *tty);
159static void ti_unthrottle(struct usb_serial_port *port); 160static int ti_chars_in_buffer(struct tty_struct *tty);
160static int ti_ioctl(struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg); 161static void ti_throttle(struct tty_struct *tty);
161static void ti_set_termios(struct usb_serial_port *port, 162static void ti_unthrottle(struct tty_struct *tty);
162 struct ktermios *old_termios); 163static int ti_ioctl(struct tty_struct *tty, struct file *file,
163static int ti_tiocmget(struct usb_serial_port *port, struct file *file); 164 unsigned int cmd, unsigned long arg);
164static int ti_tiocmset(struct usb_serial_port *port, struct file *file, 165static void ti_set_termios(struct tty_struct *tty,
165 unsigned int set, unsigned int clear); 166 struct usb_serial_port *port, struct ktermios *old_termios);
166static void ti_break(struct usb_serial_port *port, int break_state); 167static int ti_tiocmget(struct tty_struct *tty, struct file *file);
168static int ti_tiocmset(struct tty_struct *tty, struct file *file,
169 unsigned int set, unsigned int clear);
170static void ti_break(struct tty_struct *tty, int break_state);
167static void ti_interrupt_callback(struct urb *urb); 171static void ti_interrupt_callback(struct urb *urb);
168static void ti_bulk_in_callback(struct urb *urb); 172static void ti_bulk_in_callback(struct urb *urb);
169static void ti_bulk_out_callback(struct urb *urb); 173static void ti_bulk_out_callback(struct urb *urb);
@@ -192,8 +196,7 @@ static int ti_command_in_sync(struct ti_device *tdev, __u8 command,
192static int ti_write_byte(struct ti_device *tdev, unsigned long addr, 196static int ti_write_byte(struct ti_device *tdev, unsigned long addr,
193 __u8 mask, __u8 byte); 197 __u8 mask, __u8 byte);
194 198
195static int ti_download_firmware(struct ti_device *tdev, char *fw_name); 199static int ti_download_firmware(struct ti_device *tdev, int type);
196
197 200
198/* circular buffer */ 201/* circular buffer */
199static struct circ_buf *ti_buf_alloc(void); 202static struct circ_buf *ti_buf_alloc(void);
@@ -325,19 +328,25 @@ module_param(debug, bool, S_IRUGO | S_IWUSR);
325MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes"); 328MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes");
326 329
327module_param(low_latency, bool, S_IRUGO | S_IWUSR); 330module_param(low_latency, bool, S_IRUGO | S_IWUSR);
328MODULE_PARM_DESC(low_latency, "TTY low_latency flag, 0=off, 1=on, default is off"); 331MODULE_PARM_DESC(low_latency,
332 "TTY low_latency flag, 0=off, 1=on, default is off");
329 333
330module_param(closing_wait, int, S_IRUGO | S_IWUSR); 334module_param(closing_wait, int, S_IRUGO | S_IWUSR);
331MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain in close, in .01 secs, default is 4000"); 335MODULE_PARM_DESC(closing_wait,
336 "Maximum wait for data to drain in close, in .01 secs, default is 4000");
332 337
333module_param_array(vendor_3410, ushort, &vendor_3410_count, S_IRUGO); 338module_param_array(vendor_3410, ushort, &vendor_3410_count, S_IRUGO);
334MODULE_PARM_DESC(vendor_3410, "Vendor ids for 3410 based devices, 1-5 short integers"); 339MODULE_PARM_DESC(vendor_3410,
340 "Vendor ids for 3410 based devices, 1-5 short integers");
335module_param_array(product_3410, ushort, &product_3410_count, S_IRUGO); 341module_param_array(product_3410, ushort, &product_3410_count, S_IRUGO);
336MODULE_PARM_DESC(product_3410, "Product ids for 3410 based devices, 1-5 short integers"); 342MODULE_PARM_DESC(product_3410,
343 "Product ids for 3410 based devices, 1-5 short integers");
337module_param_array(vendor_5052, ushort, &vendor_5052_count, S_IRUGO); 344module_param_array(vendor_5052, ushort, &vendor_5052_count, S_IRUGO);
338MODULE_PARM_DESC(vendor_5052, "Vendor ids for 5052 based devices, 1-5 short integers"); 345MODULE_PARM_DESC(vendor_5052,
346 "Vendor ids for 5052 based devices, 1-5 short integers");
339module_param_array(product_5052, ushort, &product_5052_count, S_IRUGO); 347module_param_array(product_5052, ushort, &product_5052_count, S_IRUGO);
340MODULE_PARM_DESC(product_5052, "Product ids for 5052 based devices, 1-5 short integers"); 348MODULE_PARM_DESC(product_5052,
349 "Product ids for 5052 based devices, 1-5 short integers");
341 350
342MODULE_DEVICE_TABLE(usb, ti_id_table_combined); 351MODULE_DEVICE_TABLE(usb, ti_id_table_combined);
343 352
@@ -346,18 +355,18 @@ MODULE_DEVICE_TABLE(usb, ti_id_table_combined);
346 355
347static int __init ti_init(void) 356static int __init ti_init(void)
348{ 357{
349 int i,j; 358 int i, j;
350 int ret; 359 int ret;
351 360
352 /* insert extra vendor and product ids */ 361 /* insert extra vendor and product ids */
353 j = ARRAY_SIZE(ti_id_table_3410) - TI_EXTRA_VID_PID_COUNT - 1; 362 j = ARRAY_SIZE(ti_id_table_3410) - TI_EXTRA_VID_PID_COUNT - 1;
354 for (i=0; i<min(vendor_3410_count,product_3410_count); i++,j++) { 363 for (i = 0; i < min(vendor_3410_count, product_3410_count); i++, j++) {
355 ti_id_table_3410[j].idVendor = vendor_3410[i]; 364 ti_id_table_3410[j].idVendor = vendor_3410[i];
356 ti_id_table_3410[j].idProduct = product_3410[i]; 365 ti_id_table_3410[j].idProduct = product_3410[i];
357 ti_id_table_3410[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE; 366 ti_id_table_3410[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
358 } 367 }
359 j = ARRAY_SIZE(ti_id_table_5052) - TI_EXTRA_VID_PID_COUNT - 1; 368 j = ARRAY_SIZE(ti_id_table_5052) - TI_EXTRA_VID_PID_COUNT - 1;
360 for (i=0; i<min(vendor_5052_count,product_5052_count); i++,j++) { 369 for (i = 0; i < min(vendor_5052_count, product_5052_count); i++, j++) {
361 ti_id_table_5052[j].idVendor = vendor_5052[i]; 370 ti_id_table_5052[j].idVendor = vendor_5052[i];
362 ti_id_table_5052[j].idProduct = product_5052[i]; 371 ti_id_table_5052[j].idProduct = product_5052[i];
363 ti_id_table_5052[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE; 372 ti_id_table_5052[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
@@ -426,15 +435,15 @@ static int ti_startup(struct usb_serial *serial)
426 /* determine device type */ 435 /* determine device type */
427 if (usb_match_id(serial->interface, ti_id_table_3410)) 436 if (usb_match_id(serial->interface, ti_id_table_3410))
428 tdev->td_is_3410 = 1; 437 tdev->td_is_3410 = 1;
429 dbg("%s - device type is %s", __func__, tdev->td_is_3410 ? "3410" : "5052"); 438 dbg("%s - device type is %s", __func__,
439 tdev->td_is_3410 ? "3410" : "5052");
430 440
431 /* if we have only 1 configuration, download firmware */ 441 /* if we have only 1 configuration, download firmware */
432 if (dev->descriptor.bNumConfigurations == 1) { 442 if (dev->descriptor.bNumConfigurations == 1) {
433
434 if (tdev->td_is_3410) 443 if (tdev->td_is_3410)
435 status = ti_download_firmware(tdev, "ti_3410.fw"); 444 status = ti_download_firmware(tdev, 3410);
436 else 445 else
437 status = ti_download_firmware(tdev, "ti_5052.fw"); 446 status = ti_download_firmware(tdev, 5052);
438 if (status) 447 if (status)
439 goto free_tdev; 448 goto free_tdev;
440 449
@@ -446,7 +455,7 @@ static int ti_startup(struct usb_serial *serial)
446 455
447 status = -ENODEV; 456 status = -ENODEV;
448 goto free_tdev; 457 goto free_tdev;
449 } 458 }
450 459
451 /* the second configuration must be set (in sysfs by hotplug script) */ 460 /* the second configuration must be set (in sysfs by hotplug script) */
452 if (dev->actconfig->desc.bConfigurationValue == TI_BOOT_CONFIG) { 461 if (dev->actconfig->desc.bConfigurationValue == TI_BOOT_CONFIG) {
@@ -463,7 +472,8 @@ static int ti_startup(struct usb_serial *serial)
463 goto free_tports; 472 goto free_tports;
464 } 473 }
465 spin_lock_init(&tport->tp_lock); 474 spin_lock_init(&tport->tp_lock);
466 tport->tp_uart_base_addr = (i == 0 ? TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); 475 tport->tp_uart_base_addr = (i == 0 ?
476 TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR);
467 tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0; 477 tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0;
468 tport->tp_closing_wait = closing_wait; 478 tport->tp_closing_wait = closing_wait;
469 init_waitqueue_head(&tport->tp_msr_wait); 479 init_waitqueue_head(&tport->tp_msr_wait);
@@ -480,11 +490,11 @@ static int ti_startup(struct usb_serial *serial)
480 usb_set_serial_port_data(serial->port[i], tport); 490 usb_set_serial_port_data(serial->port[i], tport);
481 tport->tp_uart_mode = 0; /* default is RS232 */ 491 tport->tp_uart_mode = 0; /* default is RS232 */
482 } 492 }
483 493
484 return 0; 494 return 0;
485 495
486free_tports: 496free_tports:
487 for (--i; i>=0; --i) { 497 for (--i; i >= 0; --i) {
488 tport = usb_get_serial_port_data(serial->port[i]); 498 tport = usb_get_serial_port_data(serial->port[i]);
489 ti_buf_free(tport->tp_write_buf); 499 ti_buf_free(tport->tp_write_buf);
490 kfree(tport); 500 kfree(tport);
@@ -505,7 +515,7 @@ static void ti_shutdown(struct usb_serial *serial)
505 515
506 dbg("%s", __func__); 516 dbg("%s", __func__);
507 517
508 for (i=0; i < serial->num_ports; ++i) { 518 for (i = 0; i < serial->num_ports; ++i) {
509 tport = usb_get_serial_port_data(serial->port[i]); 519 tport = usb_get_serial_port_data(serial->port[i]);
510 if (tport) { 520 if (tport) {
511 ti_buf_free(tport->tp_write_buf); 521 ti_buf_free(tport->tp_write_buf);
@@ -519,7 +529,8 @@ static void ti_shutdown(struct usb_serial *serial)
519} 529}
520 530
521 531
522static int ti_open(struct usb_serial_port *port, struct file *file) 532static int ti_open(struct tty_struct *tty,
533 struct usb_serial_port *port, struct file *file)
523{ 534{
524 struct ti_port *tport = usb_get_serial_port_data(port); 535 struct ti_port *tport = usb_get_serial_port_data(port);
525 struct ti_device *tdev; 536 struct ti_device *tdev;
@@ -527,8 +538,8 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
527 struct urb *urb; 538 struct urb *urb;
528 int port_number; 539 int port_number;
529 int status; 540 int status;
530 __u16 open_settings = (__u8)(TI_PIPE_MODE_CONTINOUS | 541 __u16 open_settings = (__u8)(TI_PIPE_MODE_CONTINOUS |
531 TI_PIPE_TIMEOUT_ENABLE | 542 TI_PIPE_TIMEOUT_ENABLE |
532 (TI_TRANSFER_TIMEOUT << 2)); 543 (TI_TRANSFER_TIMEOUT << 2));
533 544
534 dbg("%s - port %d", __func__, port->number); 545 dbg("%s - port %d", __func__, port->number);
@@ -543,9 +554,9 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
543 if (mutex_lock_interruptible(&tdev->td_open_close_lock)) 554 if (mutex_lock_interruptible(&tdev->td_open_close_lock))
544 return -ERESTARTSYS; 555 return -ERESTARTSYS;
545 556
546 if (port->tty) 557 if (tty)
547 port->tty->low_latency = 558 tty->low_latency =
548 (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0; 559 (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0;
549 560
550 port_number = port->number - port->serial->minor; 561 port_number = port->number - port->serial->minor;
551 562
@@ -559,7 +570,8 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
559 dbg("%s - start interrupt in urb", __func__); 570 dbg("%s - start interrupt in urb", __func__);
560 urb = tdev->td_serial->port[0]->interrupt_in_urb; 571 urb = tdev->td_serial->port[0]->interrupt_in_urb;
561 if (!urb) { 572 if (!urb) {
562 dev_err(&port->dev, "%s - no interrupt urb\n", __func__); 573 dev_err(&port->dev, "%s - no interrupt urb\n",
574 __func__);
563 status = -EINVAL; 575 status = -EINVAL;
564 goto release_lock; 576 goto release_lock;
565 } 577 }
@@ -568,18 +580,22 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
568 urb->dev = dev; 580 urb->dev = dev;
569 status = usb_submit_urb(urb, GFP_KERNEL); 581 status = usb_submit_urb(urb, GFP_KERNEL);
570 if (status) { 582 if (status) {
571 dev_err(&port->dev, "%s - submit interrupt urb failed, %d\n", __func__, status); 583 dev_err(&port->dev,
584 "%s - submit interrupt urb failed, %d\n",
585 __func__, status);
572 goto release_lock; 586 goto release_lock;
573 } 587 }
574 } 588 }
575 589
576 ti_set_termios(port, port->tty->termios); 590 if (tty)
591 ti_set_termios(tty, port, tty->termios);
577 592
578 dbg("%s - sending TI_OPEN_PORT", __func__); 593 dbg("%s - sending TI_OPEN_PORT", __func__);
579 status = ti_command_out_sync(tdev, TI_OPEN_PORT, 594 status = ti_command_out_sync(tdev, TI_OPEN_PORT,
580 (__u8)(TI_UART1_PORT + port_number), open_settings, NULL, 0); 595 (__u8)(TI_UART1_PORT + port_number), open_settings, NULL, 0);
581 if (status) { 596 if (status) {
582 dev_err(&port->dev, "%s - cannot send open command, %d\n", __func__, status); 597 dev_err(&port->dev, "%s - cannot send open command, %d\n",
598 __func__, status);
583 goto unlink_int_urb; 599 goto unlink_int_urb;
584 } 600 }
585 601
@@ -587,7 +603,8 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
587 status = ti_command_out_sync(tdev, TI_START_PORT, 603 status = ti_command_out_sync(tdev, TI_START_PORT,
588 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0); 604 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0);
589 if (status) { 605 if (status) {
590 dev_err(&port->dev, "%s - cannot send start command, %d\n", __func__, status); 606 dev_err(&port->dev, "%s - cannot send start command, %d\n",
607 __func__, status);
591 goto unlink_int_urb; 608 goto unlink_int_urb;
592 } 609 }
593 610
@@ -595,13 +612,15 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
595 status = ti_command_out_sync(tdev, TI_PURGE_PORT, 612 status = ti_command_out_sync(tdev, TI_PURGE_PORT,
596 (__u8)(TI_UART1_PORT + port_number), TI_PURGE_INPUT, NULL, 0); 613 (__u8)(TI_UART1_PORT + port_number), TI_PURGE_INPUT, NULL, 0);
597 if (status) { 614 if (status) {
598 dev_err(&port->dev, "%s - cannot clear input buffers, %d\n", __func__, status); 615 dev_err(&port->dev, "%s - cannot clear input buffers, %d\n",
616 __func__, status);
599 goto unlink_int_urb; 617 goto unlink_int_urb;
600 } 618 }
601 status = ti_command_out_sync(tdev, TI_PURGE_PORT, 619 status = ti_command_out_sync(tdev, TI_PURGE_PORT,
602 (__u8)(TI_UART1_PORT + port_number), TI_PURGE_OUTPUT, NULL, 0); 620 (__u8)(TI_UART1_PORT + port_number), TI_PURGE_OUTPUT, NULL, 0);
603 if (status) { 621 if (status) {
604 dev_err(&port->dev, "%s - cannot clear output buffers, %d\n", __func__, status); 622 dev_err(&port->dev, "%s - cannot clear output buffers, %d\n",
623 __func__, status);
605 goto unlink_int_urb; 624 goto unlink_int_urb;
606 } 625 }
607 626
@@ -610,13 +629,15 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
610 usb_clear_halt(dev, port->write_urb->pipe); 629 usb_clear_halt(dev, port->write_urb->pipe);
611 usb_clear_halt(dev, port->read_urb->pipe); 630 usb_clear_halt(dev, port->read_urb->pipe);
612 631
613 ti_set_termios(port, port->tty->termios); 632 if (tty)
633 ti_set_termios(tty, port, tty->termios);
614 634
615 dbg("%s - sending TI_OPEN_PORT (2)", __func__); 635 dbg("%s - sending TI_OPEN_PORT (2)", __func__);
616 status = ti_command_out_sync(tdev, TI_OPEN_PORT, 636 status = ti_command_out_sync(tdev, TI_OPEN_PORT,
617 (__u8)(TI_UART1_PORT + port_number), open_settings, NULL, 0); 637 (__u8)(TI_UART1_PORT + port_number), open_settings, NULL, 0);
618 if (status) { 638 if (status) {
619 dev_err(&port->dev, "%s - cannot send open command (2), %d\n", __func__, status); 639 dev_err(&port->dev, "%s - cannot send open command (2), %d\n",
640 __func__, status);
620 goto unlink_int_urb; 641 goto unlink_int_urb;
621 } 642 }
622 643
@@ -624,7 +645,8 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
624 status = ti_command_out_sync(tdev, TI_START_PORT, 645 status = ti_command_out_sync(tdev, TI_START_PORT,
625 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0); 646 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0);
626 if (status) { 647 if (status) {
627 dev_err(&port->dev, "%s - cannot send start command (2), %d\n", __func__, status); 648 dev_err(&port->dev, "%s - cannot send start command (2), %d\n",
649 __func__, status);
628 goto unlink_int_urb; 650 goto unlink_int_urb;
629 } 651 }
630 652
@@ -642,7 +664,8 @@ static int ti_open(struct usb_serial_port *port, struct file *file)
642 urb->dev = dev; 664 urb->dev = dev;
643 status = usb_submit_urb(urb, GFP_KERNEL); 665 status = usb_submit_urb(urb, GFP_KERNEL);
644 if (status) { 666 if (status) {
645 dev_err(&port->dev, "%s - submit read urb failed, %d\n", __func__, status); 667 dev_err(&port->dev, "%s - submit read urb failed, %d\n",
668 __func__, status);
646 goto unlink_int_urb; 669 goto unlink_int_urb;
647 } 670 }
648 671
@@ -661,7 +684,8 @@ release_lock:
661} 684}
662 685
663 686
664static void ti_close(struct usb_serial_port *port, struct file *file) 687static void ti_close(struct tty_struct *tty, struct usb_serial_port *port,
688 struct file *file)
665{ 689{
666 struct ti_device *tdev; 690 struct ti_device *tdev;
667 struct ti_port *tport; 691 struct ti_port *tport;
@@ -670,7 +694,7 @@ static void ti_close(struct usb_serial_port *port, struct file *file)
670 int do_unlock; 694 int do_unlock;
671 695
672 dbg("%s - port %d", __func__, port->number); 696 dbg("%s - port %d", __func__, port->number);
673 697
674 tdev = usb_get_serial_data(port->serial); 698 tdev = usb_get_serial_data(port->serial);
675 tport = usb_get_serial_port_data(port); 699 tport = usb_get_serial_port_data(port);
676 if (tdev == NULL || tport == NULL) 700 if (tdev == NULL || tport == NULL)
@@ -690,7 +714,9 @@ static void ti_close(struct usb_serial_port *port, struct file *file)
690 status = ti_command_out_sync(tdev, TI_CLOSE_PORT, 714 status = ti_command_out_sync(tdev, TI_CLOSE_PORT,
691 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0); 715 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0);
692 if (status) 716 if (status)
693 dev_err(&port->dev, "%s - cannot send close port command, %d\n" , __func__, status); 717 dev_err(&port->dev,
718 "%s - cannot send close port command, %d\n"
719 , __func__, status);
694 720
695 /* if mutex_lock is interrupted, continue anyway */ 721 /* if mutex_lock is interrupted, continue anyway */
696 do_unlock = !mutex_lock_interruptible(&tdev->td_open_close_lock); 722 do_unlock = !mutex_lock_interruptible(&tdev->td_open_close_lock);
@@ -707,8 +733,8 @@ static void ti_close(struct usb_serial_port *port, struct file *file)
707} 733}
708 734
709 735
710static int ti_write(struct usb_serial_port *port, const unsigned char *data, 736static int ti_write(struct tty_struct *tty, struct usb_serial_port *port,
711 int count) 737 const unsigned char *data, int count)
712{ 738{
713 struct ti_port *tport = usb_get_serial_port_data(port); 739 struct ti_port *tport = usb_get_serial_port_data(port);
714 unsigned long flags; 740 unsigned long flags;
@@ -733,8 +759,9 @@ static int ti_write(struct usb_serial_port *port, const unsigned char *data,
733} 759}
734 760
735 761
736static int ti_write_room(struct usb_serial_port *port) 762static int ti_write_room(struct tty_struct *tty)
737{ 763{
764 struct usb_serial_port *port = tty->driver_data;
738 struct ti_port *tport = usb_get_serial_port_data(port); 765 struct ti_port *tport = usb_get_serial_port_data(port);
739 int room = 0; 766 int room = 0;
740 unsigned long flags; 767 unsigned long flags;
@@ -743,7 +770,7 @@ static int ti_write_room(struct usb_serial_port *port)
743 770
744 if (tport == NULL) 771 if (tport == NULL)
745 return -ENODEV; 772 return -ENODEV;
746 773
747 spin_lock_irqsave(&tport->tp_lock, flags); 774 spin_lock_irqsave(&tport->tp_lock, flags);
748 room = ti_buf_space_avail(tport->tp_write_buf); 775 room = ti_buf_space_avail(tport->tp_write_buf);
749 spin_unlock_irqrestore(&tport->tp_lock, flags); 776 spin_unlock_irqrestore(&tport->tp_lock, flags);
@@ -753,8 +780,9 @@ static int ti_write_room(struct usb_serial_port *port)
753} 780}
754 781
755 782
756static int ti_chars_in_buffer(struct usb_serial_port *port) 783static int ti_chars_in_buffer(struct tty_struct *tty)
757{ 784{
785 struct usb_serial_port *port = tty->driver_data;
758 struct ti_port *tport = usb_get_serial_port_data(port); 786 struct ti_port *tport = usb_get_serial_port_data(port);
759 int chars = 0; 787 int chars = 0;
760 unsigned long flags; 788 unsigned long flags;
@@ -773,32 +801,26 @@ static int ti_chars_in_buffer(struct usb_serial_port *port)
773} 801}
774 802
775 803
776static void ti_throttle(struct usb_serial_port *port) 804static void ti_throttle(struct tty_struct *tty)
777{ 805{
806 struct usb_serial_port *port = tty->driver_data;
778 struct ti_port *tport = usb_get_serial_port_data(port); 807 struct ti_port *tport = usb_get_serial_port_data(port);
779 struct tty_struct *tty;
780 808
781 dbg("%s - port %d", __func__, port->number); 809 dbg("%s - port %d", __func__, port->number);
782 810
783 if (tport == NULL) 811 if (tport == NULL)
784 return; 812 return;
785 813
786 tty = port->tty;
787 if (!tty) {
788 dbg("%s - no tty", __func__);
789 return;
790 }
791
792 if (I_IXOFF(tty) || C_CRTSCTS(tty)) 814 if (I_IXOFF(tty) || C_CRTSCTS(tty))
793 ti_stop_read(tport, tty); 815 ti_stop_read(tport, tty);
794 816
795} 817}
796 818
797 819
798static void ti_unthrottle(struct usb_serial_port *port) 820static void ti_unthrottle(struct tty_struct *tty)
799{ 821{
822 struct usb_serial_port *port = tty->driver_data;
800 struct ti_port *tport = usb_get_serial_port_data(port); 823 struct ti_port *tport = usb_get_serial_port_data(port);
801 struct tty_struct *tty;
802 int status; 824 int status;
803 825
804 dbg("%s - port %d", __func__, port->number); 826 dbg("%s - port %d", __func__, port->number);
@@ -806,23 +828,19 @@ static void ti_unthrottle(struct usb_serial_port *port)
806 if (tport == NULL) 828 if (tport == NULL)
807 return; 829 return;
808 830
809 tty = port->tty;
810 if (!tty) {
811 dbg("%s - no tty", __func__);
812 return;
813 }
814
815 if (I_IXOFF(tty) || C_CRTSCTS(tty)) { 831 if (I_IXOFF(tty) || C_CRTSCTS(tty)) {
816 status = ti_restart_read(tport, tty); 832 status = ti_restart_read(tport, tty);
817 if (status) 833 if (status)
818 dev_err(&port->dev, "%s - cannot restart read, %d\n", __func__, status); 834 dev_err(&port->dev, "%s - cannot restart read, %d\n",
835 __func__, status);
819 } 836 }
820} 837}
821 838
822 839
823static int ti_ioctl(struct usb_serial_port *port, struct file *file, 840static int ti_ioctl(struct tty_struct *tty, struct file *file,
824 unsigned int cmd, unsigned long arg) 841 unsigned int cmd, unsigned long arg)
825{ 842{
843 struct usb_serial_port *port = tty->driver_data;
826 struct ti_port *tport = usb_get_serial_port_data(port); 844 struct ti_port *tport = usb_get_serial_port_data(port);
827 struct async_icount cnow; 845 struct async_icount cnow;
828 struct async_icount cprev; 846 struct async_icount cprev;
@@ -833,55 +851,52 @@ static int ti_ioctl(struct usb_serial_port *port, struct file *file,
833 return -ENODEV; 851 return -ENODEV;
834 852
835 switch (cmd) { 853 switch (cmd) {
836 case TIOCGSERIAL: 854 case TIOCGSERIAL:
837 dbg("%s - (%d) TIOCGSERIAL", __func__, port->number); 855 dbg("%s - (%d) TIOCGSERIAL", __func__, port->number);
838 return ti_get_serial_info(tport, (struct serial_struct __user *)arg); 856 return ti_get_serial_info(tport,
839 break; 857 (struct serial_struct __user *)arg);
840 858 case TIOCSSERIAL:
841 case TIOCSSERIAL: 859 dbg("%s - (%d) TIOCSSERIAL", __func__, port->number);
842 dbg("%s - (%d) TIOCSSERIAL", __func__, port->number); 860 return ti_set_serial_info(tport,
843 return ti_set_serial_info(tport, (struct serial_struct __user *)arg); 861 (struct serial_struct __user *)arg);
844 break; 862 case TIOCMIWAIT:
845 863 dbg("%s - (%d) TIOCMIWAIT", __func__, port->number);
846 case TIOCMIWAIT: 864 cprev = tport->tp_icount;
847 dbg("%s - (%d) TIOCMIWAIT", __func__, port->number); 865 while (1) {
848 cprev = tport->tp_icount; 866 interruptible_sleep_on(&tport->tp_msr_wait);
849 while (1) { 867 if (signal_pending(current))
850 interruptible_sleep_on(&tport->tp_msr_wait); 868 return -ERESTARTSYS;
851 if (signal_pending(current)) 869 cnow = tport->tp_icount;
852 return -ERESTARTSYS; 870 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
853 cnow = tport->tp_icount; 871 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
854 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 872 return -EIO; /* no change => error */
855 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) 873 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
856 return -EIO; /* no change => error */ 874 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
857 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 875 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
858 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 876 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)))
859 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || 877 return 0;
860 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { 878 cprev = cnow;
861 return 0; 879 }
862 } 880 break;
863 cprev = cnow; 881 case TIOCGICOUNT:
864 } 882 dbg("%s - (%d) TIOCGICOUNT RX=%d, TX=%d",
865 break; 883 __func__, port->number,
866 884 tport->tp_icount.rx, tport->tp_icount.tx);
867 case TIOCGICOUNT: 885 if (copy_to_user((void __user *)arg, &tport->tp_icount,
868 dbg("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __func__, port->number, tport->tp_icount.rx, tport->tp_icount.tx); 886 sizeof(tport->tp_icount)))
869 if (copy_to_user((void __user *)arg, &tport->tp_icount, sizeof(tport->tp_icount))) 887 return -EFAULT;
870 return -EFAULT; 888 return 0;
871 return 0;
872 } 889 }
873
874 return -ENOIOCTLCMD; 890 return -ENOIOCTLCMD;
875} 891}
876 892
877 893
878static void ti_set_termios(struct usb_serial_port *port, 894static void ti_set_termios(struct tty_struct *tty,
879 struct ktermios *old_termios) 895 struct usb_serial_port *port, struct ktermios *old_termios)
880{ 896{
881 struct ti_port *tport = usb_get_serial_port_data(port); 897 struct ti_port *tport = usb_get_serial_port_data(port);
882 struct tty_struct *tty = port->tty;
883 struct ti_uart_config *config; 898 struct ti_uart_config *config;
884 tcflag_t cflag,iflag; 899 tcflag_t cflag, iflag;
885 int baud; 900 int baud;
886 int status; 901 int status;
887 int port_number = port->number - port->serial->minor; 902 int port_number = port->number - port->serial->minor;
@@ -893,7 +908,8 @@ static void ti_set_termios(struct usb_serial_port *port,
893 iflag = tty->termios->c_iflag; 908 iflag = tty->termios->c_iflag;
894 909
895 dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag); 910 dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag);
896 dbg("%s - old clfag %08x, old iflag %08x", __func__, old_termios->c_cflag, old_termios->c_iflag); 911 dbg("%s - old clfag %08x, old iflag %08x", __func__,
912 old_termios->c_cflag, old_termios->c_iflag);
897 913
898 if (tport == NULL) 914 if (tport == NULL)
899 return; 915 return;
@@ -912,19 +928,19 @@ static void ti_set_termios(struct usb_serial_port *port,
912 config->bUartMode = (__u8)(tport->tp_uart_mode); 928 config->bUartMode = (__u8)(tport->tp_uart_mode);
913 929
914 switch (cflag & CSIZE) { 930 switch (cflag & CSIZE) {
915 case CS5: 931 case CS5:
916 config->bDataBits = TI_UART_5_DATA_BITS; 932 config->bDataBits = TI_UART_5_DATA_BITS;
917 break; 933 break;
918 case CS6: 934 case CS6:
919 config->bDataBits = TI_UART_6_DATA_BITS; 935 config->bDataBits = TI_UART_6_DATA_BITS;
920 break; 936 break;
921 case CS7: 937 case CS7:
922 config->bDataBits = TI_UART_7_DATA_BITS; 938 config->bDataBits = TI_UART_7_DATA_BITS;
923 break; 939 break;
924 default: 940 default:
925 case CS8: 941 case CS8:
926 config->bDataBits = TI_UART_8_DATA_BITS; 942 config->bDataBits = TI_UART_8_DATA_BITS;
927 break; 943 break;
928 } 944 }
929 945
930 /* CMSPAR isn't supported by this driver */ 946 /* CMSPAR isn't supported by this driver */
@@ -940,7 +956,7 @@ static void ti_set_termios(struct usb_serial_port *port,
940 } 956 }
941 } else { 957 } else {
942 config->wFlags &= ~TI_UART_ENABLE_PARITY_CHECKING; 958 config->wFlags &= ~TI_UART_ENABLE_PARITY_CHECKING;
943 config->bParity = TI_UART_NO_PARITY; 959 config->bParity = TI_UART_NO_PARITY;
944 } 960 }
945 961
946 if (cflag & CSTOPB) 962 if (cflag & CSTOPB)
@@ -993,7 +1009,8 @@ static void ti_set_termios(struct usb_serial_port *port,
993 (__u8)(TI_UART1_PORT + port_number), 0, (__u8 *)config, 1009 (__u8)(TI_UART1_PORT + port_number), 0, (__u8 *)config,
994 sizeof(*config)); 1010 sizeof(*config));
995 if (status) 1011 if (status)
996 dev_err(&port->dev, "%s - cannot set config on port %d, %d\n", __func__, port_number, status); 1012 dev_err(&port->dev, "%s - cannot set config on port %d, %d\n",
1013 __func__, port_number, status);
997 1014
998 /* SET_CONFIG asserts RTS and DTR, reset them correctly */ 1015 /* SET_CONFIG asserts RTS and DTR, reset them correctly */
999 mcr = tport->tp_shadow_mcr; 1016 mcr = tport->tp_shadow_mcr;
@@ -1002,14 +1019,17 @@ static void ti_set_termios(struct usb_serial_port *port,
1002 mcr &= ~(TI_MCR_DTR | TI_MCR_RTS); 1019 mcr &= ~(TI_MCR_DTR | TI_MCR_RTS);
1003 status = ti_set_mcr(tport, mcr); 1020 status = ti_set_mcr(tport, mcr);
1004 if (status) 1021 if (status)
1005 dev_err(&port->dev, "%s - cannot set modem control on port %d, %d\n", __func__, port_number, status); 1022 dev_err(&port->dev,
1023 "%s - cannot set modem control on port %d, %d\n",
1024 __func__, port_number, status);
1006 1025
1007 kfree(config); 1026 kfree(config);
1008} 1027}
1009 1028
1010 1029
1011static int ti_tiocmget(struct usb_serial_port *port, struct file *file) 1030static int ti_tiocmget(struct tty_struct *tty, struct file *file)
1012{ 1031{
1032 struct usb_serial_port *port = tty->driver_data;
1013 struct ti_port *tport = usb_get_serial_port_data(port); 1033 struct ti_port *tport = usb_get_serial_port_data(port);
1014 unsigned int result; 1034 unsigned int result;
1015 unsigned int msr; 1035 unsigned int msr;
@@ -1040,9 +1060,10 @@ static int ti_tiocmget(struct usb_serial_port *port, struct file *file)
1040} 1060}
1041 1061
1042 1062
1043static int ti_tiocmset(struct usb_serial_port *port, struct file *file, 1063static int ti_tiocmset(struct tty_struct *tty, struct file *file,
1044 unsigned int set, unsigned int clear) 1064 unsigned int set, unsigned int clear)
1045{ 1065{
1066 struct usb_serial_port *port = tty->driver_data;
1046 struct ti_port *tport = usb_get_serial_port_data(port); 1067 struct ti_port *tport = usb_get_serial_port_data(port);
1047 unsigned int mcr; 1068 unsigned int mcr;
1048 unsigned long flags; 1069 unsigned long flags;
@@ -1074,8 +1095,9 @@ static int ti_tiocmset(struct usb_serial_port *port, struct file *file,
1074} 1095}
1075 1096
1076 1097
1077static void ti_break(struct usb_serial_port *port, int break_state) 1098static void ti_break(struct tty_struct *tty, int break_state)
1078{ 1099{
1100 struct usb_serial_port *port = tty->driver_data;
1079 struct ti_port *tport = usb_get_serial_port_data(port); 1101 struct ti_port *tport = usb_get_serial_port_data(port);
1080 int status; 1102 int status;
1081 1103
@@ -1141,10 +1163,12 @@ static void ti_interrupt_callback(struct urb *urb)
1141 port_number = TI_GET_PORT_FROM_CODE(data[0]); 1163 port_number = TI_GET_PORT_FROM_CODE(data[0]);
1142 function = TI_GET_FUNC_FROM_CODE(data[0]); 1164 function = TI_GET_FUNC_FROM_CODE(data[0]);
1143 1165
1144 dbg("%s - port_number %d, function %d, data 0x%02X", __func__, port_number, function, data[1]); 1166 dbg("%s - port_number %d, function %d, data 0x%02X",
1167 __func__, port_number, function, data[1]);
1145 1168
1146 if (port_number >= serial->num_ports) { 1169 if (port_number >= serial->num_ports) {
1147 dev_err(dev, "%s - bad port number, %d\n", __func__, port_number); 1170 dev_err(dev, "%s - bad port number, %d\n",
1171 __func__, port_number);
1148 goto exit; 1172 goto exit;
1149 } 1173 }
1150 1174
@@ -1156,7 +1180,8 @@ static void ti_interrupt_callback(struct urb *urb)
1156 1180
1157 switch (function) { 1181 switch (function) {
1158 case TI_CODE_DATA_ERROR: 1182 case TI_CODE_DATA_ERROR:
1159 dev_err(dev, "%s - DATA ERROR, port %d, data 0x%02X\n", __func__, port_number, data[1]); 1183 dev_err(dev, "%s - DATA ERROR, port %d, data 0x%02X\n",
1184 __func__, port_number, data[1]);
1160 break; 1185 break;
1161 1186
1162 case TI_CODE_MODEM_STATUS: 1187 case TI_CODE_MODEM_STATUS:
@@ -1166,7 +1191,8 @@ static void ti_interrupt_callback(struct urb *urb)
1166 break; 1191 break;
1167 1192
1168 default: 1193 default:
1169 dev_err(dev, "%s - unknown interrupt code, 0x%02X\n", __func__, data[1]); 1194 dev_err(dev, "%s - unknown interrupt code, 0x%02X\n",
1195 __func__, data[1]);
1170 break; 1196 break;
1171 } 1197 }
1172 1198
@@ -1200,7 +1226,7 @@ static void ti_bulk_in_callback(struct urb *urb)
1200 return; 1226 return;
1201 default: 1227 default:
1202 dev_err(dev, "%s - nonzero urb status, %d\n", 1228 dev_err(dev, "%s - nonzero urb status, %d\n",
1203 __func__, status ); 1229 __func__, status);
1204 tport->tp_tdev->td_urb_error = 1; 1230 tport->tp_tdev->td_urb_error = 1;
1205 wake_up_interruptible(&tport->tp_write_wait); 1231 wake_up_interruptible(&tport->tp_write_wait);
1206 } 1232 }
@@ -1213,15 +1239,16 @@ static void ti_bulk_in_callback(struct urb *urb)
1213 return; 1239 return;
1214 } 1240 }
1215 1241
1216 if (port->tty && urb->actual_length) { 1242 if (port->port.tty && urb->actual_length) {
1217 usb_serial_debug_data(debug, dev, __func__, 1243 usb_serial_debug_data(debug, dev, __func__,
1218 urb->actual_length, urb->transfer_buffer); 1244 urb->actual_length, urb->transfer_buffer);
1219 1245
1220 if (!tport->tp_is_open) 1246 if (!tport->tp_is_open)
1221 dbg("%s - port closed, dropping data", __func__); 1247 dbg("%s - port closed, dropping data", __func__);
1222 else 1248 else
1223 ti_recv(&urb->dev->dev, port->tty, urb->transfer_buffer, 1249 ti_recv(&urb->dev->dev, port->port.tty,
1224 urb->actual_length); 1250 urb->transfer_buffer,
1251 urb->actual_length);
1225 1252
1226 spin_lock(&tport->tp_lock); 1253 spin_lock(&tport->tp_lock);
1227 tport->tp_icount.rx += urb->actual_length; 1254 tport->tp_icount.rx += urb->actual_length;
@@ -1285,8 +1312,9 @@ static void ti_recv(struct device *dev, struct tty_struct *tty,
1285 do { 1312 do {
1286 cnt = tty_buffer_request_room(tty, length); 1313 cnt = tty_buffer_request_room(tty, length);
1287 if (cnt < length) { 1314 if (cnt < length) {
1288 dev_err(dev, "%s - dropping data, %d bytes lost\n", __func__, length - cnt); 1315 dev_err(dev, "%s - dropping data, %d bytes lost\n",
1289 if(cnt == 0) 1316 __func__, length - cnt);
1317 if (cnt == 0)
1290 break; 1318 break;
1291 } 1319 }
1292 tty_insert_flip_string(tty, data, cnt); 1320 tty_insert_flip_string(tty, data, cnt);
@@ -1302,7 +1330,7 @@ static void ti_send(struct ti_port *tport)
1302{ 1330{
1303 int count, result; 1331 int count, result;
1304 struct usb_serial_port *port = tport->tp_port; 1332 struct usb_serial_port *port = tport->tp_port;
1305 struct tty_struct *tty = port->tty; 1333 struct tty_struct *tty = port->port.tty; /* FIXME */
1306 unsigned long flags; 1334 unsigned long flags;
1307 1335
1308 1336
@@ -1328,7 +1356,8 @@ static void ti_send(struct ti_port *tport)
1328 1356
1329 spin_unlock_irqrestore(&tport->tp_lock, flags); 1357 spin_unlock_irqrestore(&tport->tp_lock, flags);
1330 1358
1331 usb_serial_debug_data(debug, &port->dev, __func__, count, port->write_urb->transfer_buffer); 1359 usb_serial_debug_data(debug, &port->dev, __func__, count,
1360 port->write_urb->transfer_buffer);
1332 1361
1333 usb_fill_bulk_urb(port->write_urb, port->serial->dev, 1362 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
1334 usb_sndbulkpipe(port->serial->dev, 1363 usb_sndbulkpipe(port->serial->dev,
@@ -1338,8 +1367,9 @@ static void ti_send(struct ti_port *tport)
1338 1367
1339 result = usb_submit_urb(port->write_urb, GFP_ATOMIC); 1368 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1340 if (result) { 1369 if (result) {
1341 dev_err(&port->dev, "%s - submit write urb failed, %d\n", __func__, result); 1370 dev_err(&port->dev, "%s - submit write urb failed, %d\n",
1342 tport->tp_write_urb_in_use = 0; 1371 __func__, result);
1372 tport->tp_write_urb_in_use = 0;
1343 /* TODO: reschedule ti_send */ 1373 /* TODO: reschedule ti_send */
1344 } else { 1374 } else {
1345 spin_lock_irqsave(&tport->tp_lock, flags); 1375 spin_lock_irqsave(&tport->tp_lock, flags);
@@ -1374,7 +1404,7 @@ static int ti_set_mcr(struct ti_port *tport, unsigned int mcr)
1374 1404
1375static int ti_get_lsr(struct ti_port *tport) 1405static int ti_get_lsr(struct ti_port *tport)
1376{ 1406{
1377 int size,status; 1407 int size, status;
1378 struct ti_device *tdev = tport->tp_tdev; 1408 struct ti_device *tdev = tport->tp_tdev;
1379 struct usb_serial_port *port = tport->tp_port; 1409 struct usb_serial_port *port = tport->tp_port;
1380 int port_number = port->number - port->serial->minor; 1410 int port_number = port->number - port->serial->minor;
@@ -1392,7 +1422,9 @@ static int ti_get_lsr(struct ti_port *tport)
1392 status = ti_command_in_sync(tdev, TI_GET_PORT_STATUS, 1422 status = ti_command_in_sync(tdev, TI_GET_PORT_STATUS,
1393 (__u8)(TI_UART1_PORT+port_number), 0, (__u8 *)data, size); 1423 (__u8)(TI_UART1_PORT+port_number), 0, (__u8 *)data, size);
1394 if (status) { 1424 if (status) {
1395 dev_err(&port->dev, "%s - get port status command failed, %d\n", __func__, status); 1425 dev_err(&port->dev,
1426 "%s - get port status command failed, %d\n",
1427 __func__, status);
1396 goto free_data; 1428 goto free_data;
1397 } 1429 }
1398 1430
@@ -1442,8 +1474,9 @@ static int ti_set_serial_info(struct ti_port *tport,
1442 return -EFAULT; 1474 return -EFAULT;
1443 1475
1444 tport->tp_flags = new_serial.flags & TI_SET_SERIAL_FLAGS; 1476 tport->tp_flags = new_serial.flags & TI_SET_SERIAL_FLAGS;
1445 if (port->tty) 1477 /* FIXME */
1446 port->tty->low_latency = 1478 if (port->port.tty)
1479 port->port.tty->low_latency =
1447 (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1480 (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1448 tport->tp_closing_wait = new_serial.closing_wait; 1481 tport->tp_closing_wait = new_serial.closing_wait;
1449 1482
@@ -1477,7 +1510,7 @@ static void ti_handle_new_msr(struct ti_port *tport, __u8 msr)
1477 tport->tp_msr = msr & TI_MSR_MASK; 1510 tport->tp_msr = msr & TI_MSR_MASK;
1478 1511
1479 /* handle CTS flow control */ 1512 /* handle CTS flow control */
1480 tty = tport->tp_port->tty; 1513 tty = tport->tp_port->port.tty;
1481 if (tty && C_CRTSCTS(tty)) { 1514 if (tty && C_CRTSCTS(tty)) {
1482 if (msr & TI_MSR_CTS) { 1515 if (msr & TI_MSR_CTS) {
1483 tty->hw_stopped = 0; 1516 tty->hw_stopped = 0;
@@ -1627,7 +1660,8 @@ static int ti_write_byte(struct ti_device *tdev, unsigned long addr,
1627 struct ti_write_data_bytes *data; 1660 struct ti_write_data_bytes *data;
1628 struct device *dev = &tdev->td_serial->dev->dev; 1661 struct device *dev = &tdev->td_serial->dev->dev;
1629 1662
1630 dbg("%s - addr 0x%08lX, mask 0x%02X, byte 0x%02X", __func__, addr, mask, byte); 1663 dbg("%s - addr 0x%08lX, mask 0x%02X, byte 0x%02X",
1664 __func__, addr, mask, byte);
1631 1665
1632 size = sizeof(struct ti_write_data_bytes) + 2; 1666 size = sizeof(struct ti_write_data_bytes) + 2;
1633 data = kmalloc(size, GFP_KERNEL); 1667 data = kmalloc(size, GFP_KERNEL);
@@ -1655,67 +1689,68 @@ static int ti_write_byte(struct ti_device *tdev, unsigned long addr,
1655 return status; 1689 return status;
1656} 1690}
1657 1691
1658 1692static int ti_do_download(struct usb_device *dev, int pipe,
1659static int ti_download_firmware(struct ti_device *tdev, 1693 u8 *buffer, int size)
1660 char *fw_name)
1661{ 1694{
1662 const struct firmware *fw;
1663 int status = 0;
1664 int buffer_size;
1665 int pos; 1695 int pos;
1666 int len; 1696 u8 cs = 0;
1667 int done; 1697 int done;
1668 __u8 cs = 0;
1669 __u8 *buffer;
1670 struct usb_device *dev = tdev->td_serial->dev;
1671 struct ti_firmware_header *header; 1698 struct ti_firmware_header *header;
1672 unsigned int pipe = usb_sndbulkpipe(dev, 1699 int status;
1673 tdev->td_serial->port[0]->bulk_out_endpointAddress); 1700 int len;
1674
1675 buffer_size = TI_FIRMWARE_BUF_SIZE + sizeof(struct ti_firmware_header);
1676
1677 if (request_firmware(&fw, fw_name, &dev->dev)) {
1678 dev_err(&dev->dev, "%s - failed to load firmware \"%s\"\n",
1679 __func__, fw_name);
1680 return -ENOENT;
1681 }
1682 if (fw->size > buffer_size) {
1683 dev_err(&dev->dev, "%s - firmware \"%s\" is too large\n",
1684 __func__, fw_name);
1685 release_firmware(fw);
1686 return -EINVAL;
1687 }
1688
1689 buffer = kmalloc(buffer_size, GFP_KERNEL);
1690 if (!buffer) {
1691 dev_err(&dev->dev, "%s - out of memory\n", __func__);
1692 release_firmware(fw);
1693 return -ENOMEM;
1694 }
1695
1696 memcpy(buffer, fw->data, fw->size);
1697 memset(buffer+fw->size, 0xff, buffer_size-fw->size);
1698 1701
1699 for(pos = sizeof(struct ti_firmware_header); pos < buffer_size; pos++) 1702 for (pos = sizeof(struct ti_firmware_header); pos < size; pos++)
1700 cs = (__u8)(cs + buffer[pos]); 1703 cs = (__u8)(cs + buffer[pos]);
1701 1704
1702 header = (struct ti_firmware_header *)buffer; 1705 header = (struct ti_firmware_header *)buffer;
1703 header->wLength = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_firmware_header))); 1706 header->wLength = cpu_to_le16((__u16)(size
1707 - sizeof(struct ti_firmware_header)));
1704 header->bCheckSum = cs; 1708 header->bCheckSum = cs;
1705 1709
1706 dbg("%s - downloading firmware", __func__); 1710 dbg("%s - downloading firmware", __func__);
1707 for (pos = 0; pos < buffer_size; pos += done) { 1711 for (pos = 0; pos < size; pos += done) {
1708 len = min(buffer_size - pos, TI_DOWNLOAD_MAX_PACKET_SIZE); 1712 len = min(size - pos, TI_DOWNLOAD_MAX_PACKET_SIZE);
1709 status = usb_bulk_msg(dev, pipe, buffer+pos, len, &done, 1000); 1713 status = usb_bulk_msg(dev, pipe, buffer + pos, len,
1714 &done, 1000);
1710 if (status) 1715 if (status)
1711 break; 1716 break;
1712 } 1717 }
1718 return status;
1719}
1713 1720
1714 kfree(buffer); 1721static int ti_download_firmware(struct ti_device *tdev, int type)
1715 release_firmware(fw); 1722{
1723 int status = -ENOMEM;
1724 int buffer_size;
1725 __u8 *buffer;
1726 struct usb_device *dev = tdev->td_serial->dev;
1727 unsigned int pipe = usb_sndbulkpipe(dev,
1728 tdev->td_serial->port[0]->bulk_out_endpointAddress);
1729 const struct firmware *fw_p;
1730 char buf[32];
1731 sprintf(buf, "ti_usb-%d.bin", type);
1716 1732
1733 if (request_firmware(&fw_p, buf, &dev->dev)) {
1734 dev_err(&dev->dev, "%s - firmware not found\n", __func__);
1735 return -ENOENT;
1736 }
1737 if (fw_p->size > TI_FIRMWARE_BUF_SIZE) {
1738 dev_err(&dev->dev, "%s - firmware too large\n", __func__);
1739 return -ENOENT;
1740 }
1741
1742 buffer_size = TI_FIRMWARE_BUF_SIZE + sizeof(struct ti_firmware_header);
1743 buffer = kmalloc(buffer_size, GFP_KERNEL);
1744 if (buffer) {
1745 memcpy(buffer, fw_p->data, fw_p->size);
1746 memset(buffer + fw_p->size, 0xff, buffer_size - fw_p->size);
1747 ti_do_download(dev, pipe, buffer, fw_p->size);
1748 kfree(buffer);
1749 }
1750 release_firmware(fw_p);
1717 if (status) { 1751 if (status) {
1718 dev_err(&dev->dev, "%s - error downloading firmware, %d\n", __func__, status); 1752 dev_err(&dev->dev, "%s - error downloading firmware, %d\n",
1753 __func__, status);
1719 return status; 1754 return status;
1720 } 1755 }
1721 1756
@@ -1787,7 +1822,7 @@ static void ti_buf_clear(struct circ_buf *cb)
1787 1822
1788static int ti_buf_data_avail(struct circ_buf *cb) 1823static int ti_buf_data_avail(struct circ_buf *cb)
1789{ 1824{
1790 return CIRC_CNT(cb->head,cb->tail,TI_WRITE_BUF_SIZE); 1825 return CIRC_CNT(cb->head, cb->tail, TI_WRITE_BUF_SIZE);
1791} 1826}
1792 1827
1793 1828
@@ -1800,7 +1835,7 @@ static int ti_buf_data_avail(struct circ_buf *cb)
1800 1835
1801static int ti_buf_space_avail(struct circ_buf *cb) 1836static int ti_buf_space_avail(struct circ_buf *cb)
1802{ 1837{
1803 return CIRC_SPACE(cb->head,cb->tail,TI_WRITE_BUF_SIZE); 1838 return CIRC_SPACE(cb->head, cb->tail, TI_WRITE_BUF_SIZE);
1804} 1839}
1805 1840
1806 1841
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 0cb0d77dc429..8c2d531eedea 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -12,7 +12,8 @@
12 * This driver was originally based on the ACM driver by Armin Fuerst (which was 12 * This driver was originally based on the ACM driver by Armin Fuerst (which was
13 * based on a driver by Brad Keryan) 13 * based on a driver by Brad Keryan)
14 * 14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver 15 * See Documentation/usb/usb-serial.txt for more information on using this
16 * driver
16 * 17 *
17 */ 18 */
18 19
@@ -28,7 +29,7 @@
28#include <linux/spinlock.h> 29#include <linux/spinlock.h>
29#include <linux/mutex.h> 30#include <linux/mutex.h>
30#include <linux/list.h> 31#include <linux/list.h>
31#include <asm/uaccess.h> 32#include <linux/uaccess.h>
32#include <linux/usb.h> 33#include <linux/usb.h>
33#include <linux/usb/serial.h> 34#include <linux/usb/serial.h>
34#include "pl2303.h" 35#include "pl2303.h"
@@ -59,7 +60,8 @@ static struct usb_driver usb_serial_driver = {
59*/ 60*/
60 61
61static int debug; 62static int debug;
62static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */ 63/* initially all NULL */
64static struct usb_serial *serial_table[SERIAL_TTY_MINORS];
63static DEFINE_MUTEX(table_lock); 65static DEFINE_MUTEX(table_lock);
64static LIST_HEAD(usb_serial_driver_list); 66static LIST_HEAD(usb_serial_driver_list);
65 67
@@ -76,7 +78,8 @@ struct usb_serial *usb_serial_get_by_index(unsigned index)
76 return serial; 78 return serial;
77} 79}
78 80
79static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_ports, unsigned int *minor) 81static struct usb_serial *get_free_serial(struct usb_serial *serial,
82 int num_ports, unsigned int *minor)
80{ 83{
81 unsigned int i, j; 84 unsigned int i, j;
82 int good_spot; 85 int good_spot;
@@ -122,9 +125,8 @@ static void return_serial(struct usb_serial *serial)
122 if (serial == NULL) 125 if (serial == NULL)
123 return; 126 return;
124 127
125 for (i = 0; i < serial->num_ports; ++i) { 128 for (i = 0; i < serial->num_ports; ++i)
126 serial_table[serial->minor + i] = NULL; 129 serial_table[serial->minor + i] = NULL;
127 }
128} 130}
129 131
130static void destroy_serial(struct kref *kref) 132static void destroy_serial(struct kref *kref)
@@ -143,7 +145,7 @@ static void destroy_serial(struct kref *kref)
143 return_serial(serial); 145 return_serial(serial);
144 146
145 for (i = 0; i < serial->num_ports; ++i) 147 for (i = 0; i < serial->num_ports; ++i)
146 serial->port[i]->open_count = 0; 148 serial->port[i]->port.count = 0;
147 149
148 /* the ports are cleaned up and released in port_release() */ 150 /* the ports are cleaned up and released in port_release() */
149 for (i = 0; i < serial->num_ports; ++i) 151 for (i = 0; i < serial->num_ports; ++i)
@@ -156,7 +158,8 @@ static void destroy_serial(struct kref *kref)
156 * not get cleaned up in port_release() as it was never registered with 158 * not get cleaned up in port_release() as it was never registered with
157 * the driver core */ 159 * the driver core */
158 if (serial->num_ports < serial->num_port_pointers) { 160 if (serial->num_ports < serial->num_port_pointers) {
159 for (i = serial->num_ports; i < serial->num_port_pointers; ++i) { 161 for (i = serial->num_ports;
162 i < serial->num_port_pointers; ++i) {
160 port = serial->port[i]; 163 port = serial->port[i];
161 if (!port) 164 if (!port)
162 continue; 165 continue;
@@ -167,7 +170,7 @@ static void destroy_serial(struct kref *kref)
167 usb_put_dev(serial->dev); 170 usb_put_dev(serial->dev);
168 171
169 /* free up any memory that we allocated */ 172 /* free up any memory that we allocated */
170 kfree (serial); 173 kfree(serial);
171} 174}
172 175
173void usb_serial_put(struct usb_serial *serial) 176void usb_serial_put(struct usb_serial *serial)
@@ -180,13 +183,13 @@ void usb_serial_put(struct usb_serial *serial)
180/***************************************************************************** 183/*****************************************************************************
181 * Driver tty interface functions 184 * Driver tty interface functions
182 *****************************************************************************/ 185 *****************************************************************************/
183static int serial_open (struct tty_struct *tty, struct file * filp) 186static int serial_open (struct tty_struct *tty, struct file *filp)
184{ 187{
185 struct usb_serial *serial; 188 struct usb_serial *serial;
186 struct usb_serial_port *port; 189 struct usb_serial_port *port;
187 unsigned int portNumber; 190 unsigned int portNumber;
188 int retval; 191 int retval;
189 192
190 dbg("%s", __func__); 193 dbg("%s", __func__);
191 194
192 /* get the serial object associated with this tty pointer */ 195 /* get the serial object associated with this tty pointer */
@@ -207,15 +210,15 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
207 retval = -ERESTARTSYS; 210 retval = -ERESTARTSYS;
208 goto bailout_kref_put; 211 goto bailout_kref_put;
209 } 212 }
210 213
211 ++port->open_count; 214 ++port->port.count;
212 215
213 /* set up our port structure making the tty driver 216 /* set up our port structure making the tty driver
214 * remember our port object, and us it */ 217 * remember our port object, and us it */
215 tty->driver_data = port; 218 tty->driver_data = port;
216 port->tty = tty; 219 port->port.tty = tty;
217 220
218 if (port->open_count == 1) { 221 if (port->port.count == 1) {
219 222
220 /* lock this module before we call it 223 /* lock this module before we call it
221 * this may fail, which means we must bail out, 224 * this may fail, which means we must bail out,
@@ -228,9 +231,9 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
228 retval = usb_autopm_get_interface(serial->interface); 231 retval = usb_autopm_get_interface(serial->interface);
229 if (retval) 232 if (retval)
230 goto bailout_module_put; 233 goto bailout_module_put;
231 /* only call the device specific open if this 234 /* only call the device specific open if this
232 * is the first time the port is opened */ 235 * is the first time the port is opened */
233 retval = serial->type->open(port, filp); 236 retval = serial->type->open(tty, port, filp);
234 if (retval) 237 if (retval)
235 goto bailout_interface_put; 238 goto bailout_interface_put;
236 } 239 }
@@ -243,16 +246,16 @@ bailout_interface_put:
243bailout_module_put: 246bailout_module_put:
244 module_put(serial->type->driver.owner); 247 module_put(serial->type->driver.owner);
245bailout_mutex_unlock: 248bailout_mutex_unlock:
246 port->open_count = 0; 249 port->port.count = 0;
247 tty->driver_data = NULL; 250 tty->driver_data = NULL;
248 port->tty = NULL; 251 port->port.tty = NULL;
249 mutex_unlock(&port->mutex); 252 mutex_unlock(&port->mutex);
250bailout_kref_put: 253bailout_kref_put:
251 usb_serial_put(serial); 254 usb_serial_put(serial);
252 return retval; 255 return retval;
253} 256}
254 257
255static void serial_close(struct tty_struct *tty, struct file * filp) 258static void serial_close(struct tty_struct *tty, struct file *filp)
256{ 259{
257 struct usb_serial_port *port = tty->driver_data; 260 struct usb_serial_port *port = tty->driver_data;
258 261
@@ -263,27 +266,30 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
263 266
264 mutex_lock(&port->mutex); 267 mutex_lock(&port->mutex);
265 268
266 if (port->open_count == 0) { 269 if (port->port.count == 0) {
267 mutex_unlock(&port->mutex); 270 mutex_unlock(&port->mutex);
268 return; 271 return;
269 } 272 }
270 273
271 --port->open_count; 274 --port->port.count;
272 if (port->open_count == 0) 275 if (port->port.count == 0)
273 /* only call the device specific close if this 276 /* only call the device specific close if this
274 * port is being closed by the last owner */ 277 * port is being closed by the last owner */
275 port->serial->type->close(port, filp); 278 port->serial->type->close(tty, port, filp);
276 279
277 if (port->open_count == (port->console? 1 : 0)) { 280 if (port->port.count == (port->console? 1 : 0)) {
278 if (port->tty) { 281 if (port->port.tty) {
279 if (port->tty->driver_data) 282 if (port->port.tty->driver_data)
280 port->tty->driver_data = NULL; 283 port->port.tty->driver_data = NULL;
281 port->tty = NULL; 284 port->port.tty = NULL;
282 } 285 }
283 } 286 }
284 287
285 if (port->open_count == 0) { 288 if (port->port.count == 0) {
286 usb_autopm_put_interface(port->serial->interface); 289 mutex_lock(&port->serial->disc_mutex);
290 if (!port->serial->disconnected)
291 usb_autopm_put_interface(port->serial->interface);
292 mutex_unlock(&port->serial->disc_mutex);
287 module_put(port->serial->type->driver.owner); 293 module_put(port->serial->type->driver.owner);
288 } 294 }
289 295
@@ -291,7 +297,8 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
291 usb_serial_put(port->serial); 297 usb_serial_put(port->serial);
292} 298}
293 299
294static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) 300static int serial_write(struct tty_struct *tty, const unsigned char *buf,
301 int count)
295{ 302{
296 struct usb_serial_port *port = tty->driver_data; 303 struct usb_serial_port *port = tty->driver_data;
297 int retval = -ENODEV; 304 int retval = -ENODEV;
@@ -301,107 +308,112 @@ static int serial_write (struct tty_struct * tty, const unsigned char *buf, int
301 308
302 dbg("%s - port %d, %d byte(s)", __func__, port->number, count); 309 dbg("%s - port %d, %d byte(s)", __func__, port->number, count);
303 310
304 /* open_count is managed under the mutex lock for the tty so cannot 311 /* count is managed under the mutex lock for the tty so cannot
305 drop to zero until after the last close completes */ 312 drop to zero until after the last close completes */
306 WARN_ON(!port->open_count); 313 WARN_ON(!port->port.count);
307 314
308 /* pass on to the driver specific version of this function */ 315 /* pass on to the driver specific version of this function */
309 retval = port->serial->type->write(port, buf, count); 316 retval = port->serial->type->write(tty, port, buf, count);
310 317
311exit: 318exit:
312 return retval; 319 return retval;
313} 320}
314 321
315static int serial_write_room (struct tty_struct *tty) 322static int serial_write_room(struct tty_struct *tty)
316{ 323{
317 struct usb_serial_port *port = tty->driver_data; 324 struct usb_serial_port *port = tty->driver_data;
318 dbg("%s - port %d", __func__, port->number); 325 dbg("%s - port %d", __func__, port->number);
319 WARN_ON(!port->open_count); 326 WARN_ON(!port->port.count);
320 /* pass on to the driver specific version of this function */ 327 /* pass on to the driver specific version of this function */
321 return port->serial->type->write_room(port); 328 return port->serial->type->write_room(tty);
322} 329}
323 330
324static int serial_chars_in_buffer (struct tty_struct *tty) 331static int serial_chars_in_buffer(struct tty_struct *tty)
325{ 332{
326 struct usb_serial_port *port = tty->driver_data; 333 struct usb_serial_port *port = tty->driver_data;
327 dbg("%s = port %d", __func__, port->number); 334 dbg("%s = port %d", __func__, port->number);
328 335
329 WARN_ON(!port->open_count); 336 WARN_ON(!port->port.count);
330 /* pass on to the driver specific version of this function */ 337 /* pass on to the driver specific version of this function */
331 return port->serial->type->chars_in_buffer(port); 338 return port->serial->type->chars_in_buffer(tty);
332} 339}
333 340
334static void serial_throttle (struct tty_struct * tty) 341static void serial_throttle(struct tty_struct *tty)
335{ 342{
336 struct usb_serial_port *port = tty->driver_data; 343 struct usb_serial_port *port = tty->driver_data;
337 dbg("%s - port %d", __func__, port->number); 344 dbg("%s - port %d", __func__, port->number);
338 345
339 WARN_ON(!port->open_count); 346 WARN_ON(!port->port.count);
340 /* pass on to the driver specific version of this function */ 347 /* pass on to the driver specific version of this function */
341 if (port->serial->type->throttle) 348 if (port->serial->type->throttle)
342 port->serial->type->throttle(port); 349 port->serial->type->throttle(tty);
343} 350}
344 351
345static void serial_unthrottle (struct tty_struct * tty) 352static void serial_unthrottle(struct tty_struct *tty)
346{ 353{
347 struct usb_serial_port *port = tty->driver_data; 354 struct usb_serial_port *port = tty->driver_data;
348 dbg("%s - port %d", __func__, port->number); 355 dbg("%s - port %d", __func__, port->number);
349 356
350 WARN_ON(!port->open_count); 357 WARN_ON(!port->port.count);
351 /* pass on to the driver specific version of this function */ 358 /* pass on to the driver specific version of this function */
352 if (port->serial->type->unthrottle) 359 if (port->serial->type->unthrottle)
353 port->serial->type->unthrottle(port); 360 port->serial->type->unthrottle(tty);
354} 361}
355 362
356static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) 363static int serial_ioctl(struct tty_struct *tty, struct file *file,
364 unsigned int cmd, unsigned long arg)
357{ 365{
358 struct usb_serial_port *port = tty->driver_data; 366 struct usb_serial_port *port = tty->driver_data;
359 int retval = -ENODEV; 367 int retval = -ENODEV;
360 368
361 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd); 369 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd);
362 370
363 WARN_ON(!port->open_count); 371 WARN_ON(!port->port.count);
364 372
365 /* pass on to the driver specific version of this function if it is available */ 373 /* pass on to the driver specific version of this function
374 if it is available */
366 if (port->serial->type->ioctl) { 375 if (port->serial->type->ioctl) {
367 lock_kernel(); 376 lock_kernel();
368 retval = port->serial->type->ioctl(port, file, cmd, arg); 377 retval = port->serial->type->ioctl(tty, file, cmd, arg);
369 unlock_kernel(); 378 unlock_kernel();
370 } 379 } else
371 else
372 retval = -ENOIOCTLCMD; 380 retval = -ENOIOCTLCMD;
373 return retval; 381 return retval;
374} 382}
375 383
376static void serial_set_termios (struct tty_struct *tty, struct ktermios * old) 384static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
377{ 385{
378 struct usb_serial_port *port = tty->driver_data; 386 struct usb_serial_port *port = tty->driver_data;
379 dbg("%s - port %d", __func__, port->number); 387 dbg("%s - port %d", __func__, port->number);
380 388
381 WARN_ON(!port->open_count); 389 WARN_ON(!port->port.count);
382 /* pass on to the driver specific version of this function if it is available */ 390 /* pass on to the driver specific version of this function
391 if it is available */
383 if (port->serial->type->set_termios) 392 if (port->serial->type->set_termios)
384 port->serial->type->set_termios(port, old); 393 port->serial->type->set_termios(tty, port, old);
385 else 394 else
386 tty_termios_copy_hw(tty->termios, old); 395 tty_termios_copy_hw(tty->termios, old);
387} 396}
388 397
389static void serial_break (struct tty_struct *tty, int break_state) 398static int serial_break(struct tty_struct *tty, int break_state)
390{ 399{
391 struct usb_serial_port *port = tty->driver_data; 400 struct usb_serial_port *port = tty->driver_data;
392 401
393 dbg("%s - port %d", __func__, port->number); 402 dbg("%s - port %d", __func__, port->number);
394 403
395 WARN_ON(!port->open_count); 404 WARN_ON(!port->port.count);
396 /* pass on to the driver specific version of this function if it is available */ 405 /* pass on to the driver specific version of this function
406 if it is available */
397 if (port->serial->type->break_ctl) { 407 if (port->serial->type->break_ctl) {
398 lock_kernel(); 408 lock_kernel();
399 port->serial->type->break_ctl(port, break_state); 409 port->serial->type->break_ctl(tty, break_state);
400 unlock_kernel(); 410 unlock_kernel();
401 } 411 }
412 return 0;
402} 413}
403 414
404static int serial_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data) 415static int serial_read_proc(char *page, char **start, off_t off, int count,
416 int *eof, void *data)
405{ 417{
406 struct usb_serial *serial; 418 struct usb_serial *serial;
407 int length = 0; 419 int length = 0;
@@ -410,26 +422,29 @@ static int serial_read_proc (char *page, char **start, off_t off, int count, int
410 char tmp[40]; 422 char tmp[40];
411 423
412 dbg("%s", __func__); 424 dbg("%s", __func__);
413 length += sprintf (page, "usbserinfo:1.0 driver:2.0\n"); 425 length += sprintf(page, "usbserinfo:1.0 driver:2.0\n");
414 for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) { 426 for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) {
415 serial = usb_serial_get_by_index(i); 427 serial = usb_serial_get_by_index(i);
416 if (serial == NULL) 428 if (serial == NULL)
417 continue; 429 continue;
418 430
419 length += sprintf (page+length, "%d:", i); 431 length += sprintf(page+length, "%d:", i);
420 if (serial->type->driver.owner) 432 if (serial->type->driver.owner)
421 length += sprintf (page+length, " module:%s", module_name(serial->type->driver.owner)); 433 length += sprintf(page+length, " module:%s",
422 length += sprintf (page+length, " name:\"%s\"", serial->type->description); 434 module_name(serial->type->driver.owner));
423 length += sprintf (page+length, " vendor:%04x product:%04x", 435 length += sprintf(page+length, " name:\"%s\"",
424 le16_to_cpu(serial->dev->descriptor.idVendor), 436 serial->type->description);
425 le16_to_cpu(serial->dev->descriptor.idProduct)); 437 length += sprintf(page+length, " vendor:%04x product:%04x",
426 length += sprintf (page+length, " num_ports:%d", serial->num_ports); 438 le16_to_cpu(serial->dev->descriptor.idVendor),
427 length += sprintf (page+length, " port:%d", i - serial->minor + 1); 439 le16_to_cpu(serial->dev->descriptor.idProduct));
428 440 length += sprintf(page+length, " num_ports:%d",
441 serial->num_ports);
442 length += sprintf(page+length, " port:%d",
443 i - serial->minor + 1);
429 usb_make_path(serial->dev, tmp, sizeof(tmp)); 444 usb_make_path(serial->dev, tmp, sizeof(tmp));
430 length += sprintf (page+length, " path:%s", tmp); 445 length += sprintf(page+length, " path:%s", tmp);
431 446
432 length += sprintf (page+length, "\n"); 447 length += sprintf(page+length, "\n");
433 if ((length + begin) > (off + count)) { 448 if ((length + begin) > (off + count)) {
434 usb_serial_put(serial); 449 usb_serial_put(serial);
435 goto done; 450 goto done;
@@ -445,31 +460,31 @@ done:
445 if (off >= (length + begin)) 460 if (off >= (length + begin))
446 return 0; 461 return 0;
447 *start = page + (off-begin); 462 *start = page + (off-begin);
448 return ((count < begin+length-off) ? count : begin+length-off); 463 return (count < begin+length-off) ? count : begin+length-off;
449} 464}
450 465
451static int serial_tiocmget (struct tty_struct *tty, struct file *file) 466static int serial_tiocmget(struct tty_struct *tty, struct file *file)
452{ 467{
453 struct usb_serial_port *port = tty->driver_data; 468 struct usb_serial_port *port = tty->driver_data;
454 469
455 dbg("%s - port %d", __func__, port->number); 470 dbg("%s - port %d", __func__, port->number);
456 471
457 WARN_ON(!port->open_count); 472 WARN_ON(!port->port.count);
458 if (port->serial->type->tiocmget) 473 if (port->serial->type->tiocmget)
459 return port->serial->type->tiocmget(port, file); 474 return port->serial->type->tiocmget(tty, file);
460 return -EINVAL; 475 return -EINVAL;
461} 476}
462 477
463static int serial_tiocmset (struct tty_struct *tty, struct file *file, 478static int serial_tiocmset(struct tty_struct *tty, struct file *file,
464 unsigned int set, unsigned int clear) 479 unsigned int set, unsigned int clear)
465{ 480{
466 struct usb_serial_port *port = tty->driver_data; 481 struct usb_serial_port *port = tty->driver_data;
467 482
468 dbg("%s - port %d", __func__, port->number); 483 dbg("%s - port %d", __func__, port->number);
469 484
470 WARN_ON(!port->open_count); 485 WARN_ON(!port->port.count);
471 if (port->serial->type->tiocmset) 486 if (port->serial->type->tiocmset)
472 return port->serial->type->tiocmset(port, file, set, clear); 487 return port->serial->type->tiocmset(tty, file, set, clear);
473 return -EINVAL; 488 return -EINVAL;
474} 489}
475 490
@@ -482,6 +497,7 @@ void usb_serial_port_softint(struct usb_serial_port *port)
482{ 497{
483 schedule_work(&port->work); 498 schedule_work(&port->work);
484} 499}
500EXPORT_SYMBOL_GPL(usb_serial_port_softint);
485 501
486static void usb_serial_port_work(struct work_struct *work) 502static void usb_serial_port_work(struct work_struct *work)
487{ 503{
@@ -490,11 +506,11 @@ static void usb_serial_port_work(struct work_struct *work)
490 struct tty_struct *tty; 506 struct tty_struct *tty;
491 507
492 dbg("%s - port %d", __func__, port->number); 508 dbg("%s - port %d", __func__, port->number);
493 509
494 if (!port) 510 if (!port)
495 return; 511 return;
496 512
497 tty = port->tty; 513 tty = port->port.tty;
498 if (!tty) 514 if (!tty)
499 return; 515 return;
500 516
@@ -505,7 +521,7 @@ static void port_release(struct device *dev)
505{ 521{
506 struct usb_serial_port *port = to_usb_serial_port(dev); 522 struct usb_serial_port *port = to_usb_serial_port(dev);
507 523
508 dbg ("%s - %s", __func__, dev->bus_id); 524 dbg ("%s - %s", __func__, dev_name(dev));
509 port_free(port); 525 port_free(port);
510} 526}
511 527
@@ -543,9 +559,9 @@ static void port_free(struct usb_serial_port *port)
543 kfree(port); 559 kfree(port);
544} 560}
545 561
546static struct usb_serial * create_serial (struct usb_device *dev, 562static struct usb_serial *create_serial(struct usb_device *dev,
547 struct usb_interface *interface, 563 struct usb_interface *interface,
548 struct usb_serial_driver *driver) 564 struct usb_serial_driver *driver)
549{ 565{
550 struct usb_serial *serial; 566 struct usb_serial *serial;
551 567
@@ -564,7 +580,7 @@ static struct usb_serial * create_serial (struct usb_device *dev,
564} 580}
565 581
566static const struct usb_device_id *match_dynamic_id(struct usb_interface *intf, 582static const struct usb_device_id *match_dynamic_id(struct usb_interface *intf,
567 struct usb_serial_driver *drv) 583 struct usb_serial_driver *drv)
568{ 584{
569 struct usb_dynid *dynid; 585 struct usb_dynid *dynid;
570 586
@@ -596,7 +612,8 @@ exit:
596 return id; 612 return id;
597} 613}
598 614
599static struct usb_serial_driver *search_serial_device(struct usb_interface *iface) 615static struct usb_serial_driver *search_serial_device(
616 struct usb_interface *iface)
600{ 617{
601 const struct usb_device_id *id; 618 const struct usb_device_id *id;
602 struct usb_serial_driver *drv; 619 struct usb_serial_driver *drv;
@@ -614,7 +631,7 @@ static struct usb_serial_driver *search_serial_device(struct usb_interface *ifac
614int usb_serial_probe(struct usb_interface *interface, 631int usb_serial_probe(struct usb_interface *interface,
615 const struct usb_device_id *id) 632 const struct usb_device_id *id)
616{ 633{
617 struct usb_device *dev = interface_to_usbdev (interface); 634 struct usb_device *dev = interface_to_usbdev(interface);
618 struct usb_serial *serial = NULL; 635 struct usb_serial *serial = NULL;
619 struct usb_serial_port *port; 636 struct usb_serial_port *port;
620 struct usb_host_interface *iface_desc; 637 struct usb_host_interface *iface_desc;
@@ -625,7 +642,7 @@ int usb_serial_probe(struct usb_interface *interface,
625 struct usb_endpoint_descriptor *bulk_out_endpoint[MAX_NUM_PORTS]; 642 struct usb_endpoint_descriptor *bulk_out_endpoint[MAX_NUM_PORTS];
626 struct usb_serial_driver *type = NULL; 643 struct usb_serial_driver *type = NULL;
627 int retval; 644 int retval;
628 int minor; 645 unsigned int minor;
629 int buffer_size; 646 int buffer_size;
630 int i; 647 int i;
631 int num_interrupt_in = 0; 648 int num_interrupt_in = 0;
@@ -643,7 +660,7 @@ int usb_serial_probe(struct usb_interface *interface,
643 return -ENODEV; 660 return -ENODEV;
644 } 661 }
645 662
646 serial = create_serial (dev, interface, type); 663 serial = create_serial(dev, interface, type);
647 if (!serial) { 664 if (!serial) {
648 unlock_kernel(); 665 unlock_kernel();
649 dev_err(&interface->dev, "%s - out of memory\n", __func__); 666 dev_err(&interface->dev, "%s - out of memory\n", __func__);
@@ -656,8 +673,9 @@ int usb_serial_probe(struct usb_interface *interface,
656 673
657 if (!try_module_get(type->driver.owner)) { 674 if (!try_module_get(type->driver.owner)) {
658 unlock_kernel(); 675 unlock_kernel();
659 dev_err(&interface->dev, "module get failed, exiting\n"); 676 dev_err(&interface->dev,
660 kfree (serial); 677 "module get failed, exiting\n");
678 kfree(serial);
661 return -EIO; 679 return -EIO;
662 } 680 }
663 681
@@ -667,8 +685,8 @@ int usb_serial_probe(struct usb_interface *interface,
667 685
668 if (retval) { 686 if (retval) {
669 unlock_kernel(); 687 unlock_kernel();
670 dbg ("sub driver rejected device"); 688 dbg("sub driver rejected device");
671 kfree (serial); 689 kfree(serial);
672 return retval; 690 return retval;
673 } 691 }
674 } 692 }
@@ -709,7 +727,7 @@ int usb_serial_probe(struct usb_interface *interface,
709 } 727 }
710 728
711#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE) 729#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
712 /* BEGIN HORRIBLE HACK FOR PL2303 */ 730 /* BEGIN HORRIBLE HACK FOR PL2303 */
713 /* this is needed due to the looney way its endpoints are set up */ 731 /* this is needed due to the looney way its endpoints are set up */
714 if (((le16_to_cpu(dev->descriptor.idVendor) == PL2303_VENDOR_ID) && 732 if (((le16_to_cpu(dev->descriptor.idVendor) == PL2303_VENDOR_ID) &&
715 (le16_to_cpu(dev->descriptor.idProduct) == PL2303_PRODUCT_ID)) || 733 (le16_to_cpu(dev->descriptor.idProduct) == PL2303_PRODUCT_ID)) ||
@@ -738,7 +756,7 @@ int usb_serial_probe(struct usb_interface *interface,
738 if (num_bulk_in == 0 || num_bulk_out == 0) { 756 if (num_bulk_in == 0 || num_bulk_out == 0) {
739 unlock_kernel(); 757 unlock_kernel();
740 dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n"); 758 dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n");
741 kfree (serial); 759 kfree(serial);
742 return -ENODEV; 760 return -ENODEV;
743 } 761 }
744 } 762 }
@@ -750,8 +768,9 @@ int usb_serial_probe(struct usb_interface *interface,
750 num_ports = num_bulk_out; 768 num_ports = num_bulk_out;
751 if (num_ports == 0) { 769 if (num_ports == 0) {
752 unlock_kernel(); 770 unlock_kernel();
753 dev_err(&interface->dev, "Generic device with no bulk out, not allowed.\n"); 771 dev_err(&interface->dev,
754 kfree (serial); 772 "Generic device with no bulk out, not allowed.\n");
773 kfree(serial);
755 return -EIO; 774 return -EIO;
756 } 775 }
757 } 776 }
@@ -761,11 +780,12 @@ int usb_serial_probe(struct usb_interface *interface,
761 if (type->calc_num_ports) { 780 if (type->calc_num_ports) {
762 if (!try_module_get(type->driver.owner)) { 781 if (!try_module_get(type->driver.owner)) {
763 unlock_kernel(); 782 unlock_kernel();
764 dev_err(&interface->dev, "module get failed, exiting\n"); 783 dev_err(&interface->dev,
765 kfree (serial); 784 "module get failed, exiting\n");
785 kfree(serial);
766 return -EIO; 786 return -EIO;
767 } 787 }
768 num_ports = type->calc_num_ports (serial); 788 num_ports = type->calc_num_ports(serial);
769 module_put(type->driver.owner); 789 module_put(type->driver.owner);
770 } 790 }
771 if (!num_ports) 791 if (!num_ports)
@@ -783,7 +803,8 @@ int usb_serial_probe(struct usb_interface *interface,
783 type->description); 803 type->description);
784 804
785 /* create our ports, we need as many as the max endpoints */ 805 /* create our ports, we need as many as the max endpoints */
786 /* we don't use num_ports here cauz some devices have more endpoint pairs than ports */ 806 /* we don't use num_ports here because some devices have more
807 endpoint pairs than ports */
787 max_endpoints = max(num_bulk_in, num_bulk_out); 808 max_endpoints = max(num_bulk_in, num_bulk_out);
788 max_endpoints = max(max_endpoints, num_interrupt_in); 809 max_endpoints = max(max_endpoints, num_interrupt_in);
789 max_endpoints = max(max_endpoints, num_interrupt_out); 810 max_endpoints = max(max_endpoints, num_interrupt_out);
@@ -791,7 +812,8 @@ int usb_serial_probe(struct usb_interface *interface,
791 serial->num_port_pointers = max_endpoints; 812 serial->num_port_pointers = max_endpoints;
792 unlock_kernel(); 813 unlock_kernel();
793 814
794 dbg("%s - setting up %d port structures for this device", __func__, max_endpoints); 815 dbg("%s - setting up %d port structures for this device",
816 __func__, max_endpoints);
795 for (i = 0; i < max_endpoints; ++i) { 817 for (i = 0; i < max_endpoints; ++i) {
796 port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL); 818 port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
797 if (!port) 819 if (!port)
@@ -807,7 +829,7 @@ int usb_serial_probe(struct usb_interface *interface,
807 for (i = 0; i < num_bulk_in; ++i) { 829 for (i = 0; i < num_bulk_in; ++i) {
808 endpoint = bulk_in_endpoint[i]; 830 endpoint = bulk_in_endpoint[i];
809 port = serial->port[i]; 831 port = serial->port[i];
810 port->read_urb = usb_alloc_urb (0, GFP_KERNEL); 832 port->read_urb = usb_alloc_urb(0, GFP_KERNEL);
811 if (!port->read_urb) { 833 if (!port->read_urb) {
812 dev_err(&interface->dev, "No free urbs available\n"); 834 dev_err(&interface->dev, "No free urbs available\n");
813 goto probe_error; 835 goto probe_error;
@@ -815,17 +837,17 @@ int usb_serial_probe(struct usb_interface *interface,
815 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); 837 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
816 port->bulk_in_size = buffer_size; 838 port->bulk_in_size = buffer_size;
817 port->bulk_in_endpointAddress = endpoint->bEndpointAddress; 839 port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
818 port->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL); 840 port->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
819 if (!port->bulk_in_buffer) { 841 if (!port->bulk_in_buffer) {
820 dev_err(&interface->dev, "Couldn't allocate bulk_in_buffer\n"); 842 dev_err(&interface->dev,
843 "Couldn't allocate bulk_in_buffer\n");
821 goto probe_error; 844 goto probe_error;
822 } 845 }
823 usb_fill_bulk_urb (port->read_urb, dev, 846 usb_fill_bulk_urb(port->read_urb, dev,
824 usb_rcvbulkpipe (dev, 847 usb_rcvbulkpipe(dev,
825 endpoint->bEndpointAddress), 848 endpoint->bEndpointAddress),
826 port->bulk_in_buffer, buffer_size, 849 port->bulk_in_buffer, buffer_size,
827 serial->type->read_bulk_callback, 850 serial->type->read_bulk_callback, port);
828 port);
829 } 851 }
830 852
831 for (i = 0; i < num_bulk_out; ++i) { 853 for (i = 0; i < num_bulk_out; ++i) {
@@ -839,17 +861,17 @@ int usb_serial_probe(struct usb_interface *interface,
839 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); 861 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
840 port->bulk_out_size = buffer_size; 862 port->bulk_out_size = buffer_size;
841 port->bulk_out_endpointAddress = endpoint->bEndpointAddress; 863 port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
842 port->bulk_out_buffer = kmalloc (buffer_size, GFP_KERNEL); 864 port->bulk_out_buffer = kmalloc(buffer_size, GFP_KERNEL);
843 if (!port->bulk_out_buffer) { 865 if (!port->bulk_out_buffer) {
844 dev_err(&interface->dev, "Couldn't allocate bulk_out_buffer\n"); 866 dev_err(&interface->dev,
867 "Couldn't allocate bulk_out_buffer\n");
845 goto probe_error; 868 goto probe_error;
846 } 869 }
847 usb_fill_bulk_urb (port->write_urb, dev, 870 usb_fill_bulk_urb(port->write_urb, dev,
848 usb_sndbulkpipe (dev, 871 usb_sndbulkpipe(dev,
849 endpoint->bEndpointAddress), 872 endpoint->bEndpointAddress),
850 port->bulk_out_buffer, buffer_size, 873 port->bulk_out_buffer, buffer_size,
851 serial->type->write_bulk_callback, 874 serial->type->write_bulk_callback, port);
852 port);
853 } 875 }
854 876
855 if (serial->type->read_int_callback) { 877 if (serial->type->read_int_callback) {
@@ -858,73 +880,82 @@ int usb_serial_probe(struct usb_interface *interface,
858 port = serial->port[i]; 880 port = serial->port[i];
859 port->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); 881 port->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
860 if (!port->interrupt_in_urb) { 882 if (!port->interrupt_in_urb) {
861 dev_err(&interface->dev, "No free urbs available\n"); 883 dev_err(&interface->dev,
884 "No free urbs available\n");
862 goto probe_error; 885 goto probe_error;
863 } 886 }
864 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); 887 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
865 port->interrupt_in_endpointAddress = endpoint->bEndpointAddress; 888 port->interrupt_in_endpointAddress =
866 port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL); 889 endpoint->bEndpointAddress;
890 port->interrupt_in_buffer = kmalloc(buffer_size,
891 GFP_KERNEL);
867 if (!port->interrupt_in_buffer) { 892 if (!port->interrupt_in_buffer) {
868 dev_err(&interface->dev, "Couldn't allocate interrupt_in_buffer\n"); 893 dev_err(&interface->dev,
894 "Couldn't allocate interrupt_in_buffer\n");
869 goto probe_error; 895 goto probe_error;
870 } 896 }
871 usb_fill_int_urb (port->interrupt_in_urb, dev, 897 usb_fill_int_urb(port->interrupt_in_urb, dev,
872 usb_rcvintpipe (dev, 898 usb_rcvintpipe(dev,
873 endpoint->bEndpointAddress), 899 endpoint->bEndpointAddress),
874 port->interrupt_in_buffer, buffer_size, 900 port->interrupt_in_buffer, buffer_size,
875 serial->type->read_int_callback, port, 901 serial->type->read_int_callback, port,
876 endpoint->bInterval); 902 endpoint->bInterval);
877 } 903 }
878 } else if (num_interrupt_in) { 904 } else if (num_interrupt_in) {
879 dbg("the device claims to support interrupt in transfers, but read_int_callback is not defined"); 905 dbg("the device claims to support interrupt in transfers, but read_int_callback is not defined");
880 } 906 }
881 907
882 if (serial->type->write_int_callback) { 908 if (serial->type->write_int_callback) {
883 for (i = 0; i < num_interrupt_out; ++i) { 909 for (i = 0; i < num_interrupt_out; ++i) {
884 endpoint = interrupt_out_endpoint[i]; 910 endpoint = interrupt_out_endpoint[i];
885 port = serial->port[i]; 911 port = serial->port[i];
886 port->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); 912 port->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
887 if (!port->interrupt_out_urb) { 913 if (!port->interrupt_out_urb) {
888 dev_err(&interface->dev, "No free urbs available\n"); 914 dev_err(&interface->dev,
915 "No free urbs available\n");
889 goto probe_error; 916 goto probe_error;
890 } 917 }
891 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); 918 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
892 port->interrupt_out_size = buffer_size; 919 port->interrupt_out_size = buffer_size;
893 port->interrupt_out_endpointAddress = endpoint->bEndpointAddress; 920 port->interrupt_out_endpointAddress =
894 port->interrupt_out_buffer = kmalloc (buffer_size, GFP_KERNEL); 921 endpoint->bEndpointAddress;
922 port->interrupt_out_buffer = kmalloc(buffer_size,
923 GFP_KERNEL);
895 if (!port->interrupt_out_buffer) { 924 if (!port->interrupt_out_buffer) {
896 dev_err(&interface->dev, "Couldn't allocate interrupt_out_buffer\n"); 925 dev_err(&interface->dev,
926 "Couldn't allocate interrupt_out_buffer\n");
897 goto probe_error; 927 goto probe_error;
898 } 928 }
899 usb_fill_int_urb (port->interrupt_out_urb, dev, 929 usb_fill_int_urb(port->interrupt_out_urb, dev,
900 usb_sndintpipe (dev, 930 usb_sndintpipe(dev,
901 endpoint->bEndpointAddress), 931 endpoint->bEndpointAddress),
902 port->interrupt_out_buffer, buffer_size, 932 port->interrupt_out_buffer, buffer_size,
903 serial->type->write_int_callback, port, 933 serial->type->write_int_callback, port,
904 endpoint->bInterval); 934 endpoint->bInterval);
905 } 935 }
906 } else if (num_interrupt_out) { 936 } else if (num_interrupt_out) {
907 dbg("the device claims to support interrupt out transfers, but write_int_callback is not defined"); 937 dbg("the device claims to support interrupt out transfers, but write_int_callback is not defined");
908 } 938 }
909 939
910 /* if this device type has an attach function, call it */ 940 /* if this device type has an attach function, call it */
911 if (type->attach) { 941 if (type->attach) {
912 if (!try_module_get(type->driver.owner)) { 942 if (!try_module_get(type->driver.owner)) {
913 dev_err(&interface->dev, "module get failed, exiting\n"); 943 dev_err(&interface->dev,
944 "module get failed, exiting\n");
914 goto probe_error; 945 goto probe_error;
915 } 946 }
916 retval = type->attach (serial); 947 retval = type->attach(serial);
917 module_put(type->driver.owner); 948 module_put(type->driver.owner);
918 if (retval < 0) 949 if (retval < 0)
919 goto probe_error; 950 goto probe_error;
920 if (retval > 0) { 951 if (retval > 0) {
921 /* quietly accept this device, but don't bind to a serial port 952 /* quietly accept this device, but don't bind to a
922 * as it's about to disappear */ 953 serial port as it's about to disappear */
923 goto exit; 954 goto exit;
924 } 955 }
925 } 956 }
926 957
927 if (get_free_serial (serial, num_ports, &minor) == NULL) { 958 if (get_free_serial(serial, num_ports, &minor) == NULL) {
928 dev_err(&interface->dev, "No more free serial devices\n"); 959 dev_err(&interface->dev, "No more free serial devices\n");
929 goto probe_error; 960 goto probe_error;
930 } 961 }
@@ -938,19 +969,19 @@ int usb_serial_probe(struct usb_interface *interface,
938 port->dev.bus = &usb_serial_bus_type; 969 port->dev.bus = &usb_serial_bus_type;
939 port->dev.release = &port_release; 970 port->dev.release = &port_release;
940 971
941 snprintf (&port->dev.bus_id[0], sizeof(port->dev.bus_id), "ttyUSB%d", port->number); 972 dev_set_name(&port->dev, "ttyUSB%d", port->number);
942 dbg ("%s - registering %s", __func__, port->dev.bus_id); 973 dbg ("%s - registering %s", __func__, dev_name(&port->dev));
943 retval = device_register(&port->dev); 974 retval = device_register(&port->dev);
944 if (retval) 975 if (retval)
945 dev_err(&port->dev, "Error registering port device, " 976 dev_err(&port->dev, "Error registering port device, "
946 "continuing\n"); 977 "continuing\n");
947 } 978 }
948 979
949 usb_serial_console_init (debug, minor); 980 usb_serial_console_init(debug, minor);
950 981
951exit: 982exit:
952 /* success */ 983 /* success */
953 usb_set_intfdata (interface, serial); 984 usb_set_intfdata(interface, serial);
954 return 0; 985 return 0;
955 986
956probe_error: 987probe_error:
@@ -986,29 +1017,30 @@ probe_error:
986 /* free up any memory that we allocated */ 1017 /* free up any memory that we allocated */
987 for (i = 0; i < serial->num_port_pointers; ++i) 1018 for (i = 0; i < serial->num_port_pointers; ++i)
988 kfree(serial->port[i]); 1019 kfree(serial->port[i]);
989 kfree (serial); 1020 kfree(serial);
990 return -EIO; 1021 return -EIO;
991} 1022}
1023EXPORT_SYMBOL_GPL(usb_serial_probe);
992 1024
993void usb_serial_disconnect(struct usb_interface *interface) 1025void usb_serial_disconnect(struct usb_interface *interface)
994{ 1026{
995 int i; 1027 int i;
996 struct usb_serial *serial = usb_get_intfdata (interface); 1028 struct usb_serial *serial = usb_get_intfdata(interface);
997 struct device *dev = &interface->dev; 1029 struct device *dev = &interface->dev;
998 struct usb_serial_port *port; 1030 struct usb_serial_port *port;
999 1031
1000 usb_serial_console_disconnect(serial); 1032 usb_serial_console_disconnect(serial);
1001 dbg ("%s", __func__); 1033 dbg("%s", __func__);
1002 1034
1003 mutex_lock(&serial->disc_mutex); 1035 mutex_lock(&serial->disc_mutex);
1004 usb_set_intfdata (interface, NULL); 1036 usb_set_intfdata(interface, NULL);
1005 /* must set a flag, to signal subdrivers */ 1037 /* must set a flag, to signal subdrivers */
1006 serial->disconnected = 1; 1038 serial->disconnected = 1;
1007 for (i = 0; i < serial->num_ports; ++i) { 1039 for (i = 0; i < serial->num_ports; ++i) {
1008 port = serial->port[i]; 1040 port = serial->port[i];
1009 if (port) { 1041 if (port) {
1010 if (port->tty) 1042 if (port->port.tty)
1011 tty_hangup(port->tty); 1043 tty_hangup(port->port.tty);
1012 kill_traffic(port); 1044 kill_traffic(port);
1013 } 1045 }
1014 } 1046 }
@@ -1018,6 +1050,7 @@ void usb_serial_disconnect(struct usb_interface *interface)
1018 usb_serial_put(serial); 1050 usb_serial_put(serial);
1019 dev_info(dev, "device disconnected\n"); 1051 dev_info(dev, "device disconnected\n");
1020} 1052}
1053EXPORT_SYMBOL_GPL(usb_serial_disconnect);
1021 1054
1022int usb_serial_suspend(struct usb_interface *intf, pm_message_t message) 1055int usb_serial_suspend(struct usb_interface *intf, pm_message_t message)
1023{ 1056{
@@ -1076,9 +1109,8 @@ static int __init usb_serial_init(void)
1076 return -ENOMEM; 1109 return -ENOMEM;
1077 1110
1078 /* Initialize our global data */ 1111 /* Initialize our global data */
1079 for (i = 0; i < SERIAL_TTY_MINORS; ++i) { 1112 for (i = 0; i < SERIAL_TTY_MINORS; ++i)
1080 serial_table[i] = NULL; 1113 serial_table[i] = NULL;
1081 }
1082 1114
1083 result = bus_register(&usb_serial_bus_type); 1115 result = bus_register(&usb_serial_bus_type);
1084 if (result) { 1116 if (result) {
@@ -1093,9 +1125,11 @@ static int __init usb_serial_init(void)
1093 usb_serial_tty_driver->minor_start = 0; 1125 usb_serial_tty_driver->minor_start = 0;
1094 usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; 1126 usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1095 usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL; 1127 usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL;
1096 usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; 1128 usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW |
1129 TTY_DRIVER_DYNAMIC_DEV;
1097 usb_serial_tty_driver->init_termios = tty_std_termios; 1130 usb_serial_tty_driver->init_termios = tty_std_termios;
1098 usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; 1131 usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD
1132 | HUPCL | CLOCAL;
1099 usb_serial_tty_driver->init_termios.c_ispeed = 9600; 1133 usb_serial_tty_driver->init_termios.c_ispeed = 9600;
1100 usb_serial_tty_driver->init_termios.c_ospeed = 9600; 1134 usb_serial_tty_driver->init_termios.c_ospeed = 9600;
1101 tty_set_operations(usb_serial_tty_driver, &serial_ops); 1135 tty_set_operations(usb_serial_tty_driver, &serial_ops);
@@ -1133,7 +1167,7 @@ exit_reg_driver:
1133 bus_unregister(&usb_serial_bus_type); 1167 bus_unregister(&usb_serial_bus_type);
1134 1168
1135exit_bus: 1169exit_bus:
1136 err ("%s - returning with error %d", __func__, result); 1170 err("%s - returning with error %d", __func__, result);
1137 put_tty_driver(usb_serial_tty_driver); 1171 put_tty_driver(usb_serial_tty_driver);
1138 return result; 1172 return result;
1139} 1173}
@@ -1160,7 +1194,7 @@ module_exit(usb_serial_exit);
1160 if (!type->function) { \ 1194 if (!type->function) { \
1161 type->function = usb_serial_generic_##function; \ 1195 type->function = usb_serial_generic_##function; \
1162 dbg("Had to override the " #function \ 1196 dbg("Had to override the " #function \
1163 " usb serial operation with the generic one.");\ 1197 " usb serial operation with the generic one.");\
1164 } \ 1198 } \
1165 } while (0) 1199 } while (0)
1166 1200
@@ -1177,8 +1211,9 @@ static void fixup_generic(struct usb_serial_driver *device)
1177 set_to_generic_if_null(device, resume); 1211 set_to_generic_if_null(device, resume);
1178} 1212}
1179 1213
1180int usb_serial_register(struct usb_serial_driver *driver) /* must be called with BKL held */ 1214int usb_serial_register(struct usb_serial_driver *driver)
1181{ 1215{
1216 /* must be called with BKL held */
1182 int retval; 1217 int retval;
1183 1218
1184 fixup_generic(driver); 1219 fixup_generic(driver);
@@ -1191,37 +1226,30 @@ int usb_serial_register(struct usb_serial_driver *driver) /* must be called with
1191 1226
1192 retval = usb_serial_bus_register(driver); 1227 retval = usb_serial_bus_register(driver);
1193 if (retval) { 1228 if (retval) {
1194 err("problem %d when registering driver %s", retval, driver->description); 1229 err("problem %d when registering driver %s",
1230 retval, driver->description);
1195 list_del(&driver->driver_list); 1231 list_del(&driver->driver_list);
1196 } 1232 } else
1197 else 1233 info("USB Serial support registered for %s",
1198 info("USB Serial support registered for %s", driver->description); 1234 driver->description);
1199 1235
1200 return retval; 1236 return retval;
1201} 1237}
1238EXPORT_SYMBOL_GPL(usb_serial_register);
1202 1239
1203 1240
1204void usb_serial_deregister(struct usb_serial_driver *device) /* must be called with BKL held */ 1241void usb_serial_deregister(struct usb_serial_driver *device)
1205{ 1242{
1243 /* must be called with BKL held */
1206 info("USB Serial deregistering driver %s", device->description); 1244 info("USB Serial deregistering driver %s", device->description);
1207 list_del(&device->driver_list); 1245 list_del(&device->driver_list);
1208 usb_serial_bus_deregister(device); 1246 usb_serial_bus_deregister(device);
1209} 1247}
1210
1211
1212
1213/* If the usb-serial core is built into the core, the usb-serial drivers
1214 need these symbols to load properly as modules. */
1215EXPORT_SYMBOL_GPL(usb_serial_register);
1216EXPORT_SYMBOL_GPL(usb_serial_deregister); 1248EXPORT_SYMBOL_GPL(usb_serial_deregister);
1217EXPORT_SYMBOL_GPL(usb_serial_probe);
1218EXPORT_SYMBOL_GPL(usb_serial_disconnect);
1219EXPORT_SYMBOL_GPL(usb_serial_port_softint);
1220
1221 1249
1222/* Module information */ 1250/* Module information */
1223MODULE_AUTHOR( DRIVER_AUTHOR ); 1251MODULE_AUTHOR(DRIVER_AUTHOR);
1224MODULE_DESCRIPTION( DRIVER_DESC ); 1252MODULE_DESCRIPTION(DRIVER_DESC);
1225MODULE_LICENSE("GPL"); 1253MODULE_LICENSE("GPL");
1226 1254
1227module_param(debug, bool, S_IRUGO | S_IWUSR); 1255module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/usb_debug.c b/drivers/usb/serial/usb_debug.c
index f9fc926b56d8..fc5d9952b03b 100644
--- a/drivers/usb/serial/usb_debug.c
+++ b/drivers/usb/serial/usb_debug.c
@@ -15,6 +15,8 @@
15#include <linux/usb.h> 15#include <linux/usb.h>
16#include <linux/usb/serial.h> 16#include <linux/usb/serial.h>
17 17
18#define USB_DEBUG_MAX_PACKET_SIZE 8
19
18static struct usb_device_id id_table [] = { 20static struct usb_device_id id_table [] = {
19 { USB_DEVICE(0x0525, 0x127a) }, 21 { USB_DEVICE(0x0525, 0x127a) },
20 { }, 22 { },
@@ -29,6 +31,13 @@ static struct usb_driver debug_driver = {
29 .no_dynamic_id = 1, 31 .no_dynamic_id = 1,
30}; 32};
31 33
34int usb_debug_open(struct tty_struct *tty, struct usb_serial_port *port,
35 struct file *filp)
36{
37 port->bulk_out_size = USB_DEBUG_MAX_PACKET_SIZE;
38 return usb_serial_generic_open(tty, port, filp);
39}
40
32static struct usb_serial_driver debug_device = { 41static struct usb_serial_driver debug_device = {
33 .driver = { 42 .driver = {
34 .owner = THIS_MODULE, 43 .owner = THIS_MODULE,
@@ -36,6 +45,7 @@ static struct usb_serial_driver debug_device = {
36 }, 45 },
37 .id_table = id_table, 46 .id_table = id_table,
38 .num_ports = 1, 47 .num_ports = 1,
48 .open = usb_debug_open,
39}; 49};
40 50
41static int __init debug_init(void) 51static int __init debug_init(void)
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
index 5fc20122145f..cf8924f9a2cc 100644
--- a/drivers/usb/serial/visor.c
+++ b/drivers/usb/serial/visor.c
@@ -9,7 +9,8 @@
9 * modify it under the terms of the GNU General Public License version 9 * modify it under the terms of the GNU General Public License version
10 * 2 as published by the Free Software Foundation. 10 * 2 as published by the Free Software Foundation.
11 * 11 *
12 * See Documentation/usb/usb-serial.txt for more information on using this driver 12 * See Documentation/usb/usb-serial.txt for more information on using this
13 * driver
13 * 14 *
14 */ 15 */
15 16
@@ -23,7 +24,7 @@
23#include <linux/module.h> 24#include <linux/module.h>
24#include <linux/moduleparam.h> 25#include <linux/moduleparam.h>
25#include <linux/spinlock.h> 26#include <linux/spinlock.h>
26#include <asm/uaccess.h> 27#include <linux/uaccess.h>
27#include <linux/usb.h> 28#include <linux/usb.h>
28#include <linux/usb/serial.h> 29#include <linux/usb/serial.h>
29#include "visor.h" 30#include "visor.h"
@@ -35,25 +36,29 @@
35#define DRIVER_DESC "USB HandSpring Visor / Palm OS driver" 36#define DRIVER_DESC "USB HandSpring Visor / Palm OS driver"
36 37
37/* function prototypes for a handspring visor */ 38/* function prototypes for a handspring visor */
38static int visor_open (struct usb_serial_port *port, struct file *filp); 39static int visor_open(struct tty_struct *tty, struct usb_serial_port *port,
39static void visor_close (struct usb_serial_port *port, struct file *filp); 40 struct file *filp);
40static int visor_write (struct usb_serial_port *port, const unsigned char *buf, int count); 41static void visor_close(struct tty_struct *tty, struct usb_serial_port *port,
41static int visor_write_room (struct usb_serial_port *port); 42 struct file *filp);
42static int visor_chars_in_buffer (struct usb_serial_port *port); 43static int visor_write(struct tty_struct *tty, struct usb_serial_port *port,
43static void visor_throttle (struct usb_serial_port *port); 44 const unsigned char *buf, int count);
44static void visor_unthrottle (struct usb_serial_port *port); 45static int visor_write_room(struct tty_struct *tty);
45static int visor_probe (struct usb_serial *serial, const struct usb_device_id *id); 46static void visor_throttle(struct tty_struct *tty);
47static void visor_unthrottle(struct tty_struct *tty);
48static int visor_probe(struct usb_serial *serial,
49 const struct usb_device_id *id);
46static int visor_calc_num_ports(struct usb_serial *serial); 50static int visor_calc_num_ports(struct usb_serial *serial);
47static void visor_shutdown (struct usb_serial *serial); 51static void visor_shutdown(struct usb_serial *serial);
48static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); 52static void visor_write_bulk_callback(struct urb *urb);
49static void visor_write_bulk_callback (struct urb *urb); 53static void visor_read_bulk_callback(struct urb *urb);
50static void visor_read_bulk_callback (struct urb *urb); 54static void visor_read_int_callback(struct urb *urb);
51static void visor_read_int_callback (struct urb *urb); 55static int clie_3_5_startup(struct usb_serial *serial);
52static int clie_3_5_startup (struct usb_serial *serial); 56static int treo_attach(struct usb_serial *serial);
53static int treo_attach (struct usb_serial *serial); 57static int clie_5_attach(struct usb_serial *serial);
54static int clie_5_attach (struct usb_serial *serial); 58static int palm_os_3_probe(struct usb_serial *serial,
55static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id *id); 59 const struct usb_device_id *id);
56static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id *id); 60static int palm_os_4_probe(struct usb_serial *serial,
61 const struct usb_device_id *id);
57 62
58/* Parameters that may be passed into the module. */ 63/* Parameters that may be passed into the module. */
59static int debug; 64static int debug;
@@ -105,13 +110,13 @@ static struct usb_device_id id_table [] = {
105 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 110 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
106 { USB_DEVICE(ACER_VENDOR_ID, ACER_S10_ID), 111 { USB_DEVICE(ACER_VENDOR_ID, ACER_S10_ID),
107 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 112 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
108 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID), 113 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID),
109 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 114 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
110 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID), 115 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID),
111 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 116 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
112 { USB_DEVICE(TAPWAVE_VENDOR_ID, TAPWAVE_ZODIAC_ID), 117 { USB_DEVICE(TAPWAVE_VENDOR_ID, TAPWAVE_ZODIAC_ID),
113 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 118 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
114 { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID), 119 { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID),
115 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 120 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
116 { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID), 121 { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID),
117 .driver_info = (kernel_ulong_t)&palm_os_4_probe }, 122 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
@@ -170,7 +175,7 @@ static struct usb_device_id id_table_combined [] = {
170 { } /* Terminating entry */ 175 { } /* Terminating entry */
171}; 176};
172 177
173MODULE_DEVICE_TABLE (usb, id_table_combined); 178MODULE_DEVICE_TABLE(usb, id_table_combined);
174 179
175static struct usb_driver visor_driver = { 180static struct usb_driver visor_driver = {
176 .name = "visor", 181 .name = "visor",
@@ -180,7 +185,8 @@ static struct usb_driver visor_driver = {
180 .no_dynamic_id = 1, 185 .no_dynamic_id = 1,
181}; 186};
182 187
183/* All of the device info needed for the Handspring Visor, and Palm 4.0 devices */ 188/* All of the device info needed for the Handspring Visor,
189 and Palm 4.0 devices */
184static struct usb_serial_driver handspring_device = { 190static struct usb_serial_driver handspring_device = {
185 .driver = { 191 .driver = {
186 .owner = THIS_MODULE, 192 .owner = THIS_MODULE,
@@ -198,10 +204,8 @@ static struct usb_serial_driver handspring_device = {
198 .probe = visor_probe, 204 .probe = visor_probe,
199 .calc_num_ports = visor_calc_num_ports, 205 .calc_num_ports = visor_calc_num_ports,
200 .shutdown = visor_shutdown, 206 .shutdown = visor_shutdown,
201 .ioctl = visor_ioctl,
202 .write = visor_write, 207 .write = visor_write,
203 .write_room = visor_write_room, 208 .write_room = visor_write_room,
204 .chars_in_buffer = visor_chars_in_buffer,
205 .write_bulk_callback = visor_write_bulk_callback, 209 .write_bulk_callback = visor_write_bulk_callback,
206 .read_bulk_callback = visor_read_bulk_callback, 210 .read_bulk_callback = visor_read_bulk_callback,
207 .read_int_callback = visor_read_int_callback, 211 .read_int_callback = visor_read_int_callback,
@@ -225,10 +229,8 @@ static struct usb_serial_driver clie_5_device = {
225 .probe = visor_probe, 229 .probe = visor_probe,
226 .calc_num_ports = visor_calc_num_ports, 230 .calc_num_ports = visor_calc_num_ports,
227 .shutdown = visor_shutdown, 231 .shutdown = visor_shutdown,
228 .ioctl = visor_ioctl,
229 .write = visor_write, 232 .write = visor_write,
230 .write_room = visor_write_room, 233 .write_room = visor_write_room,
231 .chars_in_buffer = visor_chars_in_buffer,
232 .write_bulk_callback = visor_write_bulk_callback, 234 .write_bulk_callback = visor_write_bulk_callback,
233 .read_bulk_callback = visor_read_bulk_callback, 235 .read_bulk_callback = visor_read_bulk_callback,
234 .read_int_callback = visor_read_int_callback, 236 .read_int_callback = visor_read_int_callback,
@@ -249,10 +251,8 @@ static struct usb_serial_driver clie_3_5_device = {
249 .throttle = visor_throttle, 251 .throttle = visor_throttle,
250 .unthrottle = visor_unthrottle, 252 .unthrottle = visor_unthrottle,
251 .attach = clie_3_5_startup, 253 .attach = clie_3_5_startup,
252 .ioctl = visor_ioctl,
253 .write = visor_write, 254 .write = visor_write,
254 .write_room = visor_write_room, 255 .write_room = visor_write_room,
255 .chars_in_buffer = visor_chars_in_buffer,
256 .write_bulk_callback = visor_write_bulk_callback, 256 .write_bulk_callback = visor_write_bulk_callback,
257 .read_bulk_callback = visor_read_bulk_callback, 257 .read_bulk_callback = visor_read_bulk_callback,
258}; 258};
@@ -274,7 +274,8 @@ static int stats;
274/****************************************************************************** 274/******************************************************************************
275 * Handspring Visor specific driver functions 275 * Handspring Visor specific driver functions
276 ******************************************************************************/ 276 ******************************************************************************/
277static int visor_open (struct usb_serial_port *port, struct file *filp) 277static int visor_open(struct tty_struct *tty, struct usb_serial_port *port,
278 struct file *filp)
278{ 279{
279 struct usb_serial *serial = port->serial; 280 struct usb_serial *serial = port->serial;
280 struct visor_private *priv = usb_get_serial_port_data(port); 281 struct visor_private *priv = usb_get_serial_port_data(port);
@@ -300,42 +301,45 @@ static int visor_open (struct usb_serial_port *port, struct file *filp)
300 * through, otherwise it is scheduled, and with high data rates (like 301 * through, otherwise it is scheduled, and with high data rates (like
301 * with OHCI) data can get lost. 302 * with OHCI) data can get lost.
302 */ 303 */
303 if (port->tty) 304 if (tty)
304 port->tty->low_latency = 1; 305 tty->low_latency = 1;
305 306
306 /* Start reading from the device */ 307 /* Start reading from the device */
307 usb_fill_bulk_urb (port->read_urb, serial->dev, 308 usb_fill_bulk_urb(port->read_urb, serial->dev,
308 usb_rcvbulkpipe (serial->dev, 309 usb_rcvbulkpipe(serial->dev,
309 port->bulk_in_endpointAddress), 310 port->bulk_in_endpointAddress),
310 port->read_urb->transfer_buffer, 311 port->read_urb->transfer_buffer,
311 port->read_urb->transfer_buffer_length, 312 port->read_urb->transfer_buffer_length,
312 visor_read_bulk_callback, port); 313 visor_read_bulk_callback, port);
313 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 314 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
314 if (result) { 315 if (result) {
315 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", 316 dev_err(&port->dev,
316 __func__, result); 317 "%s - failed submitting read urb, error %d\n",
318 __func__, result);
317 goto exit; 319 goto exit;
318 } 320 }
319 321
320 if (port->interrupt_in_urb) { 322 if (port->interrupt_in_urb) {
321 dbg("%s - adding interrupt input for treo", __func__); 323 dbg("%s - adding interrupt input for treo", __func__);
322 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 324 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
323 if (result) 325 if (result)
324 dev_err(&port->dev, "%s - failed submitting interrupt urb, error %d\n", 326 dev_err(&port->dev,
325 __func__, result); 327 "%s - failed submitting interrupt urb, error %d\n",
328 __func__, result);
326 } 329 }
327exit: 330exit:
328 return result; 331 return result;
329} 332}
330 333
331 334
332static void visor_close (struct usb_serial_port *port, struct file * filp) 335static void visor_close(struct tty_struct *tty,
336 struct usb_serial_port *port, struct file *filp)
333{ 337{
334 struct visor_private *priv = usb_get_serial_port_data(port); 338 struct visor_private *priv = usb_get_serial_port_data(port);
335 unsigned char *transfer_buffer; 339 unsigned char *transfer_buffer;
336 340
337 dbg("%s - port %d", __func__, port->number); 341 dbg("%s - port %d", __func__, port->number);
338 342
339 /* shutdown our urbs */ 343 /* shutdown our urbs */
340 usb_kill_urb(port->read_urb); 344 usb_kill_urb(port->read_urb);
341 usb_kill_urb(port->interrupt_in_urb); 345 usb_kill_urb(port->interrupt_in_urb);
@@ -343,14 +347,14 @@ static void visor_close (struct usb_serial_port *port, struct file * filp)
343 mutex_lock(&port->serial->disc_mutex); 347 mutex_lock(&port->serial->disc_mutex);
344 if (!port->serial->disconnected) { 348 if (!port->serial->disconnected) {
345 /* Try to send shutdown message, unless the device is gone */ 349 /* Try to send shutdown message, unless the device is gone */
346 transfer_buffer = kmalloc (0x12, GFP_KERNEL); 350 transfer_buffer = kmalloc(0x12, GFP_KERNEL);
347 if (transfer_buffer) { 351 if (transfer_buffer) {
348 usb_control_msg (port->serial->dev, 352 usb_control_msg(port->serial->dev,
349 usb_rcvctrlpipe(port->serial->dev, 0), 353 usb_rcvctrlpipe(port->serial->dev, 0),
350 VISOR_CLOSE_NOTIFICATION, 0xc2, 354 VISOR_CLOSE_NOTIFICATION, 0xc2,
351 0x0000, 0x0000, 355 0x0000, 0x0000,
352 transfer_buffer, 0x12, 300); 356 transfer_buffer, 0x12, 300);
353 kfree (transfer_buffer); 357 kfree(transfer_buffer);
354 } 358 }
355 } 359 }
356 mutex_unlock(&port->serial->disc_mutex); 360 mutex_unlock(&port->serial->disc_mutex);
@@ -361,7 +365,8 @@ static void visor_close (struct usb_serial_port *port, struct file * filp)
361} 365}
362 366
363 367
364static int visor_write (struct usb_serial_port *port, const unsigned char *buf, int count) 368static int visor_write(struct tty_struct *tty, struct usb_serial_port *port,
369 const unsigned char *buf, int count)
365{ 370{
366 struct visor_private *priv = usb_get_serial_port_data(port); 371 struct visor_private *priv = usb_get_serial_port_data(port);
367 struct usb_serial *serial = port->serial; 372 struct usb_serial *serial = port->serial;
@@ -381,7 +386,7 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf,
381 priv->outstanding_urbs++; 386 priv->outstanding_urbs++;
382 spin_unlock_irqrestore(&priv->lock, flags); 387 spin_unlock_irqrestore(&priv->lock, flags);
383 388
384 buffer = kmalloc (count, GFP_ATOMIC); 389 buffer = kmalloc(count, GFP_ATOMIC);
385 if (!buffer) { 390 if (!buffer) {
386 dev_err(&port->dev, "out of memory\n"); 391 dev_err(&port->dev, "out of memory\n");
387 count = -ENOMEM; 392 count = -ENOMEM;
@@ -395,21 +400,22 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf,
395 goto error_no_urb; 400 goto error_no_urb;
396 } 401 }
397 402
398 memcpy (buffer, buf, count); 403 memcpy(buffer, buf, count);
399 404
400 usb_serial_debug_data(debug, &port->dev, __func__, count, buffer); 405 usb_serial_debug_data(debug, &port->dev, __func__, count, buffer);
401 406
402 usb_fill_bulk_urb (urb, serial->dev, 407 usb_fill_bulk_urb(urb, serial->dev,
403 usb_sndbulkpipe (serial->dev, 408 usb_sndbulkpipe(serial->dev,
404 port->bulk_out_endpointAddress), 409 port->bulk_out_endpointAddress),
405 buffer, count, 410 buffer, count,
406 visor_write_bulk_callback, port); 411 visor_write_bulk_callback, port);
407 412
408 /* send it down the pipe */ 413 /* send it down the pipe */
409 status = usb_submit_urb(urb, GFP_ATOMIC); 414 status = usb_submit_urb(urb, GFP_ATOMIC);
410 if (status) { 415 if (status) {
411 dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed with status = %d\n", 416 dev_err(&port->dev,
412 __func__, status); 417 "%s - usb_submit_urb(write bulk) failed with status = %d\n",
418 __func__, status);
413 count = status; 419 count = status;
414 goto error; 420 goto error;
415 } else { 421 } else {
@@ -435,8 +441,9 @@ error_no_buffer:
435} 441}
436 442
437 443
438static int visor_write_room (struct usb_serial_port *port) 444static int visor_write_room(struct tty_struct *tty)
439{ 445{
446 struct usb_serial_port *port = tty->driver_data;
440 struct visor_private *priv = usb_get_serial_port_data(port); 447 struct visor_private *priv = usb_get_serial_port_data(port);
441 unsigned long flags; 448 unsigned long flags;
442 449
@@ -460,23 +467,7 @@ static int visor_write_room (struct usb_serial_port *port)
460} 467}
461 468
462 469
463static int visor_chars_in_buffer (struct usb_serial_port *port) 470static void visor_write_bulk_callback(struct urb *urb)
464{
465 dbg("%s - port %d", __func__, port->number);
466
467 /*
468 * We can't really account for how much data we
469 * have sent out, but hasn't made it through to the
470 * device, so just tell the tty layer that everything
471 * is flushed.
472 *
473 * FIXME: Should walk outstanding_urbs
474 */
475 return 0;
476}
477
478
479static void visor_write_bulk_callback (struct urb *urb)
480{ 471{
481 struct usb_serial_port *port = urb->context; 472 struct usb_serial_port *port = urb->context;
482 struct visor_private *priv = usb_get_serial_port_data(port); 473 struct visor_private *priv = usb_get_serial_port_data(port);
@@ -484,7 +475,7 @@ static void visor_write_bulk_callback (struct urb *urb)
484 unsigned long flags; 475 unsigned long flags;
485 476
486 /* free up the transfer buffer, as usb_free_urb() does not do this */ 477 /* free up the transfer buffer, as usb_free_urb() does not do this */
487 kfree (urb->transfer_buffer); 478 kfree(urb->transfer_buffer);
488 479
489 dbg("%s - port %d", __func__, port->number); 480 dbg("%s - port %d", __func__, port->number);
490 481
@@ -500,7 +491,7 @@ static void visor_write_bulk_callback (struct urb *urb)
500} 491}
501 492
502 493
503static void visor_read_bulk_callback (struct urb *urb) 494static void visor_read_bulk_callback(struct urb *urb)
504{ 495{
505 struct usb_serial_port *port = urb->context; 496 struct usb_serial_port *port = urb->context;
506 struct visor_private *priv = usb_get_serial_port_data(port); 497 struct visor_private *priv = usb_get_serial_port_data(port);
@@ -518,11 +509,13 @@ static void visor_read_bulk_callback (struct urb *urb)
518 return; 509 return;
519 } 510 }
520 511
521 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 512 usb_serial_debug_data(debug, &port->dev, __func__,
513 urb->actual_length, data);
522 514
523 tty = port->tty; 515 tty = port->port.tty;
524 if (tty && urb->actual_length) { 516 if (tty && urb->actual_length) {
525 available_room = tty_buffer_request_room(tty, urb->actual_length); 517 available_room = tty_buffer_request_room(tty,
518 urb->actual_length);
526 if (available_room) { 519 if (available_room) {
527 tty_insert_flip_string(tty, data, available_room); 520 tty_insert_flip_string(tty, data, available_room);
528 tty_flip_buffer_push(tty); 521 tty_flip_buffer_push(tty);
@@ -536,22 +529,23 @@ static void visor_read_bulk_callback (struct urb *urb)
536 529
537 /* Continue trying to always read if we should */ 530 /* Continue trying to always read if we should */
538 if (!priv->throttled) { 531 if (!priv->throttled) {
539 usb_fill_bulk_urb (port->read_urb, port->serial->dev, 532 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
540 usb_rcvbulkpipe(port->serial->dev, 533 usb_rcvbulkpipe(port->serial->dev,
541 port->bulk_in_endpointAddress), 534 port->bulk_in_endpointAddress),
542 port->read_urb->transfer_buffer, 535 port->read_urb->transfer_buffer,
543 port->read_urb->transfer_buffer_length, 536 port->read_urb->transfer_buffer_length,
544 visor_read_bulk_callback, port); 537 visor_read_bulk_callback, port);
545 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 538 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
546 if (result) 539 if (result)
547 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __func__, result); 540 dev_err(&port->dev,
548 } else { 541 "%s - failed resubmitting read urb, error %d\n",
542 __func__, result);
543 } else
549 priv->actually_throttled = 1; 544 priv->actually_throttled = 1;
550 }
551 spin_unlock(&priv->lock); 545 spin_unlock(&priv->lock);
552} 546}
553 547
554static void visor_read_int_callback (struct urb *urb) 548static void visor_read_int_callback(struct urb *urb)
555{ 549{
556 struct usb_serial_port *port = urb->context; 550 struct usb_serial_port *port = urb->context;
557 int status = urb->status; 551 int status = urb->status;
@@ -585,14 +579,16 @@ static void visor_read_int_callback (struct urb *urb)
585 urb->actual_length, urb->transfer_buffer); 579 urb->actual_length, urb->transfer_buffer);
586 580
587exit: 581exit:
588 result = usb_submit_urb (urb, GFP_ATOMIC); 582 result = usb_submit_urb(urb, GFP_ATOMIC);
589 if (result) 583 if (result)
590 dev_err(&urb->dev->dev, "%s - Error %d submitting interrupt urb\n", 584 dev_err(&urb->dev->dev,
591 __func__, result); 585 "%s - Error %d submitting interrupt urb\n",
586 __func__, result);
592} 587}
593 588
594static void visor_throttle (struct usb_serial_port *port) 589static void visor_throttle(struct tty_struct *tty)
595{ 590{
591 struct usb_serial_port *port = tty->driver_data;
596 struct visor_private *priv = usb_get_serial_port_data(port); 592 struct visor_private *priv = usb_get_serial_port_data(port);
597 unsigned long flags; 593 unsigned long flags;
598 594
@@ -603,8 +599,9 @@ static void visor_throttle (struct usb_serial_port *port)
603} 599}
604 600
605 601
606static void visor_unthrottle (struct usb_serial_port *port) 602static void visor_unthrottle(struct tty_struct *tty)
607{ 603{
604 struct usb_serial_port *port = tty->driver_data;
608 struct visor_private *priv = usb_get_serial_port_data(port); 605 struct visor_private *priv = usb_get_serial_port_data(port);
609 unsigned long flags; 606 unsigned long flags;
610 int result; 607 int result;
@@ -618,10 +615,13 @@ static void visor_unthrottle (struct usb_serial_port *port)
618 port->read_urb->dev = port->serial->dev; 615 port->read_urb->dev = port->serial->dev;
619 result = usb_submit_urb(port->read_urb, GFP_ATOMIC); 616 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
620 if (result) 617 if (result)
621 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __func__, result); 618 dev_err(&port->dev,
619 "%s - failed submitting read urb, error %d\n",
620 __func__, result);
622} 621}
623 622
624static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id *id) 623static int palm_os_3_probe(struct usb_serial *serial,
624 const struct usb_device_id *id)
625{ 625{
626 struct device *dev = &serial->dev->dev; 626 struct device *dev = &serial->dev->dev;
627 struct visor_connection_info *connection_info; 627 struct visor_connection_info *connection_info;
@@ -633,7 +633,7 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
633 633
634 dbg("%s", __func__); 634 dbg("%s", __func__);
635 635
636 transfer_buffer = kmalloc (sizeof (*connection_info), GFP_KERNEL); 636 transfer_buffer = kmalloc(sizeof(*connection_info), GFP_KERNEL);
637 if (!transfer_buffer) { 637 if (!transfer_buffer) {
638 dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__, 638 dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__,
639 sizeof(*connection_info)); 639 sizeof(*connection_info));
@@ -641,7 +641,7 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
641 } 641 }
642 642
643 /* send a get connection info request */ 643 /* send a get connection info request */
644 retval = usb_control_msg (serial->dev, 644 retval = usb_control_msg(serial->dev,
645 usb_rcvctrlpipe(serial->dev, 0), 645 usb_rcvctrlpipe(serial->dev, 0),
646 VISOR_GET_CONNECTION_INFORMATION, 646 VISOR_GET_CONNECTION_INFORMATION,
647 0xc2, 0x0000, 0x0000, transfer_buffer, 647 0xc2, 0x0000, 0x0000, transfer_buffer,
@@ -653,29 +653,31 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
653 } 653 }
654 654
655 if (retval == sizeof(*connection_info)) { 655 if (retval == sizeof(*connection_info)) {
656 connection_info = (struct visor_connection_info *)transfer_buffer; 656 connection_info = (struct visor_connection_info *)
657 transfer_buffer;
657 658
658 num_ports = le16_to_cpu(connection_info->num_ports); 659 num_ports = le16_to_cpu(connection_info->num_ports);
659 for (i = 0; i < num_ports; ++i) { 660 for (i = 0; i < num_ports; ++i) {
660 switch (connection_info->connections[i].port_function_id) { 661 switch (
661 case VISOR_FUNCTION_GENERIC: 662 connection_info->connections[i].port_function_id) {
662 string = "Generic"; 663 case VISOR_FUNCTION_GENERIC:
663 break; 664 string = "Generic";
664 case VISOR_FUNCTION_DEBUGGER: 665 break;
665 string = "Debugger"; 666 case VISOR_FUNCTION_DEBUGGER:
666 break; 667 string = "Debugger";
667 case VISOR_FUNCTION_HOTSYNC: 668 break;
668 string = "HotSync"; 669 case VISOR_FUNCTION_HOTSYNC:
669 break; 670 string = "HotSync";
670 case VISOR_FUNCTION_CONSOLE: 671 break;
671 string = "Console"; 672 case VISOR_FUNCTION_CONSOLE:
672 break; 673 string = "Console";
673 case VISOR_FUNCTION_REMOTE_FILE_SYS: 674 break;
674 string = "Remote File System"; 675 case VISOR_FUNCTION_REMOTE_FILE_SYS:
675 break; 676 string = "Remote File System";
676 default: 677 break;
677 string = "unknown"; 678 default:
678 break; 679 string = "unknown";
680 break;
679 } 681 }
680 dev_info(dev, "%s: port %d, is for %s use\n", 682 dev_info(dev, "%s: port %d, is for %s use\n",
681 serial->type->description, 683 serial->type->description,
@@ -686,11 +688,11 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
686 * Handle devices that report invalid stuff here. 688 * Handle devices that report invalid stuff here.
687 */ 689 */
688 if (num_ports == 0 || num_ports > 2) { 690 if (num_ports == 0 || num_ports > 2) {
689 dev_warn (dev, "%s: No valid connect info available\n", 691 dev_warn(dev, "%s: No valid connect info available\n",
690 serial->type->description); 692 serial->type->description);
691 num_ports = 2; 693 num_ports = 2;
692 } 694 }
693 695
694 dev_info(dev, "%s: Number of ports: %d\n", serial->type->description, 696 dev_info(dev, "%s: Number of ports: %d\n", serial->type->description,
695 num_ports); 697 num_ports);
696 698
@@ -700,8 +702,9 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
700 */ 702 */
701 usb_set_serial_data(serial, (void *)(long)num_ports); 703 usb_set_serial_data(serial, (void *)(long)num_ports);
702 704
703 /* ask for the number of bytes available, but ignore the response as it is broken */ 705 /* ask for the number of bytes available, but ignore the
704 retval = usb_control_msg (serial->dev, 706 response as it is broken */
707 retval = usb_control_msg(serial->dev,
705 usb_rcvctrlpipe(serial->dev, 0), 708 usb_rcvctrlpipe(serial->dev, 0),
706 VISOR_REQUEST_BYTES_AVAILABLE, 709 VISOR_REQUEST_BYTES_AVAILABLE,
707 0xc2, 0x0000, 0x0005, transfer_buffer, 710 0xc2, 0x0000, 0x0005, transfer_buffer,
@@ -712,12 +715,13 @@ static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_i
712 retval = 0; 715 retval = 0;
713 716
714exit: 717exit:
715 kfree (transfer_buffer); 718 kfree(transfer_buffer);
716 719
717 return retval; 720 return retval;
718} 721}
719 722
720static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id *id) 723static int palm_os_4_probe(struct usb_serial *serial,
724 const struct usb_device_id *id)
721{ 725{
722 struct device *dev = &serial->dev->dev; 726 struct device *dev = &serial->dev->dev;
723 struct palm_ext_connection_info *connection_info; 727 struct palm_ext_connection_info *connection_info;
@@ -726,18 +730,18 @@ static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_i
726 730
727 dbg("%s", __func__); 731 dbg("%s", __func__);
728 732
729 transfer_buffer = kmalloc (sizeof (*connection_info), GFP_KERNEL); 733 transfer_buffer = kmalloc(sizeof(*connection_info), GFP_KERNEL);
730 if (!transfer_buffer) { 734 if (!transfer_buffer) {
731 dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__, 735 dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__,
732 sizeof(*connection_info)); 736 sizeof(*connection_info));
733 return -ENOMEM; 737 return -ENOMEM;
734 } 738 }
735 739
736 retval = usb_control_msg (serial->dev, 740 retval = usb_control_msg(serial->dev,
737 usb_rcvctrlpipe(serial->dev, 0), 741 usb_rcvctrlpipe(serial->dev, 0),
738 PALM_GET_EXT_CONNECTION_INFORMATION, 742 PALM_GET_EXT_CONNECTION_INFORMATION,
739 0xc2, 0x0000, 0x0000, transfer_buffer, 743 0xc2, 0x0000, 0x0000, transfer_buffer,
740 sizeof (*connection_info), 300); 744 sizeof(*connection_info), 300);
741 if (retval < 0) 745 if (retval < 0)
742 dev_err(dev, "%s - error %d getting connection info\n", 746 dev_err(dev, "%s - error %d getting connection info\n",
743 __func__, retval); 747 __func__, retval);
@@ -745,15 +749,17 @@ static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_i
745 usb_serial_debug_data(debug, &serial->dev->dev, __func__, 749 usb_serial_debug_data(debug, &serial->dev->dev, __func__,
746 retval, transfer_buffer); 750 retval, transfer_buffer);
747 751
748 kfree (transfer_buffer); 752 kfree(transfer_buffer);
749 return 0; 753 return 0;
750} 754}
751 755
752 756
753static int visor_probe (struct usb_serial *serial, const struct usb_device_id *id) 757static int visor_probe(struct usb_serial *serial,
758 const struct usb_device_id *id)
754{ 759{
755 int retval = 0; 760 int retval = 0;
756 int (*startup) (struct usb_serial *serial, const struct usb_device_id *id); 761 int (*startup)(struct usb_serial *serial,
762 const struct usb_device_id *id);
757 763
758 dbg("%s", __func__); 764 dbg("%s", __func__);
759 765
@@ -771,7 +777,7 @@ static int visor_probe (struct usb_serial *serial, const struct usb_device_id *i
771 return retval; 777 return retval;
772} 778}
773 779
774static int visor_calc_num_ports (struct usb_serial *serial) 780static int visor_calc_num_ports(struct usb_serial *serial)
775{ 781{
776 int num_ports = (int)(long)(usb_get_serial_data(serial)); 782 int num_ports = (int)(long)(usb_get_serial_data(serial));
777 783
@@ -788,7 +794,7 @@ static int generic_startup(struct usb_serial *serial)
788 int i; 794 int i;
789 795
790 for (i = 0; i < serial->num_ports; ++i) { 796 for (i = 0; i < serial->num_ports; ++i) {
791 priv = kzalloc (sizeof(*priv), GFP_KERNEL); 797 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
792 if (!priv) { 798 if (!priv) {
793 while (i-- != 0) { 799 while (i-- != 0) {
794 priv = usb_get_serial_port_data(ports[i]); 800 priv = usb_get_serial_port_data(ports[i]);
@@ -803,7 +809,7 @@ static int generic_startup(struct usb_serial *serial)
803 return 0; 809 return 0;
804} 810}
805 811
806static int clie_3_5_startup (struct usb_serial *serial) 812static int clie_3_5_startup(struct usb_serial *serial)
807{ 813{
808 struct device *dev = &serial->dev->dev; 814 struct device *dev = &serial->dev->dev;
809 int result; 815 int result;
@@ -816,62 +822,72 @@ static int clie_3_5_startup (struct usb_serial *serial)
816 */ 822 */
817 823
818 /* get the config number */ 824 /* get the config number */
819 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), 825 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
820 USB_REQ_GET_CONFIGURATION, USB_DIR_IN, 826 USB_REQ_GET_CONFIGURATION, USB_DIR_IN,
821 0, 0, &data, 1, 3000); 827 0, 0, &data, 1, 3000);
822 if (result < 0) { 828 if (result < 0) {
823 dev_err(dev, "%s: get config number failed: %d\n", __func__, result); 829 dev_err(dev, "%s: get config number failed: %d\n",
830 __func__, result);
824 return result; 831 return result;
825 } 832 }
826 if (result != 1) { 833 if (result != 1) {
827 dev_err(dev, "%s: get config number bad return length: %d\n", __func__, result); 834 dev_err(dev, "%s: get config number bad return length: %d\n",
835 __func__, result);
828 return -EIO; 836 return -EIO;
829 } 837 }
830 838
831 /* get the interface number */ 839 /* get the interface number */
832 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), 840 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
833 USB_REQ_GET_INTERFACE, 841 USB_REQ_GET_INTERFACE,
834 USB_DIR_IN | USB_RECIP_INTERFACE, 842 USB_DIR_IN | USB_RECIP_INTERFACE,
835 0, 0, &data, 1, 3000); 843 0, 0, &data, 1, 3000);
836 if (result < 0) { 844 if (result < 0) {
837 dev_err(dev, "%s: get interface number failed: %d\n", __func__, result); 845 dev_err(dev, "%s: get interface number failed: %d\n",
846 __func__, result);
838 return result; 847 return result;
839 } 848 }
840 if (result != 1) { 849 if (result != 1) {
841 dev_err(dev, "%s: get interface number bad return length: %d\n", __func__, result); 850 dev_err(dev,
851 "%s: get interface number bad return length: %d\n",
852 __func__, result);
842 return -EIO; 853 return -EIO;
843 } 854 }
844 855
845 return generic_startup(serial); 856 return generic_startup(serial);
846} 857}
847 858
848static int treo_attach (struct usb_serial *serial) 859static int treo_attach(struct usb_serial *serial)
849{ 860{
850 struct usb_serial_port *swap_port; 861 struct usb_serial_port *swap_port;
851 862
852 /* Only do this endpoint hack for the Handspring devices with 863 /* Only do this endpoint hack for the Handspring devices with
853 * interrupt in endpoints, which for now are the Treo devices. */ 864 * interrupt in endpoints, which for now are the Treo devices. */
854 if (!((le16_to_cpu(serial->dev->descriptor.idVendor) == HANDSPRING_VENDOR_ID) || 865 if (!((le16_to_cpu(serial->dev->descriptor.idVendor)
855 (le16_to_cpu(serial->dev->descriptor.idVendor) == KYOCERA_VENDOR_ID)) || 866 == HANDSPRING_VENDOR_ID) ||
856 (serial->num_interrupt_in == 0)) 867 (le16_to_cpu(serial->dev->descriptor.idVendor)
868 == KYOCERA_VENDOR_ID)) ||
869 (serial->num_interrupt_in == 0))
857 goto generic_startup; 870 goto generic_startup;
858 871
859 dbg("%s", __func__); 872 dbg("%s", __func__);
860 873
861 /* 874 /*
862 * It appears that Treos and Kyoceras want to use the 875 * It appears that Treos and Kyoceras want to use the
863 * 1st bulk in endpoint to communicate with the 2nd bulk out endpoint, 876 * 1st bulk in endpoint to communicate with the 2nd bulk out endpoint,
864 * so let's swap the 1st and 2nd bulk in and interrupt endpoints. 877 * so let's swap the 1st and 2nd bulk in and interrupt endpoints.
865 * Note that swapping the bulk out endpoints would break lots of 878 * Note that swapping the bulk out endpoints would break lots of
866 * apps that want to communicate on the second port. 879 * apps that want to communicate on the second port.
867 */ 880 */
868#define COPY_PORT(dest, src) \ 881#define COPY_PORT(dest, src) \
869 dest->read_urb = src->read_urb; \ 882 do { \
870 dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress; \ 883 dest->read_urb = src->read_urb; \
871 dest->bulk_in_buffer = src->bulk_in_buffer; \ 884 dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\
872 dest->interrupt_in_urb = src->interrupt_in_urb; \ 885 dest->bulk_in_buffer = src->bulk_in_buffer; \
873 dest->interrupt_in_endpointAddress = src->interrupt_in_endpointAddress; \ 886 dest->interrupt_in_urb = src->interrupt_in_urb; \
874 dest->interrupt_in_buffer = src->interrupt_in_buffer; 887 dest->interrupt_in_endpointAddress = \
888 src->interrupt_in_endpointAddress;\
889 dest->interrupt_in_buffer = src->interrupt_in_buffer; \
890 } while (0);
875 891
876 swap_port = kmalloc(sizeof(*swap_port), GFP_KERNEL); 892 swap_port = kmalloc(sizeof(*swap_port), GFP_KERNEL);
877 if (!swap_port) 893 if (!swap_port)
@@ -885,28 +901,30 @@ generic_startup:
885 return generic_startup(serial); 901 return generic_startup(serial);
886} 902}
887 903
888static int clie_5_attach (struct usb_serial *serial) 904static int clie_5_attach(struct usb_serial *serial)
889{ 905{
890 dbg("%s", __func__); 906 dbg("%s", __func__);
891 907
892 /* TH55 registers 2 ports. 908 /* TH55 registers 2 ports.
893 Communication in from the UX50/TH55 uses bulk_in_endpointAddress from port 0 909 Communication in from the UX50/TH55 uses bulk_in_endpointAddress
894 Communication out to the UX50/TH55 uses bulk_out_endpointAddress from port 1 910 from port 0. Communication out to the UX50/TH55 uses
895 911 bulk_out_endpointAddress from port 1
912
896 Lets do a quick and dirty mapping 913 Lets do a quick and dirty mapping
897 */ 914 */
898 915
899 /* some sanity check */ 916 /* some sanity check */
900 if (serial->num_ports < 2) 917 if (serial->num_ports < 2)
901 return -1; 918 return -1;
902 919
903 /* port 0 now uses the modified endpoint Address */ 920 /* port 0 now uses the modified endpoint Address */
904 serial->port[0]->bulk_out_endpointAddress = serial->port[1]->bulk_out_endpointAddress; 921 serial->port[0]->bulk_out_endpointAddress =
922 serial->port[1]->bulk_out_endpointAddress;
905 923
906 return generic_startup(serial); 924 return generic_startup(serial);
907} 925}
908 926
909static void visor_shutdown (struct usb_serial *serial) 927static void visor_shutdown(struct usb_serial *serial)
910{ 928{
911 struct visor_private *priv; 929 struct visor_private *priv;
912 int i; 930 int i;
@@ -922,37 +940,35 @@ static void visor_shutdown (struct usb_serial *serial)
922 } 940 }
923} 941}
924 942
925static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) 943static int __init visor_init(void)
926{
927 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd);
928
929 return -ENOIOCTLCMD;
930}
931
932static int __init visor_init (void)
933{ 944{
934 int i, retval; 945 int i, retval;
935 /* Only if parameters were passed to us */ 946 /* Only if parameters were passed to us */
936 if ((vendor>0) && (product>0)) { 947 if (vendor > 0 && product > 0) {
937 struct usb_device_id usb_dev_temp[]= 948 struct usb_device_id usb_dev_temp[] = {
938 {{USB_DEVICE(vendor, product), 949 {
939 .driver_info = (kernel_ulong_t)&palm_os_4_probe }}; 950 USB_DEVICE(vendor, product),
951 .driver_info =
952 (kernel_ulong_t) &palm_os_4_probe
953 }
954 };
940 955
941 /* Find the last entry in id_table */ 956 /* Find the last entry in id_table */
942 for (i=0; ; i++) { 957 for (i = 0;; i++) {
943 if (id_table[i].idVendor==0) { 958 if (id_table[i].idVendor == 0) {
944 id_table[i] = usb_dev_temp[0]; 959 id_table[i] = usb_dev_temp[0];
945 break; 960 break;
946 } 961 }
947 } 962 }
948 /* Find the last entry in id_table_combined */ 963 /* Find the last entry in id_table_combined */
949 for (i=0; ; i++) { 964 for (i = 0;; i++) {
950 if (id_table_combined[i].idVendor==0) { 965 if (id_table_combined[i].idVendor == 0) {
951 id_table_combined[i] = usb_dev_temp[0]; 966 id_table_combined[i] = usb_dev_temp[0];
952 break; 967 break;
953 } 968 }
954 } 969 }
955 info("Untested USB device specified at time of module insertion"); 970 info(
971 "Untested USB device specified at time of module insertion");
956 info("Warning: This is not guaranteed to work"); 972 info("Warning: This is not guaranteed to work");
957 info("Using a newer kernel is preferred to this method"); 973 info("Using a newer kernel is preferred to this method");
958 info("Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x", 974 info("Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x",
@@ -968,7 +984,7 @@ static int __init visor_init (void)
968 if (retval) 984 if (retval)
969 goto failed_clie_5_register; 985 goto failed_clie_5_register;
970 retval = usb_register(&visor_driver); 986 retval = usb_register(&visor_driver);
971 if (retval) 987 if (retval)
972 goto failed_usb_register; 988 goto failed_usb_register;
973 info(DRIVER_DESC); 989 info(DRIVER_DESC);
974 990
@@ -986,18 +1002,18 @@ failed_handspring_register:
986 1002
987static void __exit visor_exit (void) 1003static void __exit visor_exit (void)
988{ 1004{
989 usb_deregister (&visor_driver); 1005 usb_deregister(&visor_driver);
990 usb_serial_deregister (&handspring_device); 1006 usb_serial_deregister(&handspring_device);
991 usb_serial_deregister (&clie_3_5_device); 1007 usb_serial_deregister(&clie_3_5_device);
992 usb_serial_deregister (&clie_5_device); 1008 usb_serial_deregister(&clie_5_device);
993} 1009}
994 1010
995 1011
996module_init(visor_init); 1012module_init(visor_init);
997module_exit(visor_exit); 1013module_exit(visor_exit);
998 1014
999MODULE_AUTHOR( DRIVER_AUTHOR ); 1015MODULE_AUTHOR(DRIVER_AUTHOR);
1000MODULE_DESCRIPTION( DRIVER_DESC ); 1016MODULE_DESCRIPTION(DRIVER_DESC);
1001MODULE_LICENSE("GPL"); 1017MODULE_LICENSE("GPL");
1002 1018
1003module_param(debug, bool, S_IRUGO | S_IWUSR); 1019module_param(debug, bool, S_IRUGO | S_IWUSR);
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
index 665aa77a917b..3a9d14384a43 100644
--- a/drivers/usb/serial/whiteheat.c
+++ b/drivers/usb/serial/whiteheat.c
@@ -12,29 +12,31 @@
12 * the Free Software Foundation; either version 2 of the License, or 12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version. 13 * (at your option) any later version.
14 * 14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver 15 * See Documentation/usb/usb-serial.txt for more information on using this
16 * driver
16 * 17 *
17 * (10/09/2002) Stuart MacDonald (stuartm@connecttech.com) 18 * (10/09/2002) Stuart MacDonald (stuartm@connecttech.com)
18 * Upgrade to full working driver 19 * Upgrade to full working driver
19 * 20 *
20 * (05/30/2001) gkh 21 * (05/30/2001) gkh
21 * switched from using spinlock to a semaphore, which fixes lots of problems. 22 * switched from using spinlock to a semaphore, which fixes lots of
23 * problems.
22 * 24 *
23 * (04/08/2001) gb 25 * (04/08/2001) gb
24 * Identify version on module load. 26 * Identify version on module load.
25 * 27 *
26 * 2001_Mar_19 gkh 28 * 2001_Mar_19 gkh
27 * Fixed MOD_INC and MOD_DEC logic, the ability to open a port more 29 * Fixed MOD_INC and MOD_DEC logic, the ability to open a port more
28 * than once, and the got the proper usb_device_id table entries so 30 * than once, and the got the proper usb_device_id table entries so
29 * the driver works again. 31 * the driver works again.
30 * 32 *
31 * (11/01/2000) Adam J. Richter 33 * (11/01/2000) Adam J. Richter
32 * usb_device_id table support 34 * usb_device_id table support
33 * 35 *
34 * (10/05/2000) gkh 36 * (10/05/2000) gkh
35 * Fixed bug with urb->dev not being set properly, now that the usb 37 * Fixed bug with urb->dev not being set properly, now that the usb
36 * core needs it. 38 * core needs it.
37 * 39 *
38 * (10/03/2000) smd 40 * (10/03/2000) smd
39 * firmware is improved to guard against crap sent to device 41 * firmware is improved to guard against crap sent to device
40 * firmware now replies CMD_FAILURE on bad things 42 * firmware now replies CMD_FAILURE on bad things
@@ -52,9 +54,9 @@
52 * Fixed bug with port->minor that was found by Al Borchers 54 * Fixed bug with port->minor that was found by Al Borchers
53 * 55 *
54 * (07/04/2000) gkh 56 * (07/04/2000) gkh
55 * Added support for port settings. Baud rate can now be changed. Line signals 57 * Added support for port settings. Baud rate can now be changed. Line
56 * are not transferred to and from the tty layer yet, but things seem to be 58 * signals are not transferred to and from the tty layer yet, but things
57 * working well now. 59 * seem to be working well now.
58 * 60 *
59 * (05/04/2000) gkh 61 * (05/04/2000) gkh
60 * First cut at open and close commands. Data can flow through the ports at 62 * First cut at open and close commands. Data can flow through the ports at
@@ -62,7 +64,7 @@
62 * 64 *
63 * (03/26/2000) gkh 65 * (03/26/2000) gkh
64 * Split driver up into device specific pieces. 66 * Split driver up into device specific pieces.
65 * 67 *
66 */ 68 */
67 69
68#include <linux/kernel.h> 70#include <linux/kernel.h>
@@ -75,7 +77,7 @@
75#include <linux/module.h> 77#include <linux/module.h>
76#include <linux/spinlock.h> 78#include <linux/spinlock.h>
77#include <linux/mutex.h> 79#include <linux/mutex.h>
78#include <asm/uaccess.h> 80#include <linux/uaccess.h>
79#include <asm/termbits.h> 81#include <asm/termbits.h>
80#include <linux/usb.h> 82#include <linux/usb.h>
81#include <linux/serial_reg.h> 83#include <linux/serial_reg.h>
@@ -125,7 +127,7 @@ static struct usb_device_id id_table_combined [] = {
125 { } /* Terminating entry */ 127 { } /* Terminating entry */
126}; 128};
127 129
128MODULE_DEVICE_TABLE (usb, id_table_combined); 130MODULE_DEVICE_TABLE(usb, id_table_combined);
129 131
130static struct usb_driver whiteheat_driver = { 132static struct usb_driver whiteheat_driver = {
131 .name = "whiteheat", 133 .name = "whiteheat",
@@ -136,26 +138,34 @@ static struct usb_driver whiteheat_driver = {
136}; 138};
137 139
138/* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */ 140/* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */
139static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id); 141static int whiteheat_firmware_download(struct usb_serial *serial,
140static int whiteheat_firmware_attach (struct usb_serial *serial); 142 const struct usb_device_id *id);
143static int whiteheat_firmware_attach(struct usb_serial *serial);
141 144
142/* function prototypes for the Connect Tech WhiteHEAT serial converter */ 145/* function prototypes for the Connect Tech WhiteHEAT serial converter */
143static int whiteheat_attach (struct usb_serial *serial); 146static int whiteheat_attach(struct usb_serial *serial);
144static void whiteheat_shutdown (struct usb_serial *serial); 147static void whiteheat_shutdown(struct usb_serial *serial);
145static int whiteheat_open (struct usb_serial_port *port, struct file *filp); 148static int whiteheat_open(struct tty_struct *tty,
146static void whiteheat_close (struct usb_serial_port *port, struct file *filp); 149 struct usb_serial_port *port, struct file *filp);
147static int whiteheat_write (struct usb_serial_port *port, const unsigned char *buf, int count); 150static void whiteheat_close(struct tty_struct *tty,
148static int whiteheat_write_room (struct usb_serial_port *port); 151 struct usb_serial_port *port, struct file *filp);
149static int whiteheat_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); 152static int whiteheat_write(struct tty_struct *tty,
150static void whiteheat_set_termios (struct usb_serial_port *port, struct ktermios * old); 153 struct usb_serial_port *port,
151static int whiteheat_tiocmget (struct usb_serial_port *port, struct file *file); 154 const unsigned char *buf, int count);
152static int whiteheat_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); 155static int whiteheat_write_room(struct tty_struct *tty);
153static void whiteheat_break_ctl (struct usb_serial_port *port, int break_state); 156static int whiteheat_ioctl(struct tty_struct *tty, struct file *file,
154static int whiteheat_chars_in_buffer (struct usb_serial_port *port); 157 unsigned int cmd, unsigned long arg);
155static void whiteheat_throttle (struct usb_serial_port *port); 158static void whiteheat_set_termios(struct tty_struct *tty,
156static void whiteheat_unthrottle (struct usb_serial_port *port); 159 struct usb_serial_port *port, struct ktermios *old);
157static void whiteheat_read_callback (struct urb *urb); 160static int whiteheat_tiocmget(struct tty_struct *tty, struct file *file);
158static void whiteheat_write_callback (struct urb *urb); 161static int whiteheat_tiocmset(struct tty_struct *tty, struct file *file,
162 unsigned int set, unsigned int clear);
163static void whiteheat_break_ctl(struct tty_struct *tty, int break_state);
164static int whiteheat_chars_in_buffer(struct tty_struct *tty);
165static void whiteheat_throttle(struct tty_struct *tty);
166static void whiteheat_unthrottle(struct tty_struct *tty);
167static void whiteheat_read_callback(struct urb *urb);
168static void whiteheat_write_callback(struct urb *urb);
159 169
160static struct usb_serial_driver whiteheat_fake_device = { 170static struct usb_serial_driver whiteheat_fake_device = {
161 .driver = { 171 .driver = {
@@ -202,7 +212,9 @@ struct whiteheat_command_private {
202 struct mutex mutex; 212 struct mutex mutex;
203 __u8 port_running; 213 __u8 port_running;
204 __u8 command_finished; 214 __u8 command_finished;
205 wait_queue_head_t wait_command; /* for handling sleeping while waiting for a command to finish */ 215 wait_queue_head_t wait_command; /* for handling sleeping whilst
216 waiting for a command to
217 finish */
206 __u8 result_buffer[64]; 218 __u8 result_buffer[64];
207}; 219};
208 220
@@ -239,14 +251,16 @@ static void command_port_write_callback(struct urb *urb);
239static void command_port_read_callback(struct urb *urb); 251static void command_port_read_callback(struct urb *urb);
240 252
241static int start_port_read(struct usb_serial_port *port); 253static int start_port_read(struct usb_serial_port *port);
242static struct whiteheat_urb_wrap *urb_to_wrap(struct urb *urb, struct list_head *head); 254static struct whiteheat_urb_wrap *urb_to_wrap(struct urb *urb,
255 struct list_head *head);
243static struct list_head *list_first(struct list_head *head); 256static struct list_head *list_first(struct list_head *head);
244static void rx_data_softint(struct work_struct *work); 257static void rx_data_softint(struct work_struct *work);
245 258
246static int firm_send_command(struct usb_serial_port *port, __u8 command, __u8 *data, __u8 datasize); 259static int firm_send_command(struct usb_serial_port *port, __u8 command,
260 __u8 *data, __u8 datasize);
247static int firm_open(struct usb_serial_port *port); 261static int firm_open(struct usb_serial_port *port);
248static int firm_close(struct usb_serial_port *port); 262static int firm_close(struct usb_serial_port *port);
249static int firm_setup_port(struct usb_serial_port *port); 263static int firm_setup_port(struct tty_struct *tty);
250static int firm_set_rts(struct usb_serial_port *port, __u8 onoff); 264static int firm_set_rts(struct usb_serial_port *port, __u8 onoff);
251static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff); 265static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff);
252static int firm_set_break(struct usb_serial_port *port, __u8 onoff); 266static int firm_set_break(struct usb_serial_port *port, __u8 onoff);
@@ -278,7 +292,8 @@ static int firm_report_tx_done(struct usb_serial_port *port);
278 - device renumerated itself and comes up as new device id with all 292 - device renumerated itself and comes up as new device id with all
279 firmware download completed. 293 firmware download completed.
280*/ 294*/
281static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id) 295static int whiteheat_firmware_download(struct usb_serial *serial,
296 const struct usb_device_id *id)
282{ 297{
283 int response, ret = -ENOENT; 298 int response, ret = -ENOENT;
284 const struct firmware *loader_fw = NULL, *firmware_fw = NULL; 299 const struct firmware *loader_fw = NULL, *firmware_fw = NULL;
@@ -313,7 +328,7 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct
313 record = ihex_next_binrec(record); 328 record = ihex_next_binrec(record);
314 } 329 }
315 330
316 response = ezusb_set_reset (serial, 0); 331 response = ezusb_set_reset(serial, 0);
317 332
318 record = (const struct ihex_binrec *)firmware_fw->data; 333 record = (const struct ihex_binrec *)firmware_fw->data;
319 while (record && be32_to_cpu(record->addr) < 0x1b40) 334 while (record && be32_to_cpu(record->addr) < 0x1b40)
@@ -330,8 +345,8 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct
330 } 345 }
331 ++record; 346 ++record;
332 } 347 }
333 348
334 response = ezusb_set_reset (serial, 1); 349 response = ezusb_set_reset(serial, 1);
335 350
336 record = (const struct ihex_binrec *)firmware_fw->data; 351 record = (const struct ihex_binrec *)firmware_fw->data;
337 while (record && be32_to_cpu(record->addr) < 0x1b40) { 352 while (record && be32_to_cpu(record->addr) < 0x1b40) {
@@ -355,7 +370,7 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct
355} 370}
356 371
357 372
358static int whiteheat_firmware_attach (struct usb_serial *serial) 373static int whiteheat_firmware_attach(struct usb_serial *serial)
359{ 374{
360 /* We want this device to fail to have a driver assigned to it */ 375 /* We want this device to fail to have a driver assigned to it */
361 return 1; 376 return 1;
@@ -365,7 +380,7 @@ static int whiteheat_firmware_attach (struct usb_serial *serial)
365/***************************************************************************** 380/*****************************************************************************
366 * Connect Tech's White Heat serial driver functions 381 * Connect Tech's White Heat serial driver functions
367 *****************************************************************************/ 382 *****************************************************************************/
368static int whiteheat_attach (struct usb_serial *serial) 383static int whiteheat_attach(struct usb_serial *serial)
369{ 384{
370 struct usb_serial_port *command_port; 385 struct usb_serial_port *command_port;
371 struct whiteheat_command_private *command_info; 386 struct whiteheat_command_private *command_info;
@@ -386,43 +401,52 @@ static int whiteheat_attach (struct usb_serial *serial)
386 401
387 command_port = serial->port[COMMAND_PORT]; 402 command_port = serial->port[COMMAND_PORT];
388 403
389 pipe = usb_sndbulkpipe (serial->dev, command_port->bulk_out_endpointAddress); 404 pipe = usb_sndbulkpipe(serial->dev,
405 command_port->bulk_out_endpointAddress);
390 command = kmalloc(2, GFP_KERNEL); 406 command = kmalloc(2, GFP_KERNEL);
391 if (!command) 407 if (!command)
392 goto no_command_buffer; 408 goto no_command_buffer;
393 command[0] = WHITEHEAT_GET_HW_INFO; 409 command[0] = WHITEHEAT_GET_HW_INFO;
394 command[1] = 0; 410 command[1] = 0;
395 411
396 result = kmalloc(sizeof(*hw_info) + 1, GFP_KERNEL); 412 result = kmalloc(sizeof(*hw_info) + 1, GFP_KERNEL);
397 if (!result) 413 if (!result)
398 goto no_result_buffer; 414 goto no_result_buffer;
399 /* 415 /*
400 * When the module is reloaded the firmware is still there and 416 * When the module is reloaded the firmware is still there and
401 * the endpoints are still in the usb core unchanged. This is the 417 * the endpoints are still in the usb core unchanged. This is the
402 * unlinking bug in disguise. Same for the call below. 418 * unlinking bug in disguise. Same for the call below.
403 */ 419 */
404 usb_clear_halt(serial->dev, pipe); 420 usb_clear_halt(serial->dev, pipe);
405 ret = usb_bulk_msg (serial->dev, pipe, command, 2, &alen, COMMAND_TIMEOUT_MS); 421 ret = usb_bulk_msg(serial->dev, pipe, command, 2,
422 &alen, COMMAND_TIMEOUT_MS);
406 if (ret) { 423 if (ret) {
407 err("%s: Couldn't send command [%d]", serial->type->description, ret); 424 err("%s: Couldn't send command [%d]",
425 serial->type->description, ret);
408 goto no_firmware; 426 goto no_firmware;
409 } else if (alen != 2) { 427 } else if (alen != 2) {
410 err("%s: Send command incomplete [%d]", serial->type->description, alen); 428 err("%s: Send command incomplete [%d]",
429 serial->type->description, alen);
411 goto no_firmware; 430 goto no_firmware;
412 } 431 }
413 432
414 pipe = usb_rcvbulkpipe (serial->dev, command_port->bulk_in_endpointAddress); 433 pipe = usb_rcvbulkpipe(serial->dev,
434 command_port->bulk_in_endpointAddress);
415 /* See the comment on the usb_clear_halt() above */ 435 /* See the comment on the usb_clear_halt() above */
416 usb_clear_halt(serial->dev, pipe); 436 usb_clear_halt(serial->dev, pipe);
417 ret = usb_bulk_msg (serial->dev, pipe, result, sizeof(*hw_info) + 1, &alen, COMMAND_TIMEOUT_MS); 437 ret = usb_bulk_msg(serial->dev, pipe, result,
438 sizeof(*hw_info) + 1, &alen, COMMAND_TIMEOUT_MS);
418 if (ret) { 439 if (ret) {
419 err("%s: Couldn't get results [%d]", serial->type->description, ret); 440 err("%s: Couldn't get results [%d]",
441 serial->type->description, ret);
420 goto no_firmware; 442 goto no_firmware;
421 } else if (alen != sizeof(*hw_info) + 1) { 443 } else if (alen != sizeof(*hw_info) + 1) {
422 err("%s: Get results incomplete [%d]", serial->type->description, alen); 444 err("%s: Get results incomplete [%d]",
445 serial->type->description, alen);
423 goto no_firmware; 446 goto no_firmware;
424 } else if (result[0] != command[0]) { 447 } else if (result[0] != command[0]) {
425 err("%s: Command failed [%d]", serial->type->description, result[0]); 448 err("%s: Command failed [%d]",
449 serial->type->description, result[0]);
426 goto no_firmware; 450 goto no_firmware;
427 } 451 }
428 452
@@ -436,7 +460,8 @@ static int whiteheat_attach (struct usb_serial *serial)
436 460
437 info = kmalloc(sizeof(struct whiteheat_private), GFP_KERNEL); 461 info = kmalloc(sizeof(struct whiteheat_private), GFP_KERNEL);
438 if (info == NULL) { 462 if (info == NULL) {
439 err("%s: Out of memory for port structures\n", serial->type->description); 463 err("%s: Out of memory for port structures\n",
464 serial->type->description);
440 goto no_private; 465 goto no_private;
441 } 466 }
442 467
@@ -506,9 +531,11 @@ static int whiteheat_attach (struct usb_serial *serial)
506 usb_set_serial_port_data(port, info); 531 usb_set_serial_port_data(port, info);
507 } 532 }
508 533
509 command_info = kmalloc(sizeof(struct whiteheat_command_private), GFP_KERNEL); 534 command_info = kmalloc(sizeof(struct whiteheat_command_private),
535 GFP_KERNEL);
510 if (command_info == NULL) { 536 if (command_info == NULL) {
511 err("%s: Out of memory for port structures\n", serial->type->description); 537 err("%s: Out of memory for port structures\n",
538 serial->type->description);
512 goto no_command_private; 539 goto no_command_private;
513 } 540 }
514 541
@@ -525,9 +552,12 @@ static int whiteheat_attach (struct usb_serial *serial)
525 552
526no_firmware: 553no_firmware:
527 /* Firmware likely not running */ 554 /* Firmware likely not running */
528 err("%s: Unable to retrieve firmware version, try replugging\n", serial->type->description); 555 err("%s: Unable to retrieve firmware version, try replugging\n",
529 err("%s: If the firmware is not running (status led not blinking)\n", serial->type->description); 556 serial->type->description);
530 err("%s: please contact support@connecttech.com\n", serial->type->description); 557 err("%s: If the firmware is not running (status led not blinking)\n",
558 serial->type->description);
559 err("%s: please contact support@connecttech.com\n",
560 serial->type->description);
531 kfree(result); 561 kfree(result);
532 return -ENODEV; 562 return -ENODEV;
533 563
@@ -570,7 +600,7 @@ no_command_buffer:
570} 600}
571 601
572 602
573static void whiteheat_shutdown (struct usb_serial *serial) 603static void whiteheat_shutdown(struct usb_serial *serial)
574{ 604{
575 struct usb_serial_port *command_port; 605 struct usb_serial_port *command_port;
576 struct usb_serial_port *port; 606 struct usb_serial_port *port;
@@ -585,7 +615,7 @@ static void whiteheat_shutdown (struct usb_serial *serial)
585 615
586 /* free up our private data for our command port */ 616 /* free up our private data for our command port */
587 command_port = serial->port[COMMAND_PORT]; 617 command_port = serial->port[COMMAND_PORT];
588 kfree (usb_get_serial_port_data(command_port)); 618 kfree(usb_get_serial_port_data(command_port));
589 619
590 for (i = 0; i < serial->num_ports; i++) { 620 for (i = 0; i < serial->num_ports; i++) {
591 port = serial->port[i]; 621 port = serial->port[i];
@@ -612,11 +642,10 @@ static void whiteheat_shutdown (struct usb_serial *serial)
612 return; 642 return;
613} 643}
614 644
615 645static int whiteheat_open(struct tty_struct *tty,
616static int whiteheat_open (struct usb_serial_port *port, struct file *filp) 646 struct usb_serial_port *port, struct file *filp)
617{ 647{
618 int retval = 0; 648 int retval = 0;
619 struct ktermios old_term;
620 649
621 dbg("%s - port %d", __func__, port->number); 650 dbg("%s - port %d", __func__, port->number);
622 651
@@ -624,7 +653,8 @@ static int whiteheat_open (struct usb_serial_port *port, struct file *filp)
624 if (retval) 653 if (retval)
625 goto exit; 654 goto exit;
626 655
627 port->tty->low_latency = 1; 656 if (tty)
657 tty->low_latency = 1;
628 658
629 /* send an open port command */ 659 /* send an open port command */
630 retval = firm_open(port); 660 retval = firm_open(port);
@@ -640,9 +670,8 @@ static int whiteheat_open (struct usb_serial_port *port, struct file *filp)
640 goto exit; 670 goto exit;
641 } 671 }
642 672
643 old_term.c_cflag = ~port->tty->termios->c_cflag; 673 if (tty)
644 old_term.c_iflag = ~port->tty->termios->c_iflag; 674 firm_setup_port(tty);
645 whiteheat_set_termios(port, &old_term);
646 675
647 /* Work around HCD bugs */ 676 /* Work around HCD bugs */
648 usb_clear_halt(port->serial->dev, port->read_urb->pipe); 677 usb_clear_halt(port->serial->dev, port->read_urb->pipe);
@@ -651,7 +680,8 @@ static int whiteheat_open (struct usb_serial_port *port, struct file *filp)
651 /* Start reading from the device */ 680 /* Start reading from the device */
652 retval = start_port_read(port); 681 retval = start_port_read(port);
653 if (retval) { 682 if (retval) {
654 err("%s - failed submitting read urb, error %d", __func__, retval); 683 err("%s - failed submitting read urb, error %d",
684 __func__, retval);
655 firm_close(port); 685 firm_close(port);
656 stop_command_port(port->serial); 686 stop_command_port(port->serial);
657 goto exit; 687 goto exit;
@@ -663,7 +693,8 @@ exit:
663} 693}
664 694
665 695
666static void whiteheat_close(struct usb_serial_port *port, struct file * filp) 696static void whiteheat_close(struct tty_struct *tty,
697 struct usb_serial_port *port, struct file *filp)
667{ 698{
668 struct whiteheat_private *info = usb_get_serial_port_data(port); 699 struct whiteheat_private *info = usb_get_serial_port_data(port);
669 struct whiteheat_urb_wrap *wrap; 700 struct whiteheat_urb_wrap *wrap;
@@ -681,7 +712,7 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
681 } 712 }
682 mutex_unlock(&port->serial->disc_mutex); 713 mutex_unlock(&port->serial->disc_mutex);
683 714
684 port->tty->closing = 1; 715 tty->closing = 1;
685 716
686/* 717/*
687 * Not currently in use; tty_wait_until_sent() calls 718 * Not currently in use; tty_wait_until_sent() calls
@@ -689,12 +720,12 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
689 * acquisition. This should be fixed at some point. Greg's been 720 * acquisition. This should be fixed at some point. Greg's been
690 * notified. 721 * notified.
691 if ((filp->f_flags & (O_NDELAY | O_NONBLOCK)) == 0) { 722 if ((filp->f_flags & (O_NDELAY | O_NONBLOCK)) == 0) {
692 tty_wait_until_sent(port->tty, CLOSING_DELAY); 723 tty_wait_until_sent(tty, CLOSING_DELAY);
693 } 724 }
694*/ 725*/
695 726
696 tty_driver_flush_buffer(port->tty); 727 tty_driver_flush_buffer(tty);
697 tty_ldisc_flush(port->tty); 728 tty_ldisc_flush(tty);
698 729
699 firm_report_tx_done(port); 730 firm_report_tx_done(port);
700 731
@@ -728,11 +759,12 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
728 759
729 stop_command_port(port->serial); 760 stop_command_port(port->serial);
730 761
731 port->tty->closing = 0; 762 tty->closing = 0;
732} 763}
733 764
734 765
735static int whiteheat_write(struct usb_serial_port *port, const unsigned char *buf, int count) 766static int whiteheat_write(struct tty_struct *tty,
767 struct usb_serial_port *port, const unsigned char *buf, int count)
736{ 768{
737 struct usb_serial *serial = port->serial; 769 struct usb_serial *serial = port->serial;
738 struct whiteheat_private *info = usb_get_serial_port_data(port); 770 struct whiteheat_private *info = usb_get_serial_port_data(port);
@@ -763,16 +795,19 @@ static int whiteheat_write(struct usb_serial_port *port, const unsigned char *bu
763 795
764 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list); 796 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
765 urb = wrap->urb; 797 urb = wrap->urb;
766 bytes = (count > port->bulk_out_size) ? port->bulk_out_size : count; 798 bytes = (count > port->bulk_out_size) ?
767 memcpy (urb->transfer_buffer, buf + sent, bytes); 799 port->bulk_out_size : count;
800 memcpy(urb->transfer_buffer, buf + sent, bytes);
768 801
769 usb_serial_debug_data(debug, &port->dev, __func__, bytes, urb->transfer_buffer); 802 usb_serial_debug_data(debug, &port->dev,
803 __func__, bytes, urb->transfer_buffer);
770 804
771 urb->dev = serial->dev; 805 urb->dev = serial->dev;
772 urb->transfer_buffer_length = bytes; 806 urb->transfer_buffer_length = bytes;
773 result = usb_submit_urb(urb, GFP_ATOMIC); 807 result = usb_submit_urb(urb, GFP_ATOMIC);
774 if (result) { 808 if (result) {
775 err("%s - failed submitting write urb, error %d", __func__, result); 809 err("%s - failed submitting write urb, error %d",
810 __func__, result);
776 sent = result; 811 sent = result;
777 spin_lock_irqsave(&info->lock, flags); 812 spin_lock_irqsave(&info->lock, flags);
778 list_add(tmp, &info->tx_urbs_free); 813 list_add(tmp, &info->tx_urbs_free);
@@ -790,16 +825,16 @@ static int whiteheat_write(struct usb_serial_port *port, const unsigned char *bu
790 return sent; 825 return sent;
791} 826}
792 827
793 828static int whiteheat_write_room(struct tty_struct *tty)
794static int whiteheat_write_room(struct usb_serial_port *port)
795{ 829{
830 struct usb_serial_port *port = tty->driver_data;
796 struct whiteheat_private *info = usb_get_serial_port_data(port); 831 struct whiteheat_private *info = usb_get_serial_port_data(port);
797 struct list_head *tmp; 832 struct list_head *tmp;
798 int room = 0; 833 int room = 0;
799 unsigned long flags; 834 unsigned long flags;
800 835
801 dbg("%s - port %d", __func__, port->number); 836 dbg("%s - port %d", __func__, port->number);
802 837
803 spin_lock_irqsave(&info->lock, flags); 838 spin_lock_irqsave(&info->lock, flags);
804 list_for_each(tmp, &info->tx_urbs_free) 839 list_for_each(tmp, &info->tx_urbs_free)
805 room++; 840 room++;
@@ -810,9 +845,9 @@ static int whiteheat_write_room(struct usb_serial_port *port)
810 return (room); 845 return (room);
811} 846}
812 847
813 848static int whiteheat_tiocmget(struct tty_struct *tty, struct file *file)
814static int whiteheat_tiocmget (struct usb_serial_port *port, struct file *file)
815{ 849{
850 struct usb_serial_port *port = tty->driver_data;
816 struct whiteheat_private *info = usb_get_serial_port_data(port); 851 struct whiteheat_private *info = usb_get_serial_port_data(port);
817 unsigned int modem_signals = 0; 852 unsigned int modem_signals = 0;
818 853
@@ -827,10 +862,10 @@ static int whiteheat_tiocmget (struct usb_serial_port *port, struct file *file)
827 return modem_signals; 862 return modem_signals;
828} 863}
829 864
830 865static int whiteheat_tiocmset(struct tty_struct *tty, struct file *file,
831static int whiteheat_tiocmset (struct usb_serial_port *port, struct file *file,
832 unsigned int set, unsigned int clear) 866 unsigned int set, unsigned int clear)
833{ 867{
868 struct usb_serial_port *port = tty->driver_data;
834 struct whiteheat_private *info = usb_get_serial_port_data(port); 869 struct whiteheat_private *info = usb_get_serial_port_data(port);
835 870
836 dbg("%s - port %d", __func__, port->number); 871 dbg("%s - port %d", __func__, port->number);
@@ -851,65 +886,55 @@ static int whiteheat_tiocmset (struct usb_serial_port *port, struct file *file,
851} 886}
852 887
853 888
854static int whiteheat_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) 889static int whiteheat_ioctl(struct tty_struct *tty, struct file *file,
890 unsigned int cmd, unsigned long arg)
855{ 891{
892 struct usb_serial_port *port = tty->driver_data;
856 struct serial_struct serstruct; 893 struct serial_struct serstruct;
857 void __user *user_arg = (void __user *)arg; 894 void __user *user_arg = (void __user *)arg;
858 895
859 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd); 896 dbg("%s - port %d, cmd 0x%.4x", __func__, port->number, cmd);
860 897
861 switch (cmd) { 898 switch (cmd) {
862 case TIOCGSERIAL: 899 case TIOCGSERIAL:
863 memset(&serstruct, 0, sizeof(serstruct)); 900 memset(&serstruct, 0, sizeof(serstruct));
864 serstruct.type = PORT_16654; 901 serstruct.type = PORT_16654;
865 serstruct.line = port->serial->minor; 902 serstruct.line = port->serial->minor;
866 serstruct.port = port->number; 903 serstruct.port = port->number;
867 serstruct.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; 904 serstruct.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
868 serstruct.xmit_fifo_size = port->bulk_out_size; 905 serstruct.xmit_fifo_size = port->bulk_out_size;
869 serstruct.custom_divisor = 0; 906 serstruct.custom_divisor = 0;
870 serstruct.baud_base = 460800; 907 serstruct.baud_base = 460800;
871 serstruct.close_delay = CLOSING_DELAY; 908 serstruct.close_delay = CLOSING_DELAY;
872 serstruct.closing_wait = CLOSING_DELAY; 909 serstruct.closing_wait = CLOSING_DELAY;
873 910
874 if (copy_to_user(user_arg, &serstruct, sizeof(serstruct))) 911 if (copy_to_user(user_arg, &serstruct, sizeof(serstruct)))
875 return -EFAULT; 912 return -EFAULT;
876 913 break;
877 break; 914 default:
878 915 break;
879 case TIOCSSERIAL:
880 if (copy_from_user(&serstruct, user_arg, sizeof(serstruct)))
881 return -EFAULT;
882
883 /*
884 * For now this is ignored. dip sets the ASYNC_[V]HI flags
885 * but this isn't used by us at all. Maybe someone somewhere
886 * will need the custom_divisor setting.
887 */
888
889 break;
890
891 default:
892 break;
893 } 916 }
894 917
895 return -ENOIOCTLCMD; 918 return -ENOIOCTLCMD;
896} 919}
897 920
898 921
899static void whiteheat_set_termios(struct usb_serial_port *port, struct ktermios *old_termios) 922static void whiteheat_set_termios(struct tty_struct *tty,
923 struct usb_serial_port *port, struct ktermios *old_termios)
900{ 924{
901 dbg("%s -port %d", __func__, port->number); 925 firm_setup_port(tty);
902 firm_setup_port(port);
903} 926}
904 927
905 928static void whiteheat_break_ctl(struct tty_struct *tty, int break_state)
906static void whiteheat_break_ctl(struct usb_serial_port *port, int break_state) { 929{
930 struct usb_serial_port *port = tty->driver_data;
907 firm_set_break(port, break_state); 931 firm_set_break(port, break_state);
908} 932}
909 933
910 934
911static int whiteheat_chars_in_buffer(struct usb_serial_port *port) 935static int whiteheat_chars_in_buffer(struct tty_struct *tty)
912{ 936{
937 struct usb_serial_port *port = tty->driver_data;
913 struct whiteheat_private *info = usb_get_serial_port_data(port); 938 struct whiteheat_private *info = usb_get_serial_port_data(port);
914 struct list_head *tmp; 939 struct list_head *tmp;
915 struct whiteheat_urb_wrap *wrap; 940 struct whiteheat_urb_wrap *wrap;
@@ -925,13 +950,14 @@ static int whiteheat_chars_in_buffer(struct usb_serial_port *port)
925 } 950 }
926 spin_unlock_irqrestore(&info->lock, flags); 951 spin_unlock_irqrestore(&info->lock, flags);
927 952
928 dbg ("%s - returns %d", __func__, chars); 953 dbg("%s - returns %d", __func__, chars);
929 return chars; 954 return chars;
930} 955}
931 956
932 957
933static void whiteheat_throttle (struct usb_serial_port *port) 958static void whiteheat_throttle(struct tty_struct *tty)
934{ 959{
960 struct usb_serial_port *port = tty->driver_data;
935 struct whiteheat_private *info = usb_get_serial_port_data(port); 961 struct whiteheat_private *info = usb_get_serial_port_data(port);
936 unsigned long flags; 962 unsigned long flags;
937 963
@@ -945,8 +971,9 @@ static void whiteheat_throttle (struct usb_serial_port *port)
945} 971}
946 972
947 973
948static void whiteheat_unthrottle (struct usb_serial_port *port) 974static void whiteheat_unthrottle(struct tty_struct *tty)
949{ 975{
976 struct usb_serial_port *port = tty->driver_data;
950 struct whiteheat_private *info = usb_get_serial_port_data(port); 977 struct whiteheat_private *info = usb_get_serial_port_data(port);
951 int actually_throttled; 978 int actually_throttled;
952 unsigned long flags; 979 unsigned long flags;
@@ -993,7 +1020,7 @@ static void command_port_read_callback(struct urb *urb)
993 1020
994 command_info = usb_get_serial_port_data(command_port); 1021 command_info = usb_get_serial_port_data(command_port);
995 if (!command_info) { 1022 if (!command_info) {
996 dbg ("%s - command_info is NULL, exiting.", __func__); 1023 dbg("%s - command_info is NULL, exiting.", __func__);
997 return; 1024 return;
998 } 1025 }
999 if (status) { 1026 if (status) {
@@ -1004,7 +1031,8 @@ static void command_port_read_callback(struct urb *urb)
1004 return; 1031 return;
1005 } 1032 }
1006 1033
1007 usb_serial_debug_data(debug, &command_port->dev, __func__, urb->actual_length, data); 1034 usb_serial_debug_data(debug, &command_port->dev,
1035 __func__, urb->actual_length, data);
1008 1036
1009 if (data[0] == WHITEHEAT_CMD_COMPLETE) { 1037 if (data[0] == WHITEHEAT_CMD_COMPLETE) {
1010 command_info->command_finished = WHITEHEAT_CMD_COMPLETE; 1038 command_info->command_finished = WHITEHEAT_CMD_COMPLETE;
@@ -1013,21 +1041,23 @@ static void command_port_read_callback(struct urb *urb)
1013 command_info->command_finished = WHITEHEAT_CMD_FAILURE; 1041 command_info->command_finished = WHITEHEAT_CMD_FAILURE;
1014 wake_up(&command_info->wait_command); 1042 wake_up(&command_info->wait_command);
1015 } else if (data[0] == WHITEHEAT_EVENT) { 1043 } else if (data[0] == WHITEHEAT_EVENT) {
1016 /* These are unsolicited reports from the firmware, hence no waiting command to wakeup */ 1044 /* These are unsolicited reports from the firmware, hence no
1045 waiting command to wakeup */
1017 dbg("%s - event received", __func__); 1046 dbg("%s - event received", __func__);
1018 } else if (data[0] == WHITEHEAT_GET_DTR_RTS) { 1047 } else if (data[0] == WHITEHEAT_GET_DTR_RTS) {
1019 memcpy(command_info->result_buffer, &data[1], urb->actual_length - 1); 1048 memcpy(command_info->result_buffer, &data[1],
1049 urb->actual_length - 1);
1020 command_info->command_finished = WHITEHEAT_CMD_COMPLETE; 1050 command_info->command_finished = WHITEHEAT_CMD_COMPLETE;
1021 wake_up(&command_info->wait_command); 1051 wake_up(&command_info->wait_command);
1022 } else { 1052 } else
1023 dbg("%s - bad reply from firmware", __func__); 1053 dbg("%s - bad reply from firmware", __func__);
1024 } 1054
1025
1026 /* Continue trying to always read */ 1055 /* Continue trying to always read */
1027 command_port->read_urb->dev = command_port->serial->dev; 1056 command_port->read_urb->dev = command_port->serial->dev;
1028 result = usb_submit_urb(command_port->read_urb, GFP_ATOMIC); 1057 result = usb_submit_urb(command_port->read_urb, GFP_ATOMIC);
1029 if (result) 1058 if (result)
1030 dbg("%s - failed resubmitting read urb, error %d", __func__, result); 1059 dbg("%s - failed resubmitting read urb, error %d",
1060 __func__, result);
1031} 1061}
1032 1062
1033 1063
@@ -1060,7 +1090,8 @@ static void whiteheat_read_callback(struct urb *urb)
1060 return; 1090 return;
1061 } 1091 }
1062 1092
1063 usb_serial_debug_data(debug, &port->dev, __func__, urb->actual_length, data); 1093 usb_serial_debug_data(debug, &port->dev,
1094 __func__, urb->actual_length, data);
1064 1095
1065 spin_lock(&info->lock); 1096 spin_lock(&info->lock);
1066 list_add_tail(&wrap->list, &info->rx_urb_q); 1097 list_add_tail(&wrap->list, &info->rx_urb_q);
@@ -1107,7 +1138,8 @@ static void whiteheat_write_callback(struct urb *urb)
1107/***************************************************************************** 1138/*****************************************************************************
1108 * Connect Tech's White Heat firmware interface 1139 * Connect Tech's White Heat firmware interface
1109 *****************************************************************************/ 1140 *****************************************************************************/
1110static int firm_send_command(struct usb_serial_port *port, __u8 command, __u8 *data, __u8 datasize) 1141static int firm_send_command(struct usb_serial_port *port, __u8 command,
1142 __u8 *data, __u8 datasize)
1111{ 1143{
1112 struct usb_serial_port *command_port; 1144 struct usb_serial_port *command_port;
1113 struct whiteheat_command_private *command_info; 1145 struct whiteheat_command_private *command_info;
@@ -1122,13 +1154,13 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command, __u8 *d
1122 command_info = usb_get_serial_port_data(command_port); 1154 command_info = usb_get_serial_port_data(command_port);
1123 mutex_lock(&command_info->mutex); 1155 mutex_lock(&command_info->mutex);
1124 command_info->command_finished = false; 1156 command_info->command_finished = false;
1125 1157
1126 transfer_buffer = (__u8 *)command_port->write_urb->transfer_buffer; 1158 transfer_buffer = (__u8 *)command_port->write_urb->transfer_buffer;
1127 transfer_buffer[0] = command; 1159 transfer_buffer[0] = command;
1128 memcpy (&transfer_buffer[1], data, datasize); 1160 memcpy(&transfer_buffer[1], data, datasize);
1129 command_port->write_urb->transfer_buffer_length = datasize + 1; 1161 command_port->write_urb->transfer_buffer_length = datasize + 1;
1130 command_port->write_urb->dev = port->serial->dev; 1162 command_port->write_urb->dev = port->serial->dev;
1131 retval = usb_submit_urb (command_port->write_urb, GFP_NOIO); 1163 retval = usb_submit_urb(command_port->write_urb, GFP_NOIO);
1132 if (retval) { 1164 if (retval) {
1133 dbg("%s - submit urb failed", __func__); 1165 dbg("%s - submit urb failed", __func__);
1134 goto exit; 1166 goto exit;
@@ -1155,51 +1187,57 @@ static int firm_send_command(struct usb_serial_port *port, __u8 command, __u8 *d
1155 if (command_info->command_finished == WHITEHEAT_CMD_COMPLETE) { 1187 if (command_info->command_finished == WHITEHEAT_CMD_COMPLETE) {
1156 dbg("%s - command completed.", __func__); 1188 dbg("%s - command completed.", __func__);
1157 switch (command) { 1189 switch (command) {
1158 case WHITEHEAT_GET_DTR_RTS: 1190 case WHITEHEAT_GET_DTR_RTS:
1159 info = usb_get_serial_port_data(port); 1191 info = usb_get_serial_port_data(port);
1160 memcpy(&info->mcr, command_info->result_buffer, sizeof(struct whiteheat_dr_info)); 1192 memcpy(&info->mcr, command_info->result_buffer,
1193 sizeof(struct whiteheat_dr_info));
1161 break; 1194 break;
1162 } 1195 }
1163 } 1196 }
1164
1165exit: 1197exit:
1166 mutex_unlock(&command_info->mutex); 1198 mutex_unlock(&command_info->mutex);
1167 return retval; 1199 return retval;
1168} 1200}
1169 1201
1170 1202
1171static int firm_open(struct usb_serial_port *port) { 1203static int firm_open(struct usb_serial_port *port)
1204{
1172 struct whiteheat_simple open_command; 1205 struct whiteheat_simple open_command;
1173 1206
1174 open_command.port = port->number - port->serial->minor + 1; 1207 open_command.port = port->number - port->serial->minor + 1;
1175 return firm_send_command(port, WHITEHEAT_OPEN, (__u8 *)&open_command, sizeof(open_command)); 1208 return firm_send_command(port, WHITEHEAT_OPEN,
1209 (__u8 *)&open_command, sizeof(open_command));
1176} 1210}
1177 1211
1178 1212
1179static int firm_close(struct usb_serial_port *port) { 1213static int firm_close(struct usb_serial_port *port)
1214{
1180 struct whiteheat_simple close_command; 1215 struct whiteheat_simple close_command;
1181 1216
1182 close_command.port = port->number - port->serial->minor + 1; 1217 close_command.port = port->number - port->serial->minor + 1;
1183 return firm_send_command(port, WHITEHEAT_CLOSE, (__u8 *)&close_command, sizeof(close_command)); 1218 return firm_send_command(port, WHITEHEAT_CLOSE,
1219 (__u8 *)&close_command, sizeof(close_command));
1184} 1220}
1185 1221
1186 1222
1187static int firm_setup_port(struct usb_serial_port *port) { 1223static int firm_setup_port(struct tty_struct *tty)
1224{
1225 struct usb_serial_port *port = tty->driver_data;
1188 struct whiteheat_port_settings port_settings; 1226 struct whiteheat_port_settings port_settings;
1189 unsigned int cflag = port->tty->termios->c_cflag; 1227 unsigned int cflag = tty->termios->c_cflag;
1190 1228
1191 port_settings.port = port->number + 1; 1229 port_settings.port = port->number + 1;
1192 1230
1193 /* get the byte size */ 1231 /* get the byte size */
1194 switch (cflag & CSIZE) { 1232 switch (cflag & CSIZE) {
1195 case CS5: port_settings.bits = 5; break; 1233 case CS5: port_settings.bits = 5; break;
1196 case CS6: port_settings.bits = 6; break; 1234 case CS6: port_settings.bits = 6; break;
1197 case CS7: port_settings.bits = 7; break; 1235 case CS7: port_settings.bits = 7; break;
1198 default: 1236 default:
1199 case CS8: port_settings.bits = 8; break; 1237 case CS8: port_settings.bits = 8; break;
1200 } 1238 }
1201 dbg("%s - data bits = %d", __func__, port_settings.bits); 1239 dbg("%s - data bits = %d", __func__, port_settings.bits);
1202 1240
1203 /* determine the parity */ 1241 /* determine the parity */
1204 if (cflag & PARENB) 1242 if (cflag & PARENB)
1205 if (cflag & CMSPAR) 1243 if (cflag & CMSPAR)
@@ -1225,7 +1263,8 @@ static int firm_setup_port(struct usb_serial_port *port) {
1225 1263
1226 /* figure out the flow control settings */ 1264 /* figure out the flow control settings */
1227 if (cflag & CRTSCTS) 1265 if (cflag & CRTSCTS)
1228 port_settings.hflow = (WHITEHEAT_HFLOW_CTS | WHITEHEAT_HFLOW_RTS); 1266 port_settings.hflow = (WHITEHEAT_HFLOW_CTS |
1267 WHITEHEAT_HFLOW_RTS);
1229 else 1268 else
1230 port_settings.hflow = WHITEHEAT_HFLOW_NONE; 1269 port_settings.hflow = WHITEHEAT_HFLOW_NONE;
1231 dbg("%s - hardware flow control = %s %s %s %s", __func__, 1270 dbg("%s - hardware flow control = %s %s %s %s", __func__,
@@ -1233,81 +1272,95 @@ static int firm_setup_port(struct usb_serial_port *port) {
1233 (port_settings.hflow & WHITEHEAT_HFLOW_RTS) ? "RTS" : "", 1272 (port_settings.hflow & WHITEHEAT_HFLOW_RTS) ? "RTS" : "",
1234 (port_settings.hflow & WHITEHEAT_HFLOW_DSR) ? "DSR" : "", 1273 (port_settings.hflow & WHITEHEAT_HFLOW_DSR) ? "DSR" : "",
1235 (port_settings.hflow & WHITEHEAT_HFLOW_DTR) ? "DTR" : ""); 1274 (port_settings.hflow & WHITEHEAT_HFLOW_DTR) ? "DTR" : "");
1236 1275
1237 /* determine software flow control */ 1276 /* determine software flow control */
1238 if (I_IXOFF(port->tty)) 1277 if (I_IXOFF(tty))
1239 port_settings.sflow = WHITEHEAT_SFLOW_RXTX; 1278 port_settings.sflow = WHITEHEAT_SFLOW_RXTX;
1240 else 1279 else
1241 port_settings.sflow = WHITEHEAT_SFLOW_NONE; 1280 port_settings.sflow = WHITEHEAT_SFLOW_NONE;
1242 dbg("%s - software flow control = %c", __func__, port_settings.sflow); 1281 dbg("%s - software flow control = %c", __func__, port_settings.sflow);
1243 1282
1244 port_settings.xon = START_CHAR(port->tty); 1283 port_settings.xon = START_CHAR(tty);
1245 port_settings.xoff = STOP_CHAR(port->tty); 1284 port_settings.xoff = STOP_CHAR(tty);
1246 dbg("%s - XON = %2x, XOFF = %2x", __func__, port_settings.xon, port_settings.xoff); 1285 dbg("%s - XON = %2x, XOFF = %2x",
1286 __func__, port_settings.xon, port_settings.xoff);
1247 1287
1248 /* get the baud rate wanted */ 1288 /* get the baud rate wanted */
1249 port_settings.baud = tty_get_baud_rate(port->tty); 1289 port_settings.baud = tty_get_baud_rate(tty);
1250 dbg("%s - baud rate = %d", __func__, port_settings.baud); 1290 dbg("%s - baud rate = %d", __func__, port_settings.baud);
1251 1291
1252 /* fixme: should set validated settings */ 1292 /* fixme: should set validated settings */
1253 tty_encode_baud_rate(port->tty, port_settings.baud, port_settings.baud); 1293 tty_encode_baud_rate(tty, port_settings.baud, port_settings.baud);
1254 /* handle any settings that aren't specified in the tty structure */ 1294 /* handle any settings that aren't specified in the tty structure */
1255 port_settings.lloop = 0; 1295 port_settings.lloop = 0;
1256 1296
1257 /* now send the message to the device */ 1297 /* now send the message to the device */
1258 return firm_send_command(port, WHITEHEAT_SETUP_PORT, (__u8 *)&port_settings, sizeof(port_settings)); 1298 return firm_send_command(port, WHITEHEAT_SETUP_PORT,
1299 (__u8 *)&port_settings, sizeof(port_settings));
1259} 1300}
1260 1301
1261 1302
1262static int firm_set_rts(struct usb_serial_port *port, __u8 onoff) { 1303static int firm_set_rts(struct usb_serial_port *port, __u8 onoff)
1304{
1263 struct whiteheat_set_rdb rts_command; 1305 struct whiteheat_set_rdb rts_command;
1264 1306
1265 rts_command.port = port->number - port->serial->minor + 1; 1307 rts_command.port = port->number - port->serial->minor + 1;
1266 rts_command.state = onoff; 1308 rts_command.state = onoff;
1267 return firm_send_command(port, WHITEHEAT_SET_RTS, (__u8 *)&rts_command, sizeof(rts_command)); 1309 return firm_send_command(port, WHITEHEAT_SET_RTS,
1310 (__u8 *)&rts_command, sizeof(rts_command));
1268} 1311}
1269 1312
1270 1313
1271static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff) { 1314static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff)
1315{
1272 struct whiteheat_set_rdb dtr_command; 1316 struct whiteheat_set_rdb dtr_command;
1273 1317
1274 dtr_command.port = port->number - port->serial->minor + 1; 1318 dtr_command.port = port->number - port->serial->minor + 1;
1275 dtr_command.state = onoff; 1319 dtr_command.state = onoff;
1276 return firm_send_command(port, WHITEHEAT_SET_RTS, (__u8 *)&dtr_command, sizeof(dtr_command)); 1320 return firm_send_command(port, WHITEHEAT_SET_DTR,
1321 (__u8 *)&dtr_command, sizeof(dtr_command));
1277} 1322}
1278 1323
1279 1324
1280static int firm_set_break(struct usb_serial_port *port, __u8 onoff) { 1325static int firm_set_break(struct usb_serial_port *port, __u8 onoff)
1326{
1281 struct whiteheat_set_rdb break_command; 1327 struct whiteheat_set_rdb break_command;
1282 1328
1283 break_command.port = port->number - port->serial->minor + 1; 1329 break_command.port = port->number - port->serial->minor + 1;
1284 break_command.state = onoff; 1330 break_command.state = onoff;
1285 return firm_send_command(port, WHITEHEAT_SET_RTS, (__u8 *)&break_command, sizeof(break_command)); 1331 return firm_send_command(port, WHITEHEAT_SET_BREAK,
1332 (__u8 *)&break_command, sizeof(break_command));
1286} 1333}
1287 1334
1288 1335
1289static int firm_purge(struct usb_serial_port *port, __u8 rxtx) { 1336static int firm_purge(struct usb_serial_port *port, __u8 rxtx)
1337{
1290 struct whiteheat_purge purge_command; 1338 struct whiteheat_purge purge_command;
1291 1339
1292 purge_command.port = port->number - port->serial->minor + 1; 1340 purge_command.port = port->number - port->serial->minor + 1;
1293 purge_command.what = rxtx; 1341 purge_command.what = rxtx;
1294 return firm_send_command(port, WHITEHEAT_PURGE, (__u8 *)&purge_command, sizeof(purge_command)); 1342 return firm_send_command(port, WHITEHEAT_PURGE,
1343 (__u8 *)&purge_command, sizeof(purge_command));
1295} 1344}
1296 1345
1297 1346
1298static int firm_get_dtr_rts(struct usb_serial_port *port) { 1347static int firm_get_dtr_rts(struct usb_serial_port *port)
1348{
1299 struct whiteheat_simple get_dr_command; 1349 struct whiteheat_simple get_dr_command;
1300 1350
1301 get_dr_command.port = port->number - port->serial->minor + 1; 1351 get_dr_command.port = port->number - port->serial->minor + 1;
1302 return firm_send_command(port, WHITEHEAT_GET_DTR_RTS, (__u8 *)&get_dr_command, sizeof(get_dr_command)); 1352 return firm_send_command(port, WHITEHEAT_GET_DTR_RTS,
1353 (__u8 *)&get_dr_command, sizeof(get_dr_command));
1303} 1354}
1304 1355
1305 1356
1306static int firm_report_tx_done(struct usb_serial_port *port) { 1357static int firm_report_tx_done(struct usb_serial_port *port)
1358{
1307 struct whiteheat_simple close_command; 1359 struct whiteheat_simple close_command;
1308 1360
1309 close_command.port = port->number - port->serial->minor + 1; 1361 close_command.port = port->number - port->serial->minor + 1;
1310 return firm_send_command(port, WHITEHEAT_REPORT_TX_DONE, (__u8 *)&close_command, sizeof(close_command)); 1362 return firm_send_command(port, WHITEHEAT_REPORT_TX_DONE,
1363 (__u8 *)&close_command, sizeof(close_command));
1311} 1364}
1312 1365
1313 1366
@@ -1319,7 +1372,7 @@ static int start_command_port(struct usb_serial *serial)
1319 struct usb_serial_port *command_port; 1372 struct usb_serial_port *command_port;
1320 struct whiteheat_command_private *command_info; 1373 struct whiteheat_command_private *command_info;
1321 int retval = 0; 1374 int retval = 0;
1322 1375
1323 command_port = serial->port[COMMAND_PORT]; 1376 command_port = serial->port[COMMAND_PORT];
1324 command_info = usb_get_serial_port_data(command_port); 1377 command_info = usb_get_serial_port_data(command_port);
1325 mutex_lock(&command_info->mutex); 1378 mutex_lock(&command_info->mutex);
@@ -1330,7 +1383,8 @@ static int start_command_port(struct usb_serial *serial)
1330 command_port->read_urb->dev = serial->dev; 1383 command_port->read_urb->dev = serial->dev;
1331 retval = usb_submit_urb(command_port->read_urb, GFP_KERNEL); 1384 retval = usb_submit_urb(command_port->read_urb, GFP_KERNEL);
1332 if (retval) { 1385 if (retval) {
1333 err("%s - failed submitting read urb, error %d", __func__, retval); 1386 err("%s - failed submitting read urb, error %d",
1387 __func__, retval);
1334 goto exit; 1388 goto exit;
1335 } 1389 }
1336 } 1390 }
@@ -1400,7 +1454,8 @@ static int start_port_read(struct usb_serial_port *port)
1400} 1454}
1401 1455
1402 1456
1403static struct whiteheat_urb_wrap *urb_to_wrap(struct urb* urb, struct list_head *head) 1457static struct whiteheat_urb_wrap *urb_to_wrap(struct urb *urb,
1458 struct list_head *head)
1404{ 1459{
1405 struct whiteheat_urb_wrap *wrap; 1460 struct whiteheat_urb_wrap *wrap;
1406 struct list_head *tmp; 1461 struct list_head *tmp;
@@ -1426,7 +1481,7 @@ static void rx_data_softint(struct work_struct *work)
1426 struct whiteheat_private *info = 1481 struct whiteheat_private *info =
1427 container_of(work, struct whiteheat_private, rx_work); 1482 container_of(work, struct whiteheat_private, rx_work);
1428 struct usb_serial_port *port = info->port; 1483 struct usb_serial_port *port = info->port;
1429 struct tty_struct *tty = port->tty; 1484 struct tty_struct *tty = port->port.tty;
1430 struct whiteheat_urb_wrap *wrap; 1485 struct whiteheat_urb_wrap *wrap;
1431 struct urb *urb; 1486 struct urb *urb;
1432 unsigned long flags; 1487 unsigned long flags;
@@ -1449,7 +1504,8 @@ static void rx_data_softint(struct work_struct *work)
1449 urb = wrap->urb; 1504 urb = wrap->urb;
1450 1505
1451 if (tty && urb->actual_length) { 1506 if (tty && urb->actual_length) {
1452 int len = tty_buffer_request_room(tty, urb->actual_length); 1507 int len = tty_buffer_request_room(tty,
1508 urb->actual_length);
1453 /* This stuff can go away now I suspect */ 1509 /* This stuff can go away now I suspect */
1454 if (unlikely(len < urb->actual_length)) { 1510 if (unlikely(len < urb->actual_length)) {
1455 spin_lock_irqsave(&info->lock, flags); 1511 spin_lock_irqsave(&info->lock, flags);
@@ -1466,7 +1522,8 @@ static void rx_data_softint(struct work_struct *work)
1466 urb->dev = port->serial->dev; 1522 urb->dev = port->serial->dev;
1467 result = usb_submit_urb(urb, GFP_ATOMIC); 1523 result = usb_submit_urb(urb, GFP_ATOMIC);
1468 if (result) { 1524 if (result) {
1469 err("%s - failed resubmitting read urb, error %d", __func__, result); 1525 err("%s - failed resubmitting read urb, error %d",
1526 __func__, result);
1470 spin_lock_irqsave(&info->lock, flags); 1527 spin_lock_irqsave(&info->lock, flags);
1471 list_add(tmp, &info->rx_urbs_free); 1528 list_add(tmp, &info->rx_urbs_free);
1472 continue; 1529 continue;
@@ -1485,7 +1542,7 @@ static void rx_data_softint(struct work_struct *work)
1485/***************************************************************************** 1542/*****************************************************************************
1486 * Connect Tech's White Heat module functions 1543 * Connect Tech's White Heat module functions
1487 *****************************************************************************/ 1544 *****************************************************************************/
1488static int __init whiteheat_init (void) 1545static int __init whiteheat_init(void)
1489{ 1546{
1490 int retval; 1547 int retval;
1491 retval = usb_serial_register(&whiteheat_fake_device); 1548 retval = usb_serial_register(&whiteheat_fake_device);
@@ -1508,19 +1565,19 @@ failed_fake_register:
1508} 1565}
1509 1566
1510 1567
1511static void __exit whiteheat_exit (void) 1568static void __exit whiteheat_exit(void)
1512{ 1569{
1513 usb_deregister (&whiteheat_driver); 1570 usb_deregister(&whiteheat_driver);
1514 usb_serial_deregister (&whiteheat_fake_device); 1571 usb_serial_deregister(&whiteheat_fake_device);
1515 usb_serial_deregister (&whiteheat_device); 1572 usb_serial_deregister(&whiteheat_device);
1516} 1573}
1517 1574
1518 1575
1519module_init(whiteheat_init); 1576module_init(whiteheat_init);
1520module_exit(whiteheat_exit); 1577module_exit(whiteheat_exit);
1521 1578
1522MODULE_AUTHOR( DRIVER_AUTHOR ); 1579MODULE_AUTHOR(DRIVER_AUTHOR);
1523MODULE_DESCRIPTION( DRIVER_DESC ); 1580MODULE_DESCRIPTION(DRIVER_DESC);
1524MODULE_LICENSE("GPL"); 1581MODULE_LICENSE("GPL");
1525 1582
1526MODULE_FIRMWARE("whiteheat.fw"); 1583MODULE_FIRMWARE("whiteheat.fw");
diff --git a/drivers/usb/serial/whiteheat.h b/drivers/usb/serial/whiteheat.h
index f16079705664..38065df4d2d8 100644
--- a/drivers/usb/serial/whiteheat.h
+++ b/drivers/usb/serial/whiteheat.h
@@ -2,7 +2,7 @@
2 * USB ConnectTech WhiteHEAT driver 2 * USB ConnectTech WhiteHEAT driver
3 * 3 *
4 * Copyright (C) 2002 4 * Copyright (C) 2002
5 * Connect Tech Inc. 5 * Connect Tech Inc.
6 * 6 *
7 * Copyright (C) 1999, 2000 7 * Copyright (C) 1999, 2000
8 * Greg Kroah-Hartman (greg@kroah.com) 8 * Greg Kroah-Hartman (greg@kroah.com)
@@ -12,7 +12,8 @@
12 * the Free Software Foundation; either version 2 of the License, or 12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version. 13 * (at your option) any later version.
14 * 14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver 15 * See Documentation/usb/usb-serial.txt for more information on using this
16 * driver
16 * 17 *
17 */ 18 */
18 19
@@ -30,13 +31,16 @@
30#define WHITEHEAT_DUMP 7 /* dump memory */ 31#define WHITEHEAT_DUMP 7 /* dump memory */
31#define WHITEHEAT_STATUS 8 /* get status */ 32#define WHITEHEAT_STATUS 8 /* get status */
32#define WHITEHEAT_PURGE 9 /* clear the UART fifos */ 33#define WHITEHEAT_PURGE 9 /* clear the UART fifos */
33#define WHITEHEAT_GET_DTR_RTS 10 /* get the state of DTR and RTS for a port */ 34#define WHITEHEAT_GET_DTR_RTS 10 /* get the state of DTR and RTS
34#define WHITEHEAT_GET_HW_INFO 11 /* get EEPROM info and hardware ID */ 35 for a port */
36#define WHITEHEAT_GET_HW_INFO 11 /* get EEPROM info and
37 hardware ID */
35#define WHITEHEAT_REPORT_TX_DONE 12 /* get the next TX done */ 38#define WHITEHEAT_REPORT_TX_DONE 12 /* get the next TX done */
36#define WHITEHEAT_EVENT 13 /* unsolicited status events */ 39#define WHITEHEAT_EVENT 13 /* unsolicited status events */
37#define WHITEHEAT_ECHO 14 /* send data to the indicated IN endpoint */ 40#define WHITEHEAT_ECHO 14 /* send data to the indicated
38#define WHITEHEAT_DO_TEST 15 /* perform the specified test */ 41 IN endpoint */
39#define WHITEHEAT_CMD_COMPLETE 16 /* reply for certain commands */ 42#define WHITEHEAT_DO_TEST 15 /* perform specified test */
43#define WHITEHEAT_CMD_COMPLETE 16 /* reply for some commands */
40#define WHITEHEAT_CMD_FAILURE 17 /* reply for failed commands */ 44#define WHITEHEAT_CMD_FAILURE 17 /* reply for failed commands */
41 45
42 46
@@ -67,20 +71,28 @@ struct whiteheat_simple {
67#define WHITEHEAT_PAR_MARK '1' /* mark (force 1) parity */ 71#define WHITEHEAT_PAR_MARK '1' /* mark (force 1) parity */
68 72
69#define WHITEHEAT_SFLOW_NONE 'n' /* no software flow control */ 73#define WHITEHEAT_SFLOW_NONE 'n' /* no software flow control */
70#define WHITEHEAT_SFLOW_RX 'r' /* XOFF/ON is sent when RX fills/empties */ 74#define WHITEHEAT_SFLOW_RX 'r' /* XOFF/ON is sent when RX
71#define WHITEHEAT_SFLOW_TX 't' /* when received XOFF/ON will stop/start TX */ 75 fills/empties */
76#define WHITEHEAT_SFLOW_TX 't' /* when received XOFF/ON will
77 stop/start TX */
72#define WHITEHEAT_SFLOW_RXTX 'b' /* both SFLOW_RX and SFLOW_TX */ 78#define WHITEHEAT_SFLOW_RXTX 'b' /* both SFLOW_RX and SFLOW_TX */
73 79
74#define WHITEHEAT_HFLOW_NONE 0x00 /* no hardware flow control */ 80#define WHITEHEAT_HFLOW_NONE 0x00 /* no hardware flow control */
75#define WHITEHEAT_HFLOW_RTS_TOGGLE 0x01 /* RTS is on during transmit, off otherwise */ 81#define WHITEHEAT_HFLOW_RTS_TOGGLE 0x01 /* RTS is on during transmit,
76#define WHITEHEAT_HFLOW_DTR 0x02 /* DTR is off/on when RX fills/empties */ 82 off otherwise */
77#define WHITEHEAT_HFLOW_CTS 0x08 /* when received CTS off/on will stop/start TX */ 83#define WHITEHEAT_HFLOW_DTR 0x02 /* DTR is off/on when RX
78#define WHITEHEAT_HFLOW_DSR 0x10 /* when received DSR off/on will stop/start TX */ 84 fills/empties */
79#define WHITEHEAT_HFLOW_RTS 0x80 /* RTS is off/on when RX fills/empties */ 85#define WHITEHEAT_HFLOW_CTS 0x08 /* when received CTS off/on
86 will stop/start TX */
87#define WHITEHEAT_HFLOW_DSR 0x10 /* when received DSR off/on
88 will stop/start TX */
89#define WHITEHEAT_HFLOW_RTS 0x80 /* RTS is off/on when RX
90 fills/empties */
80 91
81struct whiteheat_port_settings { 92struct whiteheat_port_settings {
82 __u8 port; /* port number (1 to N) */ 93 __u8 port; /* port number (1 to N) */
83 __u32 baud; /* any value 7 - 460800, firmware calculates best fit; arrives little endian */ 94 __u32 baud; /* any value 7 - 460800, firmware calculates
95 best fit; arrives little endian */
84 __u8 bits; /* 5, 6, 7, or 8 */ 96 __u8 bits; /* 5, 6, 7, or 8 */
85 __u8 stop; /* 1 or 2, default 1 (2 = 1.5 if bits = 5) */ 97 __u8 stop; /* 1 or 2, default 1 (2 = 1.5 if bits = 5) */
86 __u8 parity; /* see WHITEHEAT_PAR_* above */ 98 __u8 parity; /* see WHITEHEAT_PAR_* above */
@@ -167,12 +179,14 @@ struct whiteheat_echo {
167 */ 179 */
168#define WHITEHEAT_TEST_UART_RW 0x01 /* read/write uart registers */ 180#define WHITEHEAT_TEST_UART_RW 0x01 /* read/write uart registers */
169#define WHITEHEAT_TEST_UART_INTR 0x02 /* uart interrupt */ 181#define WHITEHEAT_TEST_UART_INTR 0x02 /* uart interrupt */
170#define WHITEHEAT_TEST_SETUP_CONT 0x03 /* setup for PORT_CONT/PORT_DISCONT */ 182#define WHITEHEAT_TEST_SETUP_CONT 0x03 /* setup for
183 PORT_CONT/PORT_DISCONT */
171#define WHITEHEAT_TEST_PORT_CONT 0x04 /* port connect */ 184#define WHITEHEAT_TEST_PORT_CONT 0x04 /* port connect */
172#define WHITEHEAT_TEST_PORT_DISCONT 0x05 /* port disconnect */ 185#define WHITEHEAT_TEST_PORT_DISCONT 0x05 /* port disconnect */
173#define WHITEHEAT_TEST_UART_CLK_START 0x06 /* uart clock test start */ 186#define WHITEHEAT_TEST_UART_CLK_START 0x06 /* uart clock test start */
174#define WHITEHEAT_TEST_UART_CLK_STOP 0x07 /* uart clock test stop */ 187#define WHITEHEAT_TEST_UART_CLK_STOP 0x07 /* uart clock test stop */
175#define WHITEHEAT_TEST_MODEM_FT 0x08 /* modem signals, requires a loopback cable/connector */ 188#define WHITEHEAT_TEST_MODEM_FT 0x08 /* modem signals, requires a
189 loopback cable/connector */
176#define WHITEHEAT_TEST_ERASE_EEPROM 0x09 /* erase eeprom */ 190#define WHITEHEAT_TEST_ERASE_EEPROM 0x09 /* erase eeprom */
177#define WHITEHEAT_TEST_READ_EEPROM 0x0a /* read eeprom */ 191#define WHITEHEAT_TEST_READ_EEPROM 0x0a /* read eeprom */
178#define WHITEHEAT_TEST_PROGRAM_EEPROM 0x0b /* program eeprom */ 192#define WHITEHEAT_TEST_PROGRAM_EEPROM 0x0b /* program eeprom */
@@ -198,19 +212,27 @@ struct whiteheat_test {
198#define WHITEHEAT_EVENT_CONNECT 0x08 /* connect field is valid */ 212#define WHITEHEAT_EVENT_CONNECT 0x08 /* connect field is valid */
199 213
200#define WHITEHEAT_FLOW_NONE 0x00 /* no flow control active */ 214#define WHITEHEAT_FLOW_NONE 0x00 /* no flow control active */
201#define WHITEHEAT_FLOW_HARD_OUT 0x01 /* TX is stopped by CTS (waiting for CTS to go on) */ 215#define WHITEHEAT_FLOW_HARD_OUT 0x01 /* TX is stopped by CTS
202#define WHITEHEAT_FLOW_HARD_IN 0x02 /* remote TX is stopped by RTS */ 216 (waiting for CTS to go on) */
203#define WHITEHEAT_FLOW_SOFT_OUT 0x04 /* TX is stopped by XOFF received (waiting for XON) */ 217#define WHITEHEAT_FLOW_HARD_IN 0x02 /* remote TX is stopped
204#define WHITEHEAT_FLOW_SOFT_IN 0x08 /* remote TX is stopped by XOFF transmitted */ 218 by RTS */
219#define WHITEHEAT_FLOW_SOFT_OUT 0x04 /* TX is stopped by XOFF
220 received (waiting for XON) */
221#define WHITEHEAT_FLOW_SOFT_IN 0x08 /* remote TX is stopped by XOFF
222 transmitted */
205#define WHITEHEAT_FLOW_TX_DONE 0x80 /* TX has completed */ 223#define WHITEHEAT_FLOW_TX_DONE 0x80 /* TX has completed */
206 224
207struct whiteheat_status_info { 225struct whiteheat_status_info {
208 __u8 port; /* port number (1 to N) */ 226 __u8 port; /* port number (1 to N) */
209 __u8 event; /* indicates what the current event is, see WHITEHEAT_EVENT_* above */ 227 __u8 event; /* indicates what the current event is,
210 __u8 modem; /* modem signal status (copy of uart's MSR register) */ 228 see WHITEHEAT_EVENT_* above */
229 __u8 modem; /* modem signal status (copy of uart's
230 MSR register) */
211 __u8 error; /* line status (copy of uart's LSR register) */ 231 __u8 error; /* line status (copy of uart's LSR register) */
212 __u8 flow; /* flow control state, see WHITEHEAT_FLOW_* above */ 232 __u8 flow; /* flow control state, see WHITEHEAT_FLOW_*
213 __u8 connect; /* 0 means not connected, non-zero means connected */ 233 above */
234 __u8 connect; /* 0 means not connected, non-zero means
235 connected */
214}; 236};
215 237
216 238
@@ -256,7 +278,8 @@ struct whiteheat_hw_info {
256struct whiteheat_event_info { 278struct whiteheat_event_info {
257 __u8 port; /* port number (1 to N) */ 279 __u8 port; /* port number (1 to N) */
258 __u8 event; /* see whiteheat_status_info.event */ 280 __u8 event; /* see whiteheat_status_info.event */
259 __u8 info; /* see whiteheat_status_info.modem, .error, .flow, .connect */ 281 __u8 info; /* see whiteheat_status_info.modem, .error,
282 .flow, .connect */
260}; 283};
261 284
262 285
@@ -269,7 +292,8 @@ struct whiteheat_event_info {
269 292
270struct whiteheat_test_info { 293struct whiteheat_test_info {
271 __u8 port; /* port number (1 to N) */ 294 __u8 port; /* port number (1 to N) */
272 __u8 test; /* indicates which test this is a response for, see WHITEHEAT_DO_TEST above */ 295 __u8 test; /* indicates which test this is a response for,
296 see WHITEHEAT_DO_TEST above */
273 __u8 status; /* see WHITEHEAT_TEST_* above */ 297 __u8 status; /* see WHITEHEAT_TEST_* above */
274 __u8 results[32]; /* test-dependent results */ 298 __u8 results[32]; /* test-dependent results */
275}; 299};
diff --git a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c
index 579e9f52053a..17f1ae232919 100644
--- a/drivers/usb/storage/datafab.c
+++ b/drivers/usb/storage/datafab.c
@@ -1,7 +1,5 @@
1/* Driver for Datafab USB Compact Flash reader 1/* Driver for Datafab USB Compact Flash reader
2 * 2 *
3 * $Id: datafab.c,v 1.7 2002/02/25 00:40:13 mdharm Exp $
4 *
5 * datafab driver v0.1: 3 * datafab driver v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/debug.c b/drivers/usb/storage/debug.c
index 01e430654a13..a2b5526c9fa0 100644
--- a/drivers/usb/storage/debug.c
+++ b/drivers/usb/storage/debug.c
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * Debugging Functions Source Code File 2 * Debugging Functions Source Code File
3 * 3 *
4 * $Id: debug.c,v 1.9 2002/04/22 03:39:43 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
diff --git a/drivers/usb/storage/debug.h b/drivers/usb/storage/debug.h
index 77e244a8c376..dbb985d52423 100644
--- a/drivers/usb/storage/debug.h
+++ b/drivers/usb/storage/debug.h
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * Debugging Functions Header File 2 * Debugging Functions Header File
3 * 3 *
4 * $Id: debug.h,v 1.6 2001/01/12 23:51:04 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
diff --git a/drivers/usb/storage/dpcm.c b/drivers/usb/storage/dpcm.c
index 9a410b5a6e5b..939923471af4 100644
--- a/drivers/usb/storage/dpcm.c
+++ b/drivers/usb/storage/dpcm.c
@@ -1,7 +1,5 @@
1/* Driver for Microtech DPCM-USB CompactFlash/SmartMedia reader 1/* Driver for Microtech DPCM-USB CompactFlash/SmartMedia reader
2 * 2 *
3 * $Id: dpcm.c,v 1.4 2001/06/11 02:54:25 mdharm Exp $
4 *
5 * DPCM driver v0.1: 3 * DPCM driver v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/dpcm.h b/drivers/usb/storage/dpcm.h
index 81b464cfcc1e..e7b7b0f120d7 100644
--- a/drivers/usb/storage/dpcm.h
+++ b/drivers/usb/storage/dpcm.h
@@ -1,7 +1,5 @@
1/* Driver for Microtech DPCM-USB CompactFlash/SmartMedia reader 1/* Driver for Microtech DPCM-USB CompactFlash/SmartMedia reader
2 * 2 *
3 * $Id: dpcm.h,v 1.2 2000/08/25 00:13:51 mdharm Exp $
4 *
5 * DPCM driver v0.1: 3 * DPCM driver v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c
index f5a4e8d6a3b1..7a4d45677227 100644
--- a/drivers/usb/storage/freecom.c
+++ b/drivers/usb/storage/freecom.c
@@ -1,7 +1,5 @@
1/* Driver for Freecom USB/IDE adaptor 1/* Driver for Freecom USB/IDE adaptor
2 * 2 *
3 * $Id: freecom.c,v 1.22 2002/04/22 03:39:43 mdharm Exp $
4 *
5 * Freecom v0.1: 3 * Freecom v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/freecom.h b/drivers/usb/storage/freecom.h
index 1b012d62d0a8..20d0fe6ba0c8 100644
--- a/drivers/usb/storage/freecom.h
+++ b/drivers/usb/storage/freecom.h
@@ -1,7 +1,5 @@
1/* Driver for Freecom USB/IDE adaptor 1/* Driver for Freecom USB/IDE adaptor
2 * 2 *
3 * $Id: freecom.h,v 1.4 2000/08/29 14:49:15 dlbrown Exp $
4 *
5 * Freecom v0.1: 3 * Freecom v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c
index 187dd1e01093..4995bb595aef 100644
--- a/drivers/usb/storage/initializers.c
+++ b/drivers/usb/storage/initializers.c
@@ -1,7 +1,5 @@
1/* Special Initializers for certain USB Mass Storage devices 1/* Special Initializers for certain USB Mass Storage devices
2 * 2 *
3 * $Id: initializers.c,v 1.2 2000/09/06 22:35:57 mdharm Exp $
4 *
5 * Current development and maintenance by: 3 * Current development and maintenance by:
6 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 4 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
7 * 5 *
diff --git a/drivers/usb/storage/initializers.h b/drivers/usb/storage/initializers.h
index ad3ffd4236c2..529327fbb06b 100644
--- a/drivers/usb/storage/initializers.h
+++ b/drivers/usb/storage/initializers.h
@@ -1,7 +1,5 @@
1/* Header file for Special Initializers for certain USB Mass Storage devices 1/* Header file for Special Initializers for certain USB Mass Storage devices
2 * 2 *
3 * $Id: initializers.h,v 1.1 2000/08/29 23:07:02 mdharm Exp $
4 *
5 * Current development and maintenance by: 3 * Current development and maintenance by:
6 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 4 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
7 * 5 *
diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
index 3addcd8f827b..383abf2516a5 100644
--- a/drivers/usb/storage/isd200.c
+++ b/drivers/usb/storage/isd200.c
@@ -1,7 +1,5 @@
1/* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC 1/* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
2 * 2 *
3 * $Id: isd200.c,v 1.16 2002/04/22 03:39:43 mdharm Exp $
4 *
5 * Current development and maintenance: 3 * Current development and maintenance:
6 * (C) 2001-2002 Björn Stenberg (bjorn@haxx.se) 4 * (C) 2001-2002 Björn Stenberg (bjorn@haxx.se)
7 * 5 *
@@ -586,7 +584,7 @@ static void isd200_invoke_transport( struct us_data *us,
586 /* if the command gets aborted by the higher layers, we need to 584 /* if the command gets aborted by the higher layers, we need to
587 * short-circuit all other processing 585 * short-circuit all other processing
588 */ 586 */
589 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { 587 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
590 US_DEBUGP("-- command was aborted\n"); 588 US_DEBUGP("-- command was aborted\n");
591 goto Handle_Abort; 589 goto Handle_Abort;
592 } 590 }
@@ -633,7 +631,7 @@ static void isd200_invoke_transport( struct us_data *us,
633 631
634 if (need_auto_sense) { 632 if (need_auto_sense) {
635 result = isd200_read_regs(us); 633 result = isd200_read_regs(us);
636 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { 634 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
637 US_DEBUGP("-- auto-sense aborted\n"); 635 US_DEBUGP("-- auto-sense aborted\n");
638 goto Handle_Abort; 636 goto Handle_Abort;
639 } 637 }
@@ -663,7 +661,7 @@ static void isd200_invoke_transport( struct us_data *us,
663 srb->result = DID_ABORT << 16; 661 srb->result = DID_ABORT << 16;
664 662
665 /* permit the reset transfer to take place */ 663 /* permit the reset transfer to take place */
666 clear_bit(US_FLIDX_ABORTING, &us->flags); 664 clear_bit(US_FLIDX_ABORTING, &us->dflags);
667 /* Need reset here */ 665 /* Need reset here */
668} 666}
669 667
diff --git a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c
index 61097cbb1585..df67f13c9e73 100644
--- a/drivers/usb/storage/jumpshot.c
+++ b/drivers/usb/storage/jumpshot.c
@@ -1,7 +1,5 @@
1/* Driver for Lexar "Jumpshot" Compact Flash reader 1/* Driver for Lexar "Jumpshot" Compact Flash reader
2 * 2 *
3 * $Id: jumpshot.c,v 1.7 2002/02/25 00:40:13 mdharm Exp $
4 *
5 * jumpshot driver v0.1: 3 * jumpshot driver v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c
index b9b8ede61fb3..3b3357e20ea7 100644
--- a/drivers/usb/storage/protocol.c
+++ b/drivers/usb/storage/protocol.c
@@ -1,7 +1,5 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * 2 *
3 * $Id: protocol.c,v 1.14 2002/04/22 03:39:43 mdharm Exp $
4 *
5 * Current development and maintenance by: 3 * Current development and maintenance by:
6 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 4 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
7 * 5 *
diff --git a/drivers/usb/storage/protocol.h b/drivers/usb/storage/protocol.h
index 8737a36891ca..487056ffb516 100644
--- a/drivers/usb/storage/protocol.h
+++ b/drivers/usb/storage/protocol.h
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * Protocol Functions Header File 2 * Protocol Functions Header File
3 * 3 *
4 * $Id: protocol.h,v 1.4 2001/02/13 07:10:03 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index 3fcde9f0fa5f..09779f6a8179 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * SCSI layer glue code 2 * SCSI layer glue code
3 * 3 *
4 * $Id: scsiglue.c,v 1.26 2002/04/22 03:39:43 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
@@ -73,7 +71,6 @@ static const char* host_info(struct Scsi_Host *host)
73static int slave_alloc (struct scsi_device *sdev) 71static int slave_alloc (struct scsi_device *sdev)
74{ 72{
75 struct us_data *us = host_to_us(sdev->host); 73 struct us_data *us = host_to_us(sdev->host);
76 struct usb_host_endpoint *bulk_in_ep;
77 74
78 /* 75 /*
79 * Set the INQUIRY transfer length to 36. We don't use any of 76 * Set the INQUIRY transfer length to 36. We don't use any of
@@ -82,16 +79,22 @@ static int slave_alloc (struct scsi_device *sdev)
82 */ 79 */
83 sdev->inquiry_len = 36; 80 sdev->inquiry_len = 36;
84 81
85 /* Scatter-gather buffers (all but the last) must have a length 82 /* USB has unusual DMA-alignment requirements: Although the
86 * divisible by the bulk maxpacket size. Otherwise a data packet 83 * starting address of each scatter-gather element doesn't matter,
87 * would end up being short, causing a premature end to the data 84 * the length of each element except the last must be divisible
88 * transfer. We'll use the maxpacket value of the bulk-IN pipe 85 * by the Bulk maxpacket value. There's currently no way to
89 * to set the SCSI device queue's DMA alignment mask. 86 * express this by block-layer constraints, so we'll cop out
87 * and simply require addresses to be aligned at 512-byte
88 * boundaries. This is okay since most block I/O involves
89 * hardware sectors that are multiples of 512 bytes in length,
90 * and since host controllers up through USB 2.0 have maxpacket
91 * values no larger than 512.
92 *
93 * But it doesn't suffice for Wireless USB, where Bulk maxpacket
94 * values can be as large as 2048. To make that work properly
95 * will require changes to the block layer.
90 */ 96 */
91 bulk_in_ep = us->pusb_dev->ep_in[usb_pipeendpoint(us->recv_bulk_pipe)]; 97 blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1));
92 blk_queue_update_dma_alignment(sdev->request_queue,
93 le16_to_cpu(bulk_in_ep->desc.wMaxPacketSize) - 1);
94 /* wMaxPacketSize must be a power of 2 */
95 98
96 /* 99 /*
97 * The UFI spec treates the Peripheral Qualifier bits in an 100 * The UFI spec treates the Peripheral Qualifier bits in an
@@ -116,10 +119,10 @@ static int slave_configure(struct scsi_device *sdev)
116 * while others have trouble with more than 64K. At this time we 119 * while others have trouble with more than 64K. At this time we
117 * are limiting both to 32K (64 sectores). 120 * are limiting both to 32K (64 sectores).
118 */ 121 */
119 if (us->flags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) { 122 if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) {
120 unsigned int max_sectors = 64; 123 unsigned int max_sectors = 64;
121 124
122 if (us->flags & US_FL_MAX_SECTORS_MIN) 125 if (us->fflags & US_FL_MAX_SECTORS_MIN)
123 max_sectors = PAGE_CACHE_SIZE >> 9; 126 max_sectors = PAGE_CACHE_SIZE >> 9;
124 if (sdev->request_queue->max_sectors > max_sectors) 127 if (sdev->request_queue->max_sectors > max_sectors)
125 blk_queue_max_sectors(sdev->request_queue, 128 blk_queue_max_sectors(sdev->request_queue,
@@ -148,7 +151,7 @@ static int slave_configure(struct scsi_device *sdev)
148 * majority of devices work fine, but a few still can't 151 * majority of devices work fine, but a few still can't
149 * handle it. The sd driver will simply assume those 152 * handle it. The sd driver will simply assume those
150 * devices are write-enabled. */ 153 * devices are write-enabled. */
151 if (us->flags & US_FL_NO_WP_DETECT) 154 if (us->fflags & US_FL_NO_WP_DETECT)
152 sdev->skip_ms_page_3f = 1; 155 sdev->skip_ms_page_3f = 1;
153 156
154 /* A number of devices have problems with MODE SENSE for 157 /* A number of devices have problems with MODE SENSE for
@@ -158,13 +161,13 @@ static int slave_configure(struct scsi_device *sdev)
158 /* Some disks return the total number of blocks in response 161 /* Some disks return the total number of blocks in response
159 * to READ CAPACITY rather than the highest block number. 162 * to READ CAPACITY rather than the highest block number.
160 * If this device makes that mistake, tell the sd driver. */ 163 * If this device makes that mistake, tell the sd driver. */
161 if (us->flags & US_FL_FIX_CAPACITY) 164 if (us->fflags & US_FL_FIX_CAPACITY)
162 sdev->fix_capacity = 1; 165 sdev->fix_capacity = 1;
163 166
164 /* A few disks have two indistinguishable version, one of 167 /* A few disks have two indistinguishable version, one of
165 * which reports the correct capacity and the other does not. 168 * which reports the correct capacity and the other does not.
166 * The sd driver has to guess which is the case. */ 169 * The sd driver has to guess which is the case. */
167 if (us->flags & US_FL_CAPACITY_HEURISTICS) 170 if (us->fflags & US_FL_CAPACITY_HEURISTICS)
168 sdev->guess_capacity = 1; 171 sdev->guess_capacity = 1;
169 172
170 /* Some devices report a SCSI revision level above 2 but are 173 /* Some devices report a SCSI revision level above 2 but are
@@ -213,7 +216,7 @@ static int slave_configure(struct scsi_device *sdev)
213 216
214 /* Some devices choke when they receive a PREVENT-ALLOW MEDIUM 217 /* Some devices choke when they receive a PREVENT-ALLOW MEDIUM
215 * REMOVAL command, so suppress those commands. */ 218 * REMOVAL command, so suppress those commands. */
216 if (us->flags & US_FL_NOT_LOCKABLE) 219 if (us->fflags & US_FL_NOT_LOCKABLE)
217 sdev->lockable = 0; 220 sdev->lockable = 0;
218 221
219 /* this is to satisfy the compiler, tho I don't think the 222 /* this is to satisfy the compiler, tho I don't think the
@@ -238,7 +241,7 @@ static int queuecommand(struct scsi_cmnd *srb,
238 } 241 }
239 242
240 /* fail the command if we are disconnecting */ 243 /* fail the command if we are disconnecting */
241 if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { 244 if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
242 US_DEBUGP("Fail command during disconnect\n"); 245 US_DEBUGP("Fail command during disconnect\n");
243 srb->result = DID_NO_CONNECT << 16; 246 srb->result = DID_NO_CONNECT << 16;
244 done(srb); 247 done(srb);
@@ -248,7 +251,7 @@ static int queuecommand(struct scsi_cmnd *srb,
248 /* enqueue the command and wake up the control thread */ 251 /* enqueue the command and wake up the control thread */
249 srb->scsi_done = done; 252 srb->scsi_done = done;
250 us->srb = srb; 253 us->srb = srb;
251 up(&(us->sema)); 254 complete(&us->cmnd_ready);
252 255
253 return 0; 256 return 0;
254} 257}
@@ -280,9 +283,9 @@ static int command_abort(struct scsi_cmnd *srb)
280 * with the reset). Note that we must retain the host lock while 283 * with the reset). Note that we must retain the host lock while
281 * calling usb_stor_stop_transport(); otherwise it might interfere 284 * calling usb_stor_stop_transport(); otherwise it might interfere
282 * with an auto-reset that begins as soon as we release the lock. */ 285 * with an auto-reset that begins as soon as we release the lock. */
283 set_bit(US_FLIDX_TIMED_OUT, &us->flags); 286 set_bit(US_FLIDX_TIMED_OUT, &us->dflags);
284 if (!test_bit(US_FLIDX_RESETTING, &us->flags)) { 287 if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) {
285 set_bit(US_FLIDX_ABORTING, &us->flags); 288 set_bit(US_FLIDX_ABORTING, &us->dflags);
286 usb_stor_stop_transport(us); 289 usb_stor_stop_transport(us);
287 } 290 }
288 scsi_unlock(us_to_host(us)); 291 scsi_unlock(us_to_host(us));
@@ -329,7 +332,7 @@ void usb_stor_report_device_reset(struct us_data *us)
329 struct Scsi_Host *host = us_to_host(us); 332 struct Scsi_Host *host = us_to_host(us);
330 333
331 scsi_report_device_reset(host, 0, 0); 334 scsi_report_device_reset(host, 0, 0);
332 if (us->flags & US_FL_SCM_MULT_TARG) { 335 if (us->fflags & US_FL_SCM_MULT_TARG) {
333 for (i = 1; i < host->max_id; ++i) 336 for (i = 1; i < host->max_id; ++i)
334 scsi_report_device_reset(host, 0, i); 337 scsi_report_device_reset(host, 0, i);
335 } 338 }
@@ -400,7 +403,7 @@ static int proc_info (struct Scsi_Host *host, char *buffer,
400 pos += sprintf(pos, " Quirks:"); 403 pos += sprintf(pos, " Quirks:");
401 404
402#define US_FLAG(name, value) \ 405#define US_FLAG(name, value) \
403 if (us->flags & value) pos += sprintf(pos, " " #name); 406 if (us->fflags & value) pos += sprintf(pos, " " #name);
404US_DO_ALL_FLAGS 407US_DO_ALL_FLAGS
405#undef US_FLAG 408#undef US_FLAG
406 409
diff --git a/drivers/usb/storage/scsiglue.h b/drivers/usb/storage/scsiglue.h
index 737e4fa6045f..ffa1cca93d2c 100644
--- a/drivers/usb/storage/scsiglue.h
+++ b/drivers/usb/storage/scsiglue.h
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * SCSI Connecting Glue Header File 2 * SCSI Connecting Glue Header File
3 * 3 *
4 * $Id: scsiglue.h,v 1.4 2000/08/25 00:13:51 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
diff --git a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c
index 8972b17da843..c5a54b872c24 100644
--- a/drivers/usb/storage/sddr09.c
+++ b/drivers/usb/storage/sddr09.c
@@ -1,6 +1,5 @@
1/* Driver for SanDisk SDDR-09 SmartMedia reader 1/* Driver for SanDisk SDDR-09 SmartMedia reader
2 * 2 *
3 * $Id: sddr09.c,v 1.24 2002/04/22 03:39:43 mdharm Exp $
4 * (c) 2000, 2001 Robert Baruch (autophile@starband.net) 3 * (c) 2000, 2001 Robert Baruch (autophile@starband.net)
5 * (c) 2002 Andries Brouwer (aeb@cwi.nl) 4 * (c) 2002 Andries Brouwer (aeb@cwi.nl)
6 * Developed with the assistance of: 5 * Developed with the assistance of:
diff --git a/drivers/usb/storage/sddr09.h b/drivers/usb/storage/sddr09.h
index c03089a9ec38..e50033ad7b19 100644
--- a/drivers/usb/storage/sddr09.h
+++ b/drivers/usb/storage/sddr09.h
@@ -1,8 +1,6 @@
1/* Driver for SanDisk SDDR-09 SmartMedia reader 1/* Driver for SanDisk SDDR-09 SmartMedia reader
2 * Header File 2 * Header File
3 * 3 *
4 * $Id: sddr09.h,v 1.5 2000/08/25 00:13:51 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 2000 Robert Baruch (autophile@dol.net) 5 * (c) 2000 Robert Baruch (autophile@dol.net)
8 * (c) 2002 Andries Brouwer (aeb@cwi.nl) 6 * (c) 2002 Andries Brouwer (aeb@cwi.nl)
diff --git a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c
index 6d14327c921d..0d8df7577899 100644
--- a/drivers/usb/storage/sddr55.c
+++ b/drivers/usb/storage/sddr55.c
@@ -1,7 +1,5 @@
1/* Driver for SanDisk SDDR-55 SmartMedia reader 1/* Driver for SanDisk SDDR-55 SmartMedia reader
2 * 2 *
3 * $Id:$
4 *
5 * SDDR55 driver v0.1: 3 * SDDR55 driver v0.1:
6 * 4 *
7 * First release 5 * First release
diff --git a/drivers/usb/storage/sddr55.h b/drivers/usb/storage/sddr55.h
index d6bd32f6c9f3..a815a0470c84 100644
--- a/drivers/usb/storage/sddr55.h
+++ b/drivers/usb/storage/sddr55.h
@@ -1,8 +1,6 @@
1/* Driver for SanDisk SDDR-55 SmartMedia reader 1/* Driver for SanDisk SDDR-55 SmartMedia reader
2 * Header File 2 * Header File
3 * 3 *
4 * $Id:$
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 2002 Simon Munton 5 * (c) 2002 Simon Munton
8 * 6 *
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index 570c1250f6f3..ae6d64810d2a 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -1,7 +1,5 @@
1/* Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable 1/* Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
2 * 2 *
3 * $Id: shuttle_usbat.c,v 1.17 2002/04/22 03:39:43 mdharm Exp $
4 *
5 * Current development and maintenance by: 3 * Current development and maintenance by:
6 * (c) 2000, 2001 Robert Baruch (autophile@starband.net) 4 * (c) 2000, 2001 Robert Baruch (autophile@starband.net)
7 * (c) 2004, 2005 Daniel Drake <dsd@gentoo.org> 5 * (c) 2004, 2005 Daniel Drake <dsd@gentoo.org>
diff --git a/drivers/usb/storage/shuttle_usbat.h b/drivers/usb/storage/shuttle_usbat.h
index 3ddf143a1dec..d8bfc43e9044 100644
--- a/drivers/usb/storage/shuttle_usbat.h
+++ b/drivers/usb/storage/shuttle_usbat.h
@@ -1,8 +1,6 @@
1/* Driver for SCM Microsystems USB-ATAPI cable 1/* Driver for SCM Microsystems USB-ATAPI cable
2 * Header File 2 * Header File
3 * 3 *
4 * $Id: shuttle_usbat.h,v 1.5 2000/09/17 14:44:52 groovyjava Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 2000 Robert Baruch (autophile@dol.net) 5 * (c) 2000 Robert Baruch (autophile@dol.net)
8 * (c) 2004, 2005 Daniel Drake <dsd@gentoo.org> 6 * (c) 2004, 2005 Daniel Drake <dsd@gentoo.org>
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index 6610d2dd1e7f..fcbbfdb7b2b0 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -1,7 +1,5 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * 2 *
3 * $Id: transport.c,v 1.47 2002/04/22 03:39:43 mdharm Exp $
4 *
5 * Current development and maintenance by: 3 * Current development and maintenance by:
6 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 4 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
7 * 5 *
@@ -75,14 +73,14 @@
75 * by a separate code path.) 73 * by a separate code path.)
76 * 74 *
77 * The abort function (usb_storage_command_abort() in scsiglue.c) first 75 * The abort function (usb_storage_command_abort() in scsiglue.c) first
78 * sets the machine state and the ABORTING bit in us->flags to prevent 76 * sets the machine state and the ABORTING bit in us->dflags to prevent
79 * new URBs from being submitted. It then calls usb_stor_stop_transport() 77 * new URBs from being submitted. It then calls usb_stor_stop_transport()
80 * below, which atomically tests-and-clears the URB_ACTIVE bit in us->flags 78 * below, which atomically tests-and-clears the URB_ACTIVE bit in us->dflags
81 * to see if the current_urb needs to be stopped. Likewise, the SG_ACTIVE 79 * to see if the current_urb needs to be stopped. Likewise, the SG_ACTIVE
82 * bit is tested to see if the current_sg scatter-gather request needs to be 80 * bit is tested to see if the current_sg scatter-gather request needs to be
83 * stopped. The timeout callback routine does much the same thing. 81 * stopped. The timeout callback routine does much the same thing.
84 * 82 *
85 * When a disconnect occurs, the DISCONNECTING bit in us->flags is set to 83 * When a disconnect occurs, the DISCONNECTING bit in us->dflags is set to
86 * prevent new URBs from being submitted, and usb_stor_stop_transport() is 84 * prevent new URBs from being submitted, and usb_stor_stop_transport() is
87 * called to stop any ongoing requests. 85 * called to stop any ongoing requests.
88 * 86 *
@@ -127,8 +125,8 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
127 long timeleft; 125 long timeleft;
128 int status; 126 int status;
129 127
130 /* don't submit URBs during abort/disconnect processing */ 128 /* don't submit URBs during abort processing */
131 if (us->flags & ABORTING_OR_DISCONNECTING) 129 if (test_bit(US_FLIDX_ABORTING, &us->dflags))
132 return -EIO; 130 return -EIO;
133 131
134 /* set up data structures for the wakeup system */ 132 /* set up data structures for the wakeup system */
@@ -159,13 +157,13 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
159 157
160 /* since the URB has been submitted successfully, it's now okay 158 /* since the URB has been submitted successfully, it's now okay
161 * to cancel it */ 159 * to cancel it */
162 set_bit(US_FLIDX_URB_ACTIVE, &us->flags); 160 set_bit(US_FLIDX_URB_ACTIVE, &us->dflags);
163 161
164 /* did an abort/disconnect occur during the submission? */ 162 /* did an abort occur during the submission? */
165 if (us->flags & ABORTING_OR_DISCONNECTING) { 163 if (test_bit(US_FLIDX_ABORTING, &us->dflags)) {
166 164
167 /* cancel the URB, if it hasn't been cancelled already */ 165 /* cancel the URB, if it hasn't been cancelled already */
168 if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) { 166 if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) {
169 US_DEBUGP("-- cancelling URB\n"); 167 US_DEBUGP("-- cancelling URB\n");
170 usb_unlink_urb(us->current_urb); 168 usb_unlink_urb(us->current_urb);
171 } 169 }
@@ -175,7 +173,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
175 timeleft = wait_for_completion_interruptible_timeout( 173 timeleft = wait_for_completion_interruptible_timeout(
176 &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT); 174 &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT);
177 175
178 clear_bit(US_FLIDX_URB_ACTIVE, &us->flags); 176 clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags);
179 177
180 if (timeleft <= 0) { 178 if (timeleft <= 0) {
181 US_DEBUGP("%s -- cancelling URB\n", 179 US_DEBUGP("%s -- cancelling URB\n",
@@ -419,8 +417,8 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
419{ 417{
420 int result; 418 int result;
421 419
422 /* don't submit s-g requests during abort/disconnect processing */ 420 /* don't submit s-g requests during abort processing */
423 if (us->flags & ABORTING_OR_DISCONNECTING) 421 if (test_bit(US_FLIDX_ABORTING, &us->dflags))
424 return USB_STOR_XFER_ERROR; 422 return USB_STOR_XFER_ERROR;
425 423
426 /* initialize the scatter-gather request block */ 424 /* initialize the scatter-gather request block */
@@ -435,13 +433,13 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
435 433
436 /* since the block has been initialized successfully, it's now 434 /* since the block has been initialized successfully, it's now
437 * okay to cancel it */ 435 * okay to cancel it */
438 set_bit(US_FLIDX_SG_ACTIVE, &us->flags); 436 set_bit(US_FLIDX_SG_ACTIVE, &us->dflags);
439 437
440 /* did an abort/disconnect occur during the submission? */ 438 /* did an abort occur during the submission? */
441 if (us->flags & ABORTING_OR_DISCONNECTING) { 439 if (test_bit(US_FLIDX_ABORTING, &us->dflags)) {
442 440
443 /* cancel the request, if it hasn't been cancelled already */ 441 /* cancel the request, if it hasn't been cancelled already */
444 if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->flags)) { 442 if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags)) {
445 US_DEBUGP("-- cancelling sg request\n"); 443 US_DEBUGP("-- cancelling sg request\n");
446 usb_sg_cancel(&us->current_sg); 444 usb_sg_cancel(&us->current_sg);
447 } 445 }
@@ -449,7 +447,7 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
449 447
450 /* wait for the completion of the transfer */ 448 /* wait for the completion of the transfer */
451 usb_sg_wait(&us->current_sg); 449 usb_sg_wait(&us->current_sg);
452 clear_bit(US_FLIDX_SG_ACTIVE, &us->flags); 450 clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags);
453 451
454 result = us->current_sg.status; 452 result = us->current_sg.status;
455 if (act_len) 453 if (act_len)
@@ -530,7 +528,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
530 /* if the command gets aborted by the higher layers, we need to 528 /* if the command gets aborted by the higher layers, we need to
531 * short-circuit all other processing 529 * short-circuit all other processing
532 */ 530 */
533 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { 531 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
534 US_DEBUGP("-- command was aborted\n"); 532 US_DEBUGP("-- command was aborted\n");
535 srb->result = DID_ABORT << 16; 533 srb->result = DID_ABORT << 16;
536 goto Handle_Errors; 534 goto Handle_Errors;
@@ -616,7 +614,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
616 /* let's clean up right away */ 614 /* let's clean up right away */
617 scsi_eh_restore_cmnd(srb, &ses); 615 scsi_eh_restore_cmnd(srb, &ses);
618 616
619 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { 617 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
620 US_DEBUGP("-- auto-sense aborted\n"); 618 US_DEBUGP("-- auto-sense aborted\n");
621 srb->result = DID_ABORT << 16; 619 srb->result = DID_ABORT << 16;
622 goto Handle_Errors; 620 goto Handle_Errors;
@@ -629,7 +627,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
629 * auto-sense is perfectly valid 627 * auto-sense is perfectly valid
630 */ 628 */
631 srb->result = DID_ERROR << 16; 629 srb->result = DID_ERROR << 16;
632 if (!(us->flags & US_FL_SCM_MULT_TARG)) 630 if (!(us->fflags & US_FL_SCM_MULT_TARG))
633 goto Handle_Errors; 631 goto Handle_Errors;
634 return; 632 return;
635 } 633 }
@@ -679,8 +677,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
679 /* Set the RESETTING bit, and clear the ABORTING bit so that 677 /* Set the RESETTING bit, and clear the ABORTING bit so that
680 * the reset may proceed. */ 678 * the reset may proceed. */
681 scsi_lock(us_to_host(us)); 679 scsi_lock(us_to_host(us));
682 set_bit(US_FLIDX_RESETTING, &us->flags); 680 set_bit(US_FLIDX_RESETTING, &us->dflags);
683 clear_bit(US_FLIDX_ABORTING, &us->flags); 681 clear_bit(US_FLIDX_ABORTING, &us->dflags);
684 scsi_unlock(us_to_host(us)); 682 scsi_unlock(us_to_host(us));
685 683
686 /* We must release the device lock because the pre_reset routine 684 /* We must release the device lock because the pre_reset routine
@@ -695,7 +693,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
695 scsi_unlock(us_to_host(us)); 693 scsi_unlock(us_to_host(us));
696 us->transport_reset(us); 694 us->transport_reset(us);
697 } 695 }
698 clear_bit(US_FLIDX_RESETTING, &us->flags); 696 clear_bit(US_FLIDX_RESETTING, &us->dflags);
699} 697}
700 698
701/* Stop the current URB transfer */ 699/* Stop the current URB transfer */
@@ -707,13 +705,13 @@ void usb_stor_stop_transport(struct us_data *us)
707 * let's wake it up. The test_and_clear_bit() call 705 * let's wake it up. The test_and_clear_bit() call
708 * guarantees that if a URB has just been submitted, 706 * guarantees that if a URB has just been submitted,
709 * it won't be cancelled more than once. */ 707 * it won't be cancelled more than once. */
710 if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) { 708 if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) {
711 US_DEBUGP("-- cancelling URB\n"); 709 US_DEBUGP("-- cancelling URB\n");
712 usb_unlink_urb(us->current_urb); 710 usb_unlink_urb(us->current_urb);
713 } 711 }
714 712
715 /* If we are waiting for a scatter-gather operation, cancel it. */ 713 /* If we are waiting for a scatter-gather operation, cancel it. */
716 if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->flags)) { 714 if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags)) {
717 US_DEBUGP("-- cancelling sg request\n"); 715 US_DEBUGP("-- cancelling sg request\n");
718 usb_sg_cancel(&us->current_sg); 716 usb_sg_cancel(&us->current_sg);
719 } 717 }
@@ -914,7 +912,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
914 unsigned int cbwlen = US_BULK_CB_WRAP_LEN; 912 unsigned int cbwlen = US_BULK_CB_WRAP_LEN;
915 913
916 /* Take care of BULK32 devices; set extra byte to 0 */ 914 /* Take care of BULK32 devices; set extra byte to 0 */
917 if ( unlikely(us->flags & US_FL_BULK32)) { 915 if (unlikely(us->fflags & US_FL_BULK32)) {
918 cbwlen = 32; 916 cbwlen = 32;
919 us->iobuf[31] = 0; 917 us->iobuf[31] = 0;
920 } 918 }
@@ -925,7 +923,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
925 bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; 923 bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0;
926 bcb->Tag = ++us->tag; 924 bcb->Tag = ++us->tag;
927 bcb->Lun = srb->device->lun; 925 bcb->Lun = srb->device->lun;
928 if (us->flags & US_FL_SCM_MULT_TARG) 926 if (us->fflags & US_FL_SCM_MULT_TARG)
929 bcb->Lun |= srb->device->id << 4; 927 bcb->Lun |= srb->device->id << 4;
930 bcb->Length = srb->cmd_len; 928 bcb->Length = srb->cmd_len;
931 929
@@ -951,7 +949,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
951 /* Some USB-IDE converter chips need a 100us delay between the 949 /* Some USB-IDE converter chips need a 100us delay between the
952 * command phase and the data phase. Some devices need a little 950 * command phase and the data phase. Some devices need a little
953 * more than that, probably because of clock rate inaccuracies. */ 951 * more than that, probably because of clock rate inaccuracies. */
954 if (unlikely(us->flags & US_FL_GO_SLOW)) 952 if (unlikely(us->fflags & US_FL_GO_SLOW))
955 udelay(125); 953 udelay(125);
956 954
957 if (transfer_length) { 955 if (transfer_length) {
@@ -1010,7 +1008,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
1010 US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", 1008 US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
1011 le32_to_cpu(bcs->Signature), bcs->Tag, 1009 le32_to_cpu(bcs->Signature), bcs->Tag,
1012 residue, bcs->Status); 1010 residue, bcs->Status);
1013 if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || 1011 if (!(bcs->Tag == us->tag || (us->fflags & US_FL_BULK_IGNORE_TAG)) ||
1014 bcs->Status > US_BULK_STAT_PHASE) { 1012 bcs->Status > US_BULK_STAT_PHASE) {
1015 US_DEBUGP("Bulk logical error\n"); 1013 US_DEBUGP("Bulk logical error\n");
1016 return USB_STOR_TRANSPORT_ERROR; 1014 return USB_STOR_TRANSPORT_ERROR;
@@ -1035,7 +1033,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
1035 /* try to compute the actual residue, based on how much data 1033 /* try to compute the actual residue, based on how much data
1036 * was really transferred and what the device tells us */ 1034 * was really transferred and what the device tells us */
1037 if (residue) { 1035 if (residue) {
1038 if (!(us->flags & US_FL_IGNORE_RESIDUE)) { 1036 if (!(us->fflags & US_FL_IGNORE_RESIDUE)) {
1039 residue = min(residue, transfer_length); 1037 residue = min(residue, transfer_length);
1040 scsi_set_resid(srb, max(scsi_get_resid(srb), 1038 scsi_set_resid(srb, max(scsi_get_resid(srb),
1041 (int) residue)); 1039 (int) residue));
@@ -1090,7 +1088,7 @@ static int usb_stor_reset_common(struct us_data *us,
1090 int result; 1088 int result;
1091 int result2; 1089 int result2;
1092 1090
1093 if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { 1091 if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
1094 US_DEBUGP("No reset during disconnect\n"); 1092 US_DEBUGP("No reset during disconnect\n");
1095 return -EIO; 1093 return -EIO;
1096 } 1094 }
@@ -1103,12 +1101,12 @@ static int usb_stor_reset_common(struct us_data *us,
1103 return result; 1101 return result;
1104 } 1102 }
1105 1103
1106 /* Give the device some time to recover from the reset, 1104 /* Give the device some time to recover from the reset,
1107 * but don't delay disconnect processing. */ 1105 * but don't delay disconnect processing. */
1108 wait_event_interruptible_timeout(us->delay_wait, 1106 wait_event_interruptible_timeout(us->delay_wait,
1109 test_bit(US_FLIDX_DISCONNECTING, &us->flags), 1107 test_bit(US_FLIDX_DISCONNECTING, &us->dflags),
1110 HZ*6); 1108 HZ*6);
1111 if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { 1109 if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
1112 US_DEBUGP("Reset interrupted by disconnect\n"); 1110 US_DEBUGP("Reset interrupted by disconnect\n");
1113 return -EIO; 1111 return -EIO;
1114 } 1112 }
@@ -1170,13 +1168,12 @@ int usb_stor_port_reset(struct us_data *us)
1170 US_DEBUGP("unable to lock device for reset: %d\n", result); 1168 US_DEBUGP("unable to lock device for reset: %d\n", result);
1171 else { 1169 else {
1172 /* Were we disconnected while waiting for the lock? */ 1170 /* Were we disconnected while waiting for the lock? */
1173 if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { 1171 if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
1174 result = -EIO; 1172 result = -EIO;
1175 US_DEBUGP("No reset during disconnect\n"); 1173 US_DEBUGP("No reset during disconnect\n");
1176 } else { 1174 } else {
1177 result = usb_reset_composite_device( 1175 result = usb_reset_device(us->pusb_dev);
1178 us->pusb_dev, us->pusb_intf); 1176 US_DEBUGP("usb_reset_device returns %d\n",
1179 US_DEBUGP("usb_reset_composite_device returns %d\n",
1180 result); 1177 result);
1181 } 1178 }
1182 if (rc_lock) 1179 if (rc_lock)
diff --git a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h
index ada7c2f43f84..e70b88182f0e 100644
--- a/drivers/usb/storage/transport.h
+++ b/drivers/usb/storage/transport.h
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * Transport Functions Header File 2 * Transport Functions Header File
3 * 3 *
4 * $Id: transport.h,v 1.18 2002/04/21 02:57:59 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 39a7c11795c4..7ae69f55aa96 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * Unusual Devices File 2 * Unusual Devices File
3 * 3 *
4 * $Id: unusual_devs.h,v 1.32 2002/02/25 02:41:24 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 2000-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 2000-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
@@ -1234,6 +1232,17 @@ UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200,
1234 US_SC_DEVICE, US_PR_DEVICE, NULL, 1232 US_SC_DEVICE, US_PR_DEVICE, NULL,
1235 US_FL_NOT_LOCKABLE), 1233 US_FL_NOT_LOCKABLE),
1236 1234
1235/* Andrew Lunn <andrew@lunn.ch>
1236 * PanDigital Digital Picture Frame. Does not like ALLOW_MEDIUM_REMOVAL
1237 * on LUN 4.
1238 * Note: Vend:Prod clash with "Ltd Maxell WS30 Slim Digital Camera"
1239*/
1240UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200,
1241 "PanDigital",
1242 "Photo Frame",
1243 US_SC_DEVICE, US_PR_DEVICE, NULL,
1244 US_FL_NOT_LOCKABLE),
1245
1237/* Submitted by Jan De Luyck <lkml@kcore.org> */ 1246/* Submitted by Jan De Luyck <lkml@kcore.org> */
1238UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000, 1247UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000,
1239 "CITIZEN", 1248 "CITIZEN",
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index e268aacb773a..bfea851be985 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -1,7 +1,5 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * 2 *
3 * $Id: usb.c,v 1.75 2002/04/22 03:39:43 mdharm Exp $
4 *
5 * Current development and maintenance by: 3 * Current development and maintenance by:
6 * (c) 1999-2003 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 4 * (c) 1999-2003 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
7 * 5 *
@@ -312,26 +310,27 @@ static int usb_stor_control_thread(void * __us)
312 310
313 for(;;) { 311 for(;;) {
314 US_DEBUGP("*** thread sleeping.\n"); 312 US_DEBUGP("*** thread sleeping.\n");
315 if(down_interruptible(&us->sema)) 313 if (wait_for_completion_interruptible(&us->cmnd_ready))
316 break; 314 break;
317 315
318 US_DEBUGP("*** thread awakened.\n"); 316 US_DEBUGP("*** thread awakened.\n");
319 317
320 /* lock the device pointers */ 318 /* lock the device pointers */
321 mutex_lock(&(us->dev_mutex)); 319 mutex_lock(&(us->dev_mutex));
322 320
323 /* if the device has disconnected, we are free to exit */ 321 /* lock access to the state */
324 if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { 322 scsi_lock(host);
325 US_DEBUGP("-- exiting\n"); 323
324 /* When we are called with no command pending, we're done */
325 if (us->srb == NULL) {
326 scsi_unlock(host);
326 mutex_unlock(&us->dev_mutex); 327 mutex_unlock(&us->dev_mutex);
328 US_DEBUGP("-- exiting\n");
327 break; 329 break;
328 } 330 }
329 331
330 /* lock access to the state */
331 scsi_lock(host);
332
333 /* has the command timed out *already* ? */ 332 /* has the command timed out *already* ? */
334 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { 333 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
335 us->srb->result = DID_ABORT << 16; 334 us->srb->result = DID_ABORT << 16;
336 goto SkipForAbort; 335 goto SkipForAbort;
337 } 336 }
@@ -350,7 +349,7 @@ static int usb_stor_control_thread(void * __us)
350 * the maximum known LUN 349 * the maximum known LUN
351 */ 350 */
352 else if (us->srb->device->id && 351 else if (us->srb->device->id &&
353 !(us->flags & US_FL_SCM_MULT_TARG)) { 352 !(us->fflags & US_FL_SCM_MULT_TARG)) {
354 US_DEBUGP("Bad target number (%d:%d)\n", 353 US_DEBUGP("Bad target number (%d:%d)\n",
355 us->srb->device->id, us->srb->device->lun); 354 us->srb->device->id, us->srb->device->lun);
356 us->srb->result = DID_BAD_TARGET << 16; 355 us->srb->result = DID_BAD_TARGET << 16;
@@ -365,7 +364,7 @@ static int usb_stor_control_thread(void * __us)
365 /* Handle those devices which need us to fake 364 /* Handle those devices which need us to fake
366 * their inquiry data */ 365 * their inquiry data */
367 else if ((us->srb->cmnd[0] == INQUIRY) && 366 else if ((us->srb->cmnd[0] == INQUIRY) &&
368 (us->flags & US_FL_FIX_INQUIRY)) { 367 (us->fflags & US_FL_FIX_INQUIRY)) {
369 unsigned char data_ptr[36] = { 368 unsigned char data_ptr[36] = {
370 0x00, 0x80, 0x02, 0x02, 369 0x00, 0x80, 0x02, 0x02,
371 0x1F, 0x00, 0x00, 0x00}; 370 0x1F, 0x00, 0x00, 0x00};
@@ -384,12 +383,8 @@ static int usb_stor_control_thread(void * __us)
384 /* lock access to the state */ 383 /* lock access to the state */
385 scsi_lock(host); 384 scsi_lock(host);
386 385
387 /* did the command already complete because of a disconnect? */
388 if (!us->srb)
389 ; /* nothing to do */
390
391 /* indicate that the command is done */ 386 /* indicate that the command is done */
392 else if (us->srb->result != DID_ABORT << 16) { 387 if (us->srb->result != DID_ABORT << 16) {
393 US_DEBUGP("scsi cmd done, result=0x%x\n", 388 US_DEBUGP("scsi cmd done, result=0x%x\n",
394 us->srb->result); 389 us->srb->result);
395 us->srb->scsi_done(us->srb); 390 us->srb->scsi_done(us->srb);
@@ -403,12 +398,12 @@ SkipForAbort:
403 * the TIMED_OUT flag, not srb->result == DID_ABORT, because 398 * the TIMED_OUT flag, not srb->result == DID_ABORT, because
404 * the timeout might have occurred after the command had 399 * the timeout might have occurred after the command had
405 * already completed with a different result code. */ 400 * already completed with a different result code. */
406 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { 401 if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
407 complete(&(us->notify)); 402 complete(&(us->notify));
408 403
409 /* Allow USB transfers to resume */ 404 /* Allow USB transfers to resume */
410 clear_bit(US_FLIDX_ABORTING, &us->flags); 405 clear_bit(US_FLIDX_ABORTING, &us->dflags);
411 clear_bit(US_FLIDX_TIMED_OUT, &us->flags); 406 clear_bit(US_FLIDX_TIMED_OUT, &us->dflags);
412 } 407 }
413 408
414 /* finished working on this command */ 409 /* finished working on this command */
@@ -500,9 +495,9 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
500 us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ? 495 us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ?
501 idesc->bInterfaceProtocol : 496 idesc->bInterfaceProtocol :
502 unusual_dev->useTransport; 497 unusual_dev->useTransport;
503 us->flags = USB_US_ORIG_FLAGS(id->driver_info); 498 us->fflags = USB_US_ORIG_FLAGS(id->driver_info);
504 499
505 if (us->flags & US_FL_IGNORE_DEVICE) { 500 if (us->fflags & US_FL_IGNORE_DEVICE) {
506 printk(KERN_INFO USB_STORAGE "device ignored\n"); 501 printk(KERN_INFO USB_STORAGE "device ignored\n");
507 return -ENODEV; 502 return -ENODEV;
508 } 503 }
@@ -512,7 +507,7 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
512 * disable it if we're in full-speed 507 * disable it if we're in full-speed
513 */ 508 */
514 if (dev->speed != USB_SPEED_HIGH) 509 if (dev->speed != USB_SPEED_HIGH)
515 us->flags &= ~US_FL_GO_SLOW; 510 us->fflags &= ~US_FL_GO_SLOW;
516 511
517 /* Log a message if a non-generic unusual_dev entry contains an 512 /* Log a message if a non-generic unusual_dev entry contains an
518 * unnecessary subclass or protocol override. This may stimulate 513 * unnecessary subclass or protocol override. This may stimulate
@@ -533,7 +528,7 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
533 if (unusual_dev->useTransport != US_PR_DEVICE && 528 if (unusual_dev->useTransport != US_PR_DEVICE &&
534 us->protocol == idesc->bInterfaceProtocol) 529 us->protocol == idesc->bInterfaceProtocol)
535 msg += 2; 530 msg += 2;
536 if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) 531 if (msg >= 0 && !(us->fflags & US_FL_NEED_OVERRIDE))
537 printk(KERN_NOTICE USB_STORAGE "This device " 532 printk(KERN_NOTICE USB_STORAGE "This device "
538 "(%04x,%04x,%04x S %02x P %02x)" 533 "(%04x,%04x,%04x S %02x P %02x)"
539 " has %s in unusual_devs.h (kernel" 534 " has %s in unusual_devs.h (kernel"
@@ -663,7 +658,7 @@ static int get_transport(struct us_data *us)
663 US_DEBUGP("Transport: %s\n", us->transport_name); 658 US_DEBUGP("Transport: %s\n", us->transport_name);
664 659
665 /* fix for single-lun devices */ 660 /* fix for single-lun devices */
666 if (us->flags & US_FL_SINGLE_LUN) 661 if (us->fflags & US_FL_SINGLE_LUN)
667 us->max_lun = 0; 662 us->max_lun = 0;
668 return 0; 663 return 0;
669} 664}
@@ -820,12 +815,11 @@ static void usb_stor_release_resources(struct us_data *us)
820 US_DEBUGP("-- %s\n", __func__); 815 US_DEBUGP("-- %s\n", __func__);
821 816
822 /* Tell the control thread to exit. The SCSI host must 817 /* Tell the control thread to exit. The SCSI host must
823 * already have been removed so it won't try to queue 818 * already have been removed and the DISCONNECTING flag set
824 * any more commands. 819 * so that we won't accept any more commands.
825 */ 820 */
826 US_DEBUGP("-- sending exit command to thread\n"); 821 US_DEBUGP("-- sending exit command to thread\n");
827 set_bit(US_FLIDX_DISCONNECTING, &us->flags); 822 complete(&us->cmnd_ready);
828 up(&us->sema);
829 if (us->ctl_thread) 823 if (us->ctl_thread)
830 kthread_stop(us->ctl_thread); 824 kthread_stop(us->ctl_thread);
831 825
@@ -859,39 +853,36 @@ static void dissociate_dev(struct us_data *us)
859 usb_set_intfdata(us->pusb_intf, NULL); 853 usb_set_intfdata(us->pusb_intf, NULL);
860} 854}
861 855
862/* First stage of disconnect processing: stop all commands and remove 856/* First stage of disconnect processing: stop SCSI scanning,
863 * the host */ 857 * remove the host, and stop accepting new commands
858 */
864static void quiesce_and_remove_host(struct us_data *us) 859static void quiesce_and_remove_host(struct us_data *us)
865{ 860{
866 struct Scsi_Host *host = us_to_host(us); 861 struct Scsi_Host *host = us_to_host(us);
867 862
868 /* Prevent new USB transfers, stop the current command, and 863 /* If the device is really gone, cut short reset delays */
869 * interrupt a SCSI-scan or device-reset delay */ 864 if (us->pusb_dev->state == USB_STATE_NOTATTACHED)
870 scsi_lock(host); 865 set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
871 set_bit(US_FLIDX_DISCONNECTING, &us->flags);
872 scsi_unlock(host);
873 usb_stor_stop_transport(us);
874 wake_up(&us->delay_wait);
875 866
876 /* queuecommand won't accept any new commands and the control 867 /* Prevent SCSI-scanning (if it hasn't started yet)
877 * thread won't execute a previously-queued command. If there 868 * and wait for the SCSI-scanning thread to stop.
878 * is such a command pending, complete it with an error. */ 869 */
879 mutex_lock(&us->dev_mutex); 870 set_bit(US_FLIDX_DONT_SCAN, &us->dflags);
880 if (us->srb) { 871 wake_up(&us->delay_wait);
881 us->srb->result = DID_NO_CONNECT << 16; 872 wait_for_completion(&us->scanning_done);
882 scsi_lock(host);
883 us->srb->scsi_done(us->srb);
884 us->srb = NULL;
885 complete(&us->notify); /* in case of an abort */
886 scsi_unlock(host);
887 }
888 mutex_unlock(&us->dev_mutex);
889 873
890 /* Now we own no commands so it's safe to remove the SCSI host */ 874 /* Removing the host will perform an orderly shutdown: caches
875 * synchronized, disks spun down, etc.
876 */
891 scsi_remove_host(host); 877 scsi_remove_host(host);
892 878
893 /* Wait for the SCSI-scanning thread to stop */ 879 /* Prevent any new commands from being accepted and cut short
894 wait_for_completion(&us->scanning_done); 880 * reset delays.
881 */
882 scsi_lock(host);
883 set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
884 scsi_unlock(host);
885 wake_up(&us->delay_wait);
895} 886}
896 887
897/* Second stage of disconnect processing: deallocate all resources */ 888/* Second stage of disconnect processing: deallocate all resources */
@@ -919,16 +910,16 @@ static int usb_stor_scan_thread(void * __us)
919 printk(KERN_DEBUG "usb-storage: waiting for device " 910 printk(KERN_DEBUG "usb-storage: waiting for device "
920 "to settle before scanning\n"); 911 "to settle before scanning\n");
921 wait_event_freezable_timeout(us->delay_wait, 912 wait_event_freezable_timeout(us->delay_wait,
922 test_bit(US_FLIDX_DISCONNECTING, &us->flags), 913 test_bit(US_FLIDX_DONT_SCAN, &us->dflags),
923 delay_use * HZ); 914 delay_use * HZ);
924 } 915 }
925 916
926 /* If the device is still connected, perform the scanning */ 917 /* If the device is still connected, perform the scanning */
927 if (!test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { 918 if (!test_bit(US_FLIDX_DONT_SCAN, &us->dflags)) {
928 919
929 /* For bulk-only devices, determine the max LUN value */ 920 /* For bulk-only devices, determine the max LUN value */
930 if (us->protocol == US_PR_BULK && 921 if (us->protocol == US_PR_BULK &&
931 !(us->flags & US_FL_SINGLE_LUN)) { 922 !(us->fflags & US_FL_SINGLE_LUN)) {
932 mutex_lock(&us->dev_mutex); 923 mutex_lock(&us->dev_mutex);
933 us->max_lun = usb_stor_Bulk_max_lun(us); 924 us->max_lun = usb_stor_Bulk_max_lun(us);
934 mutex_unlock(&us->dev_mutex); 925 mutex_unlock(&us->dev_mutex);
@@ -975,7 +966,7 @@ static int storage_probe(struct usb_interface *intf,
975 us = host_to_us(host); 966 us = host_to_us(host);
976 memset(us, 0, sizeof(struct us_data)); 967 memset(us, 0, sizeof(struct us_data));
977 mutex_init(&(us->dev_mutex)); 968 mutex_init(&(us->dev_mutex));
978 init_MUTEX_LOCKED(&(us->sema)); 969 init_completion(&us->cmnd_ready);
979 init_completion(&(us->notify)); 970 init_completion(&(us->notify));
980 init_waitqueue_head(&us->delay_wait); 971 init_waitqueue_head(&us->delay_wait);
981 init_completion(&us->scanning_done); 972 init_completion(&us->scanning_done);
@@ -1023,6 +1014,7 @@ static int storage_probe(struct usb_interface *intf,
1023 if (IS_ERR(th)) { 1014 if (IS_ERR(th)) {
1024 printk(KERN_WARNING USB_STORAGE 1015 printk(KERN_WARNING USB_STORAGE
1025 "Unable to start the device-scanning thread\n"); 1016 "Unable to start the device-scanning thread\n");
1017 complete(&us->scanning_done);
1026 quiesce_and_remove_host(us); 1018 quiesce_and_remove_host(us);
1027 result = PTR_ERR(th); 1019 result = PTR_ERR(th);
1028 goto BadDevice; 1020 goto BadDevice;
@@ -1065,6 +1057,7 @@ static struct usb_driver usb_storage_driver = {
1065 .pre_reset = storage_pre_reset, 1057 .pre_reset = storage_pre_reset,
1066 .post_reset = storage_post_reset, 1058 .post_reset = storage_post_reset,
1067 .id_table = storage_usb_ids, 1059 .id_table = storage_usb_ids,
1060 .soft_unbind = 1,
1068}; 1061};
1069 1062
1070static int __init usb_stor_init(void) 1063static int __init usb_stor_init(void)
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
index 8d87503e2560..a4ad73bd832d 100644
--- a/drivers/usb/storage/usb.h
+++ b/drivers/usb/storage/usb.h
@@ -1,8 +1,6 @@
1/* Driver for USB Mass Storage compliant devices 1/* Driver for USB Mass Storage compliant devices
2 * Main Header File 2 * Main Header File
3 * 3 *
4 * $Id: usb.h,v 1.21 2002/04/21 02:57:59 mdharm Exp $
5 *
6 * Current development and maintenance by: 4 * Current development and maintenance by:
7 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) 5 * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
8 * 6 *
@@ -67,16 +65,14 @@ struct us_unusual_dev {
67}; 65};
68 66
69 67
70/* Dynamic flag definitions: used in set_bit() etc. */ 68/* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */
71#define US_FLIDX_URB_ACTIVE 18 /* 0x00040000 current_urb is in use */ 69#define US_FLIDX_URB_ACTIVE 0 /* current_urb is in use */
72#define US_FLIDX_SG_ACTIVE 19 /* 0x00080000 current_sg is in use */ 70#define US_FLIDX_SG_ACTIVE 1 /* current_sg is in use */
73#define US_FLIDX_ABORTING 20 /* 0x00100000 abort is in progress */ 71#define US_FLIDX_ABORTING 2 /* abort is in progress */
74#define US_FLIDX_DISCONNECTING 21 /* 0x00200000 disconnect in progress */ 72#define US_FLIDX_DISCONNECTING 3 /* disconnect in progress */
75#define ABORTING_OR_DISCONNECTING ((1UL << US_FLIDX_ABORTING) | \ 73#define US_FLIDX_RESETTING 4 /* device reset in progress */
76 (1UL << US_FLIDX_DISCONNECTING)) 74#define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */
77#define US_FLIDX_RESETTING 22 /* 0x00400000 device reset in progress */ 75#define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */
78#define US_FLIDX_TIMED_OUT 23 /* 0x00800000 SCSI midlayer timed out */
79
80 76
81#define USB_STOR_STRING_LEN 32 77#define USB_STOR_STRING_LEN 32
82 78
@@ -109,7 +105,8 @@ struct us_data {
109 struct usb_device *pusb_dev; /* this usb_device */ 105 struct usb_device *pusb_dev; /* this usb_device */
110 struct usb_interface *pusb_intf; /* this interface */ 106 struct usb_interface *pusb_intf; /* this interface */
111 struct us_unusual_dev *unusual_dev; /* device-filter entry */ 107 struct us_unusual_dev *unusual_dev; /* device-filter entry */
112 unsigned long flags; /* from filter initially */ 108 unsigned long fflags; /* fixed flags from filter */
109 unsigned long dflags; /* dynamic atomic bitflags */
113 unsigned int send_bulk_pipe; /* cached pipe values */ 110 unsigned int send_bulk_pipe; /* cached pipe values */
114 unsigned int recv_bulk_pipe; 111 unsigned int recv_bulk_pipe;
115 unsigned int send_ctrl_pipe; 112 unsigned int send_ctrl_pipe;
@@ -147,7 +144,7 @@ struct us_data {
147 struct task_struct *ctl_thread; /* the control thread */ 144 struct task_struct *ctl_thread; /* the control thread */
148 145
149 /* mutual exclusion and synchronization structures */ 146 /* mutual exclusion and synchronization structures */
150 struct semaphore sema; /* to sleep thread on */ 147 struct completion cmnd_ready; /* to sleep thread on */
151 struct completion notify; /* thread begin/end */ 148 struct completion notify; /* thread begin/end */
152 wait_queue_head_t delay_wait; /* wait during scan, reset */ 149 wait_queue_head_t delay_wait; /* wait during scan, reset */
153 struct completion scanning_done; /* wait for scan thread */ 150 struct completion scanning_done; /* wait for scan thread */
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 9b887ef64ff1..70d135e0cc47 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -1658,6 +1658,32 @@ config FB_PM3
1658 similar boards, 3DLabs Permedia3 Create!, Appian Jeronimo 2000 1658 similar boards, 3DLabs Permedia3 Create!, Appian Jeronimo 2000
1659 and maybe other boards. 1659 and maybe other boards.
1660 1660
1661config FB_CARMINE
1662 tristate "Fujitsu carmine frame buffer support"
1663 depends on FB && PCI
1664 select FB_CFB_FILLRECT
1665 select FB_CFB_COPYAREA
1666 select FB_CFB_IMAGEBLIT
1667 help
1668 This is the frame buffer device driver for the Fujitsu Carmine chip.
1669 The driver provides two independent frame buffer devices.
1670
1671choice
1672 depends on FB_CARMINE
1673 prompt "DRAM timing"
1674 default FB_CARMINE_DRAM_EVAL
1675
1676config FB_CARMINE_DRAM_EVAL
1677 bool "Eval board timings"
1678 help
1679 Use timings which work on the eval card.
1680
1681config CARMINE_DRAM_CUSTOM
1682 bool "Custom board timings"
1683 help
1684 Use custom board timings.
1685endchoice
1686
1661config FB_AU1100 1687config FB_AU1100
1662 bool "Au1100 LCD Driver" 1688 bool "Au1100 LCD Driver"
1663 depends on (FB = y) && MIPS && SOC_AU1100 1689 depends on (FB = y) && MIPS && SOC_AU1100
@@ -1840,6 +1866,16 @@ config FB_W100
1840 1866
1841 If unsure, say N. 1867 If unsure, say N.
1842 1868
1869config FB_SH_MOBILE_LCDC
1870 tristate "SuperH Mobile LCDC framebuffer support"
1871 depends on FB && SUPERH
1872 select FB_CFB_FILLRECT
1873 select FB_CFB_COPYAREA
1874 select FB_CFB_IMAGEBLIT
1875 default m
1876 ---help---
1877 Frame buffer driver for the on-chip SH-Mobile LCD controller.
1878
1843config FB_S3C2410 1879config FB_S3C2410
1844 tristate "S3C2410 LCD framebuffer support" 1880 tristate "S3C2410 LCD framebuffer support"
1845 depends on FB && ARCH_S3C2410 1881 depends on FB && ARCH_S3C2410
@@ -1951,6 +1987,23 @@ config FB_AM200EPD
1951 This enables support for the Metronome display controller used on 1987 This enables support for the Metronome display controller used on
1952 the E-Ink AM-200 EPD devkit. 1988 the E-Ink AM-200 EPD devkit.
1953 1989
1990config FB_COBALT
1991 tristate "Cobalt server LCD frame buffer support"
1992 depends on FB && MIPS_COBALT
1993
1994config FB_SH7760
1995 bool "SH7760/SH7763 LCDC support"
1996 depends on FB && (CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7763)
1997 select FB_CFB_FILLRECT
1998 select FB_CFB_COPYAREA
1999 select FB_CFB_IMAGEBLIT
2000 help
2001 Support for the SH7760/SH7763 integrated (D)STN/TFT LCD Controller.
2002 Supports display resolutions up to 1024x1024 pixel, grayscale and
2003 color operation, with depths ranging from 1 bpp to 8 bpp monochrome
2004 and 8, 15 or 16 bpp color; 90 degrees clockwise display rotation for
2005 panels <= 320 pixel horizontal resolution.
2006
1954config FB_VIRTUAL 2007config FB_VIRTUAL
1955 tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)" 2008 tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
1956 depends on FB 2009 depends on FB
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 04bca35403ff..0ebc1bfd2514 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -106,17 +106,22 @@ obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o
106obj-$(CONFIG_FB_MAXINE) += maxinefb.o 106obj-$(CONFIG_FB_MAXINE) += maxinefb.o
107obj-$(CONFIG_FB_METRONOME) += metronomefb.o 107obj-$(CONFIG_FB_METRONOME) += metronomefb.o
108obj-$(CONFIG_FB_S1D13XXX) += s1d13xxxfb.o 108obj-$(CONFIG_FB_S1D13XXX) += s1d13xxxfb.o
109obj-$(CONFIG_FB_SH7760) += sh7760fb.o
109obj-$(CONFIG_FB_IMX) += imxfb.o 110obj-$(CONFIG_FB_IMX) += imxfb.o
110obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o 111obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o
111obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o 112obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o
113obj-$(CONFIG_FB_COBALT) += cobalt_lcdfb.o
112obj-$(CONFIG_FB_PNX4008_DUM) += pnx4008/ 114obj-$(CONFIG_FB_PNX4008_DUM) += pnx4008/
113obj-$(CONFIG_FB_PNX4008_DUM_RGB) += pnx4008/ 115obj-$(CONFIG_FB_PNX4008_DUM_RGB) += pnx4008/
114obj-$(CONFIG_FB_IBM_GXT4500) += gxt4500.o 116obj-$(CONFIG_FB_IBM_GXT4500) += gxt4500.o
115obj-$(CONFIG_FB_PS3) += ps3fb.o 117obj-$(CONFIG_FB_PS3) += ps3fb.o
116obj-$(CONFIG_FB_SM501) += sm501fb.o 118obj-$(CONFIG_FB_SM501) += sm501fb.o
117obj-$(CONFIG_FB_XILINX) += xilinxfb.o 119obj-$(CONFIG_FB_XILINX) += xilinxfb.o
120obj-$(CONFIG_FB_SH_MOBILE_LCDC) += sh_mobile_lcdcfb.o
121obj-$(CONFIG_FB_SH7343VOU) += sh7343_voufb.o
118obj-$(CONFIG_FB_OMAP) += omap/ 122obj-$(CONFIG_FB_OMAP) += omap/
119obj-$(CONFIG_XEN_FBDEV_FRONTEND) += xen-fbfront.o 123obj-$(CONFIG_XEN_FBDEV_FRONTEND) += xen-fbfront.o
124obj-$(CONFIG_FB_CARMINE) += carminefb.o
120 125
121# Platform or fallback drivers go here 126# Platform or fallback drivers go here
122obj-$(CONFIG_FB_UVESA) += uvesafb.o 127obj-$(CONFIG_FB_UVESA) += uvesafb.o
diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c
index eedb8285e32f..017233d0c481 100644
--- a/drivers/video/acornfb.c
+++ b/drivers/video/acornfb.c
@@ -23,6 +23,7 @@
23#include <linux/string.h> 23#include <linux/string.h>
24#include <linux/ctype.h> 24#include <linux/ctype.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/mm.h>
26#include <linux/init.h> 27#include <linux/init.h>
27#include <linux/fb.h> 28#include <linux/fb.h>
28#include <linux/platform_device.h> 29#include <linux/platform_device.h>
diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c
index 45c154ade9ca..b8e9a8682f2d 100644
--- a/drivers/video/amifb.c
+++ b/drivers/video/amifb.c
@@ -1136,7 +1136,6 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg
1136 * Interface to the low level console driver 1136 * Interface to the low level console driver
1137 */ 1137 */
1138 1138
1139int amifb_init(void);
1140static void amifb_deinit(void); 1139static void amifb_deinit(void);
1141 1140
1142 /* 1141 /*
@@ -2048,13 +2047,16 @@ static void amifb_copyarea(struct fb_info *info,
2048 width = x2 - dx; 2047 width = x2 - dx;
2049 height = y2 - dy; 2048 height = y2 - dy;
2050 2049
2050 if (area->sx + dx < area->dx || area->sy + dy < area->dy)
2051 return;
2052
2051 /* update sx,sy */ 2053 /* update sx,sy */
2052 sx = area->sx + (dx - area->dx); 2054 sx = area->sx + (dx - area->dx);
2053 sy = area->sy + (dy - area->dy); 2055 sy = area->sy + (dy - area->dy);
2054 2056
2055 /* the source must be completely inside the virtual screen */ 2057 /* the source must be completely inside the virtual screen */
2056 if (sx < 0 || sy < 0 || (sx + width) > info->var.xres_virtual || 2058 if (sx + width > info->var.xres_virtual ||
2057 (sy + height) > info->var.yres_virtual) 2059 sy + height > info->var.yres_virtual)
2058 return; 2060 return;
2059 2061
2060 if (dy > sy || (dy == sy && dx > sx)) { 2062 if (dy > sy || (dy == sy && dx > sx)) {
@@ -2245,7 +2247,7 @@ static inline void chipfree(void)
2245 * Initialisation 2247 * Initialisation
2246 */ 2248 */
2247 2249
2248int __init amifb_init(void) 2250static int __init amifb_init(void)
2249{ 2251{
2250 int tag, i, err = 0; 2252 int tag, i, err = 0;
2251 u_long chipptr; 2253 u_long chipptr;
@@ -3790,16 +3792,14 @@ static void ami_rebuild_copper(void)
3790 } 3792 }
3791} 3793}
3792 3794
3793 3795static void __exit amifb_exit(void)
3794module_init(amifb_init);
3795
3796#ifdef MODULE
3797MODULE_LICENSE("GPL");
3798
3799void cleanup_module(void)
3800{ 3796{
3801 unregister_framebuffer(&fb_info); 3797 unregister_framebuffer(&fb_info);
3802 amifb_deinit(); 3798 amifb_deinit();
3803 amifb_video_off(); 3799 amifb_video_off();
3804} 3800}
3805#endif /* MODULE */ 3801
3802module_init(amifb_init);
3803module_exit(amifb_exit);
3804
3805MODULE_LICENSE("GPL");
diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c
index fa55d356b535..77eb8b34fbfa 100644
--- a/drivers/video/atafb.c
+++ b/drivers/video/atafb.c
@@ -2593,13 +2593,16 @@ static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
2593 width = x2 - dx; 2593 width = x2 - dx;
2594 height = y2 - dy; 2594 height = y2 - dy;
2595 2595
2596 if (area->sx + dx < area->dx || area->sy + dy < area->dy)
2597 return;
2598
2596 /* update sx,sy */ 2599 /* update sx,sy */
2597 sx = area->sx + (dx - area->dx); 2600 sx = area->sx + (dx - area->dx);
2598 sy = area->sy + (dy - area->dy); 2601 sy = area->sy + (dy - area->dy);
2599 2602
2600 /* the source must be completely inside the virtual screen */ 2603 /* the source must be completely inside the virtual screen */
2601 if (sx < 0 || sy < 0 || (sx + width) > info->var.xres_virtual || 2604 if (sx + width > info->var.xres_virtual ||
2602 (sy + height) > info->var.yres_virtual) 2605 sy + height > info->var.yres_virtual)
2603 return; 2606 return;
2604 2607
2605 if (dy > sy || (dy == sy && dx > sx)) { 2608 if (dy > sy || (dy == sy && dx > sx)) {
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c
index b004036d4087..5b3a15dffb5f 100644
--- a/drivers/video/atmel_lcdfb.c
+++ b/drivers/video/atmel_lcdfb.c
@@ -256,6 +256,20 @@ static int atmel_lcdfb_alloc_video_memory(struct atmel_lcdfb_info *sinfo)
256 return 0; 256 return 0;
257} 257}
258 258
259static const struct fb_videomode *atmel_lcdfb_choose_mode(struct fb_var_screeninfo *var,
260 struct fb_info *info)
261{
262 struct fb_videomode varfbmode;
263 const struct fb_videomode *fbmode = NULL;
264
265 fb_var_to_videomode(&varfbmode, var);
266 fbmode = fb_find_nearest_mode(&varfbmode, &info->modelist);
267 if (fbmode)
268 fb_videomode_to_var(var, fbmode);
269 return fbmode;
270}
271
272
259/** 273/**
260 * atmel_lcdfb_check_var - Validates a var passed in. 274 * atmel_lcdfb_check_var - Validates a var passed in.
261 * @var: frame buffer variable screen structure 275 * @var: frame buffer variable screen structure
@@ -289,6 +303,15 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
289 clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000; 303 clk_value_khz = clk_get_rate(sinfo->lcdc_clk) / 1000;
290 304
291 dev_dbg(dev, "%s:\n", __func__); 305 dev_dbg(dev, "%s:\n", __func__);
306
307 if (!(var->pixclock && var->bits_per_pixel)) {
308 /* choose a suitable mode if possible */
309 if (!atmel_lcdfb_choose_mode(var, info)) {
310 dev_err(dev, "needed value not specified\n");
311 return -EINVAL;
312 }
313 }
314
292 dev_dbg(dev, " resolution: %ux%u\n", var->xres, var->yres); 315 dev_dbg(dev, " resolution: %ux%u\n", var->xres, var->yres);
293 dev_dbg(dev, " pixclk: %lu KHz\n", PICOS2KHZ(var->pixclock)); 316 dev_dbg(dev, " pixclk: %lu KHz\n", PICOS2KHZ(var->pixclock));
294 dev_dbg(dev, " bpp: %u\n", var->bits_per_pixel); 317 dev_dbg(dev, " bpp: %u\n", var->bits_per_pixel);
@@ -299,6 +322,13 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
299 return -EINVAL; 322 return -EINVAL;
300 } 323 }
301 324
325 /* Do not allow to have real resoulution larger than virtual */
326 if (var->xres > var->xres_virtual)
327 var->xres_virtual = var->xres;
328
329 if (var->yres > var->yres_virtual)
330 var->yres_virtual = var->yres;
331
302 /* Force same alignment for each line */ 332 /* Force same alignment for each line */
303 var->xres = (var->xres + 3) & ~3UL; 333 var->xres = (var->xres + 3) & ~3UL;
304 var->xres_virtual = (var->xres_virtual + 3) & ~3UL; 334 var->xres_virtual = (var->xres_virtual + 3) & ~3UL;
@@ -379,6 +409,35 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
379 return 0; 409 return 0;
380} 410}
381 411
412/*
413 * LCD reset sequence
414 */
415static void atmel_lcdfb_reset(struct atmel_lcdfb_info *sinfo)
416{
417 might_sleep();
418
419 /* LCD power off */
420 lcdc_writel(sinfo, ATMEL_LCDC_PWRCON, sinfo->guard_time << ATMEL_LCDC_GUARDT_OFFSET);
421
422 /* wait for the LCDC core to become idle */
423 while (lcdc_readl(sinfo, ATMEL_LCDC_PWRCON) & ATMEL_LCDC_BUSY)
424 msleep(10);
425
426 /* DMA disable */
427 lcdc_writel(sinfo, ATMEL_LCDC_DMACON, 0);
428
429 /* wait for DMA engine to become idle */
430 while (lcdc_readl(sinfo, ATMEL_LCDC_DMACON) & ATMEL_LCDC_DMABUSY)
431 msleep(10);
432
433 /* LCD power on */
434 lcdc_writel(sinfo, ATMEL_LCDC_PWRCON,
435 (sinfo->guard_time << ATMEL_LCDC_GUARDT_OFFSET) | ATMEL_LCDC_PWR);
436
437 /* DMA enable */
438 lcdc_writel(sinfo, ATMEL_LCDC_DMACON, sinfo->default_dmacon);
439}
440
382/** 441/**
383 * atmel_lcdfb_set_par - Alters the hardware state. 442 * atmel_lcdfb_set_par - Alters the hardware state.
384 * @info: frame buffer structure that represents a single frame buffer 443 * @info: frame buffer structure that represents a single frame buffer
@@ -401,6 +460,8 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
401 unsigned long clk_value_khz; 460 unsigned long clk_value_khz;
402 unsigned long bits_per_line; 461 unsigned long bits_per_line;
403 462
463 might_sleep();
464
404 dev_dbg(info->device, "%s:\n", __func__); 465 dev_dbg(info->device, "%s:\n", __func__);
405 dev_dbg(info->device, " * resolution: %ux%u (%ux%u virtual)\n", 466 dev_dbg(info->device, " * resolution: %ux%u (%ux%u virtual)\n",
406 info->var.xres, info->var.yres, 467 info->var.xres, info->var.yres,
@@ -511,6 +572,8 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
511 572
512 /* Disable all interrupts */ 573 /* Disable all interrupts */
513 lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL); 574 lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL);
575 /* Enable FIFO & DMA errors */
576 lcdc_writel(sinfo, ATMEL_LCDC_IER, ATMEL_LCDC_UFLWI | ATMEL_LCDC_OWRI | ATMEL_LCDC_MERI);
514 577
515 /* ...wait for DMA engine to become idle... */ 578 /* ...wait for DMA engine to become idle... */
516 while (lcdc_readl(sinfo, ATMEL_LCDC_DMACON) & ATMEL_LCDC_DMABUSY) 579 while (lcdc_readl(sinfo, ATMEL_LCDC_DMACON) & ATMEL_LCDC_DMABUSY)
@@ -645,10 +708,26 @@ static irqreturn_t atmel_lcdfb_interrupt(int irq, void *dev_id)
645 u32 status; 708 u32 status;
646 709
647 status = lcdc_readl(sinfo, ATMEL_LCDC_ISR); 710 status = lcdc_readl(sinfo, ATMEL_LCDC_ISR);
648 lcdc_writel(sinfo, ATMEL_LCDC_IDR, status); 711 if (status & ATMEL_LCDC_UFLWI) {
712 dev_warn(info->device, "FIFO underflow %#x\n", status);
713 /* reset DMA and FIFO to avoid screen shifting */
714 schedule_work(&sinfo->task);
715 }
716 lcdc_writel(sinfo, ATMEL_LCDC_ICR, status);
649 return IRQ_HANDLED; 717 return IRQ_HANDLED;
650} 718}
651 719
720/*
721 * LCD controller task (to reset the LCD)
722 */
723static void atmel_lcdfb_task(struct work_struct *work)
724{
725 struct atmel_lcdfb_info *sinfo =
726 container_of(work, struct atmel_lcdfb_info, task);
727
728 atmel_lcdfb_reset(sinfo);
729}
730
652static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo) 731static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
653{ 732{
654 struct fb_info *info = sinfo->info; 733 struct fb_info *info = sinfo->info;
@@ -691,6 +770,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
691 struct fb_info *info; 770 struct fb_info *info;
692 struct atmel_lcdfb_info *sinfo; 771 struct atmel_lcdfb_info *sinfo;
693 struct atmel_lcdfb_info *pdata_sinfo; 772 struct atmel_lcdfb_info *pdata_sinfo;
773 struct fb_videomode fbmode;
694 struct resource *regs = NULL; 774 struct resource *regs = NULL;
695 struct resource *map = NULL; 775 struct resource *map = NULL;
696 int ret; 776 int ret;
@@ -824,6 +904,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
824 goto unmap_mmio; 904 goto unmap_mmio;
825 } 905 }
826 906
907 /* Some operations on the LCDC might sleep and
908 * require a preemptible task context */
909 INIT_WORK(&sinfo->task, atmel_lcdfb_task);
910
827 ret = atmel_lcdfb_init_fbinfo(sinfo); 911 ret = atmel_lcdfb_init_fbinfo(sinfo);
828 if (ret < 0) { 912 if (ret < 0) {
829 dev_err(dev, "init fbinfo failed: %d\n", ret); 913 dev_err(dev, "init fbinfo failed: %d\n", ret);
@@ -853,6 +937,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
853 goto free_cmap; 937 goto free_cmap;
854 } 938 }
855 939
940 /* add selected videomode to modelist */
941 fb_var_to_videomode(&fbmode, &info->var);
942 fb_add_videomode(&fbmode, &info->modelist);
943
856 /* Power up the LCDC screen */ 944 /* Power up the LCDC screen */
857 if (sinfo->atmel_lcdfb_power_control) 945 if (sinfo->atmel_lcdfb_power_control)
858 sinfo->atmel_lcdfb_power_control(1); 946 sinfo->atmel_lcdfb_power_control(1);
@@ -866,6 +954,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
866free_cmap: 954free_cmap:
867 fb_dealloc_cmap(&info->cmap); 955 fb_dealloc_cmap(&info->cmap);
868unregister_irqs: 956unregister_irqs:
957 cancel_work_sync(&sinfo->task);
869 free_irq(sinfo->irq_base, info); 958 free_irq(sinfo->irq_base, info);
870unmap_mmio: 959unmap_mmio:
871 exit_backlight(sinfo); 960 exit_backlight(sinfo);
@@ -903,6 +992,7 @@ static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
903 if (!sinfo) 992 if (!sinfo)
904 return 0; 993 return 0;
905 994
995 cancel_work_sync(&sinfo->task);
906 exit_backlight(sinfo); 996 exit_backlight(sinfo);
907 if (sinfo->atmel_lcdfb_power_control) 997 if (sinfo->atmel_lcdfb_power_control)
908 sinfo->atmel_lcdfb_power_control(0); 998 sinfo->atmel_lcdfb_power_control(0);
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
index 24ee96c4e9e9..243ea4ab20c8 100644
--- a/drivers/video/aty/aty128fb.c
+++ b/drivers/video/aty/aty128fb.c
@@ -1339,10 +1339,8 @@ static int aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll,
1339 if (vclk * 12 < c.ppll_min) 1339 if (vclk * 12 < c.ppll_min)
1340 vclk = c.ppll_min/12; 1340 vclk = c.ppll_min/12;
1341 1341
1342 pll->post_divider = -1;
1343
1344 /* now, find an acceptable divider */ 1342 /* now, find an acceptable divider */
1345 for (i = 0; i < sizeof(post_dividers); i++) { 1343 for (i = 0; i < ARRAY_SIZE(post_dividers); i++) {
1346 output_freq = post_dividers[i] * vclk; 1344 output_freq = post_dividers[i] * vclk;
1347 if (output_freq >= c.ppll_min && output_freq <= c.ppll_max) { 1345 if (output_freq >= c.ppll_min && output_freq <= c.ppll_max) {
1348 pll->post_divider = post_dividers[i]; 1346 pll->post_divider = post_dividers[i];
@@ -1350,7 +1348,7 @@ static int aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll,
1350 } 1348 }
1351 } 1349 }
1352 1350
1353 if (pll->post_divider < 0) 1351 if (i == ARRAY_SIZE(post_dividers))
1354 return -EINVAL; 1352 return -EINVAL;
1355 1353
1356 /* calculate feedback divider */ 1354 /* calculate feedback divider */
@@ -1872,7 +1870,7 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
1872 struct fb_info *info = pci_get_drvdata(pdev); 1870 struct fb_info *info = pci_get_drvdata(pdev);
1873 struct aty128fb_par *par = info->par; 1871 struct aty128fb_par *par = info->par;
1874 struct fb_var_screeninfo var; 1872 struct fb_var_screeninfo var;
1875 char video_card[DEVICE_NAME_SIZE]; 1873 char video_card[50];
1876 u8 chip_rev; 1874 u8 chip_rev;
1877 u32 dac; 1875 u32 dac;
1878 1876
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
index bd4ac0bafecb..620ba8120368 100644
--- a/drivers/video/aty/atyfb_base.c
+++ b/drivers/video/aty/atyfb_base.c
@@ -424,7 +424,6 @@ static struct {
424#endif /* CONFIG_FB_ATY_CT */ 424#endif /* CONFIG_FB_ATY_CT */
425}; 425};
426 426
427/* can not fail */
428static int __devinit correct_chipset(struct atyfb_par *par) 427static int __devinit correct_chipset(struct atyfb_par *par)
429{ 428{
430 u8 rev; 429 u8 rev;
@@ -437,6 +436,9 @@ static int __devinit correct_chipset(struct atyfb_par *par)
437 if (par->pci_id == aty_chips[i].pci_id) 436 if (par->pci_id == aty_chips[i].pci_id)
438 break; 437 break;
439 438
439 if (i < 0)
440 return -ENODEV;
441
440 name = aty_chips[i].name; 442 name = aty_chips[i].name;
441 par->pll_limits.pll_max = aty_chips[i].pll; 443 par->pll_limits.pll_max = aty_chips[i].pll;
442 par->pll_limits.mclk = aty_chips[i].mclk; 444 par->pll_limits.mclk = aty_chips[i].mclk;
@@ -2229,6 +2231,7 @@ static int __devinit aty_init(struct fb_info *info)
2229 const char *ramname = NULL, *xtal; 2231 const char *ramname = NULL, *xtal;
2230 int gtb_memsize, has_var = 0; 2232 int gtb_memsize, has_var = 0;
2231 struct fb_var_screeninfo var; 2233 struct fb_var_screeninfo var;
2234 int ret;
2232 2235
2233 init_waitqueue_head(&par->vblank.wait); 2236 init_waitqueue_head(&par->vblank.wait);
2234 spin_lock_init(&par->int_lock); 2237 spin_lock_init(&par->int_lock);
@@ -2610,7 +2613,8 @@ static int __devinit aty_init(struct fb_info *info)
2610 var.yres_virtual = var.yres; 2613 var.yres_virtual = var.yres;
2611 } 2614 }
2612 2615
2613 if (atyfb_check_var(&var, info)) { 2616 ret = atyfb_check_var(&var, info);
2617 if (ret) {
2614 PRINTKE("can't set default video mode\n"); 2618 PRINTKE("can't set default video mode\n");
2615 goto aty_init_exit; 2619 goto aty_init_exit;
2616 } 2620 }
@@ -2621,10 +2625,12 @@ static int __devinit aty_init(struct fb_info *info)
2621#endif /* CONFIG_FB_ATY_CT */ 2625#endif /* CONFIG_FB_ATY_CT */
2622 info->var = var; 2626 info->var = var;
2623 2627
2624 if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) 2628 ret = fb_alloc_cmap(&info->cmap, 256, 0);
2629 if (ret < 0)
2625 goto aty_init_exit; 2630 goto aty_init_exit;
2626 2631
2627 if (register_framebuffer(info) < 0) { 2632 ret = register_framebuffer(info);
2633 if (ret < 0) {
2628 fb_dealloc_cmap(&info->cmap); 2634 fb_dealloc_cmap(&info->cmap);
2629 goto aty_init_exit; 2635 goto aty_init_exit;
2630 } 2636 }
@@ -2650,7 +2656,7 @@ aty_init_exit:
2650 par->mtrr_aper = -1; 2656 par->mtrr_aper = -1;
2651 } 2657 }
2652#endif 2658#endif
2653 return -1; 2659 return ret;
2654} 2660}
2655 2661
2656static void aty_resume_chip(struct fb_info *info) 2662static void aty_resume_chip(struct fb_info *info)
@@ -2709,8 +2715,7 @@ static int atyfb_blank(int blank, struct fb_info *info)
2709 if (par->lock_blank || par->asleep) 2715 if (par->lock_blank || par->asleep)
2710 return 0; 2716 return 0;
2711 2717
2712#ifdef CONFIG_FB_ATY_BACKLIGHT 2718#ifdef CONFIG_FB_ATY_GENERIC_LCD
2713#elif defined(CONFIG_FB_ATY_GENERIC_LCD)
2714 if (par->lcd_table && blank > FB_BLANK_NORMAL && 2719 if (par->lcd_table && blank > FB_BLANK_NORMAL &&
2715 (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) { 2720 (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2716 u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par); 2721 u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
@@ -2739,8 +2744,7 @@ static int atyfb_blank(int blank, struct fb_info *info)
2739 } 2744 }
2740 aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par); 2745 aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par);
2741 2746
2742#ifdef CONFIG_FB_ATY_BACKLIGHT 2747#ifdef CONFIG_FB_ATY_GENERIC_LCD
2743#elif defined(CONFIG_FB_ATY_GENERIC_LCD)
2744 if (par->lcd_table && blank <= FB_BLANK_NORMAL && 2748 if (par->lcd_table && blank <= FB_BLANK_NORMAL &&
2745 (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) { 2749 (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2746 u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par); 2750 u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
@@ -3331,7 +3335,7 @@ static int __devinit init_from_bios(struct atyfb_par *par)
3331 PRINTKE("no BIOS frequency table found, use parameters\n"); 3335 PRINTKE("no BIOS frequency table found, use parameters\n");
3332 ret = -ENXIO; 3336 ret = -ENXIO;
3333 } 3337 }
3334 iounmap((void* __iomem )bios_base); 3338 iounmap((void __iomem *)bios_base);
3335 3339
3336 return ret; 3340 return ret;
3337} 3341}
@@ -3418,14 +3422,7 @@ static int __devinit atyfb_pci_probe(struct pci_dev *pdev, const struct pci_devi
3418 struct fb_info *info; 3422 struct fb_info *info;
3419 struct resource *rp; 3423 struct resource *rp;
3420 struct atyfb_par *par; 3424 struct atyfb_par *par;
3421 int i, rc = -ENOMEM; 3425 int rc = -ENOMEM;
3422
3423 for (i = ARRAY_SIZE(aty_chips) - 1; i >= 0; i--)
3424 if (pdev->device == aty_chips[i].pci_id)
3425 break;
3426
3427 if (i < 0)
3428 return -ENODEV;
3429 3426
3430 /* Enable device in PCI config */ 3427 /* Enable device in PCI config */
3431 if (pci_enable_device(pdev)) { 3428 if (pci_enable_device(pdev)) {
@@ -3456,7 +3453,7 @@ static int __devinit atyfb_pci_probe(struct pci_dev *pdev, const struct pci_devi
3456 par = info->par; 3453 par = info->par;
3457 info->fix = atyfb_fix; 3454 info->fix = atyfb_fix;
3458 info->device = &pdev->dev; 3455 info->device = &pdev->dev;
3459 par->pci_id = aty_chips[i].pci_id; 3456 par->pci_id = pdev->device;
3460 par->res_start = res_start; 3457 par->res_start = res_start;
3461 par->res_size = res_size; 3458 par->res_size = res_size;
3462 par->irq = pdev->irq; 3459 par->irq = pdev->irq;
@@ -3474,7 +3471,8 @@ static int __devinit atyfb_pci_probe(struct pci_dev *pdev, const struct pci_devi
3474 pci_set_drvdata(pdev, info); 3471 pci_set_drvdata(pdev, info);
3475 3472
3476 /* Init chip & register framebuffer */ 3473 /* Init chip & register framebuffer */
3477 if (aty_init(info)) 3474 rc = aty_init(info);
3475 if (rc)
3478 goto err_release_io; 3476 goto err_release_io;
3479 3477
3480#ifdef __sparc__ 3478#ifdef __sparc__
@@ -3655,18 +3653,62 @@ static void __devexit atyfb_pci_remove(struct pci_dev *pdev)
3655 atyfb_remove(info); 3653 atyfb_remove(info);
3656} 3654}
3657 3655
3658/*
3659 * This driver uses its own matching table. That will be more difficult
3660 * to fix, so for now, we just match against any ATI ID and let the
3661 * probe() function find out what's up. That also mean we don't have
3662 * a module ID table though.
3663 */
3664static struct pci_device_id atyfb_pci_tbl[] = { 3656static struct pci_device_id atyfb_pci_tbl[] = {
3665 { PCI_VENDOR_ID_ATI, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 3657#ifdef CONFIG_FB_ATY_GX
3666 PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0 }, 3658 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GX) },
3667 { 0, } 3659 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CX) },
3660#endif /* CONFIG_FB_ATY_GX */
3661
3662#ifdef CONFIG_FB_ATY_CT
3663 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CT) },
3664 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64ET) },
3665
3666 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LT) },
3667
3668 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VT) },
3669 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GT) },
3670
3671 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VU) },
3672 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GU) },
3673
3674 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LG) },
3675
3676 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VV) },
3677
3678 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GV) },
3679 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GW) },
3680 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GY) },
3681 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GZ) },
3682
3683 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GB) },
3684 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GD) },
3685 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GI) },
3686 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GP) },
3687 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GQ) },
3688
3689 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LB) },
3690 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LD) },
3691 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LI) },
3692 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LP) },
3693 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LQ) },
3694
3695 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GM) },
3696 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GN) },
3697 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GO) },
3698 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GL) },
3699 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GR) },
3700 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GS) },
3701
3702 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LM) },
3703 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LN) },
3704 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LR) },
3705 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LS) },
3706#endif /* CONFIG_FB_ATY_CT */
3707 { }
3668}; 3708};
3669 3709
3710MODULE_DEVICE_TABLE(pci, atyfb_pci_tbl);
3711
3670static struct pci_driver atyfb_driver = { 3712static struct pci_driver atyfb_driver = {
3671 .name = "atyfb", 3713 .name = "atyfb",
3672 .id_table = atyfb_pci_tbl, 3714 .id_table = atyfb_pci_tbl,
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c
index 400e9264e456..652273e9f5f9 100644
--- a/drivers/video/aty/radeon_base.c
+++ b/drivers/video/aty/radeon_base.c
@@ -2098,15 +2098,7 @@ static void radeon_identify_vram(struct radeonfb_info *rinfo)
2098 2098
2099static ssize_t radeon_show_one_edid(char *buf, loff_t off, size_t count, const u8 *edid) 2099static ssize_t radeon_show_one_edid(char *buf, loff_t off, size_t count, const u8 *edid)
2100{ 2100{
2101 if (off > EDID_LENGTH) 2101 return memory_read_from_buffer(buf, count, &off, edid, EDID_LENGTH);
2102 return 0;
2103
2104 if (off + count > EDID_LENGTH)
2105 count = EDID_LENGTH - off;
2106
2107 memcpy(buf, edid + off, count);
2108
2109 return count;
2110} 2102}
2111 2103
2112 2104
@@ -2161,6 +2153,7 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
2161 struct radeonfb_info *rinfo; 2153 struct radeonfb_info *rinfo;
2162 int ret; 2154 int ret;
2163 unsigned char c1, c2; 2155 unsigned char c1, c2;
2156 int err = 0;
2164 2157
2165 pr_debug("radeonfb_pci_register BEGIN\n"); 2158 pr_debug("radeonfb_pci_register BEGIN\n");
2166 2159
@@ -2340,9 +2333,14 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
2340 2333
2341 /* Register some sysfs stuff (should be done better) */ 2334 /* Register some sysfs stuff (should be done better) */
2342 if (rinfo->mon1_EDID) 2335 if (rinfo->mon1_EDID)
2343 sysfs_create_bin_file(&rinfo->pdev->dev.kobj, &edid1_attr); 2336 err |= sysfs_create_bin_file(&rinfo->pdev->dev.kobj,
2337 &edid1_attr);
2344 if (rinfo->mon2_EDID) 2338 if (rinfo->mon2_EDID)
2345 sysfs_create_bin_file(&rinfo->pdev->dev.kobj, &edid2_attr); 2339 err |= sysfs_create_bin_file(&rinfo->pdev->dev.kobj,
2340 &edid2_attr);
2341 if (err)
2342 pr_warning("%s() Creating sysfs files failed, continuing\n",
2343 __func__);
2346 2344
2347 /* save current mode regs before we switch into the new one 2345 /* save current mode regs before we switch into the new one
2348 * so we can restore this upon __exit 2346 * so we can restore this upon __exit
diff --git a/drivers/video/aty/radeonfb.h b/drivers/video/aty/radeonfb.h
index c347e38cd0b0..ccbfffd12805 100644
--- a/drivers/video/aty/radeonfb.h
+++ b/drivers/video/aty/radeonfb.h
@@ -289,7 +289,7 @@ struct radeonfb_info {
289 struct radeon_regs state; 289 struct radeon_regs state;
290 struct radeon_regs init_state; 290 struct radeon_regs init_state;
291 291
292 char name[DEVICE_NAME_SIZE]; 292 char name[50];
293 293
294 unsigned long mmio_base_phys; 294 unsigned long mmio_base_phys;
295 unsigned long fb_base_phys; 295 unsigned long fb_base_phys;
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 30bf7f2f1635..452b770d8cc9 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -36,6 +36,30 @@ config LCD_LTV350QV
36 36
37 The LTV350QV panel is present on all ATSTK1000 boards. 37 The LTV350QV panel is present on all ATSTK1000 boards.
38 38
39config LCD_ILI9320
40 tristate
41 depends on LCD_CLASS_DEVICE && BACKLIGHT_LCD_SUPPORT
42 default n
43 help
44 If you have a panel based on the ILI9320 controller chip
45 then say y to include a power driver for it.
46
47config LCD_VGG2432A4
48 tristate "VGG2432A4 LCM device support"
49 depends on BACKLIGHT_LCD_SUPPORT && LCD_CLASS_DEVICE && SPI_MASTER
50 select LCD_ILI9320
51 default n
52 help
53 If you have a VGG2432A4 panel based on the ILI9320 controller chip
54 then say y to include a power driver for it.
55
56config LCD_PLATFORM
57 tristate "Platform LCD controls"
58 depends on LCD_CLASS_DEVICE
59 help
60 This driver provides a platform-device registered LCD power
61 control interface.
62
39# 63#
40# Backlight 64# Backlight
41# 65#
@@ -63,6 +87,18 @@ config BACKLIGHT_ATMEL_LCDC
63 If in doubt, it's safe to enable this option; it doesn't kick 87 If in doubt, it's safe to enable this option; it doesn't kick
64 in unless the board's description says it's wired that way. 88 in unless the board's description says it's wired that way.
65 89
90config BACKLIGHT_ATMEL_PWM
91 tristate "Atmel PWM backlight control"
92 depends on BACKLIGHT_CLASS_DEVICE && ATMEL_PWM
93 default n
94 help
95 Say Y here if you want to use the PWM peripheral in Atmel AT91 and
96 AVR32 devices. This driver will need additional platform data to know
97 which PWM instance to use and how to configure it.
98
99 To compile this driver as a module, choose M here: the module will be
100 called atmel-pwm-bl.
101
66config BACKLIGHT_CORGI 102config BACKLIGHT_CORGI
67 tristate "Generic (aka Sharp Corgi) Backlight Driver" 103 tristate "Generic (aka Sharp Corgi) Backlight Driver"
68 depends on BACKLIGHT_CLASS_DEVICE 104 depends on BACKLIGHT_CLASS_DEVICE
@@ -119,3 +155,12 @@ config BACKLIGHT_PWM
119 help 155 help
120 If you have a LCD backlight adjustable by PWM, say Y to enable 156 If you have a LCD backlight adjustable by PWM, say Y to enable
121 this driver. 157 this driver.
158
159config BACKLIGHT_MBP_NVIDIA
160 tristate "MacBook Pro Nvidia Backlight Driver"
161 depends on BACKLIGHT_CLASS_DEVICE && X86
162 default n
163 help
164 If you have an Apple Macbook Pro with Nvidia graphics hardware say Y
165 to enable a driver for its backlight
166
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index b51a7cd12500..b405aace803f 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -1,9 +1,13 @@
1# Backlight & LCD drivers 1# Backlight & LCD drivers
2 2
3obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o 3obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o
4obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o 4obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o
5obj-$(CONFIG_LCD_ILI9320) += ili9320.o
6obj-$(CONFIG_LCD_PLATFORM) += platform_lcd.o
7obj-$(CONFIG_LCD_VGG2432A4) += vgg2432a4.o
5 8
6obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o 9obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
10obj-$(CONFIG_BACKLIGHT_ATMEL_PWM) += atmel-pwm-bl.o
7obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o 11obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o
8obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o 12obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
9obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o 13obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
@@ -11,3 +15,5 @@ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o
11obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o 15obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o
12obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o 16obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
13obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o 17obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o
18obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o
19
diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c
new file mode 100644
index 000000000000..505c0823a105
--- /dev/null
+++ b/drivers/video/backlight/atmel-pwm-bl.c
@@ -0,0 +1,244 @@
1/*
2 * Copyright (C) 2008 Atmel Corporation
3 *
4 * Backlight driver using Atmel PWM peripheral.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by
8 * the Free Software Foundation.
9 */
10#include <linux/init.h>
11#include <linux/kernel.h>
12#include <linux/module.h>
13#include <linux/platform_device.h>
14#include <linux/fb.h>
15#include <linux/clk.h>
16#include <linux/gpio.h>
17#include <linux/backlight.h>
18#include <linux/atmel_pwm.h>
19#include <linux/atmel-pwm-bl.h>
20
21struct atmel_pwm_bl {
22 const struct atmel_pwm_bl_platform_data *pdata;
23 struct backlight_device *bldev;
24 struct platform_device *pdev;
25 struct pwm_channel pwmc;
26 int gpio_on;
27};
28
29static int atmel_pwm_bl_set_intensity(struct backlight_device *bd)
30{
31 struct atmel_pwm_bl *pwmbl = bl_get_data(bd);
32 int intensity = bd->props.brightness;
33 int pwm_duty;
34
35 if (bd->props.power != FB_BLANK_UNBLANK)
36 intensity = 0;
37 if (bd->props.fb_blank != FB_BLANK_UNBLANK)
38 intensity = 0;
39
40 if (pwmbl->pdata->pwm_active_low)
41 pwm_duty = pwmbl->pdata->pwm_duty_min + intensity;
42 else
43 pwm_duty = pwmbl->pdata->pwm_duty_max - intensity;
44
45 if (pwm_duty > pwmbl->pdata->pwm_duty_max)
46 pwm_duty = pwmbl->pdata->pwm_duty_max;
47 if (pwm_duty < pwmbl->pdata->pwm_duty_min)
48 pwm_duty = pwmbl->pdata->pwm_duty_min;
49
50 if (!intensity) {
51 if (pwmbl->gpio_on != -1) {
52 gpio_set_value(pwmbl->gpio_on,
53 0 ^ pwmbl->pdata->on_active_low);
54 }
55 pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty);
56 pwm_channel_disable(&pwmbl->pwmc);
57 } else {
58 pwm_channel_enable(&pwmbl->pwmc);
59 pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty);
60 if (pwmbl->gpio_on != -1) {
61 gpio_set_value(pwmbl->gpio_on,
62 1 ^ pwmbl->pdata->on_active_low);
63 }
64 }
65
66 return 0;
67}
68
69static int atmel_pwm_bl_get_intensity(struct backlight_device *bd)
70{
71 struct atmel_pwm_bl *pwmbl = bl_get_data(bd);
72 u8 intensity;
73
74 if (pwmbl->pdata->pwm_active_low) {
75 intensity = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY) -
76 pwmbl->pdata->pwm_duty_min;
77 } else {
78 intensity = pwmbl->pdata->pwm_duty_max -
79 pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY);
80 }
81
82 return intensity;
83}
84
85static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl)
86{
87 unsigned long pwm_rate = pwmbl->pwmc.mck;
88 unsigned long prescale = DIV_ROUND_UP(pwm_rate,
89 (pwmbl->pdata->pwm_frequency *
90 pwmbl->pdata->pwm_compare_max)) - 1;
91
92 /*
93 * Prescale must be power of two and maximum 0xf in size because of
94 * hardware limit. PWM speed will be:
95 * PWM module clock speed / (2 ^ prescale).
96 */
97 prescale = fls(prescale);
98 if (prescale > 0xf)
99 prescale = 0xf;
100
101 pwm_channel_writel(&pwmbl->pwmc, PWM_CMR, prescale);
102 pwm_channel_writel(&pwmbl->pwmc, PWM_CDTY,
103 pwmbl->pdata->pwm_duty_min +
104 pwmbl->bldev->props.brightness);
105 pwm_channel_writel(&pwmbl->pwmc, PWM_CPRD,
106 pwmbl->pdata->pwm_compare_max);
107
108 dev_info(&pwmbl->pdev->dev, "Atmel PWM backlight driver "
109 "(%lu Hz)\n", pwmbl->pwmc.mck /
110 pwmbl->pdata->pwm_compare_max /
111 (1 << prescale));
112
113 return pwm_channel_enable(&pwmbl->pwmc);
114}
115
116static struct backlight_ops atmel_pwm_bl_ops = {
117 .get_brightness = atmel_pwm_bl_get_intensity,
118 .update_status = atmel_pwm_bl_set_intensity,
119};
120
121static int atmel_pwm_bl_probe(struct platform_device *pdev)
122{
123 const struct atmel_pwm_bl_platform_data *pdata;
124 struct backlight_device *bldev;
125 struct atmel_pwm_bl *pwmbl;
126 int retval;
127
128 pwmbl = kzalloc(sizeof(struct atmel_pwm_bl), GFP_KERNEL);
129 if (!pwmbl)
130 return -ENOMEM;
131
132 pwmbl->pdev = pdev;
133
134 pdata = pdev->dev.platform_data;
135 if (!pdata) {
136 retval = -ENODEV;
137 goto err_free_mem;
138 }
139
140 if (pdata->pwm_compare_max < pdata->pwm_duty_max ||
141 pdata->pwm_duty_min > pdata->pwm_duty_max ||
142 pdata->pwm_frequency == 0) {
143 retval = -EINVAL;
144 goto err_free_mem;
145 }
146
147 pwmbl->pdata = pdata;
148 pwmbl->gpio_on = pdata->gpio_on;
149
150 retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc);
151 if (retval)
152 goto err_free_mem;
153
154 if (pwmbl->gpio_on != -1) {
155 retval = gpio_request(pwmbl->gpio_on, "gpio_atmel_pwm_bl");
156 if (retval) {
157 pwmbl->gpio_on = -1;
158 goto err_free_pwm;
159 }
160
161 /* Turn display off by defatult. */
162 retval = gpio_direction_output(pwmbl->gpio_on,
163 0 ^ pdata->on_active_low);
164 if (retval)
165 goto err_free_gpio;
166 }
167
168 bldev = backlight_device_register("atmel-pwm-bl",
169 &pdev->dev, pwmbl, &atmel_pwm_bl_ops);
170 if (IS_ERR(bldev)) {
171 retval = PTR_ERR(bldev);
172 goto err_free_gpio;
173 }
174
175 pwmbl->bldev = bldev;
176
177 platform_set_drvdata(pdev, pwmbl);
178
179 /* Power up the backlight by default at middle intesity. */
180 bldev->props.power = FB_BLANK_UNBLANK;
181 bldev->props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min;
182 bldev->props.brightness = bldev->props.max_brightness / 2;
183
184 retval = atmel_pwm_bl_init_pwm(pwmbl);
185 if (retval)
186 goto err_free_bl_dev;
187
188 atmel_pwm_bl_set_intensity(bldev);
189
190 return 0;
191
192err_free_bl_dev:
193 platform_set_drvdata(pdev, NULL);
194 backlight_device_unregister(bldev);
195err_free_gpio:
196 if (pwmbl->gpio_on != -1)
197 gpio_free(pwmbl->gpio_on);
198err_free_pwm:
199 pwm_channel_free(&pwmbl->pwmc);
200err_free_mem:
201 kfree(pwmbl);
202 return retval;
203}
204
205static int __exit atmel_pwm_bl_remove(struct platform_device *pdev)
206{
207 struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev);
208
209 if (pwmbl->gpio_on != -1) {
210 gpio_set_value(pwmbl->gpio_on, 0);
211 gpio_free(pwmbl->gpio_on);
212 }
213 pwm_channel_disable(&pwmbl->pwmc);
214 pwm_channel_free(&pwmbl->pwmc);
215 backlight_device_unregister(pwmbl->bldev);
216 platform_set_drvdata(pdev, NULL);
217 kfree(pwmbl);
218
219 return 0;
220}
221
222static struct platform_driver atmel_pwm_bl_driver = {
223 .driver = {
224 .name = "atmel-pwm-bl",
225 },
226 /* REVISIT add suspend() and resume() */
227 .remove = __exit_p(atmel_pwm_bl_remove),
228};
229
230static int __init atmel_pwm_bl_init(void)
231{
232 return platform_driver_probe(&atmel_pwm_bl_driver, atmel_pwm_bl_probe);
233}
234module_init(atmel_pwm_bl_init);
235
236static void __exit atmel_pwm_bl_exit(void)
237{
238 platform_driver_unregister(&atmel_pwm_bl_driver);
239}
240module_exit(atmel_pwm_bl_exit);
241
242MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>");
243MODULE_DESCRIPTION("Atmel PWM backlight driver");
244MODULE_LICENSE("GPL");
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index 39394757679c..fab0bc874b58 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -191,6 +191,7 @@ static struct device_attribute bl_device_attributes[] = {
191 * backlight_device class. 191 * backlight_device class.
192 * @name: the name of the new object(must be the same as the name of the 192 * @name: the name of the new object(must be the same as the name of the
193 * respective framebuffer device). 193 * respective framebuffer device).
194 * @parent: a pointer to the parent device
194 * @devdata: an optional pointer to be stored for private driver use. The 195 * @devdata: an optional pointer to be stored for private driver use. The
195 * methods may retrieve it by using bl_get_data(bd). 196 * methods may retrieve it by using bl_get_data(bd).
196 * @ops: the backlight operations structure. 197 * @ops: the backlight operations structure.
diff --git a/drivers/video/backlight/ili9320.c b/drivers/video/backlight/ili9320.c
new file mode 100644
index 000000000000..ba89b41b639c
--- /dev/null
+++ b/drivers/video/backlight/ili9320.c
@@ -0,0 +1,330 @@
1/* drivers/video/backlight/ili9320.c
2 *
3 * ILI9320 LCD controller driver core.
4 *
5 * Copyright 2007 Simtec Electronics
6 * http://armlinux.simtec.co.uk/
7 * Ben Dooks <ben@simtec.co.uk>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12*/
13
14#include <linux/delay.h>
15#include <linux/err.h>
16#include <linux/fb.h>
17#include <linux/init.h>
18#include <linux/lcd.h>
19#include <linux/module.h>
20
21#include <linux/spi/spi.h>
22
23#include <video/ili9320.h>
24
25#include "ili9320.h"
26
27
28static inline int ili9320_write_spi(struct ili9320 *ili,
29 unsigned int reg,
30 unsigned int value)
31{
32 struct ili9320_spi *spi = &ili->access.spi;
33 unsigned char *addr = spi->buffer_addr;
34 unsigned char *data = spi->buffer_data;
35
36 /* spi message consits of:
37 * first byte: ID and operation
38 */
39
40 addr[0] = spi->id | ILI9320_SPI_INDEX | ILI9320_SPI_WRITE;
41 addr[1] = reg >> 8;
42 addr[2] = reg;
43
44 /* second message is the data to transfer */
45
46 data[0] = spi->id | ILI9320_SPI_DATA | ILI9320_SPI_WRITE;
47 data[1] = value >> 8;
48 data[2] = value;
49
50 return spi_sync(spi->dev, &spi->message);
51}
52
53int ili9320_write(struct ili9320 *ili, unsigned int reg, unsigned int value)
54{
55 dev_dbg(ili->dev, "write: reg=%02x, val=%04x\n", reg, value);
56 return ili->write(ili, reg, value);
57}
58
59EXPORT_SYMBOL_GPL(ili9320_write);
60
61int ili9320_write_regs(struct ili9320 *ili,
62 struct ili9320_reg *values,
63 int nr_values)
64{
65 int index;
66 int ret;
67
68 for (index = 0; index < nr_values; index++, values++) {
69 ret = ili9320_write(ili, values->address, values->value);
70 if (ret != 0)
71 return ret;
72 }
73
74 return 0;
75}
76
77EXPORT_SYMBOL_GPL(ili9320_write_regs);
78
79static void ili9320_reset(struct ili9320 *lcd)
80{
81 struct ili9320_platdata *cfg = lcd->platdata;
82
83 cfg->reset(1);
84 mdelay(50);
85
86 cfg->reset(0);
87 mdelay(50);
88
89 cfg->reset(1);
90 mdelay(100);
91}
92
93static inline int ili9320_init_chip(struct ili9320 *lcd)
94{
95 int ret;
96
97 ili9320_reset(lcd);
98
99 ret = lcd->client->init(lcd, lcd->platdata);
100 if (ret != 0) {
101 dev_err(lcd->dev, "failed to initialise display\n");
102 return ret;
103 }
104
105 lcd->initialised = 1;
106 return 0;
107}
108
109static inline int ili9320_power_on(struct ili9320 *lcd)
110{
111 if (!lcd->initialised)
112 ili9320_init_chip(lcd);
113
114 lcd->display1 |= (ILI9320_DISPLAY1_D(3) | ILI9320_DISPLAY1_BASEE);
115 ili9320_write(lcd, ILI9320_DISPLAY1, lcd->display1);
116
117 return 0;
118}
119
120static inline int ili9320_power_off(struct ili9320 *lcd)
121{
122 lcd->display1 &= ~(ILI9320_DISPLAY1_D(3) | ILI9320_DISPLAY1_BASEE);
123 ili9320_write(lcd, ILI9320_DISPLAY1, lcd->display1);
124
125 return 0;
126}
127
128#define POWER_IS_ON(pwr) ((pwr) <= FB_BLANK_NORMAL)
129
130static int ili9320_power(struct ili9320 *lcd, int power)
131{
132 int ret = 0;
133
134 dev_dbg(lcd->dev, "power %d => %d\n", lcd->power, power);
135
136 if (POWER_IS_ON(power) && !POWER_IS_ON(lcd->power))
137 ret = ili9320_power_on(lcd);
138 else if (!POWER_IS_ON(power) && POWER_IS_ON(lcd->power))
139 ret = ili9320_power_off(lcd);
140
141 if (ret == 0)
142 lcd->power = power;
143 else
144 dev_warn(lcd->dev, "failed to set power mode %d\n", power);
145
146 return ret;
147}
148
149static inline struct ili9320 *to_our_lcd(struct lcd_device *lcd)
150{
151 return lcd_get_data(lcd);
152}
153
154static int ili9320_set_power(struct lcd_device *ld, int power)
155{
156 struct ili9320 *lcd = to_our_lcd(ld);
157
158 return ili9320_power(lcd, power);
159}
160
161static int ili9320_get_power(struct lcd_device *ld)
162{
163 struct ili9320 *lcd = to_our_lcd(ld);
164
165 return lcd->power;
166}
167
168static struct lcd_ops ili9320_ops = {
169 .get_power = ili9320_get_power,
170 .set_power = ili9320_set_power,
171};
172
173static void __devinit ili9320_setup_spi(struct ili9320 *ili,
174 struct spi_device *dev)
175{
176 struct ili9320_spi *spi = &ili->access.spi;
177
178 ili->write = ili9320_write_spi;
179 spi->dev = dev;
180
181 /* fill the two messages we are going to use to send the data
182 * with, the first the address followed by the data. The datasheet
183 * says they should be done as two distinct cycles of the SPI CS line.
184 */
185
186 spi->xfer[0].tx_buf = spi->buffer_addr;
187 spi->xfer[1].tx_buf = spi->buffer_data;
188 spi->xfer[0].len = 3;
189 spi->xfer[1].len = 3;
190 spi->xfer[0].bits_per_word = 8;
191 spi->xfer[1].bits_per_word = 8;
192 spi->xfer[0].cs_change = 1;
193
194 spi_message_init(&spi->message);
195 spi_message_add_tail(&spi->xfer[0], &spi->message);
196 spi_message_add_tail(&spi->xfer[1], &spi->message);
197}
198
199int __devinit ili9320_probe_spi(struct spi_device *spi,
200 struct ili9320_client *client)
201{
202 struct ili9320_platdata *cfg = spi->dev.platform_data;
203 struct device *dev = &spi->dev;
204 struct ili9320 *ili;
205 struct lcd_device *lcd;
206 int ret = 0;
207
208 /* verify we where given some information */
209
210 if (cfg == NULL) {
211 dev_err(dev, "no platform data supplied\n");
212 return -EINVAL;
213 }
214
215 if (cfg->hsize <= 0 || cfg->vsize <= 0 || cfg->reset == NULL) {
216 dev_err(dev, "invalid platform data supplied\n");
217 return -EINVAL;
218 }
219
220 /* allocate and initialse our state */
221
222 ili = kzalloc(sizeof(struct ili9320), GFP_KERNEL);
223 if (ili == NULL) {
224 dev_err(dev, "no memory for device\n");
225 return -ENOMEM;
226 }
227
228 ili->access.spi.id = ILI9320_SPI_IDCODE | ILI9320_SPI_ID(1);
229
230 ili->dev = dev;
231 ili->client = client;
232 ili->power = FB_BLANK_POWERDOWN;
233 ili->platdata = cfg;
234
235 dev_set_drvdata(&spi->dev, ili);
236
237 ili9320_setup_spi(ili, spi);
238
239 lcd = lcd_device_register("ili9320", dev, ili, &ili9320_ops);
240 if (IS_ERR(lcd)) {
241 dev_err(dev, "failed to register lcd device\n");
242 ret = PTR_ERR(lcd);
243 goto err_free;
244 }
245
246 ili->lcd = lcd;
247
248 dev_info(dev, "initialising %s\n", client->name);
249
250 ret = ili9320_power(ili, FB_BLANK_UNBLANK);
251 if (ret != 0) {
252 dev_err(dev, "failed to set lcd power state\n");
253 goto err_unregister;
254 }
255
256 return 0;
257
258 err_unregister:
259 lcd_device_unregister(lcd);
260
261 err_free:
262 kfree(ili);
263
264 return ret;
265}
266
267EXPORT_SYMBOL_GPL(ili9320_probe_spi);
268
269int __devexit ili9320_remove(struct ili9320 *ili)
270{
271 ili9320_power(ili, FB_BLANK_POWERDOWN);
272
273 lcd_device_unregister(ili->lcd);
274 kfree(ili);
275
276 return 0;
277}
278
279EXPORT_SYMBOL_GPL(ili9320_remove);
280
281#ifdef CONFIG_PM
282int ili9320_suspend(struct ili9320 *lcd, pm_message_t state)
283{
284 int ret;
285
286 dev_dbg(lcd->dev, "%s: event %d\n", __func__, state.event);
287
288 if (state.event == PM_EVENT_SUSPEND) {
289 ret = ili9320_power(lcd, FB_BLANK_POWERDOWN);
290
291 if (lcd->platdata->suspend == ILI9320_SUSPEND_DEEP) {
292 ili9320_write(lcd, ILI9320_POWER1, lcd->power1 |
293 ILI9320_POWER1_SLP |
294 ILI9320_POWER1_DSTB);
295 lcd->initialised = 0;
296 }
297
298 return ret;
299 }
300
301 return 0;
302}
303
304EXPORT_SYMBOL_GPL(ili9320_suspend);
305
306int ili9320_resume(struct ili9320 *lcd)
307{
308 dev_info(lcd->dev, "resuming from power state %d\n", lcd->power);
309
310 if (lcd->platdata->suspend == ILI9320_SUSPEND_DEEP) {
311 ili9320_write(lcd, ILI9320_POWER1, 0x00);
312 }
313
314 return ili9320_power(lcd, FB_BLANK_UNBLANK);
315}
316
317EXPORT_SYMBOL_GPL(ili9320_resume);
318#endif
319
320/* Power down all displays on reboot, poweroff or halt */
321void ili9320_shutdown(struct ili9320 *lcd)
322{
323 ili9320_power(lcd, FB_BLANK_POWERDOWN);
324}
325
326EXPORT_SYMBOL_GPL(ili9320_shutdown);
327
328MODULE_AUTHOR("Ben Dooks <ben-linux@fluff.org>");
329MODULE_DESCRIPTION("ILI9320 LCD Driver");
330MODULE_LICENSE("GPL v2");
diff --git a/drivers/video/backlight/ili9320.h b/drivers/video/backlight/ili9320.h
new file mode 100644
index 000000000000..e388eca7cac5
--- /dev/null
+++ b/drivers/video/backlight/ili9320.h
@@ -0,0 +1,80 @@
1/* drivers/video/backlight/ili9320.h
2 *
3 * ILI9320 LCD controller driver core.
4 *
5 * Copyright 2007 Simtec Electronics
6 * Ben Dooks <ben@simtec.co.uk>
7 *
8 * http://armlinux.simtec.co.uk/
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13*/
14
15/* Holder for register and value pairs. */
16struct ili9320_reg {
17 unsigned short address;
18 unsigned short value;
19};
20
21struct ili9320;
22
23struct ili9320_client {
24 const char *name;
25 int (*init)(struct ili9320 *ili, struct ili9320_platdata *cfg);
26
27};
28/* Device attached via an SPI bus. */
29struct ili9320_spi {
30 struct spi_device *dev;
31 struct spi_message message;
32 struct spi_transfer xfer[2];
33
34 unsigned char id;
35 unsigned char buffer_addr[4];
36 unsigned char buffer_data[4];
37};
38
39/* ILI9320 device state. */
40struct ili9320 {
41 union {
42 struct ili9320_spi spi; /* SPI attachged device. */
43 } access; /* Register access method. */
44
45 struct device *dev;
46 struct lcd_device *lcd; /* LCD device we created. */
47 struct ili9320_client *client;
48 struct ili9320_platdata *platdata;
49
50 int power; /* current power state. */
51 int initialised;
52
53 unsigned short display1;
54 unsigned short power1;
55
56 int (*write)(struct ili9320 *ili, unsigned int reg, unsigned int val);
57};
58
59
60/* ILI9320 register access routines */
61
62extern int ili9320_write(struct ili9320 *ili,
63 unsigned int reg, unsigned int value);
64
65extern int ili9320_write_regs(struct ili9320 *ili,
66 struct ili9320_reg *values,
67 int nr_values);
68
69/* Device probe */
70
71extern int ili9320_probe_spi(struct spi_device *spi,
72 struct ili9320_client *cli);
73
74extern int ili9320_remove(struct ili9320 *lcd);
75extern void ili9320_shutdown(struct ili9320 *lcd);
76
77/* PM */
78
79extern int ili9320_suspend(struct ili9320 *lcd, pm_message_t state);
80extern int ili9320_resume(struct ili9320 *lcd);
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c
index 299fd318dd45..b15b2b84a6f7 100644
--- a/drivers/video/backlight/lcd.c
+++ b/drivers/video/backlight/lcd.c
@@ -33,7 +33,7 @@ static int fb_notifier_callback(struct notifier_block *self,
33 ld = container_of(self, struct lcd_device, fb_notif); 33 ld = container_of(self, struct lcd_device, fb_notif);
34 mutex_lock(&ld->ops_lock); 34 mutex_lock(&ld->ops_lock);
35 if (ld->ops) 35 if (ld->ops)
36 if (!ld->ops->check_fb || ld->ops->check_fb(evdata->info)) 36 if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info))
37 ld->ops->set_power(ld, *(int *)evdata->data); 37 ld->ops->set_power(ld, *(int *)evdata->data);
38 mutex_unlock(&ld->ops_lock); 38 mutex_unlock(&ld->ops_lock);
39 return 0; 39 return 0;
diff --git a/drivers/video/backlight/mbp_nvidia_bl.c b/drivers/video/backlight/mbp_nvidia_bl.c
new file mode 100644
index 000000000000..385cba40ea87
--- /dev/null
+++ b/drivers/video/backlight/mbp_nvidia_bl.c
@@ -0,0 +1,116 @@
1/*
2 * Backlight Driver for Nvidia 8600 in Macbook Pro
3 *
4 * Copyright (c) Red Hat <mjg@redhat.com>
5 * Based on code from Pommed:
6 * Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
7 * Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
8 * Copyright (C) 2007 Julien BLACHE <jb@jblache.org>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 * This driver triggers SMIs which cause the firmware to change the
15 * backlight brightness. This is icky in many ways, but it's impractical to
16 * get at the firmware code in order to figure out what it's actually doing.
17 */
18
19#include <linux/module.h>
20#include <linux/kernel.h>
21#include <linux/init.h>
22#include <linux/platform_device.h>
23#include <linux/backlight.h>
24#include <linux/err.h>
25#include <linux/dmi.h>
26#include <linux/io.h>
27
28static struct backlight_device *mbp_backlight_device;
29
30static struct dmi_system_id __initdata mbp_device_table[] = {
31 {
32 .ident = "3,1",
33 .matches = {
34 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
35 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
36 },
37 },
38 {
39 .ident = "3,2",
40 .matches = {
41 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
42 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"),
43 },
44 },
45 {
46 .ident = "4,1",
47 .matches = {
48 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
49 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"),
50 },
51 },
52 { }
53};
54
55static int mbp_send_intensity(struct backlight_device *bd)
56{
57 int intensity = bd->props.brightness;
58
59 outb(0x04 | (intensity << 4), 0xb3);
60 outb(0xbf, 0xb2);
61
62 return 0;
63}
64
65static int mbp_get_intensity(struct backlight_device *bd)
66{
67 outb(0x03, 0xb3);
68 outb(0xbf, 0xb2);
69 return inb(0xb3) >> 4;
70}
71
72static struct backlight_ops mbp_ops = {
73 .get_brightness = mbp_get_intensity,
74 .update_status = mbp_send_intensity,
75};
76
77static int __init mbp_init(void)
78{
79 if (!dmi_check_system(mbp_device_table))
80 return -ENODEV;
81
82 if (!request_region(0xb2, 2, "Macbook Pro backlight"))
83 return -ENXIO;
84
85 mbp_backlight_device = backlight_device_register("mbp_backlight",
86 NULL, NULL,
87 &mbp_ops);
88 if (IS_ERR(mbp_backlight_device)) {
89 release_region(0xb2, 2);
90 return PTR_ERR(mbp_backlight_device);
91 }
92
93 mbp_backlight_device->props.max_brightness = 15;
94 mbp_backlight_device->props.brightness =
95 mbp_get_intensity(mbp_backlight_device);
96 backlight_update_status(mbp_backlight_device);
97
98 return 0;
99}
100
101static void __exit mbp_exit(void)
102{
103 backlight_device_unregister(mbp_backlight_device);
104
105 release_region(0xb2, 2);
106}
107
108module_init(mbp_init);
109module_exit(mbp_exit);
110
111MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
112MODULE_DESCRIPTION("Nvidia-based Macbook Pro Backlight Driver");
113MODULE_LICENSE("GPL");
114MODULE_ALIAS("svnAppleInc.:pnMacBookPro3,1");
115MODULE_ALIAS("svnAppleInc.:pnMacBookPro3,2");
116MODULE_ALIAS("svnAppleInc.:pnMacBookPro4,1");
diff --git a/drivers/video/backlight/platform_lcd.c b/drivers/video/backlight/platform_lcd.c
new file mode 100644
index 000000000000..72d44dbfce82
--- /dev/null
+++ b/drivers/video/backlight/platform_lcd.c
@@ -0,0 +1,172 @@
1/* drivers/video/backlight/platform_lcd.c
2 *
3 * Copyright 2008 Simtec Electronics
4 * Ben Dooks <ben@simtec.co.uk>
5 *
6 * Generic platform-device LCD power control interface.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12*/
13
14#include <linux/module.h>
15#include <linux/platform_device.h>
16#include <linux/fb.h>
17#include <linux/backlight.h>
18#include <linux/lcd.h>
19
20#include <video/platform_lcd.h>
21
22struct platform_lcd {
23 struct device *us;
24 struct lcd_device *lcd;
25 struct plat_lcd_data *pdata;
26
27 unsigned int power;
28 unsigned int suspended : 1;
29};
30
31static inline struct platform_lcd *to_our_lcd(struct lcd_device *lcd)
32{
33 return lcd_get_data(lcd);
34}
35
36static int platform_lcd_get_power(struct lcd_device *lcd)
37{
38 struct platform_lcd *plcd = to_our_lcd(lcd);
39
40 return plcd->power;
41}
42
43static int platform_lcd_set_power(struct lcd_device *lcd, int power)
44{
45 struct platform_lcd *plcd = to_our_lcd(lcd);
46 int lcd_power = 1;
47
48 if (power == FB_BLANK_POWERDOWN || plcd->suspended)
49 lcd_power = 0;
50
51 plcd->pdata->set_power(plcd->pdata, lcd_power);
52 plcd->power = power;
53
54 return 0;
55}
56
57static int platform_lcd_match(struct lcd_device *lcd, struct fb_info *info)
58{
59 struct platform_lcd *plcd = to_our_lcd(lcd);
60 struct plat_lcd_data *pdata = plcd->pdata;
61
62 if (pdata->match_fb)
63 return pdata->match_fb(pdata, info);
64
65 return plcd->us->parent == info->device;
66}
67
68static struct lcd_ops platform_lcd_ops = {
69 .get_power = platform_lcd_get_power,
70 .set_power = platform_lcd_set_power,
71 .check_fb = platform_lcd_match,
72};
73
74static int __devinit platform_lcd_probe(struct platform_device *pdev)
75{
76 struct plat_lcd_data *pdata;
77 struct platform_lcd *plcd;
78 struct device *dev = &pdev->dev;
79 int err;
80
81 pdata = pdev->dev.platform_data;
82 if (!pdata) {
83 dev_err(dev, "no platform data supplied\n");
84 return -EINVAL;
85 }
86
87 plcd = kzalloc(sizeof(struct platform_lcd), GFP_KERNEL);
88 if (!plcd) {
89 dev_err(dev, "no memory for state\n");
90 return -ENOMEM;
91 }
92
93 plcd->us = dev;
94 plcd->pdata = pdata;
95 plcd->lcd = lcd_device_register("platform-lcd", dev,
96 plcd, &platform_lcd_ops);
97 if (IS_ERR(plcd->lcd)) {
98 dev_err(dev, "cannot register lcd device\n");
99 err = PTR_ERR(plcd->lcd);
100 goto err_mem;
101 }
102
103 platform_set_drvdata(pdev, plcd);
104 return 0;
105
106 err_mem:
107 kfree(plcd);
108 return err;
109}
110
111static int __devexit platform_lcd_remove(struct platform_device *pdev)
112{
113 struct platform_lcd *plcd = platform_get_drvdata(pdev);
114
115 lcd_device_unregister(plcd->lcd);
116 kfree(plcd);
117
118 return 0;
119}
120
121#ifdef CONFIG_PM
122static int platform_lcd_suspend(struct platform_device *pdev, pm_message_t st)
123{
124 struct platform_lcd *plcd = platform_get_drvdata(pdev);
125
126 plcd->suspended = 1;
127 platform_lcd_set_power(plcd->lcd, plcd->power);
128
129 return 0;
130}
131
132static int platform_lcd_resume(struct platform_device *pdev)
133{
134 struct platform_lcd *plcd = platform_get_drvdata(pdev);
135
136 plcd->suspended = 0;
137 platform_lcd_set_power(plcd->lcd, plcd->power);
138
139 return 0;
140}
141#else
142#define platform_lcd_suspend NULL
143#define platform_lcd_resume NULL
144#endif
145
146static struct platform_driver platform_lcd_driver = {
147 .driver = {
148 .name = "platform-lcd",
149 .owner = THIS_MODULE,
150 },
151 .probe = platform_lcd_probe,
152 .remove = __devexit_p(platform_lcd_remove),
153 .suspend = platform_lcd_suspend,
154 .resume = platform_lcd_resume,
155};
156
157static int __init platform_lcd_init(void)
158{
159 return platform_driver_register(&platform_lcd_driver);
160}
161
162static void __exit platform_lcd_cleanup(void)
163{
164 platform_driver_unregister(&platform_lcd_driver);
165}
166
167module_init(platform_lcd_init);
168module_exit(platform_lcd_cleanup);
169
170MODULE_AUTHOR("Ben Dooks <ben-linux@fluff.org>");
171MODULE_LICENSE("GPL v2");
172MODULE_ALIAS("platform:platform-lcd");
diff --git a/drivers/video/backlight/vgg2432a4.c b/drivers/video/backlight/vgg2432a4.c
new file mode 100644
index 000000000000..593c7687d54a
--- /dev/null
+++ b/drivers/video/backlight/vgg2432a4.c
@@ -0,0 +1,284 @@
1/* drivers/video/backlight/vgg2432a4.c
2 *
3 * VGG2432A4 (ILI9320) LCD controller driver.
4 *
5 * Copyright 2007 Simtec Electronics
6 * http://armlinux.simtec.co.uk/
7 * Ben Dooks <ben@simtec.co.uk>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12*/
13
14#include <linux/delay.h>
15#include <linux/err.h>
16#include <linux/fb.h>
17#include <linux/init.h>
18#include <linux/lcd.h>
19#include <linux/module.h>
20
21#include <linux/spi/spi.h>
22
23#include <video/ili9320.h>
24
25#include "ili9320.h"
26
27/* Device initialisation sequences */
28
29static struct ili9320_reg vgg_init1[] = {
30 {
31 .address = ILI9320_POWER1,
32 .value = ILI9320_POWER1_AP(0) | ILI9320_POWER1_BT(0),
33 }, {
34 .address = ILI9320_POWER2,
35 .value = (ILI9320_POWER2_VC(7) |
36 ILI9320_POWER2_DC0(0) | ILI9320_POWER2_DC1(0)),
37 }, {
38 .address = ILI9320_POWER3,
39 .value = ILI9320_POWER3_VRH(0),
40 }, {
41 .address = ILI9320_POWER4,
42 .value = ILI9320_POWER4_VREOUT(0),
43 },
44};
45
46static struct ili9320_reg vgg_init2[] = {
47 {
48 .address = ILI9320_POWER1,
49 .value = (ILI9320_POWER1_AP(3) | ILI9320_POWER1_APE |
50 ILI9320_POWER1_BT(7) | ILI9320_POWER1_SAP),
51 }, {
52 .address = ILI9320_POWER2,
53 .value = ILI9320_POWER2_VC(7) | ILI9320_POWER2_DC0(3),
54 }
55};
56
57static struct ili9320_reg vgg_gamma[] = {
58 {
59 .address = ILI9320_GAMMA1,
60 .value = 0x0000,
61 }, {
62 .address = ILI9320_GAMMA2,
63 .value = 0x0505,
64 }, {
65 .address = ILI9320_GAMMA3,
66 .value = 0x0004,
67 }, {
68 .address = ILI9320_GAMMA4,
69 .value = 0x0006,
70 }, {
71 .address = ILI9320_GAMMA5,
72 .value = 0x0707,
73 }, {
74 .address = ILI9320_GAMMA6,
75 .value = 0x0105,
76 }, {
77 .address = ILI9320_GAMMA7,
78 .value = 0x0002,
79 }, {
80 .address = ILI9320_GAMMA8,
81 .value = 0x0707,
82 }, {
83 .address = ILI9320_GAMMA9,
84 .value = 0x0704,
85 }, {
86 .address = ILI9320_GAMMA10,
87 .value = 0x807,
88 }
89
90};
91
92static struct ili9320_reg vgg_init0[] = {
93 [0] = {
94 /* set direction and scan mode gate */
95 .address = ILI9320_DRIVER,
96 .value = ILI9320_DRIVER_SS,
97 }, {
98 .address = ILI9320_DRIVEWAVE,
99 .value = (ILI9320_DRIVEWAVE_MUSTSET |
100 ILI9320_DRIVEWAVE_EOR | ILI9320_DRIVEWAVE_BC),
101 }, {
102 .address = ILI9320_ENTRYMODE,
103 .value = ILI9320_ENTRYMODE_ID(3) | ILI9320_ENTRYMODE_BGR,
104 }, {
105 .address = ILI9320_RESIZING,
106 .value = 0x0,
107 },
108};
109
110
111static int vgg2432a4_lcd_init(struct ili9320 *lcd,
112 struct ili9320_platdata *cfg)
113{
114 unsigned int addr;
115 int ret;
116
117 /* Set VCore before anything else (VGG243237-6UFLWA) */
118 ret = ili9320_write(lcd, 0x00e5, 0x8000);
119 if (ret)
120 goto err_initial;
121
122 /* Start the oscillator up before we can do anything else. */
123 ret = ili9320_write(lcd, ILI9320_OSCILATION, ILI9320_OSCILATION_OSC);
124 if (ret)
125 goto err_initial;
126
127 /* must wait at-lesat 10ms after starting */
128 mdelay(15);
129
130 ret = ili9320_write_regs(lcd, vgg_init0, ARRAY_SIZE(vgg_init0));
131 if (ret != 0)
132 goto err_initial;
133
134 ili9320_write(lcd, ILI9320_DISPLAY2, cfg->display2);
135 ili9320_write(lcd, ILI9320_DISPLAY3, cfg->display3);
136 ili9320_write(lcd, ILI9320_DISPLAY4, cfg->display4);
137
138 ili9320_write(lcd, ILI9320_RGB_IF1, cfg->rgb_if1);
139 ili9320_write(lcd, ILI9320_FRAMEMAKER, 0x0);
140 ili9320_write(lcd, ILI9320_RGB_IF2, ILI9320_RGBIF2_DPL);
141
142 ret = ili9320_write_regs(lcd, vgg_init1, ARRAY_SIZE(vgg_init1));
143 if (ret != 0)
144 goto err_vgg;
145
146 mdelay(300);
147
148 ret = ili9320_write_regs(lcd, vgg_init2, ARRAY_SIZE(vgg_init2));
149 if (ret != 0)
150 goto err_vgg2;
151
152 mdelay(100);
153
154 ili9320_write(lcd, ILI9320_POWER3, 0x13c);
155
156 mdelay(100);
157
158 ili9320_write(lcd, ILI9320_POWER4, 0x1c00);
159 ili9320_write(lcd, ILI9320_POWER7, 0x000e);
160
161 mdelay(100);
162
163 ili9320_write(lcd, ILI9320_GRAM_HORIZ_ADDR, 0x00);
164 ili9320_write(lcd, ILI9320_GRAM_VERT_ADD, 0x00);
165
166 ret = ili9320_write_regs(lcd, vgg_gamma, ARRAY_SIZE(vgg_gamma));
167 if (ret != 0)
168 goto err_vgg3;
169
170 ili9320_write(lcd, ILI9320_HORIZ_START, 0x0);
171 ili9320_write(lcd, ILI9320_HORIZ_END, cfg->hsize - 1);
172 ili9320_write(lcd, ILI9320_VERT_START, 0x0);
173 ili9320_write(lcd, ILI9320_VERT_END, cfg->vsize - 1);
174
175 ili9320_write(lcd, ILI9320_DRIVER2,
176 ILI9320_DRIVER2_NL(((cfg->vsize - 240) / 8) + 0x1D));
177
178 ili9320_write(lcd, ILI9320_BASE_IMAGE, 0x1);
179 ili9320_write(lcd, ILI9320_VERT_SCROLL, 0x00);
180
181 for (addr = ILI9320_PARTIAL1_POSITION; addr <= ILI9320_PARTIAL2_END;
182 addr++) {
183 ili9320_write(lcd, addr, 0x0);
184 }
185
186 ili9320_write(lcd, ILI9320_INTERFACE1, 0x10);
187 ili9320_write(lcd, ILI9320_INTERFACE2, cfg->interface2);
188 ili9320_write(lcd, ILI9320_INTERFACE3, cfg->interface3);
189 ili9320_write(lcd, ILI9320_INTERFACE4, cfg->interface4);
190 ili9320_write(lcd, ILI9320_INTERFACE5, cfg->interface5);
191 ili9320_write(lcd, ILI9320_INTERFACE6, cfg->interface6);
192
193 lcd->display1 = (ILI9320_DISPLAY1_D(3) | ILI9320_DISPLAY1_DTE |
194 ILI9320_DISPLAY1_GON | ILI9320_DISPLAY1_BASEE |
195 0x40);
196
197 ili9320_write(lcd, ILI9320_DISPLAY1, lcd->display1);
198
199 return 0;
200
201 err_vgg3:
202 err_vgg2:
203 err_vgg:
204 err_initial:
205 return ret;
206}
207
208#ifdef CONFIG_PM
209static int vgg2432a4_suspend(struct spi_device *spi, pm_message_t state)
210{
211 return ili9320_suspend(dev_get_drvdata(&spi->dev), state);
212}
213
214static int vgg2432a4_resume(struct spi_device *spi)
215{
216 return ili9320_resume(dev_get_drvdata(&spi->dev));
217}
218#else
219#define vgg2432a4_suspend NULL
220#define vgg2432a4_resume NULL
221#endif
222
223static struct ili9320_client vgg2432a4_client = {
224 .name = "VGG2432A4",
225 .init = vgg2432a4_lcd_init,
226};
227
228/* Device probe */
229
230static int __devinit vgg2432a4_probe(struct spi_device *spi)
231{
232 int ret;
233
234 ret = ili9320_probe_spi(spi, &vgg2432a4_client);
235 if (ret != 0) {
236 dev_err(&spi->dev, "failed to initialise ili9320\n");
237 return ret;
238 }
239
240 return 0;
241}
242
243static int __devexit vgg2432a4_remove(struct spi_device *spi)
244{
245 return ili9320_remove(dev_get_drvdata(&spi->dev));
246}
247
248static void vgg2432a4_shutdown(struct spi_device *spi)
249{
250 ili9320_shutdown(dev_get_drvdata(&spi->dev));
251}
252
253static struct spi_driver vgg2432a4_driver = {
254 .driver = {
255 .name = "VGG2432A4",
256 .owner = THIS_MODULE,
257 },
258 .probe = vgg2432a4_probe,
259 .remove = __devexit_p(vgg2432a4_remove),
260 .shutdown = vgg2432a4_shutdown,
261 .suspend = vgg2432a4_suspend,
262 .resume = vgg2432a4_resume,
263};
264
265/* Device driver initialisation */
266
267static int __init vgg2432a4_init(void)
268{
269 return spi_register_driver(&vgg2432a4_driver);
270}
271
272static void __exit vgg2432a4_exit(void)
273{
274 spi_unregister_driver(&vgg2432a4_driver);
275}
276
277module_init(vgg2432a4_init);
278module_exit(vgg2432a4_exit);
279
280MODULE_AUTHOR("Ben Dooks <ben-linux@fluff.org>");
281MODULE_DESCRIPTION("VGG2432A4 LCD Driver");
282MODULE_LICENSE("GPL v2");
283
284
diff --git a/drivers/video/bf54x-lq043fb.c b/drivers/video/bf54x-lq043fb.c
index 49834a67a623..940467aed13f 100644
--- a/drivers/video/bf54x-lq043fb.c
+++ b/drivers/video/bf54x-lq043fb.c
@@ -478,7 +478,7 @@ static int bfin_lcd_set_contrast(struct lcd_device *dev, int contrast)
478 return 0; 478 return 0;
479} 479}
480 480
481static int bfin_lcd_check_fb(struct fb_info *fi) 481static int bfin_lcd_check_fb(struct lcd_device *dev, struct fb_info *fi)
482{ 482{
483 if (!fi || (fi == &bfin_bf54x_fb)) 483 if (!fi || (fi == &bfin_bf54x_fb))
484 return 1; 484 return 1;
diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c
index 135d6dd7e672..7d1b819e501c 100644
--- a/drivers/video/bfin-t350mcqb-fb.c
+++ b/drivers/video/bfin-t350mcqb-fb.c
@@ -396,7 +396,7 @@ static int bfin_lcd_set_contrast(struct lcd_device *dev, int contrast)
396 return 0; 396 return 0;
397} 397}
398 398
399static int bfin_lcd_check_fb(struct fb_info *fi) 399static int bfin_lcd_check_fb(struct lcd_device *dev, struct fb_info *fi)
400{ 400{
401 if (!fi || (fi == &bfin_t350mcqb_fb)) 401 if (!fi || (fi == &bfin_t350mcqb_fb))
402 return 1; 402 return 1;
diff --git a/drivers/video/carminefb.c b/drivers/video/carminefb.c
new file mode 100644
index 000000000000..e15bb447440a
--- /dev/null
+++ b/drivers/video/carminefb.c
@@ -0,0 +1,790 @@
1/*
2 * Frame buffer driver for the Carmine GPU.
3 *
4 * The driver configures the GPU as follows
5 * - FB0 is display 0 with unique memory area
6 * - FB1 is display 1 with unique memory area
7 * - both display use 32 bit colors
8 */
9#include <linux/delay.h>
10#include <linux/errno.h>
11#include <linux/fb.h>
12#include <linux/interrupt.h>
13#include <linux/pci.h>
14
15#include "carminefb.h"
16#include "carminefb_regs.h"
17
18#if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN)
19#error "The endianness of the target host has not been defined."
20#endif
21
22/*
23 * The initial video mode can be supplied via two different ways:
24 * - as a string that is passed to fb_find_mode() (module option fb_mode_str)
25 * - as an integer that picks the video mode from carmine_modedb[] (module
26 * option fb_mode)
27 *
28 * If nothing is used than the initial video mode will be the
29 * CARMINEFB_DEFAULT_VIDEO_MODE member of the carmine_modedb[].
30 */
31#define CARMINEFB_DEFAULT_VIDEO_MODE 1
32
33static unsigned int fb_mode = CARMINEFB_DEFAULT_VIDEO_MODE;
34module_param(fb_mode, uint, 444);
35MODULE_PARM_DESC(fb_mode, "Initial video mode as integer.");
36
37static char *fb_mode_str;
38module_param(fb_mode_str, charp, 444);
39MODULE_PARM_DESC(fb_mode_str, "Initial video mode in characters.");
40
41/*
42 * Carminefb displays:
43 * 0b000 None
44 * 0b001 Display 0
45 * 0b010 Display 1
46 */
47static int fb_displays = CARMINE_USE_DISPLAY0 | CARMINE_USE_DISPLAY1;
48module_param(fb_displays, int, 444);
49MODULE_PARM_DESC(fb_displays, "Bit mode, which displays are used");
50
51struct carmine_hw {
52 void __iomem *v_regs;
53 void __iomem *screen_mem;
54 struct fb_info *fb[MAX_DISPLAY];
55};
56
57struct carmine_resolution {
58 u32 htp;
59 u32 hsp;
60 u32 hsw;
61 u32 hdp;
62 u32 vtr;
63 u32 vsp;
64 u32 vsw;
65 u32 vdp;
66 u32 disp_mode;
67};
68
69struct carmine_fb {
70 void __iomem *display_reg;
71 void __iomem *screen_base;
72 u32 smem_offset;
73 u32 cur_mode;
74 u32 new_mode;
75 struct carmine_resolution *res;
76 u32 pseudo_palette[16];
77};
78
79static struct fb_fix_screeninfo carminefb_fix __devinitdata = {
80 .id = "Carmine",
81 .type = FB_TYPE_PACKED_PIXELS,
82 .visual = FB_VISUAL_TRUECOLOR,
83 .accel = FB_ACCEL_NONE,
84};
85
86static const struct fb_videomode carmine_modedb[] = {
87 {
88 .name = "640x480",
89 .xres = 640,
90 .yres = 480,
91 }, {
92 .name = "800x600",
93 .xres = 800,
94 .yres = 600,
95 },
96};
97
98static struct carmine_resolution car_modes[] = {
99 {
100 /* 640x480 */
101 .htp = 800,
102 .hsp = 672,
103 .hsw = 96,
104 .hdp = 640,
105 .vtr = 525,
106 .vsp = 490,
107 .vsw = 2,
108 .vdp = 480,
109 .disp_mode = 0x1400,
110 },
111 {
112 /* 800x600 */
113 .htp = 1060,
114 .hsp = 864,
115 .hsw = 72,
116 .hdp = 800,
117 .vtr = 628,
118 .vsp = 601,
119 .vsw = 2,
120 .vdp = 600,
121 .disp_mode = 0x0d00,
122 }
123};
124
125static int carmine_find_mode(const struct fb_var_screeninfo *var)
126{
127 int i;
128
129 for (i = 0; i < ARRAY_SIZE(car_modes); i++)
130 if (car_modes[i].hdp == var->xres &&
131 car_modes[i].vdp == var->yres)
132 return i;
133 return -EINVAL;
134}
135
136static void c_set_disp_reg(const struct carmine_fb *par,
137 u32 offset, u32 val)
138{
139 writel(val, par->display_reg + offset);
140}
141
142static u32 c_get_disp_reg(const struct carmine_fb *par,
143 u32 offset)
144{
145 return readl(par->display_reg + offset);
146}
147
148static void c_set_hw_reg(const struct carmine_hw *hw,
149 u32 offset, u32 val)
150{
151 writel(val, hw->v_regs + offset);
152}
153
154static u32 c_get_hw_reg(const struct carmine_hw *hw,
155 u32 offset)
156{
157 return readl(hw->v_regs + offset);
158}
159
160static int carmine_setcolreg(unsigned regno, unsigned red, unsigned green,
161 unsigned blue, unsigned transp, struct fb_info *info)
162{
163 if (regno >= 16)
164 return 1;
165
166 red >>= 8;
167 green >>= 8;
168 blue >>= 8;
169 transp >>= 8;
170
171 ((u32 *)info->pseudo_palette)[regno] = be32_to_cpu(transp << 24 |
172 red << 0 | green << 8 | blue << 16);
173 return 0;
174}
175
176static int carmine_check_var(struct fb_var_screeninfo *var,
177 struct fb_info *info)
178{
179 int ret;
180
181 ret = carmine_find_mode(var);
182 if (ret < 0)
183 return ret;
184
185 if (var->grayscale || var->rotate || var->nonstd)
186 return -EINVAL;
187
188 var->xres_virtual = var->xres;
189 var->yres_virtual = var->yres;
190
191 var->bits_per_pixel = 32;
192
193#ifdef __BIG_ENDIAN
194 var->transp.offset = 24;
195 var->red.offset = 0;
196 var->green.offset = 8;
197 var->blue.offset = 16;
198#else
199 var->transp.offset = 24;
200 var->red.offset = 16;
201 var->green.offset = 8;
202 var->blue.offset = 0;
203#endif
204
205 var->red.length = 8;
206 var->green.length = 8;
207 var->blue.length = 8;
208 var->transp.length = 8;
209
210 var->red.msb_right = 0;
211 var->green.msb_right = 0;
212 var->blue.msb_right = 0;
213 var->transp.msb_right = 0;
214 return 0;
215}
216
217static void carmine_init_display_param(struct carmine_fb *par)
218{
219 u32 width;
220 u32 height;
221 u32 param;
222 u32 window_size;
223 u32 soffset = par->smem_offset;
224
225 c_set_disp_reg(par, CARMINE_DISP_REG_C_TRANS, 0);
226 c_set_disp_reg(par, CARMINE_DISP_REG_MLMR_TRANS, 0);
227 c_set_disp_reg(par, CARMINE_DISP_REG_CURSOR_MODE,
228 CARMINE_CURSOR0_PRIORITY_MASK |
229 CARMINE_CURSOR1_PRIORITY_MASK |
230 CARMINE_CURSOR_CUTZ_MASK);
231
232 /* Set default cursor position */
233 c_set_disp_reg(par, CARMINE_DISP_REG_CUR1_POS, 0 << 16 | 0);
234 c_set_disp_reg(par, CARMINE_DISP_REG_CUR2_POS, 0 << 16 | 0);
235
236 /* Set default display mode */
237 c_set_disp_reg(par, CARMINE_DISP_REG_L0_EXT_MODE, CARMINE_WINDOW_MODE |
238 CARMINE_EXT_CMODE_DIRECT24_RGBA);
239 c_set_disp_reg(par, CARMINE_DISP_REG_L1_EXT_MODE,
240 CARMINE_EXT_CMODE_DIRECT24_RGBA);
241 c_set_disp_reg(par, CARMINE_DISP_REG_L2_EXT_MODE, CARMINE_EXTEND_MODE |
242 CARMINE_EXT_CMODE_DIRECT24_RGBA);
243 c_set_disp_reg(par, CARMINE_DISP_REG_L3_EXT_MODE, CARMINE_EXTEND_MODE |
244 CARMINE_EXT_CMODE_DIRECT24_RGBA);
245 c_set_disp_reg(par, CARMINE_DISP_REG_L4_EXT_MODE, CARMINE_EXTEND_MODE |
246 CARMINE_EXT_CMODE_DIRECT24_RGBA);
247 c_set_disp_reg(par, CARMINE_DISP_REG_L5_EXT_MODE, CARMINE_EXTEND_MODE |
248 CARMINE_EXT_CMODE_DIRECT24_RGBA);
249 c_set_disp_reg(par, CARMINE_DISP_REG_L6_EXT_MODE, CARMINE_EXTEND_MODE |
250 CARMINE_EXT_CMODE_DIRECT24_RGBA);
251 c_set_disp_reg(par, CARMINE_DISP_REG_L7_EXT_MODE, CARMINE_EXTEND_MODE |
252 CARMINE_EXT_CMODE_DIRECT24_RGBA);
253
254 /* Set default frame size to layer mode register */
255 width = par->res->hdp * 4 / CARMINE_DISP_WIDTH_UNIT;
256 width = width << CARMINE_DISP_WIDTH_SHIFT;
257
258 height = par->res->vdp - 1;
259 param = width | height;
260
261 c_set_disp_reg(par, CARMINE_DISP_REG_L0_MODE_W_H, param);
262 c_set_disp_reg(par, CARMINE_DISP_REG_L1_WIDTH, width);
263 c_set_disp_reg(par, CARMINE_DISP_REG_L2_MODE_W_H, param);
264 c_set_disp_reg(par, CARMINE_DISP_REG_L3_MODE_W_H, param);
265 c_set_disp_reg(par, CARMINE_DISP_REG_L4_MODE_W_H, param);
266 c_set_disp_reg(par, CARMINE_DISP_REG_L5_MODE_W_H, param);
267 c_set_disp_reg(par, CARMINE_DISP_REG_L6_MODE_W_H, param);
268 c_set_disp_reg(par, CARMINE_DISP_REG_L7_MODE_W_H, param);
269
270 /* Set default pos and size */
271 window_size = (par->res->vdp - 1) << CARMINE_DISP_WIN_H_SHIFT;
272 window_size |= par->res->hdp;
273
274 c_set_disp_reg(par, CARMINE_DISP_REG_L0_WIN_POS, 0);
275 c_set_disp_reg(par, CARMINE_DISP_REG_L0_WIN_SIZE, window_size);
276 c_set_disp_reg(par, CARMINE_DISP_REG_L1_WIN_POS, 0);
277 c_set_disp_reg(par, CARMINE_DISP_REG_L1_WIN_SIZE, window_size);
278 c_set_disp_reg(par, CARMINE_DISP_REG_L2_WIN_POS, 0);
279 c_set_disp_reg(par, CARMINE_DISP_REG_L2_WIN_SIZE, window_size);
280 c_set_disp_reg(par, CARMINE_DISP_REG_L3_WIN_POS, 0);
281 c_set_disp_reg(par, CARMINE_DISP_REG_L3_WIN_SIZE, window_size);
282 c_set_disp_reg(par, CARMINE_DISP_REG_L4_WIN_POS, 0);
283 c_set_disp_reg(par, CARMINE_DISP_REG_L4_WIN_SIZE, window_size);
284 c_set_disp_reg(par, CARMINE_DISP_REG_L5_WIN_POS, 0);
285 c_set_disp_reg(par, CARMINE_DISP_REG_L5_WIN_SIZE, window_size);
286 c_set_disp_reg(par, CARMINE_DISP_REG_L6_WIN_POS, 0);
287 c_set_disp_reg(par, CARMINE_DISP_REG_L6_WIN_SIZE, window_size);
288 c_set_disp_reg(par, CARMINE_DISP_REG_L7_WIN_POS, 0);
289 c_set_disp_reg(par, CARMINE_DISP_REG_L7_WIN_SIZE, window_size);
290
291 /* Set default origin address */
292 c_set_disp_reg(par, CARMINE_DISP_REG_L0_ORG_ADR, soffset);
293 c_set_disp_reg(par, CARMINE_DISP_REG_L1_ORG_ADR, soffset);
294 c_set_disp_reg(par, CARMINE_DISP_REG_L2_ORG_ADR1, soffset);
295 c_set_disp_reg(par, CARMINE_DISP_REG_L3_ORG_ADR1, soffset);
296 c_set_disp_reg(par, CARMINE_DISP_REG_L4_ORG_ADR1, soffset);
297 c_set_disp_reg(par, CARMINE_DISP_REG_L5_ORG_ADR1, soffset);
298 c_set_disp_reg(par, CARMINE_DISP_REG_L6_ORG_ADR1, soffset);
299 c_set_disp_reg(par, CARMINE_DISP_REG_L7_ORG_ADR1, soffset);
300
301 /* Set default display address */
302 c_set_disp_reg(par, CARMINE_DISP_REG_L0_DISP_ADR, soffset);
303 c_set_disp_reg(par, CARMINE_DISP_REG_L2_DISP_ADR1, soffset);
304 c_set_disp_reg(par, CARMINE_DISP_REG_L3_DISP_ADR1, soffset);
305 c_set_disp_reg(par, CARMINE_DISP_REG_L4_DISP_ADR1, soffset);
306 c_set_disp_reg(par, CARMINE_DISP_REG_L5_DISP_ADR1, soffset);
307 c_set_disp_reg(par, CARMINE_DISP_REG_L6_DISP_ADR0, soffset);
308 c_set_disp_reg(par, CARMINE_DISP_REG_L7_DISP_ADR0, soffset);
309
310 /* Set default display position */
311 c_set_disp_reg(par, CARMINE_DISP_REG_L0_DISP_POS, 0);
312 c_set_disp_reg(par, CARMINE_DISP_REG_L2_DISP_POS, 0);
313 c_set_disp_reg(par, CARMINE_DISP_REG_L3_DISP_POS, 0);
314 c_set_disp_reg(par, CARMINE_DISP_REG_L4_DISP_POS, 0);
315 c_set_disp_reg(par, CARMINE_DISP_REG_L5_DISP_POS, 0);
316 c_set_disp_reg(par, CARMINE_DISP_REG_L6_DISP_POS, 0);
317 c_set_disp_reg(par, CARMINE_DISP_REG_L7_DISP_POS, 0);
318
319 /* Set default blend mode */
320 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L0, 0);
321 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L1, 0);
322 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L2, 0);
323 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L3, 0);
324 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L4, 0);
325 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L5, 0);
326 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L6, 0);
327 c_set_disp_reg(par, CARMINE_DISP_REG_BLEND_MODE_L7, 0);
328
329 /* default transparency mode */
330 c_set_disp_reg(par, CARMINE_DISP_REG_L0_TRANS, 0);
331 c_set_disp_reg(par, CARMINE_DISP_REG_L1_TRANS, 0);
332 c_set_disp_reg(par, CARMINE_DISP_REG_L2_TRANS, 0);
333 c_set_disp_reg(par, CARMINE_DISP_REG_L3_TRANS, 0);
334 c_set_disp_reg(par, CARMINE_DISP_REG_L4_TRANS, 0);
335 c_set_disp_reg(par, CARMINE_DISP_REG_L5_TRANS, 0);
336 c_set_disp_reg(par, CARMINE_DISP_REG_L6_TRANS, 0);
337 c_set_disp_reg(par, CARMINE_DISP_REG_L7_TRANS, 0);
338
339 /* Set default read skip parameter */
340 c_set_disp_reg(par, CARMINE_DISP_REG_L0RM, 0);
341 c_set_disp_reg(par, CARMINE_DISP_REG_L2RM, 0);
342 c_set_disp_reg(par, CARMINE_DISP_REG_L3RM, 0);
343 c_set_disp_reg(par, CARMINE_DISP_REG_L4RM, 0);
344 c_set_disp_reg(par, CARMINE_DISP_REG_L5RM, 0);
345 c_set_disp_reg(par, CARMINE_DISP_REG_L6RM, 0);
346 c_set_disp_reg(par, CARMINE_DISP_REG_L7RM, 0);
347
348 c_set_disp_reg(par, CARMINE_DISP_REG_L0PX, 0);
349 c_set_disp_reg(par, CARMINE_DISP_REG_L2PX, 0);
350 c_set_disp_reg(par, CARMINE_DISP_REG_L3PX, 0);
351 c_set_disp_reg(par, CARMINE_DISP_REG_L4PX, 0);
352 c_set_disp_reg(par, CARMINE_DISP_REG_L5PX, 0);
353 c_set_disp_reg(par, CARMINE_DISP_REG_L6PX, 0);
354 c_set_disp_reg(par, CARMINE_DISP_REG_L7PX, 0);
355
356 c_set_disp_reg(par, CARMINE_DISP_REG_L0PY, 0);
357 c_set_disp_reg(par, CARMINE_DISP_REG_L2PY, 0);
358 c_set_disp_reg(par, CARMINE_DISP_REG_L3PY, 0);
359 c_set_disp_reg(par, CARMINE_DISP_REG_L4PY, 0);
360 c_set_disp_reg(par, CARMINE_DISP_REG_L5PY, 0);
361 c_set_disp_reg(par, CARMINE_DISP_REG_L6PY, 0);
362 c_set_disp_reg(par, CARMINE_DISP_REG_L7PY, 0);
363}
364
365static void set_display_parameters(struct carmine_fb *par)
366{
367 u32 mode;
368 u32 hdp, vdp, htp, hsp, hsw, vtr, vsp, vsw;
369
370 /*
371 * display timing. Parameters are decreased by one because hardware
372 * spec is 0 to (n - 1)
373 * */
374 hdp = par->res->hdp - 1;
375 vdp = par->res->vdp - 1;
376 htp = par->res->htp - 1;
377 hsp = par->res->hsp - 1;
378 hsw = par->res->hsw - 1;
379 vtr = par->res->vtr - 1;
380 vsp = par->res->vsp - 1;
381 vsw = par->res->vsw - 1;
382
383 c_set_disp_reg(par, CARMINE_DISP_REG_H_TOTAL,
384 htp << CARMINE_DISP_HTP_SHIFT);
385 c_set_disp_reg(par, CARMINE_DISP_REG_H_PERIOD,
386 (hdp << CARMINE_DISP_HDB_SHIFT) | hdp);
387 c_set_disp_reg(par, CARMINE_DISP_REG_V_H_W_H_POS,
388 (vsw << CARMINE_DISP_VSW_SHIFT) |
389 (hsw << CARMINE_DISP_HSW_SHIFT) |
390 (hsp));
391 c_set_disp_reg(par, CARMINE_DISP_REG_V_TOTAL,
392 vtr << CARMINE_DISP_VTR_SHIFT);
393 c_set_disp_reg(par, CARMINE_DISP_REG_V_PERIOD_POS,
394 (vdp << CARMINE_DISP_VDP_SHIFT) | vsp);
395
396 /* clock */
397 mode = c_get_disp_reg(par, CARMINE_DISP_REG_DCM1);
398 mode = (mode & ~CARMINE_DISP_DCM_MASK) |
399 (par->res->disp_mode & CARMINE_DISP_DCM_MASK);
400 /* enable video output and layer 0 */
401 mode |= CARMINE_DEN | CARMINE_L0E;
402 c_set_disp_reg(par, CARMINE_DISP_REG_DCM1, mode);
403}
404
405static int carmine_set_par(struct fb_info *info)
406{
407 struct carmine_fb *par = info->par;
408 int ret;
409
410 ret = carmine_find_mode(&info->var);
411 if (ret < 0)
412 return ret;
413
414 par->new_mode = ret;
415 if (par->cur_mode != par->new_mode) {
416
417 par->cur_mode = par->new_mode;
418 par->res = &car_modes[par->new_mode];
419
420 carmine_init_display_param(par);
421 set_display_parameters(par);
422 }
423
424 info->fix.line_length = info->var.xres * info->var.bits_per_pixel / 8;
425 return 0;
426}
427
428static int init_hardware(struct carmine_hw *hw)
429{
430 u32 flags;
431 u32 loops;
432 u32 ret;
433
434 /* Initalize Carmine */
435 /* Sets internal clock */
436 c_set_hw_reg(hw, CARMINE_CTL_REG + CARMINE_CTL_REG_CLOCK_ENABLE,
437 CARMINE_DFLT_IP_CLOCK_ENABLE);
438
439 /* Video signal output is turned off */
440 c_set_hw_reg(hw, CARMINE_DISP0_REG + CARMINE_DISP_REG_DCM1, 0);
441 c_set_hw_reg(hw, CARMINE_DISP1_REG + CARMINE_DISP_REG_DCM1, 0);
442
443 /* Software reset */
444 c_set_hw_reg(hw, CARMINE_CTL_REG + CARMINE_CTL_REG_SOFTWARE_RESET, 1);
445 c_set_hw_reg(hw, CARMINE_CTL_REG + CARMINE_CTL_REG_SOFTWARE_RESET, 0);
446
447 /* I/O mode settings */
448 flags = CARMINE_DFLT_IP_DCTL_IO_CONT1 << 16 |
449 CARMINE_DFLT_IP_DCTL_IO_CONT0;
450 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_IOCONT1_IOCONT0,
451 flags);
452
453 /* DRAM initial sequence */
454 flags = CARMINE_DFLT_IP_DCTL_MODE << 16 | CARMINE_DFLT_IP_DCTL_ADD;
455 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_MODE_ADD,
456 flags);
457
458 flags = CARMINE_DFLT_IP_DCTL_SET_TIME1 << 16 |
459 CARMINE_DFLT_IP_DCTL_EMODE;
460 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_SETTIME1_EMODE,
461 flags);
462
463 flags = CARMINE_DFLT_IP_DCTL_REFRESH << 16 |
464 CARMINE_DFLT_IP_DCTL_SET_TIME2;
465 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_REFRESH_SETTIME2,
466 flags);
467
468 flags = CARMINE_DFLT_IP_DCTL_RESERVE2 << 16 |
469 CARMINE_DFLT_IP_DCTL_FIFO_DEPTH;
470 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_RSV2_RSV1, flags);
471
472 flags = CARMINE_DFLT_IP_DCTL_DDRIF2 << 16 | CARMINE_DFLT_IP_DCTL_DDRIF1;
473 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_DDRIF2_DDRIF1,
474 flags);
475
476 flags = CARMINE_DFLT_IP_DCTL_RESERVE0 << 16 |
477 CARMINE_DFLT_IP_DCTL_STATES;
478 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_RSV0_STATES,
479 flags);
480
481 /* Executes DLL reset */
482 if (CARMINE_DCTL_DLL_RESET) {
483 for (loops = 0; loops < CARMINE_DCTL_INIT_WAIT_LIMIT; loops++) {
484
485 ret = c_get_hw_reg(hw, CARMINE_DCTL_REG +
486 CARMINE_DCTL_REG_RSV0_STATES);
487 ret &= CARMINE_DCTL_REG_STATES_MASK;
488 if (!ret)
489 break;
490
491 mdelay(CARMINE_DCTL_INIT_WAIT_INTERVAL);
492 }
493
494 if (loops >= CARMINE_DCTL_INIT_WAIT_LIMIT) {
495 printk(KERN_ERR "DRAM init failed\n");
496 return -EIO;
497 }
498 }
499
500 flags = CARMINE_DFLT_IP_DCTL_MODE_AFT_RST << 16 |
501 CARMINE_DFLT_IP_DCTL_ADD;
502 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_MODE_ADD, flags);
503
504 flags = CARMINE_DFLT_IP_DCTL_RESERVE0 << 16 |
505 CARMINE_DFLT_IP_DCTL_STATES_AFT_RST;
506 c_set_hw_reg(hw, CARMINE_DCTL_REG + CARMINE_DCTL_REG_RSV0_STATES,
507 flags);
508
509 /* Initialize the write back register */
510 c_set_hw_reg(hw, CARMINE_WB_REG + CARMINE_WB_REG_WBM,
511 CARMINE_WB_REG_WBM_DEFAULT);
512
513 /* Initialize the Kottos registers */
514 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_VRINTM, 0);
515 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_VRERRM, 0);
516
517 /* Set DC offsets */
518 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_DC_OFFSET_PX, 0);
519 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_DC_OFFSET_PY, 0);
520 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_DC_OFFSET_LX, 0);
521 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_DC_OFFSET_LY, 0);
522 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_DC_OFFSET_TX, 0);
523 c_set_hw_reg(hw, CARMINE_GRAPH_REG + CARMINE_GRAPH_REG_DC_OFFSET_TY, 0);
524 return 0;
525}
526
527static struct fb_ops carminefb_ops = {
528 .owner = THIS_MODULE,
529 .fb_fillrect = cfb_fillrect,
530 .fb_copyarea = cfb_copyarea,
531 .fb_imageblit = cfb_imageblit,
532
533 .fb_check_var = carmine_check_var,
534 .fb_set_par = carmine_set_par,
535 .fb_setcolreg = carmine_setcolreg,
536};
537
538static int alloc_carmine_fb(void __iomem *regs, void __iomem *smem_base,
539 int smem_offset, struct device *device, struct fb_info **rinfo)
540{
541 int ret;
542 struct fb_info *info;
543 struct carmine_fb *par;
544
545 info = framebuffer_alloc(sizeof *par, device);
546 if (!info)
547 return -ENOMEM;
548
549 par = info->par;
550 par->display_reg = regs;
551 par->smem_offset = smem_offset;
552
553 info->screen_base = smem_base + smem_offset;
554 info->screen_size = CARMINE_DISPLAY_MEM;
555 info->fbops = &carminefb_ops;
556
557 info->fix = carminefb_fix;
558 info->pseudo_palette = par->pseudo_palette;
559 info->flags = FBINFO_DEFAULT;
560
561 ret = fb_alloc_cmap(&info->cmap, 256, 1);
562 if (ret < 0)
563 goto err_free_fb;
564
565 if (fb_mode > ARRAY_SIZE(carmine_modedb))
566 fb_mode = CARMINEFB_DEFAULT_VIDEO_MODE;
567
568 par->cur_mode = par->new_mode = ~0;
569
570 ret = fb_find_mode(&info->var, info, fb_mode_str, carmine_modedb,
571 ARRAY_SIZE(carmine_modedb),
572 &carmine_modedb[fb_mode], 32);
573 if (!ret || ret == 4) {
574 ret = -EINVAL;
575 goto err_dealloc_cmap;
576 }
577
578 fb_videomode_to_modelist(carmine_modedb, ARRAY_SIZE(carmine_modedb),
579 &info->modelist);
580
581 ret = register_framebuffer(info);
582 if (ret < 0)
583 goto err_dealloc_cmap;
584
585 printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
586 info->fix.id);
587
588 *rinfo = info;
589 return 0;
590
591err_dealloc_cmap:
592 fb_dealloc_cmap(&info->cmap);
593err_free_fb:
594 framebuffer_release(info);
595 return ret;
596}
597
598static void cleanup_fb_device(struct fb_info *info)
599{
600 if (info) {
601 unregister_framebuffer(info);
602 fb_dealloc_cmap(&info->cmap);
603 framebuffer_release(info);
604 }
605}
606
607static int __devinit carminefb_probe(struct pci_dev *dev,
608 const struct pci_device_id *ent)
609{
610 struct carmine_hw *hw;
611 struct device *device = &dev->dev;
612 struct fb_info *info;
613 int ret;
614
615 ret = pci_enable_device(dev);
616 if (ret)
617 return ret;
618
619 ret = -ENOMEM;
620 hw = kzalloc(sizeof *hw, GFP_KERNEL);
621 if (!hw)
622 goto err_enable_pci;
623
624 carminefb_fix.mmio_start = pci_resource_start(dev, CARMINE_CONFIG_BAR);
625 carminefb_fix.mmio_len = pci_resource_len(dev, CARMINE_CONFIG_BAR);
626
627 if (!request_mem_region(carminefb_fix.mmio_start,
628 carminefb_fix.mmio_len,
629 "carminefb regbase")) {
630 printk(KERN_ERR "carminefb: Can't reserve regbase.\n");
631 ret = -EBUSY;
632 goto err_free_hw;
633 }
634 hw->v_regs = ioremap_nocache(carminefb_fix.mmio_start,
635 carminefb_fix.mmio_len);
636 if (!hw->v_regs) {
637 printk(KERN_ERR "carminefb: Can't remap %s register.\n",
638 carminefb_fix.id);
639 goto err_free_reg_mmio;
640 }
641
642 carminefb_fix.smem_start = pci_resource_start(dev, CARMINE_MEMORY_BAR);
643 carminefb_fix.smem_len = pci_resource_len(dev, CARMINE_MEMORY_BAR);
644
645 /* The memory area tends to be very large (256 MiB). Remap only what
646 * is required for that largest resolution to avoid remaps at run
647 * time
648 */
649 if (carminefb_fix.smem_len > CARMINE_TOTAL_DIPLAY_MEM)
650 carminefb_fix.smem_len = CARMINE_TOTAL_DIPLAY_MEM;
651
652 else if (carminefb_fix.smem_len < CARMINE_TOTAL_DIPLAY_MEM) {
653 printk(KERN_ERR "carminefb: Memory bar is only %d bytes, %d "
654 "are required.", carminefb_fix.smem_len,
655 CARMINE_TOTAL_DIPLAY_MEM);
656 goto err_free_reg_mmio;
657 }
658
659 if (!request_mem_region(carminefb_fix.smem_start,
660 carminefb_fix.smem_len, "carminefb smem")) {
661 printk(KERN_ERR "carminefb: Can't reserve smem.\n");
662 goto err_unmap_vregs;
663 }
664
665 hw->screen_mem = ioremap_nocache(carminefb_fix.smem_start,
666 carminefb_fix.smem_len);
667 if (!hw->screen_mem) {
668 printk(KERN_ERR "carmine: Can't ioremap smem area.\n");
669 release_mem_region(carminefb_fix.smem_start,
670 carminefb_fix.smem_len);
671 goto err_reg_smem;
672 }
673
674 ret = init_hardware(hw);
675 if (ret)
676 goto err_unmap_screen;
677
678 info = NULL;
679 if (fb_displays & CARMINE_USE_DISPLAY0) {
680 ret = alloc_carmine_fb(hw->v_regs + CARMINE_DISP0_REG,
681 hw->screen_mem, CARMINE_DISPLAY_MEM * 0,
682 device, &info);
683 if (ret)
684 goto err_deinit_hw;
685 }
686
687 hw->fb[0] = info;
688
689 info = NULL;
690 if (fb_displays & CARMINE_USE_DISPLAY1) {
691 ret = alloc_carmine_fb(hw->v_regs + CARMINE_DISP1_REG,
692 hw->screen_mem, CARMINE_DISPLAY_MEM * 1,
693 device, &info);
694 if (ret)
695 goto err_cleanup_fb0;
696 }
697
698 hw->fb[1] = info;
699 info = NULL;
700
701 pci_set_drvdata(dev, hw);
702 return 0;
703
704err_cleanup_fb0:
705 cleanup_fb_device(hw->fb[0]);
706err_deinit_hw:
707 /* disable clock, etc */
708 c_set_hw_reg(hw, CARMINE_CTL_REG + CARMINE_CTL_REG_CLOCK_ENABLE, 0);
709err_unmap_screen:
710 iounmap(hw->screen_mem);
711err_reg_smem:
712 release_mem_region(carminefb_fix.mmio_start, carminefb_fix.mmio_len);
713err_unmap_vregs:
714 iounmap(hw->v_regs);
715err_free_reg_mmio:
716 release_mem_region(carminefb_fix.mmio_start, carminefb_fix.mmio_len);
717err_free_hw:
718 kfree(hw);
719err_enable_pci:
720 pci_disable_device(dev);
721 return ret;
722}
723
724static void __devexit carminefb_remove(struct pci_dev *dev)
725{
726 struct carmine_hw *hw = pci_get_drvdata(dev);
727 struct fb_fix_screeninfo fix;
728 int i;
729
730 /* in case we use only fb1 and not fb1 */
731 if (hw->fb[0])
732 fix = hw->fb[0]->fix;
733 else
734 fix = hw->fb[1]->fix;
735
736 /* deactivate display(s) and switch clocks */
737 c_set_hw_reg(hw, CARMINE_DISP0_REG + CARMINE_DISP_REG_DCM1, 0);
738 c_set_hw_reg(hw, CARMINE_DISP1_REG + CARMINE_DISP_REG_DCM1, 0);
739 c_set_hw_reg(hw, CARMINE_CTL_REG + CARMINE_CTL_REG_CLOCK_ENABLE, 0);
740
741 for (i = 0; i < MAX_DISPLAY; i++)
742 cleanup_fb_device(hw->fb[i]);
743
744 iounmap(hw->screen_mem);
745 release_mem_region(fix.smem_start, fix.smem_len);
746 iounmap(hw->v_regs);
747 release_mem_region(fix.mmio_start, fix.mmio_len);
748
749 pci_set_drvdata(dev, NULL);
750 pci_disable_device(dev);
751 kfree(hw);
752}
753
754#define PCI_VENDOR_ID_FUJITU_LIMITED 0x10cf
755static struct pci_device_id carmine_devices[] __devinitdata = {
756{
757 PCI_DEVICE(PCI_VENDOR_ID_FUJITU_LIMITED, 0x202b)},
758 {0, 0, 0, 0, 0, 0, 0}
759};
760
761MODULE_DEVICE_TABLE(pci, carmine_devices);
762
763static struct pci_driver carmine_pci_driver = {
764 .name = "carminefb",
765 .id_table = carmine_devices,
766 .probe = carminefb_probe,
767 .remove = __devexit_p(carminefb_remove),
768};
769
770static int __init carminefb_init(void)
771{
772 if (!(fb_displays &
773 (CARMINE_USE_DISPLAY0 | CARMINE_USE_DISPLAY1))) {
774 printk(KERN_ERR "If you disable both displays than you don't "
775 "need the driver at all\n");
776 return -EINVAL;
777 }
778 return pci_register_driver(&carmine_pci_driver);
779}
780module_init(carminefb_init);
781
782static void __exit carminefb_cleanup(void)
783{
784 pci_unregister_driver(&carmine_pci_driver);
785}
786module_exit(carminefb_cleanup);
787
788MODULE_AUTHOR("Sebastian Siewior <bigeasy@linutronix.de>");
789MODULE_DESCRIPTION("Framebuffer driver for Fujitsu Carmine based devices");
790MODULE_LICENSE("GPL v2");
diff --git a/drivers/video/carminefb.h b/drivers/video/carminefb.h
new file mode 100644
index 000000000000..05306de0c6b6
--- /dev/null
+++ b/drivers/video/carminefb.h
@@ -0,0 +1,64 @@
1#ifndef CARMINE_CARMINE_H
2#define CARMINE_CARMINE_H
3
4#define CARMINE_MEMORY_BAR 2
5#define CARMINE_CONFIG_BAR 3
6
7#define MAX_DISPLAY 2
8#define CARMINE_DISPLAY_MEM (800 * 600 * 4)
9#define CARMINE_TOTAL_DIPLAY_MEM (CARMINE_DISPLAY_MEM * MAX_DISPLAY)
10
11#define CARMINE_USE_DISPLAY0 (1 << 0)
12#define CARMINE_USE_DISPLAY1 (1 << 1)
13
14/*
15 * This values work on the eval card. Custom boards may use different timings,
16 * here an example :)
17 */
18
19/* DRAM initialization values */
20#ifdef CONFIG_FB_CARMINE_DRAM_EVAL
21
22#define CARMINE_DFLT_IP_CLOCK_ENABLE (0x03ff)
23#define CARMINE_DFLT_IP_DCTL_ADD (0x05c3)
24#define CARMINE_DFLT_IP_DCTL_MODE (0x0121)
25#define CARMINE_DFLT_IP_DCTL_EMODE (0x8000)
26#define CARMINE_DFLT_IP_DCTL_SET_TIME1 (0x4749)
27#define CARMINE_DFLT_IP_DCTL_SET_TIME2 (0x2a22)
28#define CARMINE_DFLT_IP_DCTL_REFRESH (0x0042)
29#define CARMINE_DFLT_IP_DCTL_STATES (0x0003)
30#define CARMINE_DFLT_IP_DCTL_RESERVE0 (0x0020)
31#define CARMINE_DFLT_IP_DCTL_FIFO_DEPTH (0x000f)
32#define CARMINE_DFLT_IP_DCTL_RESERVE2 (0x0000)
33#define CARMINE_DFLT_IP_DCTL_DDRIF1 (0x6646)
34#define CARMINE_DFLT_IP_DCTL_DDRIF2 (0x0055)
35#define CARMINE_DFLT_IP_DCTL_MODE_AFT_RST (0x0021)
36#define CARMINE_DFLT_IP_DCTL_STATES_AFT_RST (0x0002)
37#define CARMINE_DFLT_IP_DCTL_IO_CONT0 (0x0555)
38#define CARMINE_DFLT_IP_DCTL_IO_CONT1 (0x0555)
39#define CARMINE_DCTL_DLL_RESET (1)
40#endif
41
42#ifdef CONFIG_CARMINE_DRAM_CUSTOM
43
44#define CARMINE_DFLT_IP_CLOCK_ENABLE (0x03ff)
45#define CARMINE_DFLT_IP_DCTL_ADD (0x03b2)
46#define CARMINE_DFLT_IP_DCTL_MODE (0x0161)
47#define CARMINE_DFLT_IP_DCTL_EMODE (0x8000)
48#define CARMINE_DFLT_IP_DCTL_SET_TIME1 (0x2628)
49#define CARMINE_DFLT_IP_DCTL_SET_TIME2 (0x1a09)
50#define CARMINE_DFLT_IP_DCTL_REFRESH (0x00fe)
51#define CARMINE_DFLT_IP_DCTL_STATES (0x0003)
52#define CARMINE_DFLT_IP_DCTL_RESERVE0 (0x0020)
53#define CARMINE_DFLT_IP_DCTL_FIFO_DEPTH (0x000f)
54#define CARMINE_DFLT_IP_DCTL_RESERVE2 (0x0000)
55#define CARMINE_DFLT_IP_DCTL_DDRIF1 (0x0646)
56#define CARMINE_DFLT_IP_DCTL_DDRIF2 (0x55aa)
57#define CARMINE_DFLT_IP_DCTL_MODE_AFT_RST (0x0061)
58#define CARMINE_DFLT_IP_DCTL_STATES_AFT_RST (0x0002)
59#define CARMINE_DFLT_IP_DCTL_IO_CONT0 (0x0555)
60#define CARMINE_DFLT_IP_DCTL_IO_CONT1 (0x0555)
61#define CARMINE_DCTL_DLL_RESET (1)
62#endif
63
64#endif
diff --git a/drivers/video/carminefb_regs.h b/drivers/video/carminefb_regs.h
new file mode 100644
index 000000000000..045215600b73
--- /dev/null
+++ b/drivers/video/carminefb_regs.h
@@ -0,0 +1,159 @@
1#ifndef _CARMINEFB_REGS_H
2#define _CARMINEFB_REGS_H
3
4#define CARMINE_OVERLAY_EXT_MODE (0x00000002)
5#define CARMINE_GRAPH_REG (0x00000000)
6#define CARMINE_DISP0_REG (0x00100000)
7#define CARMINE_DISP1_REG (0x00140000)
8#define CARMINE_WB_REG (0x00180000)
9#define CARMINE_DCTL_REG (0x00300000)
10#define CARMINE_CTL_REG (0x00400000)
11#define CARMINE_WINDOW_MODE (0x00000001)
12#define CARMINE_EXTEND_MODE (CARMINE_WINDOW_MODE | \
13 CARMINE_OVERLAY_EXT_MODE)
14#define CARMINE_L0E (1 << 16)
15#define CARMINE_L2E (1 << 18)
16#define CARMINE_DEN (1 << 31)
17
18#define CARMINE_EXT_CMODE_DIRECT24_RGBA (0xC0000000)
19#define CARMINE_DCTL_REG_MODE_ADD (0x00)
20#define CARMINE_DCTL_REG_SETTIME1_EMODE (0x04)
21#define CARMINE_DCTL_REG_REFRESH_SETTIME2 (0x08)
22#define CARMINE_DCTL_REG_RSV0_STATES (0x0C)
23#define CARMINE_DCTL_REG_RSV2_RSV1 (0x10)
24#define CARMINE_DCTL_REG_DDRIF2_DDRIF1 (0x14)
25#define CARMINE_DCTL_REG_IOCONT1_IOCONT0 (0x24)
26#define CARMINE_DCTL_REG_STATES_MASK (0x000F)
27#define CARMINE_DCTL_INIT_WAIT_INTERVAL (1)
28#define CARMINE_DCTL_INIT_WAIT_LIMIT (5000)
29#define CARMINE_WB_REG_WBM_DEFAULT (0x0001c020)
30#define CARMINE_DISP_REG_L0RM (0x1880)
31#define CARMINE_DISP_REG_L0PX (0x1884)
32#define CARMINE_DISP_REG_L0PY (0x1888)
33#define CARMINE_DISP_REG_L2RM (0x18A0)
34#define CARMINE_DISP_REG_L2PX (0x18A4)
35#define CARMINE_DISP_REG_L2PY (0x18A8)
36#define CARMINE_DISP_REG_L3RM (0x18B0)
37#define CARMINE_DISP_REG_L3PX (0x18B4)
38#define CARMINE_DISP_REG_L3PY (0x18B8)
39#define CARMINE_DISP_REG_L4RM (0x18C0)
40#define CARMINE_DISP_REG_L4PX (0x18C4)
41#define CARMINE_DISP_REG_L4PY (0x18C8)
42#define CARMINE_DISP_REG_L5RM (0x18D0)
43#define CARMINE_DISP_REG_L5PX (0x18D4)
44#define CARMINE_DISP_REG_L5PY (0x18D8)
45#define CARMINE_DISP_REG_L6RM (0x1924)
46#define CARMINE_DISP_REG_L6PX (0x1928)
47#define CARMINE_DISP_REG_L6PY (0x192C)
48#define CARMINE_DISP_REG_L7RM (0x1964)
49#define CARMINE_DISP_REG_L7PX (0x1968)
50#define CARMINE_DISP_REG_L7PY (0x196C)
51#define CARMINE_WB_REG_WBM (0x0004)
52#define CARMINE_DISP_HTP_SHIFT (16)
53#define CARMINE_DISP_HDB_SHIFT (16)
54#define CARMINE_DISP_HSW_SHIFT (16)
55#define CARMINE_DISP_VSW_SHIFT (24)
56#define CARMINE_DISP_VTR_SHIFT (16)
57#define CARMINE_DISP_VDP_SHIFT (16)
58#define CARMINE_CURSOR_CUTZ_MASK (0x00000100)
59#define CARMINE_CURSOR0_PRIORITY_MASK (0x00010000)
60#define CARMINE_CURSOR1_PRIORITY_MASK (0x00020000)
61#define CARMINE_DISP_WIDTH_SHIFT (16)
62#define CARMINE_DISP_WIN_H_SHIFT (16)
63#define CARMINE_DISP_REG_H_TOTAL (0x0004)
64#define CARMINE_DISP_REG_H_PERIOD (0x0008)
65#define CARMINE_DISP_REG_V_H_W_H_POS (0x000C)
66#define CARMINE_DISP_REG_V_TOTAL (0x0010)
67#define CARMINE_DISP_REG_V_PERIOD_POS (0x0014)
68#define CARMINE_DISP_REG_L0_MODE_W_H (0x0020)
69#define CARMINE_DISP_REG_L0_ORG_ADR (0x0024)
70#define CARMINE_DISP_REG_L0_DISP_ADR (0x0028)
71#define CARMINE_DISP_REG_L0_DISP_POS (0x002C)
72#define CARMINE_DISP_REG_L1_WIDTH (0x0030)
73#define CARMINE_DISP_REG_L1_ORG_ADR (0x0034)
74#define CARMINE_DISP_REG_L2_MODE_W_H (0x0040)
75#define CARMINE_DISP_REG_L2_ORG_ADR1 (0x0044)
76#define CARMINE_DISP_REG_L2_DISP_ADR1 (0x0048)
77#define CARMINE_DISP_REG_L2_DISP_POS (0x0054)
78#define CARMINE_DISP_REG_L3_MODE_W_H (0x0058)
79#define CARMINE_DISP_REG_L3_ORG_ADR1 (0x005C)
80#define CARMINE_DISP_REG_L3_DISP_ADR1 (0x0060)
81#define CARMINE_DISP_REG_L3_DISP_POS (0x006C)
82#define CARMINE_DISP_REG_L4_MODE_W_H (0x0070)
83#define CARMINE_DISP_REG_L4_ORG_ADR1 (0x0074)
84#define CARMINE_DISP_REG_L4_DISP_ADR1 (0x0078)
85#define CARMINE_DISP_REG_L4_DISP_POS (0x0084)
86#define CARMINE_DISP_REG_L5_MODE_W_H (0x0088)
87#define CARMINE_DISP_REG_L5_ORG_ADR1 (0x008C)
88#define CARMINE_DISP_REG_L5_DISP_ADR1 (0x0090)
89#define CARMINE_DISP_REG_L5_DISP_POS (0x009C)
90#define CARMINE_DISP_REG_CURSOR_MODE (0x00A0)
91#define CARMINE_DISP_REG_CUR1_POS (0x00A8)
92#define CARMINE_DISP_REG_CUR2_POS (0x00B0)
93#define CARMINE_DISP_REG_C_TRANS (0x00BC)
94#define CARMINE_DISP_REG_MLMR_TRANS (0x00C0)
95#define CARMINE_DISP_REG_L0_EXT_MODE (0x0110)
96#define CARMINE_DISP_REG_L0_WIN_POS (0x0114)
97#define CARMINE_DISP_REG_L0_WIN_SIZE (0x0118)
98#define CARMINE_DISP_REG_L1_EXT_MODE (0x0120)
99#define CARMINE_DISP_REG_L1_WIN_POS (0x0124)
100#define CARMINE_DISP_REG_L1_WIN_SIZE (0x0128)
101#define CARMINE_DISP_REG_L2_EXT_MODE (0x0130)
102#define CARMINE_DISP_REG_L2_WIN_POS (0x0134)
103#define CARMINE_DISP_REG_L2_WIN_SIZE (0x0138)
104#define CARMINE_DISP_REG_L3_EXT_MODE (0x0140)
105#define CARMINE_DISP_REG_L3_WIN_POS (0x0144)
106#define CARMINE_DISP_REG_L3_WIN_SIZE (0x0148)
107#define CARMINE_DISP_REG_L4_EXT_MODE (0x0150)
108#define CARMINE_DISP_REG_L4_WIN_POS (0x0154)
109#define CARMINE_DISP_REG_L4_WIN_SIZE (0x0158)
110#define CARMINE_DISP_REG_L5_EXT_MODE (0x0160)
111#define CARMINE_DISP_REG_L5_WIN_POS (0x0164)
112#define CARMINE_DISP_REG_L5_WIN_SIZE (0x0168)
113#define CARMINE_DISP_REG_L6_EXT_MODE (0x1918)
114#define CARMINE_DISP_REG_L6_WIN_POS (0x191c)
115#define CARMINE_DISP_REG_L6_WIN_SIZE (0x1920)
116#define CARMINE_DISP_REG_L7_EXT_MODE (0x1958)
117#define CARMINE_DISP_REG_L7_WIN_POS (0x195c)
118#define CARMINE_DISP_REG_L7_WIN_SIZE (0x1960)
119#define CARMINE_DISP_REG_BLEND_MODE_L0 (0x00B4)
120#define CARMINE_DISP_REG_BLEND_MODE_L1 (0x0188)
121#define CARMINE_DISP_REG_BLEND_MODE_L2 (0x018C)
122#define CARMINE_DISP_REG_BLEND_MODE_L3 (0x0190)
123#define CARMINE_DISP_REG_BLEND_MODE_L4 (0x0194)
124#define CARMINE_DISP_REG_BLEND_MODE_L5 (0x0198)
125#define CARMINE_DISP_REG_BLEND_MODE_L6 (0x1990)
126#define CARMINE_DISP_REG_BLEND_MODE_L7 (0x1994)
127#define CARMINE_DISP_REG_L0_TRANS (0x01A0)
128#define CARMINE_DISP_REG_L1_TRANS (0x01A4)
129#define CARMINE_DISP_REG_L2_TRANS (0x01A8)
130#define CARMINE_DISP_REG_L3_TRANS (0x01AC)
131#define CARMINE_DISP_REG_L4_TRANS (0x01B0)
132#define CARMINE_DISP_REG_L5_TRANS (0x01B4)
133#define CARMINE_DISP_REG_L6_TRANS (0x1998)
134#define CARMINE_DISP_REG_L7_TRANS (0x199c)
135#define CARMINE_EXTEND_MODE_MASK (0x00000003)
136#define CARMINE_DISP_DCM_MASK (0x0000FFFF)
137#define CARMINE_DISP_REG_DCM1 (0x0100)
138#define CARMINE_DISP_WIDTH_UNIT (64)
139#define CARMINE_DISP_REG_L6_MODE_W_H (0x1900)
140#define CARMINE_DISP_REG_L6_ORG_ADR1 (0x1904)
141#define CARMINE_DISP_REG_L6_DISP_ADR0 (0x1908)
142#define CARMINE_DISP_REG_L6_DISP_POS (0x1914)
143#define CARMINE_DISP_REG_L7_MODE_W_H (0x1940)
144#define CARMINE_DISP_REG_L7_ORG_ADR1 (0x1944)
145#define CARMINE_DISP_REG_L7_DISP_ADR0 (0x1948)
146#define CARMINE_DISP_REG_L7_DISP_POS (0x1954)
147#define CARMINE_CTL_REG_CLOCK_ENABLE (0x000C)
148#define CARMINE_CTL_REG_SOFTWARE_RESET (0x0010)
149#define CARMINE_CTL_REG_IST_MASK_ALL (0x07FFFFFF)
150#define CARMINE_GRAPH_REG_VRINTM (0x00028064)
151#define CARMINE_GRAPH_REG_VRERRM (0x0002806C)
152#define CARMINE_GRAPH_REG_DC_OFFSET_PX (0x0004005C)
153#define CARMINE_GRAPH_REG_DC_OFFSET_PY (0x00040060)
154#define CARMINE_GRAPH_REG_DC_OFFSET_LX (0x00040064)
155#define CARMINE_GRAPH_REG_DC_OFFSET_LY (0x00040068)
156#define CARMINE_GRAPH_REG_DC_OFFSET_TX (0x0004006C)
157#define CARMINE_GRAPH_REG_DC_OFFSET_TY (0x00040070)
158
159#endif
diff --git a/drivers/video/cobalt_lcdfb.c b/drivers/video/cobalt_lcdfb.c
new file mode 100644
index 000000000000..7bad24ed04ef
--- /dev/null
+++ b/drivers/video/cobalt_lcdfb.c
@@ -0,0 +1,371 @@
1/*
2 * Cobalt server LCD frame buffer driver.
3 *
4 * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20#include <linux/delay.h>
21#include <linux/fb.h>
22#include <linux/init.h>
23#include <linux/io.h>
24#include <linux/ioport.h>
25#include <linux/uaccess.h>
26#include <linux/platform_device.h>
27
28/*
29 * Cursor position address
30 * \X 0 1 2 ... 14 15
31 * Y+----+----+----+---+----+----+
32 * 0|0x00|0x01|0x02|...|0x0e|0x0f|
33 * +----+----+----+---+----+----+
34 * 1|0x40|0x41|0x42|...|0x4e|0x4f|
35 * +----+----+----+---+----+----+
36 */
37#define LCD_DATA_REG_OFFSET 0x10
38#define LCD_XRES_MAX 16
39#define LCD_YRES_MAX 2
40#define LCD_CHARS_MAX 32
41
42#define LCD_CLEAR 0x01
43#define LCD_CURSOR_MOVE_HOME 0x02
44#define LCD_RESET 0x06
45#define LCD_OFF 0x08
46#define LCD_CURSOR_OFF 0x0c
47#define LCD_CURSOR_BLINK_OFF 0x0e
48#define LCD_CURSOR_ON 0x0f
49#define LCD_ON LCD_CURSOR_ON
50#define LCD_CURSOR_MOVE_LEFT 0x10
51#define LCD_CURSOR_MOVE_RIGHT 0x14
52#define LCD_DISPLAY_LEFT 0x18
53#define LCD_DISPLAY_RIGHT 0x1c
54#define LCD_PRERESET 0x3f /* execute 4 times continuously */
55#define LCD_BUSY 0x80
56
57#define LCD_GRAPHIC_MODE 0x40
58#define LCD_TEXT_MODE 0x80
59#define LCD_CUR_POS_MASK 0x7f
60
61#define LCD_CUR_POS(x) ((x) & LCD_CUR_POS_MASK)
62#define LCD_TEXT_POS(x) ((x) | LCD_TEXT_MODE)
63
64static inline void lcd_write_control(struct fb_info *info, u8 control)
65{
66 writel((u32)control << 24, info->screen_base);
67}
68
69static inline u8 lcd_read_control(struct fb_info *info)
70{
71 return readl(info->screen_base) >> 24;
72}
73
74static inline void lcd_write_data(struct fb_info *info, u8 data)
75{
76 writel((u32)data << 24, info->screen_base + LCD_DATA_REG_OFFSET);
77}
78
79static inline u8 lcd_read_data(struct fb_info *info)
80{
81 return readl(info->screen_base + LCD_DATA_REG_OFFSET) >> 24;
82}
83
84static int lcd_busy_wait(struct fb_info *info)
85{
86 u8 val = 0;
87 int timeout = 10, retval = 0;
88
89 do {
90 val = lcd_read_control(info);
91 val &= LCD_BUSY;
92 if (val != LCD_BUSY)
93 break;
94
95 if (msleep_interruptible(1))
96 return -EINTR;
97
98 timeout--;
99 } while (timeout);
100
101 if (val == LCD_BUSY)
102 retval = -EBUSY;
103
104 return retval;
105}
106
107static void lcd_clear(struct fb_info *info)
108{
109 int i;
110
111 for (i = 0; i < 4; i++) {
112 udelay(150);
113
114 lcd_write_control(info, LCD_PRERESET);
115 }
116
117 udelay(150);
118
119 lcd_write_control(info, LCD_CLEAR);
120
121 udelay(150);
122
123 lcd_write_control(info, LCD_RESET);
124}
125
126static struct fb_fix_screeninfo cobalt_lcdfb_fix __initdata = {
127 .id = "cobalt-lcd",
128 .type = FB_TYPE_TEXT,
129 .type_aux = FB_AUX_TEXT_MDA,
130 .visual = FB_VISUAL_MONO01,
131 .line_length = LCD_XRES_MAX,
132 .accel = FB_ACCEL_NONE,
133};
134
135static ssize_t cobalt_lcdfb_read(struct fb_info *info, char __user *buf,
136 size_t count, loff_t *ppos)
137{
138 char src[LCD_CHARS_MAX];
139 unsigned long pos;
140 int len, retval = 0;
141
142 pos = *ppos;
143 if (pos >= LCD_CHARS_MAX || count == 0)
144 return 0;
145
146 if (count > LCD_CHARS_MAX)
147 count = LCD_CHARS_MAX;
148
149 if (pos + count > LCD_CHARS_MAX)
150 count = LCD_CHARS_MAX - pos;
151
152 for (len = 0; len < count; len++) {
153 retval = lcd_busy_wait(info);
154 if (retval < 0)
155 break;
156
157 lcd_write_control(info, LCD_TEXT_POS(pos));
158
159 retval = lcd_busy_wait(info);
160 if (retval < 0)
161 break;
162
163 src[len] = lcd_read_data(info);
164 if (pos == 0x0f)
165 pos = 0x40;
166 else
167 pos++;
168 }
169
170 if (retval < 0 && signal_pending(current))
171 return -ERESTARTSYS;
172
173 if (copy_to_user(buf, src, len))
174 return -EFAULT;
175
176 *ppos += len;
177
178 return len;
179}
180
181static ssize_t cobalt_lcdfb_write(struct fb_info *info, const char __user *buf,
182 size_t count, loff_t *ppos)
183{
184 char dst[LCD_CHARS_MAX];
185 unsigned long pos;
186 int len, retval = 0;
187
188 pos = *ppos;
189 if (pos >= LCD_CHARS_MAX || count == 0)
190 return 0;
191
192 if (count > LCD_CHARS_MAX)
193 count = LCD_CHARS_MAX;
194
195 if (pos + count > LCD_CHARS_MAX)
196 count = LCD_CHARS_MAX - pos;
197
198 if (copy_from_user(dst, buf, count))
199 return -EFAULT;
200
201 for (len = 0; len < count; len++) {
202 retval = lcd_busy_wait(info);
203 if (retval < 0)
204 break;
205
206 lcd_write_control(info, LCD_TEXT_POS(pos));
207
208 retval = lcd_busy_wait(info);
209 if (retval < 0)
210 break;
211
212 lcd_write_data(info, dst[len]);
213 if (pos == 0x0f)
214 pos = 0x40;
215 else
216 pos++;
217 }
218
219 if (retval < 0 && signal_pending(current))
220 return -ERESTARTSYS;
221
222 *ppos += len;
223
224 return len;
225}
226
227static int cobalt_lcdfb_blank(int blank_mode, struct fb_info *info)
228{
229 int retval;
230
231 retval = lcd_busy_wait(info);
232 if (retval < 0)
233 return retval;
234
235 switch (blank_mode) {
236 case FB_BLANK_UNBLANK:
237 lcd_write_control(info, LCD_ON);
238 break;
239 default:
240 lcd_write_control(info, LCD_OFF);
241 break;
242 }
243
244 return 0;
245}
246
247static int cobalt_lcdfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
248{
249 u32 x, y;
250 int retval;
251
252 switch (cursor->set) {
253 case FB_CUR_SETPOS:
254 x = cursor->image.dx;
255 y = cursor->image.dy;
256 if (x >= LCD_XRES_MAX || y >= LCD_YRES_MAX)
257 return -EINVAL;
258
259 retval = lcd_busy_wait(info);
260 if (retval < 0)
261 return retval;
262
263 lcd_write_control(info,
264 LCD_TEXT_POS(info->fix.line_length * y + x));
265 break;
266 default:
267 return -EINVAL;
268 }
269
270 retval = lcd_busy_wait(info);
271 if (retval < 0)
272 return retval;
273
274 if (cursor->enable)
275 lcd_write_control(info, LCD_CURSOR_ON);
276 else
277 lcd_write_control(info, LCD_CURSOR_OFF);
278
279 return 0;
280}
281
282static struct fb_ops cobalt_lcd_fbops = {
283 .owner = THIS_MODULE,
284 .fb_read = cobalt_lcdfb_read,
285 .fb_write = cobalt_lcdfb_write,
286 .fb_blank = cobalt_lcdfb_blank,
287 .fb_cursor = cobalt_lcdfb_cursor,
288};
289
290static int __init cobalt_lcdfb_probe(struct platform_device *dev)
291{
292 struct fb_info *info;
293 struct resource *res;
294 int retval;
295
296 info = framebuffer_alloc(0, &dev->dev);
297 if (!info)
298 return -ENOMEM;
299
300 res = platform_get_resource(dev, IORESOURCE_MEM, 0);
301 if (!res) {
302 framebuffer_release(info);
303 return -EBUSY;
304 }
305
306 info->screen_size = res->end - res->start + 1;
307 info->screen_base = ioremap(res->start, info->screen_size);
308 info->fbops = &cobalt_lcd_fbops;
309 info->fix = cobalt_lcdfb_fix;
310 info->fix.smem_start = res->start;
311 info->fix.smem_len = info->screen_size;
312 info->pseudo_palette = NULL;
313 info->par = NULL;
314 info->flags = FBINFO_DEFAULT;
315
316 retval = register_framebuffer(info);
317 if (retval < 0) {
318 iounmap(info->screen_base);
319 framebuffer_release(info);
320 return retval;
321 }
322
323 platform_set_drvdata(dev, info);
324
325 lcd_clear(info);
326
327 printk(KERN_INFO "fb%d: Cobalt server LCD frame buffer device\n",
328 info->node);
329
330 return 0;
331}
332
333static int __devexit cobalt_lcdfb_remove(struct platform_device *dev)
334{
335 struct fb_info *info;
336
337 info = platform_get_drvdata(dev);
338 if (info) {
339 iounmap(info->screen_base);
340 unregister_framebuffer(info);
341 framebuffer_release(info);
342 }
343
344 return 0;
345}
346
347static struct platform_driver cobalt_lcdfb_driver = {
348 .probe = cobalt_lcdfb_probe,
349 .remove = __devexit_p(cobalt_lcdfb_remove),
350 .driver = {
351 .name = "cobalt-lcd",
352 .owner = THIS_MODULE,
353 },
354};
355
356static int __init cobalt_lcdfb_init(void)
357{
358 return platform_driver_register(&cobalt_lcdfb_driver);
359}
360
361static void __exit cobalt_lcdfb_exit(void)
362{
363 platform_driver_unregister(&cobalt_lcdfb_driver);
364}
365
366module_init(cobalt_lcdfb_init);
367module_exit(cobalt_lcdfb_exit);
368
369MODULE_LICENSE("GPL v2");
370MODULE_AUTHOR("Yoichi Yuasa");
371MODULE_DESCRIPTION("Cobalt server LCD frame buffer driver");
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 97aff8db10bf..3ccfa76d9b2a 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -107,9 +107,7 @@ static struct display fb_display[MAX_NR_CONSOLES];
107 107
108static signed char con2fb_map[MAX_NR_CONSOLES]; 108static signed char con2fb_map[MAX_NR_CONSOLES];
109static signed char con2fb_map_boot[MAX_NR_CONSOLES]; 109static signed char con2fb_map_boot[MAX_NR_CONSOLES];
110#ifndef MODULE 110
111static int logo_height;
112#endif
113static int logo_lines; 111static int logo_lines;
114/* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO 112/* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO
115 enums. */ 113 enums. */
@@ -607,6 +605,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
607 struct fbcon_ops *ops = info->fbcon_par; 605 struct fbcon_ops *ops = info->fbcon_par;
608 int cnt, erase = vc->vc_video_erase_char, step; 606 int cnt, erase = vc->vc_video_erase_char, step;
609 unsigned short *save = NULL, *r, *q; 607 unsigned short *save = NULL, *r, *q;
608 int logo_height;
610 609
611 if (info->flags & FBINFO_MODULE) { 610 if (info->flags & FBINFO_MODULE) {
612 logo_shown = FBCON_LOGO_DONTSHOW; 611 logo_shown = FBCON_LOGO_DONTSHOW;
@@ -3586,7 +3585,8 @@ static int __init fb_console_init(void)
3586 3585
3587 acquire_console_sem(); 3586 acquire_console_sem();
3588 fb_register_client(&fbcon_event_notifier); 3587 fb_register_client(&fbcon_event_notifier);
3589 fbcon_device = device_create(fb_class, NULL, MKDEV(0, 0), "fbcon"); 3588 fbcon_device = device_create_drvdata(fb_class, NULL, MKDEV(0, 0),
3589 NULL, "fbcon");
3590 3590
3591 if (IS_ERR(fbcon_device)) { 3591 if (IS_ERR(fbcon_device)) {
3592 printk(KERN_WARNING "Unable to create device " 3592 printk(KERN_WARNING "Unable to create device "
diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h
index 0135e0395456..de1b1365279b 100644
--- a/drivers/video/console/fbcon.h
+++ b/drivers/video/console/fbcon.h
@@ -92,7 +92,7 @@ struct fbcon_ops {
92#define attr_fgcol(fgshift,s) \ 92#define attr_fgcol(fgshift,s) \
93 (((s) >> (fgshift)) & 0x0f) 93 (((s) >> (fgshift)) & 0x0f)
94#define attr_bgcol(bgshift,s) \ 94#define attr_bgcol(bgshift,s) \
95 (((s) >> (bgshift)) & 0x0f) 95 (((s) >> (bgshift)) & 0x07)
96 96
97/* Monochrome */ 97/* Monochrome */
98#define attr_bold(s) \ 98#define attr_bold(s) \
@@ -146,10 +146,8 @@ static inline int attr_col_ec(int shift, struct vc_data *vc,
146 return is_fg ? fg : bg; 146 return is_fg ? fg : bg;
147} 147}
148 148
149#define attr_bgcol_ec(bgshift,vc,info) \ 149#define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0)
150 attr_col_ec(bgshift,vc,info,0); 150#define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1)
151#define attr_fgcol_ec(fgshift,vc,info) \
152 attr_col_ec(fgshift,vc,info,1);
153 151
154/* Font */ 152/* Font */
155#define REFCOUNT(fd) (((int *)(fd))[-1]) 153#define REFCOUNT(fd) (((int *)(fd))[-1])
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
index 38a296bbdfc9..9901064199bd 100644
--- a/drivers/video/console/mdacon.c
+++ b/drivers/video/console/mdacon.c
@@ -71,13 +71,15 @@ static char *mda_type_name;
71 71
72/* console information */ 72/* console information */
73 73
74static int mda_first_vc = 1; 74static int mda_first_vc = 13;
75static int mda_last_vc = 16; 75static int mda_last_vc = 16;
76 76
77static struct vc_data *mda_display_fg = NULL; 77static struct vc_data *mda_display_fg = NULL;
78 78
79module_param(mda_first_vc, int, 0); 79module_param(mda_first_vc, int, 0);
80MODULE_PARM_DESC(mda_first_vc, "First virtual console. Default: 13");
80module_param(mda_last_vc, int, 0); 81module_param(mda_last_vc, int, 0);
82MODULE_PARM_DESC(mda_last_vc, "Last virtual console. Default: 16");
81 83
82/* MDA register values 84/* MDA register values
83 */ 85 */
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
index 33ebdb198daf..5d84b3431098 100644
--- a/drivers/video/fbmem.c
+++ b/drivers/video/fbmem.c
@@ -35,6 +35,7 @@
35#include <linux/device.h> 35#include <linux/device.h>
36#include <linux/efi.h> 36#include <linux/efi.h>
37#include <linux/fb.h> 37#include <linux/fb.h>
38#include <linux/major.h>
38 39
39#include <asm/fb.h> 40#include <asm/fb.h>
40 41
@@ -848,9 +849,8 @@ int
848fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) 849fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
849{ 850{
850 struct fb_fix_screeninfo *fix = &info->fix; 851 struct fb_fix_screeninfo *fix = &info->fix;
851 int xoffset = var->xoffset; 852 unsigned int yres = info->var.yres;
852 int yoffset = var->yoffset; 853 int err = 0;
853 int err = 0, yres = info->var.yres;
854 854
855 if (var->yoffset > 0) { 855 if (var->yoffset > 0) {
856 if (var->vmode & FB_VMODE_YWRAP) { 856 if (var->vmode & FB_VMODE_YWRAP) {
@@ -866,8 +866,8 @@ fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
866 (var->xoffset % fix->xpanstep))) 866 (var->xoffset % fix->xpanstep)))
867 err = -EINVAL; 867 err = -EINVAL;
868 868
869 if (err || !info->fbops->fb_pan_display || xoffset < 0 || 869 if (err || !info->fbops->fb_pan_display ||
870 yoffset < 0 || var->yoffset + yres > info->var.yres_virtual || 870 var->yoffset + yres > info->var.yres_virtual ||
871 var->xoffset + info->var.xres > info->var.xres_virtual) 871 var->xoffset + info->var.xres > info->var.xres_virtual)
872 return -EINVAL; 872 return -EINVAL;
873 873
@@ -1439,8 +1439,9 @@ register_framebuffer(struct fb_info *fb_info)
1439 break; 1439 break;
1440 fb_info->node = i; 1440 fb_info->node = i;
1441 1441
1442 fb_info->dev = device_create(fb_class, fb_info->device, 1442 fb_info->dev = device_create_drvdata(fb_class, fb_info->device,
1443 MKDEV(FB_MAJOR, i), "fb%d", i); 1443 MKDEV(FB_MAJOR, i), NULL,
1444 "fb%d", i);
1444 if (IS_ERR(fb_info->dev)) { 1445 if (IS_ERR(fb_info->dev)) {
1445 /* Not fatal */ 1446 /* Not fatal */
1446 printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev)); 1447 printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
index 052e18058498..6a0aa180c266 100644
--- a/drivers/video/fbmon.c
+++ b/drivers/video/fbmon.c
@@ -879,7 +879,7 @@ int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
879 if (edid_is_timing_block(block)) { 879 if (edid_is_timing_block(block)) {
880 var->xres = var->xres_virtual = H_ACTIVE; 880 var->xres = var->xres_virtual = H_ACTIVE;
881 var->yres = var->yres_virtual = V_ACTIVE; 881 var->yres = var->yres_virtual = V_ACTIVE;
882 var->height = var->width = -1; 882 var->height = var->width = 0;
883 var->right_margin = H_SYNC_OFFSET; 883 var->right_margin = H_SYNC_OFFSET;
884 var->left_margin = (H_ACTIVE + H_BLANKING) - 884 var->left_margin = (H_ACTIVE + H_BLANKING) -
885 (H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH); 885 (H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH);
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c
index 09d7e22c6fef..9cd36c223d33 100644
--- a/drivers/video/fsl-diu-fb.c
+++ b/drivers/video/fsl-diu-fb.c
@@ -279,58 +279,42 @@ static struct diu_hw dr = {
279 279
280static struct diu_pool pool; 280static struct diu_pool pool;
281 281
282/* To allocate memory for framebuffer. First try __get_free_pages(). If it 282/**
283 * fails, try rh_alloc. The reason is __get_free_pages() cannot allocate 283 * fsl_diu_alloc - allocate memory for the DIU
284 * very large memory (more than 4MB). We don't want to allocate all memory 284 * @size: number of bytes to allocate
285 * in rheap since small memory allocation/deallocation will fragment the 285 * @param: returned physical address of memory
286 * rheap and make the furture large allocation fail. 286 *
287 * This function allocates a physically-contiguous block of memory.
287 */ 288 */
288 289static void *fsl_diu_alloc(size_t size, phys_addr_t *phys)
289static void *fsl_diu_alloc(unsigned long size, phys_addr_t *phys)
290{ 290{
291 void *virt; 291 void *virt;
292 292
293 pr_debug("size=%lu\n", size); 293 pr_debug("size=%zu\n", size);
294 294
295 virt = (void *)__get_free_pages(GFP_DMA | __GFP_ZERO, get_order(size)); 295 virt = alloc_pages_exact(size, GFP_DMA | __GFP_ZERO);
296 if (virt) { 296 if (virt) {
297 *phys = virt_to_phys(virt); 297 *phys = virt_to_phys(virt);
298 pr_debug("virt %p, phys=%llx\n", virt, (uint64_t) *phys); 298 pr_debug("virt=%p phys=%llx\n", virt,
299 return virt; 299 (unsigned long long)*phys);
300 }
301 if (!diu_ops.diu_mem) {
302 printk(KERN_INFO "%s: no diu_mem."
303 " To reserve more memory, put 'diufb=15M' "
304 "in the command line\n", __func__);
305 return NULL;
306 }
307
308 virt = (void *)rh_alloc(&diu_ops.diu_rh_info, size, "DIU");
309 if (virt) {
310 *phys = virt_to_bus(virt);
311 memset(virt, 0, size);
312 } 300 }
313 301
314 pr_debug("rh virt=%p phys=%llx\n", virt, (unsigned long long)*phys);
315
316 return virt; 302 return virt;
317} 303}
318 304
319static void fsl_diu_free(void *p, unsigned long size) 305/**
306 * fsl_diu_free - release DIU memory
307 * @virt: pointer returned by fsl_diu_alloc()
308 * @size: number of bytes allocated by fsl_diu_alloc()
309 *
310 * This function releases memory allocated by fsl_diu_alloc().
311 */
312static void fsl_diu_free(void *virt, size_t size)
320{ 313{
321 pr_debug("p=%p size=%lu\n", p, size); 314 pr_debug("virt=%p size=%zu\n", virt, size);
322 315
323 if (!p) 316 if (virt && size)
324 return; 317 free_pages_exact(virt, size);
325
326 if ((p >= diu_ops.diu_mem) &&
327 (p < (diu_ops.diu_mem + diu_ops.diu_size))) {
328 pr_debug("rh\n");
329 rh_free(&diu_ops.diu_rh_info, (unsigned long) p);
330 } else {
331 pr_debug("dma\n");
332 free_pages((unsigned long)p, get_order(size));
333 }
334} 318}
335 319
336static int fsl_diu_enable_panel(struct fb_info *info) 320static int fsl_diu_enable_panel(struct fb_info *info)
diff --git a/drivers/video/geode/lxfb.h b/drivers/video/geode/lxfb.h
index 3b9416f4ee20..6a51448fd3f7 100644
--- a/drivers/video/geode/lxfb.h
+++ b/drivers/video/geode/lxfb.h
@@ -51,8 +51,6 @@ static inline unsigned int lx_get_pitch(unsigned int xres, int bpp)
51} 51}
52 52
53void lx_set_mode(struct fb_info *); 53void lx_set_mode(struct fb_info *);
54void lx_get_gamma(struct fb_info *, unsigned int *, int);
55void lx_set_gamma(struct fb_info *, unsigned int *, int);
56unsigned int lx_framebuffer_size(void); 54unsigned int lx_framebuffer_size(void);
57int lx_blank_display(struct fb_info *, int); 55int lx_blank_display(struct fb_info *, int);
58void lx_set_palette_reg(struct fb_info *, unsigned int, unsigned int, 56void lx_set_palette_reg(struct fb_info *, unsigned int, unsigned int,
diff --git a/drivers/video/geode/lxfb_ops.c b/drivers/video/geode/lxfb_ops.c
index aaef9165ec9b..b1cd49c99356 100644
--- a/drivers/video/geode/lxfb_ops.c
+++ b/drivers/video/geode/lxfb_ops.c
@@ -517,25 +517,25 @@ void lx_set_palette_reg(struct fb_info *info, unsigned regno,
517int lx_blank_display(struct fb_info *info, int blank_mode) 517int lx_blank_display(struct fb_info *info, int blank_mode)
518{ 518{
519 struct lxfb_par *par = info->par; 519 struct lxfb_par *par = info->par;
520 u32 dcfg, fp_pm; 520 u32 dcfg, misc, fp_pm;
521 int blank, hsync, vsync, crt; 521 int blank, hsync, vsync;
522 522
523 /* CRT power saving modes. */ 523 /* CRT power saving modes. */
524 switch (blank_mode) { 524 switch (blank_mode) {
525 case FB_BLANK_UNBLANK: 525 case FB_BLANK_UNBLANK:
526 blank = 0; hsync = 1; vsync = 1; crt = 1; 526 blank = 0; hsync = 1; vsync = 1;
527 break; 527 break;
528 case FB_BLANK_NORMAL: 528 case FB_BLANK_NORMAL:
529 blank = 1; hsync = 1; vsync = 1; crt = 1; 529 blank = 1; hsync = 1; vsync = 1;
530 break; 530 break;
531 case FB_BLANK_VSYNC_SUSPEND: 531 case FB_BLANK_VSYNC_SUSPEND:
532 blank = 1; hsync = 1; vsync = 0; crt = 1; 532 blank = 1; hsync = 1; vsync = 0;
533 break; 533 break;
534 case FB_BLANK_HSYNC_SUSPEND: 534 case FB_BLANK_HSYNC_SUSPEND:
535 blank = 1; hsync = 0; vsync = 1; crt = 1; 535 blank = 1; hsync = 0; vsync = 1;
536 break; 536 break;
537 case FB_BLANK_POWERDOWN: 537 case FB_BLANK_POWERDOWN:
538 blank = 1; hsync = 0; vsync = 0; crt = 0; 538 blank = 1; hsync = 0; vsync = 0;
539 break; 539 break;
540 default: 540 default:
541 return -EINVAL; 541 return -EINVAL;
@@ -545,15 +545,23 @@ int lx_blank_display(struct fb_info *info, int blank_mode)
545 dcfg &= ~(VP_DCFG_DAC_BL_EN | VP_DCFG_HSYNC_EN | VP_DCFG_VSYNC_EN | 545 dcfg &= ~(VP_DCFG_DAC_BL_EN | VP_DCFG_HSYNC_EN | VP_DCFG_VSYNC_EN |
546 VP_DCFG_CRT_EN); 546 VP_DCFG_CRT_EN);
547 if (!blank) 547 if (!blank)
548 dcfg |= VP_DCFG_DAC_BL_EN; 548 dcfg |= VP_DCFG_DAC_BL_EN | VP_DCFG_CRT_EN;
549 if (hsync) 549 if (hsync)
550 dcfg |= VP_DCFG_HSYNC_EN; 550 dcfg |= VP_DCFG_HSYNC_EN;
551 if (vsync) 551 if (vsync)
552 dcfg |= VP_DCFG_VSYNC_EN; 552 dcfg |= VP_DCFG_VSYNC_EN;
553 if (crt) 553
554 dcfg |= VP_DCFG_CRT_EN;
555 write_vp(par, VP_DCFG, dcfg); 554 write_vp(par, VP_DCFG, dcfg);
556 555
556 misc = read_vp(par, VP_MISC);
557
558 if (vsync && hsync)
559 misc &= ~VP_MISC_DACPWRDN;
560 else
561 misc |= VP_MISC_DACPWRDN;
562
563 write_vp(par, VP_MISC, misc);
564
557 /* Power on/off flat panel */ 565 /* Power on/off flat panel */
558 566
559 if (par->output & OUTPUT_PANEL) { 567 if (par->output & OUTPUT_PANEL) {
diff --git a/drivers/video/hgafb.c b/drivers/video/hgafb.c
index c18880d9db1f..0129c044f6d6 100644
--- a/drivers/video/hgafb.c
+++ b/drivers/video/hgafb.c
@@ -551,7 +551,7 @@ static struct fb_ops hgafb_ops = {
551 * Initialization 551 * Initialization
552 */ 552 */
553 553
554static int __init hgafb_probe(struct device *device) 554static int __init hgafb_probe(struct platform_device *pdev)
555{ 555{
556 struct fb_info *info; 556 struct fb_info *info;
557 557
@@ -565,7 +565,7 @@ static int __init hgafb_probe(struct device *device)
565 printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n", 565 printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n",
566 hga_type_name, hga_vram_len/1024); 566 hga_type_name, hga_vram_len/1024);
567 567
568 info = framebuffer_alloc(0, NULL); 568 info = framebuffer_alloc(0, &pdev->dev);
569 if (!info) { 569 if (!info) {
570 iounmap(hga_vram); 570 iounmap(hga_vram);
571 return -ENOMEM; 571 return -ENOMEM;
@@ -593,13 +593,13 @@ static int __init hgafb_probe(struct device *device)
593 593
594 printk(KERN_INFO "fb%d: %s frame buffer device\n", 594 printk(KERN_INFO "fb%d: %s frame buffer device\n",
595 info->node, info->fix.id); 595 info->node, info->fix.id);
596 dev_set_drvdata(device, info); 596 platform_set_drvdata(pdev, info);
597 return 0; 597 return 0;
598} 598}
599 599
600static int hgafb_remove(struct device *device) 600static int hgafb_remove(struct platform_device *pdev)
601{ 601{
602 struct fb_info *info = dev_get_drvdata(device); 602 struct fb_info *info = platform_get_drvdata(pdev);
603 603
604 hga_txt_mode(); 604 hga_txt_mode();
605 hga_clear_screen(); 605 hga_clear_screen();
@@ -620,16 +620,15 @@ static int hgafb_remove(struct device *device)
620 return 0; 620 return 0;
621} 621}
622 622
623static struct device_driver hgafb_driver = { 623static struct platform_driver hgafb_driver = {
624 .name = "hgafb",
625 .bus = &platform_bus_type,
626 .probe = hgafb_probe, 624 .probe = hgafb_probe,
627 .remove = hgafb_remove, 625 .remove = hgafb_remove,
626 .driver = {
627 .name = "hgafb",
628 },
628}; 629};
629 630
630static struct platform_device hgafb_device = { 631static struct platform_device *hgafb_device;
631 .name = "hgafb",
632};
633 632
634static int __init hgafb_init(void) 633static int __init hgafb_init(void)
635{ 634{
@@ -638,12 +637,15 @@ static int __init hgafb_init(void)
638 if (fb_get_options("hgafb", NULL)) 637 if (fb_get_options("hgafb", NULL))
639 return -ENODEV; 638 return -ENODEV;
640 639
641 ret = driver_register(&hgafb_driver); 640 ret = platform_driver_register(&hgafb_driver);
642 641
643 if (!ret) { 642 if (!ret) {
644 ret = platform_device_register(&hgafb_device); 643 hgafb_device = platform_device_register_simple("hgafb", 0, NULL, 0);
645 if (ret) 644
646 driver_unregister(&hgafb_driver); 645 if (IS_ERR(hgafb_device)) {
646 platform_driver_unregister(&hgafb_driver);
647 ret = PTR_ERR(hgafb_device);
648 }
647 } 649 }
648 650
649 return ret; 651 return ret;
@@ -651,8 +653,8 @@ static int __init hgafb_init(void)
651 653
652static void __exit hgafb_exit(void) 654static void __exit hgafb_exit(void)
653{ 655{
654 platform_device_unregister(&hgafb_device); 656 platform_device_unregister(hgafb_device);
655 driver_unregister(&hgafb_driver); 657 platform_driver_unregister(&hgafb_driver);
656} 658}
657 659
658/* ------------------------------------------------------------------------- 660/* -------------------------------------------------------------------------
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c
index 94e4d3ac1a05..0c5a475c1cae 100644
--- a/drivers/video/imxfb.c
+++ b/drivers/video/imxfb.c
@@ -24,6 +24,7 @@
24#include <linux/string.h> 24#include <linux/string.h>
25#include <linux/interrupt.h> 25#include <linux/interrupt.h>
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/mm.h>
27#include <linux/fb.h> 28#include <linux/fb.h>
28#include <linux/delay.h> 29#include <linux/delay.h>
29#include <linux/init.h> 30#include <linux/init.h>
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c
index 5246b0402d76..25172b2a2a94 100644
--- a/drivers/video/neofb.c
+++ b/drivers/video/neofb.c
@@ -201,7 +201,6 @@ static int neoFindMode(int xres, int yres, int depth)
201 * 201 *
202 * Determine the closest clock frequency to the one requested. 202 * Determine the closest clock frequency to the one requested.
203 */ 203 */
204#define REF_FREQ 0xe517 /* 14.31818 in 20.12 fixed point */
205#define MAX_N 127 204#define MAX_N 127
206#define MAX_D 31 205#define MAX_D 31
207#define MAX_F 1 206#define MAX_F 1
@@ -211,27 +210,24 @@ static void neoCalcVCLK(const struct fb_info *info,
211{ 210{
212 int n, d, f; 211 int n, d, f;
213 int n_best = 0, d_best = 0, f_best = 0; 212 int n_best = 0, d_best = 0, f_best = 0;
214 long f_best_diff = (0x7ffff << 12); /* 20.12 */ 213 long f_best_diff = 0x7ffff;
215 long f_target = (freq << 12) / 1000; /* 20.12 */
216 214
217 for (f = 0; f <= MAX_F; f++) 215 for (f = 0; f <= MAX_F; f++)
218 for (n = 0; n <= MAX_N; n++) 216 for (d = 0; d <= MAX_D; d++)
219 for (d = 0; d <= MAX_D; d++) { 217 for (n = 0; n <= MAX_N; n++) {
220 long f_out; /* 20.12 */ 218 long f_out;
221 long f_diff; /* 20.12 */ 219 long f_diff;
222 220
223 f_out = 221 f_out = ((14318 * (n + 1)) / (d + 1)) >> f;
224 ((((n + 1) << 12) / ((d + 222 f_diff = abs(f_out - freq);
225 1) * 223 if (f_diff <= f_best_diff) {
226 (1 << f))) >> 12)
227 * REF_FREQ;
228 f_diff = abs(f_out - f_target);
229 if (f_diff < f_best_diff) {
230 f_best_diff = f_diff; 224 f_best_diff = f_diff;
231 n_best = n; 225 n_best = n;
232 d_best = d; 226 d_best = d;
233 f_best = f; 227 f_best = f;
234 } 228 }
229 if (f_out > freq)
230 break;
235 } 231 }
236 232
237 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || 233 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 ||
@@ -248,11 +244,11 @@ static void neoCalcVCLK(const struct fb_info *info,
248 par->VCLK3Denominator = d_best; 244 par->VCLK3Denominator = d_best;
249 245
250#ifdef NEOFB_DEBUG 246#ifdef NEOFB_DEBUG
251 printk("neoVCLK: f:%d NumLow=%d NumHi=%d Den=%d Df=%d\n", 247 printk(KERN_DEBUG "neoVCLK: f:%ld NumLow=%d NumHi=%d Den=%d Df=%ld\n",
252 f_target >> 12, 248 freq,
253 par->VCLK3NumeratorLow, 249 par->VCLK3NumeratorLow,
254 par->VCLK3NumeratorHigh, 250 par->VCLK3NumeratorHigh,
255 par->VCLK3Denominator, f_best_diff >> 12); 251 par->VCLK3Denominator, f_best_diff);
256#endif 252#endif
257} 253}
258 254
@@ -263,15 +259,20 @@ static void neoCalcVCLK(const struct fb_info *info,
263 */ 259 */
264 260
265static int vgaHWInit(const struct fb_var_screeninfo *var, 261static int vgaHWInit(const struct fb_var_screeninfo *var,
266 const struct fb_info *info, 262 struct neofb_par *par)
267 struct neofb_par *par, struct xtimings *timings)
268{ 263{
264 int hsync_end = var->xres + var->right_margin + var->hsync_len;
265 int htotal = (hsync_end + var->left_margin) >> 3;
266 int vsync_start = var->yres + var->lower_margin;
267 int vsync_end = vsync_start + var->vsync_len;
268 int vtotal = vsync_end + var->upper_margin;
269
269 par->MiscOutReg = 0x23; 270 par->MiscOutReg = 0x23;
270 271
271 if (!(timings->sync & FB_SYNC_HOR_HIGH_ACT)) 272 if (!(var->sync & FB_SYNC_HOR_HIGH_ACT))
272 par->MiscOutReg |= 0x40; 273 par->MiscOutReg |= 0x40;
273 274
274 if (!(timings->sync & FB_SYNC_VERT_HIGH_ACT)) 275 if (!(var->sync & FB_SYNC_VERT_HIGH_ACT))
275 par->MiscOutReg |= 0x80; 276 par->MiscOutReg |= 0x80;
276 277
277 /* 278 /*
@@ -286,25 +287,25 @@ static int vgaHWInit(const struct fb_var_screeninfo *var,
286 /* 287 /*
287 * CRTC Controller 288 * CRTC Controller
288 */ 289 */
289 par->CRTC[0] = (timings->HTotal >> 3) - 5; 290 par->CRTC[0] = htotal - 5;
290 par->CRTC[1] = (timings->HDisplay >> 3) - 1; 291 par->CRTC[1] = (var->xres >> 3) - 1;
291 par->CRTC[2] = (timings->HDisplay >> 3) - 1; 292 par->CRTC[2] = (var->xres >> 3) - 1;
292 par->CRTC[3] = (((timings->HTotal >> 3) - 1) & 0x1F) | 0x80; 293 par->CRTC[3] = ((htotal - 1) & 0x1F) | 0x80;
293 par->CRTC[4] = (timings->HSyncStart >> 3); 294 par->CRTC[4] = ((var->xres + var->right_margin) >> 3);
294 par->CRTC[5] = ((((timings->HTotal >> 3) - 1) & 0x20) << 2) 295 par->CRTC[5] = (((htotal - 1) & 0x20) << 2)
295 | (((timings->HSyncEnd >> 3)) & 0x1F); 296 | (((hsync_end >> 3)) & 0x1F);
296 par->CRTC[6] = (timings->VTotal - 2) & 0xFF; 297 par->CRTC[6] = (vtotal - 2) & 0xFF;
297 par->CRTC[7] = (((timings->VTotal - 2) & 0x100) >> 8) 298 par->CRTC[7] = (((vtotal - 2) & 0x100) >> 8)
298 | (((timings->VDisplay - 1) & 0x100) >> 7) 299 | (((var->yres - 1) & 0x100) >> 7)
299 | ((timings->VSyncStart & 0x100) >> 6) 300 | ((vsync_start & 0x100) >> 6)
300 | (((timings->VDisplay - 1) & 0x100) >> 5) 301 | (((var->yres - 1) & 0x100) >> 5)
301 | 0x10 | (((timings->VTotal - 2) & 0x200) >> 4) 302 | 0x10 | (((vtotal - 2) & 0x200) >> 4)
302 | (((timings->VDisplay - 1) & 0x200) >> 3) 303 | (((var->yres - 1) & 0x200) >> 3)
303 | ((timings->VSyncStart & 0x200) >> 2); 304 | ((vsync_start & 0x200) >> 2);
304 par->CRTC[8] = 0x00; 305 par->CRTC[8] = 0x00;
305 par->CRTC[9] = (((timings->VDisplay - 1) & 0x200) >> 4) | 0x40; 306 par->CRTC[9] = (((var->yres - 1) & 0x200) >> 4) | 0x40;
306 307
307 if (timings->dblscan) 308 if (var->vmode & FB_VMODE_DOUBLE)
308 par->CRTC[9] |= 0x80; 309 par->CRTC[9] |= 0x80;
309 310
310 par->CRTC[10] = 0x00; 311 par->CRTC[10] = 0x00;
@@ -313,13 +314,13 @@ static int vgaHWInit(const struct fb_var_screeninfo *var,
313 par->CRTC[13] = 0x00; 314 par->CRTC[13] = 0x00;
314 par->CRTC[14] = 0x00; 315 par->CRTC[14] = 0x00;
315 par->CRTC[15] = 0x00; 316 par->CRTC[15] = 0x00;
316 par->CRTC[16] = timings->VSyncStart & 0xFF; 317 par->CRTC[16] = vsync_start & 0xFF;
317 par->CRTC[17] = (timings->VSyncEnd & 0x0F) | 0x20; 318 par->CRTC[17] = (vsync_end & 0x0F) | 0x20;
318 par->CRTC[18] = (timings->VDisplay - 1) & 0xFF; 319 par->CRTC[18] = (var->yres - 1) & 0xFF;
319 par->CRTC[19] = var->xres_virtual >> 4; 320 par->CRTC[19] = var->xres_virtual >> 4;
320 par->CRTC[20] = 0x00; 321 par->CRTC[20] = 0x00;
321 par->CRTC[21] = (timings->VDisplay - 1) & 0xFF; 322 par->CRTC[21] = (var->yres - 1) & 0xFF;
322 par->CRTC[22] = (timings->VTotal - 1) & 0xFF; 323 par->CRTC[22] = (vtotal - 1) & 0xFF;
323 par->CRTC[23] = 0xC3; 324 par->CRTC[23] = 0xC3;
324 par->CRTC[24] = 0xFF; 325 par->CRTC[24] = 0xFF;
325 326
@@ -483,7 +484,8 @@ static inline int neo2200_sync(struct fb_info *info)
483{ 484{
484 struct neofb_par *par = info->par; 485 struct neofb_par *par = info->par;
485 486
486 while (readl(&par->neo2200->bltStat) & 1); 487 while (readl(&par->neo2200->bltStat) & 1)
488 cpu_relax();
487 return 0; 489 return 0;
488} 490}
489 491
@@ -591,34 +593,14 @@ static int
591neofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) 593neofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
592{ 594{
593 struct neofb_par *par = info->par; 595 struct neofb_par *par = info->par;
594 unsigned int pixclock = var->pixclock;
595 struct xtimings timings;
596 int memlen, vramlen; 596 int memlen, vramlen;
597 int mode_ok = 0; 597 int mode_ok = 0;
598 598
599 DBG("neofb_check_var"); 599 DBG("neofb_check_var");
600 600
601 if (!pixclock) 601 if (PICOS2KHZ(var->pixclock) > par->maxClock)
602 pixclock = 10000; /* 10ns = 100MHz */
603 timings.pixclock = 1000000000 / pixclock;
604 if (timings.pixclock < 1)
605 timings.pixclock = 1;
606
607 if (timings.pixclock > par->maxClock)
608 return -EINVAL; 602 return -EINVAL;
609 603
610 timings.dblscan = var->vmode & FB_VMODE_DOUBLE;
611 timings.interlaced = var->vmode & FB_VMODE_INTERLACED;
612 timings.HDisplay = var->xres;
613 timings.HSyncStart = timings.HDisplay + var->right_margin;
614 timings.HSyncEnd = timings.HSyncStart + var->hsync_len;
615 timings.HTotal = timings.HSyncEnd + var->left_margin;
616 timings.VDisplay = var->yres;
617 timings.VSyncStart = timings.VDisplay + var->lower_margin;
618 timings.VSyncEnd = timings.VSyncStart + var->vsync_len;
619 timings.VTotal = timings.VSyncEnd + var->upper_margin;
620 timings.sync = var->sync;
621
622 /* Is the mode larger than the LCD panel? */ 604 /* Is the mode larger than the LCD panel? */
623 if (par->internal_display && 605 if (par->internal_display &&
624 ((var->xres > par->NeoPanelWidth) || 606 ((var->xres > par->NeoPanelWidth) ||
@@ -759,11 +741,11 @@ neofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
759static int neofb_set_par(struct fb_info *info) 741static int neofb_set_par(struct fb_info *info)
760{ 742{
761 struct neofb_par *par = info->par; 743 struct neofb_par *par = info->par;
762 struct xtimings timings;
763 unsigned char temp; 744 unsigned char temp;
764 int i, clock_hi = 0; 745 int i, clock_hi = 0;
765 int lcd_stretch; 746 int lcd_stretch;
766 int hoffset, voffset; 747 int hoffset, voffset;
748 int vsync_start, vtotal;
767 749
768 DBG("neofb_set_par"); 750 DBG("neofb_set_par");
769 751
@@ -771,28 +753,15 @@ static int neofb_set_par(struct fb_info *info)
771 753
772 vgaHWProtect(1); /* Blank the screen */ 754 vgaHWProtect(1); /* Blank the screen */
773 755
774 timings.dblscan = info->var.vmode & FB_VMODE_DOUBLE; 756 vsync_start = info->var.yres + info->var.lower_margin;
775 timings.interlaced = info->var.vmode & FB_VMODE_INTERLACED; 757 vtotal = vsync_start + info->var.vsync_len + info->var.upper_margin;
776 timings.HDisplay = info->var.xres;
777 timings.HSyncStart = timings.HDisplay + info->var.right_margin;
778 timings.HSyncEnd = timings.HSyncStart + info->var.hsync_len;
779 timings.HTotal = timings.HSyncEnd + info->var.left_margin;
780 timings.VDisplay = info->var.yres;
781 timings.VSyncStart = timings.VDisplay + info->var.lower_margin;
782 timings.VSyncEnd = timings.VSyncStart + info->var.vsync_len;
783 timings.VTotal = timings.VSyncEnd + info->var.upper_margin;
784 timings.sync = info->var.sync;
785 timings.pixclock = PICOS2KHZ(info->var.pixclock);
786
787 if (timings.pixclock < 1)
788 timings.pixclock = 1;
789 758
790 /* 759 /*
791 * This will allocate the datastructure and initialize all of the 760 * This will allocate the datastructure and initialize all of the
792 * generic VGA registers. 761 * generic VGA registers.
793 */ 762 */
794 763
795 if (vgaHWInit(&info->var, info, par, &timings)) 764 if (vgaHWInit(&info->var, par))
796 return -EINVAL; 765 return -EINVAL;
797 766
798 /* 767 /*
@@ -831,10 +800,10 @@ static int neofb_set_par(struct fb_info *info)
831 par->ExtCRTDispAddr = 0x10; 800 par->ExtCRTDispAddr = 0x10;
832 801
833 /* Vertical Extension */ 802 /* Vertical Extension */
834 par->VerticalExt = (((timings.VTotal - 2) & 0x400) >> 10) 803 par->VerticalExt = (((vtotal - 2) & 0x400) >> 10)
835 | (((timings.VDisplay - 1) & 0x400) >> 9) 804 | (((info->var.yres - 1) & 0x400) >> 9)
836 | (((timings.VSyncStart) & 0x400) >> 8) 805 | (((vsync_start) & 0x400) >> 8)
837 | (((timings.VSyncStart) & 0x400) >> 7); 806 | (((vsync_start) & 0x400) >> 7);
838 807
839 /* Fast write bursts on unless disabled. */ 808 /* Fast write bursts on unless disabled. */
840 if (par->pci_burst) 809 if (par->pci_burst)
@@ -995,7 +964,7 @@ static int neofb_set_par(struct fb_info *info)
995 * Calculate the VCLK that most closely matches the requested dot 964 * Calculate the VCLK that most closely matches the requested dot
996 * clock. 965 * clock.
997 */ 966 */
998 neoCalcVCLK(info, par, timings.pixclock); 967 neoCalcVCLK(info, par, PICOS2KHZ(info->var.pixclock));
999 968
1000 /* Since we program the clocks ourselves, always use VCLK3. */ 969 /* Since we program the clocks ourselves, always use VCLK3. */
1001 par->MiscOutReg |= 0x0C; 970 par->MiscOutReg |= 0x0C;
@@ -1927,9 +1896,6 @@ static int __devinit neo_init_hw(struct fb_info *info)
1927 int maxClock = 65000; 1896 int maxClock = 65000;
1928 int CursorMem = 1024; 1897 int CursorMem = 1024;
1929 int CursorOff = 0x100; 1898 int CursorOff = 0x100;
1930 int linearSize = 1024;
1931 int maxWidth = 1024;
1932 int maxHeight = 1024;
1933 1899
1934 DBG("neo_init_hw"); 1900 DBG("neo_init_hw");
1935 1901
@@ -1948,81 +1914,52 @@ static int __devinit neo_init_hw(struct fb_info *info)
1948 case FB_ACCEL_NEOMAGIC_NM2070: 1914 case FB_ACCEL_NEOMAGIC_NM2070:
1949 videoRam = 896; 1915 videoRam = 896;
1950 maxClock = 65000; 1916 maxClock = 65000;
1951 CursorMem = 2048;
1952 CursorOff = 0x100;
1953 linearSize = 1024;
1954 maxWidth = 1024;
1955 maxHeight = 1024;
1956 break; 1917 break;
1957 case FB_ACCEL_NEOMAGIC_NM2090: 1918 case FB_ACCEL_NEOMAGIC_NM2090:
1958 case FB_ACCEL_NEOMAGIC_NM2093: 1919 case FB_ACCEL_NEOMAGIC_NM2093:
1959 videoRam = 1152;
1960 maxClock = 80000;
1961 CursorMem = 2048;
1962 CursorOff = 0x100;
1963 linearSize = 2048;
1964 maxWidth = 1024;
1965 maxHeight = 1024;
1966 break;
1967 case FB_ACCEL_NEOMAGIC_NM2097: 1920 case FB_ACCEL_NEOMAGIC_NM2097:
1968 videoRam = 1152; 1921 videoRam = 1152;
1969 maxClock = 80000; 1922 maxClock = 80000;
1970 CursorMem = 1024;
1971 CursorOff = 0x100;
1972 linearSize = 2048;
1973 maxWidth = 1024;
1974 maxHeight = 1024;
1975 break; 1923 break;
1976 case FB_ACCEL_NEOMAGIC_NM2160: 1924 case FB_ACCEL_NEOMAGIC_NM2160:
1977 videoRam = 2048; 1925 videoRam = 2048;
1978 maxClock = 90000; 1926 maxClock = 90000;
1979 CursorMem = 1024;
1980 CursorOff = 0x100;
1981 linearSize = 2048;
1982 maxWidth = 1024;
1983 maxHeight = 1024;
1984 break; 1927 break;
1985 case FB_ACCEL_NEOMAGIC_NM2200: 1928 case FB_ACCEL_NEOMAGIC_NM2200:
1986 videoRam = 2560; 1929 videoRam = 2560;
1987 maxClock = 110000; 1930 maxClock = 110000;
1988 CursorMem = 1024;
1989 CursorOff = 0x1000;
1990 linearSize = 4096;
1991 maxWidth = 1280;
1992 maxHeight = 1024; /* ???? */
1993
1994 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase;
1995 break; 1931 break;
1996 case FB_ACCEL_NEOMAGIC_NM2230: 1932 case FB_ACCEL_NEOMAGIC_NM2230:
1997 videoRam = 3008; 1933 videoRam = 3008;
1998 maxClock = 110000; 1934 maxClock = 110000;
1999 CursorMem = 1024;
2000 CursorOff = 0x1000;
2001 linearSize = 4096;
2002 maxWidth = 1280;
2003 maxHeight = 1024; /* ???? */
2004
2005 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase;
2006 break; 1935 break;
2007 case FB_ACCEL_NEOMAGIC_NM2360: 1936 case FB_ACCEL_NEOMAGIC_NM2360:
2008 videoRam = 4096; 1937 videoRam = 4096;
2009 maxClock = 110000; 1938 maxClock = 110000;
2010 CursorMem = 1024;
2011 CursorOff = 0x1000;
2012 linearSize = 4096;
2013 maxWidth = 1280;
2014 maxHeight = 1024; /* ???? */
2015
2016 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase;
2017 break; 1939 break;
2018 case FB_ACCEL_NEOMAGIC_NM2380: 1940 case FB_ACCEL_NEOMAGIC_NM2380:
2019 videoRam = 6144; 1941 videoRam = 6144;
2020 maxClock = 110000; 1942 maxClock = 110000;
1943 break;
1944 }
1945 switch (info->fix.accel) {
1946 case FB_ACCEL_NEOMAGIC_NM2070:
1947 case FB_ACCEL_NEOMAGIC_NM2090:
1948 case FB_ACCEL_NEOMAGIC_NM2093:
1949 CursorMem = 2048;
1950 CursorOff = 0x100;
1951 break;
1952 case FB_ACCEL_NEOMAGIC_NM2097:
1953 case FB_ACCEL_NEOMAGIC_NM2160:
1954 CursorMem = 1024;
1955 CursorOff = 0x100;
1956 break;
1957 case FB_ACCEL_NEOMAGIC_NM2200:
1958 case FB_ACCEL_NEOMAGIC_NM2230:
1959 case FB_ACCEL_NEOMAGIC_NM2360:
1960 case FB_ACCEL_NEOMAGIC_NM2380:
2021 CursorMem = 1024; 1961 CursorMem = 1024;
2022 CursorOff = 0x1000; 1962 CursorOff = 0x1000;
2023 linearSize = 8192;
2024 maxWidth = 1280;
2025 maxHeight = 1024; /* ???? */
2026 1963
2027 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; 1964 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase;
2028 break; 1965 break;
@@ -2036,7 +1973,7 @@ static int __devinit neo_init_hw(struct fb_info *info)
2036*/ 1973*/
2037 par->maxClock = maxClock; 1974 par->maxClock = maxClock;
2038 par->cursorOff = CursorOff; 1975 par->cursorOff = CursorOff;
2039 return ((videoRam * 1024)); 1976 return videoRam * 1024;
2040} 1977}
2041 1978
2042 1979
diff --git a/drivers/video/offb.c b/drivers/video/offb.c
index d7b3dcc0dc43..e1d9eeb1aeaf 100644
--- a/drivers/video/offb.c
+++ b/drivers/video/offb.c
@@ -47,6 +47,7 @@ enum {
47 cmap_M3B, /* ATI Rage Mobility M3 Head B */ 47 cmap_M3B, /* ATI Rage Mobility M3 Head B */
48 cmap_radeon, /* ATI Radeon */ 48 cmap_radeon, /* ATI Radeon */
49 cmap_gxt2000, /* IBM GXT2000 */ 49 cmap_gxt2000, /* IBM GXT2000 */
50 cmap_avivo, /* ATI R5xx */
50}; 51};
51 52
52struct offb_par { 53struct offb_par {
@@ -58,26 +59,36 @@ struct offb_par {
58 59
59struct offb_par default_par; 60struct offb_par default_par;
60 61
61 /*
62 * Interface used by the world
63 */
64
65static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
66 u_int transp, struct fb_info *info);
67static int offb_blank(int blank, struct fb_info *info);
68
69#ifdef CONFIG_PPC32 62#ifdef CONFIG_PPC32
70extern boot_infos_t *boot_infos; 63extern boot_infos_t *boot_infos;
71#endif 64#endif
72 65
73static struct fb_ops offb_ops = { 66/* Definitions used by the Avivo palette hack */
74 .owner = THIS_MODULE, 67#define AVIVO_DC_LUT_RW_SELECT 0x6480
75 .fb_setcolreg = offb_setcolreg, 68#define AVIVO_DC_LUT_RW_MODE 0x6484
76 .fb_blank = offb_blank, 69#define AVIVO_DC_LUT_RW_INDEX 0x6488
77 .fb_fillrect = cfb_fillrect, 70#define AVIVO_DC_LUT_SEQ_COLOR 0x648c
78 .fb_copyarea = cfb_copyarea, 71#define AVIVO_DC_LUT_PWL_DATA 0x6490
79 .fb_imageblit = cfb_imageblit, 72#define AVIVO_DC_LUT_30_COLOR 0x6494
80}; 73#define AVIVO_DC_LUT_READ_PIPE_SELECT 0x6498
74#define AVIVO_DC_LUT_WRITE_EN_MASK 0x649c
75#define AVIVO_DC_LUT_AUTOFILL 0x64a0
76
77#define AVIVO_DC_LUTA_CONTROL 0x64c0
78#define AVIVO_DC_LUTA_BLACK_OFFSET_BLUE 0x64c4
79#define AVIVO_DC_LUTA_BLACK_OFFSET_GREEN 0x64c8
80#define AVIVO_DC_LUTA_BLACK_OFFSET_RED 0x64cc
81#define AVIVO_DC_LUTA_WHITE_OFFSET_BLUE 0x64d0
82#define AVIVO_DC_LUTA_WHITE_OFFSET_GREEN 0x64d4
83#define AVIVO_DC_LUTA_WHITE_OFFSET_RED 0x64d8
84
85#define AVIVO_DC_LUTB_CONTROL 0x6cc0
86#define AVIVO_DC_LUTB_BLACK_OFFSET_BLUE 0x6cc4
87#define AVIVO_DC_LUTB_BLACK_OFFSET_GREEN 0x6cc8
88#define AVIVO_DC_LUTB_BLACK_OFFSET_RED 0x6ccc
89#define AVIVO_DC_LUTB_WHITE_OFFSET_BLUE 0x6cd0
90#define AVIVO_DC_LUTB_WHITE_OFFSET_GREEN 0x6cd4
91#define AVIVO_DC_LUTB_WHITE_OFFSET_RED 0x6cd8
81 92
82 /* 93 /*
83 * Set a single color register. The values supplied are already 94 * Set a single color register. The values supplied are already
@@ -160,6 +171,17 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
160 out_le32(((unsigned __iomem *) par->cmap_adr) + regno, 171 out_le32(((unsigned __iomem *) par->cmap_adr) + regno,
161 (red << 16 | green << 8 | blue)); 172 (red << 16 | green << 8 | blue));
162 break; 173 break;
174 case cmap_avivo:
175 /* Write to both LUTs for now */
176 writel(1, par->cmap_adr + AVIVO_DC_LUT_RW_SELECT);
177 writeb(regno, par->cmap_adr + AVIVO_DC_LUT_RW_INDEX);
178 writel(((red) << 22) | ((green) << 12) | ((blue) << 2),
179 par->cmap_adr + AVIVO_DC_LUT_30_COLOR);
180 writel(0, par->cmap_adr + AVIVO_DC_LUT_RW_SELECT);
181 writeb(regno, par->cmap_adr + AVIVO_DC_LUT_RW_INDEX);
182 writel(((red) << 22) | ((green) << 12) | ((blue) << 2),
183 par->cmap_adr + AVIVO_DC_LUT_30_COLOR);
184 break;
163 } 185 }
164 186
165 return 0; 187 return 0;
@@ -216,12 +238,59 @@ static int offb_blank(int blank, struct fb_info *info)
216 out_le32(((unsigned __iomem *) par->cmap_adr) + i, 238 out_le32(((unsigned __iomem *) par->cmap_adr) + i,
217 0); 239 0);
218 break; 240 break;
241 case cmap_avivo:
242 writel(1, par->cmap_adr + AVIVO_DC_LUT_RW_SELECT);
243 writeb(i, par->cmap_adr + AVIVO_DC_LUT_RW_INDEX);
244 writel(0, par->cmap_adr + AVIVO_DC_LUT_30_COLOR);
245 writel(0, par->cmap_adr + AVIVO_DC_LUT_RW_SELECT);
246 writeb(i, par->cmap_adr + AVIVO_DC_LUT_RW_INDEX);
247 writel(0, par->cmap_adr + AVIVO_DC_LUT_30_COLOR);
248 break;
219 } 249 }
220 } else 250 } else
221 fb_set_cmap(&info->cmap, info); 251 fb_set_cmap(&info->cmap, info);
222 return 0; 252 return 0;
223} 253}
224 254
255static int offb_set_par(struct fb_info *info)
256{
257 struct offb_par *par = (struct offb_par *) info->par;
258
259 /* On avivo, initialize palette control */
260 if (par->cmap_type == cmap_avivo) {
261 writel(0, par->cmap_adr + AVIVO_DC_LUTA_CONTROL);
262 writel(0, par->cmap_adr + AVIVO_DC_LUTA_BLACK_OFFSET_BLUE);
263 writel(0, par->cmap_adr + AVIVO_DC_LUTA_BLACK_OFFSET_GREEN);
264 writel(0, par->cmap_adr + AVIVO_DC_LUTA_BLACK_OFFSET_RED);
265 writel(0x0000ffff, par->cmap_adr + AVIVO_DC_LUTA_WHITE_OFFSET_BLUE);
266 writel(0x0000ffff, par->cmap_adr + AVIVO_DC_LUTA_WHITE_OFFSET_GREEN);
267 writel(0x0000ffff, par->cmap_adr + AVIVO_DC_LUTA_WHITE_OFFSET_RED);
268 writel(0, par->cmap_adr + AVIVO_DC_LUTB_CONTROL);
269 writel(0, par->cmap_adr + AVIVO_DC_LUTB_BLACK_OFFSET_BLUE);
270 writel(0, par->cmap_adr + AVIVO_DC_LUTB_BLACK_OFFSET_GREEN);
271 writel(0, par->cmap_adr + AVIVO_DC_LUTB_BLACK_OFFSET_RED);
272 writel(0x0000ffff, par->cmap_adr + AVIVO_DC_LUTB_WHITE_OFFSET_BLUE);
273 writel(0x0000ffff, par->cmap_adr + AVIVO_DC_LUTB_WHITE_OFFSET_GREEN);
274 writel(0x0000ffff, par->cmap_adr + AVIVO_DC_LUTB_WHITE_OFFSET_RED);
275 writel(1, par->cmap_adr + AVIVO_DC_LUT_RW_SELECT);
276 writel(0, par->cmap_adr + AVIVO_DC_LUT_RW_MODE);
277 writel(0x0000003f, par->cmap_adr + AVIVO_DC_LUT_WRITE_EN_MASK);
278 writel(0, par->cmap_adr + AVIVO_DC_LUT_RW_SELECT);
279 writel(0, par->cmap_adr + AVIVO_DC_LUT_RW_MODE);
280 writel(0x0000003f, par->cmap_adr + AVIVO_DC_LUT_WRITE_EN_MASK);
281 }
282 return 0;
283}
284
285static struct fb_ops offb_ops = {
286 .owner = THIS_MODULE,
287 .fb_setcolreg = offb_setcolreg,
288 .fb_set_par = offb_set_par,
289 .fb_blank = offb_blank,
290 .fb_fillrect = cfb_fillrect,
291 .fb_copyarea = cfb_copyarea,
292 .fb_imageblit = cfb_imageblit,
293};
225 294
226static void __iomem *offb_map_reg(struct device_node *np, int index, 295static void __iomem *offb_map_reg(struct device_node *np, int index,
227 unsigned long offset, unsigned long size) 296 unsigned long offset, unsigned long size)
@@ -245,6 +314,59 @@ static void __iomem *offb_map_reg(struct device_node *np, int index,
245 return ioremap(taddr + offset, size); 314 return ioremap(taddr + offset, size);
246} 315}
247 316
317static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp,
318 const char *name, unsigned long address)
319{
320 struct offb_par *par = (struct offb_par *) info->par;
321
322 if (dp && !strncmp(name, "ATY,Rage128", 11)) {
323 par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
324 if (par->cmap_adr)
325 par->cmap_type = cmap_r128;
326 } else if (dp && (!strncmp(name, "ATY,RageM3pA", 12)
327 || !strncmp(name, "ATY,RageM3p12A", 14))) {
328 par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
329 if (par->cmap_adr)
330 par->cmap_type = cmap_M3A;
331 } else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) {
332 par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
333 if (par->cmap_adr)
334 par->cmap_type = cmap_M3B;
335 } else if (dp && !strncmp(name, "ATY,Rage6", 9)) {
336 par->cmap_adr = offb_map_reg(dp, 1, 0, 0x1fff);
337 if (par->cmap_adr)
338 par->cmap_type = cmap_radeon;
339 } else if (!strncmp(name, "ATY,", 4)) {
340 unsigned long base = address & 0xff000000UL;
341 par->cmap_adr =
342 ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
343 par->cmap_data = par->cmap_adr + 1;
344 par->cmap_type = cmap_m64;
345 } else if (dp && (of_device_is_compatible(dp, "pci1014,b7") ||
346 of_device_is_compatible(dp, "pci1014,21c"))) {
347 par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000);
348 if (par->cmap_adr)
349 par->cmap_type = cmap_gxt2000;
350 } else if (dp && !strncmp(name, "vga,Display-", 12)) {
351 /* Look for AVIVO initialized by SLOF */
352 struct device_node *pciparent = of_get_parent(dp);
353 const u32 *vid, *did;
354 vid = of_get_property(pciparent, "vendor-id", NULL);
355 did = of_get_property(pciparent, "device-id", NULL);
356 /* This will match most R5xx */
357 if (vid && did && *vid == 0x1002 &&
358 ((*did >= 0x7100 && *did < 0x7800) ||
359 (*did >= 0x9400))) {
360 par->cmap_adr = offb_map_reg(pciparent, 2, 0, 0x10000);
361 if (par->cmap_adr)
362 par->cmap_type = cmap_avivo;
363 }
364 of_node_put(pciparent);
365 }
366 info->fix.visual = (par->cmap_type != cmap_unknown) ?
367 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR;
368}
369
248static void __init offb_init_fb(const char *name, const char *full_name, 370static void __init offb_init_fb(const char *name, const char *full_name,
249 int width, int height, int depth, 371 int width, int height, int depth,
250 int pitch, unsigned long address, 372 int pitch, unsigned long address,
@@ -283,6 +405,7 @@ static void __init offb_init_fb(const char *name, const char *full_name,
283 405
284 fix = &info->fix; 406 fix = &info->fix;
285 var = &info->var; 407 var = &info->var;
408 info->par = par;
286 409
287 strcpy(fix->id, "OFfb "); 410 strcpy(fix->id, "OFfb ");
288 strncat(fix->id, name, sizeof(fix->id) - sizeof("OFfb ")); 411 strncat(fix->id, name, sizeof(fix->id) - sizeof("OFfb "));
@@ -298,39 +421,9 @@ static void __init offb_init_fb(const char *name, const char *full_name,
298 fix->type_aux = 0; 421 fix->type_aux = 0;
299 422
300 par->cmap_type = cmap_unknown; 423 par->cmap_type = cmap_unknown;
301 if (depth == 8) { 424 if (depth == 8)
302 if (dp && !strncmp(name, "ATY,Rage128", 11)) { 425 offb_init_palette_hacks(info, dp, name, address);
303 par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); 426 else
304 if (par->cmap_adr)
305 par->cmap_type = cmap_r128;
306 } else if (dp && (!strncmp(name, "ATY,RageM3pA", 12)
307 || !strncmp(name, "ATY,RageM3p12A", 14))) {
308 par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
309 if (par->cmap_adr)
310 par->cmap_type = cmap_M3A;
311 } else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) {
312 par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
313 if (par->cmap_adr)
314 par->cmap_type = cmap_M3B;
315 } else if (dp && !strncmp(name, "ATY,Rage6", 9)) {
316 par->cmap_adr = offb_map_reg(dp, 1, 0, 0x1fff);
317 if (par->cmap_adr)
318 par->cmap_type = cmap_radeon;
319 } else if (!strncmp(name, "ATY,", 4)) {
320 unsigned long base = address & 0xff000000UL;
321 par->cmap_adr =
322 ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
323 par->cmap_data = par->cmap_adr + 1;
324 par->cmap_type = cmap_m64;
325 } else if (dp && (of_device_is_compatible(dp, "pci1014,b7") ||
326 of_device_is_compatible(dp, "pci1014,21c"))) {
327 par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000);
328 if (par->cmap_adr)
329 par->cmap_type = cmap_gxt2000;
330 }
331 fix->visual = (par->cmap_type != cmap_unknown) ?
332 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR;
333 } else
334 fix->visual = FB_VISUAL_TRUECOLOR; 427 fix->visual = FB_VISUAL_TRUECOLOR;
335 428
336 var->xoffset = var->yoffset = 0; 429 var->xoffset = var->yoffset = 0;
@@ -395,7 +488,6 @@ static void __init offb_init_fb(const char *name, const char *full_name,
395 488
396 info->fbops = &offb_ops; 489 info->fbops = &offb_ops;
397 info->screen_base = ioremap(address, fix->smem_len); 490 info->screen_base = ioremap(address, fix->smem_len);
398 info->par = par;
399 info->pseudo_palette = (void *) (info + 1); 491 info->pseudo_palette = (void *) (info + 1);
400 info->flags = FBINFO_DEFAULT | foreign_endian; 492 info->flags = FBINFO_DEFAULT | foreign_endian;
401 493
diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c
index ab32ceb06178..ab77c51fe9d6 100644
--- a/drivers/video/omap/dispc.c
+++ b/drivers/video/omap/dispc.c
@@ -20,6 +20,7 @@
20 */ 20 */
21#include <linux/kernel.h> 21#include <linux/kernel.h>
22#include <linux/dma-mapping.h> 22#include <linux/dma-mapping.h>
23#include <linux/mm.h>
23#include <linux/vmalloc.h> 24#include <linux/vmalloc.h>
24#include <linux/clk.h> 25#include <linux/clk.h>
25#include <linux/io.h> 26#include <linux/io.h>
diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c
index 14d0f7a11145..f85af5c4fa68 100644
--- a/drivers/video/omap/omapfb_main.c
+++ b/drivers/video/omap/omapfb_main.c
@@ -25,6 +25,7 @@
25 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 25 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 */ 26 */
27#include <linux/platform_device.h> 27#include <linux/platform_device.h>
28#include <linux/mm.h>
28#include <linux/uaccess.h> 29#include <linux/uaccess.h>
29 30
30#include <asm/mach-types.h> 31#include <asm/mach-types.h>
diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
index dc3af1c78c56..4b5d80771904 100644
--- a/drivers/video/ps3fb.c
+++ b/drivers/video/ps3fb.c
@@ -1297,6 +1297,7 @@ static int ps3fb_shutdown(struct ps3_system_bus_device *dev)
1297 1297
1298static struct ps3_system_bus_driver ps3fb_driver = { 1298static struct ps3_system_bus_driver ps3fb_driver = {
1299 .match_id = PS3_MATCH_ID_GRAPHICS, 1299 .match_id = PS3_MATCH_ID_GRAPHICS,
1300 .match_sub_id = PS3_MATCH_SUB_ID_FB,
1300 .core.name = DEVICE_NAME, 1301 .core.name = DEVICE_NAME,
1301 .core.owner = THIS_MODULE, 1302 .core.owner = THIS_MODULE,
1302 .probe = ps3fb_probe, 1303 .probe = ps3fb_probe,
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
index d0746261c957..2b707a8ce5de 100644
--- a/drivers/video/pxafb.c
+++ b/drivers/video/pxafb.c
@@ -30,6 +30,7 @@
30#include <linux/string.h> 30#include <linux/string.h>
31#include <linux/interrupt.h> 31#include <linux/interrupt.h>
32#include <linux/slab.h> 32#include <linux/slab.h>
33#include <linux/mm.h>
33#include <linux/fb.h> 34#include <linux/fb.h>
34#include <linux/delay.h> 35#include <linux/delay.h>
35#include <linux/init.h> 36#include <linux/init.h>
@@ -40,6 +41,7 @@
40#include <linux/clk.h> 41#include <linux/clk.h>
41#include <linux/err.h> 42#include <linux/err.h>
42#include <linux/completion.h> 43#include <linux/completion.h>
44#include <linux/mutex.h>
43#include <linux/kthread.h> 45#include <linux/kthread.h>
44#include <linux/freezer.h> 46#include <linux/freezer.h>
45 47
@@ -227,6 +229,22 @@ static int pxafb_bpp_to_lccr3(struct fb_var_screeninfo *var)
227 case 4: ret = LCCR3_4BPP; break; 229 case 4: ret = LCCR3_4BPP; break;
228 case 8: ret = LCCR3_8BPP; break; 230 case 8: ret = LCCR3_8BPP; break;
229 case 16: ret = LCCR3_16BPP; break; 231 case 16: ret = LCCR3_16BPP; break;
232 case 24:
233 switch (var->red.length + var->green.length +
234 var->blue.length + var->transp.length) {
235 case 18: ret = LCCR3_18BPP_P | LCCR3_PDFOR_3; break;
236 case 19: ret = LCCR3_19BPP_P; break;
237 }
238 break;
239 case 32:
240 switch (var->red.length + var->green.length +
241 var->blue.length + var->transp.length) {
242 case 18: ret = LCCR3_18BPP | LCCR3_PDFOR_3; break;
243 case 19: ret = LCCR3_19BPP; break;
244 case 24: ret = LCCR3_24BPP | LCCR3_PDFOR_3; break;
245 case 25: ret = LCCR3_25BPP; break;
246 }
247 break;
230 } 248 }
231 return ret; 249 return ret;
232} 250}
@@ -345,6 +363,41 @@ static int pxafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
345 var->green.offset = 5; var->green.length = 6; 363 var->green.offset = 5; var->green.length = 6;
346 var->blue.offset = 0; var->blue.length = 5; 364 var->blue.offset = 0; var->blue.length = 5;
347 var->transp.offset = var->transp.length = 0; 365 var->transp.offset = var->transp.length = 0;
366 } else if (var->bits_per_pixel > 16) {
367 struct pxafb_mode_info *mode;
368
369 mode = pxafb_getmode(inf, var);
370 if (!mode)
371 return -EINVAL;
372
373 switch (mode->depth) {
374 case 18: /* RGB666 */
375 var->transp.offset = var->transp.length = 0;
376 var->red.offset = 12; var->red.length = 6;
377 var->green.offset = 6; var->green.length = 6;
378 var->blue.offset = 0; var->blue.length = 6;
379 break;
380 case 19: /* RGBT666 */
381 var->transp.offset = 18; var->transp.length = 1;
382 var->red.offset = 12; var->red.length = 6;
383 var->green.offset = 6; var->green.length = 6;
384 var->blue.offset = 0; var->blue.length = 6;
385 break;
386 case 24: /* RGB888 */
387 var->transp.offset = var->transp.length = 0;
388 var->red.offset = 16; var->red.length = 8;
389 var->green.offset = 8; var->green.length = 8;
390 var->blue.offset = 0; var->blue.length = 8;
391 break;
392 case 25: /* RGBT888 */
393 var->transp.offset = 24; var->transp.length = 1;
394 var->red.offset = 16; var->red.length = 8;
395 var->green.offset = 8; var->green.length = 8;
396 var->blue.offset = 0; var->blue.length = 8;
397 break;
398 default:
399 return -EINVAL;
400 }
348 } else { 401 } else {
349 var->red.offset = var->green.offset = 0; 402 var->red.offset = var->green.offset = 0;
350 var->blue.offset = var->transp.offset = 0; 403 var->blue.offset = var->transp.offset = 0;
@@ -376,7 +429,7 @@ static int pxafb_set_par(struct fb_info *info)
376 struct pxafb_info *fbi = (struct pxafb_info *)info; 429 struct pxafb_info *fbi = (struct pxafb_info *)info;
377 struct fb_var_screeninfo *var = &info->var; 430 struct fb_var_screeninfo *var = &info->var;
378 431
379 if (var->bits_per_pixel == 16) 432 if (var->bits_per_pixel >= 16)
380 fbi->fb.fix.visual = FB_VISUAL_TRUECOLOR; 433 fbi->fb.fix.visual = FB_VISUAL_TRUECOLOR;
381 else if (!fbi->cmap_static) 434 else if (!fbi->cmap_static)
382 fbi->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; 435 fbi->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
@@ -391,7 +444,7 @@ static int pxafb_set_par(struct fb_info *info)
391 444
392 fbi->fb.fix.line_length = var->xres_virtual * 445 fbi->fb.fix.line_length = var->xres_virtual *
393 var->bits_per_pixel / 8; 446 var->bits_per_pixel / 8;
394 if (var->bits_per_pixel == 16) 447 if (var->bits_per_pixel >= 16)
395 fbi->palette_size = 0; 448 fbi->palette_size = 0;
396 else 449 else
397 fbi->palette_size = var->bits_per_pixel == 1 ? 450 fbi->palette_size = var->bits_per_pixel == 1 ?
@@ -404,7 +457,7 @@ static int pxafb_set_par(struct fb_info *info)
404 */ 457 */
405 pxafb_set_truecolor(fbi->fb.fix.visual == FB_VISUAL_TRUECOLOR); 458 pxafb_set_truecolor(fbi->fb.fix.visual == FB_VISUAL_TRUECOLOR);
406 459
407 if (fbi->fb.var.bits_per_pixel == 16) 460 if (fbi->fb.var.bits_per_pixel >= 16)
408 fb_dealloc_cmap(&fbi->fb.cmap); 461 fb_dealloc_cmap(&fbi->fb.cmap);
409 else 462 else
410 fb_alloc_cmap(&fbi->fb.cmap, 1<<fbi->fb.var.bits_per_pixel, 0); 463 fb_alloc_cmap(&fbi->fb.cmap, 1<<fbi->fb.var.bits_per_pixel, 0);
@@ -831,6 +884,8 @@ static int pxafb_activate_var(struct fb_var_screeninfo *var,
831 case 4: 884 case 4:
832 case 8: 885 case 8:
833 case 16: 886 case 16:
887 case 24:
888 case 32:
834 break; 889 break;
835 default: 890 default:
836 printk(KERN_ERR "%s: invalid bit depth %d\n", 891 printk(KERN_ERR "%s: invalid bit depth %d\n",
@@ -968,6 +1023,11 @@ static void pxafb_setup_gpio(struct pxafb_info *fbi)
968 1023
969 for (gpio = 58; ldd_bits; gpio++, ldd_bits--) 1024 for (gpio = 58; ldd_bits; gpio++, ldd_bits--)
970 pxa_gpio_mode(gpio | GPIO_ALT_FN_2_OUT); 1025 pxa_gpio_mode(gpio | GPIO_ALT_FN_2_OUT);
1026 /* 18 bit interface */
1027 if (fbi->fb.var.bits_per_pixel > 16) {
1028 pxa_gpio_mode(86 | GPIO_ALT_FN_2_OUT);
1029 pxa_gpio_mode(87 | GPIO_ALT_FN_2_OUT);
1030 }
971 pxa_gpio_mode(GPIO74_LCD_FCLK_MD); 1031 pxa_gpio_mode(GPIO74_LCD_FCLK_MD);
972 pxa_gpio_mode(GPIO75_LCD_LCLK_MD); 1032 pxa_gpio_mode(GPIO75_LCD_LCLK_MD);
973 pxa_gpio_mode(GPIO76_LCD_PCLK_MD); 1033 pxa_gpio_mode(GPIO76_LCD_PCLK_MD);
@@ -1058,7 +1118,7 @@ static void set_ctrlr_state(struct pxafb_info *fbi, u_int state)
1058{ 1118{
1059 u_int old_state; 1119 u_int old_state;
1060 1120
1061 down(&fbi->ctrlr_sem); 1121 mutex_lock(&fbi->ctrlr_lock);
1062 1122
1063 old_state = fbi->state; 1123 old_state = fbi->state;
1064 1124
@@ -1146,7 +1206,7 @@ static void set_ctrlr_state(struct pxafb_info *fbi, u_int state)
1146 } 1206 }
1147 break; 1207 break;
1148 } 1208 }
1149 up(&fbi->ctrlr_sem); 1209 mutex_unlock(&fbi->ctrlr_lock);
1150} 1210}
1151 1211
1152/* 1212/*
@@ -1399,7 +1459,7 @@ static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev)
1399 1459
1400 init_waitqueue_head(&fbi->ctrlr_wait); 1460 init_waitqueue_head(&fbi->ctrlr_wait);
1401 INIT_WORK(&fbi->task, pxafb_task); 1461 INIT_WORK(&fbi->task, pxafb_task);
1402 init_MUTEX(&fbi->ctrlr_sem); 1462 mutex_init(&fbi->ctrlr_lock);
1403 init_completion(&fbi->disable_done); 1463 init_completion(&fbi->disable_done);
1404#ifdef CONFIG_FB_PXA_SMARTPANEL 1464#ifdef CONFIG_FB_PXA_SMARTPANEL
1405 init_completion(&fbi->command_done); 1465 init_completion(&fbi->command_done);
diff --git a/drivers/video/pxafb.h b/drivers/video/pxafb.h
index 8238dc826429..31541b86f13d 100644
--- a/drivers/video/pxafb.h
+++ b/drivers/video/pxafb.h
@@ -106,7 +106,7 @@ struct pxafb_info {
106 106
107 volatile u_char state; 107 volatile u_char state;
108 volatile u_char task_state; 108 volatile u_char task_state;
109 struct semaphore ctrlr_sem; 109 struct mutex ctrlr_lock;
110 wait_queue_head_t ctrlr_wait; 110 wait_queue_head_t ctrlr_wait;
111 struct work_struct task; 111 struct work_struct task;
112 112
diff --git a/drivers/video/sa1100fb.c b/drivers/video/sa1100fb.c
index ab2b2110478b..78bcdbc3f484 100644
--- a/drivers/video/sa1100fb.c
+++ b/drivers/video/sa1100fb.c
@@ -167,6 +167,7 @@
167#include <linux/string.h> 167#include <linux/string.h>
168#include <linux/interrupt.h> 168#include <linux/interrupt.h>
169#include <linux/slab.h> 169#include <linux/slab.h>
170#include <linux/mm.h>
170#include <linux/fb.h> 171#include <linux/fb.h>
171#include <linux/delay.h> 172#include <linux/delay.h>
172#include <linux/init.h> 173#include <linux/init.h>
@@ -174,6 +175,7 @@
174#include <linux/cpufreq.h> 175#include <linux/cpufreq.h>
175#include <linux/platform_device.h> 176#include <linux/platform_device.h>
176#include <linux/dma-mapping.h> 177#include <linux/dma-mapping.h>
178#include <linux/mutex.h>
177 179
178#include <asm/hardware.h> 180#include <asm/hardware.h>
179#include <asm/io.h> 181#include <asm/io.h>
@@ -1107,7 +1109,7 @@ static void set_ctrlr_state(struct sa1100fb_info *fbi, u_int state)
1107{ 1109{
1108 u_int old_state; 1110 u_int old_state;
1109 1111
1110 down(&fbi->ctrlr_sem); 1112 mutex_lock(&fbi->ctrlr_lock);
1111 1113
1112 old_state = fbi->state; 1114 old_state = fbi->state;
1113 1115
@@ -1192,7 +1194,7 @@ static void set_ctrlr_state(struct sa1100fb_info *fbi, u_int state)
1192 } 1194 }
1193 break; 1195 break;
1194 } 1196 }
1195 up(&fbi->ctrlr_sem); 1197 mutex_unlock(&fbi->ctrlr_lock);
1196} 1198}
1197 1199
1198/* 1200/*
@@ -1444,7 +1446,7 @@ static struct sa1100fb_info * __init sa1100fb_init_fbinfo(struct device *dev)
1444 1446
1445 init_waitqueue_head(&fbi->ctrlr_wait); 1447 init_waitqueue_head(&fbi->ctrlr_wait);
1446 INIT_WORK(&fbi->task, sa1100fb_task); 1448 INIT_WORK(&fbi->task, sa1100fb_task);
1447 init_MUTEX(&fbi->ctrlr_sem); 1449 mutex_init(&fbi->ctrlr_lock);
1448 1450
1449 return fbi; 1451 return fbi;
1450} 1452}
diff --git a/drivers/video/sa1100fb.h b/drivers/video/sa1100fb.h
index f465b27ed860..86831db9a042 100644
--- a/drivers/video/sa1100fb.h
+++ b/drivers/video/sa1100fb.h
@@ -100,7 +100,7 @@ struct sa1100fb_info {
100 100
101 volatile u_char state; 101 volatile u_char state;
102 volatile u_char task_state; 102 volatile u_char task_state;
103 struct semaphore ctrlr_sem; 103 struct mutex ctrlr_lock;
104 wait_queue_head_t ctrlr_wait; 104 wait_queue_head_t ctrlr_wait;
105 struct work_struct task; 105 struct work_struct task;
106 106
diff --git a/drivers/video/sh7760fb.c b/drivers/video/sh7760fb.c
new file mode 100644
index 000000000000..4d0e28c5790b
--- /dev/null
+++ b/drivers/video/sh7760fb.c
@@ -0,0 +1,658 @@
1/*
2 * SH7760/SH7763 LCDC Framebuffer driver.
3 *
4 * (c) 2006-2008 MSC Vertriebsges.m.b.H.,
5 * Manuel Lauss <mano@roarinelk.homelinux.net>
6 * (c) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
7 *
8 * This file is subject to the terms and conditions of the GNU General
9 * Public License. See the file COPYING in the main directory of this
10 * archive for more details.
11 *
12 * PLEASE HAVE A LOOK AT Documentation/fb/sh7760fb.txt!
13 *
14 * Thanks to Siegfried Schaefer <s.schaefer at schaefer-edv.de>
15 * for his original source and testing!
16 */
17
18#include <linux/completion.h>
19#include <linux/delay.h>
20#include <linux/dma-mapping.h>
21#include <linux/fb.h>
22#include <linux/interrupt.h>
23#include <linux/io.h>
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/platform_device.h>
27
28#include <asm/sh7760fb.h>
29
30struct sh7760fb_par {
31 void __iomem *base;
32 int irq;
33
34 struct sh7760fb_platdata *pd; /* display information */
35
36 dma_addr_t fbdma; /* physical address */
37
38 int rot; /* rotation enabled? */
39
40 u32 pseudo_palette[16];
41
42 struct platform_device *dev;
43 struct resource *ioarea;
44 struct completion vsync; /* vsync irq event */
45};
46
47static irqreturn_t sh7760fb_irq(int irq, void *data)
48{
49 struct completion *c = data;
50
51 complete(c);
52
53 return IRQ_HANDLED;
54}
55
56static void sh7760fb_wait_vsync(struct fb_info *info)
57{
58 struct sh7760fb_par *par = info->par;
59
60 if (par->pd->novsync)
61 return;
62
63 iowrite16(ioread16(par->base + LDINTR) & ~VINT_CHECK,
64 par->base + LDINTR);
65
66 if (par->irq < 0) {
67 /* poll for vert. retrace: status bit is sticky */
68 while (!(ioread16(par->base + LDINTR) & VINT_CHECK))
69 cpu_relax();
70 } else {
71 /* a "wait_for_irq_event(par->irq)" would be extremely nice */
72 init_completion(&par->vsync);
73 enable_irq(par->irq);
74 wait_for_completion(&par->vsync);
75 disable_irq_nosync(par->irq);
76 }
77}
78
79/* wait_for_lps - wait until power supply has reached a certain state. */
80static int wait_for_lps(struct sh7760fb_par *par, int val)
81{
82 int i = 100;
83 while (--i && ((ioread16(par->base + LDPMMR) & 3) != val))
84 msleep(1);
85
86 if (i <= 0)
87 return -ETIMEDOUT;
88
89 return 0;
90}
91
92/* en/disable the LCDC */
93static int sh7760fb_blank(int blank, struct fb_info *info)
94{
95 struct sh7760fb_par *par = info->par;
96 struct sh7760fb_platdata *pd = par->pd;
97 unsigned short cntr = ioread16(par->base + LDCNTR);
98 unsigned short intr = ioread16(par->base + LDINTR);
99 int lps;
100
101 if (blank == FB_BLANK_UNBLANK) {
102 intr |= VINT_START;
103 cntr = LDCNTR_DON2 | LDCNTR_DON;
104 lps = 3;
105 } else {
106 intr &= ~VINT_START;
107 cntr = LDCNTR_DON2;
108 lps = 0;
109 }
110
111 if (pd->blank)
112 pd->blank(blank);
113
114 iowrite16(intr, par->base + LDINTR);
115 iowrite16(cntr, par->base + LDCNTR);
116
117 return wait_for_lps(par, lps);
118}
119
120/* set color registers */
121static int sh7760fb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
122{
123 struct sh7760fb_par *par = info->par;
124 u32 s = cmap->start;
125 u32 l = cmap->len;
126 u16 *r = cmap->red;
127 u16 *g = cmap->green;
128 u16 *b = cmap->blue;
129 u32 col, tmo;
130 int ret;
131
132 ret = 0;
133
134 sh7760fb_wait_vsync(info);
135
136 /* request palette access */
137 iowrite16(LDPALCR_PALEN, par->base + LDPALCR);
138
139 /* poll for access grant */
140 tmo = 100;
141 while (!(ioread16(par->base + LDPALCR) & LDPALCR_PALS) && (--tmo))
142 cpu_relax();
143
144 if (!tmo) {
145 ret = 1;
146 dev_dbg(info->dev, "no palette access!\n");
147 goto out;
148 }
149
150 while (l && (s < 256)) {
151 col = ((*r) & 0xff) << 16;
152 col |= ((*g) & 0xff) << 8;
153 col |= ((*b) & 0xff);
154 col &= SH7760FB_PALETTE_MASK;
155
156 if (s < 16)
157 ((u32 *) (info->pseudo_palette))[s] = s;
158
159 s++;
160 l--;
161 r++;
162 g++;
163 b++;
164 }
165out:
166 iowrite16(0, par->base + LDPALCR);
167 return ret;
168}
169
170static void encode_fix(struct fb_fix_screeninfo *fix, struct fb_info *info,
171 unsigned long stride)
172{
173 memset(fix, 0, sizeof(struct fb_fix_screeninfo));
174 strcpy(fix->id, "sh7760-lcdc");
175
176 fix->smem_start = (unsigned long)info->screen_base;
177 fix->smem_len = info->screen_size;
178
179 fix->line_length = stride;
180}
181
182static int sh7760fb_get_color_info(struct device *dev,
183 u16 lddfr, int *bpp, int *gray)
184{
185 int lbpp, lgray;
186
187 lgray = lbpp = 0;
188
189 switch (lddfr & LDDFR_COLOR_MASK) {
190 case LDDFR_1BPP_MONO:
191 lgray = 1;
192 lbpp = 1;
193 break;
194 case LDDFR_2BPP_MONO:
195 lgray = 1;
196 lbpp = 2;
197 break;
198 case LDDFR_4BPP_MONO:
199 lgray = 1;
200 case LDDFR_4BPP:
201 lbpp = 4;
202 break;
203 case LDDFR_6BPP_MONO:
204 lgray = 1;
205 case LDDFR_8BPP:
206 lbpp = 8;
207 break;
208 case LDDFR_16BPP_RGB555:
209 case LDDFR_16BPP_RGB565:
210 lbpp = 16;
211 lgray = 0;
212 break;
213 default:
214 dev_dbg(dev, "unsupported LDDFR bit depth.\n");
215 return -EINVAL;
216 }
217
218 if (bpp)
219 *bpp = lbpp;
220 if (gray)
221 *gray = lgray;
222
223 return 0;
224}
225
226static int sh7760fb_check_var(struct fb_var_screeninfo *var,
227 struct fb_info *info)
228{
229 struct fb_fix_screeninfo *fix = &info->fix;
230 struct sh7760fb_par *par = info->par;
231 int ret, bpp;
232
233 /* get color info from register value */
234 ret = sh7760fb_get_color_info(info->dev, par->pd->lddfr, &bpp, NULL);
235 if (ret)
236 return ret;
237
238 var->bits_per_pixel = bpp;
239
240 if ((var->grayscale) && (var->bits_per_pixel == 1))
241 fix->visual = FB_VISUAL_MONO10;
242 else if (var->bits_per_pixel >= 15)
243 fix->visual = FB_VISUAL_TRUECOLOR;
244 else
245 fix->visual = FB_VISUAL_PSEUDOCOLOR;
246
247 /* TODO: add some more validation here */
248 return 0;
249}
250
251/*
252 * sh7760fb_set_par - set videomode.
253 *
254 * NOTE: The rotation, grayscale and DSTN codepaths are
255 * totally untested!
256 */
257static int sh7760fb_set_par(struct fb_info *info)
258{
259 struct sh7760fb_par *par = info->par;
260 struct fb_videomode *vm = par->pd->def_mode;
261 unsigned long sbase, dstn_off, ldsarl, stride;
262 unsigned short hsynp, hsynw, htcn, hdcn;
263 unsigned short vsynp, vsynw, vtln, vdln;
264 unsigned short lddfr, ldmtr;
265 int ret, bpp, gray;
266
267 par->rot = par->pd->rotate;
268
269 /* rotate only works with xres <= 320 */
270 if (par->rot && (vm->xres > 320)) {
271 dev_dbg(info->dev, "rotation disabled due to display size\n");
272 par->rot = 0;
273 }
274
275 /* calculate LCDC reg vals from display parameters */
276 hsynp = vm->right_margin + vm->xres;
277 hsynw = vm->hsync_len;
278 htcn = vm->left_margin + hsynp + hsynw;
279 hdcn = vm->xres;
280 vsynp = vm->lower_margin + vm->yres;
281 vsynw = vm->vsync_len;
282 vtln = vm->upper_margin + vsynp + vsynw;
283 vdln = vm->yres;
284
285 /* get color info from register value */
286 ret = sh7760fb_get_color_info(info->dev, par->pd->lddfr, &bpp, &gray);
287 if (ret)
288 return ret;
289
290 dev_dbg(info->dev, "%dx%d %dbpp %s (orientation %s)\n", hdcn,
291 vdln, bpp, gray ? "grayscale" : "color",
292 par->rot ? "rotated" : "normal");
293
294#ifdef CONFIG_CPU_LITTLE_ENDIAN
295 lddfr = par->pd->lddfr | (1 << 8);
296#else
297 lddfr = par->pd->lddfr & ~(1 << 8);
298#endif
299
300 ldmtr = par->pd->ldmtr;
301
302 if (!(vm->sync & FB_SYNC_HOR_HIGH_ACT))
303 ldmtr |= LDMTR_CL1POL;
304 if (!(vm->sync & FB_SYNC_VERT_HIGH_ACT))
305 ldmtr |= LDMTR_FLMPOL;
306
307 /* shut down LCDC before changing display parameters */
308 sh7760fb_blank(FB_BLANK_POWERDOWN, info);
309
310 iowrite16(par->pd->ldickr, par->base + LDICKR); /* pixclock */
311 iowrite16(ldmtr, par->base + LDMTR); /* polarities */
312 iowrite16(lddfr, par->base + LDDFR); /* color/depth */
313 iowrite16((par->rot ? 1 << 13 : 0), par->base + LDSMR); /* rotate */
314 iowrite16(par->pd->ldpmmr, par->base + LDPMMR); /* Power Management */
315 iowrite16(par->pd->ldpspr, par->base + LDPSPR); /* Power Supply Ctrl */
316
317 /* display resolution */
318 iowrite16(((htcn >> 3) - 1) | (((hdcn >> 3) - 1) << 8),
319 par->base + LDHCNR);
320 iowrite16(vdln - 1, par->base + LDVDLNR);
321 iowrite16(vtln - 1, par->base + LDVTLNR);
322 /* h/v sync signals */
323 iowrite16((vsynp - 1) | ((vsynw - 1) << 12), par->base + LDVSYNR);
324 iowrite16(((hsynp >> 3) - 1) | (((hsynw >> 3) - 1) << 12),
325 par->base + LDHSYNR);
326 /* AC modulation sig */
327 iowrite16(par->pd->ldaclnr, par->base + LDACLNR);
328
329 stride = (par->rot) ? vtln : hdcn;
330 if (!gray)
331 stride *= (bpp + 7) >> 3;
332 else {
333 if (bpp == 1)
334 stride >>= 3;
335 else if (bpp == 2)
336 stride >>= 2;
337 else if (bpp == 4)
338 stride >>= 1;
339 /* 6 bpp == 8 bpp */
340 }
341
342 /* if rotated, stride must be power of 2 */
343 if (par->rot) {
344 unsigned long bit = 1 << 31;
345 while (bit) {
346 if (stride & bit)
347 break;
348 bit >>= 1;
349 }
350 if (stride & ~bit)
351 stride = bit << 1; /* not P-o-2, round up */
352 }
353 iowrite16(stride, par->base + LDLAOR);
354
355 /* set display mem start address */
356 sbase = (unsigned long)par->fbdma;
357 if (par->rot)
358 sbase += (hdcn - 1) * stride;
359
360 iowrite32(sbase, par->base + LDSARU);
361
362 /*
363 * for DSTN need to set address for lower half.
364 * I (mlau) don't know which address to set it to,
365 * so I guessed at (stride * yres/2).
366 */
367 if (((ldmtr & 0x003f) >= LDMTR_DSTN_MONO_8) &&
368 ((ldmtr & 0x003f) <= LDMTR_DSTN_COLOR_16)) {
369
370 dev_dbg(info->dev, " ***** DSTN untested! *****\n");
371
372 dstn_off = stride;
373 if (par->rot)
374 dstn_off *= hdcn >> 1;
375 else
376 dstn_off *= vdln >> 1;
377
378 ldsarl = sbase + dstn_off;
379 } else
380 ldsarl = 0;
381
382 iowrite32(ldsarl, par->base + LDSARL); /* mem for lower half of DSTN */
383
384 encode_fix(&info->fix, info, stride);
385 sh7760fb_check_var(&info->var, info);
386
387 sh7760fb_blank(FB_BLANK_UNBLANK, info); /* panel on! */
388
389 dev_dbg(info->dev, "hdcn : %6d htcn : %6d\n", hdcn, htcn);
390 dev_dbg(info->dev, "hsynw : %6d hsynp : %6d\n", hsynw, hsynp);
391 dev_dbg(info->dev, "vdln : %6d vtln : %6d\n", vdln, vtln);
392 dev_dbg(info->dev, "vsynw : %6d vsynp : %6d\n", vsynw, vsynp);
393 dev_dbg(info->dev, "clksrc: %6d clkdiv: %6d\n",
394 (par->pd->ldickr >> 12) & 3, par->pd->ldickr & 0x1f);
395 dev_dbg(info->dev, "ldpmmr: 0x%04x ldpspr: 0x%04x\n", par->pd->ldpmmr,
396 par->pd->ldpspr);
397 dev_dbg(info->dev, "ldmtr : 0x%04x lddfr : 0x%04x\n", ldmtr, lddfr);
398 dev_dbg(info->dev, "ldlaor: %ld\n", stride);
399 dev_dbg(info->dev, "ldsaru: 0x%08lx ldsarl: 0x%08lx\n", sbase, ldsarl);
400
401 return 0;
402}
403
404static struct fb_ops sh7760fb_ops = {
405 .owner = THIS_MODULE,
406 .fb_blank = sh7760fb_blank,
407 .fb_check_var = sh7760fb_check_var,
408 .fb_setcmap = sh7760fb_setcmap,
409 .fb_set_par = sh7760fb_set_par,
410 .fb_fillrect = cfb_fillrect,
411 .fb_copyarea = cfb_copyarea,
412 .fb_imageblit = cfb_imageblit,
413};
414
415static void sh7760fb_free_mem(struct fb_info *info)
416{
417 struct sh7760fb_par *par = info->par;
418
419 if (!info->screen_base)
420 return;
421
422 dma_free_coherent(info->dev, info->screen_size,
423 info->screen_base, par->fbdma);
424
425 par->fbdma = 0;
426 info->screen_base = NULL;
427 info->screen_size = 0;
428}
429
430/* allocate the framebuffer memory. This memory must be in Area3,
431 * (dictated by the DMA engine) and contiguous, at a 512 byte boundary.
432 */
433static int sh7760fb_alloc_mem(struct fb_info *info)
434{
435 struct sh7760fb_par *par = info->par;
436 void *fbmem;
437 unsigned long vram;
438 int ret, bpp;
439
440 if (info->screen_base)
441 return 0;
442
443 /* get color info from register value */
444 ret = sh7760fb_get_color_info(info->dev, par->pd->lddfr, &bpp, NULL);
445 if (ret) {
446 printk(KERN_ERR "colinfo\n");
447 return ret;
448 }
449
450 /* min VRAM: xres_min = 16, yres_min = 1, bpp = 1: 2byte -> 1 page
451 max VRAM: xres_max = 1024, yres_max = 1024, bpp = 16: 2MB */
452
453 vram = info->var.xres * info->var.yres;
454 if (info->var.grayscale) {
455 if (bpp == 1)
456 vram >>= 3;
457 else if (bpp == 2)
458 vram >>= 2;
459 else if (bpp == 4)
460 vram >>= 1;
461 } else if (bpp > 8)
462 vram *= 2;
463 if ((vram < 1) || (vram > 1024 * 2048)) {
464 dev_dbg(info->dev, "too much VRAM required. Check settings\n");
465 return -ENODEV;
466 }
467
468 if (vram < PAGE_SIZE)
469 vram = PAGE_SIZE;
470
471 fbmem = dma_alloc_coherent(info->dev, vram, &par->fbdma, GFP_KERNEL);
472
473 if (!fbmem)
474 return -ENOMEM;
475
476 if ((par->fbdma & SH7760FB_DMA_MASK) != SH7760FB_DMA_MASK) {
477 sh7760fb_free_mem(info);
478 dev_err(info->dev, "kernel gave me memory at 0x%08lx, which is"
479 "unusable for the LCDC\n", (unsigned long)par->fbdma);
480 return -ENOMEM;
481 }
482
483 info->screen_base = fbmem;
484 info->screen_size = vram;
485
486 return 0;
487}
488
489static int __devinit sh7760fb_probe(struct platform_device *pdev)
490{
491 struct fb_info *info;
492 struct resource *res;
493 struct sh7760fb_par *par;
494 int ret;
495
496 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
497 if (unlikely(res == NULL)) {
498 dev_err(&pdev->dev, "invalid resource\n");
499 return -EINVAL;
500 }
501
502 info = framebuffer_alloc(sizeof(struct sh7760fb_par), &pdev->dev);
503 if (!info)
504 return -ENOMEM;
505
506 par = info->par;
507 par->dev = pdev;
508
509 par->pd = pdev->dev.platform_data;
510 if (!par->pd) {
511 dev_dbg(info->dev, "no display setup data!\n");
512 ret = -ENODEV;
513 goto out_fb;
514 }
515
516 par->ioarea = request_mem_region(res->start,
517 (res->end - res->start), pdev->name);
518 if (!par->ioarea) {
519 dev_err(&pdev->dev, "mmio area busy\n");
520 ret = -EBUSY;
521 goto out_fb;
522 }
523
524 par->base = ioremap_nocache(res->start, res->end - res->start + 1);
525 if (!par->base) {
526 dev_err(&pdev->dev, "cannot remap\n");
527 ret = -ENODEV;
528 goto out_res;
529 }
530
531 iowrite16(0, par->base + LDINTR); /* disable vsync irq */
532 par->irq = platform_get_irq(pdev, 0);
533 if (par->irq >= 0) {
534 ret = request_irq(par->irq, sh7760fb_irq, 0,
535 "sh7760-lcdc", &par->vsync);
536 if (ret) {
537 dev_err(&pdev->dev, "cannot grab IRQ\n");
538 par->irq = -ENXIO;
539 } else
540 disable_irq_nosync(par->irq);
541 }
542
543 fb_videomode_to_var(&info->var, par->pd->def_mode);
544
545 ret = sh7760fb_alloc_mem(info);
546 if (ret) {
547 dev_dbg(info->dev, "framebuffer memory allocation failed!\n");
548 goto out_unmap;
549 }
550
551 info->pseudo_palette = par->pseudo_palette;
552
553 /* fixup color register bitpositions. These are fixed by hardware */
554 info->var.red.offset = 11;
555 info->var.red.length = 5;
556 info->var.red.msb_right = 0;
557
558 info->var.green.offset = 5;
559 info->var.green.length = 6;
560 info->var.green.msb_right = 0;
561
562 info->var.blue.offset = 0;
563 info->var.blue.length = 5;
564 info->var.blue.msb_right = 0;
565
566 info->var.transp.offset = 0;
567 info->var.transp.length = 0;
568 info->var.transp.msb_right = 0;
569
570 /* set the DON2 bit now, before cmap allocation, as it will randomize
571 * palette memory.
572 */
573 iowrite16(LDCNTR_DON2, par->base + LDCNTR);
574 info->fbops = &sh7760fb_ops;
575
576 ret = fb_alloc_cmap(&info->cmap, 256, 0);
577 if (ret) {
578 dev_dbg(info->dev, "Unable to allocate cmap memory\n");
579 goto out_mem;
580 }
581
582 ret = register_framebuffer(info);
583 if (ret < 0) {
584 dev_dbg(info->dev, "cannot register fb!\n");
585 goto out_cmap;
586 }
587 platform_set_drvdata(pdev, info);
588
589 printk(KERN_INFO "%s: memory at phys 0x%08lx-0x%08lx, size %ld KiB\n",
590 pdev->name,
591 (unsigned long)par->fbdma,
592 (unsigned long)(par->fbdma + info->screen_size - 1),
593 info->screen_size >> 10);
594
595 return 0;
596
597out_cmap:
598 sh7760fb_blank(FB_BLANK_POWERDOWN, info);
599 fb_dealloc_cmap(&info->cmap);
600out_mem:
601 sh7760fb_free_mem(info);
602out_unmap:
603 if (par->irq >= 0)
604 free_irq(par->irq, &par->vsync);
605 iounmap(par->base);
606out_res:
607 release_resource(par->ioarea);
608 kfree(par->ioarea);
609out_fb:
610 framebuffer_release(info);
611 return ret;
612}
613
614static int __devexit sh7760fb_remove(struct platform_device *dev)
615{
616 struct fb_info *info = platform_get_drvdata(dev);
617 struct sh7760fb_par *par = info->par;
618
619 sh7760fb_blank(FB_BLANK_POWERDOWN, info);
620 unregister_framebuffer(info);
621 fb_dealloc_cmap(&info->cmap);
622 sh7760fb_free_mem(info);
623 if (par->irq >= 0)
624 free_irq(par->irq, par);
625 iounmap(par->base);
626 release_resource(par->ioarea);
627 kfree(par->ioarea);
628 framebuffer_release(info);
629 platform_set_drvdata(dev, NULL);
630
631 return 0;
632}
633
634static struct platform_driver sh7760_lcdc_driver = {
635 .driver = {
636 .name = "sh7760-lcdc",
637 .owner = THIS_MODULE,
638 },
639 .probe = sh7760fb_probe,
640 .remove = __devexit_p(sh7760fb_remove),
641};
642
643static int __init sh7760fb_init(void)
644{
645 return platform_driver_register(&sh7760_lcdc_driver);
646}
647
648static void __exit sh7760fb_exit(void)
649{
650 platform_driver_unregister(&sh7760_lcdc_driver);
651}
652
653module_init(sh7760fb_init);
654module_exit(sh7760fb_exit);
655
656MODULE_AUTHOR("Nobuhiro Iwamatsu, Manuel Lauss");
657MODULE_DESCRIPTION("FBdev for SH7760/63 integrated LCD Controller");
658MODULE_LICENSE("GPL");
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c
new file mode 100644
index 000000000000..f6ef6cca73cd
--- /dev/null
+++ b/drivers/video/sh_mobile_lcdcfb.c
@@ -0,0 +1,725 @@
1/*
2 * SuperH Mobile LCDC Framebuffer
3 *
4 * Copyright (c) 2008 Magnus Damm
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/delay.h>
14#include <linux/mm.h>
15#include <linux/fb.h>
16#include <linux/clk.h>
17#include <linux/platform_device.h>
18#include <linux/dma-mapping.h>
19#include <asm/sh_mobile_lcdc.h>
20
21#define PALETTE_NR 16
22
23struct sh_mobile_lcdc_priv;
24struct sh_mobile_lcdc_chan {
25 struct sh_mobile_lcdc_priv *lcdc;
26 unsigned long *reg_offs;
27 unsigned long ldmt1r_value;
28 unsigned long enabled; /* ME and SE in LDCNT2R */
29 struct sh_mobile_lcdc_chan_cfg cfg;
30 u32 pseudo_palette[PALETTE_NR];
31 struct fb_info info;
32 dma_addr_t dma_handle;
33};
34
35struct sh_mobile_lcdc_priv {
36 void __iomem *base;
37 struct clk *clk;
38 unsigned long lddckr;
39 struct sh_mobile_lcdc_chan ch[2];
40};
41
42/* shared registers */
43#define _LDDCKR 0x410
44#define _LDDCKSTPR 0x414
45#define _LDINTR 0x468
46#define _LDSR 0x46c
47#define _LDCNT1R 0x470
48#define _LDCNT2R 0x474
49#define _LDDDSR 0x47c
50#define _LDDWD0R 0x800
51#define _LDDRDR 0x840
52#define _LDDWAR 0x900
53#define _LDDRAR 0x904
54
55/* per-channel registers */
56enum { LDDCKPAT1R, LDDCKPAT2R, LDMT1R, LDMT2R, LDMT3R, LDDFR, LDSM1R,
57 LDSA1R, LDMLSR, LDHCNR, LDHSYNR, LDVLNR, LDVSYNR, LDPMR };
58
59static unsigned long lcdc_offs_mainlcd[] = {
60 [LDDCKPAT1R] = 0x400,
61 [LDDCKPAT2R] = 0x404,
62 [LDMT1R] = 0x418,
63 [LDMT2R] = 0x41c,
64 [LDMT3R] = 0x420,
65 [LDDFR] = 0x424,
66 [LDSM1R] = 0x428,
67 [LDSA1R] = 0x430,
68 [LDMLSR] = 0x438,
69 [LDHCNR] = 0x448,
70 [LDHSYNR] = 0x44c,
71 [LDVLNR] = 0x450,
72 [LDVSYNR] = 0x454,
73 [LDPMR] = 0x460,
74};
75
76static unsigned long lcdc_offs_sublcd[] = {
77 [LDDCKPAT1R] = 0x408,
78 [LDDCKPAT2R] = 0x40c,
79 [LDMT1R] = 0x600,
80 [LDMT2R] = 0x604,
81 [LDMT3R] = 0x608,
82 [LDDFR] = 0x60c,
83 [LDSM1R] = 0x610,
84 [LDSA1R] = 0x618,
85 [LDMLSR] = 0x620,
86 [LDHCNR] = 0x624,
87 [LDHSYNR] = 0x628,
88 [LDVLNR] = 0x62c,
89 [LDVSYNR] = 0x630,
90 [LDPMR] = 0x63c,
91};
92
93#define START_LCDC 0x00000001
94#define LCDC_RESET 0x00000100
95#define DISPLAY_BEU 0x00000008
96#define LCDC_ENABLE 0x00000001
97
98static void lcdc_write_chan(struct sh_mobile_lcdc_chan *chan,
99 int reg_nr, unsigned long data)
100{
101 iowrite32(data, chan->lcdc->base + chan->reg_offs[reg_nr]);
102}
103
104static unsigned long lcdc_read_chan(struct sh_mobile_lcdc_chan *chan,
105 int reg_nr)
106{
107 return ioread32(chan->lcdc->base + chan->reg_offs[reg_nr]);
108}
109
110static void lcdc_write(struct sh_mobile_lcdc_priv *priv,
111 unsigned long reg_offs, unsigned long data)
112{
113 iowrite32(data, priv->base + reg_offs);
114}
115
116static unsigned long lcdc_read(struct sh_mobile_lcdc_priv *priv,
117 unsigned long reg_offs)
118{
119 return ioread32(priv->base + reg_offs);
120}
121
122static void lcdc_wait_bit(struct sh_mobile_lcdc_priv *priv,
123 unsigned long reg_offs,
124 unsigned long mask, unsigned long until)
125{
126 while ((lcdc_read(priv, reg_offs) & mask) != until)
127 cpu_relax();
128}
129
130static int lcdc_chan_is_sublcd(struct sh_mobile_lcdc_chan *chan)
131{
132 return chan->cfg.chan == LCDC_CHAN_SUBLCD;
133}
134
135static void lcdc_sys_write_index(void *handle, unsigned long data)
136{
137 struct sh_mobile_lcdc_chan *ch = handle;
138
139 lcdc_write(ch->lcdc, _LDDWD0R, data | 0x10000000);
140 lcdc_wait_bit(ch->lcdc, _LDSR, 2, 0);
141 lcdc_write(ch->lcdc, _LDDWAR, 1 | (lcdc_chan_is_sublcd(ch) ? 2 : 0));
142}
143
144static void lcdc_sys_write_data(void *handle, unsigned long data)
145{
146 struct sh_mobile_lcdc_chan *ch = handle;
147
148 lcdc_write(ch->lcdc, _LDDWD0R, data | 0x11000000);
149 lcdc_wait_bit(ch->lcdc, _LDSR, 2, 0);
150 lcdc_write(ch->lcdc, _LDDWAR, 1 | (lcdc_chan_is_sublcd(ch) ? 2 : 0));
151}
152
153static unsigned long lcdc_sys_read_data(void *handle)
154{
155 struct sh_mobile_lcdc_chan *ch = handle;
156
157 lcdc_write(ch->lcdc, _LDDRDR, 0x01000000);
158 lcdc_wait_bit(ch->lcdc, _LDSR, 2, 0);
159 lcdc_write(ch->lcdc, _LDDRAR, 1 | (lcdc_chan_is_sublcd(ch) ? 2 : 0));
160 udelay(1);
161
162 return lcdc_read(ch->lcdc, _LDDRDR) & 0xffff;
163}
164
165struct sh_mobile_lcdc_sys_bus_ops sh_mobile_lcdc_sys_bus_ops = {
166 lcdc_sys_write_index,
167 lcdc_sys_write_data,
168 lcdc_sys_read_data,
169};
170
171static void sh_mobile_lcdc_start_stop(struct sh_mobile_lcdc_priv *priv,
172 int start)
173{
174 unsigned long tmp = lcdc_read(priv, _LDCNT2R);
175 int k;
176
177 /* start or stop the lcdc */
178 if (start)
179 lcdc_write(priv, _LDCNT2R, tmp | START_LCDC);
180 else
181 lcdc_write(priv, _LDCNT2R, tmp & ~START_LCDC);
182
183 /* wait until power is applied/stopped on all channels */
184 for (k = 0; k < ARRAY_SIZE(priv->ch); k++)
185 if (lcdc_read(priv, _LDCNT2R) & priv->ch[k].enabled)
186 while (1) {
187 tmp = lcdc_read_chan(&priv->ch[k], LDPMR) & 3;
188 if (start && tmp == 3)
189 break;
190 if (!start && tmp == 0)
191 break;
192 cpu_relax();
193 }
194
195 if (!start)
196 lcdc_write(priv, _LDDCKSTPR, 1); /* stop dotclock */
197}
198
199static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv)
200{
201 struct sh_mobile_lcdc_chan *ch;
202 struct fb_videomode *lcd_cfg;
203 struct sh_mobile_lcdc_board_cfg *board_cfg;
204 unsigned long tmp;
205 int k, m;
206 int ret = 0;
207
208 /* reset */
209 lcdc_write(priv, _LDCNT2R, lcdc_read(priv, _LDCNT2R) | LCDC_RESET);
210 lcdc_wait_bit(priv, _LDCNT2R, LCDC_RESET, 0);
211
212 /* enable LCDC channels */
213 tmp = lcdc_read(priv, _LDCNT2R);
214 tmp |= priv->ch[0].enabled;
215 tmp |= priv->ch[1].enabled;
216 lcdc_write(priv, _LDCNT2R, tmp);
217
218 /* read data from external memory, avoid using the BEU for now */
219 lcdc_write(priv, _LDCNT2R, lcdc_read(priv, _LDCNT2R) & ~DISPLAY_BEU);
220
221 /* stop the lcdc first */
222 sh_mobile_lcdc_start_stop(priv, 0);
223
224 /* configure clocks */
225 tmp = priv->lddckr;
226 for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
227 ch = &priv->ch[k];
228
229 if (!priv->ch[k].enabled)
230 continue;
231
232 m = ch->cfg.clock_divider;
233 if (!m)
234 continue;
235
236 if (m == 1)
237 m = 1 << 6;
238 tmp |= m << (lcdc_chan_is_sublcd(ch) ? 8 : 0);
239
240 lcdc_write_chan(ch, LDDCKPAT1R, 0x00000000);
241 lcdc_write_chan(ch, LDDCKPAT2R, (1 << (m/2)) - 1);
242 }
243
244 lcdc_write(priv, _LDDCKR, tmp);
245
246 /* start dotclock again */
247 lcdc_write(priv, _LDDCKSTPR, 0);
248 lcdc_wait_bit(priv, _LDDCKSTPR, ~0, 0);
249
250 /* interrupts are disabled */
251 lcdc_write(priv, _LDINTR, 0);
252
253 for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
254 ch = &priv->ch[k];
255 lcd_cfg = &ch->cfg.lcd_cfg;
256
257 if (!ch->enabled)
258 continue;
259
260 tmp = ch->ldmt1r_value;
261 tmp |= (lcd_cfg->sync & FB_SYNC_VERT_HIGH_ACT) ? 0 : 1 << 28;
262 tmp |= (lcd_cfg->sync & FB_SYNC_HOR_HIGH_ACT) ? 0 : 1 << 27;
263 lcdc_write_chan(ch, LDMT1R, tmp);
264
265 /* setup SYS bus */
266 lcdc_write_chan(ch, LDMT2R, ch->cfg.sys_bus_cfg.ldmt2r);
267 lcdc_write_chan(ch, LDMT3R, ch->cfg.sys_bus_cfg.ldmt3r);
268
269 /* horizontal configuration */
270 tmp = lcd_cfg->xres + lcd_cfg->hsync_len;
271 tmp += lcd_cfg->left_margin;
272 tmp += lcd_cfg->right_margin;
273 tmp /= 8; /* HTCN */
274 tmp |= (lcd_cfg->xres / 8) << 16; /* HDCN */
275 lcdc_write_chan(ch, LDHCNR, tmp);
276
277 tmp = lcd_cfg->xres;
278 tmp += lcd_cfg->right_margin;
279 tmp /= 8; /* HSYNP */
280 tmp |= (lcd_cfg->hsync_len / 8) << 16; /* HSYNW */
281 lcdc_write_chan(ch, LDHSYNR, tmp);
282
283 /* power supply */
284 lcdc_write_chan(ch, LDPMR, 0);
285
286 /* vertical configuration */
287 tmp = lcd_cfg->yres + lcd_cfg->vsync_len;
288 tmp += lcd_cfg->upper_margin;
289 tmp += lcd_cfg->lower_margin; /* VTLN */
290 tmp |= lcd_cfg->yres << 16; /* VDLN */
291 lcdc_write_chan(ch, LDVLNR, tmp);
292
293 tmp = lcd_cfg->yres;
294 tmp += lcd_cfg->lower_margin; /* VSYNP */
295 tmp |= lcd_cfg->vsync_len << 16; /* VSYNW */
296 lcdc_write_chan(ch, LDVSYNR, tmp);
297
298 board_cfg = &ch->cfg.board_cfg;
299 if (board_cfg->setup_sys)
300 ret = board_cfg->setup_sys(board_cfg->board_data, ch,
301 &sh_mobile_lcdc_sys_bus_ops);
302 if (ret)
303 return ret;
304 }
305
306 /* --- display_lcdc_data() --- */
307 lcdc_write(priv, _LDINTR, 0x00000f00);
308
309 /* word and long word swap */
310 lcdc_write(priv, _LDDDSR, lcdc_read(priv, _LDDDSR) | 6);
311
312 for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
313 ch = &priv->ch[k];
314
315 if (!priv->ch[k].enabled)
316 continue;
317
318 /* set bpp format in PKF[4:0] */
319 tmp = lcdc_read_chan(ch, LDDFR);
320 tmp &= ~(0x0001001f);
321 tmp |= (priv->ch[k].info.var.bits_per_pixel == 16) ? 3 : 0;
322 lcdc_write_chan(ch, LDDFR, tmp);
323
324 /* point out our frame buffer */
325 lcdc_write_chan(ch, LDSA1R, ch->info.fix.smem_start);
326
327 /* set line size */
328 lcdc_write_chan(ch, LDMLSR, ch->info.fix.line_length);
329
330 /* continuous read mode */
331 lcdc_write_chan(ch, LDSM1R, 0);
332 }
333
334 /* display output */
335 lcdc_write(priv, _LDCNT1R, LCDC_ENABLE);
336
337 /* start the lcdc */
338 sh_mobile_lcdc_start_stop(priv, 1);
339
340 /* tell the board code to enable the panel */
341 for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
342 ch = &priv->ch[k];
343 board_cfg = &ch->cfg.board_cfg;
344 if (board_cfg->display_on)
345 board_cfg->display_on(board_cfg->board_data);
346 }
347
348 return 0;
349}
350
351static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv)
352{
353 struct sh_mobile_lcdc_chan *ch;
354 struct sh_mobile_lcdc_board_cfg *board_cfg;
355 int k;
356
357 /* tell the board code to disable the panel */
358 for (k = 0; k < ARRAY_SIZE(priv->ch); k++) {
359 ch = &priv->ch[k];
360 board_cfg = &ch->cfg.board_cfg;
361 if (board_cfg->display_off)
362 board_cfg->display_off(board_cfg->board_data);
363 }
364
365 /* stop the lcdc */
366 sh_mobile_lcdc_start_stop(priv, 0);
367}
368
369static int sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *ch)
370{
371 int ifm, miftyp;
372
373 switch (ch->cfg.interface_type) {
374 case RGB8: ifm = 0; miftyp = 0; break;
375 case RGB9: ifm = 0; miftyp = 4; break;
376 case RGB12A: ifm = 0; miftyp = 5; break;
377 case RGB12B: ifm = 0; miftyp = 6; break;
378 case RGB16: ifm = 0; miftyp = 7; break;
379 case RGB18: ifm = 0; miftyp = 10; break;
380 case RGB24: ifm = 0; miftyp = 11; break;
381 case SYS8A: ifm = 1; miftyp = 0; break;
382 case SYS8B: ifm = 1; miftyp = 1; break;
383 case SYS8C: ifm = 1; miftyp = 2; break;
384 case SYS8D: ifm = 1; miftyp = 3; break;
385 case SYS9: ifm = 1; miftyp = 4; break;
386 case SYS12: ifm = 1; miftyp = 5; break;
387 case SYS16A: ifm = 1; miftyp = 7; break;
388 case SYS16B: ifm = 1; miftyp = 8; break;
389 case SYS16C: ifm = 1; miftyp = 9; break;
390 case SYS18: ifm = 1; miftyp = 10; break;
391 case SYS24: ifm = 1; miftyp = 11; break;
392 default: goto bad;
393 }
394
395 /* SUBLCD only supports SYS interface */
396 if (lcdc_chan_is_sublcd(ch)) {
397 if (ifm == 0)
398 goto bad;
399 else
400 ifm = 0;
401 }
402
403 ch->ldmt1r_value = (ifm << 12) | miftyp;
404 return 0;
405 bad:
406 return -EINVAL;
407}
408
409static int sh_mobile_lcdc_setup_clocks(struct device *dev, int clock_source,
410 struct sh_mobile_lcdc_priv *priv)
411{
412 char *str;
413 int icksel;
414
415 switch (clock_source) {
416 case LCDC_CLK_BUS: str = "bus_clk"; icksel = 0; break;
417 case LCDC_CLK_PERIPHERAL: str = "peripheral_clk"; icksel = 1; break;
418 case LCDC_CLK_EXTERNAL: str = NULL; icksel = 2; break;
419 default:
420 return -EINVAL;
421 }
422
423 priv->lddckr = icksel << 16;
424
425 if (str) {
426 priv->clk = clk_get(dev, str);
427 if (IS_ERR(priv->clk)) {
428 dev_err(dev, "cannot get clock %s\n", str);
429 return PTR_ERR(priv->clk);
430 }
431
432 clk_enable(priv->clk);
433 }
434
435 return 0;
436}
437
438static int sh_mobile_lcdc_setcolreg(u_int regno,
439 u_int red, u_int green, u_int blue,
440 u_int transp, struct fb_info *info)
441{
442 u32 *palette = info->pseudo_palette;
443
444 if (regno >= PALETTE_NR)
445 return -EINVAL;
446
447 /* only FB_VISUAL_TRUECOLOR supported */
448
449 red >>= 16 - info->var.red.length;
450 green >>= 16 - info->var.green.length;
451 blue >>= 16 - info->var.blue.length;
452 transp >>= 16 - info->var.transp.length;
453
454 palette[regno] = (red << info->var.red.offset) |
455 (green << info->var.green.offset) |
456 (blue << info->var.blue.offset) |
457 (transp << info->var.transp.offset);
458
459 return 0;
460}
461
462static struct fb_fix_screeninfo sh_mobile_lcdc_fix = {
463 .id = "SH Mobile LCDC",
464 .type = FB_TYPE_PACKED_PIXELS,
465 .visual = FB_VISUAL_TRUECOLOR,
466 .accel = FB_ACCEL_NONE,
467};
468
469static struct fb_ops sh_mobile_lcdc_ops = {
470 .fb_setcolreg = sh_mobile_lcdc_setcolreg,
471 .fb_fillrect = cfb_fillrect,
472 .fb_copyarea = cfb_copyarea,
473 .fb_imageblit = cfb_imageblit,
474};
475
476static int sh_mobile_lcdc_set_bpp(struct fb_var_screeninfo *var, int bpp)
477{
478 switch (bpp) {
479 case 16: /* PKF[4:0] = 00011 - RGB 565 */
480 var->red.offset = 11;
481 var->red.length = 5;
482 var->green.offset = 5;
483 var->green.length = 6;
484 var->blue.offset = 0;
485 var->blue.length = 5;
486 var->transp.offset = 0;
487 var->transp.length = 0;
488 break;
489
490 case 32: /* PKF[4:0] = 00000 - RGB 888
491 * sh7722 pdf says 00RRGGBB but reality is GGBB00RR
492 * this may be because LDDDSR has word swap enabled..
493 */
494 var->red.offset = 0;
495 var->red.length = 8;
496 var->green.offset = 24;
497 var->green.length = 8;
498 var->blue.offset = 16;
499 var->blue.length = 8;
500 var->transp.offset = 0;
501 var->transp.length = 0;
502 break;
503 default:
504 return -EINVAL;
505 }
506 var->bits_per_pixel = bpp;
507 var->red.msb_right = 0;
508 var->green.msb_right = 0;
509 var->blue.msb_right = 0;
510 var->transp.msb_right = 0;
511 return 0;
512}
513
514static int sh_mobile_lcdc_remove(struct platform_device *pdev);
515
516static int __init sh_mobile_lcdc_probe(struct platform_device *pdev)
517{
518 struct fb_info *info;
519 struct sh_mobile_lcdc_priv *priv;
520 struct sh_mobile_lcdc_info *pdata;
521 struct sh_mobile_lcdc_chan_cfg *cfg;
522 struct resource *res;
523 int error;
524 void *buf;
525 int i, j;
526
527 if (!pdev->dev.platform_data) {
528 dev_err(&pdev->dev, "no platform data defined\n");
529 error = -EINVAL;
530 goto err0;
531 }
532
533 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
534 if (res == NULL) {
535 dev_err(&pdev->dev, "cannot find IO resource\n");
536 error = -ENOENT;
537 goto err0;
538 }
539
540 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
541 if (!priv) {
542 dev_err(&pdev->dev, "cannot allocate device data\n");
543 error = -ENOMEM;
544 goto err0;
545 }
546
547 platform_set_drvdata(pdev, priv);
548 pdata = pdev->dev.platform_data;
549
550 j = 0;
551 for (i = 0; i < ARRAY_SIZE(pdata->ch); i++) {
552 priv->ch[j].lcdc = priv;
553 memcpy(&priv->ch[j].cfg, &pdata->ch[i], sizeof(pdata->ch[i]));
554
555 error = sh_mobile_lcdc_check_interface(&priv->ch[i]);
556 if (error) {
557 dev_err(&pdev->dev, "unsupported interface type\n");
558 goto err1;
559 }
560
561 switch (pdata->ch[i].chan) {
562 case LCDC_CHAN_MAINLCD:
563 priv->ch[j].enabled = 1 << 1;
564 priv->ch[j].reg_offs = lcdc_offs_mainlcd;
565 j++;
566 break;
567 case LCDC_CHAN_SUBLCD:
568 priv->ch[j].enabled = 1 << 2;
569 priv->ch[j].reg_offs = lcdc_offs_sublcd;
570 j++;
571 break;
572 }
573 }
574
575 if (!j) {
576 dev_err(&pdev->dev, "no channels defined\n");
577 error = -EINVAL;
578 goto err1;
579 }
580
581 error = sh_mobile_lcdc_setup_clocks(&pdev->dev,
582 pdata->clock_source, priv);
583 if (error) {
584 dev_err(&pdev->dev, "unable to setup clocks\n");
585 goto err1;
586 }
587
588 priv->lddckr = pdata->lddckr;
589 priv->base = ioremap_nocache(res->start, (res->end - res->start) + 1);
590
591 for (i = 0; i < j; i++) {
592 info = &priv->ch[i].info;
593 cfg = &priv->ch[i].cfg;
594
595 info->fbops = &sh_mobile_lcdc_ops;
596 info->var.xres = info->var.xres_virtual = cfg->lcd_cfg.xres;
597 info->var.yres = info->var.yres_virtual = cfg->lcd_cfg.yres;
598 info->var.activate = FB_ACTIVATE_NOW;
599 error = sh_mobile_lcdc_set_bpp(&info->var, cfg->bpp);
600 if (error)
601 break;
602
603 info->fix = sh_mobile_lcdc_fix;
604 info->fix.line_length = cfg->lcd_cfg.xres * (cfg->bpp / 8);
605 info->fix.smem_len = info->fix.line_length * cfg->lcd_cfg.yres;
606
607 buf = dma_alloc_coherent(&pdev->dev, info->fix.smem_len,
608 &priv->ch[i].dma_handle, GFP_KERNEL);
609 if (!buf) {
610 dev_err(&pdev->dev, "unable to allocate buffer\n");
611 error = -ENOMEM;
612 break;
613 }
614
615 info->pseudo_palette = &priv->ch[i].pseudo_palette;
616 info->flags = FBINFO_FLAG_DEFAULT;
617
618 error = fb_alloc_cmap(&info->cmap, PALETTE_NR, 0);
619 if (error < 0) {
620 dev_err(&pdev->dev, "unable to allocate cmap\n");
621 dma_free_coherent(&pdev->dev, info->fix.smem_len,
622 buf, priv->ch[i].dma_handle);
623 break;
624 }
625
626 memset(buf, 0, info->fix.smem_len);
627 info->fix.smem_start = priv->ch[i].dma_handle;
628 info->screen_base = buf;
629 info->device = &pdev->dev;
630 }
631
632 if (error)
633 goto err1;
634
635 error = sh_mobile_lcdc_start(priv);
636 if (error) {
637 dev_err(&pdev->dev, "unable to start hardware\n");
638 goto err1;
639 }
640
641 for (i = 0; i < j; i++) {
642 error = register_framebuffer(&priv->ch[i].info);
643 if (error < 0)
644 goto err1;
645 }
646
647 for (i = 0; i < j; i++) {
648 info = &priv->ch[i].info;
649 dev_info(info->dev,
650 "registered %s/%s as %dx%d %dbpp.\n",
651 pdev->name,
652 (priv->ch[i].cfg.chan == LCDC_CHAN_MAINLCD) ?
653 "mainlcd" : "sublcd",
654 (int) priv->ch[i].cfg.lcd_cfg.xres,
655 (int) priv->ch[i].cfg.lcd_cfg.yres,
656 priv->ch[i].cfg.bpp);
657 }
658
659 return 0;
660 err1:
661 sh_mobile_lcdc_remove(pdev);
662 err0:
663 return error;
664}
665
666static int sh_mobile_lcdc_remove(struct platform_device *pdev)
667{
668 struct sh_mobile_lcdc_priv *priv = platform_get_drvdata(pdev);
669 struct fb_info *info;
670 int i;
671
672 for (i = 0; i < ARRAY_SIZE(priv->ch); i++)
673 if (priv->ch[i].info.dev)
674 unregister_framebuffer(&priv->ch[i].info);
675
676 sh_mobile_lcdc_stop(priv);
677
678 for (i = 0; i < ARRAY_SIZE(priv->ch); i++) {
679 info = &priv->ch[i].info;
680
681 if (!info->device)
682 continue;
683
684 dma_free_coherent(&pdev->dev, info->fix.smem_len,
685 info->screen_base, priv->ch[i].dma_handle);
686 fb_dealloc_cmap(&info->cmap);
687 }
688
689 if (priv->clk) {
690 clk_disable(priv->clk);
691 clk_put(priv->clk);
692 }
693
694 if (priv->base)
695 iounmap(priv->base);
696
697 kfree(priv);
698 return 0;
699}
700
701static struct platform_driver sh_mobile_lcdc_driver = {
702 .driver = {
703 .name = "sh_mobile_lcdc_fb",
704 .owner = THIS_MODULE,
705 },
706 .probe = sh_mobile_lcdc_probe,
707 .remove = sh_mobile_lcdc_remove,
708};
709
710static int __init sh_mobile_lcdc_init(void)
711{
712 return platform_driver_register(&sh_mobile_lcdc_driver);
713}
714
715static void __exit sh_mobile_lcdc_exit(void)
716{
717 platform_driver_unregister(&sh_mobile_lcdc_driver);
718}
719
720module_init(sh_mobile_lcdc_init);
721module_exit(sh_mobile_lcdc_exit);
722
723MODULE_DESCRIPTION("SuperH Mobile LCDC Framebuffer driver");
724MODULE_AUTHOR("Magnus Damm <damm@opensource.se>");
725MODULE_LICENSE("GPL v2");
diff --git a/drivers/video/sis/init.h b/drivers/video/sis/init.h
index f40a680df86f..b96005c39c67 100644
--- a/drivers/video/sis/init.h
+++ b/drivers/video/sis/init.h
@@ -73,7 +73,6 @@
73#ifdef SIS_CP 73#ifdef SIS_CP
74#undef SIS_CP 74#undef SIS_CP
75#endif 75#endif
76#include <linux/version.h>
77#include <linux/types.h> 76#include <linux/types.h>
78#include <asm/io.h> 77#include <asm/io.h>
79#include <linux/fb.h> 78#include <linux/fb.h>
diff --git a/drivers/video/sis/init301.h b/drivers/video/sis/init301.h
index 7708e1e1d99e..51d99222375d 100644
--- a/drivers/video/sis/init301.h
+++ b/drivers/video/sis/init301.h
@@ -67,7 +67,6 @@
67#ifdef SIS_CP 67#ifdef SIS_CP
68#undef SIS_CP 68#undef SIS_CP
69#endif 69#endif
70#include <linux/version.h>
71#include <linux/types.h> 70#include <linux/types.h>
72#include <asm/io.h> 71#include <asm/io.h>
73#include <linux/fb.h> 72#include <linux/fb.h>
diff --git a/drivers/video/sis/initextlfb.c b/drivers/video/sis/initextlfb.c
index 47a33501549d..99c04a4855d1 100644
--- a/drivers/video/sis/initextlfb.c
+++ b/drivers/video/sis/initextlfb.c
@@ -30,7 +30,6 @@
30#include "vgatypes.h" 30#include "vgatypes.h"
31#include "vstruct.h" 31#include "vstruct.h"
32 32
33#include <linux/version.h>
34#include <linux/types.h> 33#include <linux/types.h>
35#include <linux/fb.h> 34#include <linux/fb.h>
36 35
diff --git a/drivers/video/sis/osdef.h b/drivers/video/sis/osdef.h
index c1492782cb18..6ff8f988a1a7 100644
--- a/drivers/video/sis/osdef.h
+++ b/drivers/video/sis/osdef.h
@@ -87,7 +87,6 @@
87/**********************************************************************/ 87/**********************************************************************/
88 88
89#ifdef SIS_LINUX_KERNEL 89#ifdef SIS_LINUX_KERNEL
90#include <linux/version.h>
91 90
92#ifdef CONFIG_FB_SIS_300 91#ifdef CONFIG_FB_SIS_300
93#define SIS300 92#define SIS300
diff --git a/drivers/video/sis/sis.h b/drivers/video/sis/sis.h
index a14e82211037..7c5710e3fb56 100644
--- a/drivers/video/sis/sis.h
+++ b/drivers/video/sis/sis.h
@@ -24,8 +24,6 @@
24#ifndef _SIS_H_ 24#ifndef _SIS_H_
25#define _SIS_H_ 25#define _SIS_H_
26 26
27#include <linux/version.h>
28
29#include "osdef.h" 27#include "osdef.h"
30#include <video/sisfb.h> 28#include <video/sisfb.h>
31 29
@@ -42,16 +40,6 @@
42#define SIS_NEW_CONFIG_COMPAT 40#define SIS_NEW_CONFIG_COMPAT
43#endif /* CONFIG_COMPAT */ 41#endif /* CONFIG_COMPAT */
44 42
45#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8)
46#define SIS_IOTYPE1 void __iomem
47#define SIS_IOTYPE2 __iomem
48#define SISINITSTATIC static
49#else
50#define SIS_IOTYPE1 unsigned char
51#define SIS_IOTYPE2
52#define SISINITSTATIC
53#endif
54
55#undef SISFBDEBUG 43#undef SISFBDEBUG
56 44
57#ifdef SISFBDEBUG 45#ifdef SISFBDEBUG
@@ -505,8 +493,8 @@ struct sis_video_info {
505 493
506 unsigned long UMAsize, LFBsize; 494 unsigned long UMAsize, LFBsize;
507 495
508 SIS_IOTYPE1 *video_vbase; 496 void __iomem *video_vbase;
509 SIS_IOTYPE1 *mmio_vbase; 497 void __iomem *mmio_vbase;
510 498
511 unsigned char *bios_abase; 499 unsigned char *bios_abase;
512 500
@@ -533,8 +521,8 @@ struct sis_video_info {
533 int sisfb_nocrt2rate; 521 int sisfb_nocrt2rate;
534 522
535 u32 heapstart; /* offset */ 523 u32 heapstart; /* offset */
536 SIS_IOTYPE1 *sisfb_heap_start; /* address */ 524 void __iomem *sisfb_heap_start; /* address */
537 SIS_IOTYPE1 *sisfb_heap_end; /* address */ 525 void __iomem *sisfb_heap_end; /* address */
538 u32 sisfb_heap_size; 526 u32 sisfb_heap_size;
539 int havenoheap; 527 int havenoheap;
540 528
@@ -612,7 +600,7 @@ struct sis_video_info {
612 u8 detectedpdca; 600 u8 detectedpdca;
613 u8 detectedlcda; 601 u8 detectedlcda;
614 602
615 SIS_IOTYPE1 *hwcursor_vbase; 603 void __iomem *hwcursor_vbase;
616 604
617 int chronteltype; 605 int chronteltype;
618 int tvxpos, tvypos; 606 int tvxpos, tvypos;
diff --git a/drivers/video/sis/sis_accel.c b/drivers/video/sis/sis_accel.c
index 7addf91d2fea..ceb434c95c0d 100644
--- a/drivers/video/sis/sis_accel.c
+++ b/drivers/video/sis/sis_accel.c
@@ -28,7 +28,6 @@
28 * for more information and updates) 28 * for more information and updates)
29 */ 29 */
30 30
31#include <linux/version.h>
32#include <linux/module.h> 31#include <linux/module.h>
33#include <linux/kernel.h> 32#include <linux/kernel.h>
34#include <linux/fb.h> 33#include <linux/fb.h>
diff --git a/drivers/video/sis/sis_main.c b/drivers/video/sis/sis_main.c
index b9343844cd1f..346d6458cf76 100644
--- a/drivers/video/sis/sis_main.c
+++ b/drivers/video/sis/sis_main.c
@@ -33,7 +33,6 @@
33 * 33 *
34 */ 34 */
35 35
36#include <linux/version.h>
37#include <linux/module.h> 36#include <linux/module.h>
38#include <linux/moduleparam.h> 37#include <linux/moduleparam.h>
39#include <linux/kernel.h> 38#include <linux/kernel.h>
@@ -41,13 +40,7 @@
41#include <linux/errno.h> 40#include <linux/errno.h>
42#include <linux/string.h> 41#include <linux/string.h>
43#include <linux/mm.h> 42#include <linux/mm.h>
44
45#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
46#include <linux/tty.h>
47#else
48#include <linux/screen_info.h> 43#include <linux/screen_info.h>
49#endif
50
51#include <linux/slab.h> 44#include <linux/slab.h>
52#include <linux/fb.h> 45#include <linux/fb.h>
53#include <linux/selection.h> 46#include <linux/selection.h>
@@ -1167,11 +1160,7 @@ sisfb_set_mode(struct sis_video_info *ivideo, int clrscrn)
1167 unsigned short modeno = ivideo->mode_no; 1160 unsigned short modeno = ivideo->mode_no;
1168 1161
1169 /* >=2.6.12's fbcon clears the screen anyway */ 1162 /* >=2.6.12's fbcon clears the screen anyway */
1170#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
1171 if(!clrscrn) modeno |= 0x80;
1172#else
1173 modeno |= 0x80; 1163 modeno |= 0x80;
1174#endif
1175 1164
1176 outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD); 1165 outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
1177 1166
@@ -1436,11 +1425,8 @@ sisfb_set_par(struct fb_info *info)
1436 if((err = sisfb_do_set_var(&info->var, 1, info))) 1425 if((err = sisfb_do_set_var(&info->var, 1, info)))
1437 return err; 1426 return err;
1438 1427
1439#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
1440 sisfb_get_fix(&info->fix, info->currcon, info);
1441#else
1442 sisfb_get_fix(&info->fix, -1, info); 1428 sisfb_get_fix(&info->fix, -1, info);
1443#endif 1429
1444 return 0; 1430 return 0;
1445} 1431}
1446 1432
@@ -1676,14 +1662,8 @@ sisfb_blank(int blank, struct fb_info *info)
1676 1662
1677/* ----------- FBDev related routines for all series ---------- */ 1663/* ----------- FBDev related routines for all series ---------- */
1678 1664
1679#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
1680static int sisfb_ioctl(struct fb_info *info, unsigned int cmd, 1665static int sisfb_ioctl(struct fb_info *info, unsigned int cmd,
1681 unsigned long arg) 1666 unsigned long arg)
1682#else
1683static int sisfb_ioctl(struct inode *inode, struct file *file,
1684 unsigned int cmd, unsigned long arg,
1685 struct fb_info *info)
1686#endif
1687{ 1667{
1688 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; 1668 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1689 struct sis_memreq sismemreq; 1669 struct sis_memreq sismemreq;
@@ -3986,8 +3966,7 @@ sisfb_handle_command(struct sis_video_info *ivideo, struct sisfb_cmd *sisfb_comm
3986} 3966}
3987 3967
3988#ifndef MODULE 3968#ifndef MODULE
3989SISINITSTATIC int __init 3969static int __init sisfb_setup(char *options)
3990sisfb_setup(char *options)
3991{ 3970{
3992 char *this_opt; 3971 char *this_opt;
3993 3972
@@ -4086,9 +4065,9 @@ sisfb_setup(char *options)
4086#endif 4065#endif
4087 4066
4088static int __devinit 4067static int __devinit
4089sisfb_check_rom(SIS_IOTYPE1 *rom_base, struct sis_video_info *ivideo) 4068sisfb_check_rom(void __iomem *rom_base, struct sis_video_info *ivideo)
4090{ 4069{
4091 SIS_IOTYPE1 *rom; 4070 void __iomem *rom;
4092 int romptr; 4071 int romptr;
4093 4072
4094 if((readb(rom_base) != 0x55) || (readb(rom_base + 1) != 0xaa)) 4073 if((readb(rom_base) != 0x55) || (readb(rom_base + 1) != 0xaa))
@@ -4117,10 +4096,9 @@ static unsigned char * __devinit
4117sisfb_find_rom(struct pci_dev *pdev) 4096sisfb_find_rom(struct pci_dev *pdev)
4118{ 4097{
4119 struct sis_video_info *ivideo = pci_get_drvdata(pdev); 4098 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4120 SIS_IOTYPE1 *rom_base; 4099 void __iomem *rom_base;
4121 unsigned char *myrombase = NULL; 4100 unsigned char *myrombase = NULL;
4122 u32 temp; 4101 u32 temp;
4123#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
4124 size_t romsize; 4102 size_t romsize;
4125 4103
4126 /* First, try the official pci ROM functions (except 4104 /* First, try the official pci ROM functions (except
@@ -4151,7 +4129,6 @@ sisfb_find_rom(struct pci_dev *pdev)
4151 } 4129 }
4152 4130
4153 if(myrombase) return myrombase; 4131 if(myrombase) return myrombase;
4154#endif
4155 4132
4156 /* Otherwise do it the conventional way. */ 4133 /* Otherwise do it the conventional way. */
4157 4134
@@ -4225,7 +4202,7 @@ sisfb_post_map_vram(struct sis_video_info *ivideo, unsigned int *mapsize,
4225static int __devinit 4202static int __devinit
4226sisfb_post_300_buswidth(struct sis_video_info *ivideo) 4203sisfb_post_300_buswidth(struct sis_video_info *ivideo)
4227{ 4204{
4228 SIS_IOTYPE1 *FBAddress = ivideo->video_vbase; 4205 void __iomem *FBAddress = ivideo->video_vbase;
4229 unsigned short temp; 4206 unsigned short temp;
4230 unsigned char reg; 4207 unsigned char reg;
4231 int i, j; 4208 int i, j;
@@ -4273,7 +4250,7 @@ sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration, int buswidth
4273 int PseudoRankCapacity, int PseudoAdrPinCount, 4250 int PseudoRankCapacity, int PseudoAdrPinCount,
4274 unsigned int mapsize) 4251 unsigned int mapsize)
4275{ 4252{
4276 SIS_IOTYPE1 *FBAddr = ivideo->video_vbase; 4253 void __iomem *FBAddr = ivideo->video_vbase;
4277 unsigned short sr14; 4254 unsigned short sr14;
4278 unsigned int k, RankCapacity, PageCapacity, BankNumHigh, BankNumMid; 4255 unsigned int k, RankCapacity, PageCapacity, BankNumHigh, BankNumMid;
4279 unsigned int PhysicalAdrOtherPage, PhysicalAdrHigh, PhysicalAdrHalfPage; 4256 unsigned int PhysicalAdrOtherPage, PhysicalAdrHigh, PhysicalAdrHalfPage;
@@ -5829,7 +5806,7 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
5829 ivideo->engineok = 0; 5806 ivideo->engineok = 0;
5830 5807
5831 ivideo->sisfb_was_boot_device = 0; 5808 ivideo->sisfb_was_boot_device = 0;
5832#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)) 5809
5833 if(pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW) { 5810 if(pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW) {
5834 if(ivideo->sisvga_enabled) 5811 if(ivideo->sisvga_enabled)
5835 ivideo->sisfb_was_boot_device = 1; 5812 ivideo->sisfb_was_boot_device = 1;
@@ -5840,7 +5817,6 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
5840 "as the primary VGA device\n"); 5817 "as the primary VGA device\n");
5841 } 5818 }
5842 } 5819 }
5843#endif
5844 5820
5845 ivideo->sisfb_parm_mem = sisfb_parm_mem; 5821 ivideo->sisfb_parm_mem = sisfb_parm_mem;
5846 ivideo->sisfb_accel = sisfb_accel; 5822 ivideo->sisfb_accel = sisfb_accel;
@@ -6010,7 +5986,7 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
6010 ivideo->modeprechange = reg & 0x7f; 5986 ivideo->modeprechange = reg & 0x7f;
6011 } else if(ivideo->sisvga_enabled) { 5987 } else if(ivideo->sisvga_enabled) {
6012#if defined(__i386__) || defined(__x86_64__) 5988#if defined(__i386__) || defined(__x86_64__)
6013 unsigned char SIS_IOTYPE2 *tt = ioremap(0x400, 0x100); 5989 unsigned char __iomem *tt = ioremap(0x400, 0x100);
6014 if(tt) { 5990 if(tt) {
6015 ivideo->modeprechange = readb(tt + 0x49); 5991 ivideo->modeprechange = readb(tt + 0x49);
6016 iounmap(tt); 5992 iounmap(tt);
@@ -6503,7 +6479,7 @@ static struct pci_driver sisfb_driver = {
6503 .remove = __devexit_p(sisfb_remove) 6479 .remove = __devexit_p(sisfb_remove)
6504}; 6480};
6505 6481
6506SISINITSTATIC int __init sisfb_init(void) 6482static int __init sisfb_init(void)
6507{ 6483{
6508#ifndef MODULE 6484#ifndef MODULE
6509 char *options = NULL; 6485 char *options = NULL;
diff --git a/drivers/video/sis/sis_main.h b/drivers/video/sis/sis_main.h
index 3e3b7fa05d6c..9540e977270e 100644
--- a/drivers/video/sis/sis_main.h
+++ b/drivers/video/sis/sis_main.h
@@ -665,11 +665,11 @@ static struct _customttable {
665 665
666/* Interface used by the world */ 666/* Interface used by the world */
667#ifndef MODULE 667#ifndef MODULE
668SISINITSTATIC int sisfb_setup(char *options); 668static int sisfb_setup(char *options);
669#endif 669#endif
670 670
671/* Interface to the low level console driver */ 671/* Interface to the low level console driver */
672SISINITSTATIC int sisfb_init(void); 672static int sisfb_init(void);
673 673
674/* fbdev routines */ 674/* fbdev routines */
675static int sisfb_get_fix(struct fb_fix_screeninfo *fix, int con, 675static int sisfb_get_fix(struct fb_fix_screeninfo *fix, int con,
diff --git a/drivers/video/sis/vgatypes.h b/drivers/video/sis/vgatypes.h
index b532fbd2b04c..81a22eaabfde 100644
--- a/drivers/video/sis/vgatypes.h
+++ b/drivers/video/sis/vgatypes.h
@@ -53,10 +53,6 @@
53#ifndef _VGATYPES_H_ 53#ifndef _VGATYPES_H_
54#define _VGATYPES_H_ 54#define _VGATYPES_H_
55 55
56#ifdef SIS_LINUX_KERNEL
57#include <linux/version.h>
58#endif
59
60#define SISIOMEMTYPE 56#define SISIOMEMTYPE
61 57
62#ifdef SIS_LINUX_KERNEL 58#ifdef SIS_LINUX_KERNEL
diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c
index 62321458f71a..df5336561d13 100644
--- a/drivers/video/skeletonfb.c
+++ b/drivers/video/skeletonfb.c
@@ -675,13 +675,13 @@ static struct fb_ops xxxfb_ops = {
675 * Initialization 675 * Initialization
676 */ 676 */
677 677
678/* static int __init xxfb_probe (struct device *device) -- for platform devs */ 678/* static int __init xxfb_probe (struct platform_device *pdev) -- for platform devs */
679static int __devinit xxxfb_probe(struct pci_dev *dev, 679static int __devinit xxxfb_probe(struct pci_dev *dev,
680 const struct pci_device_id *ent) 680 const struct pci_device_id *ent)
681{ 681{
682 struct fb_info *info; 682 struct fb_info *info;
683 struct xxx_par *par; 683 struct xxx_par *par;
684 struct device* device = &dev->dev; /* for pci drivers */ 684 struct device *device = &dev->dev; /* or &pdev->dev */
685 int cmap_len, retval; 685 int cmap_len, retval;
686 686
687 /* 687 /*
@@ -824,18 +824,18 @@ static int __devinit xxxfb_probe(struct pci_dev *dev,
824 return -EINVAL; 824 return -EINVAL;
825 printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, 825 printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
826 info->fix.id); 826 info->fix.id);
827 pci_set_drvdata(dev, info); /* or dev_set_drvdata(device, info) */ 827 pci_set_drvdata(dev, info); /* or platform_set_drvdata(pdev, info) */
828 return 0; 828 return 0;
829} 829}
830 830
831 /* 831 /*
832 * Cleanup 832 * Cleanup
833 */ 833 */
834/* static void __devexit xxxfb_remove(struct device *device) */ 834/* static void __devexit xxxfb_remove(struct platform_device *pdev) */
835static void __devexit xxxfb_remove(struct pci_dev *dev) 835static void __devexit xxxfb_remove(struct pci_dev *dev)
836{ 836{
837 struct fb_info *info = pci_get_drvdata(dev); 837 struct fb_info *info = pci_get_drvdata(dev);
838 /* or dev_get_drvdata(device); */ 838 /* or platform_get_drvdata(pdev); */
839 839
840 if (info) { 840 if (info) {
841 unregister_framebuffer(info); 841 unregister_framebuffer(info);
@@ -961,18 +961,17 @@ static int xxxfb_resume(struct platform_dev *dev)
961#define xxxfb_resume NULL 961#define xxxfb_resume NULL
962#endif /* CONFIG_PM */ 962#endif /* CONFIG_PM */
963 963
964static struct device_driver xxxfb_driver = { 964static struct platform_device_driver xxxfb_driver = {
965 .name = "xxxfb",
966 .bus = &platform_bus_type,
967 .probe = xxxfb_probe, 965 .probe = xxxfb_probe,
968 .remove = xxxfb_remove, 966 .remove = xxxfb_remove,
969 .suspend = xxxfb_suspend, /* optional but recommended */ 967 .suspend = xxxfb_suspend, /* optional but recommended */
970 .resume = xxxfb_resume, /* optional but recommended */ 968 .resume = xxxfb_resume, /* optional but recommended */
969 .driver = {
970 .name = "xxxfb",
971 },
971}; 972};
972 973
973static struct platform_device xxxfb_device = { 974static struct platform_device *xxxfb_device;
974 .name = "xxxfb",
975};
976 975
977#ifndef MODULE 976#ifndef MODULE
978 /* 977 /*
@@ -1002,12 +1001,16 @@ static int __init xxxfb_init(void)
1002 return -ENODEV; 1001 return -ENODEV;
1003 xxxfb_setup(option); 1002 xxxfb_setup(option);
1004#endif 1003#endif
1005 ret = driver_register(&xxxfb_driver); 1004 ret = platform_driver_register(&xxxfb_driver);
1006 1005
1007 if (!ret) { 1006 if (!ret) {
1008 ret = platform_device_register(&xxxfb_device); 1007 xxxfb_device = platform_device_register_simple("xxxfb", 0,
1009 if (ret) 1008 NULL, 0);
1010 driver_unregister(&xxxfb_driver); 1009
1010 if (IS_ERR(xxxfb_device)) {
1011 platform_driver_unregister(&xxxfb_driver);
1012 ret = PTR_ERR(xxxfb_device);
1013 }
1011 } 1014 }
1012 1015
1013 return ret; 1016 return ret;
@@ -1015,8 +1018,8 @@ static int __init xxxfb_init(void)
1015 1018
1016static void __exit xxxfb_exit(void) 1019static void __exit xxxfb_exit(void)
1017{ 1020{
1018 platform_device_unregister(&xxxfb_device); 1021 platform_device_unregister(xxxfb_device);
1019 driver_unregister(&xxxfb_driver); 1022 platform_driver_unregister(&xxxfb_driver);
1020} 1023}
1021#endif /* CONFIG_PCI */ 1024#endif /* CONFIG_PCI */
1022 1025
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
index 15d4a768b1f6..f94ae84a58cd 100644
--- a/drivers/video/sm501fb.c
+++ b/drivers/video/sm501fb.c
@@ -48,10 +48,15 @@ enum sm501_controller {
48 HEAD_PANEL = 1, 48 HEAD_PANEL = 1,
49}; 49};
50 50
51/* SM501 memory address */ 51/* SM501 memory address.
52 *
53 * This structure is used to track memory usage within the SM501 framebuffer
54 * allocation. The sm_addr field is stored as an offset as it is often used
55 * against both the physical and mapped addresses.
56 */
52struct sm501_mem { 57struct sm501_mem {
53 unsigned long size; 58 unsigned long size;
54 unsigned long sm_addr; 59 unsigned long sm_addr; /* offset from base of sm501 fb. */
55 void __iomem *k_addr; 60 void __iomem *k_addr;
56}; 61};
57 62
@@ -142,31 +147,68 @@ static inline void sm501fb_sync_regs(struct sm501fb_info *info)
142static int sm501_alloc_mem(struct sm501fb_info *inf, struct sm501_mem *mem, 147static int sm501_alloc_mem(struct sm501fb_info *inf, struct sm501_mem *mem,
143 unsigned int why, size_t size) 148 unsigned int why, size_t size)
144{ 149{
145 unsigned int ptr = 0; 150 struct sm501fb_par *par;
151 struct fb_info *fbi;
152 unsigned int ptr;
153 unsigned int end;
146 154
147 switch (why) { 155 switch (why) {
148 case SM501_MEMF_CURSOR: 156 case SM501_MEMF_CURSOR:
149 ptr = inf->fbmem_len - size; 157 ptr = inf->fbmem_len - size;
150 inf->fbmem_len = ptr; 158 inf->fbmem_len = ptr; /* adjust available memory. */
151 break; 159 break;
152 160
153 case SM501_MEMF_PANEL: 161 case SM501_MEMF_PANEL:
154 ptr = inf->fbmem_len - size; 162 ptr = inf->fbmem_len - size;
155 if (ptr < inf->fb[0]->fix.smem_len) 163 fbi = inf->fb[HEAD_CRT];
164
165 /* round down, some programs such as directfb do not draw
166 * 0,0 correctly unless the start is aligned to a page start.
167 */
168
169 if (ptr > 0)
170 ptr &= ~(PAGE_SIZE - 1);
171
172 if (fbi && ptr < fbi->fix.smem_len)
173 return -ENOMEM;
174
175 if (ptr < 0)
156 return -ENOMEM; 176 return -ENOMEM;
157 177
158 break; 178 break;
159 179
160 case SM501_MEMF_CRT: 180 case SM501_MEMF_CRT:
161 ptr = 0; 181 ptr = 0;
182
183 /* check to see if we have panel memory allocated
184 * which would put an limit on available memory. */
185
186 fbi = inf->fb[HEAD_PANEL];
187 if (fbi) {
188 par = fbi->par;
189 end = par->screen.k_addr ? par->screen.sm_addr : inf->fbmem_len;
190 } else
191 end = inf->fbmem_len;
192
193 if ((ptr + size) > end)
194 return -ENOMEM;
195
162 break; 196 break;
163 197
164 case SM501_MEMF_ACCEL: 198 case SM501_MEMF_ACCEL:
165 ptr = inf->fb[0]->fix.smem_len; 199 fbi = inf->fb[HEAD_CRT];
200 ptr = fbi ? fbi->fix.smem_len : 0;
201
202 fbi = inf->fb[HEAD_PANEL];
203 if (fbi) {
204 par = fbi->par;
205 end = par->screen.sm_addr;
206 } else
207 end = inf->fbmem_len;
166 208
167 if ((ptr + size) > 209 if ((ptr + size) > end)
168 (inf->fb[1]->fix.smem_start - inf->fbmem_res->start))
169 return -ENOMEM; 210 return -ENOMEM;
211
170 break; 212 break;
171 213
172 default: 214 default:
@@ -663,15 +705,25 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
663 sm501fb_sync_regs(fbi); 705 sm501fb_sync_regs(fbi);
664 mdelay(10); 706 mdelay(10);
665 707
708 /* VBIASEN */
709
666 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_VBIASEN)) { 710 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_VBIASEN)) {
667 control |= SM501_DC_PANEL_CONTROL_BIAS; /* VBIASEN */ 711 if (pd->flags & SM501FB_FLAG_PANEL_INV_VBIASEN)
712 control &= ~SM501_DC_PANEL_CONTROL_BIAS;
713 else
714 control |= SM501_DC_PANEL_CONTROL_BIAS;
715
668 writel(control, ctrl_reg); 716 writel(control, ctrl_reg);
669 sm501fb_sync_regs(fbi); 717 sm501fb_sync_regs(fbi);
670 mdelay(10); 718 mdelay(10);
671 } 719 }
672 720
673 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_FPEN)) { 721 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_FPEN)) {
674 control |= SM501_DC_PANEL_CONTROL_FPEN; 722 if (pd->flags & SM501FB_FLAG_PANEL_INV_FPEN)
723 control &= ~SM501_DC_PANEL_CONTROL_FPEN;
724 else
725 control |= SM501_DC_PANEL_CONTROL_FPEN;
726
675 writel(control, ctrl_reg); 727 writel(control, ctrl_reg);
676 sm501fb_sync_regs(fbi); 728 sm501fb_sync_regs(fbi);
677 mdelay(10); 729 mdelay(10);
@@ -679,14 +731,22 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
679 } else if (!to && (control & SM501_DC_PANEL_CONTROL_VDD) != 0) { 731 } else if (!to && (control & SM501_DC_PANEL_CONTROL_VDD) != 0) {
680 /* disable panel power */ 732 /* disable panel power */
681 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_FPEN)) { 733 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_FPEN)) {
682 control &= ~SM501_DC_PANEL_CONTROL_FPEN; 734 if (pd->flags & SM501FB_FLAG_PANEL_INV_FPEN)
735 control |= SM501_DC_PANEL_CONTROL_FPEN;
736 else
737 control &= ~SM501_DC_PANEL_CONTROL_FPEN;
738
683 writel(control, ctrl_reg); 739 writel(control, ctrl_reg);
684 sm501fb_sync_regs(fbi); 740 sm501fb_sync_regs(fbi);
685 mdelay(10); 741 mdelay(10);
686 } 742 }
687 743
688 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_VBIASEN)) { 744 if (!(pd->flags & SM501FB_FLAG_PANEL_NO_VBIASEN)) {
689 control &= ~SM501_DC_PANEL_CONTROL_BIAS; 745 if (pd->flags & SM501FB_FLAG_PANEL_INV_VBIASEN)
746 control |= SM501_DC_PANEL_CONTROL_BIAS;
747 else
748 control &= ~SM501_DC_PANEL_CONTROL_BIAS;
749
690 writel(control, ctrl_reg); 750 writel(control, ctrl_reg);
691 sm501fb_sync_regs(fbi); 751 sm501fb_sync_regs(fbi);
692 mdelay(10); 752 mdelay(10);
@@ -1210,39 +1270,6 @@ static struct fb_ops sm501fb_ops_pnl = {
1210 .fb_imageblit = cfb_imageblit, 1270 .fb_imageblit = cfb_imageblit,
1211}; 1271};
1212 1272
1213/* sm501fb_info_alloc
1214 *
1215 * creates and initialises an sm501fb_info structure
1216*/
1217
1218static struct sm501fb_info *sm501fb_info_alloc(struct fb_info *fbinfo_crt,
1219 struct fb_info *fbinfo_pnl)
1220{
1221 struct sm501fb_info *info;
1222 struct sm501fb_par *par;
1223
1224 info = kzalloc(sizeof(struct sm501fb_info), GFP_KERNEL);
1225 if (info) {
1226 /* set the references back */
1227
1228 par = fbinfo_crt->par;
1229 par->info = info;
1230 par->head = HEAD_CRT;
1231 fbinfo_crt->pseudo_palette = &par->pseudo_palette;
1232
1233 par = fbinfo_pnl->par;
1234 par->info = info;
1235 par->head = HEAD_PANEL;
1236 fbinfo_pnl->pseudo_palette = &par->pseudo_palette;
1237
1238 /* store the two fbs into our info */
1239 info->fb[HEAD_CRT] = fbinfo_crt;
1240 info->fb[HEAD_PANEL] = fbinfo_pnl;
1241 }
1242
1243 return info;
1244}
1245
1246/* sm501_init_cursor 1273/* sm501_init_cursor
1247 * 1274 *
1248 * initialise hw cursor parameters 1275 * initialise hw cursor parameters
@@ -1250,10 +1277,16 @@ static struct sm501fb_info *sm501fb_info_alloc(struct fb_info *fbinfo_crt,
1250 1277
1251static int sm501_init_cursor(struct fb_info *fbi, unsigned int reg_base) 1278static int sm501_init_cursor(struct fb_info *fbi, unsigned int reg_base)
1252{ 1279{
1253 struct sm501fb_par *par = fbi->par; 1280 struct sm501fb_par *par;
1254 struct sm501fb_info *info = par->info; 1281 struct sm501fb_info *info;
1255 int ret; 1282 int ret;
1256 1283
1284 if (fbi == NULL)
1285 return 0;
1286
1287 par = fbi->par;
1288 info = par->info;
1289
1257 par->cursor_regs = info->regs + reg_base; 1290 par->cursor_regs = info->regs + reg_base;
1258 1291
1259 ret = sm501_alloc_mem(info, &par->cursor, SM501_MEMF_CURSOR, 1024); 1292 ret = sm501_alloc_mem(info, &par->cursor, SM501_MEMF_CURSOR, 1024);
@@ -1281,13 +1314,10 @@ static int sm501fb_start(struct sm501fb_info *info,
1281 struct platform_device *pdev) 1314 struct platform_device *pdev)
1282{ 1315{
1283 struct resource *res; 1316 struct resource *res;
1284 struct device *dev; 1317 struct device *dev = &pdev->dev;
1285 int k; 1318 int k;
1286 int ret; 1319 int ret;
1287 1320
1288 info->dev = dev = &pdev->dev;
1289 platform_set_drvdata(pdev, info);
1290
1291 info->irq = ret = platform_get_irq(pdev, 0); 1321 info->irq = ret = platform_get_irq(pdev, 0);
1292 if (ret < 0) { 1322 if (ret < 0) {
1293 /* we currently do not use the IRQ */ 1323 /* we currently do not use the IRQ */
@@ -1390,11 +1420,6 @@ static void sm501fb_stop(struct sm501fb_info *info)
1390 kfree(info->regs_res); 1420 kfree(info->regs_res);
1391} 1421}
1392 1422
1393static void sm501fb_info_release(struct sm501fb_info *info)
1394{
1395 kfree(info);
1396}
1397
1398static int sm501fb_init_fb(struct fb_info *fb, 1423static int sm501fb_init_fb(struct fb_info *fb,
1399 enum sm501_controller head, 1424 enum sm501_controller head,
1400 const char *fbname) 1425 const char *fbname)
@@ -1539,36 +1564,93 @@ static struct sm501_platdata_fb sm501fb_def_pdata = {
1539static char driver_name_crt[] = "sm501fb-crt"; 1564static char driver_name_crt[] = "sm501fb-crt";
1540static char driver_name_pnl[] = "sm501fb-panel"; 1565static char driver_name_pnl[] = "sm501fb-panel";
1541 1566
1542static int __init sm501fb_probe(struct platform_device *pdev) 1567static int __devinit sm501fb_probe_one(struct sm501fb_info *info,
1568 enum sm501_controller head)
1543{ 1569{
1544 struct sm501fb_info *info; 1570 unsigned char *name = (head == HEAD_CRT) ? "crt" : "panel";
1545 struct device *dev = &pdev->dev; 1571 struct sm501_platdata_fbsub *pd;
1546 struct fb_info *fbinfo_crt; 1572 struct sm501fb_par *par;
1547 struct fb_info *fbinfo_pnl; 1573 struct fb_info *fbi;
1548 int ret;
1549 1574
1550 /* allocate our framebuffers */ 1575 pd = (head == HEAD_CRT) ? info->pdata->fb_crt : info->pdata->fb_pnl;
1576
1577 /* Do not initialise if we've not been given any platform data */
1578 if (pd == NULL) {
1579 dev_info(info->dev, "no data for fb %s (disabled)\n", name);
1580 return 0;
1581 }
1551 1582
1552 fbinfo_crt = framebuffer_alloc(sizeof(struct sm501fb_par), dev); 1583 fbi = framebuffer_alloc(sizeof(struct sm501fb_par), info->dev);
1553 if (fbinfo_crt == NULL) { 1584 if (fbi == NULL) {
1554 dev_err(dev, "cannot allocate crt framebuffer\n"); 1585 dev_err(info->dev, "cannot allocate %s framebuffer\n", name);
1555 return -ENOMEM; 1586 return -ENOMEM;
1556 } 1587 }
1557 1588
1558 fbinfo_pnl = framebuffer_alloc(sizeof(struct sm501fb_par), dev); 1589 par = fbi->par;
1559 if (fbinfo_pnl == NULL) { 1590 par->info = info;
1560 dev_err(dev, "cannot allocate panel framebuffer\n"); 1591 par->head = head;
1561 ret = -ENOMEM; 1592 fbi->pseudo_palette = &par->pseudo_palette;
1562 goto fbinfo_crt_alloc_fail; 1593
1594 info->fb[head] = fbi;
1595
1596 return 0;
1597}
1598
1599/* Free up anything allocated by sm501fb_init_fb */
1600
1601static void sm501_free_init_fb(struct sm501fb_info *info,
1602 enum sm501_controller head)
1603{
1604 struct fb_info *fbi = info->fb[head];
1605
1606 fb_dealloc_cmap(&fbi->cmap);
1607}
1608
1609static int __devinit sm501fb_start_one(struct sm501fb_info *info,
1610 enum sm501_controller head,
1611 const char *drvname)
1612{
1613 struct fb_info *fbi = info->fb[head];
1614 int ret;
1615
1616 if (!fbi)
1617 return 0;
1618
1619 ret = sm501fb_init_fb(info->fb[head], head, drvname);
1620 if (ret) {
1621 dev_err(info->dev, "cannot initialise fb %s\n", drvname);
1622 return ret;
1623 }
1624
1625 ret = register_framebuffer(info->fb[head]);
1626 if (ret) {
1627 dev_err(info->dev, "failed to register fb %s\n", drvname);
1628 sm501_free_init_fb(info, head);
1629 return ret;
1563 } 1630 }
1564 1631
1565 info = sm501fb_info_alloc(fbinfo_crt, fbinfo_pnl); 1632 dev_info(info->dev, "fb%d: %s frame buffer\n", fbi->node, fbi->fix.id);
1566 if (info == NULL) { 1633
1567 dev_err(dev, "cannot allocate par\n"); 1634 return 0;
1568 ret = -ENOMEM; 1635}
1569 goto sm501fb_alloc_fail; 1636
1637static int __devinit sm501fb_probe(struct platform_device *pdev)
1638{
1639 struct sm501fb_info *info;
1640 struct device *dev = &pdev->dev;
1641 int ret;
1642
1643 /* allocate our framebuffers */
1644
1645 info = kzalloc(sizeof(struct sm501fb_info), GFP_KERNEL);
1646 if (!info) {
1647 dev_err(dev, "failed to allocate state\n");
1648 return -ENOMEM;
1570 } 1649 }
1571 1650
1651 info->dev = dev = &pdev->dev;
1652 platform_set_drvdata(pdev, info);
1653
1572 if (dev->parent->platform_data) { 1654 if (dev->parent->platform_data) {
1573 struct sm501_platdata *pd = dev->parent->platform_data; 1655 struct sm501_platdata *pd = dev->parent->platform_data;
1574 info->pdata = pd->fb; 1656 info->pdata = pd->fb;
@@ -1579,90 +1661,88 @@ static int __init sm501fb_probe(struct platform_device *pdev)
1579 info->pdata = &sm501fb_def_pdata; 1661 info->pdata = &sm501fb_def_pdata;
1580 } 1662 }
1581 1663
1582 /* start the framebuffers */ 1664 /* probe for the presence of each panel */
1583 1665
1584 ret = sm501fb_start(info, pdev); 1666 ret = sm501fb_probe_one(info, HEAD_CRT);
1585 if (ret) { 1667 if (ret < 0) {
1586 dev_err(dev, "cannot initialise SM501\n"); 1668 dev_err(dev, "failed to probe CRT\n");
1587 goto sm501fb_start_fail; 1669 goto err_alloc;
1588 } 1670 }
1589 1671
1590 /* CRT framebuffer setup */ 1672 ret = sm501fb_probe_one(info, HEAD_PANEL);
1673 if (ret < 0) {
1674 dev_err(dev, "failed to probe PANEL\n");
1675 goto err_probed_crt;
1676 }
1591 1677
1592 ret = sm501fb_init_fb(fbinfo_crt, HEAD_CRT, driver_name_crt); 1678 if (info->fb[HEAD_PANEL] == NULL &&
1593 if (ret) { 1679 info->fb[HEAD_CRT] == NULL) {
1594 dev_err(dev, "cannot initialise CRT fb\n"); 1680 dev_err(dev, "no framebuffers found\n");
1595 goto sm501fb_start_fail; 1681 goto err_alloc;
1596 } 1682 }
1597 1683
1598 /* Panel framebuffer setup */ 1684 /* get the resources for both of the framebuffers */
1599 1685
1600 ret = sm501fb_init_fb(fbinfo_pnl, HEAD_PANEL, driver_name_pnl); 1686 ret = sm501fb_start(info, pdev);
1601 if (ret) { 1687 if (ret) {
1602 dev_err(dev, "cannot initialise Panel fb\n"); 1688 dev_err(dev, "cannot initialise SM501\n");
1603 goto sm501fb_start_fail; 1689 goto err_probed_panel;
1604 } 1690 }
1605 1691
1606 /* register framebuffers */ 1692 ret = sm501fb_start_one(info, HEAD_CRT, driver_name_crt);
1607 1693 if (ret) {
1608 ret = register_framebuffer(fbinfo_crt); 1694 dev_err(dev, "failed to start CRT\n");
1609 if (ret < 0) { 1695 goto err_started;
1610 dev_err(dev, "failed to register CRT fb (%d)\n", ret);
1611 goto register_crt_fail;
1612 } 1696 }
1613 1697
1614 ret = register_framebuffer(fbinfo_pnl); 1698 ret = sm501fb_start_one(info, HEAD_PANEL, driver_name_pnl);
1615 if (ret < 0) { 1699 if (ret) {
1616 dev_err(dev, "failed to register panel fb (%d)\n", ret); 1700 dev_err(dev, "failed to start Panel\n");
1617 goto register_pnl_fail; 1701 goto err_started_crt;
1618 } 1702 }
1619 1703
1620 dev_info(dev, "fb%d: %s frame buffer device\n",
1621 fbinfo_crt->node, fbinfo_crt->fix.id);
1622
1623 dev_info(dev, "fb%d: %s frame buffer device\n",
1624 fbinfo_pnl->node, fbinfo_pnl->fix.id);
1625
1626 /* create device files */ 1704 /* create device files */
1627 1705
1628 ret = device_create_file(dev, &dev_attr_crt_src); 1706 ret = device_create_file(dev, &dev_attr_crt_src);
1629 if (ret) 1707 if (ret)
1630 goto crtsrc_fail; 1708 goto err_started_panel;
1631 1709
1632 ret = device_create_file(dev, &dev_attr_fbregs_pnl); 1710 ret = device_create_file(dev, &dev_attr_fbregs_pnl);
1633 if (ret) 1711 if (ret)
1634 goto fbregs_pnl_fail; 1712 goto err_attached_crtsrc_file;
1635 1713
1636 ret = device_create_file(dev, &dev_attr_fbregs_crt); 1714 ret = device_create_file(dev, &dev_attr_fbregs_crt);
1637 if (ret) 1715 if (ret)
1638 goto fbregs_crt_fail; 1716 goto err_attached_pnlregs_file;
1639 1717
1640 /* we registered, return ok */ 1718 /* we registered, return ok */
1641 return 0; 1719 return 0;
1642 1720
1643 fbregs_crt_fail: 1721err_attached_pnlregs_file:
1644 device_remove_file(dev, &dev_attr_fbregs_pnl); 1722 device_remove_file(dev, &dev_attr_fbregs_pnl);
1645 1723
1646 fbregs_pnl_fail: 1724err_attached_crtsrc_file:
1647 device_remove_file(dev, &dev_attr_crt_src); 1725 device_remove_file(dev, &dev_attr_crt_src);
1648 1726
1649 crtsrc_fail: 1727err_started_panel:
1650 unregister_framebuffer(fbinfo_pnl); 1728 unregister_framebuffer(info->fb[HEAD_PANEL]);
1729 sm501_free_init_fb(info, HEAD_PANEL);
1651 1730
1652 register_pnl_fail: 1731err_started_crt:
1653 unregister_framebuffer(fbinfo_crt); 1732 unregister_framebuffer(info->fb[HEAD_CRT]);
1733 sm501_free_init_fb(info, HEAD_CRT);
1654 1734
1655 register_crt_fail: 1735err_started:
1656 sm501fb_stop(info); 1736 sm501fb_stop(info);
1657 1737
1658 sm501fb_start_fail: 1738err_probed_panel:
1659 sm501fb_info_release(info); 1739 framebuffer_release(info->fb[HEAD_PANEL]);
1660 1740
1661 sm501fb_alloc_fail: 1741err_probed_crt:
1662 framebuffer_release(fbinfo_pnl); 1742 framebuffer_release(info->fb[HEAD_CRT]);
1663 1743
1664 fbinfo_crt_alloc_fail: 1744err_alloc:
1665 framebuffer_release(fbinfo_crt); 1745 kfree(info);
1666 1746
1667 return ret; 1747 return ret;
1668} 1748}
@@ -1681,11 +1761,14 @@ static int sm501fb_remove(struct platform_device *pdev)
1681 device_remove_file(&pdev->dev, &dev_attr_fbregs_pnl); 1761 device_remove_file(&pdev->dev, &dev_attr_fbregs_pnl);
1682 device_remove_file(&pdev->dev, &dev_attr_crt_src); 1762 device_remove_file(&pdev->dev, &dev_attr_crt_src);
1683 1763
1764 sm501_free_init_fb(info, HEAD_CRT);
1765 sm501_free_init_fb(info, HEAD_PANEL);
1766
1684 unregister_framebuffer(fbinfo_crt); 1767 unregister_framebuffer(fbinfo_crt);
1685 unregister_framebuffer(fbinfo_pnl); 1768 unregister_framebuffer(fbinfo_pnl);
1686 1769
1687 sm501fb_stop(info); 1770 sm501fb_stop(info);
1688 sm501fb_info_release(info); 1771 kfree(info);
1689 1772
1690 framebuffer_release(fbinfo_pnl); 1773 framebuffer_release(fbinfo_pnl);
1691 framebuffer_release(fbinfo_crt); 1774 framebuffer_release(fbinfo_crt);
diff --git a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c
index ea9f19d25597..77aafcfae037 100644
--- a/drivers/video/tdfxfb.c
+++ b/drivers/video/tdfxfb.c
@@ -836,16 +836,12 @@ static int tdfxfb_pan_display(struct fb_var_screeninfo *var,
836 struct tdfx_par *par = info->par; 836 struct tdfx_par *par = info->par;
837 u32 addr = var->yoffset * info->fix.line_length; 837 u32 addr = var->yoffset * info->fix.line_length;
838 838
839 if (nopan || var->xoffset || (var->yoffset > var->yres_virtual)) 839 if (nopan || var->xoffset)
840 return -EINVAL;
841 if ((var->yoffset + var->yres > var->yres_virtual && nowrap))
842 return -EINVAL; 840 return -EINVAL;
843 841
844 banshee_make_room(par, 1); 842 banshee_make_room(par, 1);
845 tdfx_outl(par, VIDDESKSTART, addr); 843 tdfx_outl(par, VIDDESKSTART, addr);
846 844
847 info->var.xoffset = var->xoffset;
848 info->var.yoffset = var->yoffset;
849 return 0; 845 return 0;
850} 846}
851 847
@@ -1426,6 +1422,8 @@ MODULE_LICENSE("GPL");
1426module_param(hwcursor, int, 0644); 1422module_param(hwcursor, int, 0644);
1427MODULE_PARM_DESC(hwcursor, "Enable hardware cursor " 1423MODULE_PARM_DESC(hwcursor, "Enable hardware cursor "
1428 "(1=enable, 0=disable, default=1)"); 1424 "(1=enable, 0=disable, default=1)");
1425module_param(mode_option, charp, 0);
1426MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'");
1429#ifdef CONFIG_MTRR 1427#ifdef CONFIG_MTRR
1430module_param(nomtrr, bool, 0); 1428module_param(nomtrr, bool, 0);
1431MODULE_PARM_DESC(nomtrr, "Disable MTRR support (default: enabled)"); 1429MODULE_PARM_DESC(nomtrr, "Disable MTRR support (default: enabled)");
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
index beefab2992c0..479b2e79ad68 100644
--- a/drivers/video/tridentfb.c
+++ b/drivers/video/tridentfb.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Frame buffer driver for Trident Blade and Image series 2 * Frame buffer driver for Trident TGUI, Blade and Image series
3 * 3 *
4 * Copyright 2001, 2002 - Jani Monoses <jani@iv.ro> 4 * Copyright 2001, 2002 - Jani Monoses <jani@iv.ro>
5 * 5 *
@@ -13,7 +13,6 @@
13 * code, suggestions 13 * code, suggestions
14 * TODO: 14 * TODO:
15 * timing value tweaking so it looks good on every monitor in every mode 15 * timing value tweaking so it looks good on every monitor in every mode
16 * TGUI acceleration
17 */ 16 */
18 17
19#include <linux/module.h> 18#include <linux/module.h>
@@ -22,25 +21,26 @@
22#include <linux/pci.h> 21#include <linux/pci.h>
23 22
24#include <linux/delay.h> 23#include <linux/delay.h>
24#include <video/vga.h>
25#include <video/trident.h> 25#include <video/trident.h>
26 26
27#define VERSION "0.7.8-NEWAPI"
28
29struct tridentfb_par { 27struct tridentfb_par {
30 void __iomem *io_virt; /* iospace virtual memory address */ 28 void __iomem *io_virt; /* iospace virtual memory address */
29 u32 pseudo_pal[16];
30 int chip_id;
31 int flatpanel;
32 void (*init_accel) (struct tridentfb_par *, int, int);
33 void (*wait_engine) (struct tridentfb_par *);
34 void (*fill_rect)
35 (struct tridentfb_par *par, u32, u32, u32, u32, u32, u32);
36 void (*copy_rect)
37 (struct tridentfb_par *par, u32, u32, u32, u32, u32, u32);
38 void (*image_blit)
39 (struct tridentfb_par *par, const char*,
40 u32, u32, u32, u32, u32, u32);
41 unsigned char eng_oper; /* engine operation... */
31}; 42};
32 43
33static unsigned char eng_oper; /* engine operation... */
34static struct fb_ops tridentfb_ops;
35
36static struct tridentfb_par default_par;
37
38/* FIXME:kmalloc these 3 instead */
39static struct fb_info fb_info;
40static u32 pseudo_pal[16];
41
42static struct fb_var_screeninfo default_var;
43
44static struct fb_fix_screeninfo tridentfb_fix = { 44static struct fb_fix_screeninfo tridentfb_fix = {
45 .id = "Trident", 45 .id = "Trident",
46 .type = FB_TYPE_PACKED_PIXELS, 46 .type = FB_TYPE_PACKED_PIXELS,
@@ -49,27 +49,22 @@ static struct fb_fix_screeninfo tridentfb_fix = {
49 .accel = FB_ACCEL_NONE, 49 .accel = FB_ACCEL_NONE,
50}; 50};
51 51
52static int chip_id;
53
54static int defaultaccel;
55static int displaytype;
56
57/* defaults which are normally overriden by user values */ 52/* defaults which are normally overriden by user values */
58 53
59/* video mode */ 54/* video mode */
60static char *mode_option __devinitdata = "640x480"; 55static char *mode_option __devinitdata = "640x480-8@60";
61static int bpp = 8; 56static int bpp __devinitdata = 8;
62 57
63static int noaccel; 58static int noaccel __devinitdata;
64 59
65static int center; 60static int center;
66static int stretch; 61static int stretch;
67 62
68static int fp; 63static int fp __devinitdata;
69static int crt; 64static int crt __devinitdata;
70 65
71static int memsize; 66static int memsize __devinitdata;
72static int memdiff; 67static int memdiff __devinitdata;
73static int nativex; 68static int nativex;
74 69
75module_param(mode_option, charp, 0); 70module_param(mode_option, charp, 0);
@@ -84,25 +79,53 @@ module_param(memsize, int, 0);
84module_param(memdiff, int, 0); 79module_param(memdiff, int, 0);
85module_param(nativex, int, 0); 80module_param(nativex, int, 0);
86module_param(fp, int, 0); 81module_param(fp, int, 0);
82MODULE_PARM_DESC(fp, "Define if flatpanel is connected");
87module_param(crt, int, 0); 83module_param(crt, int, 0);
84MODULE_PARM_DESC(crt, "Define if CRT is connected");
85
86static inline int is_oldclock(int id)
87{
88 return (id == TGUI9440) ||
89 (id == TGUI9660) ||
90 (id == CYBER9320);
91}
92
93static inline int is_oldprotect(int id)
94{
95 return is_oldclock(id) ||
96 (id == PROVIDIA9685) ||
97 (id == CYBER9382) ||
98 (id == CYBER9385);
99}
100
101static inline int is_blade(int id)
102{
103 return (id == BLADE3D) ||
104 (id == CYBERBLADEE4) ||
105 (id == CYBERBLADEi7) ||
106 (id == CYBERBLADEi7D) ||
107 (id == CYBERBLADEi1) ||
108 (id == CYBERBLADEi1D) ||
109 (id == CYBERBLADEAi1) ||
110 (id == CYBERBLADEAi1D);
111}
88 112
89static int chip3D; 113static inline int is_xp(int id)
90static int chipcyber; 114{
115 return (id == CYBERBLADEXPAi1) ||
116 (id == CYBERBLADEXPm8) ||
117 (id == CYBERBLADEXPm16);
118}
91 119
92static int is3Dchip(int id) 120static inline int is3Dchip(int id)
93{ 121{
94 return ((id == BLADE3D) || (id == CYBERBLADEE4) || 122 return is_blade(id) || is_xp(id) ||
95 (id == CYBERBLADEi7) || (id == CYBERBLADEi7D) ||
96 (id == CYBER9397) || (id == CYBER9397DVD) || 123 (id == CYBER9397) || (id == CYBER9397DVD) ||
97 (id == CYBER9520) || (id == CYBER9525DVD) || 124 (id == CYBER9520) || (id == CYBER9525DVD) ||
98 (id == IMAGE975) || (id == IMAGE985) || 125 (id == IMAGE975) || (id == IMAGE985);
99 (id == CYBERBLADEi1) || (id == CYBERBLADEi1D) ||
100 (id == CYBERBLADEAi1) || (id == CYBERBLADEAi1D) ||
101 (id == CYBERBLADEXPm8) || (id == CYBERBLADEXPm16) ||
102 (id == CYBERBLADEXPAi1));
103} 126}
104 127
105static int iscyber(int id) 128static inline int iscyber(int id)
106{ 129{
107 switch (id) { 130 switch (id) {
108 case CYBER9388: 131 case CYBER9388:
@@ -122,12 +145,7 @@ static int iscyber(int id)
122 return 1; 145 return 1;
123 146
124 case CYBER9320: 147 case CYBER9320:
125 case TGUI9660:
126 case IMAGE975:
127 case IMAGE985:
128 case BLADE3D:
129 case CYBERBLADEi7: /* VIA MPV4 integrated version */ 148 case CYBERBLADEi7: /* VIA MPV4 integrated version */
130
131 default: 149 default:
132 /* case CYBERBLDAEXPm8: Strange */ 150 /* case CYBERBLDAEXPm8: Strange */
133 /* case CYBERBLDAEXPm16: Strange */ 151 /* case CYBERBLDAEXPm16: Strange */
@@ -135,147 +153,110 @@ static int iscyber(int id)
135 } 153 }
136} 154}
137 155
138#define CRT 0x3D0 /* CRTC registers offset for color display */ 156static inline void t_outb(struct tridentfb_par *p, u8 val, u16 reg)
139 157{
140#ifndef TRIDENT_MMIO 158 fb_writeb(val, p->io_virt + reg);
141 #define TRIDENT_MMIO 1 159}
142#endif
143
144#if TRIDENT_MMIO
145 #define t_outb(val, reg) writeb(val,((struct tridentfb_par *)(fb_info.par))->io_virt + reg)
146 #define t_inb(reg) readb(((struct tridentfb_par*)(fb_info.par))->io_virt + reg)
147#else
148 #define t_outb(val, reg) outb(val, reg)
149 #define t_inb(reg) inb(reg)
150#endif
151 160
161static inline u8 t_inb(struct tridentfb_par *p, u16 reg)
162{
163 return fb_readb(p->io_virt + reg);
164}
152 165
153static struct accel_switch { 166static inline void writemmr(struct tridentfb_par *par, u16 r, u32 v)
154 void (*init_accel) (int, int); 167{
155 void (*wait_engine) (void); 168 fb_writel(v, par->io_virt + r);
156 void (*fill_rect) (u32, u32, u32, u32, u32, u32); 169}
157 void (*copy_rect) (u32, u32, u32, u32, u32, u32);
158} *acc;
159 170
160#define writemmr(r, v) writel(v, ((struct tridentfb_par *)fb_info.par)->io_virt + r) 171static inline u32 readmmr(struct tridentfb_par *par, u16 r)
161#define readmmr(r) readl(((struct tridentfb_par *)fb_info.par)->io_virt + r) 172{
173 return fb_readl(par->io_virt + r);
174}
162 175
163/* 176/*
164 * Blade specific acceleration. 177 * Blade specific acceleration.
165 */ 178 */
166 179
167#define point(x, y) ((y) << 16 | (x)) 180#define point(x, y) ((y) << 16 | (x))
168#define STA 0x2120 181
169#define CMD 0x2144 182static void blade_init_accel(struct tridentfb_par *par, int pitch, int bpp)
170#define ROP 0x2148
171#define CLR 0x2160
172#define SR1 0x2100
173#define SR2 0x2104
174#define DR1 0x2108
175#define DR2 0x210C
176
177#define ROP_S 0xCC
178
179static void blade_init_accel(int pitch, int bpp)
180{ 183{
181 int v1 = (pitch >> 3) << 20; 184 int v1 = (pitch >> 3) << 20;
182 int tmp = 0, v2; 185 int tmp = bpp == 24 ? 2 : (bpp >> 4);
183 switch (bpp) { 186 int v2 = v1 | (tmp << 29);
184 case 8: 187
185 tmp = 0; 188 writemmr(par, 0x21C0, v2);
186 break; 189 writemmr(par, 0x21C4, v2);
187 case 15: 190 writemmr(par, 0x21B8, v2);
188 tmp = 5; 191 writemmr(par, 0x21BC, v2);
189 break; 192 writemmr(par, 0x21D0, v1);
190 case 16: 193 writemmr(par, 0x21D4, v1);
191 tmp = 1; 194 writemmr(par, 0x21C8, v1);
192 break; 195 writemmr(par, 0x21CC, v1);
193 case 24: 196 writemmr(par, 0x216C, 0);
194 case 32:
195 tmp = 2;
196 break;
197 }
198 v2 = v1 | (tmp << 29);
199 writemmr(0x21C0, v2);
200 writemmr(0x21C4, v2);
201 writemmr(0x21B8, v2);
202 writemmr(0x21BC, v2);
203 writemmr(0x21D0, v1);
204 writemmr(0x21D4, v1);
205 writemmr(0x21C8, v1);
206 writemmr(0x21CC, v1);
207 writemmr(0x216C, 0);
208} 197}
209 198
210static void blade_wait_engine(void) 199static void blade_wait_engine(struct tridentfb_par *par)
211{ 200{
212 while (readmmr(STA) & 0xFA800000) ; 201 while (readmmr(par, STATUS) & 0xFA800000)
202 cpu_relax();
213} 203}
214 204
215static void blade_fill_rect(u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop) 205static void blade_fill_rect(struct tridentfb_par *par,
206 u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop)
216{ 207{
217 writemmr(CLR, c); 208 writemmr(par, COLOR, c);
218 writemmr(ROP, rop ? 0x66 : ROP_S); 209 writemmr(par, ROP, rop ? ROP_X : ROP_S);
219 writemmr(CMD, 0x20000000 | 1 << 19 | 1 << 4 | 2 << 2); 210 writemmr(par, CMD, 0x20000000 | 1 << 19 | 1 << 4 | 2 << 2);
220 211
221 writemmr(DR1, point(x, y)); 212 writemmr(par, DST1, point(x, y));
222 writemmr(DR2, point(x + w - 1, y + h - 1)); 213 writemmr(par, DST2, point(x + w - 1, y + h - 1));
223} 214}
224 215
225static void blade_copy_rect(u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h) 216static void blade_image_blit(struct tridentfb_par *par, const char *data,
217 u32 x, u32 y, u32 w, u32 h, u32 c, u32 b)
218{
219 unsigned size = ((w + 31) >> 5) * h;
220
221 writemmr(par, COLOR, c);
222 writemmr(par, BGCOLOR, b);
223 writemmr(par, CMD, 0xa0000000 | 3 << 19);
224
225 writemmr(par, DST1, point(x, y));
226 writemmr(par, DST2, point(x + w - 1, y + h - 1));
227
228 memcpy(par->io_virt + 0x10000, data, 4 * size);
229}
230
231static void blade_copy_rect(struct tridentfb_par *par,
232 u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h)
226{ 233{
227 u32 s1, s2, d1, d2;
228 int direction = 2; 234 int direction = 2;
229 s1 = point(x1, y1); 235 u32 s1 = point(x1, y1);
230 s2 = point(x1 + w - 1, y1 + h - 1); 236 u32 s2 = point(x1 + w - 1, y1 + h - 1);
231 d1 = point(x2, y2); 237 u32 d1 = point(x2, y2);
232 d2 = point(x2 + w - 1, y2 + h - 1); 238 u32 d2 = point(x2 + w - 1, y2 + h - 1);
233 239
234 if ((y1 > y2) || ((y1 == y2) && (x1 > x2))) 240 if ((y1 > y2) || ((y1 == y2) && (x1 > x2)))
235 direction = 0; 241 direction = 0;
236 242
237 writemmr(ROP, ROP_S); 243 writemmr(par, ROP, ROP_S);
238 writemmr(CMD, 0xE0000000 | 1 << 19 | 1 << 4 | 1 << 2 | direction); 244 writemmr(par, CMD, 0xE0000000 | 1 << 19 | 1 << 4 | 1 << 2 | direction);
239 245
240 writemmr(SR1, direction ? s2 : s1); 246 writemmr(par, SRC1, direction ? s2 : s1);
241 writemmr(SR2, direction ? s1 : s2); 247 writemmr(par, SRC2, direction ? s1 : s2);
242 writemmr(DR1, direction ? d2 : d1); 248 writemmr(par, DST1, direction ? d2 : d1);
243 writemmr(DR2, direction ? d1 : d2); 249 writemmr(par, DST2, direction ? d1 : d2);
244} 250}
245 251
246static struct accel_switch accel_blade = {
247 blade_init_accel,
248 blade_wait_engine,
249 blade_fill_rect,
250 blade_copy_rect,
251};
252
253/* 252/*
254 * BladeXP specific acceleration functions 253 * BladeXP specific acceleration functions
255 */ 254 */
256 255
257#define ROP_P 0xF0 256static void xp_init_accel(struct tridentfb_par *par, int pitch, int bpp)
258#define masked_point(x, y) ((y & 0xffff)<<16|(x & 0xffff))
259
260static void xp_init_accel(int pitch, int bpp)
261{ 257{
262 int tmp = 0, v1; 258 unsigned char x = bpp == 24 ? 3 : (bpp >> 4);
263 unsigned char x = 0; 259 int v1 = pitch << (bpp == 24 ? 20 : (18 + x));
264
265 switch (bpp) {
266 case 8:
267 x = 0;
268 break;
269 case 16:
270 x = 1;
271 break;
272 case 24:
273 x = 3;
274 break;
275 case 32:
276 x = 2;
277 break;
278 }
279 260
280 switch (pitch << (bpp >> 3)) { 261 switch (pitch << (bpp >> 3)) {
281 case 8192: 262 case 8192:
@@ -293,42 +274,21 @@ static void xp_init_accel(int pitch, int bpp)
293 break; 274 break;
294 } 275 }
295 276
296 t_outb(x, 0x2125); 277 t_outb(par, x, 0x2125);
297
298 eng_oper = x | 0x40;
299
300 switch (bpp) {
301 case 8:
302 tmp = 18;
303 break;
304 case 15:
305 case 16:
306 tmp = 19;
307 break;
308 case 24:
309 case 32:
310 tmp = 20;
311 break;
312 }
313 278
314 v1 = pitch << tmp; 279 par->eng_oper = x | 0x40;
315 280
316 writemmr(0x2154, v1); 281 writemmr(par, 0x2154, v1);
317 writemmr(0x2150, v1); 282 writemmr(par, 0x2150, v1);
318 t_outb(3, 0x2126); 283 t_outb(par, 3, 0x2126);
319} 284}
320 285
321static void xp_wait_engine(void) 286static void xp_wait_engine(struct tridentfb_par *par)
322{ 287{
323 int busy; 288 int count = 0;
324 int count, timeout; 289 int timeout = 0;
325 290
326 count = 0; 291 while (t_inb(par, STATUS) & 0x80) {
327 timeout = 0;
328 for (;;) {
329 busy = t_inb(STA) & 0x80;
330 if (busy != 0x80)
331 return;
332 count++; 292 count++;
333 if (count == 10000000) { 293 if (count == 10000000) {
334 /* Timeout */ 294 /* Timeout */
@@ -336,30 +296,31 @@ static void xp_wait_engine(void)
336 timeout++; 296 timeout++;
337 if (timeout == 8) { 297 if (timeout == 8) {
338 /* Reset engine */ 298 /* Reset engine */
339 t_outb(0x00, 0x2120); 299 t_outb(par, 0x00, STATUS);
340 return; 300 return;
341 } 301 }
342 } 302 }
303 cpu_relax();
343 } 304 }
344} 305}
345 306
346static void xp_fill_rect(u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop) 307static void xp_fill_rect(struct tridentfb_par *par,
308 u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop)
347{ 309{
348 writemmr(0x2127, ROP_P); 310 writemmr(par, 0x2127, ROP_P);
349 writemmr(0x2158, c); 311 writemmr(par, 0x2158, c);
350 writemmr(0x2128, 0x4000); 312 writemmr(par, DRAWFL, 0x4000);
351 writemmr(0x2140, masked_point(h, w)); 313 writemmr(par, OLDDIM, point(h, w));
352 writemmr(0x2138, masked_point(y, x)); 314 writemmr(par, OLDDST, point(y, x));
353 t_outb(0x01, 0x2124); 315 t_outb(par, 0x01, OLDCMD);
354 t_outb(eng_oper, 0x2125); 316 t_outb(par, par->eng_oper, 0x2125);
355} 317}
356 318
357static void xp_copy_rect(u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h) 319static void xp_copy_rect(struct tridentfb_par *par,
320 u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h)
358{ 321{
359 int direction;
360 u32 x1_tmp, x2_tmp, y1_tmp, y2_tmp; 322 u32 x1_tmp, x2_tmp, y1_tmp, y2_tmp;
361 323 int direction = 0x0004;
362 direction = 0x0004;
363 324
364 if ((x1 < x2) && (y1 == y2)) { 325 if ((x1 < x2) && (y1 == y2)) {
365 direction |= 0x0200; 326 direction |= 0x0200;
@@ -379,103 +340,152 @@ static void xp_copy_rect(u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h)
379 y2_tmp = y2; 340 y2_tmp = y2;
380 } 341 }
381 342
382 writemmr(0x2128, direction); 343 writemmr(par, DRAWFL, direction);
383 t_outb(ROP_S, 0x2127); 344 t_outb(par, ROP_S, 0x2127);
384 writemmr(0x213C, masked_point(y1_tmp, x1_tmp)); 345 writemmr(par, OLDSRC, point(y1_tmp, x1_tmp));
385 writemmr(0x2138, masked_point(y2_tmp, x2_tmp)); 346 writemmr(par, OLDDST, point(y2_tmp, x2_tmp));
386 writemmr(0x2140, masked_point(h, w)); 347 writemmr(par, OLDDIM, point(h, w));
387 t_outb(0x01, 0x2124); 348 t_outb(par, 0x01, OLDCMD);
388} 349}
389 350
390static struct accel_switch accel_xp = {
391 xp_init_accel,
392 xp_wait_engine,
393 xp_fill_rect,
394 xp_copy_rect,
395};
396
397/* 351/*
398 * Image specific acceleration functions 352 * Image specific acceleration functions
399 */ 353 */
400static void image_init_accel(int pitch, int bpp) 354static void image_init_accel(struct tridentfb_par *par, int pitch, int bpp)
401{ 355{
402 int tmp = 0; 356 int tmp = bpp == 24 ? 2: (bpp >> 4);
403 switch (bpp) { 357
404 case 8: 358 writemmr(par, 0x2120, 0xF0000000);
405 tmp = 0; 359 writemmr(par, 0x2120, 0x40000000 | tmp);
406 break; 360 writemmr(par, 0x2120, 0x80000000);
407 case 15: 361 writemmr(par, 0x2144, 0x00000000);
408 tmp = 5; 362 writemmr(par, 0x2148, 0x00000000);
409 break; 363 writemmr(par, 0x2150, 0x00000000);
410 case 16: 364 writemmr(par, 0x2154, 0x00000000);
411 tmp = 1; 365 writemmr(par, 0x2120, 0x60000000 | (pitch << 16) | pitch);
412 break; 366 writemmr(par, 0x216C, 0x00000000);
413 case 24: 367 writemmr(par, 0x2170, 0x00000000);
414 case 32: 368 writemmr(par, 0x217C, 0x00000000);
415 tmp = 2; 369 writemmr(par, 0x2120, 0x10000000);
416 break; 370 writemmr(par, 0x2130, (2047 << 16) | 2047);
417 }
418 writemmr(0x2120, 0xF0000000);
419 writemmr(0x2120, 0x40000000 | tmp);
420 writemmr(0x2120, 0x80000000);
421 writemmr(0x2144, 0x00000000);
422 writemmr(0x2148, 0x00000000);
423 writemmr(0x2150, 0x00000000);
424 writemmr(0x2154, 0x00000000);
425 writemmr(0x2120, 0x60000000 | (pitch << 16) | pitch);
426 writemmr(0x216C, 0x00000000);
427 writemmr(0x2170, 0x00000000);
428 writemmr(0x217C, 0x00000000);
429 writemmr(0x2120, 0x10000000);
430 writemmr(0x2130, (2047 << 16) | 2047);
431} 371}
432 372
433static void image_wait_engine(void) 373static void image_wait_engine(struct tridentfb_par *par)
434{ 374{
435 while (readmmr(0x2164) & 0xF0000000) ; 375 while (readmmr(par, 0x2164) & 0xF0000000)
376 cpu_relax();
436} 377}
437 378
438static void image_fill_rect(u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop) 379static void image_fill_rect(struct tridentfb_par *par,
380 u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop)
439{ 381{
440 writemmr(0x2120, 0x80000000); 382 writemmr(par, 0x2120, 0x80000000);
441 writemmr(0x2120, 0x90000000 | ROP_S); 383 writemmr(par, 0x2120, 0x90000000 | ROP_S);
442 384
443 writemmr(0x2144, c); 385 writemmr(par, 0x2144, c);
444 386
445 writemmr(DR1, point(x, y)); 387 writemmr(par, DST1, point(x, y));
446 writemmr(DR2, point(x + w - 1, y + h - 1)); 388 writemmr(par, DST2, point(x + w - 1, y + h - 1));
447 389
448 writemmr(0x2124, 0x80000000 | 3 << 22 | 1 << 10 | 1 << 9); 390 writemmr(par, 0x2124, 0x80000000 | 3 << 22 | 1 << 10 | 1 << 9);
449} 391}
450 392
451static void image_copy_rect(u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h) 393static void image_copy_rect(struct tridentfb_par *par,
394 u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h)
452{ 395{
453 u32 s1, s2, d1, d2; 396 int direction = 0x4;
454 int direction = 2; 397 u32 s1 = point(x1, y1);
455 s1 = point(x1, y1); 398 u32 s2 = point(x1 + w - 1, y1 + h - 1);
456 s2 = point(x1 + w - 1, y1 + h - 1); 399 u32 d1 = point(x2, y2);
457 d1 = point(x2, y2); 400 u32 d2 = point(x2 + w - 1, y2 + h - 1);
458 d2 = point(x2 + w - 1, y2 + h - 1);
459 401
460 if ((y1 > y2) || ((y1 == y2) && (x1 > x2))) 402 if ((y1 > y2) || ((y1 == y2) && (x1 > x2)))
461 direction = 0; 403 direction = 0;
462 404
463 writemmr(0x2120, 0x80000000); 405 writemmr(par, 0x2120, 0x80000000);
464 writemmr(0x2120, 0x90000000 | ROP_S); 406 writemmr(par, 0x2120, 0x90000000 | ROP_S);
465 407
466 writemmr(SR1, direction ? s2 : s1); 408 writemmr(par, SRC1, direction ? s2 : s1);
467 writemmr(SR2, direction ? s1 : s2); 409 writemmr(par, SRC2, direction ? s1 : s2);
468 writemmr(DR1, direction ? d2 : d1); 410 writemmr(par, DST1, direction ? d2 : d1);
469 writemmr(DR2, direction ? d1 : d2); 411 writemmr(par, DST2, direction ? d1 : d2);
470 writemmr(0x2124, 0x80000000 | 1 << 22 | 1 << 10 | 1 << 7 | direction); 412 writemmr(par, 0x2124,
413 0x80000000 | 1 << 22 | 1 << 10 | 1 << 7 | direction);
471} 414}
472 415
473static struct accel_switch accel_image = { 416/*
474 image_init_accel, 417 * TGUI 9440/96XX acceleration
475 image_wait_engine, 418 */
476 image_fill_rect, 419
477 image_copy_rect, 420static void tgui_init_accel(struct tridentfb_par *par, int pitch, int bpp)
478}; 421{
422 unsigned char x = bpp == 24 ? 3 : (bpp >> 4);
423
424 /* disable clipping */
425 writemmr(par, 0x2148, 0);
426 writemmr(par, 0x214C, point(4095, 2047));
427
428 switch ((pitch * bpp) / 8) {
429 case 8192:
430 case 512:
431 x |= 0x00;
432 break;
433 case 1024:
434 x |= 0x04;
435 break;
436 case 2048:
437 x |= 0x08;
438 break;
439 case 4096:
440 x |= 0x0C;
441 break;
442 }
443
444 fb_writew(x, par->io_virt + 0x2122);
445}
446
447static void tgui_fill_rect(struct tridentfb_par *par,
448 u32 x, u32 y, u32 w, u32 h, u32 c, u32 rop)
449{
450 t_outb(par, ROP_P, 0x2127);
451 writemmr(par, OLDCLR, c);
452 writemmr(par, DRAWFL, 0x4020);
453 writemmr(par, OLDDIM, point(w - 1, h - 1));
454 writemmr(par, OLDDST, point(x, y));
455 t_outb(par, 1, OLDCMD);
456}
457
458static void tgui_copy_rect(struct tridentfb_par *par,
459 u32 x1, u32 y1, u32 x2, u32 y2, u32 w, u32 h)
460{
461 int flags = 0;
462 u16 x1_tmp, x2_tmp, y1_tmp, y2_tmp;
463
464 if ((x1 < x2) && (y1 == y2)) {
465 flags |= 0x0200;
466 x1_tmp = x1 + w - 1;
467 x2_tmp = x2 + w - 1;
468 } else {
469 x1_tmp = x1;
470 x2_tmp = x2;
471 }
472
473 if (y1 < y2) {
474 flags |= 0x0100;
475 y1_tmp = y1 + h - 1;
476 y2_tmp = y2 + h - 1;
477 } else {
478 y1_tmp = y1;
479 y2_tmp = y2;
480 }
481
482 writemmr(par, DRAWFL, 0x4 | flags);
483 t_outb(par, ROP_S, 0x2127);
484 writemmr(par, OLDSRC, point(x1_tmp, y1_tmp));
485 writemmr(par, OLDDST, point(x2_tmp, y2_tmp));
486 writemmr(par, OLDDIM, point(w - 1, h - 1));
487 t_outb(par, 1, OLDCMD);
488}
479 489
480/* 490/*
481 * Accel functions called by the upper layers 491 * Accel functions called by the upper layers
@@ -484,129 +494,162 @@ static struct accel_switch accel_image = {
484static void tridentfb_fillrect(struct fb_info *info, 494static void tridentfb_fillrect(struct fb_info *info,
485 const struct fb_fillrect *fr) 495 const struct fb_fillrect *fr)
486{ 496{
487 int bpp = info->var.bits_per_pixel; 497 struct tridentfb_par *par = info->par;
488 int col = 0; 498 int col;
489 499
490 switch (bpp) { 500 if (info->flags & FBINFO_HWACCEL_DISABLED) {
491 default: 501 cfb_fillrect(info, fr);
492 case 8: 502 return;
493 col |= fr->color; 503 }
504 if (info->var.bits_per_pixel == 8) {
505 col = fr->color;
494 col |= col << 8; 506 col |= col << 8;
495 col |= col << 16; 507 col |= col << 16;
496 break; 508 } else
497 case 16:
498 col = ((u32 *)(info->pseudo_palette))[fr->color]; 509 col = ((u32 *)(info->pseudo_palette))[fr->color];
499 break; 510
500 case 32: 511 par->wait_engine(par);
501 col = ((u32 *)(info->pseudo_palette))[fr->color]; 512 par->fill_rect(par, fr->dx, fr->dy, fr->width,
502 break; 513 fr->height, col, fr->rop);
514}
515
516static void tridentfb_imageblit(struct fb_info *info,
517 const struct fb_image *img)
518{
519 struct tridentfb_par *par = info->par;
520 int col, bgcol;
521
522 if ((info->flags & FBINFO_HWACCEL_DISABLED) || img->depth != 1) {
523 cfb_imageblit(info, img);
524 return;
525 }
526 if (info->var.bits_per_pixel == 8) {
527 col = img->fg_color;
528 col |= col << 8;
529 col |= col << 16;
530 bgcol = img->bg_color;
531 bgcol |= bgcol << 8;
532 bgcol |= bgcol << 16;
533 } else {
534 col = ((u32 *)(info->pseudo_palette))[img->fg_color];
535 bgcol = ((u32 *)(info->pseudo_palette))[img->bg_color];
503 } 536 }
504 537
505 acc->fill_rect(fr->dx, fr->dy, fr->width, fr->height, col, fr->rop); 538 par->wait_engine(par);
506 acc->wait_engine(); 539 if (par->image_blit)
540 par->image_blit(par, img->data, img->dx, img->dy,
541 img->width, img->height, col, bgcol);
542 else
543 cfb_imageblit(info, img);
507} 544}
545
508static void tridentfb_copyarea(struct fb_info *info, 546static void tridentfb_copyarea(struct fb_info *info,
509 const struct fb_copyarea *ca) 547 const struct fb_copyarea *ca)
510{ 548{
511 acc->copy_rect(ca->sx, ca->sy, ca->dx, ca->dy, ca->width, ca->height); 549 struct tridentfb_par *par = info->par;
512 acc->wait_engine(); 550
551 if (info->flags & FBINFO_HWACCEL_DISABLED) {
552 cfb_copyarea(info, ca);
553 return;
554 }
555 par->wait_engine(par);
556 par->copy_rect(par, ca->sx, ca->sy, ca->dx, ca->dy,
557 ca->width, ca->height);
558}
559
560static int tridentfb_sync(struct fb_info *info)
561{
562 struct tridentfb_par *par = info->par;
563
564 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
565 par->wait_engine(par);
566 return 0;
513} 567}
514#else /* !CONFIG_FB_TRIDENT_ACCEL */ 568#else
515#define tridentfb_fillrect cfb_fillrect 569#define tridentfb_fillrect cfb_fillrect
516#define tridentfb_copyarea cfb_copyarea 570#define tridentfb_copyarea cfb_copyarea
571#define tridentfb_imageblit cfb_imageblit
517#endif /* CONFIG_FB_TRIDENT_ACCEL */ 572#endif /* CONFIG_FB_TRIDENT_ACCEL */
518 573
519
520/* 574/*
521 * Hardware access functions 575 * Hardware access functions
522 */ 576 */
523 577
524static inline unsigned char read3X4(int reg) 578static inline unsigned char read3X4(struct tridentfb_par *par, int reg)
525{ 579{
526 struct tridentfb_par *par = (struct tridentfb_par *)fb_info.par; 580 return vga_mm_rcrt(par->io_virt, reg);
527 writeb(reg, par->io_virt + CRT + 4);
528 return readb(par->io_virt + CRT + 5);
529} 581}
530 582
531static inline void write3X4(int reg, unsigned char val) 583static inline void write3X4(struct tridentfb_par *par, int reg,
584 unsigned char val)
532{ 585{
533 struct tridentfb_par *par = (struct tridentfb_par *)fb_info.par; 586 vga_mm_wcrt(par->io_virt, reg, val);
534 writeb(reg, par->io_virt + CRT + 4);
535 writeb(val, par->io_virt + CRT + 5);
536} 587}
537 588
538static inline unsigned char read3C4(int reg) 589static inline unsigned char read3CE(struct tridentfb_par *par,
590 unsigned char reg)
539{ 591{
540 t_outb(reg, 0x3C4); 592 return vga_mm_rgfx(par->io_virt, reg);
541 return t_inb(0x3C5);
542} 593}
543 594
544static inline void write3C4(int reg, unsigned char val) 595static inline void writeAttr(struct tridentfb_par *par, int reg,
596 unsigned char val)
545{ 597{
546 t_outb(reg, 0x3C4); 598 fb_readb(par->io_virt + VGA_IS1_RC); /* flip-flop to index */
547 t_outb(val, 0x3C5); 599 vga_mm_wattr(par->io_virt, reg, val);
548} 600}
549 601
550static inline unsigned char read3CE(int reg) 602static inline void write3CE(struct tridentfb_par *par, int reg,
603 unsigned char val)
551{ 604{
552 t_outb(reg, 0x3CE); 605 vga_mm_wgfx(par->io_virt, reg, val);
553 return t_inb(0x3CF);
554} 606}
555 607
556static inline void writeAttr(int reg, unsigned char val) 608static void enable_mmio(struct tridentfb_par *par)
557{
558 readb(((struct tridentfb_par *)fb_info.par)->io_virt + CRT + 0x0A); /* flip-flop to index */
559 t_outb(reg, 0x3C0);
560 t_outb(val, 0x3C0);
561}
562
563static inline void write3CE(int reg, unsigned char val)
564{
565 t_outb(reg, 0x3CE);
566 t_outb(val, 0x3CF);
567}
568
569static void enable_mmio(void)
570{ 609{
571 /* Goto New Mode */ 610 /* Goto New Mode */
572 outb(0x0B, 0x3C4); 611 vga_io_rseq(0x0B);
573 inb(0x3C5);
574 612
575 /* Unprotect registers */ 613 /* Unprotect registers */
576 outb(NewMode1, 0x3C4); 614 vga_io_wseq(NewMode1, 0x80);
577 outb(0x80, 0x3C5); 615 if (!is_oldprotect(par->chip_id))
616 vga_io_wseq(Protection, 0x92);
578 617
579 /* Enable MMIO */ 618 /* Enable MMIO */
580 outb(PCIReg, 0x3D4); 619 outb(PCIReg, 0x3D4);
581 outb(inb(0x3D5) | 0x01, 0x3D5); 620 outb(inb(0x3D5) | 0x01, 0x3D5);
582} 621}
583 622
584static void disable_mmio(void) 623static void disable_mmio(struct tridentfb_par *par)
585{ 624{
586 /* Goto New Mode */ 625 /* Goto New Mode */
587 t_outb(0x0B, 0x3C4); 626 vga_mm_rseq(par->io_virt, 0x0B);
588 t_inb(0x3C5);
589 627
590 /* Unprotect registers */ 628 /* Unprotect registers */
591 t_outb(NewMode1, 0x3C4); 629 vga_mm_wseq(par->io_virt, NewMode1, 0x80);
592 t_outb(0x80, 0x3C5); 630 if (!is_oldprotect(par->chip_id))
631 vga_mm_wseq(par->io_virt, Protection, 0x92);
593 632
594 /* Disable MMIO */ 633 /* Disable MMIO */
595 t_outb(PCIReg, 0x3D4); 634 t_outb(par, PCIReg, 0x3D4);
596 t_outb(t_inb(0x3D5) & ~0x01, 0x3D5); 635 t_outb(par, t_inb(par, 0x3D5) & ~0x01, 0x3D5);
597} 636}
598 637
599#define crtc_unlock() write3X4(CRTVSyncEnd, read3X4(CRTVSyncEnd) & 0x7F) 638static inline void crtc_unlock(struct tridentfb_par *par)
639{
640 write3X4(par, VGA_CRTC_V_SYNC_END,
641 read3X4(par, VGA_CRTC_V_SYNC_END) & 0x7F);
642}
600 643
601/* Return flat panel's maximum x resolution */ 644/* Return flat panel's maximum x resolution */
602static int __devinit get_nativex(void) 645static int __devinit get_nativex(struct tridentfb_par *par)
603{ 646{
604 int x, y, tmp; 647 int x, y, tmp;
605 648
606 if (nativex) 649 if (nativex)
607 return nativex; 650 return nativex;
608 651
609 tmp = (read3CE(VertStretch) >> 4) & 3; 652 tmp = (read3CE(par, VertStretch) >> 4) & 3;
610 653
611 switch (tmp) { 654 switch (tmp) {
612 case 0: 655 case 0:
@@ -632,77 +675,92 @@ static int __devinit get_nativex(void)
632} 675}
633 676
634/* Set pitch */ 677/* Set pitch */
635static void set_lwidth(int width) 678static inline void set_lwidth(struct tridentfb_par *par, int width)
636{ 679{
637 write3X4(Offset, width & 0xFF); 680 write3X4(par, VGA_CRTC_OFFSET, width & 0xFF);
638 write3X4(AddColReg, 681 write3X4(par, AddColReg,
639 (read3X4(AddColReg) & 0xCF) | ((width & 0x300) >> 4)); 682 (read3X4(par, AddColReg) & 0xCF) | ((width & 0x300) >> 4));
640} 683}
641 684
642/* For resolutions smaller than FP resolution stretch */ 685/* For resolutions smaller than FP resolution stretch */
643static void screen_stretch(void) 686static void screen_stretch(struct tridentfb_par *par)
644{ 687{
645 if (chip_id != CYBERBLADEXPAi1) 688 if (par->chip_id != CYBERBLADEXPAi1)
646 write3CE(BiosReg, 0); 689 write3CE(par, BiosReg, 0);
647 else 690 else
648 write3CE(BiosReg, 8); 691 write3CE(par, BiosReg, 8);
649 write3CE(VertStretch, (read3CE(VertStretch) & 0x7C) | 1); 692 write3CE(par, VertStretch, (read3CE(par, VertStretch) & 0x7C) | 1);
650 write3CE(HorStretch, (read3CE(HorStretch) & 0x7C) | 1); 693 write3CE(par, HorStretch, (read3CE(par, HorStretch) & 0x7C) | 1);
651} 694}
652 695
653/* For resolutions smaller than FP resolution center */ 696/* For resolutions smaller than FP resolution center */
654static void screen_center(void) 697static inline void screen_center(struct tridentfb_par *par)
655{ 698{
656 write3CE(VertStretch, (read3CE(VertStretch) & 0x7C) | 0x80); 699 write3CE(par, VertStretch, (read3CE(par, VertStretch) & 0x7C) | 0x80);
657 write3CE(HorStretch, (read3CE(HorStretch) & 0x7C) | 0x80); 700 write3CE(par, HorStretch, (read3CE(par, HorStretch) & 0x7C) | 0x80);
658} 701}
659 702
660/* Address of first shown pixel in display memory */ 703/* Address of first shown pixel in display memory */
661static void set_screen_start(int base) 704static void set_screen_start(struct tridentfb_par *par, int base)
662{ 705{
663 write3X4(StartAddrLow, base & 0xFF); 706 u8 tmp;
664 write3X4(StartAddrHigh, (base & 0xFF00) >> 8); 707 write3X4(par, VGA_CRTC_START_LO, base & 0xFF);
665 write3X4(CRTCModuleTest, 708 write3X4(par, VGA_CRTC_START_HI, (base & 0xFF00) >> 8);
666 (read3X4(CRTCModuleTest) & 0xDF) | ((base & 0x10000) >> 11)); 709 tmp = read3X4(par, CRTCModuleTest) & 0xDF;
667 write3X4(CRTHiOrd, 710 write3X4(par, CRTCModuleTest, tmp | ((base & 0x10000) >> 11));
668 (read3X4(CRTHiOrd) & 0xF8) | ((base & 0xE0000) >> 17)); 711 tmp = read3X4(par, CRTHiOrd) & 0xF8;
712 write3X4(par, CRTHiOrd, tmp | ((base & 0xE0000) >> 17));
669} 713}
670 714
671/* Set dotclock frequency */ 715/* Set dotclock frequency */
672static void set_vclk(unsigned long freq) 716static void set_vclk(struct tridentfb_par *par, unsigned long freq)
673{ 717{
674 int m, n, k; 718 int m, n, k;
675 unsigned long f, fi, d, di; 719 unsigned long fi, d, di;
676 unsigned char lo = 0, hi = 0; 720 unsigned char best_m = 0, best_n = 0, best_k = 0;
721 unsigned char hi, lo;
722 unsigned char shift = !is_oldclock(par->chip_id) ? 2 : 1;
677 723
678 d = 20000; 724 d = 20000;
679 for (k = 2; k >= 0; k--) 725 for (k = shift; k >= 0; k--)
680 for (m = 0; m < 63; m++) 726 for (m = 1; m < 32; m++) {
681 for (n = 0; n < 128; n++) { 727 n = ((m + 2) << shift) - 8;
728 for (n = (n < 0 ? 0 : n); n < 122; n++) {
682 fi = ((14318l * (n + 8)) / (m + 2)) >> k; 729 fi = ((14318l * (n + 8)) / (m + 2)) >> k;
683 if ((di = abs(fi - freq)) < d) { 730 di = abs(fi - freq);
731 if (di < d || (di == d && k == best_k)) {
684 d = di; 732 d = di;
685 f = fi; 733 best_n = n;
686 lo = n; 734 best_m = m;
687 hi = (k << 6) | m; 735 best_k = k;
688 } 736 }
689 if (fi > freq) 737 if (fi > freq)
690 break; 738 break;
691 } 739 }
692 if (chip3D) { 740 }
693 write3C4(ClockHigh, hi); 741
694 write3C4(ClockLow, lo); 742 if (is_oldclock(par->chip_id)) {
743 lo = best_n | (best_m << 7);
744 hi = (best_m >> 1) | (best_k << 4);
695 } else { 745 } else {
696 outb(lo, 0x43C8); 746 lo = best_n;
697 outb(hi, 0x43C9); 747 hi = best_m | (best_k << 6);
748 }
749
750 if (is3Dchip(par->chip_id)) {
751 vga_mm_wseq(par->io_virt, ClockHigh, hi);
752 vga_mm_wseq(par->io_virt, ClockLow, lo);
753 } else {
754 t_outb(par, lo, 0x43C8);
755 t_outb(par, hi, 0x43C9);
698 } 756 }
699 debug("VCLK = %X %X\n", hi, lo); 757 debug("VCLK = %X %X\n", hi, lo);
700} 758}
701 759
702/* Set number of lines for flat panels*/ 760/* Set number of lines for flat panels*/
703static void set_number_of_lines(int lines) 761static void set_number_of_lines(struct tridentfb_par *par, int lines)
704{ 762{
705 int tmp = read3CE(CyberEnhance) & 0x8F; 763 int tmp = read3CE(par, CyberEnhance) & 0x8F;
706 if (lines > 1024) 764 if (lines > 1024)
707 tmp |= 0x50; 765 tmp |= 0x50;
708 else if (lines > 768) 766 else if (lines > 768)
@@ -711,24 +769,24 @@ static void set_number_of_lines(int lines)
711 tmp |= 0x20; 769 tmp |= 0x20;
712 else if (lines > 480) 770 else if (lines > 480)
713 tmp |= 0x10; 771 tmp |= 0x10;
714 write3CE(CyberEnhance, tmp); 772 write3CE(par, CyberEnhance, tmp);
715} 773}
716 774
717/* 775/*
718 * If we see that FP is active we assume we have one. 776 * If we see that FP is active we assume we have one.
719 * Otherwise we have a CRT display.User can override. 777 * Otherwise we have a CRT display. User can override.
720 */ 778 */
721static unsigned int __devinit get_displaytype(void) 779static int __devinit is_flatpanel(struct tridentfb_par *par)
722{ 780{
723 if (fp) 781 if (fp)
724 return DISPLAY_FP; 782 return 1;
725 if (crt || !chipcyber) 783 if (crt || !iscyber(par->chip_id))
726 return DISPLAY_CRT; 784 return 0;
727 return (read3CE(FPConfig) & 0x10) ? DISPLAY_FP : DISPLAY_CRT; 785 return (read3CE(par, FPConfig) & 0x10) ? 1 : 0;
728} 786}
729 787
730/* Try detecting the video memory size */ 788/* Try detecting the video memory size */
731static unsigned int __devinit get_memsize(void) 789static unsigned int __devinit get_memsize(struct tridentfb_par *par)
732{ 790{
733 unsigned char tmp, tmp2; 791 unsigned char tmp, tmp2;
734 unsigned int k; 792 unsigned int k;
@@ -737,12 +795,12 @@ static unsigned int __devinit get_memsize(void)
737 if (memsize) 795 if (memsize)
738 k = memsize * Kb; 796 k = memsize * Kb;
739 else 797 else
740 switch (chip_id) { 798 switch (par->chip_id) {
741 case CYBER9525DVD: 799 case CYBER9525DVD:
742 k = 2560 * Kb; 800 k = 2560 * Kb;
743 break; 801 break;
744 default: 802 default:
745 tmp = read3X4(SPR) & 0x0F; 803 tmp = read3X4(par, SPR) & 0x0F;
746 switch (tmp) { 804 switch (tmp) {
747 805
748 case 0x01: 806 case 0x01:
@@ -774,7 +832,7 @@ static unsigned int __devinit get_memsize(void)
774 break; 832 break;
775 case 0x0E: /* XP */ 833 case 0x0E: /* XP */
776 834
777 tmp2 = read3C4(0xC1); 835 tmp2 = vga_mm_rseq(par->io_virt, 0xC1);
778 switch (tmp2) { 836 switch (tmp2) {
779 case 0x00: 837 case 0x00:
780 k = 20 * Mb; 838 k = 20 * Mb;
@@ -812,26 +870,67 @@ static unsigned int __devinit get_memsize(void)
812static int tridentfb_check_var(struct fb_var_screeninfo *var, 870static int tridentfb_check_var(struct fb_var_screeninfo *var,
813 struct fb_info *info) 871 struct fb_info *info)
814{ 872{
873 struct tridentfb_par *par = info->par;
815 int bpp = var->bits_per_pixel; 874 int bpp = var->bits_per_pixel;
875 int line_length;
876 int ramdac = 230000; /* 230MHz for most 3D chips */
816 debug("enter\n"); 877 debug("enter\n");
817 878
818 /* check color depth */ 879 /* check color depth */
819 if (bpp == 24) 880 if (bpp == 24)
820 bpp = var->bits_per_pixel = 32; 881 bpp = var->bits_per_pixel = 32;
882 if (bpp != 8 && bpp != 16 && bpp != 32)
883 return -EINVAL;
884 if (par->chip_id == TGUI9440 && bpp == 32)
885 return -EINVAL;
821 /* check whether resolution fits on panel and in memory */ 886 /* check whether resolution fits on panel and in memory */
822 if (flatpanel && nativex && var->xres > nativex) 887 if (par->flatpanel && nativex && var->xres > nativex)
888 return -EINVAL;
889 /* various resolution checks */
890 var->xres = (var->xres + 7) & ~0x7;
891 if (var->xres > var->xres_virtual)
892 var->xres_virtual = var->xres;
893 if (var->yres > var->yres_virtual)
894 var->yres_virtual = var->yres;
895 if (var->xres_virtual > 4095 || var->yres > 2048)
823 return -EINVAL; 896 return -EINVAL;
824 if (var->xres * var->yres_virtual * bpp / 8 > info->fix.smem_len) 897 /* prevent from position overflow for acceleration */
898 if (var->yres_virtual > 0xffff)
899 return -EINVAL;
900 line_length = var->xres_virtual * bpp / 8;
901
902 if (!is3Dchip(par->chip_id) &&
903 !(info->flags & FBINFO_HWACCEL_DISABLED)) {
904 /* acceleration requires line length to be power of 2 */
905 if (line_length <= 512)
906 var->xres_virtual = 512 * 8 / bpp;
907 else if (line_length <= 1024)
908 var->xres_virtual = 1024 * 8 / bpp;
909 else if (line_length <= 2048)
910 var->xres_virtual = 2048 * 8 / bpp;
911 else if (line_length <= 4096)
912 var->xres_virtual = 4096 * 8 / bpp;
913 else if (line_length <= 8192)
914 var->xres_virtual = 8192 * 8 / bpp;
915 else
916 return -EINVAL;
917
918 line_length = var->xres_virtual * bpp / 8;
919 }
920
921 /* datasheet specifies how to set panning only up to 4 MB */
922 if (line_length * (var->yres_virtual - var->yres) > (4 << 20))
923 var->yres_virtual = ((4 << 20) / line_length) + var->yres;
924
925 if (line_length * var->yres_virtual > info->fix.smem_len)
825 return -EINVAL; 926 return -EINVAL;
826 927
827 switch (bpp) { 928 switch (bpp) {
828 case 8: 929 case 8:
829 var->red.offset = 0; 930 var->red.offset = 0;
830 var->green.offset = 0; 931 var->red.length = 8;
831 var->blue.offset = 0; 932 var->green = var->red;
832 var->red.length = 6; 933 var->blue = var->red;
833 var->green.length = 6;
834 var->blue.length = 6;
835 break; 934 break;
836 case 16: 935 case 16:
837 var->red.offset = 11; 936 var->red.offset = 11;
@@ -852,6 +951,33 @@ static int tridentfb_check_var(struct fb_var_screeninfo *var,
852 default: 951 default:
853 return -EINVAL; 952 return -EINVAL;
854 } 953 }
954
955 if (is_xp(par->chip_id))
956 ramdac = 350000;
957
958 switch (par->chip_id) {
959 case TGUI9440:
960 ramdac = (bpp >= 16) ? 45000 : 90000;
961 break;
962 case CYBER9320:
963 case TGUI9660:
964 ramdac = 135000;
965 break;
966 case PROVIDIA9685:
967 case CYBER9388:
968 case CYBER9382:
969 case CYBER9385:
970 ramdac = 170000;
971 break;
972 }
973
974 /* The clock is doubled for 32 bpp */
975 if (bpp == 32)
976 ramdac /= 2;
977
978 if (PICOS2KHZ(var->pixclock) > ramdac)
979 return -EINVAL;
980
855 debug("exit\n"); 981 debug("exit\n");
856 982
857 return 0; 983 return 0;
@@ -862,25 +988,31 @@ static int tridentfb_check_var(struct fb_var_screeninfo *var,
862static int tridentfb_pan_display(struct fb_var_screeninfo *var, 988static int tridentfb_pan_display(struct fb_var_screeninfo *var,
863 struct fb_info *info) 989 struct fb_info *info)
864{ 990{
991 struct tridentfb_par *par = info->par;
865 unsigned int offset; 992 unsigned int offset;
866 993
867 debug("enter\n"); 994 debug("enter\n");
868 offset = (var->xoffset + (var->yoffset * var->xres)) 995 offset = (var->xoffset + (var->yoffset * var->xres_virtual))
869 * var->bits_per_pixel / 32; 996 * var->bits_per_pixel / 32;
870 info->var.xoffset = var->xoffset; 997 set_screen_start(par, offset);
871 info->var.yoffset = var->yoffset;
872 set_screen_start(offset);
873 debug("exit\n"); 998 debug("exit\n");
874 return 0; 999 return 0;
875} 1000}
876 1001
877#define shadowmode_on() write3CE(CyberControl, read3CE(CyberControl) | 0x81) 1002static inline void shadowmode_on(struct tridentfb_par *par)
878#define shadowmode_off() write3CE(CyberControl, read3CE(CyberControl) & 0x7E) 1003{
1004 write3CE(par, CyberControl, read3CE(par, CyberControl) | 0x81);
1005}
1006
1007static inline void shadowmode_off(struct tridentfb_par *par)
1008{
1009 write3CE(par, CyberControl, read3CE(par, CyberControl) & 0x7E);
1010}
879 1011
880/* Set the hardware to the requested video mode */ 1012/* Set the hardware to the requested video mode */
881static int tridentfb_set_par(struct fb_info *info) 1013static int tridentfb_set_par(struct fb_info *info)
882{ 1014{
883 struct tridentfb_par *par = (struct tridentfb_par *)(info->par); 1015 struct tridentfb_par *par = info->par;
884 u32 htotal, hdispend, hsyncstart, hsyncend, hblankstart, hblankend; 1016 u32 htotal, hdispend, hsyncstart, hsyncend, hblankstart, hblankend;
885 u32 vtotal, vdispend, vsyncstart, vsyncend, vblankstart, vblankend; 1017 u32 vtotal, vdispend, vsyncstart, vsyncend, vblankstart, vblankend;
886 struct fb_var_screeninfo *var = &info->var; 1018 struct fb_var_screeninfo *var = &info->var;
@@ -891,58 +1023,73 @@ static int tridentfb_set_par(struct fb_info *info)
891 debug("enter\n"); 1023 debug("enter\n");
892 hdispend = var->xres / 8 - 1; 1024 hdispend = var->xres / 8 - 1;
893 hsyncstart = (var->xres + var->right_margin) / 8; 1025 hsyncstart = (var->xres + var->right_margin) / 8;
894 hsyncend = var->hsync_len / 8; 1026 hsyncend = (var->xres + var->right_margin + var->hsync_len) / 8;
895 htotal = 1027 htotal = (var->xres + var->left_margin + var->right_margin +
896 (var->xres + var->left_margin + var->right_margin + 1028 var->hsync_len) / 8 - 5;
897 var->hsync_len) / 8 - 10;
898 hblankstart = hdispend + 1; 1029 hblankstart = hdispend + 1;
899 hblankend = htotal + 5; 1030 hblankend = htotal + 3;
900 1031
901 vdispend = var->yres - 1; 1032 vdispend = var->yres - 1;
902 vsyncstart = var->yres + var->lower_margin; 1033 vsyncstart = var->yres + var->lower_margin;
903 vsyncend = var->vsync_len; 1034 vsyncend = vsyncstart + var->vsync_len;
904 vtotal = var->upper_margin + vsyncstart + vsyncend - 2; 1035 vtotal = var->upper_margin + vsyncend - 2;
905 vblankstart = var->yres; 1036 vblankstart = vdispend + 1;
906 vblankend = vtotal + 2; 1037 vblankend = vtotal;
1038
1039 if (info->var.vmode & FB_VMODE_INTERLACED) {
1040 vtotal /= 2;
1041 vdispend /= 2;
1042 vsyncstart /= 2;
1043 vsyncend /= 2;
1044 vblankstart /= 2;
1045 vblankend /= 2;
1046 }
907 1047
908 crtc_unlock(); 1048 enable_mmio(par);
909 write3CE(CyberControl, 8); 1049 crtc_unlock(par);
1050 write3CE(par, CyberControl, 8);
1051 tmp = 0xEB;
1052 if (var->sync & FB_SYNC_HOR_HIGH_ACT)
1053 tmp &= ~0x40;
1054 if (var->sync & FB_SYNC_VERT_HIGH_ACT)
1055 tmp &= ~0x80;
910 1056
911 if (flatpanel && var->xres < nativex) { 1057 if (par->flatpanel && var->xres < nativex) {
912 /* 1058 /*
913 * on flat panels with native size larger 1059 * on flat panels with native size larger
914 * than requested resolution decide whether 1060 * than requested resolution decide whether
915 * we stretch or center 1061 * we stretch or center
916 */ 1062 */
917 t_outb(0xEB, 0x3C2); 1063 t_outb(par, tmp | 0xC0, VGA_MIS_W);
918 1064
919 shadowmode_on(); 1065 shadowmode_on(par);
920 1066
921 if (center) 1067 if (center)
922 screen_center(); 1068 screen_center(par);
923 else if (stretch) 1069 else if (stretch)
924 screen_stretch(); 1070 screen_stretch(par);
925 1071
926 } else { 1072 } else {
927 t_outb(0x2B, 0x3C2); 1073 t_outb(par, tmp, VGA_MIS_W);
928 write3CE(CyberControl, 8); 1074 write3CE(par, CyberControl, 8);
929 } 1075 }
930 1076
931 /* vertical timing values */ 1077 /* vertical timing values */
932 write3X4(CRTVTotal, vtotal & 0xFF); 1078 write3X4(par, VGA_CRTC_V_TOTAL, vtotal & 0xFF);
933 write3X4(CRTVDispEnd, vdispend & 0xFF); 1079 write3X4(par, VGA_CRTC_V_DISP_END, vdispend & 0xFF);
934 write3X4(CRTVSyncStart, vsyncstart & 0xFF); 1080 write3X4(par, VGA_CRTC_V_SYNC_START, vsyncstart & 0xFF);
935 write3X4(CRTVSyncEnd, (vsyncend & 0x0F)); 1081 write3X4(par, VGA_CRTC_V_SYNC_END, (vsyncend & 0x0F));
936 write3X4(CRTVBlankStart, vblankstart & 0xFF); 1082 write3X4(par, VGA_CRTC_V_BLANK_START, vblankstart & 0xFF);
937 write3X4(CRTVBlankEnd, 0 /* p->vblankend & 0xFF */ ); 1083 write3X4(par, VGA_CRTC_V_BLANK_END, vblankend & 0xFF);
938 1084
939 /* horizontal timing values */ 1085 /* horizontal timing values */
940 write3X4(CRTHTotal, htotal & 0xFF); 1086 write3X4(par, VGA_CRTC_H_TOTAL, htotal & 0xFF);
941 write3X4(CRTHDispEnd, hdispend & 0xFF); 1087 write3X4(par, VGA_CRTC_H_DISP, hdispend & 0xFF);
942 write3X4(CRTHSyncStart, hsyncstart & 0xFF); 1088 write3X4(par, VGA_CRTC_H_SYNC_START, hsyncstart & 0xFF);
943 write3X4(CRTHSyncEnd, (hsyncend & 0x1F) | ((hblankend & 0x20) << 2)); 1089 write3X4(par, VGA_CRTC_H_SYNC_END,
944 write3X4(CRTHBlankStart, hblankstart & 0xFF); 1090 (hsyncend & 0x1F) | ((hblankend & 0x20) << 2));
945 write3X4(CRTHBlankEnd, 0 /* (p->hblankend & 0x1F) */ ); 1091 write3X4(par, VGA_CRTC_H_BLANK_START, hblankstart & 0xFF);
1092 write3X4(par, VGA_CRTC_H_BLANK_END, hblankend & 0x1F);
946 1093
947 /* higher bits of vertical timing values */ 1094 /* higher bits of vertical timing values */
948 tmp = 0x10; 1095 tmp = 0x10;
@@ -954,39 +1101,43 @@ static int tridentfb_set_par(struct fb_info *info)
954 if (vtotal & 0x200) tmp |= 0x20; 1101 if (vtotal & 0x200) tmp |= 0x20;
955 if (vdispend & 0x200) tmp |= 0x40; 1102 if (vdispend & 0x200) tmp |= 0x40;
956 if (vsyncstart & 0x200) tmp |= 0x80; 1103 if (vsyncstart & 0x200) tmp |= 0x80;
957 write3X4(CRTOverflow, tmp); 1104 write3X4(par, VGA_CRTC_OVERFLOW, tmp);
958 1105
959 tmp = read3X4(CRTHiOrd) | 0x08; /* line compare bit 10 */ 1106 tmp = read3X4(par, CRTHiOrd) & 0x07;
1107 tmp |= 0x08; /* line compare bit 10 */
960 if (vtotal & 0x400) tmp |= 0x80; 1108 if (vtotal & 0x400) tmp |= 0x80;
961 if (vblankstart & 0x400) tmp |= 0x40; 1109 if (vblankstart & 0x400) tmp |= 0x40;
962 if (vsyncstart & 0x400) tmp |= 0x20; 1110 if (vsyncstart & 0x400) tmp |= 0x20;
963 if (vdispend & 0x400) tmp |= 0x10; 1111 if (vdispend & 0x400) tmp |= 0x10;
964 write3X4(CRTHiOrd, tmp); 1112 write3X4(par, CRTHiOrd, tmp);
965 1113
966 tmp = 0; 1114 tmp = (htotal >> 8) & 0x01;
967 if (htotal & 0x800) tmp |= 0x800 >> 11; 1115 tmp |= (hdispend >> 7) & 0x02;
968 if (hblankstart & 0x800) tmp |= 0x800 >> 7; 1116 tmp |= (hsyncstart >> 5) & 0x08;
969 write3X4(HorizOverflow, tmp); 1117 tmp |= (hblankstart >> 4) & 0x10;
1118 write3X4(par, HorizOverflow, tmp);
970 1119
971 tmp = 0x40; 1120 tmp = 0x40;
972 if (vblankstart & 0x200) tmp |= 0x20; 1121 if (vblankstart & 0x200) tmp |= 0x20;
973//FIXME if (info->var.vmode & FB_VMODE_DOUBLE) tmp |= 0x80; /* double scan for 200 line modes */ 1122//FIXME if (info->var.vmode & FB_VMODE_DOUBLE) tmp |= 0x80; /* double scan for 200 line modes */
974 write3X4(CRTMaxScanLine, tmp); 1123 write3X4(par, VGA_CRTC_MAX_SCAN, tmp);
975 1124
976 write3X4(CRTLineCompare, 0xFF); 1125 write3X4(par, VGA_CRTC_LINE_COMPARE, 0xFF);
977 write3X4(CRTPRowScan, 0); 1126 write3X4(par, VGA_CRTC_PRESET_ROW, 0);
978 write3X4(CRTModeControl, 0xC3); 1127 write3X4(par, VGA_CRTC_MODE, 0xC3);
979 1128
980 write3X4(LinearAddReg, 0x20); /* enable linear addressing */ 1129 write3X4(par, LinearAddReg, 0x20); /* enable linear addressing */
981 1130
982 tmp = (info->var.vmode & FB_VMODE_INTERLACED) ? 0x84 : 0x80; 1131 tmp = (info->var.vmode & FB_VMODE_INTERLACED) ? 0x84 : 0x80;
983 write3X4(CRTCModuleTest, tmp); /* enable access extended memory */ 1132 /* enable access extended memory */
984 1133 write3X4(par, CRTCModuleTest, tmp);
985 write3X4(GraphEngReg, 0x80); /* enable GE for text acceleration */ 1134 tmp = read3CE(par, MiscIntContReg) & ~0x4;
1135 if (info->var.vmode & FB_VMODE_INTERLACED)
1136 tmp |= 0x4;
1137 write3CE(par, MiscIntContReg, tmp);
986 1138
987#ifdef CONFIG_FB_TRIDENT_ACCEL 1139 /* enable GE for text acceleration */
988 acc->init_accel(info->var.xres, bpp); 1140 write3X4(par, GraphEngReg, 0x80);
989#endif
990 1141
991 switch (bpp) { 1142 switch (bpp) {
992 case 8: 1143 case 8:
@@ -1003,57 +1154,59 @@ static int tridentfb_set_par(struct fb_info *info)
1003 break; 1154 break;
1004 } 1155 }
1005 1156
1006 write3X4(PixelBusReg, tmp); 1157 write3X4(par, PixelBusReg, tmp);
1007 1158
1008 tmp = 0x10; 1159 tmp = read3X4(par, DRAMControl);
1009 if (chipcyber) 1160 if (!is_oldprotect(par->chip_id))
1161 tmp |= 0x10;
1162 if (iscyber(par->chip_id))
1010 tmp |= 0x20; 1163 tmp |= 0x20;
1011 write3X4(DRAMControl, tmp); /* both IO, linear enable */ 1164 write3X4(par, DRAMControl, tmp); /* both IO, linear enable */
1012 1165
1013 write3X4(InterfaceSel, read3X4(InterfaceSel) | 0x40); 1166 write3X4(par, InterfaceSel, read3X4(par, InterfaceSel) | 0x40);
1014 write3X4(Performance, 0x92); 1167 if (!is_xp(par->chip_id))
1015 write3X4(PCIReg, 0x07); /* MMIO & PCI read and write burst enable */ 1168 write3X4(par, Performance, read3X4(par, Performance) | 0x10);
1169 /* MMIO & PCI read and write burst enable */
1170 if (par->chip_id != TGUI9440 && par->chip_id != IMAGE975)
1171 write3X4(par, PCIReg, read3X4(par, PCIReg) | 0x06);
1172
1173 vga_mm_wseq(par->io_virt, 0, 3);
1174 vga_mm_wseq(par->io_virt, 1, 1); /* set char clock 8 dots wide */
1175 /* enable 4 maps because needed in chain4 mode */
1176 vga_mm_wseq(par->io_virt, 2, 0x0F);
1177 vga_mm_wseq(par->io_virt, 3, 0);
1178 vga_mm_wseq(par->io_virt, 4, 0x0E); /* memory mode enable bitmaps ?? */
1016 1179
1017 /* convert from picoseconds to kHz */ 1180 /* convert from picoseconds to kHz */
1018 vclk = PICOS2KHZ(info->var.pixclock); 1181 vclk = PICOS2KHZ(info->var.pixclock);
1019 if (bpp == 32) 1182
1183 /* divide clock by 2 if 32bpp chain4 mode display and CPU path */
1184 tmp = read3CE(par, MiscExtFunc) & 0xF0;
1185 if (bpp == 32 || (par->chip_id == TGUI9440 && bpp == 16)) {
1186 tmp |= 8;
1020 vclk *= 2; 1187 vclk *= 2;
1021 set_vclk(vclk);
1022
1023 write3C4(0, 3);
1024 write3C4(1, 1); /* set char clock 8 dots wide */
1025 write3C4(2, 0x0F); /* enable 4 maps because needed in chain4 mode */
1026 write3C4(3, 0);
1027 write3C4(4, 0x0E); /* memory mode enable bitmaps ?? */
1028
1029 write3CE(MiscExtFunc, (bpp == 32) ? 0x1A : 0x12); /* divide clock by 2 if 32bpp */
1030 /* chain4 mode display and CPU path */
1031 write3CE(0x5, 0x40); /* no CGA compat, allow 256 col */
1032 write3CE(0x6, 0x05); /* graphics mode */
1033 write3CE(0x7, 0x0F); /* planes? */
1034
1035 if (chip_id == CYBERBLADEXPAi1) {
1036 /* This fixes snow-effect in 32 bpp */
1037 write3X4(CRTHSyncStart, 0x84);
1038 } 1188 }
1189 set_vclk(par, vclk);
1190 write3CE(par, MiscExtFunc, tmp | 0x12);
1191 write3CE(par, 0x5, 0x40); /* no CGA compat, allow 256 col */
1192 write3CE(par, 0x6, 0x05); /* graphics mode */
1193 write3CE(par, 0x7, 0x0F); /* planes? */
1039 1194
1040 writeAttr(0x10, 0x41); /* graphics mode and support 256 color modes */ 1195 /* graphics mode and support 256 color modes */
1041 writeAttr(0x12, 0x0F); /* planes */ 1196 writeAttr(par, 0x10, 0x41);
1042 writeAttr(0x13, 0); /* horizontal pel panning */ 1197 writeAttr(par, 0x12, 0x0F); /* planes */
1198 writeAttr(par, 0x13, 0); /* horizontal pel panning */
1043 1199
1044 /* colors */ 1200 /* colors */
1045 for (tmp = 0; tmp < 0x10; tmp++) 1201 for (tmp = 0; tmp < 0x10; tmp++)
1046 writeAttr(tmp, tmp); 1202 writeAttr(par, tmp, tmp);
1047 readb(par->io_virt + CRT + 0x0A); /* flip-flop to index */ 1203 fb_readb(par->io_virt + VGA_IS1_RC); /* flip-flop to index */
1048 t_outb(0x20, 0x3C0); /* enable attr */ 1204 t_outb(par, 0x20, VGA_ATT_W); /* enable attr */
1049 1205
1050 switch (bpp) { 1206 switch (bpp) {
1051 case 8: 1207 case 8:
1052 tmp = 0; 1208 tmp = 0;
1053 break; 1209 break;
1054 case 15:
1055 tmp = 0x10;
1056 break;
1057 case 16: 1210 case 16:
1058 tmp = 0x30; 1211 tmp = 0x30;
1059 break; 1212 break;
@@ -1063,19 +1216,23 @@ static int tridentfb_set_par(struct fb_info *info)
1063 break; 1216 break;
1064 } 1217 }
1065 1218
1066 t_inb(0x3C8); 1219 t_inb(par, VGA_PEL_IW);
1067 t_inb(0x3C6); 1220 t_inb(par, VGA_PEL_MSK);
1068 t_inb(0x3C6); 1221 t_inb(par, VGA_PEL_MSK);
1069 t_inb(0x3C6); 1222 t_inb(par, VGA_PEL_MSK);
1070 t_inb(0x3C6); 1223 t_inb(par, VGA_PEL_MSK);
1071 t_outb(tmp, 0x3C6); 1224 t_outb(par, tmp, VGA_PEL_MSK);
1072 t_inb(0x3C8); 1225 t_inb(par, VGA_PEL_IW);
1073 1226
1074 if (flatpanel) 1227 if (par->flatpanel)
1075 set_number_of_lines(info->var.yres); 1228 set_number_of_lines(par, info->var.yres);
1076 set_lwidth(info->var.xres * bpp / (4 * 16)); 1229 info->fix.line_length = info->var.xres_virtual * bpp / 8;
1230 set_lwidth(par, info->fix.line_length / 8);
1231
1232 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
1233 par->init_accel(par, info->var.xres_virtual, bpp);
1234
1077 info->fix.visual = (bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; 1235 info->fix.visual = (bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
1078 info->fix.line_length = info->var.xres * (bpp >> 3);
1079 info->cmap.len = (bpp == 8) ? 256 : 16; 1236 info->cmap.len = (bpp == 8) ? 256 : 16;
1080 debug("exit\n"); 1237 debug("exit\n");
1081 return 0; 1238 return 0;
@@ -1087,17 +1244,18 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1087 struct fb_info *info) 1244 struct fb_info *info)
1088{ 1245{
1089 int bpp = info->var.bits_per_pixel; 1246 int bpp = info->var.bits_per_pixel;
1247 struct tridentfb_par *par = info->par;
1090 1248
1091 if (regno >= info->cmap.len) 1249 if (regno >= info->cmap.len)
1092 return 1; 1250 return 1;
1093 1251
1094 if (bpp == 8) { 1252 if (bpp == 8) {
1095 t_outb(0xFF, 0x3C6); 1253 t_outb(par, 0xFF, VGA_PEL_MSK);
1096 t_outb(regno, 0x3C8); 1254 t_outb(par, regno, VGA_PEL_IW);
1097 1255
1098 t_outb(red >> 10, 0x3C9); 1256 t_outb(par, red >> 10, VGA_PEL_D);
1099 t_outb(green >> 10, 0x3C9); 1257 t_outb(par, green >> 10, VGA_PEL_D);
1100 t_outb(blue >> 10, 0x3C9); 1258 t_outb(par, blue >> 10, VGA_PEL_D);
1101 1259
1102 } else if (regno < 16) { 1260 } else if (regno < 16) {
1103 if (bpp == 16) { /* RGB 565 */ 1261 if (bpp == 16) { /* RGB 565 */
@@ -1108,28 +1266,28 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1108 col |= col << 16; 1266 col |= col << 16;
1109 ((u32 *)(info->pseudo_palette))[regno] = col; 1267 ((u32 *)(info->pseudo_palette))[regno] = col;
1110 } else if (bpp == 32) /* ARGB 8888 */ 1268 } else if (bpp == 32) /* ARGB 8888 */
1111 ((u32*)info->pseudo_palette)[regno] = 1269 ((u32 *)info->pseudo_palette)[regno] =
1112 ((transp & 0xFF00) << 16) | 1270 ((transp & 0xFF00) << 16) |
1113 ((red & 0xFF00) << 8) | 1271 ((red & 0xFF00) << 8) |
1114 ((green & 0xFF00)) | 1272 ((green & 0xFF00)) |
1115 ((blue & 0xFF00) >> 8); 1273 ((blue & 0xFF00) >> 8);
1116 } 1274 }
1117 1275
1118/* debug("exit\n"); */
1119 return 0; 1276 return 0;
1120} 1277}
1121 1278
1122/* Try blanking the screen.For flat panels it does nothing */ 1279/* Try blanking the screen. For flat panels it does nothing */
1123static int tridentfb_blank(int blank_mode, struct fb_info *info) 1280static int tridentfb_blank(int blank_mode, struct fb_info *info)
1124{ 1281{
1125 unsigned char PMCont, DPMSCont; 1282 unsigned char PMCont, DPMSCont;
1283 struct tridentfb_par *par = info->par;
1126 1284
1127 debug("enter\n"); 1285 debug("enter\n");
1128 if (flatpanel) 1286 if (par->flatpanel)
1129 return 0; 1287 return 0;
1130 t_outb(0x04, 0x83C8); /* Read DPMS Control */ 1288 t_outb(par, 0x04, 0x83C8); /* Read DPMS Control */
1131 PMCont = t_inb(0x83C6) & 0xFC; 1289 PMCont = t_inb(par, 0x83C6) & 0xFC;
1132 DPMSCont = read3CE(PowerStatus) & 0xFC; 1290 DPMSCont = read3CE(par, PowerStatus) & 0xFC;
1133 switch (blank_mode) { 1291 switch (blank_mode) {
1134 case FB_BLANK_UNBLANK: 1292 case FB_BLANK_UNBLANK:
1135 /* Screen: On, HSync: On, VSync: On */ 1293 /* Screen: On, HSync: On, VSync: On */
@@ -1155,9 +1313,9 @@ static int tridentfb_blank(int blank_mode, struct fb_info *info)
1155 break; 1313 break;
1156 } 1314 }
1157 1315
1158 write3CE(PowerStatus, DPMSCont); 1316 write3CE(par, PowerStatus, DPMSCont);
1159 t_outb(4, 0x83C8); 1317 t_outb(par, 4, 0x83C8);
1160 t_outb(PMCont, 0x83C6); 1318 t_outb(par, PMCont, 0x83C6);
1161 1319
1162 debug("exit\n"); 1320 debug("exit\n");
1163 1321
@@ -1174,33 +1332,46 @@ static struct fb_ops tridentfb_ops = {
1174 .fb_set_par = tridentfb_set_par, 1332 .fb_set_par = tridentfb_set_par,
1175 .fb_fillrect = tridentfb_fillrect, 1333 .fb_fillrect = tridentfb_fillrect,
1176 .fb_copyarea = tridentfb_copyarea, 1334 .fb_copyarea = tridentfb_copyarea,
1177 .fb_imageblit = cfb_imageblit, 1335 .fb_imageblit = tridentfb_imageblit,
1336#ifdef CONFIG_FB_TRIDENT_ACCEL
1337 .fb_sync = tridentfb_sync,
1338#endif
1178}; 1339};
1179 1340
1180static int __devinit trident_pci_probe(struct pci_dev * dev, 1341static int __devinit trident_pci_probe(struct pci_dev *dev,
1181 const struct pci_device_id * id) 1342 const struct pci_device_id *id)
1182{ 1343{
1183 int err; 1344 int err;
1184 unsigned char revision; 1345 unsigned char revision;
1346 struct fb_info *info;
1347 struct tridentfb_par *default_par;
1348 int chip3D;
1349 int chip_id;
1185 1350
1186 err = pci_enable_device(dev); 1351 err = pci_enable_device(dev);
1187 if (err) 1352 if (err)
1188 return err; 1353 return err;
1189 1354
1190 chip_id = id->device; 1355 info = framebuffer_alloc(sizeof(struct tridentfb_par), &dev->dev);
1356 if (!info)
1357 return -ENOMEM;
1358 default_par = info->par;
1191 1359
1192 if (chip_id == CYBERBLADEi1) 1360 chip_id = id->device;
1193 output("*** Please do use cyblafb, Cyberblade/i1 support "
1194 "will soon be removed from tridentfb!\n");
1195 1361
1362#ifndef CONFIG_FB_TRIDENT_ACCEL
1363 noaccel = 1;
1364#endif
1196 1365
1197 /* If PCI id is 0x9660 then further detect chip type */ 1366 /* If PCI id is 0x9660 then further detect chip type */
1198 1367
1199 if (chip_id == TGUI9660) { 1368 if (chip_id == TGUI9660) {
1200 outb(RevisionID, 0x3C4); 1369 revision = vga_io_rseq(RevisionID);
1201 revision = inb(0x3C5);
1202 1370
1203 switch (revision) { 1371 switch (revision) {
1372 case 0x21:
1373 chip_id = PROVIDIA9685;
1374 break;
1204 case 0x22: 1375 case 0x22:
1205 case 0x23: 1376 case 0x23:
1206 chip_id = CYBER9397; 1377 chip_id = CYBER9397;
@@ -1229,123 +1400,170 @@ static int __devinit trident_pci_probe(struct pci_dev * dev,
1229 } 1400 }
1230 1401
1231 chip3D = is3Dchip(chip_id); 1402 chip3D = is3Dchip(chip_id);
1232 chipcyber = iscyber(chip_id);
1233 1403
1234 if (is_xp(chip_id)) { 1404 if (is_xp(chip_id)) {
1235 acc = &accel_xp; 1405 default_par->init_accel = xp_init_accel;
1406 default_par->wait_engine = xp_wait_engine;
1407 default_par->fill_rect = xp_fill_rect;
1408 default_par->copy_rect = xp_copy_rect;
1409 tridentfb_fix.accel = FB_ACCEL_TRIDENT_BLADEXP;
1236 } else if (is_blade(chip_id)) { 1410 } else if (is_blade(chip_id)) {
1237 acc = &accel_blade; 1411 default_par->init_accel = blade_init_accel;
1238 } else { 1412 default_par->wait_engine = blade_wait_engine;
1239 acc = &accel_image; 1413 default_par->fill_rect = blade_fill_rect;
1414 default_par->copy_rect = blade_copy_rect;
1415 default_par->image_blit = blade_image_blit;
1416 tridentfb_fix.accel = FB_ACCEL_TRIDENT_BLADE3D;
1417 } else if (chip3D) { /* 3DImage family left */
1418 default_par->init_accel = image_init_accel;
1419 default_par->wait_engine = image_wait_engine;
1420 default_par->fill_rect = image_fill_rect;
1421 default_par->copy_rect = image_copy_rect;
1422 tridentfb_fix.accel = FB_ACCEL_TRIDENT_3DIMAGE;
1423 } else { /* TGUI 9440/96XX family */
1424 default_par->init_accel = tgui_init_accel;
1425 default_par->wait_engine = xp_wait_engine;
1426 default_par->fill_rect = tgui_fill_rect;
1427 default_par->copy_rect = tgui_copy_rect;
1428 tridentfb_fix.accel = FB_ACCEL_TRIDENT_TGUI;
1240 } 1429 }
1241 1430
1242 /* acceleration is on by default for 3D chips */ 1431 default_par->chip_id = chip_id;
1243 defaultaccel = chip3D && !noaccel;
1244
1245 fb_info.par = &default_par;
1246 1432
1247 /* setup MMIO region */ 1433 /* setup MMIO region */
1248 tridentfb_fix.mmio_start = pci_resource_start(dev, 1); 1434 tridentfb_fix.mmio_start = pci_resource_start(dev, 1);
1249 tridentfb_fix.mmio_len = chip3D ? 0x20000 : 0x10000; 1435 tridentfb_fix.mmio_len = pci_resource_len(dev, 1);
1250 1436
1251 if (!request_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len, "tridentfb")) { 1437 if (!request_mem_region(tridentfb_fix.mmio_start,
1438 tridentfb_fix.mmio_len, "tridentfb")) {
1252 debug("request_region failed!\n"); 1439 debug("request_region failed!\n");
1440 framebuffer_release(info);
1253 return -1; 1441 return -1;
1254 } 1442 }
1255 1443
1256 default_par.io_virt = ioremap_nocache(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); 1444 default_par->io_virt = ioremap_nocache(tridentfb_fix.mmio_start,
1445 tridentfb_fix.mmio_len);
1257 1446
1258 if (!default_par.io_virt) { 1447 if (!default_par->io_virt) {
1259 debug("ioremap failed\n"); 1448 debug("ioremap failed\n");
1260 err = -1; 1449 err = -1;
1261 goto out_unmap1; 1450 goto out_unmap1;
1262 } 1451 }
1263 1452
1264 enable_mmio(); 1453 enable_mmio(default_par);
1265 1454
1266 /* setup framebuffer memory */ 1455 /* setup framebuffer memory */
1267 tridentfb_fix.smem_start = pci_resource_start(dev, 0); 1456 tridentfb_fix.smem_start = pci_resource_start(dev, 0);
1268 tridentfb_fix.smem_len = get_memsize(); 1457 tridentfb_fix.smem_len = get_memsize(default_par);
1269 1458
1270 if (!request_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len, "tridentfb")) { 1459 if (!request_mem_region(tridentfb_fix.smem_start,
1460 tridentfb_fix.smem_len, "tridentfb")) {
1271 debug("request_mem_region failed!\n"); 1461 debug("request_mem_region failed!\n");
1272 disable_mmio(); 1462 disable_mmio(info->par);
1273 err = -1; 1463 err = -1;
1274 goto out_unmap1; 1464 goto out_unmap1;
1275 } 1465 }
1276 1466
1277 fb_info.screen_base = ioremap_nocache(tridentfb_fix.smem_start, 1467 info->screen_base = ioremap_nocache(tridentfb_fix.smem_start,
1278 tridentfb_fix.smem_len); 1468 tridentfb_fix.smem_len);
1279 1469
1280 if (!fb_info.screen_base) { 1470 if (!info->screen_base) {
1281 debug("ioremap failed\n"); 1471 debug("ioremap failed\n");
1282 err = -1; 1472 err = -1;
1283 goto out_unmap2; 1473 goto out_unmap2;
1284 } 1474 }
1285 1475
1286 output("%s board found\n", pci_name(dev)); 1476 default_par->flatpanel = is_flatpanel(default_par);
1287 displaytype = get_displaytype();
1288 1477
1289 if (flatpanel) 1478 if (default_par->flatpanel)
1290 nativex = get_nativex(); 1479 nativex = get_nativex(default_par);
1291 1480
1292 fb_info.fix = tridentfb_fix; 1481 info->fix = tridentfb_fix;
1293 fb_info.fbops = &tridentfb_ops; 1482 info->fbops = &tridentfb_ops;
1483 info->pseudo_palette = default_par->pseudo_pal;
1294 1484
1485 info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
1486 if (!noaccel && default_par->init_accel) {
1487 info->flags &= ~FBINFO_HWACCEL_DISABLED;
1488 info->flags |= FBINFO_HWACCEL_COPYAREA;
1489 info->flags |= FBINFO_HWACCEL_FILLRECT;
1490 } else
1491 info->flags |= FBINFO_HWACCEL_DISABLED;
1295 1492
1296 fb_info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; 1493 info->pixmap.addr = kmalloc(4096, GFP_KERNEL);
1297#ifdef CONFIG_FB_TRIDENT_ACCEL 1494 if (!info->pixmap.addr) {
1298 fb_info.flags |= FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT; 1495 err = -ENOMEM;
1299#endif 1496 goto out_unmap2;
1300 fb_info.pseudo_palette = pseudo_pal; 1497 }
1498
1499 info->pixmap.size = 4096;
1500 info->pixmap.buf_align = 4;
1501 info->pixmap.scan_align = 1;
1502 info->pixmap.access_align = 32;
1503 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1301 1504
1302 if (!fb_find_mode(&default_var, &fb_info, 1505 if (default_par->image_blit) {
1506 info->flags |= FBINFO_HWACCEL_IMAGEBLIT;
1507 info->pixmap.scan_align = 4;
1508 }
1509
1510 if (noaccel) {
1511 printk(KERN_DEBUG "disabling acceleration\n");
1512 info->flags |= FBINFO_HWACCEL_DISABLED;
1513 info->pixmap.scan_align = 1;
1514 }
1515
1516 if (!fb_find_mode(&info->var, info,
1303 mode_option, NULL, 0, NULL, bpp)) { 1517 mode_option, NULL, 0, NULL, bpp)) {
1304 err = -EINVAL; 1518 err = -EINVAL;
1305 goto out_unmap2; 1519 goto out_unmap2;
1306 } 1520 }
1307 err = fb_alloc_cmap(&fb_info.cmap, 256, 0); 1521 err = fb_alloc_cmap(&info->cmap, 256, 0);
1308 if (err < 0) 1522 if (err < 0)
1309 goto out_unmap2; 1523 goto out_unmap2;
1310 1524
1311 if (defaultaccel && acc) 1525 info->var.activate |= FB_ACTIVATE_NOW;
1312 default_var.accel_flags |= FB_ACCELF_TEXT; 1526 info->device = &dev->dev;
1313 else 1527 if (register_framebuffer(info) < 0) {
1314 default_var.accel_flags &= ~FB_ACCELF_TEXT; 1528 printk(KERN_ERR "tridentfb: could not register framebuffer\n");
1315 default_var.activate |= FB_ACTIVATE_NOW; 1529 fb_dealloc_cmap(&info->cmap);
1316 fb_info.var = default_var;
1317 fb_info.device = &dev->dev;
1318 if (register_framebuffer(&fb_info) < 0) {
1319 printk(KERN_ERR "tridentfb: could not register Trident framebuffer\n");
1320 fb_dealloc_cmap(&fb_info.cmap);
1321 err = -EINVAL; 1530 err = -EINVAL;
1322 goto out_unmap2; 1531 goto out_unmap2;
1323 } 1532 }
1324 output("fb%d: %s frame buffer device %dx%d-%dbpp\n", 1533 output("fb%d: %s frame buffer device %dx%d-%dbpp\n",
1325 fb_info.node, fb_info.fix.id, default_var.xres, 1534 info->node, info->fix.id, info->var.xres,
1326 default_var.yres, default_var.bits_per_pixel); 1535 info->var.yres, info->var.bits_per_pixel);
1536
1537 pci_set_drvdata(dev, info);
1327 return 0; 1538 return 0;
1328 1539
1329out_unmap2: 1540out_unmap2:
1330 if (fb_info.screen_base) 1541 kfree(info->pixmap.addr);
1331 iounmap(fb_info.screen_base); 1542 if (info->screen_base)
1543 iounmap(info->screen_base);
1332 release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); 1544 release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len);
1333 disable_mmio(); 1545 disable_mmio(info->par);
1334out_unmap1: 1546out_unmap1:
1335 if (default_par.io_virt) 1547 if (default_par->io_virt)
1336 iounmap(default_par.io_virt); 1548 iounmap(default_par->io_virt);
1337 release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); 1549 release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len);
1550 framebuffer_release(info);
1338 return err; 1551 return err;
1339} 1552}
1340 1553
1341static void __devexit trident_pci_remove(struct pci_dev *dev) 1554static void __devexit trident_pci_remove(struct pci_dev *dev)
1342{ 1555{
1343 struct tridentfb_par *par = (struct tridentfb_par*)fb_info.par; 1556 struct fb_info *info = pci_get_drvdata(dev);
1344 unregister_framebuffer(&fb_info); 1557 struct tridentfb_par *par = info->par;
1558
1559 unregister_framebuffer(info);
1345 iounmap(par->io_virt); 1560 iounmap(par->io_virt);
1346 iounmap(fb_info.screen_base); 1561 iounmap(info->screen_base);
1347 release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); 1562 release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len);
1348 release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); 1563 release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len);
1564 pci_set_drvdata(dev, NULL);
1565 kfree(info->pixmap.addr);
1566 framebuffer_release(info);
1349} 1567}
1350 1568
1351/* List of boards that we are trying to support */ 1569/* List of boards that we are trying to support */
@@ -1358,6 +1576,7 @@ static struct pci_device_id trident_devices[] = {
1358 {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 1576 {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1359 {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 1577 {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1360 {PCI_VENDOR_ID_TRIDENT, CYBERBLADEE4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 1578 {PCI_VENDOR_ID_TRIDENT, CYBERBLADEE4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1579 {PCI_VENDOR_ID_TRIDENT, TGUI9440, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1361 {PCI_VENDOR_ID_TRIDENT, TGUI9660, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 1580 {PCI_VENDOR_ID_TRIDENT, TGUI9660, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1362 {PCI_VENDOR_ID_TRIDENT, IMAGE975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 1581 {PCI_VENDOR_ID_TRIDENT, IMAGE975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1363 {PCI_VENDOR_ID_TRIDENT, IMAGE985, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 1582 {PCI_VENDOR_ID_TRIDENT, IMAGE985, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
@@ -1399,9 +1618,9 @@ static int __init tridentfb_setup(char *options)
1399 if (!strncmp(opt, "noaccel", 7)) 1618 if (!strncmp(opt, "noaccel", 7))
1400 noaccel = 1; 1619 noaccel = 1;
1401 else if (!strncmp(opt, "fp", 2)) 1620 else if (!strncmp(opt, "fp", 2))
1402 displaytype = DISPLAY_FP; 1621 fp = 1;
1403 else if (!strncmp(opt, "crt", 3)) 1622 else if (!strncmp(opt, "crt", 3))
1404 displaytype = DISPLAY_CRT; 1623 fp = 0;
1405 else if (!strncmp(opt, "bpp=", 4)) 1624 else if (!strncmp(opt, "bpp=", 4))
1406 bpp = simple_strtoul(opt + 4, NULL, 0); 1625 bpp = simple_strtoul(opt + 4, NULL, 0);
1407 else if (!strncmp(opt, "center", 6)) 1626 else if (!strncmp(opt, "center", 6))
@@ -1430,7 +1649,6 @@ static int __init tridentfb_init(void)
1430 return -ENODEV; 1649 return -ENODEV;
1431 tridentfb_setup(option); 1650 tridentfb_setup(option);
1432#endif 1651#endif
1433 output("Trident framebuffer %s initializing\n", VERSION);
1434 return pci_register_driver(&tridentfb_pci_driver); 1652 return pci_register_driver(&tridentfb_pci_driver);
1435} 1653}
1436 1654
diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c
index cdbb56edb6cb..50744229c7a9 100644
--- a/drivers/video/uvesafb.c
+++ b/drivers/video/uvesafb.c
@@ -2054,8 +2054,8 @@ MODULE_PARM_DESC(maxhf,
2054module_param(maxvf, ushort, 0); 2054module_param(maxvf, ushort, 0);
2055MODULE_PARM_DESC(maxvf, 2055MODULE_PARM_DESC(maxvf,
2056 "Maximum vertical frequency [Hz], overrides EDID data"); 2056 "Maximum vertical frequency [Hz], overrides EDID data");
2057module_param_named(mode, mode_option, charp, 0); 2057module_param(mode_option, charp, 0);
2058MODULE_PARM_DESC(mode, 2058MODULE_PARM_DESC(mode_option,
2059 "Specify initial video mode as \"<xres>x<yres>[-<bpp>][@<refresh>]\""); 2059 "Specify initial video mode as \"<xres>x<yres>[-<bpp>][@<refresh>]\"");
2060module_param(vbemode, ushort, 0); 2060module_param(vbemode, ushort, 0);
2061MODULE_PARM_DESC(vbemode, 2061MODULE_PARM_DESC(vbemode,
diff --git a/drivers/video/vfb.c b/drivers/video/vfb.c
index 072638a9528a..93fe08d6c78f 100644
--- a/drivers/video/vfb.c
+++ b/drivers/video/vfb.c
@@ -443,19 +443,29 @@ static int vfb_mmap(struct fb_info *info,
443} 443}
444 444
445#ifndef MODULE 445#ifndef MODULE
446/*
447 * The virtual framebuffer driver is only enabled if explicitly
448 * requested by passing 'video=vfb:' (or any actual options).
449 */
446static int __init vfb_setup(char *options) 450static int __init vfb_setup(char *options)
447{ 451{
448 char *this_opt; 452 char *this_opt;
449 453
454 vfb_enable = 0;
455
456 if (!options)
457 return 1;
458
450 vfb_enable = 1; 459 vfb_enable = 1;
451 460
452 if (!options || !*options) 461 if (!*options)
453 return 1; 462 return 1;
454 463
455 while ((this_opt = strsep(&options, ",")) != NULL) { 464 while ((this_opt = strsep(&options, ",")) != NULL) {
456 if (!*this_opt) 465 if (!*this_opt)
457 continue; 466 continue;
458 if (!strncmp(this_opt, "disable", 7)) 467 /* Test disable for backwards compatibility */
468 if (!strcmp(this_opt, "disable"))
459 vfb_enable = 0; 469 vfb_enable = 0;
460 } 470 }
461 return 1; 471 return 1;
diff --git a/drivers/video/vga16fb.c b/drivers/video/vga16fb.c
index 9b3c5923365e..e31bca8a0cb2 100644
--- a/drivers/video/vga16fb.c
+++ b/drivers/video/vga16fb.c
@@ -26,18 +26,6 @@
26#include <asm/io.h> 26#include <asm/io.h>
27#include <video/vga.h> 27#include <video/vga.h>
28 28
29#define GRAPHICS_ADDR_REG VGA_GFX_I /* Graphics address register. */
30#define GRAPHICS_DATA_REG VGA_GFX_D /* Graphics data register. */
31
32#define SET_RESET_INDEX VGA_GFX_SR_VALUE /* Set/Reset Register index. */
33#define ENABLE_SET_RESET_INDEX VGA_GFX_SR_ENABLE /* Enable Set/Reset Register index. */
34#define DATA_ROTATE_INDEX VGA_GFX_DATA_ROTATE /* Data Rotate Register index. */
35#define GRAPHICS_MODE_INDEX VGA_GFX_MODE /* Graphics Mode Register index. */
36#define BIT_MASK_INDEX VGA_GFX_BIT_MASK /* Bit Mask Register index. */
37
38#define dac_reg (VGA_PEL_IW)
39#define dac_val (VGA_PEL_D)
40
41#define VGA_FB_PHYS 0xA0000 29#define VGA_FB_PHYS 0xA0000
42#define VGA_FB_PHYS_LEN 65536 30#define VGA_FB_PHYS_LEN 65536
43 31
@@ -108,7 +96,7 @@ static struct fb_fix_screeninfo vga16fb_fix __initdata = {
108 .visual = FB_VISUAL_PSEUDOCOLOR, 96 .visual = FB_VISUAL_PSEUDOCOLOR,
109 .xpanstep = 8, 97 .xpanstep = 8,
110 .ypanstep = 1, 98 .ypanstep = 1,
111 .line_length = 640/8, 99 .line_length = 640 / 8,
112 .accel = FB_ACCEL_NONE 100 .accel = FB_ACCEL_NONE
113}; 101};
114 102
@@ -135,23 +123,22 @@ static inline int setmode(int mode)
135{ 123{
136 int oldmode; 124 int oldmode;
137 125
138 vga_io_w(GRAPHICS_ADDR_REG, GRAPHICS_MODE_INDEX); 126 oldmode = vga_io_rgfx(VGA_GFX_MODE);
139 oldmode = vga_io_r(GRAPHICS_DATA_REG); 127 vga_io_w(VGA_GFX_D, mode);
140 vga_io_w(GRAPHICS_DATA_REG, mode);
141 return oldmode; 128 return oldmode;
142} 129}
143 130
144/* Select the Bit Mask Register and return its value. */ 131/* Select the Bit Mask Register and return its value. */
145static inline int selectmask(void) 132static inline int selectmask(void)
146{ 133{
147 return vga_io_rgfx(BIT_MASK_INDEX); 134 return vga_io_rgfx(VGA_GFX_BIT_MASK);
148} 135}
149 136
150/* Set the value of the Bit Mask Register. It must already have been 137/* Set the value of the Bit Mask Register. It must already have been
151 selected with selectmask(). */ 138 selected with selectmask(). */
152static inline void setmask(int mask) 139static inline void setmask(int mask)
153{ 140{
154 vga_io_w(GRAPHICS_DATA_REG, mask); 141 vga_io_w(VGA_GFX_D, mask);
155} 142}
156 143
157/* Set the Data Rotate Register and return its old value. 144/* Set the Data Rotate Register and return its old value.
@@ -161,9 +148,8 @@ static inline int setop(int op)
161{ 148{
162 int oldop; 149 int oldop;
163 150
164 vga_io_w(GRAPHICS_ADDR_REG, DATA_ROTATE_INDEX); 151 oldop = vga_io_rgfx(VGA_GFX_DATA_ROTATE);
165 oldop = vga_io_r(GRAPHICS_DATA_REG); 152 vga_io_w(VGA_GFX_D, op);
166 vga_io_w(GRAPHICS_DATA_REG, op);
167 return oldop; 153 return oldop;
168} 154}
169 155
@@ -173,9 +159,8 @@ static inline int setsr(int sr)
173{ 159{
174 int oldsr; 160 int oldsr;
175 161
176 vga_io_w(GRAPHICS_ADDR_REG, ENABLE_SET_RESET_INDEX); 162 oldsr = vga_io_rgfx(VGA_GFX_SR_ENABLE);
177 oldsr = vga_io_r(GRAPHICS_DATA_REG); 163 vga_io_w(VGA_GFX_D, sr);
178 vga_io_w(GRAPHICS_DATA_REG, sr);
179 return oldsr; 164 return oldsr;
180} 165}
181 166
@@ -184,22 +169,21 @@ static inline int setcolor(int color)
184{ 169{
185 int oldcolor; 170 int oldcolor;
186 171
187 vga_io_w(GRAPHICS_ADDR_REG, SET_RESET_INDEX); 172 oldcolor = vga_io_rgfx(VGA_GFX_SR_VALUE);
188 oldcolor = vga_io_r(GRAPHICS_DATA_REG); 173 vga_io_w(VGA_GFX_D, color);
189 vga_io_w(GRAPHICS_DATA_REG, color);
190 return oldcolor; 174 return oldcolor;
191} 175}
192 176
193/* Return the value in the Graphics Address Register. */ 177/* Return the value in the Graphics Address Register. */
194static inline int getindex(void) 178static inline int getindex(void)
195{ 179{
196 return vga_io_r(GRAPHICS_ADDR_REG); 180 return vga_io_r(VGA_GFX_I);
197} 181}
198 182
199/* Set the value in the Graphics Address Register. */ 183/* Set the value in the Graphics Address Register. */
200static inline void setindex(int index) 184static inline void setindex(int index)
201{ 185{
202 vga_io_w(GRAPHICS_ADDR_REG, index); 186 vga_io_w(VGA_GFX_I, index);
203} 187}
204 188
205static void vga16fb_pan_var(struct fb_info *info, 189static void vga16fb_pan_var(struct fb_info *info,
@@ -672,10 +656,10 @@ static void ega16_setpalette(int regno, unsigned red, unsigned green, unsigned b
672 656
673static void vga16_setpalette(int regno, unsigned red, unsigned green, unsigned blue) 657static void vga16_setpalette(int regno, unsigned red, unsigned green, unsigned blue)
674{ 658{
675 outb(regno, dac_reg); 659 outb(regno, VGA_PEL_IW);
676 outb(red >> 10, dac_val); 660 outb(red >> 10, VGA_PEL_D);
677 outb(green >> 10, dac_val); 661 outb(green >> 10, VGA_PEL_D);
678 outb(blue >> 10, dac_val); 662 outb(blue >> 10, VGA_PEL_D);
679} 663}
680 664
681static int vga16fb_setcolreg(unsigned regno, unsigned red, unsigned green, 665static int vga16fb_setcolreg(unsigned regno, unsigned red, unsigned green,
@@ -719,28 +703,15 @@ static int vga16fb_pan_display(struct fb_var_screeninfo *var,
719 blanking code was originally by Huang shi chao, and modified by 703 blanking code was originally by Huang shi chao, and modified by
720 Christoph Rimek (chrimek@toppoint.de) and todd j. derr 704 Christoph Rimek (chrimek@toppoint.de) and todd j. derr
721 (tjd@barefoot.org) for Linux. */ 705 (tjd@barefoot.org) for Linux. */
722#define attrib_port VGA_ATC_IW
723#define seq_port_reg VGA_SEQ_I
724#define seq_port_val VGA_SEQ_D
725#define gr_port_reg VGA_GFX_I
726#define gr_port_val VGA_GFX_D
727#define video_misc_rd VGA_MIS_R
728#define video_misc_wr VGA_MIS_W
729#define vga_video_port_reg VGA_CRT_IC
730#define vga_video_port_val VGA_CRT_DC
731 706
732static void vga_vesa_blank(struct vga16fb_par *par, int mode) 707static void vga_vesa_blank(struct vga16fb_par *par, int mode)
733{ 708{
734 unsigned char SeqCtrlIndex; 709 unsigned char SeqCtrlIndex = vga_io_r(VGA_SEQ_I);
735 unsigned char CrtCtrlIndex; 710 unsigned char CrtCtrlIndex = vga_io_r(VGA_CRT_IC);
736 711
737 //cli();
738 SeqCtrlIndex = vga_io_r(seq_port_reg);
739 CrtCtrlIndex = vga_io_r(vga_video_port_reg);
740
741 /* save original values of VGA controller registers */ 712 /* save original values of VGA controller registers */
742 if(!par->vesa_blanked) { 713 if(!par->vesa_blanked) {
743 par->vga_state.CrtMiscIO = vga_io_r(video_misc_rd); 714 par->vga_state.CrtMiscIO = vga_io_r(VGA_MIS_R);
744 //sti(); 715 //sti();
745 716
746 par->vga_state.HorizontalTotal = vga_io_rcrt(0x00); /* HorizontalTotal */ 717 par->vga_state.HorizontalTotal = vga_io_rcrt(0x00); /* HorizontalTotal */
@@ -756,12 +727,11 @@ static void vga_vesa_blank(struct vga16fb_par *par, int mode)
756 727
757 /* assure that video is enabled */ 728 /* assure that video is enabled */
758 /* "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer */ 729 /* "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer */
759 //cli();
760 vga_io_wseq(0x01, par->vga_state.ClockingMode | 0x20); 730 vga_io_wseq(0x01, par->vga_state.ClockingMode | 0x20);
761 731
762 /* test for vertical retrace in process.... */ 732 /* test for vertical retrace in process.... */
763 if ((par->vga_state.CrtMiscIO & 0x80) == 0x80) 733 if ((par->vga_state.CrtMiscIO & 0x80) == 0x80)
764 vga_io_w(video_misc_wr, par->vga_state.CrtMiscIO & 0xef); 734 vga_io_w(VGA_MIS_W, par->vga_state.CrtMiscIO & 0xef);
765 735
766 /* 736 /*
767 * Set <End of vertical retrace> to minimum (0) and 737 * Set <End of vertical retrace> to minimum (0) and
@@ -769,12 +739,10 @@ static void vga_vesa_blank(struct vga16fb_par *par, int mode)
769 * Result: turn off vertical sync (VSync) pulse. 739 * Result: turn off vertical sync (VSync) pulse.
770 */ 740 */
771 if (mode & FB_BLANK_VSYNC_SUSPEND) { 741 if (mode & FB_BLANK_VSYNC_SUSPEND) {
772 outb_p(0x10,vga_video_port_reg); /* StartVertRetrace */ 742 vga_io_wcrt(VGA_CRTC_V_SYNC_START, 0xff);
773 outb_p(0xff,vga_video_port_val); /* maximum value */ 743 vga_io_wcrt(VGA_CRTC_V_SYNC_END, 0x40);
774 outb_p(0x11,vga_video_port_reg); /* EndVertRetrace */ 744 /* bits 9,10 of vert. retrace */
775 outb_p(0x40,vga_video_port_val); /* minimum (bits 0..3) */ 745 vga_io_wcrt(VGA_CRTC_OVERFLOW, par->vga_state.Overflow | 0x84);
776 outb_p(0x07,vga_video_port_reg); /* Overflow */
777 outb_p(par->vga_state.Overflow | 0x84,vga_video_port_val); /* bits 9,10 of vert. retrace */
778 } 746 }
779 747
780 if (mode & FB_BLANK_HSYNC_SUSPEND) { 748 if (mode & FB_BLANK_HSYNC_SUSPEND) {
@@ -783,29 +751,22 @@ static void vga_vesa_blank(struct vga16fb_par *par, int mode)
783 * <Start of horizontal Retrace> to maximum 751 * <Start of horizontal Retrace> to maximum
784 * Result: turn off horizontal sync (HSync) pulse. 752 * Result: turn off horizontal sync (HSync) pulse.
785 */ 753 */
786 outb_p(0x04,vga_video_port_reg); /* StartHorizRetrace */ 754 vga_io_wcrt(VGA_CRTC_H_SYNC_START, 0xff);
787 outb_p(0xff,vga_video_port_val); /* maximum */ 755 vga_io_wcrt(VGA_CRTC_H_SYNC_END, 0x00);
788 outb_p(0x05,vga_video_port_reg); /* EndHorizRetrace */
789 outb_p(0x00,vga_video_port_val); /* minimum (0) */
790 } 756 }
791 757
792 /* restore both index registers */ 758 /* restore both index registers */
793 outb_p(SeqCtrlIndex,seq_port_reg); 759 outb_p(SeqCtrlIndex, VGA_SEQ_I);
794 outb_p(CrtCtrlIndex,vga_video_port_reg); 760 outb_p(CrtCtrlIndex, VGA_CRT_IC);
795 //sti();
796} 761}
797 762
798static void vga_vesa_unblank(struct vga16fb_par *par) 763static void vga_vesa_unblank(struct vga16fb_par *par)
799{ 764{
800 unsigned char SeqCtrlIndex; 765 unsigned char SeqCtrlIndex = vga_io_r(VGA_SEQ_I);
801 unsigned char CrtCtrlIndex; 766 unsigned char CrtCtrlIndex = vga_io_r(VGA_CRT_IC);
802 767
803 //cli();
804 SeqCtrlIndex = vga_io_r(seq_port_reg);
805 CrtCtrlIndex = vga_io_r(vga_video_port_reg);
806
807 /* restore original values of VGA controller registers */ 768 /* restore original values of VGA controller registers */
808 vga_io_w(video_misc_wr, par->vga_state.CrtMiscIO); 769 vga_io_w(VGA_MIS_W, par->vga_state.CrtMiscIO);
809 770
810 /* HorizontalTotal */ 771 /* HorizontalTotal */
811 vga_io_wcrt(0x00, par->vga_state.HorizontalTotal); 772 vga_io_wcrt(0x00, par->vga_state.HorizontalTotal);
@@ -827,9 +788,8 @@ static void vga_vesa_unblank(struct vga16fb_par *par)
827 vga_io_wseq(0x01, par->vga_state.ClockingMode); 788 vga_io_wseq(0x01, par->vga_state.ClockingMode);
828 789
829 /* restore index/control registers */ 790 /* restore index/control registers */
830 vga_io_w(seq_port_reg, SeqCtrlIndex); 791 vga_io_w(VGA_SEQ_I, SeqCtrlIndex);
831 vga_io_w(vga_video_port_reg, CrtCtrlIndex); 792 vga_io_w(VGA_CRT_IC, CrtCtrlIndex);
832 //sti();
833} 793}
834 794
835static void vga_pal_blank(void) 795static void vga_pal_blank(void)
@@ -837,10 +797,10 @@ static void vga_pal_blank(void)
837 int i; 797 int i;
838 798
839 for (i=0; i<16; i++) { 799 for (i=0; i<16; i++) {
840 outb_p (i, dac_reg) ; 800 outb_p(i, VGA_PEL_IW);
841 outb_p (0, dac_val) ; 801 outb_p(0, VGA_PEL_D);
842 outb_p (0, dac_val) ; 802 outb_p(0, VGA_PEL_D);
843 outb_p (0, dac_val) ; 803 outb_p(0, VGA_PEL_D);
844 } 804 }
845} 805}
846 806
@@ -1087,12 +1047,15 @@ static void vga16fb_copyarea(struct fb_info *info, const struct fb_copyarea *are
1087 width = x2 - dx; 1047 width = x2 - dx;
1088 height = y2 - dy; 1048 height = y2 - dy;
1089 1049
1050 if (sx + dx < old_dx || sy + dy < old_dy)
1051 return;
1052
1090 /* update sx1,sy1 */ 1053 /* update sx1,sy1 */
1091 sx += (dx - old_dx); 1054 sx += (dx - old_dx);
1092 sy += (dy - old_dy); 1055 sy += (dy - old_dy);
1093 1056
1094 /* the source must be completely inside the virtual screen */ 1057 /* the source must be completely inside the virtual screen */
1095 if (sx < 0 || sy < 0 || (sx + width) > vxres || (sy + height) > vyres) 1058 if (sx + width > vxres || sy + height > vyres)
1096 return; 1059 return;
1097 1060
1098 switch (info->fix.type) { 1061 switch (info->fix.type) {
@@ -1482,6 +1445,7 @@ static void __exit vga16fb_exit(void)
1482 platform_driver_unregister(&vga16fb_driver); 1445 platform_driver_unregister(&vga16fb_driver);
1483} 1446}
1484 1447
1448MODULE_DESCRIPTION("Legacy VGA framebuffer device driver");
1485MODULE_LICENSE("GPL"); 1449MODULE_LICENSE("GPL");
1486module_init(vga16fb_init); 1450module_init(vga16fb_init);
1487module_exit(vga16fb_exit); 1451module_exit(vga16fb_exit);
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index ccb78f66c2b6..48399e134c0d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -788,8 +788,6 @@ config WATCHDOG_RIO
788 machines. The watchdog timeout period is normally one minute but 788 machines. The watchdog timeout period is normally one minute but
789 can be changed with a boot-time parameter. 789 can be changed with a boot-time parameter.
790 790
791# V850 Architecture
792
793# XTENSA Architecture 791# XTENSA Architecture
794 792
795# 793#
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 25b352b664d9..edd305a64e63 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -119,8 +119,6 @@ obj-$(CONFIG_SH_WDT) += shwdt.o
119 119
120# SPARC64 Architecture 120# SPARC64 Architecture
121 121
122# V850 Architecture
123
124# XTENSA Architecture 122# XTENSA Architecture
125 123
126# Architecture Independant 124# Architecture Independant
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 591bc29b55f5..d4427cb86979 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -610,6 +610,7 @@ static ssize_t show_target_kb(struct sys_device *dev, char *buf)
610} 610}
611 611
612static ssize_t store_target_kb(struct sys_device *dev, 612static ssize_t store_target_kb(struct sys_device *dev,
613 struct sysdev_attribute *attr,
613 const char *buf, 614 const char *buf,
614 size_t count) 615 size_t count)
615{ 616{
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 332dd63750a0..0e0c28574af8 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -734,6 +734,33 @@ static void restore_cpu_ipis(unsigned int cpu)
734 } 734 }
735} 735}
736 736
737/* Clear an irq's pending state, in preparation for polling on it */
738void xen_clear_irq_pending(int irq)
739{
740 int evtchn = evtchn_from_irq(irq);
741
742 if (VALID_EVTCHN(evtchn))
743 clear_evtchn(evtchn);
744}
745
746/* Poll waiting for an irq to become pending. In the usual case, the
747 irq will be disabled so it won't deliver an interrupt. */
748void xen_poll_irq(int irq)
749{
750 evtchn_port_t evtchn = evtchn_from_irq(irq);
751
752 if (VALID_EVTCHN(evtchn)) {
753 struct sched_poll poll;
754
755 poll.nr_ports = 1;
756 poll.timeout = 0;
757 poll.ports = &evtchn;
758
759 if (HYPERVISOR_sched_op(SCHEDOP_poll, &poll) != 0)
760 BUG();
761 }
762}
763
737void xen_irq_resume(void) 764void xen_irq_resume(void)
738{ 765{
739 unsigned int cpu, irq, evtchn; 766 unsigned int cpu, irq, evtchn;
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index 5b546e365f00..a5bc91ae6ff6 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -63,11 +63,12 @@ static int xen_suspend(void *data)
63 gnttab_resume(); 63 gnttab_resume();
64 xen_mm_unpin_all(); 64 xen_mm_unpin_all();
65 65
66 device_power_up(); 66 device_power_up(PMSG_RESUME);
67 67
68 if (!*cancelled) { 68 if (!*cancelled) {
69 xen_irq_resume(); 69 xen_irq_resume();
70 xen_console_resume(); 70 xen_console_resume();
71 xen_timer_resume();
71 } 72 }
72 73
73 return 0; 74 return 0;
@@ -107,12 +108,13 @@ static void do_suspend(void)
107 goto out; 108 goto out;
108 } 109 }
109 110
110 if (!cancelled) 111 if (!cancelled) {
112 xen_arch_resume();
111 xenbus_resume(); 113 xenbus_resume();
112 else 114 } else
113 xenbus_suspend_cancel(); 115 xenbus_suspend_cancel();
114 116
115 device_resume(); 117 device_resume(PMSG_RESUME);
116 118
117 /* Make sure timer events get retriggered on all CPUs */ 119 /* Make sure timer events get retriggered on all CPUs */
118 clock_was_set(); 120 clock_was_set();
diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c
index 3da712cc7708..5290552d2ef7 100644
--- a/drivers/zorro/zorro-sysfs.c
+++ b/drivers/zorro/zorro-sysfs.c
@@ -15,7 +15,6 @@
15#include <linux/zorro.h> 15#include <linux/zorro.h>
16#include <linux/stat.h> 16#include <linux/stat.h>
17#include <linux/string.h> 17#include <linux/string.h>
18#include <linux/fs.h>
19 18
20#include "zorro.h" 19#include "zorro.h"
21 20